wip(k1): checkpoint connection recovery rewrite

Capture the current unreleased K1 connection, recovery, lifecycle, viewer, and test work as a single known-bad baseline for subsequent fixes.
This commit is contained in:
DCCONSTRUCTIONS
2026-08-14 14:57:50 +03:00
parent aff331082f
commit 0ca7316a24
157 changed files with 152962 additions and 4036 deletions
+587 -34
View File
@@ -1,9 +1,27 @@
/* All selectors below are scoped to the XGRIDS frontend contribution. */
.xgrids-k1-plugin {
container: xgrids-k1 / inline-size;
width: 100%;
min-width: 0;
max-width: 100%;
box-sizing: border-box;
*,
*::before,
*::after {
box-sizing: border-box;
}
> * {
min-width: 0;
max-width: 100%;
}
.device-workspace__grid {
display: grid;
min-width: 0;
grid-template-columns: minmax(23rem, 0.78fr) minmax(34rem, 1.22fr);
max-width: 100%;
grid-template-columns: minmax(0, 1fr);
align-items: start;
gap: 0.85rem;
}
@@ -11,6 +29,7 @@
.device-workspace__side {
display: grid;
min-width: 0;
max-width: 100%;
gap: 0.85rem;
}
@@ -18,9 +37,114 @@
.status-panel,
.latency-panel,
.session-panel {
min-width: 0;
max-width: 100%;
background: var(--station-panel);
}
/* Every layout hop between the plugin root and the canonical controls must be
shrinkable. A single auto min-size in this chain lets topology/status text
establish a wider intrinsic track and paint the provisioning job over the
acquisition job even though the outer grid itself uses minmax(0, 1fr). */
.workspace-lead,
.metrics-grid,
.error-banner,
.wizard-list,
.wizard-step,
.field-stack,
.session-form,
.scan-configuration-grid,
.device-list,
.device-row,
.diagnostics-grid,
.detail-list {
min-width: 0;
max-width: 100%;
}
.metrics-grid > *,
.device-workspace__grid > *,
.device-workspace__side > *,
.scan-configuration-grid > *,
.diagnostics-grid > * {
min-width: 0;
max-width: 100%;
}
.error-banner > div {
min-width: 0;
}
.error-banner__copy {
display: grid;
gap: 0.2rem;
}
.error-banner--compact {
align-items: start;
padding-block: 0.7rem;
}
.error-banner__recovery-actions {
display: grid;
gap: 0.45rem;
margin-top: 0.55rem;
}
.error-banner__details {
margin-top: 0.35rem;
color: var(--nodedc-text-secondary);
font-size: 0.66rem;
}
.error-banner__details summary {
width: fit-content;
color: var(--nodedc-text-tertiary);
cursor: pointer;
}
.workspace-lead__status,
.workspace-lead__status > span,
.panel-heading > div,
.panel-heading h2,
.wizard-step__content,
.wizard-step__content > header,
.wizard-step__content > header h3,
.connection-summary span,
.nodedc-field__description,
.empty-device-list,
.retained-recovery-target small,
.session-footer p {
min-width: 0;
}
.workspace-lead__status > span,
.panel-heading h2,
.wizard-step__content > header h3,
.connection-summary span,
.nodedc-field__description,
.empty-device-list,
.retained-recovery-target small,
.session-footer p {
overflow-wrap: anywhere;
}
.workspace-lead p,
.error-banner p,
.step-copy,
.safety-note,
.live-instruction {
overflow-wrap: anywhere;
}
.connection-panel {
container: k1-connection-panel / inline-size;
}
.session-panel {
container: k1-session-panel / inline-size;
}
.error-banner {
display: grid;
grid-template-columns: auto minmax(0, 1fr) auto;
@@ -58,12 +182,54 @@
line-height: 1.45;
}
.error-banner__diagnostic {
display: grid;
min-width: 0;
max-width: 100%;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 0.65rem;
margin: 0.45rem 0 0;
}
.error-banner__diagnostic > div {
min-width: 0;
}
.error-banner__diagnostic dt,
.error-banner__diagnostic dd {
margin: 0;
overflow-wrap: anywhere;
}
.error-banner__diagnostic dt {
color: var(--nodedc-text-tertiary);
font-size: 0.58rem;
letter-spacing: 0.06em;
text-transform: uppercase;
}
.error-banner__diagnostic dd {
margin-top: 0.12rem;
color: var(--nodedc-text-secondary);
font-size: 0.66rem;
line-height: 1.4;
}
.error-banner__actions {
display: flex;
min-width: 0;
max-width: 100%;
align-items: center;
flex-wrap: wrap;
gap: 0.35rem;
}
.error-banner__actions > .nodedc-button {
min-width: 0;
max-width: 100%;
overflow-wrap: anywhere;
}
.wizard-list {
display: grid;
margin-top: 1.4rem;
@@ -71,6 +237,8 @@
.configuration-anchor {
display: grid;
min-width: 0;
max-width: 100%;
gap: 0.55rem;
margin-top: 1.2rem;
border-radius: 0.95rem;
@@ -81,6 +249,35 @@
.configuration-anchor .nodedc-select-anchor,
.configuration-field .nodedc-select-anchor {
width: 100%;
min-width: 0;
max-width: 100%;
}
.connection-topology-summary {
display: grid;
min-width: 0;
max-width: 100%;
gap: 0.42rem;
}
.connection-topology-summary .connection-summary {
min-width: 0;
max-width: 100%;
margin: 0;
}
.connection-summary__value {
display: flex;
min-width: 0;
max-width: 100%;
align-items: center;
justify-content: flex-end;
gap: 0.5rem;
}
.connection-summary__value strong {
min-width: 0;
max-width: 100%;
}
.wizard-step {
@@ -219,19 +416,26 @@
}
.device-row__identity strong {
overflow: hidden;
min-width: 0;
max-width: 100%;
overflow: visible;
overflow-wrap: anywhere;
font-size: 0.69rem;
text-overflow: ellipsis;
white-space: nowrap;
text-overflow: clip;
white-space: normal;
}
.device-row code,
.detail-row code {
overflow: hidden;
display: block;
min-width: 0;
max-width: 100%;
overflow: visible;
overflow-wrap: anywhere;
color: var(--nodedc-text-muted);
font-size: 0.58rem;
text-overflow: ellipsis;
white-space: nowrap;
text-overflow: clip;
white-space: normal;
}
.device-row__signal {
@@ -242,7 +446,7 @@
background: var(--nodedc-text-muted);
}
.device-row[data-compatible="true"] .device-row__signal {
.device-row[data-likely-k1="true"] .device-row__signal {
background: rgb(var(--nodedc-success-rgb));
}
@@ -260,14 +464,81 @@
line-height: 1.45;
}
.retained-recovery-target {
display: grid;
min-width: 0;
gap: 0.42rem;
margin-top: 0.62rem;
border-radius: 0.95rem;
background: rgb(255 255 255 / 0.025);
padding: 0.78rem;
}
.retained-recovery-target > div {
display: flex;
min-width: 0;
align-items: center;
justify-content: space-between;
gap: 0.55rem;
}
.retained-recovery-target span,
.retained-recovery-target small {
color: var(--nodedc-text-muted);
font-size: 0.58rem;
line-height: 1.45;
}
.retained-recovery-target code {
min-width: 0;
overflow-wrap: anywhere;
color: var(--nodedc-text-secondary);
font-size: 0.58rem;
}
.field-stack,
.session-form {
display: grid;
gap: 0.85rem;
}
.password-field-row {
display: grid;
min-width: 0;
grid-template-columns: minmax(0, 1fr) auto;
align-items: end;
gap: 0.55rem;
}
.connection-recovery-choice {
display: grid;
min-width: 0;
max-width: 100%;
gap: 0.65rem;
border: 1px solid rgb(255 255 255 / 0.08);
border-radius: 0.95rem;
background: rgb(255 255 255 / 0.025);
padding: 0.85rem;
}
.connection-recovery-choice > strong {
color: var(--nodedc-text-primary);
font-size: 0.72rem;
line-height: 1.4;
}
.connection-recovery-choice > .safety-note {
margin: 0;
}
.connection-recovery-choice--retirement {
border-color: rgb(var(--nodedc-danger-rgb) / 0.24);
}
.connection-summary {
display: flex;
min-width: 0;
max-width: 100%;
align-items: center;
justify-content: space-between;
gap: 1rem;
@@ -283,6 +554,8 @@
}
.connection-summary strong {
min-width: 0;
max-width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
@@ -296,6 +569,61 @@
margin-top: 1rem;
}
.active-stream-recovery {
display: grid;
gap: 1rem;
margin-top: 1rem;
}
.active-stream-recovery__state {
display: grid;
grid-template-columns: auto minmax(0, 1fr);
align-items: start;
gap: 0.75rem;
border-radius: 0.85rem;
background: rgb(255 255 255 / 0.03);
padding: 0.85rem;
}
.active-stream-recovery__state--static {
grid-template-columns: minmax(0, 1fr);
}
.active-stream-recovery__state > .nodedc-activity-indicator {
margin-top: 0.12rem;
}
.active-stream-recovery__copy {
display: grid;
min-width: 0;
gap: 0.28rem;
}
.active-stream-recovery__copy strong {
color: var(--nodedc-text-primary);
font-size: 0.72rem;
line-height: 1.4;
}
.active-stream-recovery__copy span,
.active-stream-recovery__copy small,
.active-stream-recovery__actions p {
margin: 0;
color: var(--nodedc-text-muted);
font-size: 0.62rem;
line-height: 1.5;
overflow-wrap: anywhere;
}
.active-stream-recovery__copy small {
color: var(--nodedc-text-secondary);
}
.active-stream-recovery__actions {
display: grid;
gap: 0.55rem;
}
.scan-configuration-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -375,11 +703,12 @@
}
.detail-row dd {
overflow: hidden;
overflow: visible;
overflow-wrap: anywhere;
color: var(--nodedc-text-secondary);
text-align: right;
text-overflow: ellipsis;
white-space: nowrap;
text-overflow: clip;
white-space: normal;
}
.inline-state {
@@ -449,25 +778,106 @@
}
}
@media (max-width: 1480px) {
/* Keep both jobs usable before admitting the split composition: the
provisioning column retains 32 rem and the acquisition column 38 rem.
Below their combined working width the panels stack instead of squeezing
and letting intrinsic text paint into the neighbouring surface. */
@container xgrids-k1 (min-width: 78rem) {
.xgrids-k1-plugin .device-workspace__grid {
grid-template-columns: minmax(21rem, 0.76fr) minmax(30rem, 1.24fr);
grid-template-columns: minmax(32rem, 0.8fr) minmax(38rem, 1.2fr);
}
}
@media (max-width: 1280px) {
.xgrids-k1-plugin .device-workspace__grid {
grid-template-columns: 1fr;
@container k1-connection-panel (max-width: 48rem) {
.xgrids-k1-plugin .panel-heading,
.xgrids-k1-plugin .wizard-step__content > header {
min-width: 0;
align-items: flex-start;
flex-wrap: wrap;
}
.xgrids-k1-plugin .panel-heading > div,
.xgrids-k1-plugin .wizard-step__content > header h3 {
min-width: 0;
max-width: 100%;
overflow-wrap: anywhere;
}
.xgrids-k1-plugin .panel-heading > .nodedc-status,
.xgrids-k1-plugin .wizard-step__content > header > .nodedc-status,
.xgrids-k1-plugin .connection-summary__value > .nodedc-status,
.xgrids-k1-plugin .retained-recovery-target .nodedc-status {
max-width: 100%;
flex: 0 1 auto;
line-height: 1.35;
text-align: left;
white-space: normal;
}
.xgrids-k1-plugin .connection-summary,
.xgrids-k1-plugin .connection-summary--topology,
.xgrids-k1-plugin .connection-summary__value {
align-items: stretch;
flex-direction: column;
}
.xgrids-k1-plugin .connection-summary__value {
justify-content: flex-start;
}
.xgrids-k1-plugin .connection-summary strong {
overflow-wrap: anywhere;
text-overflow: clip;
white-space: normal;
}
.xgrids-k1-plugin .device-row__action {
align-items: stretch;
flex-direction: column;
}
.xgrids-k1-plugin .device-row__name {
flex-wrap: wrap;
}
.xgrids-k1-plugin .device-row__name small {
flex: 1 1 100%;
}
.xgrids-k1-plugin .retained-recovery-target > div {
align-items: flex-start;
flex-direction: column;
}
}
@media (max-width: 1040px) {
@container xgrids-k1 (max-width: 65rem) {
.xgrids-k1-plugin .diagnostics-grid {
grid-template-columns: 1fr;
}
}
@media (max-width: 760px) {
@container k1-session-panel (max-width: 48rem) {
.xgrids-k1-plugin .panel-heading {
min-width: 0;
align-items: flex-start;
flex-wrap: wrap;
}
.xgrids-k1-plugin .panel-heading > div {
min-width: 0;
max-width: 100%;
overflow-wrap: anywhere;
}
.xgrids-k1-plugin .panel-heading > .nodedc-status {
max-width: 100%;
flex: 0 1 auto;
line-height: 1.35;
text-align: left;
white-space: normal;
}
.xgrids-k1-plugin .scan-configuration-grid {
grid-template-columns: 1fr;
}
@@ -480,12 +890,33 @@
grid-column: auto;
}
.xgrids-k1-plugin .session-footer,
.xgrids-k1-plugin .error-banner {
.xgrids-k1-plugin .session-footer {
align-items: stretch;
grid-template-columns: 1fr;
flex-direction: column;
}
}
@container xgrids-k1 (max-width: 48rem) {
.xgrids-k1-plugin .workspace-lead,
.xgrids-k1-plugin .panel-heading,
.xgrids-k1-plugin .wizard-step__content > header {
min-width: 0;
align-items: flex-start;
flex-wrap: wrap;
}
.xgrids-k1-plugin .workspace-lead > div,
.xgrids-k1-plugin .workspace-lead__status,
.xgrids-k1-plugin .panel-heading > div,
.xgrids-k1-plugin .wizard-step__content > header h3 {
min-width: 0;
max-width: 100%;
}
.xgrids-k1-plugin .workspace-lead__status {
align-items: flex-start;
text-align: left;
}
.xgrids-k1-plugin .error-banner {
grid-template-columns: auto minmax(0, 1fr);
@@ -493,12 +924,57 @@
.xgrids-k1-plugin .error-banner__actions {
grid-column: 2;
min-width: 0;
flex-wrap: wrap;
justify-content: flex-end;
}
.xgrids-k1-plugin .device-row__action {
.xgrids-k1-plugin .error-banner__diagnostic {
grid-template-columns: 1fr;
gap: 0.4rem;
}
.xgrids-k1-plugin .retained-recovery-target > div {
align-items: flex-start;
flex-direction: column;
}
}
@container xgrids-k1 (max-width: 32rem) {
.xgrids-k1-plugin .wizard-step {
grid-template-columns: 1.75rem minmax(0, 1fr);
gap: 0.55rem;
}
.xgrids-k1-plugin .wizard-step__rail span {
width: 1.75rem;
height: 1.75rem;
}
.xgrids-k1-plugin .detail-row {
grid-template-columns: 1fr;
gap: 0.25rem;
}
.xgrids-k1-plugin .detail-row dd {
overflow-wrap: anywhere;
text-align: left;
white-space: normal;
}
.xgrids-k1-plugin .error-banner {
grid-template-columns: 1fr;
}
.xgrids-k1-plugin .error-banner__dot {
display: none;
}
.xgrids-k1-plugin .error-banner__actions {
grid-column: 1;
align-items: stretch;
flex-direction: column;
justify-content: flex-start;
}
}
@@ -517,6 +993,57 @@
backdrop-filter: blur(20px);
}
.xgrids-k1-spatial-controls--recovery {
display: grid;
min-width: min(46rem, 100%);
grid-template-columns: minmax(0, 1fr);
gap: 0.45rem;
padding: 0.65rem 0.75rem;
}
.active-stream-recovery__compact-heading {
display: flex;
min-width: 0;
align-items: center;
justify-content: space-between;
gap: 0.75rem;
}
.active-stream-recovery__compact-heading > span:first-child {
overflow: hidden;
color: var(--nodedc-text-muted);
font-size: 0.5rem;
font-weight: 650;
letter-spacing: 0.14em;
text-overflow: ellipsis;
white-space: nowrap;
}
.active-stream-recovery--compact {
min-width: 0;
grid-template-columns: minmax(0, 1fr) auto;
align-items: center;
gap: 0.65rem;
margin-top: 0;
}
.active-stream-recovery--compact .active-stream-recovery__state {
min-width: 0;
background: transparent;
padding: 0;
}
.active-stream-recovery--compact .active-stream-recovery__actions {
max-width: 15rem;
grid-template-columns: auto;
gap: 0.25rem;
}
.active-stream-recovery--compact .active-stream-recovery__actions p {
font-size: 0.5rem;
line-height: 1.35;
}
.xgrids-k1-spatial-controls__phase {
display: flex;
min-width: 11rem;
@@ -547,16 +1074,6 @@
font-size: 0.53rem;
}
.xgrids-k1-spatial-controls__spinner {
width: 0.82rem;
height: 0.82rem;
flex: 0 0 0.82rem;
border: 1px solid rgb(255 255 255 / 0.16);
border-top-color: var(--nodedc-text-primary);
border-radius: 50%;
animation: xgrids-k1-spin 900ms linear infinite;
}
.xgrids-k1-spatial-controls__telemetry {
display: flex;
flex: 0 1 auto;
@@ -598,8 +1115,32 @@
white-space: nowrap;
}
@keyframes xgrids-k1-spin {
to { transform: rotate(360deg); }
.xgrids-k1-spatial-controls__action-label {
display: block;
width: 9.75rem;
font-size: 0.66rem;
line-height: 1.08;
text-align: center;
white-space: normal;
}
.xgrids-k1-spatial-controls__action-label--local {
width: 8.75rem;
}
.connection-action-progress {
display: flex;
min-height: 2.75rem;
width: 100%;
align-items: center;
justify-content: center;
gap: 0.65rem;
color: var(--nodedc-text-secondary);
}
.connection-action-progress strong {
font-size: 0.78rem;
font-weight: 600;
}
@media (max-width: 960px) {
@@ -612,4 +1153,16 @@
.xgrids-k1-spatial-controls__error small {
display: none;
}
.active-stream-recovery--compact {
grid-template-columns: minmax(0, 1fr);
}
.active-stream-recovery--compact .active-stream-recovery__actions {
max-width: none;
}
.active-stream-recovery--compact .active-stream-recovery__actions p {
display: none;
}
}