@oicl/openbridge-webcomponents 2.0.0-next.83 → 2.0.0-next.85

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/bundle/openbridge-webcomponents.bundle.js +1223 -493
  2. package/bundle/openbridge-webcomponents.bundle.js.map +1 -1
  3. package/custom-elements.json +642 -196
  4. package/dist/components/tab-item/tab-item.css.js +8 -1
  5. package/dist/components/tab-item/tab-item.css.js.map +1 -1
  6. package/dist/components/tab-item/tab-item.d.ts +44 -0
  7. package/dist/components/tab-item/tab-item.d.ts.map +1 -1
  8. package/dist/components/tab-item/tab-item.js +44 -25
  9. package/dist/components/tab-item/tab-item.js.map +1 -1
  10. package/dist/components/tab-row/tab-row.d.ts +23 -9
  11. package/dist/components/tab-row/tab-row.d.ts.map +1 -1
  12. package/dist/components/tab-row/tab-row.js +24 -7
  13. package/dist/components/tab-row/tab-row.js.map +1 -1
  14. package/dist/components/textbox/textbox.css.js +29 -5
  15. package/dist/components/textbox/textbox.css.js.map +1 -1
  16. package/dist/components/textbox/textbox.d.ts +5 -0
  17. package/dist/components/textbox/textbox.d.ts.map +1 -1
  18. package/dist/components/textbox/textbox.js +6 -1
  19. package/dist/components/textbox/textbox.js.map +1 -1
  20. package/dist/navigation-instruments/readout-list-item/readout-list-item.css.js +611 -230
  21. package/dist/navigation-instruments/readout-list-item/readout-list-item.css.js.map +1 -1
  22. package/dist/navigation-instruments/readout-list-item/readout-list-item.d.ts +280 -61
  23. package/dist/navigation-instruments/readout-list-item/readout-list-item.d.ts.map +1 -1
  24. package/dist/navigation-instruments/readout-list-item/readout-list-item.js +529 -247
  25. package/dist/navigation-instruments/readout-list-item/readout-list-item.js.map +1 -1
  26. package/package.json +1 -1
