@oicl/openbridge-webcomponents 2.0.0-next.87 → 2.0.0-next.89
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.
- package/bundle/openbridge-webcomponents.bundle.js +17409 -16824
- package/bundle/openbridge-webcomponents.bundle.js.map +1 -1
- package/custom-elements.json +755 -44
- package/dist/building-blocks/readout-block/readout-block.css.js +229 -0
- package/dist/building-blocks/readout-block/readout-block.css.js.map +1 -0
- package/dist/building-blocks/readout-block/readout-block.d.ts +146 -0
- package/dist/building-blocks/readout-block/readout-block.d.ts.map +1 -0
- package/dist/building-blocks/readout-block/readout-block.js +273 -0
- package/dist/building-blocks/readout-block/readout-block.js.map +1 -0
- package/dist/navigation-instruments/gauge-radial/gauge-radial.css.js +58 -32
- package/dist/navigation-instruments/gauge-radial/gauge-radial.css.js.map +1 -1
- package/dist/navigation-instruments/gauge-radial/gauge-radial.d.ts +28 -0
- package/dist/navigation-instruments/gauge-radial/gauge-radial.d.ts.map +1 -1
- package/dist/navigation-instruments/gauge-radial/gauge-radial.js +25 -2
- package/dist/navigation-instruments/gauge-radial/gauge-radial.js.map +1 -1
- package/dist/navigation-instruments/readout-list/readout-list.css.js +24 -0
- package/dist/navigation-instruments/readout-list/readout-list.css.js.map +1 -0
- package/dist/navigation-instruments/readout-list/readout-list.d.ts +70 -0
- package/dist/navigation-instruments/readout-list/readout-list.d.ts.map +1 -0
- package/dist/navigation-instruments/readout-list/readout-list.js +154 -0
- package/dist/navigation-instruments/readout-list/readout-list.js.map +1 -0
- package/dist/navigation-instruments/readout-list-item/readout-list-item.css.js +80 -145
- package/dist/navigation-instruments/readout-list-item/readout-list-item.css.js.map +1 -1
- package/dist/navigation-instruments/readout-list-item/readout-list-item.d.ts +25 -26
- package/dist/navigation-instruments/readout-list-item/readout-list-item.d.ts.map +1 -1
- package/dist/navigation-instruments/readout-list-item/readout-list-item.js +66 -118
- package/dist/navigation-instruments/readout-list-item/readout-list-item.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readout-list.js","sources":["../../../src/navigation-instruments/readout-list/readout-list.ts"],"sourcesContent":["import {LitElement, html, unsafeCSS, type PropertyValues} from 'lit';\nimport {property} from 'lit/decorators.js';\nimport componentStyle from './readout-list.css?inline';\nimport {customElement} from '../../decorator.js';\nimport '../readout-list-item/readout-list-item.js';\nimport {ObcReadoutListItem} from '../readout-list-item/readout-list-item.js';\n\nconst ITEM_TAG = 'obc-readout-list-item';\n\n/** Child attributes whose change should re-trigger alignment (HTML-attribute usage). */\nconst OBSERVED_ATTRIBUTES = [\n 'unit',\n 'src',\n 'value',\n 'setpoint',\n 'advice',\n 'max-digits',\n 'fraction-digits',\n 'has-degree',\n 'has-setpoint',\n 'has-advice',\n];\n\n/** Integer-digit count of a numeric value (sign and fraction excluded). */\nfunction integerDigitCount(value: number | null | undefined): number {\n if (value === null || value === undefined || Number.isNaN(value)) {\n return 0;\n }\n return String(Math.trunc(Math.abs(value))).length;\n}\n\n/**\n * `<obc-readout-list>` – A container that groups `<obc-readout-list-item>` rows\n * and **auto-aligns their columns**.\n *\n * Because each row is its own custom element, cross-row column alignment is not\n * automatic. This container inspects its rows and pushes shared width reservers\n * down so the unit column, the value / setpoint / advice columns and the source\n * column all line up — the same effect the `Readout List Item → ColumnAlignment`\n * story achieves by hand, done for you. Alignment is always on.\n *\n * What it equalizes — derived from each row's data and broadcast to every row, so\n * the widest value / unit / source is never clipped:\n * - **Unit:** the longest `unit` becomes every row's unit space-reserver.\n * - **Value / setpoint / advice:** the widest numeric width (max integer digits +\n * max fraction digits across rows, derived from each row's `maxDigits` /\n * `fractionDigits` / current values) is reserved on every row's numeric blocks.\n * Reserving off digit counts keeps it stable as live values update.\n * - **Source:** the longest `src` becomes every row's source space-reserver.\n * - **Degree:** if any row has a degree, non-degree rows reserve the degree column\n * (`hasDegreeSpacer`) so their digits line up with the degree rows; the spacer is\n * cleared once no degree rows remain.\n *\n * The list **owns** these reservers: it recomputes them from the rows' data on\n * every pass (and clears stale reservers / spacers when rows change), so a\n * `spaceReserver` set directly on a row inside the list is overwritten. Drive the\n * data (`maxDigits` / `fractionDigits` / `unit` / `src`) rather than setting a\n * manual reserver when a row lives in a list.\n *\n * Alignment runs on `slotchange` and on child mutations (added/removed rows and\n * HTML-attribute changes). When rows are updated via JS **properties** only (no\n * attribute/DOM mutation), call {@link align} to recompute.\n *\n * @experimental Pilot for the new primitives + per-block options Readout API; the\n * API may change in a future release.\n *\n * @slot - The `<obc-readout-list-item>` rows.\n *\n * @csspart list - The vertical stack container.\n */\n@customElement('obc-readout-list')\nexport class ObcReadoutList extends LitElement {\n /**\n * Development aid: outline each row's readout building blocks (red), degree\n * columns (blue) and degree spacer (green) so the reserved column widths are\n * visible. Propagated to every row. Off by default.\n */\n @property({type: Boolean, reflect: true}) showDebugOverlay = false;\n\n private mutationObserver?: MutationObserver;\n\n protected override updated(changed: PropertyValues): void {\n super.updated(changed);\n // A host-property change is not seen by the child MutationObserver, so\n // re-propagate `showDebugOverlay` (and re-align) when it toggles.\n if (changed.has('showDebugOverlay')) {\n this.align();\n }\n }\n\n override disconnectedCallback(): void {\n this.mutationObserver?.disconnect();\n this.mutationObserver = undefined;\n super.disconnectedCallback();\n }\n\n /** The `obc-readout-list-item` rows, including those nested in wrapper elements. */\n private get items(): ObcReadoutListItem[] {\n const slot = this.shadowRoot?.querySelector('slot');\n const assigned = slot?.assignedElements({flatten: true}) ?? [];\n return assigned.flatMap((el) =>\n el.tagName.toLowerCase() === ITEM_TAG\n ? [el as ObcReadoutListItem]\n : Array.from(el.querySelectorAll<ObcReadoutListItem>(ITEM_TAG))\n );\n }\n\n /**\n * Recompute and apply the shared column reservers across all rows. Call this\n * after updating rows via JS properties only (attribute/DOM changes are picked\n * up automatically).\n */\n align(): void {\n const items = this.items;\n if (items.length === 0) {\n return;\n }\n\n let maxIntegerDigits = 0;\n let maxFractionDigits = 0;\n let longestUnit = '';\n let longestSrc = '';\n let anyDegree = false;\n\n for (const item of items) {\n maxFractionDigits = Math.max(maxFractionDigits, item.fractionDigits ?? 0);\n maxIntegerDigits = Math.max(\n maxIntegerDigits,\n item.maxDigits ?? 0,\n integerDigitCount(item.value),\n item.hasSetpoint ? integerDigitCount(item.setpoint) : 0,\n item.hasAdvice ? integerDigitCount(item.advice) : 0\n );\n if (item.unit && item.unit.length > longestUnit.length) {\n longestUnit = item.unit;\n }\n if (item.src && item.src.length > longestSrc.length) {\n longestSrc = item.src;\n }\n if (item.hasDegree) {\n anyDegree = true;\n }\n }\n\n const numericReserver =\n maxIntegerDigits > 0\n ? '0'.repeat(maxIntegerDigits) +\n (maxFractionDigits > 0 ? `.${'0'.repeat(maxFractionDigits)}` : '')\n : undefined;\n\n // Our writes are properties (no reflected attributes), so they do not trigger\n // the MutationObserver; disconnecting around them is belt-and-suspenders.\n this.mutationObserver?.disconnect();\n for (const item of items) {\n // Recompute every reserver / spacer on every pass (do not gate on a value\n // being present), so stale state clears when rows change — e.g. when the\n // last degree row, the last unit, or the last source is removed.\n item.valueOptions = {\n ...item.valueOptions,\n spaceReserver: numericReserver,\n };\n item.setpointOptions = {\n ...item.setpointOptions,\n spaceReserver: numericReserver,\n };\n item.adviceOptions = {\n ...item.adviceOptions,\n spaceReserver: numericReserver,\n };\n item.unitOptions = {\n ...item.unitOptions,\n spaceReserver: longestUnit || undefined,\n };\n item.srcOptions = {\n ...item.srcOptions,\n spaceReserver: longestSrc || undefined,\n };\n item.hasDegreeSpacer = anyDegree && !item.hasDegree;\n item.showDebugOverlay = this.showDebugOverlay;\n }\n this.observeChildren();\n }\n\n private observeChildren(): void {\n if (!this.mutationObserver) {\n this.mutationObserver = new MutationObserver(() => this.align());\n }\n this.mutationObserver.observe(this, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: OBSERVED_ATTRIBUTES,\n });\n }\n\n private handleSlotChange = (): void => {\n this.align();\n this.observeChildren();\n };\n\n override render() {\n return html`\n <div class=\"list\" part=\"list\">\n <slot @slotchange=${this.handleSlotChange}></slot>\n </div>\n `;\n }\n\n static override styles = unsafeCSS(componentStyle);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-readout-list': ObcReadoutList;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,57 @@ const componentStyle = css`* {
|
|
|
12
12
|
width: 100%;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
+
/* Bridge the list-item's public colour custom properties onto the block's, so
|
|
16
|
+
consumers keep theming the value / setpoint / advice / hinted-zero colours via
|
|
17
|
+
\`--obc-readout-list-item-*\` even though they now render inside obc-readout-block. */
|
|
18
|
+
|
|
19
|
+
obc-readout-block {
|
|
20
|
+
--obc-readout-block-value-color: var(
|
|
21
|
+
--obc-readout-list-item-value-color,
|
|
22
|
+
var(--element-neutral-color)
|
|
23
|
+
);
|
|
24
|
+
--obc-readout-block-value-enhanced-color: var(
|
|
25
|
+
--obc-readout-list-item-value-enhanced-color,
|
|
26
|
+
var(--element-neutral-enhanced-color)
|
|
27
|
+
);
|
|
28
|
+
--obc-readout-block-setpoint-color: var(
|
|
29
|
+
--obc-readout-list-item-setpoint-color,
|
|
30
|
+
var(--element-neutral-color)
|
|
31
|
+
);
|
|
32
|
+
--obc-readout-block-setpoint-enhanced-color: var(
|
|
33
|
+
--obc-readout-list-item-setpoint-enhanced-color,
|
|
34
|
+
var(--instrument-enhanced-secondary-color)
|
|
35
|
+
);
|
|
36
|
+
--obc-readout-block-setpoint-touching-outline-color: var(
|
|
37
|
+
--obc-readout-list-item-setpoint-touching-outline-color,
|
|
38
|
+
var(--element-neutral-enhanced-color)
|
|
39
|
+
);
|
|
40
|
+
--obc-readout-block-setpoint-touching-color: var(
|
|
41
|
+
--obc-readout-list-item-setpoint-touching-color,
|
|
42
|
+
var(--base-blue-100)
|
|
43
|
+
);
|
|
44
|
+
--obc-readout-block-advice-color: var(
|
|
45
|
+
--obc-readout-list-item-advice-color,
|
|
46
|
+
var(--element-neutral-color)
|
|
47
|
+
);
|
|
48
|
+
--obc-readout-block-hinted-color: var(
|
|
49
|
+
--obc-readout-list-item-hinted-color,
|
|
50
|
+
var(--element-inactive-color)
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/* Size the consumer-provided block icons forwarded into obc-readout-block's
|
|
55
|
+
\`icon\` slot (the block sizes the forwarded slot element; this sizes the
|
|
56
|
+
consumer's icon to fill it). */
|
|
57
|
+
|
|
58
|
+
::slotted([slot="value-icon"]),
|
|
59
|
+
::slotted([slot="setpoint-icon"]),
|
|
60
|
+
::slotted([slot="advice-icon"]) {
|
|
61
|
+
display: block;
|
|
62
|
+
inline-size: 100%;
|
|
63
|
+
block-size: 100%;
|
|
64
|
+
}
|
|
65
|
+
|
|
15
66
|
/* ---------- Root / surface ----------
|
|
16
67
|
* \`.root\` is the touch target (a <button> when clickable, otherwise a <div>).
|
|
17
68
|
* \`.surface\` is the visible box that carries padding, corner radius, the
|
|
@@ -222,129 +273,10 @@ const componentStyle = css`* {
|
|
|
222
273
|
align-items: flex-end;
|
|
223
274
|
}
|
|
224
275
|
|
|
225
|
-
/*
|
|
226
|
-
|
|
227
|
-
.
|
|
228
|
-
|
|
229
|
-
align-items: flex-end;
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
/* Number + its (setpoint/advice) degree glyph, hugging with no gap — the
|
|
233
|
-
\`.block\` gap only separates the icon from this group. */
|
|
234
|
-
|
|
235
|
-
.block-content {
|
|
236
|
-
display: inline-flex;
|
|
237
|
-
align-items: flex-end;
|
|
238
|
-
}
|
|
239
|
-
|
|
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
|
-
}
|
|
252
|
-
|
|
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
|
-
}
|
|
260
|
-
|
|
261
|
-
.hinted-zero {
|
|
262
|
-
color: var(
|
|
263
|
-
--obc-readout-list-item-hinted-color,
|
|
264
|
-
var(--element-inactive-color)
|
|
265
|
-
);
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
/* ---------- Text colours (overridable via custom properties) ----------
|
|
269
|
-
* obc-textbox does not set its own colour, so it inherits these. */
|
|
270
|
-
|
|
271
|
-
.block-value {
|
|
272
|
-
color: var(--obc-readout-list-item-value-color, var(--element-neutral-color));
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
.block-value.tone-enhanced {
|
|
276
|
-
color: var(
|
|
277
|
-
--obc-readout-list-item-value-enhanced-color,
|
|
278
|
-
var(--element-neutral-enhanced-color)
|
|
279
|
-
);
|
|
280
|
-
}
|
|
281
|
-
|
|
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
|
-
}
|
|
297
|
-
|
|
298
|
-
.block-setpoint.tone-enhanced {
|
|
299
|
-
color: var(
|
|
300
|
-
--obc-readout-list-item-setpoint-enhanced-color,
|
|
301
|
-
var(--instrument-enhanced-secondary-color)
|
|
302
|
-
);
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
/* Pop-up: fade the setpoint out once value === setpoint, keeping its space so
|
|
306
|
-
the value stays column-aligned. */
|
|
307
|
-
|
|
308
|
-
.block-setpoint.is-hiding {
|
|
309
|
-
opacity: 0;
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
.block-setpoint.is-hidden {
|
|
313
|
-
opacity: 0;
|
|
314
|
-
visibility: hidden;
|
|
315
|
-
}
|
|
316
|
-
|
|
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
|
-
}
|
|
276
|
+
/* The readout building blocks (advice / setpoint / value) now render inside
|
|
277
|
+
\`obc-readout-block\`; their layout / colour / hinted-zero / data-quality CSS
|
|
278
|
+
lives there. The list-item only bridges the public colour vars (see top) and
|
|
279
|
+
keeps the surrounding row layout below. */
|
|
348
280
|
|
|
349
281
|
.label {
|
|
350
282
|
color: var(
|
|
@@ -364,26 +296,22 @@ const componentStyle = css`* {
|
|
|
364
296
|
);
|
|
365
297
|
}
|
|
366
298
|
|
|
367
|
-
/* ----------
|
|
299
|
+
/* ---------- Source data quality ----------
|
|
368
300
|
* Independent of (and nests inside) the row-level data-quality frame. Uses
|
|
369
|
-
* \`outline\` (not \`border\`) so the chip never shifts the
|
|
370
|
-
* value
|
|
301
|
+
* \`outline\` (not \`border\`) so the chip never shifts the source's width. (The
|
|
302
|
+
* per-block value/setpoint/advice chips live in \`obc-readout-block\`.) */
|
|
371
303
|
|
|
372
|
-
.block.data-low-integrity,
|
|
373
|
-
.block.data-invalid,
|
|
374
304
|
.source.data-low-integrity,
|
|
375
305
|
.source.data-invalid {
|
|
376
306
|
outline: 1px solid;
|
|
377
307
|
border-radius: var(--global-border-radius-border-radius-check);
|
|
378
308
|
}
|
|
379
309
|
|
|
380
|
-
.block.data-low-integrity,
|
|
381
310
|
.source.data-low-integrity {
|
|
382
311
|
background: var(--alert-low-integrity-background-color);
|
|
383
312
|
outline-color: var(--alert-low-integrity-border-color);
|
|
384
313
|
}
|
|
385
314
|
|
|
386
|
-
.block.data-invalid,
|
|
387
315
|
.source.data-invalid {
|
|
388
316
|
background: var(--alert-invalid-background-color);
|
|
389
317
|
outline-color: var(--alert-invalid-border-color);
|
|
@@ -525,11 +453,6 @@ const componentStyle = css`* {
|
|
|
525
453
|
);
|
|
526
454
|
}
|
|
527
455
|
|
|
528
|
-
.size-small .block {
|
|
529
|
-
gap: var(--instrument-components-readout-new-general-regular-icon-gap);
|
|
530
|
-
}
|
|
531
|
-
|
|
532
|
-
.size-small .block-icon,
|
|
533
456
|
.size-small .leading-icon {
|
|
534
457
|
inline-size: var(
|
|
535
458
|
--instrument-components-readout-new-general-regular-icon-size
|
|
@@ -566,11 +489,6 @@ const componentStyle = css`* {
|
|
|
566
489
|
);
|
|
567
490
|
}
|
|
568
491
|
|
|
569
|
-
.size-medium .block {
|
|
570
|
-
gap: var(--instrument-components-readout-new-general-medium-icon-gap);
|
|
571
|
-
}
|
|
572
|
-
|
|
573
|
-
.size-medium .block-icon,
|
|
574
492
|
.size-medium .leading-icon {
|
|
575
493
|
inline-size: var(
|
|
576
494
|
--instrument-components-readout-new-general-medium-icon-size
|
|
@@ -602,11 +520,6 @@ const componentStyle = css`* {
|
|
|
602
520
|
gap: var(--instrument-components-readout-new-list-item-large-value-gap);
|
|
603
521
|
}
|
|
604
522
|
|
|
605
|
-
.size-large .block {
|
|
606
|
-
gap: var(--instrument-components-readout-new-general-large-icon-gap);
|
|
607
|
-
}
|
|
608
|
-
|
|
609
|
-
.size-large .block-icon,
|
|
610
523
|
.size-large .leading-icon {
|
|
611
524
|
inline-size: var(--instrument-components-readout-new-general-large-icon-size);
|
|
612
525
|
block-size: var(--instrument-components-readout-new-general-large-icon-size);
|
|
@@ -651,6 +564,28 @@ const componentStyle = css`* {
|
|
|
651
564
|
);
|
|
652
565
|
--_obc-readout-list-item-data-border: var(--alert-invalid-border-color);
|
|
653
566
|
}
|
|
567
|
+
|
|
568
|
+
/* ---------- Debug overlay ----------
|
|
569
|
+
* \`showDebugOverlay\` outlines each readout building block (red), the degree
|
|
570
|
+
* columns (blue) and the degree spacer (green) so reserver widths / alignment
|
|
571
|
+
* are visible. A development aid (mirrors the donut chart's \`showDebugOverlay\`);
|
|
572
|
+
* off by default. */
|
|
573
|
+
|
|
574
|
+
:host([showDebugOverlay]) obc-readout-block::part(block) {
|
|
575
|
+
outline: 1px solid rgba(220, 0, 0, 0.7);
|
|
576
|
+
outline-offset: -1px;
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
:host([showDebugOverlay]) obc-readout-block::part(degree),
|
|
580
|
+
:host([showDebugOverlay]) .degree-column {
|
|
581
|
+
outline: 1px solid rgba(0, 0, 220, 0.7);
|
|
582
|
+
outline-offset: -1px;
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
:host([showDebugOverlay]) .degree-spacer {
|
|
586
|
+
outline: 1px solid rgba(0, 160, 0, 0.8);
|
|
587
|
+
outline-offset: -1px;
|
|
588
|
+
}
|
|
654
589
|
`;
|
|
655
590
|
export {
|
|
656
591
|
componentStyle as default
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readout-list-item.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"readout-list-item.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,21 +1,18 @@
|
|
|
1
1
|
import { LitElement } from 'lit';
|
|
2
2
|
import { ObcTextboxFontWeight } from '../../components/textbox/textbox.js';
|
|
3
|
+
import { ReadoutBlockSize, ReadoutBlockDataQuality } from '../../building-blocks/readout-block/readout-block.js';
|
|
3
4
|
import { AlertFrameConfig } from '../../components/alert-frame/alert-frame.js';
|
|
4
5
|
import '../../components/textbox/textbox.js';
|
|
5
|
-
import '../../
|
|
6
|
-
import '../../icons/icon-notification-advice.js';
|
|
6
|
+
import '../../building-blocks/readout-block/readout-block.js';
|
|
7
7
|
export { ObcTextboxFontWeight } from '../../components/textbox/textbox.js';
|
|
8
8
|
/**
|
|
9
|
-
* Density/size scale of the readout row.
|
|
9
|
+
* Density/size scale of the readout row (an alias of `ReadoutBlockSize`).
|
|
10
10
|
* - `small`: regular value typography (smallest, densest).
|
|
11
11
|
* - `medium`: medium value typography.
|
|
12
12
|
* - `large`: large value typography.
|
|
13
13
|
*/
|
|
14
|
-
export declare
|
|
15
|
-
|
|
16
|
-
medium = "medium",
|
|
17
|
-
large = "large"
|
|
18
|
-
}
|
|
14
|
+
export declare const ReadoutListItemSize: typeof ReadoutBlockSize;
|
|
15
|
+
export type ReadoutListItemSize = ReadoutBlockSize;
|
|
19
16
|
/**
|
|
20
17
|
* Placement of the unit/source relative to the label and value.
|
|
21
18
|
* - `trailing-unit`: unit after the value, source after a trailing divider.
|
|
@@ -37,13 +34,12 @@ export declare enum ReadoutListItemPriority {
|
|
|
37
34
|
enhanced = "enhanced"
|
|
38
35
|
}
|
|
39
36
|
/**
|
|
40
|
-
* Measurement quality of the value
|
|
41
|
-
* – a low-integrity or invalid value can
|
|
37
|
+
* Measurement quality of the value (an alias of `ReadoutBlockDataQuality`).
|
|
38
|
+
* Orthogonal to the row-level `alert` – a low-integrity or invalid value can
|
|
39
|
+
* also sit inside an alert frame.
|
|
42
40
|
*/
|
|
43
|
-
export declare
|
|
44
|
-
|
|
45
|
-
invalid = "invalid"
|
|
46
|
-
}
|
|
41
|
+
export declare const ReadoutListItemDataQuality: typeof ReadoutBlockDataQuality;
|
|
42
|
+
export type ReadoutListItemDataQuality = ReadoutBlockDataQuality;
|
|
47
43
|
/**
|
|
48
44
|
* Corner style of the interactive (clickable) surface.
|
|
49
45
|
* - `squared` (default): no rounding (true rectangle).
|
|
@@ -183,8 +179,10 @@ export declare class ObcReadoutListItem extends LitElement {
|
|
|
183
179
|
src?: string;
|
|
184
180
|
hasValue: boolean;
|
|
185
181
|
value: number | null;
|
|
186
|
-
/** Render the value as
|
|
182
|
+
/** Render the value as `offText` (e.g. equipment powered down). Affects the value only. */
|
|
187
183
|
off: boolean;
|
|
184
|
+
/** Text shown in place of the value when `off` is true. @availableWhen off==true */
|
|
185
|
+
offText: string;
|
|
188
186
|
hasSetpoint: boolean;
|
|
189
187
|
/** @availableWhen hasSetpoint==true */
|
|
190
188
|
setpoint?: number;
|
|
@@ -207,6 +205,12 @@ export declare class ObcReadoutListItem extends LitElement {
|
|
|
207
205
|
adviceOptions?: ReadoutAdviceOptions;
|
|
208
206
|
unitOptions?: ReadoutReserverOptions;
|
|
209
207
|
srcOptions?: ReadoutSrcOptions;
|
|
208
|
+
/**
|
|
209
|
+
* Development aid: outline the readout building blocks (red), the degree
|
|
210
|
+
* columns (blue) and the degree spacer (green) so reserver widths / alignment
|
|
211
|
+
* are visible. Off by default.
|
|
212
|
+
*/
|
|
213
|
+
showDebugOverlay: boolean;
|
|
210
214
|
/** Pop-up deferred-hide phase for the setpoint (see {@link updated}). */
|
|
211
215
|
private deferredSetpointHidePhase;
|
|
212
216
|
private deferredSetpointHideTimer?;
|
|
@@ -247,19 +251,14 @@ export declare class ObcReadoutListItem extends LitElement {
|
|
|
247
251
|
/** Setpoint is SemiBold only while emphasised, otherwise regular weight. */
|
|
248
252
|
private get setpointWeight();
|
|
249
253
|
private numericFormatOptions;
|
|
250
|
-
/** Widest possible value string for width reservation (e.g. `"000.0"`). */
|
|
251
|
-
private get reserverText();
|
|
252
|
-
/**
|
|
253
|
-
* Effective width reserver for a numeric block: the wider of the explicit
|
|
254
|
-
* `spaceReserver` and the `maxDigits`/`fractionDigits`-derived reserve, so an
|
|
255
|
-
* explicit reserver can never reserve *less* than the formatted value needs.
|
|
256
|
-
* Under tabular-nums the rendered width is proportional to character count, so
|
|
257
|
-
* "wider" compares string length.
|
|
258
|
-
*/
|
|
259
|
-
private widerReserver;
|
|
260
254
|
/** classMap fragment for a block / source carrying per-block data quality. */
|
|
261
255
|
private dataQualityClasses;
|
|
262
|
-
|
|
256
|
+
/**
|
|
257
|
+
* Forward the matching list-item icon slot into the block's single `icon`
|
|
258
|
+
* slot. The variant's default marker lives in `obc-readout-block` and shows
|
|
259
|
+
* when nothing is assigned here (an empty forwarded slot flattens to nothing).
|
|
260
|
+
*/
|
|
261
|
+
private renderForwardedIcon;
|
|
263
262
|
private renderBlock;
|
|
264
263
|
/**
|
|
265
264
|
* A cap-height `°` column whose width scales with the value size. Used after
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readout-list-item.d.ts","sourceRoot":"","sources":["../../../src/navigation-instruments/readout-list-item/readout-list-item.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAgD,MAAM,KAAK,CAAC;AAK9E,OAAO,qCAAqC,CAAC;AAC7C,OAAO,EAEL,oBAAoB,EACrB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,
|
|
1
|
+
{"version":3,"file":"readout-list-item.d.ts","sourceRoot":"","sources":["../../../src/navigation-instruments/readout-list-item/readout-list-item.ts"],"names":[],"mappings":"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"}
|