Files
NODEDC_MISSION_CORE/plugins/xgrids-k1/frontend/src/styles.css
T
DCCONSTRUCTIONS e515ab1b8c feat(planning): consolidate recorded-route localization and spatial scene
Preserve the completed teach-and-repeat laboratory stage: reference preparation, cascaded acquisition, local tracking and recovery, recording lifecycle, replay qualification, and persistent Rerun scene controls. Document the open grid-picking regression and Rerun upgrade contract. No autonomous driving or loop-closure optimization is claimed.
2026-09-21 08:47:19 +03:00

1121 lines
21 KiB
CSS

/* 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;
max-width: 100%;
grid-template-columns: minmax(0, 1fr);
align-items: start;
gap: 0.85rem;
}
.device-workspace__side {
display: grid;
min-width: 0;
max-width: 100%;
gap: 0.85rem;
}
.connection-panel,
.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;
align-items: center;
gap: 0.9rem;
border-radius: 1rem;
background: rgb(255 255 255 / 0.045);
color: var(--nodedc-text-primary);
padding: 0.85rem 1rem;
}
.error-banner__dot {
width: 0.46rem;
height: 0.46rem;
align-self: start;
margin-top: 0.28rem;
border-radius: 50%;
background: rgb(var(--nodedc-danger-rgb));
}
.error-banner strong,
.error-banner p {
margin: 0;
}
.error-banner strong {
color: var(--nodedc-text-primary);
font-size: 0.76rem;
}
.error-banner p {
margin-top: 0.2rem;
color: var(--nodedc-text-secondary);
font-size: 0.68rem;
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;
}
.configuration-anchor {
display: grid;
min-width: 0;
max-width: 100%;
gap: 0.55rem;
margin-top: 1.2rem;
border-radius: 0.95rem;
background: rgb(255 255 255 / 0.028);
padding: 0.8rem;
}
.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 {
display: grid;
grid-template-columns: 2.2rem minmax(0, 1fr);
gap: 0.75rem;
}
.wizard-step__rail {
position: relative;
display: flex;
justify-content: center;
}
.wizard-step__rail::after {
position: absolute;
top: 2rem;
bottom: 0;
left: 50%;
width: 1px;
background: var(--station-hairline);
content: "";
}
.wizard-step:last-child .wizard-step__rail::after {
display: none;
}
.wizard-step__rail span {
position: relative;
z-index: 1;
display: grid;
width: 2rem;
height: 2rem;
place-items: center;
border-radius: 50%;
background: #27272a;
color: var(--nodedc-text-secondary);
font-size: 0.59rem;
font-weight: 800;
}
.wizard-step__content {
min-width: 0;
padding: 0.08rem 0 1.5rem;
}
.wizard-step:last-child .wizard-step__content {
padding-bottom: 0;
}
.wizard-step__content > header {
display: flex;
min-height: 2rem;
align-items: center;
justify-content: space-between;
gap: 0.7rem;
margin-bottom: 0.75rem;
}
.wizard-step__content h3 {
margin: 0;
font-size: 0.8rem;
font-weight: 710;
}
.step-copy,
.safety-note,
.live-instruction {
margin: 0 0 0.72rem;
color: var(--nodedc-text-muted);
font-size: 0.65rem;
line-height: 1.48;
}
.safety-note,
.live-instruction {
margin: 0.7rem 0 0;
}
.device-list {
display: grid;
max-height: 20rem;
gap: 0.48rem;
margin-top: 0.72rem;
overflow-y: auto;
padding-right: 0.2rem;
}
.device-row {
display: grid;
gap: 0.62rem;
border-radius: 0.95rem;
background: rgb(255 255 255 / 0.035);
padding: 0.72rem;
}
.device-row[data-selected="true"] {
background: rgb(255 255 255 / 0.065);
box-shadow: none;
}
.device-row__identity,
.device-row__action {
display: flex;
min-width: 0;
align-items: center;
justify-content: space-between;
gap: 0.65rem;
}
.device-row__identity {
justify-content: flex-start;
}
.device-row__identity > div {
display: grid;
min-width: 0;
gap: 0.2rem;
}
.device-row__name {
display: flex;
min-width: 0;
align-items: center;
gap: 0.42rem;
}
.device-row__name small {
flex: 0 0 auto;
color: var(--nodedc-text-muted);
font-size: 0.47rem;
font-weight: 750;
letter-spacing: 0.04em;
text-transform: uppercase;
}
.device-row__identity strong {
min-width: 0;
max-width: 100%;
overflow: visible;
overflow-wrap: anywhere;
font-size: 0.69rem;
text-overflow: clip;
white-space: normal;
}
.device-row code,
.detail-row code {
display: block;
min-width: 0;
max-width: 100%;
overflow: visible;
overflow-wrap: anywhere;
color: var(--nodedc-text-muted);
font-size: 0.58rem;
text-overflow: clip;
white-space: normal;
}
.device-row__signal {
width: 0.58rem;
height: 0.58rem;
flex: 0 0 0.58rem;
border-radius: 50%;
background: var(--nodedc-text-muted);
}
.device-row[data-likely-k1="true"] .device-row__signal {
background: rgb(var(--nodedc-success-rgb));
}
.device-row__action > span {
color: var(--nodedc-text-muted);
font-size: 0.62rem;
}
.empty-device-list {
border-radius: 0.95rem;
background: rgb(255 255 255 / 0.025);
color: var(--nodedc-text-muted);
padding: 0.9rem;
font-size: 0.65rem;
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;
}
.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;
margin: 0.72rem 0;
border-radius: 0.85rem;
background: rgb(255 255 255 / 0.03);
padding: 0.62rem 0.75rem;
font-size: 0.65rem;
}
.connection-summary span {
color: var(--nodedc-text-muted);
}
.connection-summary strong {
min-width: 0;
max-width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.session-panel > .nodedc-segmented {
margin-top: 1.2rem;
}
.session-form {
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__detail {
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));
gap: 0.75rem;
}
.configuration-field {
display: grid;
min-width: 0;
gap: 0.45rem;
}
.start-confirmation-note {
margin: -0.25rem 0 0;
color: var(--nodedc-text-muted);
font-size: 0.6rem;
line-height: 1.45;
}
.session-form--replay {
grid-template-columns: minmax(0, 1.55fr) minmax(8rem, 0.45fr);
}
.session-form--replay > :first-child {
grid-column: 1 / -1;
}
.session-form--replay > .nodedc-button {
align-self: end;
}
.session-footer {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
margin-top: 1rem;
padding-top: 0.9rem;
}
.session-footer p {
max-width: 30rem;
margin: 0;
color: var(--nodedc-text-muted);
font-size: 0.62rem;
line-height: 1.45;
}
.diagnostics-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 0.85rem;
}
.detail-list {
display: grid;
margin: 0.9rem 0 0;
}
.detail-row {
display: grid;
min-width: 0;
grid-template-columns: minmax(7rem, 0.72fr) minmax(0, 1.28fr);
gap: 1rem;
padding: 0.7rem 0;
}
.detail-row dt,
.detail-row dd {
min-width: 0;
margin: 0;
font-size: 0.65rem;
}
.detail-row dt {
color: var(--nodedc-text-muted);
}
.detail-row dd {
overflow: visible;
overflow-wrap: anywhere;
color: var(--nodedc-text-secondary);
text-align: right;
text-overflow: clip;
white-space: normal;
}
.inline-state {
display: inline-flex;
align-items: center;
gap: 0.35rem;
}
.inline-state::before {
width: 0.4rem;
height: 0.4rem;
border-radius: 50%;
background: var(--nodedc-text-muted);
content: "";
}
.inline-state[data-state="open"]::before { background: rgb(var(--nodedc-success-rgb)); }
.inline-state[data-state="error"]::before,
.inline-state[data-state="closed"]::before { background: rgb(var(--nodedc-danger-rgb)); }
.latency-now {
color: var(--nodedc-text-primary);
font-size: 1.2rem;
font-weight: 660;
letter-spacing: -0.04em;
}
.latency-now span {
color: var(--nodedc-text-muted);
font-size: 0.61rem;
letter-spacing: 0;
}
.latency-trace {
display: flex;
height: 7rem;
align-items: end;
gap: 0.2rem;
margin-top: 1rem;
border-radius: 0.85rem;
background: rgb(255 255 255 / 0.018);
padding: 0.7rem;
}
.latency-trace span {
min-width: 0.16rem;
flex: 1 1 0;
border-radius: 999px 999px 0.12rem 0.12rem;
background: var(--nodedc-text-primary);
}
.latency-trace p {
align-self: center;
margin: auto;
color: var(--nodedc-text-muted);
font-size: 0.62rem;
line-height: 1.45;
text-align: center;
}
.latency-legend {
display: flex;
justify-content: space-between;
margin-top: 0.38rem;
color: var(--nodedc-text-muted);
font-size: 0.54rem;
}
}
/* 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(32rem, 0.8fr) minmax(38rem, 1.2fr);
}
}
@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;
}
}
@container xgrids-k1 (max-width: 65rem) {
.xgrids-k1-plugin .diagnostics-grid {
grid-template-columns: 1fr;
}
}
@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;
}
.xgrids-k1-plugin .session-form--replay {
grid-template-columns: 1fr;
}
.xgrids-k1-plugin .session-form--replay > :first-child {
grid-column: auto;
}
.xgrids-k1-plugin .session-footer {
align-items: stretch;
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);
}
.xgrids-k1-plugin .error-banner__actions {
grid-column: 2;
min-width: 0;
flex-wrap: wrap;
justify-content: flex-end;
}
.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;
}
}
.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;
column-gap: 0.75rem;
margin-top: 0;
}
.active-stream-recovery--compact .active-stream-recovery__state {
grid-column: 1;
grid-row: 1;
min-width: 0;
align-items: center;
gap: 0.65rem;
background: transparent;
padding: 0;
}
.active-stream-recovery--compact
.active-stream-recovery__state
> .nodedc-activity-indicator {
margin-top: 0;
}
.active-stream-recovery--compact .active-stream-recovery__copy {
display: grid;
min-width: 0;
justify-items: center;
gap: 0.1rem;
overflow: hidden;
text-align: center;
}
.active-stream-recovery--compact .active-stream-recovery__copy strong {
max-width: 100%;
overflow: hidden;
font-size: 0.62rem;
font-weight: 600;
line-height: 1.35;
text-overflow: ellipsis;
white-space: nowrap;
}
.active-stream-recovery--compact .active-stream-recovery__detail {
display: flex;
min-width: 0;
max-width: 100%;
align-items: baseline;
justify-content: center;
gap: 0.4rem;
overflow: hidden;
}
.active-stream-recovery--compact .active-stream-recovery__detail > span {
min-width: 0;
overflow: hidden;
font-size: 0.56rem;
line-height: 1.35;
text-overflow: ellipsis;
white-space: nowrap;
}
.active-stream-recovery--compact .active-stream-recovery__copy small {
flex: 0 0 auto;
font-size: 0.54rem;
line-height: 1.35;
white-space: nowrap;
}
.active-stream-recovery--compact .active-stream-recovery__actions {
grid-column: 2;
grid-row: 1;
align-self: start;
max-width: none;
grid-template-columns: auto;
justify-items: end;
gap: 0.25rem;
}
.active-stream-recovery--compact .active-stream-recovery__actions p {
display: none;
}
.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) {
.xgrids-k1-spatial-controls {
min-width: 0;
}
.xgrids-k1-spatial-controls__telemetry,
.xgrids-k1-spatial-controls__error small {
display: none;
}
.active-stream-recovery--compact {
grid-template-columns: minmax(0, 1fr) auto;
}
.active-stream-recovery--compact .active-stream-recovery__actions {
grid-column: 2;
}
}