@@ -12,264 +12,645 @@ const componentStyle = css`* {
12
12
  width: 100%;
13
13
  }
14
14
 
15
+ /* ---------- Root / surface ----------
16
+ * \`.root\` is the touch target (a <button> when clickable, otherwise a <div>).
17
+ * \`.surface\` is the visible box that carries padding, corner radius, the
18
+ * data-quality background/border, and — when clickable — the flat interaction
19
+ * states. */
20
+
15
21
  .root {
22
+ display: block;
23
+ inline-size: 100%;
24
+ margin: 0;
25
+ /* Neutralise the native <button> chrome (default padding + appearance) when
26
+ \`.root\` is the clickable touch target, so clickable rows don't inset their
27
+ \`.surface\` and misalign with non-clickable \`<div>\` rows. */
28
+ padding: 0;
29
+ border: none;
30
+ background: none;
31
+ appearance: none;
32
+ font: inherit;
33
+ color: inherit;
34
+ text-align: inherit;
35
+ }
36
+
37
+ .root.clickable {
38
+ cursor: pointer;
39
+ /* prettier-ignore */
40
+ }
41
+
42
+ .root.clickable {
43
+ cursor: pointer;
44
+ }
45
+
46
+ .root.clickable:focus {
47
+ outline: none;
48
+ }
49
+
50
+ .root.clickable .surface {
51
+ border-color: var(--flat-enabled-border-color);
52
+ background-color: var(--flat-enabled-background-color);
53
+ border-width: 1px;
54
+ border-style: solid;
55
+ cursor: pointer;
56
+ --base-border-color: var(--flat-enabled-border-color);
57
+ --base-background-color: var(--flat-enabled-background-color);
58
+ }
59
+
60
+ .root.clickable.activated .surface {
61
+ border-color: var(--flat-activated-border-color);
62
+ background-color: var(--flat-activated-background-color);
63
+ --base-border-color: var(--flat-activated-border-color);
64
+ --base-background-color: var(--flat-activated-background-color);
65
+ }
66
+
67
+ @media (hover:hover) {
68
+
69
+ .root.clickable:hover .surface {
70
+ border-color: color-mix(in srgb, var(--flat-hover-border-color) calc(var(--obc-can-hover) * 100%), var(--base-border-color));
71
+ background-color: color-mix(in srgb, var(--flat-hover-background-color) calc(var(--obc-can-hover) * 100%), var(--base-background-color));
72
+ }
73
+ }
74
+
75
+ .root.clickable:active .surface {
76
+ border-color: var(--flat-pressed-border-color);
77
+ background-color: var(--flat-pressed-background-color);
78
+ }
79
+
80
+ .root.clickable:focus-visible .surface {
81
+ outline-color: var(--border-focus-color);
82
+ outline-width: var(--global-size-spacing-border-weight-focusframe);
83
+ outline-style: solid;
84
+ border-color: var(--container-global-color);
85
+ z-index: 1;
86
+ }
87
+
88
+ .root.clickable:disabled .surface {
89
+ border-color: var(--flat-disabled-border-color);
90
+ background-color: var(--flat-disabled-background-color);
91
+ cursor: not-allowed;
92
+ color: var(--on-flat-disabled-color) !important;
93
+ }
94
+
95
+ .root.clickable.disabled .surface {
96
+ border-color: var(--flat-disabled-border-color);
97
+ background-color: var(--flat-disabled-background-color);
98
+ cursor: not-allowed;
99
+ color: var(--on-flat-disabled-color) !important;
100
+ }
101
+
102
+ .root.clickable:disabled {
103
+ cursor: not-allowed;
104
+ }
105
+
106
+ .root.clickable.disabled {
107
+ cursor: not-allowed;
108
+ }
109
+
110
+ .root.clickable:focus {
111
+ outline: none;
112
+ }
113
+
114
+ /* Flip-flop: animate the value↔setpoint cap-height swap by forwarding obc-textbox's
115
+ opt-in size-transition var. 300ms matches the instrument setpoint marker
116
+ (svghelpers/setpoint.ts). Override via \`--obc-readout-list-item-flip-flop-duration\`. */
117
+
118
+ .root.flip-flop {
119
+ --obc-textbox-size-transition: var(
120
+ --obc-readout-list-item-flip-flop-duration,
121
+ 300ms
122
+ );
123
+ }
124
+
125
+ .surface {
126
+ display: block;
127
+ inline-size: 100%;
128
+ border-radius: var(--global-border-radius-border-radius-base);
129
+ }
130
+
131
+ /* Clickable corner variants. The \`.clickable\` qualifier is redundant for
132
+ matching (a \`border-*\` class is only ever set alongside \`.clickable\`) but
133
+ raises specificity to (0,4,0) so the interactive corner shape wins over the
134
+ data-quality rules below — which also target \`.surface\` at (0,3,0) — when a
135
+ row is both clickable and low-integrity/invalid. Standalone data-quality rows
136
+ keep their own radius. */
137
+
138
+ .root.clickable.border-squared .surface {
139
+ border-radius: 0;
140
+ }
141
+
142
+ .root.clickable.border-round-corners .surface {
143
+ border-radius: var(--global-border-radius-border-radius-floating);
144
+ }
145
+
146
+ .root.clickable.border-round .surface {
147
+ border-radius: var(--global-border-radius-border-radius-round);
148
+ }
149
+
150
+ /* ---------- Content row ----------
151
+ * Label on the left, value/unit cluster on the right, optional source after a
152
+ * trailing divider. All segments bottom-align so cap heights sit on a shared
153
+ * baseline. */
154
+
155
+ .content {
156
+ display: flex;
157
+ align-items: flex-end;
158
+ justify-content: space-between;
159
+ inline-size: 100%;
160
+ min-inline-size: 0;
161
+ }
162
+
163
+ /* Reserve the value cap-height per tier so the row height and the bottom
164
+ baseline stay constant regardless of which parts (label / value / unit / src /
165
+ setpoint / advice / icons) are present. */
166
+
167
+ .size-small .content {
168
+ min-block-size: var(
169
+ --global-typography-instrument-value-regular-container-height
170
+ );
171
+ }
172
+
173
+ .size-medium .content {
174
+ min-block-size: var(
175
+ --global-typography-instrument-value-medium-container-height
176
+ );
177
+ }
178
+
179
+ .size-large .content {
180
+ min-block-size: var(
181
+ --global-typography-instrument-value-large-container-height
182
+ );
183
+ }
184
+
185
+ /* The value is the primary data, so under width pressure the label side yields
186
+ first: the label-container shrinks (and clips a too-long label) while
187
+ \`.value-area\` keeps its intrinsic width. */
188
+
189
+ .label-container {
16
190
  display: inline-flex;
17
191
  align-items: flex-end;
18
- border-radius: var(--global-border-radius-border-radius-base);
19
- width: 100%;
192
+ gap: var(--global-size-spacing-target-padding);
193
+ flex: 1 1 auto;
194
+ min-inline-size: 0;
195
+ overflow: hidden;
20
196
  }
21
197
 
22
- .root .content {
23
- display: inline-flex;
24
- align-items: flex-end;
25
- justify-content: space-between;
26
- flex: 1 1 auto;
27
- min-width: 0;
28
- max-width: none;
29
- width: 100%;
30
- }
198
+ .label-stack {
199
+ display: inline-flex;
200
+ flex-direction: column;
201
+ align-items: flex-start;
202
+ justify-content: flex-end;
203
+ min-inline-size: 0;
204
+ }
31
205
 
32
- .root .label-container {
33
- display: inline-flex;
34
- align-items: flex-end;
35
- gap: var(--global-size-spacing-target-padding);
36
- flex: none;
37
- }
206
+ .value-area {
207
+ display: inline-flex;
208
+ align-items: flex-end;
209
+ justify-content: flex-end;
210
+ flex: 0 0 auto;
211
+ min-inline-size: 0;
212
+ }
38
213
 
39
- .root .leading-icon {
40
- display: inline-flex;
41
- align-items: center;
42
- justify-content: center;
43
- color: var(--element-neutral-color);
44
- }
214
+ .value-cluster {
215
+ display: inline-flex;
216
+ align-items: flex-end;
217
+ justify-content: flex-end;
218
+ }
45
219
 
46
- .root .label-stack {
47
- display: inline-flex;
48
- flex-direction: column;
49
- align-items: flex-start;
50
- justify-content: flex-end;
51
- }
220
+ .unit-area {
221
+ display: inline-flex;
222
+ align-items: flex-end;
223
+ }
52
224
 
53
- .root .label-inline {
54
- display: inline-flex;
55
- align-items: center;
56
- gap: var(--global-size-spacing-target-padding);
57
- }
225
+ /* ---------- Readout building block (advice / setpoint / value) ---------- */
58
226
 
59
- .root .label {
60
- font-family: var(--global-typography-font-family);
61
- font-size: var(--global-typography-instrument-label-font-size);
62
- line-height: var(--global-typography-instrument-label-line-height);
63
- font-feature-settings:
64
- "liga" off,
65
- "clig" off,
66
- "ss04" on;
67
- display: flex;
68
- align-items: flex-end;
69
- block-size: var(--global-typography-instrument-label-container-height);
70
- max-block-size: var(--global-typography-instrument-label-container-height);
71
- padding-bottom: var(--global-typography-instrument-label-padding-bottom);
72
- overflow: hidden;
73
- font-size: var(--global-typography-instrument-label-font-size);
74
- line-height: var(--global-typography-instrument-label-line-height);
75
- color: var(--element-inactive-color);
76
- }
227
+ .block {
228
+ display: inline-flex;
229
+ align-items: flex-end;
230
+ }
77
231
 
78
- .root .unit,.root .source {
79
- font-family: var(--global-typography-font-family);
80
- font-size: var(--global-typography-instrument-unit-font-size);
81
- line-height: var(--global-typography-instrument-unit-line-height);
82
- font-feature-settings:
83
- "liga" off,
84
- "clig" off,
85
- "ss04" on;
86
- display: flex;
87
- align-items: flex-end;
88
- block-size: var(--global-typography-instrument-unit-container-height);
89
- max-block-size: var(--global-typography-instrument-unit-container-height);
90
- padding-bottom: var(--global-typography-instrument-unit-padding-bottom);
91
- overflow: hidden;
92
- font-size: var(--global-typography-instrument-unit-font-size);
93
- line-height: var(--global-typography-instrument-unit-line-height);
94
- }
232
+ /* Number + its (setpoint/advice) degree glyph, hugging with no gap — the
233
+ \`.block\` gap only separates the icon from this group. */
95
234
 
96
- .root .unit {
97
- color: var(--element-inactive-color);
98
- }
235
+ .block-content {
236
+ display: inline-flex;
237
+ align-items: flex-end;
238
+ }
99
239
 
100
- .root .source {
101
- color: var(--element-neutral-color);
102
- }
240
+ .block-icon {
241
+ display: inline-flex;
242
+ align-items: center;
243
+ justify-content: center;
244
+ flex: none;
245
+ color: inherit;
246
+ /* Centre the icon against the block's text rather than bottom-aligning it (the
247
+ block is flex-end). Matters for the value block, whose text is taller than
248
+ the icon, so the value icon lines up with the number like the smaller
249
+ setpoint/advice icons do. */
250
+ align-self: center;
251
+ }
103
252
 
104
- .root .value-container {
105
- display: inline-flex;
106
- align-items: flex-end;
107
- justify-content: flex-end;
108
- flex: 1 1 auto;
109
- min-width: 0;
110
- }
253
+ .block-icon obi-input-right,
254
+ .block-icon obi-notification-advice,
255
+ .block-icon ::slotted(*) {
256
+ display: block;
257
+ inline-size: 100%;
258
+ block-size: 100%;
259
+ }
111
260
 
112
- .root .value-wrap {
113
- display: inline-flex;
114
- align-items: flex-end;
115
- justify-content: flex-end;
116
- }
261
+ .hinted-zero {
262
+ color: var(
263
+ --obc-readout-list-item-hinted-color,
264
+ var(--element-inactive-color)
265
+ );
266
+ }
117
267
 
118
- .root .value-cluster {
119
- display: inline-flex;
120
- align-items: flex-end;
121
- justify-content: flex-end;
122
- gap: var(
123
- --instrument-components-readout-new-list-item-medium-value-container-gap
124
- );
125
- }
268
+ /* ---------- Text colours (overridable via custom properties) ----------
269
+ * obc-textbox does not set its own colour, so it inherits these. */
126
270
 
127
- .root .value-icon {
128
- display: inline-flex;
129
- align-items: center;
130
- justify-content: center;
131
- color: inherit;
132
- }
271
+ .block-value {
272
+ color: var(--obc-readout-list-item-value-color, var(--element-neutral-color));
273
+ }
133
274
 
134
- .root .divider {
135
- flex: none;
136
- inline-size: 1px;
137
- background-color: var(--border-outline-color);
138
- align-self: stretch;
139
- }
275
+ .block-value.tone-enhanced {
276
+ color: var(
277
+ --obc-readout-list-item-value-enhanced-color,
278
+ var(--element-neutral-enhanced-color)
279
+ );
280
+ }
140
281
 
141
- .root .unit-trailing {
142
- display: inline-flex;
143
- align-items: flex-end;
144
- }
282
+ /* The setpoint shares the value's colour state: neutral by default, enhanced
283
+ (blue) only when the row is enhanced — never a blue setpoint next to a grey
284
+ value. \`--instrument-enhanced-secondary-color\` is the same #2d548b as the
285
+ value's \`--element-neutral-enhanced-color\`. */
286
+
287
+ .block-setpoint {
288
+ color: var(
289
+ --obc-readout-list-item-setpoint-color,
290
+ var(--element-neutral-color)
291
+ );
292
+ /* Flip-flop emphasis + pop-up fade animate at 100ms. */
293
+ transition:
294
+ opacity 100ms ease,
295
+ color 100ms ease;
296
+ }
145
297
 
146
- .root .source-trailing {
147
- display: inline-flex;
148
- align-items: center;
149
- justify-content: flex-end;
150
- padding-inline: calc(var(--global-size-spacing-target-padding) / 2);
151
- }
298
+ .block-setpoint.tone-enhanced {
299
+ color: var(
300
+ --obc-readout-list-item-setpoint-enhanced-color,
301
+ var(--instrument-enhanced-secondary-color)
302
+ );
303
+ }
152
304
 
153
- .root.size-base {
154
- padding-inline: var(
155
- --instrument-components-readout-new-list-item-regular-container-padding-horizontal
156
- );
157
- padding-block: 0;
158
- }
305
+ /* Pop-up: fade the setpoint out once value === setpoint, keeping its space so
306
+ the value stays column-aligned. */
159
307
 
160
- .root.size-base .content {
161
- gap: var(
162
- --instrument-components-readout-new-list-item-regular-content-container-gap
163
- );
164
- }
165
-
166
- .root.size-base .value-cluster {
167
- gap: var(
168
- --instrument-components-readout-new-list-item-regular-value-container-gap
169
- );
170
- }
171
-
172
- .root.size-base.stacking-leading-src .content {
173
- gap: var(--global-size-spacing-target-padding);
174
- }
175
-
176
- .root.size-base .divider {
177
- block-size: var(
178
- --global-typography-instrument-value-regular-container-height
179
- );
180
- }
181
-
182
- .root.size-priority {
183
- padding-inline: var(
184
- --instrument-components-readout-new-list-item-medium-container-padding-horizontal
185
- );
186
- padding-block: var(
187
- --instrument-components-readout-new-list-item-medium-container-padding-vertical
188
- );
189
- }
308
+ .block-setpoint.is-hiding {
309
+ opacity: 0;
310
+ }
190
311
 
191
- .root.size-priority .content {
192
- gap: var(
193
- --instrument-components-readout-new-list-item-medium-content-container-gap
194
- );
195
- }
196
-
197
- .root.size-priority .divider {
198
- block-size: var(
199
- --global-typography-instrument-value-medium-container-height
200
- );
201
- }
202
-
203
- .root.size-enhanced {
204
- padding-inline: var(
205
- --instrument-components-readout-new-list-item-large-container-padding-horizontal
206
- );
207
- padding-block: var(
208
- --instrument-components-readout-new-list-item-large-container-padding-vertical
209
- );
210
- }
312
+ .block-setpoint.is-hidden {
313
+ opacity: 0;
314
+ visibility: hidden;
315
+ }
211
316
 
212
- .root.size-enhanced .content {
213
- gap: var(--instrument-components-readout-new-list-item-large-content-gap);
214
- }
215
-
216
- .root.size-enhanced .value-cluster {
217
- gap: var(--instrument-components-readout-new-list-item-large-value-gap);
218
- }
219
-
220
- .root.size-enhanced .divider {
221
- block-size: var(
222
- --global-typography-instrument-value-large-container-height
223
- );
224
- }
225
-
226
- .root.size-enhanced.stacking-leading-unit .label-container {
227
- align-items: center;
228
- }
229
-
230
- .root.size-enhanced.stacking-leading-unit .label-stack {
231
- justify-content: flex-end;
232
- }
233
-
234
- .root.size-enhanced.stacking-leading-unit .unit-leading {
235
- margin-top: 0;
236
- }
237
-
238
- .root.stacking-leading-unit .unit-trailing {
239
- display: none;
240
- }
241
-
242
- .root.stacking-leading-src .source-inline {
243
- display: inline-flex;
244
- align-items: center;
245
- justify-content: flex-end;
246
- }
247
-
248
- .root.stacking-leading-src :is(.divider,.source-trailing) {
249
- display: none;
250
- }
251
-
252
- .root:is(.data-low-integrity,.data-invalid) {
253
- background: var(--_obc-readout-list-item-data-background);
254
- border: 1px solid var(--_obc-readout-list-item-data-border);
255
- border-radius: 4px;
256
- }
317
+ /* Touching / focus state: the setpoint triangle takes the marker's focus look — a
318
+ pale fill (--base-blue-100) with a dark 1px edge (--element-neutral-enhanced),
319
+ mirroring \`svghelpers/setpoint.ts\` focus (fill base-blue-100 + 2px stroke).
320
+ The glyph icon is \`fill: currentColor\` and can't take a CSS \`stroke\`, so the
321
+ edge is layered drop-shadows. The setpoint number keeps its normal, readable
322
+ colour. */
323
+
324
+ .block-setpoint.touching {
325
+ --_touching-outline: var(
326
+ --obc-readout-list-item-setpoint-touching-outline-color,
327
+ var(--element-neutral-enhanced-color)
328
+ );
329
+ }
330
+
331
+ .block-setpoint.touching .block-icon {
332
+ color: var(
333
+ --obc-readout-list-item-setpoint-touching-color,
334
+ var(--base-blue-100)
335
+ );
336
+ filter: drop-shadow(1px 0 0 var(--_touching-outline))
337
+ drop-shadow(-1px 0 0 var(--_touching-outline))
338
+ drop-shadow(0 1px 0 var(--_touching-outline))
339
+ drop-shadow(0 -1px 0 var(--_touching-outline));
340
+ }
341
+
342
+ .block-advice {
343
+ color: var(
344
+ --obc-readout-list-item-advice-color,
345
+ var(--element-neutral-color)
346
+ );
347
+ }
348
+
349
+ .label {
350
+ color: var(
351
+ --obc-readout-list-item-label-color,
352
+ var(--element-inactive-color)
353
+ );
354
+ }
355
+
356
+ .unit {
357
+ color: var(--obc-readout-list-item-unit-color, var(--element-inactive-color));
358
+ }
359
+
360
+ .source {
361
+ color: var(
362
+ --obc-readout-list-item-source-color,
363
+ var(--element-neutral-color)
364
+ );
365
+ }
366
+
367
+ /* ---------- Per-block data quality ----------
368
+ * Independent of (and nests inside) the row-level data-quality frame. Uses
369
+ * \`outline\` (not \`border\`) so the chip never shifts the block's width — the
370
+ * value stays column-aligned across rows. */
371
+
372
+ .block.data-low-integrity,
373
+ .block.data-invalid,
374
+ .source.data-low-integrity,
375
+ .source.data-invalid {
376
+ outline: 1px solid;
377
+ border-radius: var(--global-border-radius-border-radius-check);
378
+ }
379
+
380
+ .block.data-low-integrity,
381
+ .source.data-low-integrity {
382
+ background: var(--alert-low-integrity-background-color);
383
+ outline-color: var(--alert-low-integrity-border-color);
384
+ }
385
+
386
+ .block.data-invalid,
387
+ .source.data-invalid {
388
+ background: var(--alert-invalid-background-color);
389
+ outline-color: var(--alert-invalid-border-color);
390
+ }
391
+
392
+ .leading-icon {
393
+ display: inline-flex;
394
+ align-items: center;
395
+ justify-content: center;
396
+ flex: none;
397
+ color: var(--element-neutral-color);
398
+ }
399
+
400
+ .leading-icon ::slotted(*) {
401
+ display: block;
402
+ inline-size: 100%;
403
+ block-size: 100%;
404
+ }
405
+
406
+ .divider {
407
+ flex: none;
408
+ inline-size: 1px;
409
+ background-color: var(--border-outline-color);
410
+ align-self: stretch;
411
+ }
412
+
413
+ /* ---------- Value↔unit gap & degree column ----------
414
+ * Default 2px between the value digits and the unit. A degree (or a
415
+ * hasDegreeSpacer reserve) replaces the 2px with a cap-height degree column
416
+ * whose width scales with the value size, so value digits + units align across
417
+ * degree / no-degree rows of the same value size. */
418
+
419
+ .value-unit-gap {
420
+ flex: none;
421
+ inline-size: var(
422
+ --instrument-components-readout-new-general-horizontal-trim-padding
423
+ );
424
+ }
425
+
426
+ .degree-column {
427
+ flex: none;
428
+ display: inline-flex;
429
+ align-items: flex-end;
430
+ justify-content: center;
431
+ inline-size: var(--_obc-readout-list-item-degree-width, 0);
432
+ overflow: clip;
433
+ color: var(--obc-readout-list-item-value-color, var(--element-neutral-color));
434
+ }
435
+
436
+ .degree-column.tone-enhanced {
437
+ color: var(
438
+ --obc-readout-list-item-value-enhanced-color,
439
+ var(--element-neutral-enhanced-color)
440
+ );
441
+ }
442
+
443
+ /* Setpoint/advice degree glyphs inherit their block's colour. */
444
+
445
+ .degree-column.degree-inherit {
446
+ color: inherit;
447
+ }
448
+
449
+ .degree-column.degree-xs {
450
+ --_obc-readout-list-item-degree-width: var(
451
+ --global-typography-instrument-value-small-degree-unit-width
452
+ );
453
+ }
454
+
455
+ .degree-column.degree-s {
456
+ --_obc-readout-list-item-degree-width: var(
457
+ --global-typography-instrument-value-regular-degree-unit-width
458
+ );
459
+ }
460
+
461
+ .degree-column.degree-m {
462
+ --_obc-readout-list-item-degree-width: var(
463
+ --global-typography-instrument-value-medium-degree-unit-width
464
+ );
465
+ }
466
+
467
+ .degree-column.degree-l,
468
+ .degree-column.degree-xl {
469
+ --_obc-readout-list-item-degree-width: var(
470
+ --global-typography-instrument-value-large-degree-unit-width
471
+ );
472
+ }
473
+
474
+ /* Degree spacer: rendered AFTER the unit on a non-degree row that sets
475
+ hasDegreeSpacer. Its width (degree-compensation-padding = degree-column width
476
+ minus the 2px value↔unit gap) shifts the unit left so the row's value digits
477
+ stay aligned with degree rows in the same column. */
478
+
479
+ .degree-spacer {
480
+ flex: none;
481
+ align-self: stretch;
482
+ inline-size: var(--_obc-readout-list-item-degree-spacer-width, 0);
483
+ }
484
+
485
+ .size-small .degree-spacer {
486
+ --_obc-readout-list-item-degree-spacer-width: var(
487
+ --instrument-components-readout-new-list-item-regular-degree-compensation-padding
488
+ );
489
+ }
490
+
491
+ .size-medium .degree-spacer {
492
+ --_obc-readout-list-item-degree-spacer-width: var(
493
+ --instrument-components-readout-new-list-item-medium-degree-compensation-padding
494
+ );
495
+ }
496
+
497
+ .size-large .degree-spacer {
498
+ --_obc-readout-list-item-degree-spacer-width: var(
499
+ --instrument-components-readout-new-list-item-large-degree-compensation-padding
500
+ );
501
+ }
502
+
503
+ /* ---------- Size tiers ----------
504
+ * Public small/medium/large map to the design token regular/medium/large
505
+ * tiers. */
506
+
507
+ .size-small .surface {
508
+ padding-inline: var(
509
+ --instrument-components-readout-new-list-item-regular-container-padding-horizontal
510
+ );
511
+ padding-block: var(
512
+ --instrument-components-readout-new-list-item-regular-container-padding-vertical
513
+ );
514
+ }
515
+
516
+ .size-small .content {
517
+ gap: var(
518
+ --instrument-components-readout-new-list-item-regular-content-container-gap
519
+ );
520
+ }
521
+
522
+ .size-small .value-cluster {
523
+ gap: var(
524
+ --instrument-components-readout-new-list-item-regular-value-container-gap
525
+ );
526
+ }
527
+
528
+ .size-small .block {
529
+ gap: var(--instrument-components-readout-new-general-regular-icon-gap);
530
+ }
531
+
532
+ .size-small .block-icon,
533
+ .size-small .leading-icon {
534
+ inline-size: var(
535
+ --instrument-components-readout-new-general-regular-icon-size
536
+ );
537
+ block-size: var(
538
+ --instrument-components-readout-new-general-regular-icon-size
539
+ );
540
+ }
541
+
542
+ .size-small .divider {
543
+ block-size: var(
544
+ --global-typography-instrument-value-regular-container-height
545
+ );
546
+ }
547
+
548
+ .size-medium .surface {
549
+ padding-inline: var(
550
+ --instrument-components-readout-new-list-item-medium-container-padding-horizontal
551
+ );
552
+ padding-block: var(
553
+ --instrument-components-readout-new-list-item-medium-container-padding-vertical
554
+ );
555
+ }
556
+
557
+ .size-medium .content {
558
+ gap: var(
559
+ --instrument-components-readout-new-list-item-medium-content-container-gap
560
+ );
561
+ }
562
+
563
+ .size-medium .value-cluster {
564
+ gap: var(
565
+ --instrument-components-readout-new-list-item-medium-value-container-gap
566
+ );
567
+ }
568
+
569
+ .size-medium .block {
570
+ gap: var(--instrument-components-readout-new-general-medium-icon-gap);
571
+ }
572
+
573
+ .size-medium .block-icon,
574
+ .size-medium .leading-icon {
575
+ inline-size: var(
576
+ --instrument-components-readout-new-general-medium-icon-size
577
+ );
578
+ block-size: var(--instrument-components-readout-new-general-medium-icon-size);
579
+ }
580
+
581
+ .size-medium .divider {
582
+ block-size: var(--global-typography-instrument-value-medium-container-height);
583
+ }
584
+
585
+ .size-large .surface {
586
+ padding-inline: var(
587
+ --instrument-components-readout-new-list-item-large-container-padding-horizontal
588
+ );
589
+ padding-block: var(
590
+ --instrument-components-readout-new-list-item-large-container-padding-vertical
591
+ );
592
+ min-block-size: var(
593
+ --instrument-components-readout-new-list-item-large-min-height
594
+ );
595
+ }
596
+
597
+ .size-large .content {
598
+ gap: var(--instrument-components-readout-new-list-item-large-content-gap);
599
+ }
600
+
601
+ .size-large .value-cluster {
602
+ gap: var(--instrument-components-readout-new-list-item-large-value-gap);
603
+ }
604
+
605
+ .size-large .block {
606
+ gap: var(--instrument-components-readout-new-general-large-icon-gap);
607
+ }
608
+
609
+ .size-large .block-icon,
610
+ .size-large .leading-icon {
611
+ inline-size: var(--instrument-components-readout-new-general-large-icon-size);
612
+ block-size: var(--instrument-components-readout-new-general-large-icon-size);
613
+ }
614
+
615
+ .size-large .divider {
616
+ block-size: var(--global-typography-instrument-value-large-container-height);
617
+ }
618
+
619
+ /* ---------- Stacking ----------
620
+ * leading-unit / leading-src move the unit / source up beside the label and
621
+ * suppress the trailing variant. (Handled in markup; these rules tighten the
622
+ * label-stack gap.) */
623
+
624
+ .stacking-leading-src .content {
625
+ gap: var(--global-size-spacing-target-padding);
626
+ }
627
+
628
+ /* ---------- Data quality ----------
629
+ * Orthogonal to the alert frame — both can apply at once. */
630
+
631
+ .root.data-low-integrity .surface,
632
+ .root.data-invalid .surface {
633
+ /* \`outline\` (not \`border\`) so the data-quality frame does not inset the
634
+ content by 1px — keeps the row's value column-aligned with unframed rows.
635
+ Matches the per-block data-quality rules. */
636
+ outline: 1px solid var(--_obc-readout-list-item-data-border);
637
+ background: var(--_obc-readout-list-item-data-background);
638
+ border-radius: var(--global-border-radius-border-radius-check);
639
+ }
257
640
 
258
641
  .root.data-low-integrity {
259
- --_obc-readout-list-item-data-background: var(
260
- --alert-low-integrity-background-color
261
- );
262
- --_obc-readout-list-item-data-border: var(
263
- --alert-low-integrity-border-color
264
- );
265
- }
642
+ --_obc-readout-list-item-data-background: var(
643
+ --alert-low-integrity-background-color
644
+ );
645
+ --_obc-readout-list-item-data-border: var(--alert-low-integrity-border-color);
646
+ }
266
647
 
267
648
  .root.data-invalid {
268
- --_obc-readout-list-item-data-background: var(
269
- --alert-invalid-background-color
270
- );
271
- --_obc-readout-list-item-data-border: var(--alert-invalid-border-color);
272
- }
649
+ --_obc-readout-list-item-data-background: var(
650
+ --alert-invalid-background-color
651
+ );
652
+ --_obc-readout-list-item-data-border: var(--alert-invalid-border-color);
653
+ }
273
654
  `;
274
655
  export {
275
656
  componentStyle as default