@oicl/openbridge-webcomponents 2.0.0-next.155 → 2.0.0-next.156

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 (43) hide show
  1. package/LICENSE-AGPL.txt +661 -0
  2. package/LICENSE-APACHE.txt +177 -0
  3. package/LICENSE.txt +35 -0
  4. package/bundle/openbridge-webcomponents.bundle.js +3500 -3275
  5. package/bundle/openbridge-webcomponents.bundle.js.map +1 -1
  6. package/custom-elements.json +233 -39
  7. package/dist/automation/transmitter/transmitter-shared.d.ts +11 -0
  8. package/dist/automation/transmitter/transmitter-shared.d.ts.map +1 -0
  9. package/dist/automation/transmitter/transmitter-shared.js +16 -0
  10. package/dist/automation/transmitter/transmitter-shared.js.map +1 -0
  11. package/dist/automation/transmitter/transmitter.css.js +12 -1
  12. package/dist/automation/transmitter/transmitter.css.js.map +1 -1
  13. package/dist/automation/transmitter/transmitter.d.ts +9 -10
  14. package/dist/automation/transmitter/transmitter.d.ts.map +1 -1
  15. package/dist/automation/transmitter/transmitter.js +12 -15
  16. package/dist/automation/transmitter/transmitter.js.map +1 -1
  17. package/dist/automation/transmitter-button/transmitter-button.css.js +18 -42
  18. package/dist/automation/transmitter-button/transmitter-button.css.js.map +1 -1
  19. package/dist/automation/transmitter-button/transmitter-button.d.ts +31 -21
  20. package/dist/automation/transmitter-button/transmitter-button.d.ts.map +1 -1
  21. package/dist/automation/transmitter-button/transmitter-button.js +37 -39
  22. package/dist/automation/transmitter-button/transmitter-button.js.map +1 -1
  23. package/dist/automation/transmitter-stack/transmitter-stack.css.js +144 -0
  24. package/dist/automation/transmitter-stack/transmitter-stack.css.js.map +1 -0
  25. package/dist/automation/transmitter-stack/transmitter-stack.d.ts +93 -0
  26. package/dist/automation/transmitter-stack/transmitter-stack.d.ts.map +1 -0
  27. package/dist/automation/transmitter-stack/transmitter-stack.js +97 -0
  28. package/dist/automation/transmitter-stack/transmitter-stack.js.map +1 -0
  29. package/dist/building-blocks/readout-block/readout-block.d.ts +1 -1
  30. package/dist/building-blocks/readout-block/readout-block.js.map +1 -1
  31. package/dist/components/textarea-field/textarea-field.css.js +0 -2
  32. package/dist/components/textarea-field/textarea-field.css.js.map +1 -1
  33. package/dist/components/textbox/textbox.d.ts +1 -1
  34. package/dist/components/textbox/textbox.js.map +1 -1
  35. package/dist/navigation-instruments/readout/readout.d.ts +1 -1
  36. package/dist/navigation-instruments/readout/readout.js.map +1 -1
  37. package/dist/navigation-instruments/readout-list-item/readout-list-item.css.js +1 -0
  38. package/dist/navigation-instruments/readout-list-item/readout-list-item.css.js.map +1 -1
  39. package/dist/navigation-instruments/readout-list-item/readout-list-item.d.ts +1 -1
  40. package/dist/navigation-instruments/readout-list-item/readout-list-item.d.ts.map +1 -1
  41. package/dist/navigation-instruments/readout-list-item/readout-list-item.js +3 -0
  42. package/dist/navigation-instruments/readout-list-item/readout-list-item.js.map +1 -1
  43. package/package.json +6 -3
@@ -0,0 +1,93 @@
1
+ import { LitElement, nothing } from 'lit';
2
+ import { LineType } from '../index.js';
3
+ import { TransmitterOrientation } from '../transmitter/transmitter-shared.js';
4
+ import '../transmitter-button/transmitter-button.js';
5
+ /** One reading of a transmitter stack. */
6
+ export interface TransmitterStackValue {
7
+ /** The reading; `null` or `NaN` renders the unavailable dash. */
8
+ value: number | null;
9
+ unit?: string;
10
+ /** Identifier shown under the segment (above it for `top`) and read as part of its name. */
11
+ idTag?: string;
12
+ /** Decimal precision; `1` when the key is omitted. */
13
+ fractionDigits?: number;
14
+ /** Integer digits to reserve; `0` when the key is omitted. */
15
+ maxDigits?: number;
16
+ hintedZeros?: boolean;
17
+ hasSignSpacer?: boolean;
18
+ /** Show a degree column between the value and the unit (e.g. `12.3°` then `C`). */
19
+ hasDegree?: boolean;
20
+ /**
21
+ * Name of the light-DOM slot projected as this segment's icon. Unique within
22
+ * the stack: an element is projected once, so a repeated name leaves later
23
+ * segments with an empty icon.
24
+ */
25
+ iconSlotName?: string;
26
+ }
27
+ export interface TransmitterStackValueClickDetail {
28
+ index: number;
29
+ value: TransmitterStackValue;
30
+ }
31
+ /**
32
+ * `<obc-transmitter-stack>` – Several transmitter readings side by side in one
33
+ * joined chip, attached to a line by a single leader line.
34
+ *
35
+ * Each entry of `values` renders an `<obc-transmitter-button>` segment with its
36
+ * own icon, value, unit and id tag. The segments take equal widths, set by the
37
+ * widest reading, and share their borders. Positioning and the leader line
38
+ * follow `<obc-transmitter>`.
39
+ *
40
+ * ### Features / Variants
41
+ * - **`orientation`** – `top`, `right`, `bottom`, `left`; the edge the leader
42
+ * line attaches to. `top` places the id tags above the chip.
43
+ * - **Values** – `value` and `unit` per segment. `idTag` adds a label row under
44
+ * every segment once any value has one, so the chip stays aligned.
45
+ * - **Formatting** – per value `fractionDigits` (default `1`), `maxDigits`
46
+ * (default `0`), `hintedZeros`, `hasSignSpacer` and `hasDegree`, formatted like
47
+ * `<obc-transmitter-button>`. An omitted key takes its default; a key set to
48
+ * `null`, `undefined` or `NaN` renders the reading as the unavailable dash.
49
+ * - **Icons** – `iconSlotName` projects the light-DOM element with that slot
50
+ * name as the segment's icon; names must be unique within the stack. The
51
+ * name is chosen per value, so it carries no `@slot` tag (the wrapper
52
+ * generator needs literal names).
53
+ * - **Accessible name** – each segment is a native button named by its
54
+ * reading, unit and `idTag`; the visible tag is hidden from assistive
55
+ * technology so it is not read twice.
56
+ * - **Empty** – with no `values` nothing renders, leader line included.
57
+ *
58
+ * ### Usage Guidelines
59
+ * Use when one source reports several readings that share one leader line. For
60
+ * a single reading, a tag pill or a trend graph, use `<obc-transmitter>`. Each
61
+ * segment's hit area is `<obc-transmitter-button>`'s chip (24 px high), below
62
+ * the 48 px touch-target token; see its design note.
63
+ *
64
+ * ### Slots
65
+ * | Slot Name | Conditions | Purpose |
66
+ * |------------------|---------------------------------|-------------------------------|
67
+ * | `<iconSlotName>` | a value declares `iconSlotName` | Icon in that value's segment. |
68
+ *
69
+ * @property orientation - Edge of the chip the leader line attaches to.
70
+ * @property lineType - Line the transmitter sits on; offsets the leader line by half its stroke.
71
+ * @property values - One segment per entry, in order.
72
+ * @fires {CustomEvent<TransmitterStackValueClickDetail>} value-click - Fired when a segment is activated, with its value and index.
73
+ * @fires click - Fired when any segment is clicked; `value-click` tells which.
74
+ * @experimental
75
+ */
76
+ export declare class ObcTransmitterStack extends LitElement {
77
+ /** Edge of the chip the leader line attaches to. */
78
+ orientation: TransmitterOrientation;
79
+ /** Line the transmitter sits on; offsets the leader line by half its stroke. */
80
+ lineType: LineType | undefined;
81
+ /** One segment per entry, in order. */
82
+ values: TransmitterStackValue[];
83
+ private handleValueClick;
84
+ private renderValue;
85
+ render(): import('lit-html').TemplateResult<1> | typeof nothing;
86
+ static styles: import('lit').CSSResult;
87
+ }
88
+ declare global {
89
+ interface HTMLElementTagNameMap {
90
+ 'obc-transmitter-stack': ObcTransmitterStack;
91
+ }
92
+ }
93
+ //# sourceMappingURL=transmitter-stack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transmitter-stack.d.ts","sourceRoot":"","sources":["../../../src/automation/transmitter-stack/transmitter-stack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAQ,OAAO,EAAY,MAAM,KAAK,CAAC;AAKzD,OAAO,EAAC,QAAQ,EAAC,MAAM,aAAa,CAAC;AACrC,OAAO,EACL,sBAAsB,EAEvB,MAAM,sCAAsC,CAAC;AAE9C,OAAO,6CAA6C,CAAC;AAErD,0CAA0C;AAC1C,MAAM,WAAW,qBAAqB;IACpC,iEAAiE;IACjE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4FAA4F;IAC5F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mFAAmF;IACnF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gCAAgC;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,qBAAqB,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,qBACa,mBAAoB,SAAQ,UAAU;IACvB,WAAW,EAAE,sBAAsB,CAC7B;IACN,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAa;IAC5C,MAAM,EAAE,qBAAqB,EAAE,CAAM;IAE9D,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,WAAW;IAuCV,MAAM;IAsBf,OAAgB,MAAM,0BAA6B;CACpD;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,uBAAuB,EAAE,mBAAmB,CAAC;KAC9C;CACF"}
@@ -0,0 +1,97 @@
1
+ import { unsafeCSS, LitElement, nothing, html } from "lit";
2
+ import { property } from "lit/decorators.js";
3
+ import { classMap } from "lit/directives/class-map.js";
4
+ import componentStyle from "./transmitter-stack.css.js";
5
+ import { customElement } from "../../decorator.js";
6
+ import { TransmitterOrientation, transmitterLeaderOffset } from "../transmitter/transmitter-shared.js";
7
+ import { TransmitterButtonVariant } from "../transmitter-button/transmitter-button.js";
8
+ var __defProp = Object.defineProperty;
9
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
10
+ var __decorateClass = (decorators, target, key, kind) => {
11
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
12
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
13
+ if (decorator = decorators[i])
14
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
15
+ if (kind && result) __defProp(target, key, result);
16
+ return result;
17
+ };
18
+ let ObcTransmitterStack = class extends LitElement {
19
+ constructor() {
20
+ super(...arguments);
21
+ this.orientation = TransmitterOrientation.bottom;
22
+ this.lineType = void 0;
23
+ this.values = [];
24
+ }
25
+ handleValueClick(index, value) {
26
+ this.dispatchEvent(
27
+ new CustomEvent("value-click", {
28
+ detail: { index, value },
29
+ bubbles: true,
30
+ composed: true
31
+ })
32
+ );
33
+ }
34
+ renderValue(entry, index, hasIdTags) {
35
+ return html`
36
+ <div class="cell" part="cell">
37
+ <obc-transmitter-button
38
+ class="segment"
39
+ .variant=${TransmitterButtonVariant.value}
40
+ .value=${entry.value}
41
+ .unit=${entry.unit ?? ""}
42
+ .fractionDigits=${"fractionDigits" in entry ? entry.fractionDigits ?? NaN : 1}
43
+ .maxDigits=${"maxDigits" in entry ? entry.maxDigits ?? NaN : 0}
44
+ .hintedZeros=${entry.hintedZeros ?? false}
45
+ .hasSignSpacer=${entry.hasSignSpacer ?? false}
46
+ .hasDegree=${entry.hasDegree ?? false}
47
+ .hasIcon=${Boolean(entry.iconSlotName)}
48
+ .idTag=${entry.idTag ?? ""}
49
+ @click=${() => this.handleValueClick(index, entry)}
50
+ >
51
+ ${entry.iconSlotName ? html`<slot name=${entry.iconSlotName} slot="icon"></slot>` : nothing}
52
+ </obc-transmitter-button>
53
+ ${hasIdTags ? html`<div class="id-tag" aria-hidden="true">
54
+ ${entry.idTag ?? ""}
55
+ </div>` : nothing}
56
+ </div>
57
+ `;
58
+ }
59
+ render() {
60
+ if (this.values.length === 0) {
61
+ return nothing;
62
+ }
63
+ const hasIdTags = this.values.some((entry) => Boolean(entry.idTag));
64
+ return html`
65
+ <div
66
+ class=${classMap({
67
+ transmitter: true,
68
+ [`orientation-${this.orientation}`]: true
69
+ })}
70
+ style="--offset: ${transmitterLeaderOffset(this.lineType)}px;"
71
+ >
72
+ <div class="values" part="values">
73
+ ${this.values.map(
74
+ (entry, index) => this.renderValue(entry, index, hasIdTags)
75
+ )}
76
+ </div>
77
+ </div>
78
+ `;
79
+ }
80
+ };
81
+ ObcTransmitterStack.styles = unsafeCSS(componentStyle);
82
+ __decorateClass([
83
+ property({ type: String })
84
+ ], ObcTransmitterStack.prototype, "orientation", 2);
85
+ __decorateClass([
86
+ property({ type: String })
87
+ ], ObcTransmitterStack.prototype, "lineType", 2);
88
+ __decorateClass([
89
+ property({ type: Array })
90
+ ], ObcTransmitterStack.prototype, "values", 2);
91
+ ObcTransmitterStack = __decorateClass([
92
+ customElement("obc-transmitter-stack")
93
+ ], ObcTransmitterStack);
94
+ export {
95
+ ObcTransmitterStack
96
+ };
97
+ //# sourceMappingURL=transmitter-stack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transmitter-stack.js","sources":["../../../src/automation/transmitter-stack/transmitter-stack.ts"],"sourcesContent":["import {LitElement, html, nothing, unsafeCSS} from 'lit';\nimport {property} from 'lit/decorators.js';\nimport {classMap} from 'lit/directives/class-map.js';\nimport componentStyle from './transmitter-stack.css?inline';\nimport {customElement} from '../../decorator.js';\nimport {LineType} from '../index.js';\nimport {\n TransmitterOrientation,\n transmitterLeaderOffset,\n} from '../transmitter/transmitter-shared.js';\nimport {TransmitterButtonVariant} from '../transmitter-button/transmitter-button.js';\nimport '../transmitter-button/transmitter-button.js';\n\n/** One reading of a transmitter stack. */\nexport interface TransmitterStackValue {\n /** The reading; `null` or `NaN` renders the unavailable dash. */\n value: number | null;\n unit?: string;\n /** Identifier shown under the segment (above it for `top`) and read as part of its name. */\n idTag?: string;\n /** Decimal precision; `1` when the key is omitted. */\n fractionDigits?: number;\n /** Integer digits to reserve; `0` when the key is omitted. */\n maxDigits?: number;\n hintedZeros?: boolean;\n hasSignSpacer?: boolean;\n /** Show a degree column between the value and the unit (e.g. `12.3°` then `C`). */\n hasDegree?: boolean;\n /**\n * Name of the light-DOM slot projected as this segment's icon. Unique within\n * the stack: an element is projected once, so a repeated name leaves later\n * segments with an empty icon.\n */\n iconSlotName?: string;\n}\n\nexport interface TransmitterStackValueClickDetail {\n index: number;\n value: TransmitterStackValue;\n}\n\n/**\n * `<obc-transmitter-stack>` – Several transmitter readings side by side in one\n * joined chip, attached to a line by a single leader line.\n *\n * Each entry of `values` renders an `<obc-transmitter-button>` segment with its\n * own icon, value, unit and id tag. The segments take equal widths, set by the\n * widest reading, and share their borders. Positioning and the leader line\n * follow `<obc-transmitter>`.\n *\n * ### Features / Variants\n * - **`orientation`** – `top`, `right`, `bottom`, `left`; the edge the leader\n * line attaches to. `top` places the id tags above the chip.\n * - **Values** – `value` and `unit` per segment. `idTag` adds a label row under\n * every segment once any value has one, so the chip stays aligned.\n * - **Formatting** – per value `fractionDigits` (default `1`), `maxDigits`\n * (default `0`), `hintedZeros`, `hasSignSpacer` and `hasDegree`, formatted like\n * `<obc-transmitter-button>`. An omitted key takes its default; a key set to\n * `null`, `undefined` or `NaN` renders the reading as the unavailable dash.\n * - **Icons** – `iconSlotName` projects the light-DOM element with that slot\n * name as the segment's icon; names must be unique within the stack. The\n * name is chosen per value, so it carries no `@slot` tag (the wrapper\n * generator needs literal names).\n * - **Accessible name** – each segment is a native button named by its\n * reading, unit and `idTag`; the visible tag is hidden from assistive\n * technology so it is not read twice.\n * - **Empty** – with no `values` nothing renders, leader line included.\n *\n * ### Usage Guidelines\n * Use when one source reports several readings that share one leader line. For\n * a single reading, a tag pill or a trend graph, use `<obc-transmitter>`. Each\n * segment's hit area is `<obc-transmitter-button>`'s chip (24 px high), below\n * the 48 px touch-target token; see its design note.\n *\n * ### Slots\n * | Slot Name | Conditions | Purpose |\n * |------------------|---------------------------------|-------------------------------|\n * | `<iconSlotName>` | a value declares `iconSlotName` | Icon in that value's segment. |\n *\n * @property orientation - Edge of the chip the leader line attaches to.\n * @property lineType - Line the transmitter sits on; offsets the leader line by half its stroke.\n * @property values - One segment per entry, in order.\n * @fires {CustomEvent<TransmitterStackValueClickDetail>} value-click - Fired when a segment is activated, with its value and index.\n * @fires click - Fired when any segment is clicked; `value-click` tells which.\n * @experimental\n */\n@customElement('obc-transmitter-stack')\nexport class ObcTransmitterStack extends LitElement {\n @property({type: String}) orientation: TransmitterOrientation =\n TransmitterOrientation.bottom;\n @property({type: String}) lineType: LineType | undefined = undefined;\n @property({type: Array}) values: TransmitterStackValue[] = [];\n\n private handleValueClick(index: number, value: TransmitterStackValue): void {\n this.dispatchEvent(\n new CustomEvent<TransmitterStackValueClickDetail>('value-click', {\n detail: {index, value},\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private renderValue(\n entry: TransmitterStackValue,\n index: number,\n hasIdTags: boolean\n ) {\n // `in`, not `??` alone: a key that is present but empty is a failed\n // runtime write and must reach the block as missing (NaN renders the dash,\n // readout-components.md § 2).\n return html`\n <div class=\"cell\" part=\"cell\">\n <obc-transmitter-button\n class=\"segment\"\n .variant=${TransmitterButtonVariant.value}\n .value=${entry.value}\n .unit=${entry.unit ?? ''}\n .fractionDigits=${'fractionDigits' in entry\n ? (entry.fractionDigits ?? NaN)\n : 1}\n .maxDigits=${'maxDigits' in entry ? (entry.maxDigits ?? NaN) : 0}\n .hintedZeros=${entry.hintedZeros ?? false}\n .hasSignSpacer=${entry.hasSignSpacer ?? false}\n .hasDegree=${entry.hasDegree ?? false}\n .hasIcon=${Boolean(entry.iconSlotName)}\n .idTag=${entry.idTag ?? ''}\n @click=${() => this.handleValueClick(index, entry)}\n >\n ${entry.iconSlotName\n ? html`<slot name=${entry.iconSlotName} slot=\"icon\"></slot>`\n : nothing}\n </obc-transmitter-button>\n ${hasIdTags\n ? html`<div class=\"id-tag\" aria-hidden=\"true\">\n ${entry.idTag ?? ''}\n </div>`\n : nothing}\n </div>\n `;\n }\n\n override render() {\n if (this.values.length === 0) {\n return nothing;\n }\n const hasIdTags = this.values.some((entry) => Boolean(entry.idTag));\n return html`\n <div\n class=${classMap({\n transmitter: true,\n [`orientation-${this.orientation}`]: true,\n })}\n style=\"--offset: ${transmitterLeaderOffset(this.lineType)}px;\"\n >\n <div class=\"values\" part=\"values\">\n ${this.values.map((entry, index) =>\n this.renderValue(entry, index, hasIdTags)\n )}\n </div>\n </div>\n `;\n }\n\n static override styles = unsafeCSS(componentStyle);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-transmitter-stack': ObcTransmitterStack;\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAuFO,IAAM,sBAAN,cAAkC,WAAW;AAAA,EAA7C,cAAA;AAAA,UAAA,GAAA,SAAA;AACqB,SAAA,cACxB,uBAAuB;AACC,SAAA,WAAiC;AAClC,SAAA,SAAkC,CAAA;AAAA,EAAC;AAAA,EAEpD,iBAAiB,OAAe,OAAoC;AAC1E,SAAK;AAAA,MACH,IAAI,YAA8C,eAAe;AAAA,QAC/D,QAAQ,EAAC,OAAO,MAAA;AAAA,QAChB,SAAS;AAAA,QACT,UAAU;AAAA,MAAA,CACX;AAAA,IAAA;AAAA,EAEL;AAAA,EAEQ,YACN,OACA,OACA,WACA;AAIA,WAAO;AAAA;AAAA;AAAA;AAAA,qBAIU,yBAAyB,KAAK;AAAA,mBAChC,MAAM,KAAK;AAAA,kBACZ,MAAM,QAAQ,EAAE;AAAA,4BACN,oBAAoB,QACjC,MAAM,kBAAkB,MACzB,CAAC;AAAA,uBACQ,eAAe,QAAS,MAAM,aAAa,MAAO,CAAC;AAAA,yBACjD,MAAM,eAAe,KAAK;AAAA,2BACxB,MAAM,iBAAiB,KAAK;AAAA,uBAChC,MAAM,aAAa,KAAK;AAAA,qBAC1B,QAAQ,MAAM,YAAY,CAAC;AAAA,mBAC7B,MAAM,SAAS,EAAE;AAAA,mBACjB,MAAM,KAAK,iBAAiB,OAAO,KAAK,CAAC;AAAA;AAAA,YAEhD,MAAM,eACJ,kBAAkB,MAAM,YAAY,yBACpC,OAAO;AAAA;AAAA,UAEX,YACE;AAAA,gBACI,MAAM,SAAS,EAAE;AAAA,sBAErB,OAAO;AAAA;AAAA;AAAA,EAGjB;AAAA,EAES,SAAS;AAChB,QAAI,KAAK,OAAO,WAAW,GAAG;AAC5B,aAAO;AAAA,IACT;AACA,UAAM,YAAY,KAAK,OAAO,KAAK,CAAC,UAAU,QAAQ,MAAM,KAAK,CAAC;AAClE,WAAO;AAAA;AAAA,gBAEK,SAAS;AAAA,MACf,aAAa;AAAA,MACb,CAAC,eAAe,KAAK,WAAW,EAAE,GAAG;AAAA,IAAA,CACtC,CAAC;AAAA,2BACiB,wBAAwB,KAAK,QAAQ,CAAC;AAAA;AAAA;AAAA,YAGrD,KAAK,OAAO;AAAA,MAAI,CAAC,OAAO,UACxB,KAAK,YAAY,OAAO,OAAO,SAAS;AAAA,IAAA,CACzC;AAAA;AAAA;AAAA;AAAA,EAIT;AAGF;AA9Ea,oBA6EK,SAAS,UAAU,cAAc;AA5EvB,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GADb,oBACe,WAAA,eAAA,CAAA;AAEA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAHb,oBAGe,WAAA,YAAA,CAAA;AACD,gBAAA;AAAA,EAAxB,SAAS,EAAC,MAAM,MAAA,CAAM;AAAA,GAJZ,oBAIc,WAAA,UAAA,CAAA;AAJd,sBAAN,gBAAA;AAAA,EADN,cAAc,uBAAuB;AAAA,GACzB,mBAAA;"}
@@ -166,7 +166,7 @@ export declare enum ReadoutBlockHidePhase {
166
166
  * @csspart block-text - The `obc-textbox` rendering the number.
167
167
  * @csspart block-icon - The leading marker-icon container.
168
168
  * @csspart degree - The trailing degree-glyph column.
169
- * @beta
169
+ * @stable
170
170
  */
171
171
  export declare class ObcReadoutBlock extends LitElement {
172
172
  /** Semantic variant (value / setpoint / advice). */
@@ -1 +1 @@
1
- {"version":3,"file":"readout-block.js","sources":["../../../src/building-blocks/readout-block/readout-block.ts"],"sourcesContent":["import {LitElement, html, nothing, unsafeCSS, type TemplateResult} from 'lit';\nimport {property, state} from 'lit/decorators.js';\nimport {classMap} from 'lit/directives/class-map.js';\nimport componentStyle from './readout-block.css?inline';\nimport {customElement} from '../../decorator.js';\nimport '../../components/textbox/textbox.js';\nimport {\n ObcTextboxSize,\n ObcTextboxFontWeight,\n ObcTextboxAlignment,\n} from '../../components/textbox/textbox.js';\nimport '../../icons/icon-input-right.js';\nimport '../../icons/icon-notification-advice.js';\nimport '../../icons/icon-notification-advice-active.js';\nimport '../../icons/icon-caution-google.js';\nimport '../../icons/icon-caution-color-iec.js';\nimport '../../icons/icon-warning-unacknowledged-outlined.js';\nimport '../../icons/icon-warning-unacknowledged-iec.js';\nimport '../../icons/icon-alarm.js';\nimport '../../icons/icon-alarm-unacknowledged-iec.js';\nimport '../../icons/icon-running.js';\nimport '../../icons/icon-running-color-iec.js';\nimport {\n formatNumericValue,\n splitHintedValue,\n assertReadoutValueType,\n assertReadoutFractionDigits,\n isReadoutDigitCountMissing,\n resolveReadoutDigitCount,\n resolveReadoutNumericValue,\n resolveReadoutTextValue,\n READOUT_UNAVAILABLE_DASH,\n ReadoutValueType,\n type ReadoutNumericFormatOptions,\n} from '../../navigation-instruments/readout/readout-formatters.js';\nimport {\n type AlertFrameConfig,\n wrapWithAlertFrame,\n} from '../../components/alert-frame/alert-frame.js';\n\n// Re-exported so consumers can configure typography without a second import path.\nexport {\n ObcTextboxSize,\n ObcTextboxFontWeight,\n ObcTextboxAlignment,\n} from '../../components/textbox/textbox.js';\nexport {ReadoutValueType} from '../../navigation-instruments/readout/readout-formatters.js';\n\n/**\n * Semantic variant of the block. Drives the default marker icon and the\n * colour token; the layout is identical across variants.\n * - `value`: the primary reading (no default marker icon).\n * - `setpoint`: a setpoint reference (default `input-right` marker).\n * - `advice`: an advisory reference (default `notification-advice` marker).\n */\nexport enum ReadoutBlockVariant {\n value = 'value',\n setpoint = 'setpoint',\n advice = 'advice',\n}\n\n/**\n * Density tier of the block — drives icon size, the icon↔number gap, and the\n * degree-column width tier. The number typography size is controlled\n * independently via {@link ObcReadoutBlock.valueSize} so a parent can de-emphasise\n * one block relative to another within the same tier.\n */\nexport enum ReadoutBlockSize {\n small = 'small',\n medium = 'medium',\n large = 'large',\n}\n\n/**\n * Per-block measurement quality, rendered as a non-shifting outline chip.\n * - `low-integrity`: the value is suspect.\n * - `invalid`: the value is invalid.\n */\nexport enum ReadoutBlockDataQuality {\n lowIntegrity = 'low-integrity',\n invalid = 'invalid',\n}\n\n/**\n * Semantic category of an advice block (Figma 6.1 \"Readout-block-advice\"\n * Value axis). Drives the default marker icon and — while {@link\n * ObcReadoutBlock.active} — the triggered styling:\n * - `regular` / `optimal` / `eco`: the advice diamond; triggered renders the\n * filled diamond (tinted enhanced-blue / mint for optimal / eco) and a\n * SemiBold number.\n * - `caution` / `warning` / `alarm` / `running`: the matching neutral outline\n * icon; triggered swaps in the filled IEC status icon and the active text\n * colour.\n *\n * TODO(designer): the optimal / eco triggered tint covers the whole diamond\n * glyph — the Figma icon tints only the inner plus, which needs a two-tone\n * icon asset; and the advice \"Enhanced\" state (indent background chip) is not\n * implemented yet. Both flagged as \"may change\" in the 6.1 review.\n */\nexport enum ReadoutAdviceCategory {\n regular = 'regular',\n optimal = 'optimal',\n eco = 'eco',\n caution = 'caution',\n warning = 'warning',\n alarm = 'alarm',\n running = 'running',\n}\n\n/**\n * Pop-up fade phase for a setpoint block. Driven by the parent's setpoint\n * interaction state machine; only meaningful for `role=\"setpoint\"`.\n */\nexport enum ReadoutBlockHidePhase {\n none = 'none',\n hiding = 'hiding',\n hidden = 'hidden',\n}\n\n/**\n * `<obc-readout-block>` – the most atomic readout primitive: a single\n * cap-height-aligned, width-reservable numeric segment (value / setpoint /\n * advice).\n *\n * It renders one `obc-textbox` number with optional hinted leading zeros, a\n * reservable width, an optional leading marker icon (via the `icon` slot or the\n * role default), an optional trailing degree glyph, an `off`/unavailable text\n * state, per-block data-quality and an optional per-block alert frame.\n *\n * Setting `valueType` to `text` renders `value` verbatim (e.g.\n * `\"Auto\"`) instead of a formatted number.\n *\n * This is a building block used inside `obc-readout-list-item` (and, in a future\n * refactor, inside `obc-readout`); it is not normally used on its own. Colour is\n * inherited from the host context (the parent sets the role colour), so the\n * block stays neutral until placed.\n *\n * @property variant - Semantic variant (value / setpoint / advice).\n * @property value - The value; `null`/`undefined` renders a dash. A number by default, or text when\n * `valueType` is `text`.\n * @property valueType - How `value` is interpreted. `number` (default) formats it via\n * `fractionDigits`; `text` renders it verbatim and ignores the numeric\n * format options. Passing text while this is `number` throws.\n * @property size - Density tier — icon size, gap, degree tier.\n * @property valueSize - Resolved number-typography size. When unset it is derived from `size`\n * (small→s, medium→m, large→l), so a parent that de-emphasises a block (e.g.\n * a secondary setpoint) can pass a smaller size without changing the tier.\n * @property enhanced - Accent (in-command) colour tone.\n * @property weight - Number font weight (regular / semibold / bold); colour is independent.\n * @property hasDegree - Render the trailing cap-height degree glyph (`°`).\n * @property hasIcon - Show the leading marker-icon container (always on for setpoint/advice).\n * @property fractionDigits - Number of fraction digits. Must be between 0 and 100 — the range\n * `Number.prototype.toFixed` accepts; outside it throws a `RangeError`.\n * A fractional count truncates (`2.7` → `2`). A count that never arrived\n * (`NaN`, `null` or unset) renders the reading as the unavailable dash —\n * formatting with a precision the author never chose would let a critical\n * `0.4` pass for a healthy `0`.\n * @availableWhen fractionDigits valueType==number\n * @property maxDigits - Integer digits to reserve / hint (independent of `fractionDigits`).\n * Bounded before use: a fractional count\n * truncates (`2.7` → `2`), anything above 100 — including `Infinity` —\n * caps at 100, and a negative count reserves nothing. A count that never\n * arrived (`NaN`, `null` or unset) renders the reading as the unavailable\n * dash, consistent with `fractionDigits`.\n * @availableWhen maxDigits valueType==number\n * @property hintedZeros - Render muted leading zeros filling the integer part to `maxDigits`.\n * A negative value keeps them all — the sign is prepended and never consumes\n * a zero (`maxDigits` 3: `12.3` → `012.3`, `-12.3` → `-012.3`) — so a\n * negative reading is one character wider than a positive one unless\n * `hasSignSpacer` reserves the sign column. An unavailable value renders\n * dashes across the whole reserved width (`‒‒‒.‒`) instead of the short\n * placeholder.\n * @availableWhen hintedZeros valueType==number\n * @property hasSignSpacer - Reserve a minus-sign column ahead of the digits: an invisible sign\n * placeholder holds the column open while the value is non-negative and the\n * real sign fills it when negative, so the width does not change across\n * zero. Enable it on readouts whose value can go negative; all-positive\n * readouts reserve nothing.\n * @availableWhen hasSignSpacer valueType==number\n * @property spaceReserver - Explicit longest string to reserve width for (e.g. `\"0000.0\"`).\n * Combined with the `maxDigits`-derived reserve by taking whichever is\n * wider, so it can never reserve less than the formatted value needs.\n * @property off - Render `offText` instead of a number (e.g. equipment powered down).\n * @property offText - Text shown when `off` is true.\n * @property alignment - Text alignment of the number within its reserved width.\n * @property active - The advice is triggered: the marker swaps to its filled/status icon and\n * the number takes the category's triggered styling (SemiBold for\n * regular/optimal/eco, active text colour for the alert categories). Only\n * meaningful for `variant=\"advice\"`.\n * @availableWhen active variant==advice\n * @property dataQuality - Per-block measurement quality (outline chip).\n * @property alert - Per-block alert frame; nests inside any parent alert frame.\n * @property touching - Setpoint focus (touch) state — only meaningful for `role=\"setpoint\"`.\n * @property hidePhase - Setpoint pop-up fade phase — only meaningful for `role=\"setpoint\"`.\n * @property category - Semantic category of an advice block — picks the default marker icon\n * and the `active` styling. Only meaningful for `variant=\"advice\"`.\n * @availableWhen category variant==advice\n * @slot icon - Replaces the role's default marker icon.\n * @csspart block - The block container (carries role / tone / data-quality).\n * @csspart block-content - The number + degree group.\n * @csspart block-text - The `obc-textbox` rendering the number.\n * @csspart block-icon - The leading marker-icon container.\n * @csspart degree - The trailing degree-glyph column.\n * @beta\n */\n@customElement('obc-readout-block')\nexport class ObcReadoutBlock extends LitElement {\n @property({type: String}) variant: ReadoutBlockVariant =\n ReadoutBlockVariant.value;\n\n @property({type: String}) value: number | string | null = null;\n\n @property({type: String}) valueType: ReadoutValueType =\n ReadoutValueType.number;\n\n @property({type: String}) size: ReadoutBlockSize = ReadoutBlockSize.small;\n\n @property({type: String}) valueSize?: ObcTextboxSize;\n\n @property({type: Boolean}) enhanced = false;\n\n @property({type: String}) weight: ObcTextboxFontWeight =\n ObcTextboxFontWeight.regular;\n\n @property({type: Boolean}) hasDegree = false;\n\n @property({type: Boolean}) hasIcon = false;\n\n @property({type: Number}) fractionDigits = 0;\n\n @property({type: Number}) maxDigits = 0;\n\n @property({type: Boolean}) hintedZeros = false;\n\n @property({type: Boolean}) hasSignSpacer = false;\n\n @property({type: String}) spaceReserver?: string;\n\n @property({type: Boolean}) off = false;\n\n @property({type: String}) offText = 'OFF';\n\n @property({type: String}) alignment: ObcTextboxAlignment =\n ObcTextboxAlignment.Right;\n\n @property({type: String}) category: ReadoutAdviceCategory =\n ReadoutAdviceCategory.regular;\n\n @property({type: Boolean}) active = false;\n\n @property({type: String}) dataQuality?: ReadoutBlockDataQuality;\n\n // `boolean | …` (not `false | …`): the generated Angular wrapper widens a\n // literal-`false` union to `boolean`. `wrapWithAlertFrame` treats any\n // non-object as \"no frame\", so accepting `boolean` is harmless.\n @property({type: Object}) alert: boolean | AlertFrameConfig = false;\n\n @property({type: Boolean}) touching = false;\n\n @property({type: String}) hidePhase: ReadoutBlockHidePhase =\n ReadoutBlockHidePhase.none;\n\n @state() private hasAssignedIcon = false;\n\n private get resolvedValueSize(): ObcTextboxSize {\n if (this.valueSize) {\n return this.valueSize;\n }\n switch (this.size) {\n case ReadoutBlockSize.large:\n return ObcTextboxSize.l;\n case ReadoutBlockSize.medium:\n return ObcTextboxSize.m;\n default:\n return ObcTextboxSize.s;\n }\n }\n\n /**\n * `maxDigits` bounded to a usable count. Every width calculation below goes\n * through this rather than the raw property, so an `Infinity` (or absurdly\n * large) value cannot reach `String.prototype.repeat`.\n */\n private get resolvedMaxDigits(): number {\n return resolveReadoutDigitCount(this.maxDigits);\n }\n\n /**\n * Whether a digit knob failed to arrive (`NaN` / `null` / `undefined`).\n * The reading then renders as the unavailable dash rather than silently\n * formatting with a default the author never chose — a critical `0.4`\n * formatted with a failed `fractionDigits` would otherwise print as a\n * plausible-looking `0`. A missing `maxDigits` dashes too, for consistency:\n * either knob arriving broken means the row's configuration cannot be\n * trusted.\n */\n private get digitCountsMissing(): boolean {\n return (\n isReadoutDigitCountMissing(this.fractionDigits) ||\n isReadoutDigitCountMissing(this.maxDigits)\n );\n }\n\n private get numericFormatOptions(): ReadoutNumericFormatOptions {\n return {\n // The unavailable placeholder stays short (`maxDigits` already reserves\n // the width, so it sits at the right edge of it) \\u2014 except under hinted\n // zeros, where dashes fill every position the zeros would occupy.\n showZeroPadding: this.hintedZeros,\n minValueLength: this.resolvedMaxDigits,\n // A missing precision shapes the placeholder as zero fraction digits (a\n // single dash) — and keeps a runtime `undefined`/`null` out of the\n // options object, which is typed `number` throughout the formatters.\n fractionDigits: isReadoutDigitCountMissing(this.fractionDigits)\n ? 0\n : this.fractionDigits,\n };\n }\n\n /** Widest possible value string for width reservation (e.g. `\"000.0\"`). */\n private get reserverText(): string {\n const maxDigits = this.resolvedMaxDigits;\n if (maxDigits <= 0) {\n return '';\n }\n const integer = '0'.repeat(maxDigits);\n return this.fractionDigits > 0\n ? `${integer}.${'0'.repeat(this.fractionDigits)}`\n : integer;\n }\n\n /**\n * Effective width reserver: the wider of the explicit `spaceReserver` and the\n * `maxDigits`/`fractionDigits`-derived reserve, so an explicit reserver can\n * never reserve *less* than the formatted value needs. Under tabular-nums the\n * rendered width is proportional to character count, so \"wider\" compares length.\n */\n private widerReserver(explicit: string | undefined, derived: string): string {\n if (!explicit) {\n return derived;\n }\n if (!derived) {\n return explicit;\n }\n return explicit.length >= derived.length ? explicit : derived;\n }\n\n private dataQualityClasses(): Record<string, boolean> {\n return {\n 'data-low-integrity':\n this.dataQuality === ReadoutBlockDataQuality.lowIntegrity,\n 'data-invalid': this.dataQuality === ReadoutBlockDataQuality.invalid,\n };\n }\n\n private onIconSlotChange = (event: Event): void => {\n // `slotchange` fires after the first render once content is (re)assigned,\n // so it covers the initial state without a firstUpdated re-render.\n this.hasAssignedIcon =\n (event.target as HTMLSlotElement).assignedElements({flatten: true})\n .length > 0;\n };\n\n private renderIcon(): TemplateResult | typeof nothing {\n // Value blocks only show an icon when asked; setpoint/advice always reserve\n // their marker. The role default is rendered as a direct child (so it sizes\n // via `.block-icon obi-*`) and hidden once an icon is assigned to the slot —\n // `{flatten: true}` sees through a forwarded-but-empty parent slot, so the\n // default still shows when the consumer overrides nothing.\n const showIcon = this.variant !== ReadoutBlockVariant.value || this.hasIcon;\n if (!showIcon) {\n return nothing;\n }\n let fallback: TemplateResult | typeof nothing = nothing;\n if (this.variant === ReadoutBlockVariant.setpoint) {\n fallback = html`<obi-input-right></obi-input-right>`;\n } else if (this.variant === ReadoutBlockVariant.advice) {\n fallback = this.adviceFallbackIcon();\n }\n return html`<span class=\"block-icon\" part=\"block-icon\" aria-hidden=\"true\">\n <slot name=\"icon\" @slotchange=${this.onIconSlotChange}></slot>\n ${this.hasAssignedIcon ? nothing : fallback}\n </span>`;\n }\n\n /**\n * The advice marker for the current category / triggered state. Resting\n * categories carry a neutral outline glyph (tinted via `currentColor`);\n * triggered alert categories swap to the filled IEC status icon rendered\n * with `useCssColor`, which selects the icon's token-coloured variant\n * (alert fill + on-alert glyph, e.g. `--alert-caution-color` +\n * `--on-caution-active-color`) — without it the same icon is a\n * single-colour `currentColor` silhouette. This mirrors `obc-alert-icon`.\n * The resting icons and the advice diamond deliberately stay on\n * `currentColor`: their css-colour variants hard-code\n * `--element-active-color`, which would defeat the neutral tint and the\n * optimal / eco triggered tint applied from CSS.\n */\n private adviceFallbackIcon(): TemplateResult {\n const active = this.active;\n switch (this.category) {\n case ReadoutAdviceCategory.caution:\n return active\n ? html`<obi-caution-color-iec useCssColor></obi-caution-color-iec>`\n : html`<obi-caution-google></obi-caution-google>`;\n case ReadoutAdviceCategory.warning:\n return active\n ? html`<obi-warning-unacknowledged-iec\n useCssColor\n ></obi-warning-unacknowledged-iec>`\n : html`<obi-warning-unacknowledged-outlined></obi-warning-unacknowledged-outlined>`;\n case ReadoutAdviceCategory.alarm:\n return active\n ? html`<obi-alarm-unacknowledged-iec\n useCssColor\n ></obi-alarm-unacknowledged-iec>`\n : html`<obi-alarm></obi-alarm>`;\n case ReadoutAdviceCategory.running:\n return active\n ? html`<obi-running-color-iec useCssColor></obi-running-color-iec>`\n : html`<obi-running></obi-running>`;\n default:\n // regular / optimal / eco share the advice diamond; the triggered tint\n // is applied via CSS on `.block-icon` (see `advice-*` classes).\n return active\n ? html`<obi-notification-advice-active></obi-notification-advice-active>`\n : html`<obi-notification-advice></obi-notification-advice>`;\n }\n }\n\n /**\n * A cap-height `°` column whose width scales with the number size. Inherits the\n * block's colour.\n */\n private renderDegreeGlyph(size: ObcTextboxSize): TemplateResult {\n return html`\n <span\n class=${classMap({\n 'degree-column': true,\n [`degree-${size}`]: true,\n 'degree-inherit': true,\n })}\n part=\"degree\"\n >\n <obc-textbox class=\"degree-glyph\" .size=${size} alignment=\"center\"\n >°</obc-textbox\n >\n </span>\n `;\n }\n\n protected override willUpdate(changed: Map<string, unknown>): void {\n super.willUpdate(changed);\n // Never gate this on `changed`: a throw clears Lit's changed map, so the\n // next update would skip the check and render the invalid value as a dash\n // (readout-components.md § 1, pinned by readout-block.spec.ts).\n assertReadoutValueType('obc-readout-block', this.value, this.valueType);\n assertReadoutFractionDigits('obc-readout-block', this.fractionDigits);\n }\n\n override render() {\n const valueSize = this.resolvedValueSize;\n const isAdvice = this.variant === ReadoutBlockVariant.advice;\n // Triggered regular/optimal/eco advice renders SemiBold (Figma 6.1); the\n // alert categories keep the caller's weight and change colour instead.\n const adviceSemibold =\n isAdvice &&\n this.active &&\n (this.category === ReadoutAdviceCategory.regular ||\n this.category === ReadoutAdviceCategory.optimal ||\n this.category === ReadoutAdviceCategory.eco);\n const weight = adviceSemibold ? ObcTextboxFontWeight.semibold : this.weight;\n const formatOptions = this.numericFormatOptions;\n const isTextMode = this.valueType === ReadoutValueType.text;\n // A missing digit knob makes the reading untrustworthy, so it resolves to\n // \"no reading\" and renders the dash (see `digitCountsMissing`). Text mode\n // is unaffected — it ignores the numeric knobs entirely.\n const valueForFormat = this.digitCountsMissing\n ? undefined\n : resolveReadoutNumericValue(this.value, this.valueType);\n const textValue = resolveReadoutTextValue(this.value, this.valueType);\n // Text mode renders verbatim and ignores the numeric format options; a\n // blank / missing text value still falls back to the unavailable dash.\n const text = this.off\n ? this.offText\n : isTextMode\n ? (textValue ?? READOUT_UNAVAILABLE_DASH)\n : formatNumericValue(valueForFormat, formatOptions);\n // Hinted zeros fill the INTEGER part to `maxDigits` (the fraction never\n // counts); `splitHintedValue` hoists a negative value's sign ahead of the\n // muted zeros (\"-012.3\"). A dashed (unavailable) value is not padded —\n // its dashes already fill the reserved positions (`showZeroPadding`).\n const isHinting =\n !this.off &&\n !isTextMode &&\n this.hintedZeros &&\n valueForFormat !== undefined;\n // `resolvedMaxDigits`, not the raw property: `splitHintedValue` hands the\n // count to `String.prototype.repeat`, so an `Infinity` here would throw.\n const {sign, hinted, magnitude} = isHinting\n ? splitHintedValue(text, this.resolvedMaxDigits)\n : {sign: '', hinted: '', magnitude: text};\n // A plain ASCII `-`, exactly as wide as a rendered sign, so the digits do\n // not move when the sign appears. A non-hinted negative keeps its sign\n // inside `magnitude`, hence the startsWith check.\n const showSignSpacer =\n this.hasSignSpacer &&\n !isTextMode &&\n sign === '' &&\n !magnitude.startsWith('-');\n // The wider of the explicit `spaceReserver` and the `maxDigits`-derived\n // reserve wins — also under `hintedZeros`, so a sign-column reserver from\n // a list is honoured. Text mode honours only an explicit `spaceReserver`\n // (readout-components.md § 4).\n const baseReserver = isTextMode\n ? (this.spaceReserver ?? '')\n : this.widerReserver(this.spaceReserver, this.reserverText);\n // No double prefix: an explicit reserver that already leads with a sign\n // (e.g. `obc-readout-list`'s shared \"-000.0\") has the column reserved.\n const reserver =\n !isTextMode && this.hasSignSpacer && !baseReserver.startsWith('-')\n ? `-${baseReserver}`\n : baseReserver;\n\n const block = html`\n <div\n class=${classMap({\n block: true,\n [`block-${this.variant}`]: true,\n [`size-${this.size}`]: true,\n [`value-size-${valueSize}`]: true,\n [`advice-${this.category}`]: isAdvice,\n 'advice-active': isAdvice && this.active,\n 'tone-enhanced': this.enhanced,\n touching: this.touching,\n 'is-hiding': this.hidePhase === ReadoutBlockHidePhase.hiding,\n 'is-hidden': this.hidePhase === ReadoutBlockHidePhase.hidden,\n ...this.dataQualityClasses(),\n })}\n part=\"block block-${this.variant}\"\n >\n ${this.renderIcon()}\n <span class=\"block-content\" part=\"block-content\">\n <obc-textbox\n class=\"block-text\"\n part=\"block-text\"\n .size=${valueSize}\n .fontWeight=${weight}\n .alignment=${this.alignment}\n .tabularNums=${true}\n >\n ${sign}${showSignSpacer\n ? html`<span class=\"sign-spacer\" aria-hidden=\"true\">-</span>`\n : nothing}${hinted\n ? html`<span class=\"hinted-zero\" aria-hidden=\"true\"\n >${hinted}</span\n >`\n : nothing}${magnitude}\n ${reserver ? html`<span slot=\"length\">${reserver}</span>` : nothing}\n </obc-textbox>\n ${this.hasDegree ? this.renderDegreeGlyph(valueSize) : nothing}\n </span>\n </div>\n `;\n return wrapWithAlertFrame(this.alert ?? false, block);\n }\n\n static override styles = unsafeCSS(componentStyle);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-readout-block': ObcReadoutBlock;\n }\n}\n"],"names":["ReadoutBlockVariant","ReadoutBlockSize","ReadoutBlockDataQuality","ReadoutAdviceCategory","ReadoutBlockHidePhase"],"mappings":"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"}
1
+ {"version":3,"file":"readout-block.js","sources":["../../../src/building-blocks/readout-block/readout-block.ts"],"sourcesContent":["import {LitElement, html, nothing, unsafeCSS, type TemplateResult} from 'lit';\nimport {property, state} from 'lit/decorators.js';\nimport {classMap} from 'lit/directives/class-map.js';\nimport componentStyle from './readout-block.css?inline';\nimport {customElement} from '../../decorator.js';\nimport '../../components/textbox/textbox.js';\nimport {\n ObcTextboxSize,\n ObcTextboxFontWeight,\n ObcTextboxAlignment,\n} from '../../components/textbox/textbox.js';\nimport '../../icons/icon-input-right.js';\nimport '../../icons/icon-notification-advice.js';\nimport '../../icons/icon-notification-advice-active.js';\nimport '../../icons/icon-caution-google.js';\nimport '../../icons/icon-caution-color-iec.js';\nimport '../../icons/icon-warning-unacknowledged-outlined.js';\nimport '../../icons/icon-warning-unacknowledged-iec.js';\nimport '../../icons/icon-alarm.js';\nimport '../../icons/icon-alarm-unacknowledged-iec.js';\nimport '../../icons/icon-running.js';\nimport '../../icons/icon-running-color-iec.js';\nimport {\n formatNumericValue,\n splitHintedValue,\n assertReadoutValueType,\n assertReadoutFractionDigits,\n isReadoutDigitCountMissing,\n resolveReadoutDigitCount,\n resolveReadoutNumericValue,\n resolveReadoutTextValue,\n READOUT_UNAVAILABLE_DASH,\n ReadoutValueType,\n type ReadoutNumericFormatOptions,\n} from '../../navigation-instruments/readout/readout-formatters.js';\nimport {\n type AlertFrameConfig,\n wrapWithAlertFrame,\n} from '../../components/alert-frame/alert-frame.js';\n\n// Re-exported so consumers can configure typography without a second import path.\nexport {\n ObcTextboxSize,\n ObcTextboxFontWeight,\n ObcTextboxAlignment,\n} from '../../components/textbox/textbox.js';\nexport {ReadoutValueType} from '../../navigation-instruments/readout/readout-formatters.js';\n\n/**\n * Semantic variant of the block. Drives the default marker icon and the\n * colour token; the layout is identical across variants.\n * - `value`: the primary reading (no default marker icon).\n * - `setpoint`: a setpoint reference (default `input-right` marker).\n * - `advice`: an advisory reference (default `notification-advice` marker).\n */\nexport enum ReadoutBlockVariant {\n value = 'value',\n setpoint = 'setpoint',\n advice = 'advice',\n}\n\n/**\n * Density tier of the block — drives icon size, the icon↔number gap, and the\n * degree-column width tier. The number typography size is controlled\n * independently via {@link ObcReadoutBlock.valueSize} so a parent can de-emphasise\n * one block relative to another within the same tier.\n */\nexport enum ReadoutBlockSize {\n small = 'small',\n medium = 'medium',\n large = 'large',\n}\n\n/**\n * Per-block measurement quality, rendered as a non-shifting outline chip.\n * - `low-integrity`: the value is suspect.\n * - `invalid`: the value is invalid.\n */\nexport enum ReadoutBlockDataQuality {\n lowIntegrity = 'low-integrity',\n invalid = 'invalid',\n}\n\n/**\n * Semantic category of an advice block (Figma 6.1 \"Readout-block-advice\"\n * Value axis). Drives the default marker icon and — while {@link\n * ObcReadoutBlock.active} — the triggered styling:\n * - `regular` / `optimal` / `eco`: the advice diamond; triggered renders the\n * filled diamond (tinted enhanced-blue / mint for optimal / eco) and a\n * SemiBold number.\n * - `caution` / `warning` / `alarm` / `running`: the matching neutral outline\n * icon; triggered swaps in the filled IEC status icon and the active text\n * colour.\n *\n * TODO(designer): the optimal / eco triggered tint covers the whole diamond\n * glyph — the Figma icon tints only the inner plus, which needs a two-tone\n * icon asset; and the advice \"Enhanced\" state (indent background chip) is not\n * implemented yet. Both flagged as \"may change\" in the 6.1 review.\n */\nexport enum ReadoutAdviceCategory {\n regular = 'regular',\n optimal = 'optimal',\n eco = 'eco',\n caution = 'caution',\n warning = 'warning',\n alarm = 'alarm',\n running = 'running',\n}\n\n/**\n * Pop-up fade phase for a setpoint block. Driven by the parent's setpoint\n * interaction state machine; only meaningful for `role=\"setpoint\"`.\n */\nexport enum ReadoutBlockHidePhase {\n none = 'none',\n hiding = 'hiding',\n hidden = 'hidden',\n}\n\n/**\n * `<obc-readout-block>` – the most atomic readout primitive: a single\n * cap-height-aligned, width-reservable numeric segment (value / setpoint /\n * advice).\n *\n * It renders one `obc-textbox` number with optional hinted leading zeros, a\n * reservable width, an optional leading marker icon (via the `icon` slot or the\n * role default), an optional trailing degree glyph, an `off`/unavailable text\n * state, per-block data-quality and an optional per-block alert frame.\n *\n * Setting `valueType` to `text` renders `value` verbatim (e.g.\n * `\"Auto\"`) instead of a formatted number.\n *\n * This is a building block used inside `obc-readout-list-item` (and, in a future\n * refactor, inside `obc-readout`); it is not normally used on its own. Colour is\n * inherited from the host context (the parent sets the role colour), so the\n * block stays neutral until placed.\n *\n * @property variant - Semantic variant (value / setpoint / advice).\n * @property value - The value; `null`/`undefined` renders a dash. A number by default, or text when\n * `valueType` is `text`.\n * @property valueType - How `value` is interpreted. `number` (default) formats it via\n * `fractionDigits`; `text` renders it verbatim and ignores the numeric\n * format options. Passing text while this is `number` throws.\n * @property size - Density tier — icon size, gap, degree tier.\n * @property valueSize - Resolved number-typography size. When unset it is derived from `size`\n * (small→s, medium→m, large→l), so a parent that de-emphasises a block (e.g.\n * a secondary setpoint) can pass a smaller size without changing the tier.\n * @property enhanced - Accent (in-command) colour tone.\n * @property weight - Number font weight (regular / semibold / bold); colour is independent.\n * @property hasDegree - Render the trailing cap-height degree glyph (`°`).\n * @property hasIcon - Show the leading marker-icon container (always on for setpoint/advice).\n * @property fractionDigits - Number of fraction digits. Must be between 0 and 100 — the range\n * `Number.prototype.toFixed` accepts; outside it throws a `RangeError`.\n * A fractional count truncates (`2.7` → `2`). A count that never arrived\n * (`NaN`, `null` or unset) renders the reading as the unavailable dash —\n * formatting with a precision the author never chose would let a critical\n * `0.4` pass for a healthy `0`.\n * @availableWhen fractionDigits valueType==number\n * @property maxDigits - Integer digits to reserve / hint (independent of `fractionDigits`).\n * Bounded before use: a fractional count\n * truncates (`2.7` → `2`), anything above 100 — including `Infinity` —\n * caps at 100, and a negative count reserves nothing. A count that never\n * arrived (`NaN`, `null` or unset) renders the reading as the unavailable\n * dash, consistent with `fractionDigits`.\n * @availableWhen maxDigits valueType==number\n * @property hintedZeros - Render muted leading zeros filling the integer part to `maxDigits`.\n * A negative value keeps them all — the sign is prepended and never consumes\n * a zero (`maxDigits` 3: `12.3` → `012.3`, `-12.3` → `-012.3`) — so a\n * negative reading is one character wider than a positive one unless\n * `hasSignSpacer` reserves the sign column. An unavailable value renders\n * dashes across the whole reserved width (`‒‒‒.‒`) instead of the short\n * placeholder.\n * @availableWhen hintedZeros valueType==number\n * @property hasSignSpacer - Reserve a minus-sign column ahead of the digits: an invisible sign\n * placeholder holds the column open while the value is non-negative and the\n * real sign fills it when negative, so the width does not change across\n * zero. Enable it on readouts whose value can go negative; all-positive\n * readouts reserve nothing.\n * @availableWhen hasSignSpacer valueType==number\n * @property spaceReserver - Explicit longest string to reserve width for (e.g. `\"0000.0\"`).\n * Combined with the `maxDigits`-derived reserve by taking whichever is\n * wider, so it can never reserve less than the formatted value needs.\n * @property off - Render `offText` instead of a number (e.g. equipment powered down).\n * @property offText - Text shown when `off` is true.\n * @property alignment - Text alignment of the number within its reserved width.\n * @property active - The advice is triggered: the marker swaps to its filled/status icon and\n * the number takes the category's triggered styling (SemiBold for\n * regular/optimal/eco, active text colour for the alert categories). Only\n * meaningful for `variant=\"advice\"`.\n * @availableWhen active variant==advice\n * @property dataQuality - Per-block measurement quality (outline chip).\n * @property alert - Per-block alert frame; nests inside any parent alert frame.\n * @property touching - Setpoint focus (touch) state — only meaningful for `role=\"setpoint\"`.\n * @property hidePhase - Setpoint pop-up fade phase — only meaningful for `role=\"setpoint\"`.\n * @property category - Semantic category of an advice block — picks the default marker icon\n * and the `active` styling. Only meaningful for `variant=\"advice\"`.\n * @availableWhen category variant==advice\n * @slot icon - Replaces the role's default marker icon.\n * @csspart block - The block container (carries role / tone / data-quality).\n * @csspart block-content - The number + degree group.\n * @csspart block-text - The `obc-textbox` rendering the number.\n * @csspart block-icon - The leading marker-icon container.\n * @csspart degree - The trailing degree-glyph column.\n * @stable\n */\n@customElement('obc-readout-block')\nexport class ObcReadoutBlock extends LitElement {\n @property({type: String}) variant: ReadoutBlockVariant =\n ReadoutBlockVariant.value;\n\n @property({type: String}) value: number | string | null = null;\n\n @property({type: String}) valueType: ReadoutValueType =\n ReadoutValueType.number;\n\n @property({type: String}) size: ReadoutBlockSize = ReadoutBlockSize.small;\n\n @property({type: String}) valueSize?: ObcTextboxSize;\n\n @property({type: Boolean}) enhanced = false;\n\n @property({type: String}) weight: ObcTextboxFontWeight =\n ObcTextboxFontWeight.regular;\n\n @property({type: Boolean}) hasDegree = false;\n\n @property({type: Boolean}) hasIcon = false;\n\n @property({type: Number}) fractionDigits = 0;\n\n @property({type: Number}) maxDigits = 0;\n\n @property({type: Boolean}) hintedZeros = false;\n\n @property({type: Boolean}) hasSignSpacer = false;\n\n @property({type: String}) spaceReserver?: string;\n\n @property({type: Boolean}) off = false;\n\n @property({type: String}) offText = 'OFF';\n\n @property({type: String}) alignment: ObcTextboxAlignment =\n ObcTextboxAlignment.Right;\n\n @property({type: String}) category: ReadoutAdviceCategory =\n ReadoutAdviceCategory.regular;\n\n @property({type: Boolean}) active = false;\n\n @property({type: String}) dataQuality?: ReadoutBlockDataQuality;\n\n // `boolean | …` (not `false | …`): the generated Angular wrapper widens a\n // literal-`false` union to `boolean`. `wrapWithAlertFrame` treats any\n // non-object as \"no frame\", so accepting `boolean` is harmless.\n @property({type: Object}) alert: boolean | AlertFrameConfig = false;\n\n @property({type: Boolean}) touching = false;\n\n @property({type: String}) hidePhase: ReadoutBlockHidePhase =\n ReadoutBlockHidePhase.none;\n\n @state() private hasAssignedIcon = false;\n\n private get resolvedValueSize(): ObcTextboxSize {\n if (this.valueSize) {\n return this.valueSize;\n }\n switch (this.size) {\n case ReadoutBlockSize.large:\n return ObcTextboxSize.l;\n case ReadoutBlockSize.medium:\n return ObcTextboxSize.m;\n default:\n return ObcTextboxSize.s;\n }\n }\n\n /**\n * `maxDigits` bounded to a usable count. Every width calculation below goes\n * through this rather than the raw property, so an `Infinity` (or absurdly\n * large) value cannot reach `String.prototype.repeat`.\n */\n private get resolvedMaxDigits(): number {\n return resolveReadoutDigitCount(this.maxDigits);\n }\n\n /**\n * Whether a digit knob failed to arrive (`NaN` / `null` / `undefined`).\n * The reading then renders as the unavailable dash rather than silently\n * formatting with a default the author never chose — a critical `0.4`\n * formatted with a failed `fractionDigits` would otherwise print as a\n * plausible-looking `0`. A missing `maxDigits` dashes too, for consistency:\n * either knob arriving broken means the row's configuration cannot be\n * trusted.\n */\n private get digitCountsMissing(): boolean {\n return (\n isReadoutDigitCountMissing(this.fractionDigits) ||\n isReadoutDigitCountMissing(this.maxDigits)\n );\n }\n\n private get numericFormatOptions(): ReadoutNumericFormatOptions {\n return {\n // The unavailable placeholder stays short (`maxDigits` already reserves\n // the width, so it sits at the right edge of it) \\u2014 except under hinted\n // zeros, where dashes fill every position the zeros would occupy.\n showZeroPadding: this.hintedZeros,\n minValueLength: this.resolvedMaxDigits,\n // A missing precision shapes the placeholder as zero fraction digits (a\n // single dash) — and keeps a runtime `undefined`/`null` out of the\n // options object, which is typed `number` throughout the formatters.\n fractionDigits: isReadoutDigitCountMissing(this.fractionDigits)\n ? 0\n : this.fractionDigits,\n };\n }\n\n /** Widest possible value string for width reservation (e.g. `\"000.0\"`). */\n private get reserverText(): string {\n const maxDigits = this.resolvedMaxDigits;\n if (maxDigits <= 0) {\n return '';\n }\n const integer = '0'.repeat(maxDigits);\n return this.fractionDigits > 0\n ? `${integer}.${'0'.repeat(this.fractionDigits)}`\n : integer;\n }\n\n /**\n * Effective width reserver: the wider of the explicit `spaceReserver` and the\n * `maxDigits`/`fractionDigits`-derived reserve, so an explicit reserver can\n * never reserve *less* than the formatted value needs. Under tabular-nums the\n * rendered width is proportional to character count, so \"wider\" compares length.\n */\n private widerReserver(explicit: string | undefined, derived: string): string {\n if (!explicit) {\n return derived;\n }\n if (!derived) {\n return explicit;\n }\n return explicit.length >= derived.length ? explicit : derived;\n }\n\n private dataQualityClasses(): Record<string, boolean> {\n return {\n 'data-low-integrity':\n this.dataQuality === ReadoutBlockDataQuality.lowIntegrity,\n 'data-invalid': this.dataQuality === ReadoutBlockDataQuality.invalid,\n };\n }\n\n private onIconSlotChange = (event: Event): void => {\n // `slotchange` fires after the first render once content is (re)assigned,\n // so it covers the initial state without a firstUpdated re-render.\n this.hasAssignedIcon =\n (event.target as HTMLSlotElement).assignedElements({flatten: true})\n .length > 0;\n };\n\n private renderIcon(): TemplateResult | typeof nothing {\n // Value blocks only show an icon when asked; setpoint/advice always reserve\n // their marker. The role default is rendered as a direct child (so it sizes\n // via `.block-icon obi-*`) and hidden once an icon is assigned to the slot —\n // `{flatten: true}` sees through a forwarded-but-empty parent slot, so the\n // default still shows when the consumer overrides nothing.\n const showIcon = this.variant !== ReadoutBlockVariant.value || this.hasIcon;\n if (!showIcon) {\n return nothing;\n }\n let fallback: TemplateResult | typeof nothing = nothing;\n if (this.variant === ReadoutBlockVariant.setpoint) {\n fallback = html`<obi-input-right></obi-input-right>`;\n } else if (this.variant === ReadoutBlockVariant.advice) {\n fallback = this.adviceFallbackIcon();\n }\n return html`<span class=\"block-icon\" part=\"block-icon\" aria-hidden=\"true\">\n <slot name=\"icon\" @slotchange=${this.onIconSlotChange}></slot>\n ${this.hasAssignedIcon ? nothing : fallback}\n </span>`;\n }\n\n /**\n * The advice marker for the current category / triggered state. Resting\n * categories carry a neutral outline glyph (tinted via `currentColor`);\n * triggered alert categories swap to the filled IEC status icon rendered\n * with `useCssColor`, which selects the icon's token-coloured variant\n * (alert fill + on-alert glyph, e.g. `--alert-caution-color` +\n * `--on-caution-active-color`) — without it the same icon is a\n * single-colour `currentColor` silhouette. This mirrors `obc-alert-icon`.\n * The resting icons and the advice diamond deliberately stay on\n * `currentColor`: their css-colour variants hard-code\n * `--element-active-color`, which would defeat the neutral tint and the\n * optimal / eco triggered tint applied from CSS.\n */\n private adviceFallbackIcon(): TemplateResult {\n const active = this.active;\n switch (this.category) {\n case ReadoutAdviceCategory.caution:\n return active\n ? html`<obi-caution-color-iec useCssColor></obi-caution-color-iec>`\n : html`<obi-caution-google></obi-caution-google>`;\n case ReadoutAdviceCategory.warning:\n return active\n ? html`<obi-warning-unacknowledged-iec\n useCssColor\n ></obi-warning-unacknowledged-iec>`\n : html`<obi-warning-unacknowledged-outlined></obi-warning-unacknowledged-outlined>`;\n case ReadoutAdviceCategory.alarm:\n return active\n ? html`<obi-alarm-unacknowledged-iec\n useCssColor\n ></obi-alarm-unacknowledged-iec>`\n : html`<obi-alarm></obi-alarm>`;\n case ReadoutAdviceCategory.running:\n return active\n ? html`<obi-running-color-iec useCssColor></obi-running-color-iec>`\n : html`<obi-running></obi-running>`;\n default:\n // regular / optimal / eco share the advice diamond; the triggered tint\n // is applied via CSS on `.block-icon` (see `advice-*` classes).\n return active\n ? html`<obi-notification-advice-active></obi-notification-advice-active>`\n : html`<obi-notification-advice></obi-notification-advice>`;\n }\n }\n\n /**\n * A cap-height `°` column whose width scales with the number size. Inherits the\n * block's colour.\n */\n private renderDegreeGlyph(size: ObcTextboxSize): TemplateResult {\n return html`\n <span\n class=${classMap({\n 'degree-column': true,\n [`degree-${size}`]: true,\n 'degree-inherit': true,\n })}\n part=\"degree\"\n >\n <obc-textbox class=\"degree-glyph\" .size=${size} alignment=\"center\"\n >°</obc-textbox\n >\n </span>\n `;\n }\n\n protected override willUpdate(changed: Map<string, unknown>): void {\n super.willUpdate(changed);\n // Never gate this on `changed`: a throw clears Lit's changed map, so the\n // next update would skip the check and render the invalid value as a dash\n // (readout-components.md § 1, pinned by readout-block.spec.ts).\n assertReadoutValueType('obc-readout-block', this.value, this.valueType);\n assertReadoutFractionDigits('obc-readout-block', this.fractionDigits);\n }\n\n override render() {\n const valueSize = this.resolvedValueSize;\n const isAdvice = this.variant === ReadoutBlockVariant.advice;\n // Triggered regular/optimal/eco advice renders SemiBold (Figma 6.1); the\n // alert categories keep the caller's weight and change colour instead.\n const adviceSemibold =\n isAdvice &&\n this.active &&\n (this.category === ReadoutAdviceCategory.regular ||\n this.category === ReadoutAdviceCategory.optimal ||\n this.category === ReadoutAdviceCategory.eco);\n const weight = adviceSemibold ? ObcTextboxFontWeight.semibold : this.weight;\n const formatOptions = this.numericFormatOptions;\n const isTextMode = this.valueType === ReadoutValueType.text;\n // A missing digit knob makes the reading untrustworthy, so it resolves to\n // \"no reading\" and renders the dash (see `digitCountsMissing`). Text mode\n // is unaffected — it ignores the numeric knobs entirely.\n const valueForFormat = this.digitCountsMissing\n ? undefined\n : resolveReadoutNumericValue(this.value, this.valueType);\n const textValue = resolveReadoutTextValue(this.value, this.valueType);\n // Text mode renders verbatim and ignores the numeric format options; a\n // blank / missing text value still falls back to the unavailable dash.\n const text = this.off\n ? this.offText\n : isTextMode\n ? (textValue ?? READOUT_UNAVAILABLE_DASH)\n : formatNumericValue(valueForFormat, formatOptions);\n // Hinted zeros fill the INTEGER part to `maxDigits` (the fraction never\n // counts); `splitHintedValue` hoists a negative value's sign ahead of the\n // muted zeros (\"-012.3\"). A dashed (unavailable) value is not padded —\n // its dashes already fill the reserved positions (`showZeroPadding`).\n const isHinting =\n !this.off &&\n !isTextMode &&\n this.hintedZeros &&\n valueForFormat !== undefined;\n // `resolvedMaxDigits`, not the raw property: `splitHintedValue` hands the\n // count to `String.prototype.repeat`, so an `Infinity` here would throw.\n const {sign, hinted, magnitude} = isHinting\n ? splitHintedValue(text, this.resolvedMaxDigits)\n : {sign: '', hinted: '', magnitude: text};\n // A plain ASCII `-`, exactly as wide as a rendered sign, so the digits do\n // not move when the sign appears. A non-hinted negative keeps its sign\n // inside `magnitude`, hence the startsWith check.\n const showSignSpacer =\n this.hasSignSpacer &&\n !isTextMode &&\n sign === '' &&\n !magnitude.startsWith('-');\n // The wider of the explicit `spaceReserver` and the `maxDigits`-derived\n // reserve wins — also under `hintedZeros`, so a sign-column reserver from\n // a list is honoured. Text mode honours only an explicit `spaceReserver`\n // (readout-components.md § 4).\n const baseReserver = isTextMode\n ? (this.spaceReserver ?? '')\n : this.widerReserver(this.spaceReserver, this.reserverText);\n // No double prefix: an explicit reserver that already leads with a sign\n // (e.g. `obc-readout-list`'s shared \"-000.0\") has the column reserved.\n const reserver =\n !isTextMode && this.hasSignSpacer && !baseReserver.startsWith('-')\n ? `-${baseReserver}`\n : baseReserver;\n\n const block = html`\n <div\n class=${classMap({\n block: true,\n [`block-${this.variant}`]: true,\n [`size-${this.size}`]: true,\n [`value-size-${valueSize}`]: true,\n [`advice-${this.category}`]: isAdvice,\n 'advice-active': isAdvice && this.active,\n 'tone-enhanced': this.enhanced,\n touching: this.touching,\n 'is-hiding': this.hidePhase === ReadoutBlockHidePhase.hiding,\n 'is-hidden': this.hidePhase === ReadoutBlockHidePhase.hidden,\n ...this.dataQualityClasses(),\n })}\n part=\"block block-${this.variant}\"\n >\n ${this.renderIcon()}\n <span class=\"block-content\" part=\"block-content\">\n <obc-textbox\n class=\"block-text\"\n part=\"block-text\"\n .size=${valueSize}\n .fontWeight=${weight}\n .alignment=${this.alignment}\n .tabularNums=${true}\n >\n ${sign}${showSignSpacer\n ? html`<span class=\"sign-spacer\" aria-hidden=\"true\">-</span>`\n : nothing}${hinted\n ? html`<span class=\"hinted-zero\" aria-hidden=\"true\"\n >${hinted}</span\n >`\n : nothing}${magnitude}\n ${reserver ? html`<span slot=\"length\">${reserver}</span>` : nothing}\n </obc-textbox>\n ${this.hasDegree ? this.renderDegreeGlyph(valueSize) : nothing}\n </span>\n </div>\n `;\n return wrapWithAlertFrame(this.alert ?? false, block);\n }\n\n static override styles = unsafeCSS(componentStyle);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-readout-block': ObcReadoutBlock;\n }\n}\n"],"names":["ReadoutBlockVariant","ReadoutBlockSize","ReadoutBlockDataQuality","ReadoutAdviceCategory","ReadoutBlockHidePhase"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuDO,IAAK,wCAAAA,yBAAL;AACLA,uBAAA,OAAA,IAAQ;AACRA,uBAAA,UAAA,IAAW;AACXA,uBAAA,QAAA,IAAS;AAHC,SAAAA;AAAA,GAAA,uBAAA,CAAA,CAAA;AAYL,IAAK,qCAAAC,sBAAL;AACLA,oBAAA,OAAA,IAAQ;AACRA,oBAAA,QAAA,IAAS;AACTA,oBAAA,OAAA,IAAQ;AAHE,SAAAA;AAAA,GAAA,oBAAA,CAAA,CAAA;AAWL,IAAK,4CAAAC,6BAAL;AACLA,2BAAA,cAAA,IAAe;AACfA,2BAAA,SAAA,IAAU;AAFA,SAAAA;AAAA,GAAA,2BAAA,CAAA,CAAA;AAqBL,IAAK,0CAAAC,2BAAL;AACLA,yBAAA,SAAA,IAAU;AACVA,yBAAA,SAAA,IAAU;AACVA,yBAAA,KAAA,IAAM;AACNA,yBAAA,SAAA,IAAU;AACVA,yBAAA,SAAA,IAAU;AACVA,yBAAA,OAAA,IAAQ;AACRA,yBAAA,SAAA,IAAU;AAPA,SAAAA;AAAA,GAAA,yBAAA,CAAA,CAAA;AAcL,IAAK,0CAAAC,2BAAL;AACLA,yBAAA,MAAA,IAAO;AACPA,yBAAA,QAAA,IAAS;AACTA,yBAAA,QAAA,IAAS;AAHC,SAAAA;AAAA,GAAA,yBAAA,CAAA,CAAA;AA6FL,IAAM,kBAAN,cAA8B,WAAW;AAAA,EAAzC,cAAA;AAAA,UAAA,GAAA,SAAA;AACqB,SAAA,UACxB;AAEwB,SAAA,QAAgC;AAEhC,SAAA,YACxB,iBAAiB;AAEO,SAAA,OAAyB;AAIxB,SAAA,WAAW;AAEZ,SAAA,SACxB,qBAAqB;AAEI,SAAA,YAAY;AAEZ,SAAA,UAAU;AAEX,SAAA,iBAAiB;AAEjB,SAAA,YAAY;AAEX,SAAA,cAAc;AAEd,SAAA,gBAAgB;AAIhB,SAAA,MAAM;AAEP,SAAA,UAAU;AAEV,SAAA,YACxB,oBAAoB;AAEI,SAAA,WACxB;AAEyB,SAAA,SAAS;AAOV,SAAA,QAAoC;AAEnC,SAAA,WAAW;AAEZ,SAAA,YACxB;AAEO,SAAQ,kBAAkB;AA6FnC,SAAQ,mBAAmB,CAAC,UAAuB;AAGjD,WAAK,kBACF,MAAM,OAA2B,iBAAiB,EAAC,SAAS,KAAA,CAAK,EAC/D,SAAS;AAAA,IAChB;AAAA,EAAA;AAAA,EAjGA,IAAY,oBAAoC;AAC9C,QAAI,KAAK,WAAW;AAClB,aAAO,KAAK;AAAA,IACd;AACA,YAAQ,KAAK,MAAA;AAAA,MACX,KAAK;AACH,eAAO,eAAe;AAAA,MACxB,KAAK;AACH,eAAO,eAAe;AAAA,MACxB;AACE,eAAO,eAAe;AAAA,IAAA;AAAA,EAE5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAY,oBAA4B;AACtC,WAAO,yBAAyB,KAAK,SAAS;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,IAAY,qBAA8B;AACxC,WACE,2BAA2B,KAAK,cAAc,KAC9C,2BAA2B,KAAK,SAAS;AAAA,EAE7C;AAAA,EAEA,IAAY,uBAAoD;AAC9D,WAAO;AAAA;AAAA;AAAA;AAAA,MAIL,iBAAiB,KAAK;AAAA,MACtB,gBAAgB,KAAK;AAAA;AAAA;AAAA;AAAA,MAIrB,gBAAgB,2BAA2B,KAAK,cAAc,IAC1D,IACA,KAAK;AAAA,IAAA;AAAA,EAEb;AAAA;AAAA,EAGA,IAAY,eAAuB;AACjC,UAAM,YAAY,KAAK;AACvB,QAAI,aAAa,GAAG;AAClB,aAAO;AAAA,IACT;AACA,UAAM,UAAU,IAAI,OAAO,SAAS;AACpC,WAAO,KAAK,iBAAiB,IACzB,GAAG,OAAO,IAAI,IAAI,OAAO,KAAK,cAAc,CAAC,KAC7C;AAAA,EACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,cAAc,UAA8B,SAAyB;AAC3E,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AACA,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AACA,WAAO,SAAS,UAAU,QAAQ,SAAS,WAAW;AAAA,EACxD;AAAA,EAEQ,qBAA8C;AACpD,WAAO;AAAA,MACL,sBACE,KAAK,gBAAgB;AAAA,MACvB,gBAAgB,KAAK,gBAAgB;AAAA;AAAA,IAAA;AAAA,EAEzC;AAAA,EAUQ,aAA8C;AAMpD,UAAM,WAAW,KAAK,YAAY,WAA6B,KAAK;AACpE,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AACA,QAAI,WAA4C;AAChD,QAAI,KAAK,YAAY,YAA8B;AACjD,iBAAW;AAAA,IACb,WAAW,KAAK,YAAY,UAA4B;AACtD,iBAAW,KAAK,mBAAA;AAAA,IAClB;AACA,WAAO;AAAA,sCAC2B,KAAK,gBAAgB;AAAA,QACnD,KAAK,kBAAkB,UAAU,QAAQ;AAAA;AAAA,EAE/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeQ,qBAAqC;AAC3C,UAAM,SAAS,KAAK;AACpB,YAAQ,KAAK,UAAA;AAAA,MACX,KAAK;AACH,eAAO,SACH,oEACA;AAAA,MACN,KAAK;AACH,eAAO,SACH;AAAA;AAAA,kDAGA;AAAA,MACN,KAAK;AACH,eAAO,SACH;AAAA;AAAA,gDAGA;AAAA,MACN,KAAK;AACH,eAAO,SACH,oEACA;AAAA,MACN;AAGE,eAAO,SACH,0EACA;AAAA,IAAA;AAAA,EAEV;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,kBAAkB,MAAsC;AAC9D,WAAO;AAAA;AAAA,gBAEK,SAAS;AAAA,MACf,iBAAiB;AAAA,MACjB,CAAC,UAAU,IAAI,EAAE,GAAG;AAAA,MACpB,kBAAkB;AAAA,IAAA,CACnB,CAAC;AAAA;AAAA;AAAA,kDAGwC,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,EAKpD;AAAA,EAEmB,WAAW,SAAqC;AACjE,UAAM,WAAW,OAAO;AAIxB,2BAAuB,qBAAqB,KAAK,OAAO,KAAK,SAAS;AACtE,gCAA4B,qBAAqB,KAAK,cAAc;AAAA,EACtE;AAAA,EAES,SAAS;AAChB,UAAM,YAAY,KAAK;AACvB,UAAM,WAAW,KAAK,YAAY;AAGlC,UAAM,iBACJ,YACA,KAAK,WACJ,KAAK,aAAa,aACjB,KAAK,aAAa,aAClB,KAAK,aAAa;AACtB,UAAM,SAAS,iBAAiB,qBAAqB,WAAW,KAAK;AACrE,UAAM,gBAAgB,KAAK;AAC3B,UAAM,aAAa,KAAK,cAAc,iBAAiB;AAIvD,UAAM,iBAAiB,KAAK,qBACxB,SACA,2BAA2B,KAAK,OAAO,KAAK,SAAS;AACzD,UAAM,YAAY,wBAAwB,KAAK,OAAO,KAAK,SAAS;AAGpE,UAAM,OAAO,KAAK,MACd,KAAK,UACL,aACG,aAAa,2BACd,mBAAmB,gBAAgB,aAAa;AAKtD,UAAM,YACJ,CAAC,KAAK,OACN,CAAC,cACD,KAAK,eACL,mBAAmB;AAGrB,UAAM,EAAC,MAAM,QAAQ,UAAA,IAAa,YAC9B,iBAAiB,MAAM,KAAK,iBAAiB,IAC7C,EAAC,MAAM,IAAI,QAAQ,IAAI,WAAW,KAAA;AAItC,UAAM,iBACJ,KAAK,iBACL,CAAC,cACD,SAAS,MACT,CAAC,UAAU,WAAW,GAAG;AAK3B,UAAM,eAAe,aAChB,KAAK,iBAAiB,KACvB,KAAK,cAAc,KAAK,eAAe,KAAK,YAAY;AAG5D,UAAM,WACJ,CAAC,cAAc,KAAK,iBAAiB,CAAC,aAAa,WAAW,GAAG,IAC7D,IAAI,YAAY,KAChB;AAEN,UAAM,QAAQ;AAAA;AAAA,gBAEF,SAAS;AAAA,MACf,OAAO;AAAA,MACP,CAAC,SAAS,KAAK,OAAO,EAAE,GAAG;AAAA,MAC3B,CAAC,QAAQ,KAAK,IAAI,EAAE,GAAG;AAAA,MACvB,CAAC,cAAc,SAAS,EAAE,GAAG;AAAA,MAC7B,CAAC,UAAU,KAAK,QAAQ,EAAE,GAAG;AAAA,MAC7B,iBAAiB,YAAY,KAAK;AAAA,MAClC,iBAAiB,KAAK;AAAA,MACtB,UAAU,KAAK;AAAA,MACf,aAAa,KAAK,cAAc;AAAA,MAChC,aAAa,KAAK,cAAc;AAAA,MAChC,GAAG,KAAK,mBAAA;AAAA,IAAmB,CAC5B,CAAC;AAAA,4BACkB,KAAK,OAAO;AAAA;AAAA,UAE9B,KAAK,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,oBAKP,SAAS;AAAA,0BACH,MAAM;AAAA,yBACP,KAAK,SAAS;AAAA,2BACZ,IAAI;AAAA;AAAA,cAEjB,IAAI,GAAG,iBACL,8DACA,OAAO,GAAG,SACV;AAAA,qBACK,MAAM;AAAA,qBAEX,OAAO,GAAG,SAAS;AAAA,cACrB,WAAW,2BAA2B,QAAQ,YAAY,OAAO;AAAA;AAAA,YAEnE,KAAK,YAAY,KAAK,kBAAkB,SAAS,IAAI,OAAO;AAAA;AAAA;AAAA;AAIpE,WAAO,mBAAmB,KAAK,SAAS,OAAO,KAAK;AAAA,EACtD;AAGF;AA1Wa,gBAyWK,SAAS,UAAU,cAAc;AAxWvB,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GADb,gBACe,WAAA,WAAA,CAAA;AAGA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAJb,gBAIe,WAAA,SAAA,CAAA;AAEA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GANb,gBAMe,WAAA,aAAA,CAAA;AAGA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GATb,gBASe,WAAA,QAAA,CAAA;AAEA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAXb,gBAWe,WAAA,aAAA,CAAA;AAEC,gBAAA;AAAA,EAA1B,SAAS,EAAC,MAAM,QAAA,CAAQ;AAAA,GAbd,gBAagB,WAAA,YAAA,CAAA;AAED,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAfb,gBAee,WAAA,UAAA,CAAA;AAGC,gBAAA;AAAA,EAA1B,SAAS,EAAC,MAAM,QAAA,CAAQ;AAAA,GAlBd,gBAkBgB,WAAA,aAAA,CAAA;AAEA,gBAAA;AAAA,EAA1B,SAAS,EAAC,MAAM,QAAA,CAAQ;AAAA,GApBd,gBAoBgB,WAAA,WAAA,CAAA;AAED,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAtBb,gBAsBe,WAAA,kBAAA,CAAA;AAEA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAxBb,gBAwBe,WAAA,aAAA,CAAA;AAEC,gBAAA;AAAA,EAA1B,SAAS,EAAC,MAAM,QAAA,CAAQ;AAAA,GA1Bd,gBA0BgB,WAAA,eAAA,CAAA;AAEA,gBAAA;AAAA,EAA1B,SAAS,EAAC,MAAM,QAAA,CAAQ;AAAA,GA5Bd,gBA4BgB,WAAA,iBAAA,CAAA;AAED,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GA9Bb,gBA8Be,WAAA,iBAAA,CAAA;AAEC,gBAAA;AAAA,EAA1B,SAAS,EAAC,MAAM,QAAA,CAAQ;AAAA,GAhCd,gBAgCgB,WAAA,OAAA,CAAA;AAED,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAlCb,gBAkCe,WAAA,WAAA,CAAA;AAEA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GApCb,gBAoCe,WAAA,aAAA,CAAA;AAGA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAvCb,gBAuCe,WAAA,YAAA,CAAA;AAGC,gBAAA;AAAA,EAA1B,SAAS,EAAC,MAAM,QAAA,CAAQ;AAAA,GA1Cd,gBA0CgB,WAAA,UAAA,CAAA;AAED,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GA5Cb,gBA4Ce,WAAA,eAAA,CAAA;AAKA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAjDb,gBAiDe,WAAA,SAAA,CAAA;AAEC,gBAAA;AAAA,EAA1B,SAAS,EAAC,MAAM,QAAA,CAAQ;AAAA,GAnDd,gBAmDgB,WAAA,YAAA,CAAA;AAED,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GArDb,gBAqDe,WAAA,aAAA,CAAA;AAGT,gBAAA;AAAA,EAAhB,MAAA;AAAM,GAxDI,gBAwDM,WAAA,mBAAA,CAAA;AAxDN,kBAAN,gBAAA;AAAA,EADN,cAAc,mBAAmB;AAAA,GACrB,eAAA;"}
@@ -362,8 +362,6 @@ obc-audio-recording-item {
362
362
  --on-normal-neutral-color: var(--element-inactive-color);
363
363
  }
364
364
 
365
- /* Visually hidden but accessible to screen readers */
366
-
367
365
  .visually-hidden {
368
366
  clip: rect(0 0 0 0);
369
367
  clip-path: inset(50%);
@@ -1 +1 @@
1
- {"version":3,"file":"textarea-field.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"textarea-field.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -58,7 +58,7 @@ export declare enum ObcTextboxFontWeight {
58
58
  *
59
59
  * @slot - The visible text content.
60
60
  * @slot length - Reserves a minimum width based on its content width.
61
- * @beta
61
+ * @stable
62
62
  */
63
63
  export declare class ObcTextbox extends LitElement {
64
64
  alignment: ObcTextboxAlignment;
@@ -1 +1 @@
1
- {"version":3,"file":"textbox.js","sources":["../../../src/components/textbox/textbox.ts"],"sourcesContent":["import {LitElement, html, unsafeCSS} from 'lit';\nimport {customElement} from '../../decorator.js';\nimport componentStyle from './textbox.css?inline';\nimport {property} from 'lit/decorators.js';\nimport {classMap} from 'lit/directives/class-map.js';\n\nexport enum ObcTextboxAlignment {\n Left = 'left',\n Center = 'center',\n Right = 'right',\n}\n\nexport enum ObcTextboxSize {\n xs = 'xs',\n s = 's',\n m = 'm',\n l = 'l',\n xl = 'xl',\n}\n\nexport enum ObcTextboxFontWeight {\n regular = 'regular',\n semibold = 'semibold',\n bold = 'bold',\n}\n\n/**\n * `<obc-textbox>` – A text container that renders inline text at a\n * precise, cap-height-trimmed size with configurable alignment and reservable\n * width.\n *\n * Use it to present short, read-only strings – such as values, labels, or\n * units – where vertical metrics must line up exactly across rows and the\n * horizontal footprint should stay stable while the text changes (for example\n * a numeric value that updates frequently). Synonyms: text container, value\n * box, label box.\n *\n * ## Features / Variants\n * - **Size:** `xs`, `s`, `m` (default), `l`, `xl` – each maps to a fixed box\n * height (16 / 20 / 24 / 32 / 40 px) with 4px padding above and below, giving\n * cap heights of 8 / 12 / 16 / 24 / 32 px so text aligns to a predictable\n * grid.\n * - **Font weight:** `regular` (default), `semibold`, `bold`.\n * - **Tabular numbers:** `tabularNums` (default off) renders digits as\n * fixed-width, lining numerals (`tabular-nums lining-nums` + the `ss04`/`tnum`/\n * `lnum` features) so numeric values stay column-aligned and stable in width\n * as they update – use it for readouts and other live numeric displays.\n * - **Alignment:** `left`, `center`, `right` (default) – positions the text\n * within the box's width when the box is wider than the content.\n * - **Reserved width:** content placed in the `length` slot reserves a minimum\n * width invisibly, so the box does not resize as the visible text changes.\n * The box always shows all content – it never crops.\n *\n * ## Usage Guidelines\n * - Pass the longest expected string to the `length` slot (e.g. `\"888.8\"` or\n * `\"Wind speed\"`) so the box reserves space and does not jump in width as the\n * visible value updates.\n * - This is a display primitive for static text – use an input component for\n * editable values.\n *\n * ## Slots\n * | Slot | Renders when… | Purpose |\n * |-----------|--------------------|------------------------------------------------------|\n * | (default) | Always | The visible text content. |\n * | `length` | Always (invisible) | Reserves a minimum width based on its content width. |\n *\n * @slot - The visible text content.\n * @slot length - Reserves a minimum width based on its content width.\n * @beta\n */\n@customElement('obc-textbox')\nexport class ObcTextbox extends LitElement {\n @property({type: String}) alignment: ObcTextboxAlignment =\n ObcTextboxAlignment.Right;\n @property({type: String}) size: ObcTextboxSize = ObcTextboxSize.m;\n @property({type: String}) fontWeight: ObcTextboxFontWeight =\n ObcTextboxFontWeight.regular;\n @property({type: Boolean}) tabularNums = false;\n\n override render() {\n return html`\n <div\n class=${classMap({\n wrapper: true,\n [`alignment-${this.alignment}`]: true,\n [`size-${this.size}`]: true,\n [`font-weight-${this.fontWeight}`]: true,\n 'tabular-nums': this.tabularNums,\n })}\n >\n <div class=\"inner-wrapper\">\n <div class=\"content\">\n <slot></slot>\n </div>\n </div>\n <div class=\"length-spacer\" aria-hidden=\"true\">\n <slot name=\"length\"></slot>\n </div>\n </div>\n `;\n }\n\n static override styles = unsafeCSS(componentStyle);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-textbox': ObcTextbox;\n }\n}\n"],"names":["ObcTextboxAlignment","ObcTextboxSize","ObcTextboxFontWeight"],"mappings":";;;;;;;;;;;;;;;AAMO,IAAK,wCAAAA,yBAAL;AACLA,uBAAA,MAAA,IAAO;AACPA,uBAAA,QAAA,IAAS;AACTA,uBAAA,OAAA,IAAQ;AAHE,SAAAA;AAAA,GAAA,uBAAA,CAAA,CAAA;AAML,IAAK,mCAAAC,oBAAL;AACLA,kBAAA,IAAA,IAAK;AACLA,kBAAA,GAAA,IAAI;AACJA,kBAAA,GAAA,IAAI;AACJA,kBAAA,GAAA,IAAI;AACJA,kBAAA,IAAA,IAAK;AALK,SAAAA;AAAA,GAAA,kBAAA,CAAA,CAAA;AAQL,IAAK,yCAAAC,0BAAL;AACLA,wBAAA,SAAA,IAAU;AACVA,wBAAA,UAAA,IAAW;AACXA,wBAAA,MAAA,IAAO;AAHG,SAAAA;AAAA,GAAA,wBAAA,CAAA,CAAA;AAmDL,IAAM,aAAN,cAAyB,WAAW;AAAA,EAApC,cAAA;AAAA,UAAA,GAAA,SAAA;AACqB,SAAA,YACxB;AACwB,SAAA,OAAuB;AACvB,SAAA,aACxB;AACyB,SAAA,cAAc;AAAA,EAAA;AAAA,EAEhC,SAAS;AAChB,WAAO;AAAA;AAAA,gBAEK,SAAS;AAAA,MACf,SAAS;AAAA,MACT,CAAC,aAAa,KAAK,SAAS,EAAE,GAAG;AAAA,MACjC,CAAC,QAAQ,KAAK,IAAI,EAAE,GAAG;AAAA,MACvB,CAAC,eAAe,KAAK,UAAU,EAAE,GAAG;AAAA,MACpC,gBAAgB,KAAK;AAAA,IAAA,CACtB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYR;AAGF;AAhCa,WA+BK,SAAS,UAAU,cAAc;AA9BvB,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GADb,WACe,WAAA,aAAA,CAAA;AAEA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAHb,WAGe,WAAA,QAAA,CAAA;AACA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAJb,WAIe,WAAA,cAAA,CAAA;AAEC,gBAAA;AAAA,EAA1B,SAAS,EAAC,MAAM,QAAA,CAAQ;AAAA,GANd,WAMgB,WAAA,eAAA,CAAA;AANhB,aAAN,gBAAA;AAAA,EADN,cAAc,aAAa;AAAA,GACf,UAAA;"}
1
+ {"version":3,"file":"textbox.js","sources":["../../../src/components/textbox/textbox.ts"],"sourcesContent":["import {LitElement, html, unsafeCSS} from 'lit';\nimport {customElement} from '../../decorator.js';\nimport componentStyle from './textbox.css?inline';\nimport {property} from 'lit/decorators.js';\nimport {classMap} from 'lit/directives/class-map.js';\n\nexport enum ObcTextboxAlignment {\n Left = 'left',\n Center = 'center',\n Right = 'right',\n}\n\nexport enum ObcTextboxSize {\n xs = 'xs',\n s = 's',\n m = 'm',\n l = 'l',\n xl = 'xl',\n}\n\nexport enum ObcTextboxFontWeight {\n regular = 'regular',\n semibold = 'semibold',\n bold = 'bold',\n}\n\n/**\n * `<obc-textbox>` – A text container that renders inline text at a\n * precise, cap-height-trimmed size with configurable alignment and reservable\n * width.\n *\n * Use it to present short, read-only strings – such as values, labels, or\n * units – where vertical metrics must line up exactly across rows and the\n * horizontal footprint should stay stable while the text changes (for example\n * a numeric value that updates frequently). Synonyms: text container, value\n * box, label box.\n *\n * ## Features / Variants\n * - **Size:** `xs`, `s`, `m` (default), `l`, `xl` – each maps to a fixed box\n * height (16 / 20 / 24 / 32 / 40 px) with 4px padding above and below, giving\n * cap heights of 8 / 12 / 16 / 24 / 32 px so text aligns to a predictable\n * grid.\n * - **Font weight:** `regular` (default), `semibold`, `bold`.\n * - **Tabular numbers:** `tabularNums` (default off) renders digits as\n * fixed-width, lining numerals (`tabular-nums lining-nums` + the `ss04`/`tnum`/\n * `lnum` features) so numeric values stay column-aligned and stable in width\n * as they update – use it for readouts and other live numeric displays.\n * - **Alignment:** `left`, `center`, `right` (default) – positions the text\n * within the box's width when the box is wider than the content.\n * - **Reserved width:** content placed in the `length` slot reserves a minimum\n * width invisibly, so the box does not resize as the visible text changes.\n * The box always shows all content – it never crops.\n *\n * ## Usage Guidelines\n * - Pass the longest expected string to the `length` slot (e.g. `\"888.8\"` or\n * `\"Wind speed\"`) so the box reserves space and does not jump in width as the\n * visible value updates.\n * - This is a display primitive for static text – use an input component for\n * editable values.\n *\n * ## Slots\n * | Slot | Renders when… | Purpose |\n * |-----------|--------------------|------------------------------------------------------|\n * | (default) | Always | The visible text content. |\n * | `length` | Always (invisible) | Reserves a minimum width based on its content width. |\n *\n * @slot - The visible text content.\n * @slot length - Reserves a minimum width based on its content width.\n * @stable\n */\n@customElement('obc-textbox')\nexport class ObcTextbox extends LitElement {\n @property({type: String}) alignment: ObcTextboxAlignment =\n ObcTextboxAlignment.Right;\n @property({type: String}) size: ObcTextboxSize = ObcTextboxSize.m;\n @property({type: String}) fontWeight: ObcTextboxFontWeight =\n ObcTextboxFontWeight.regular;\n @property({type: Boolean}) tabularNums = false;\n\n override render() {\n return html`\n <div\n class=${classMap({\n wrapper: true,\n [`alignment-${this.alignment}`]: true,\n [`size-${this.size}`]: true,\n [`font-weight-${this.fontWeight}`]: true,\n 'tabular-nums': this.tabularNums,\n })}\n >\n <div class=\"inner-wrapper\">\n <div class=\"content\">\n <slot></slot>\n </div>\n </div>\n <div class=\"length-spacer\" aria-hidden=\"true\">\n <slot name=\"length\"></slot>\n </div>\n </div>\n `;\n }\n\n static override styles = unsafeCSS(componentStyle);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-textbox': ObcTextbox;\n }\n}\n"],"names":["ObcTextboxAlignment","ObcTextboxSize","ObcTextboxFontWeight"],"mappings":";;;;;;;;;;;;;;;AAMO,IAAK,wCAAAA,yBAAL;AACLA,uBAAA,MAAA,IAAO;AACPA,uBAAA,QAAA,IAAS;AACTA,uBAAA,OAAA,IAAQ;AAHE,SAAAA;AAAA,GAAA,uBAAA,CAAA,CAAA;AAML,IAAK,mCAAAC,oBAAL;AACLA,kBAAA,IAAA,IAAK;AACLA,kBAAA,GAAA,IAAI;AACJA,kBAAA,GAAA,IAAI;AACJA,kBAAA,GAAA,IAAI;AACJA,kBAAA,IAAA,IAAK;AALK,SAAAA;AAAA,GAAA,kBAAA,CAAA,CAAA;AAQL,IAAK,yCAAAC,0BAAL;AACLA,wBAAA,SAAA,IAAU;AACVA,wBAAA,UAAA,IAAW;AACXA,wBAAA,MAAA,IAAO;AAHG,SAAAA;AAAA,GAAA,wBAAA,CAAA,CAAA;AAmDL,IAAM,aAAN,cAAyB,WAAW;AAAA,EAApC,cAAA;AAAA,UAAA,GAAA,SAAA;AACqB,SAAA,YACxB;AACwB,SAAA,OAAuB;AACvB,SAAA,aACxB;AACyB,SAAA,cAAc;AAAA,EAAA;AAAA,EAEhC,SAAS;AAChB,WAAO;AAAA;AAAA,gBAEK,SAAS;AAAA,MACf,SAAS;AAAA,MACT,CAAC,aAAa,KAAK,SAAS,EAAE,GAAG;AAAA,MACjC,CAAC,QAAQ,KAAK,IAAI,EAAE,GAAG;AAAA,MACvB,CAAC,eAAe,KAAK,UAAU,EAAE,GAAG;AAAA,MACpC,gBAAgB,KAAK;AAAA,IAAA,CACtB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYR;AAGF;AAhCa,WA+BK,SAAS,UAAU,cAAc;AA9BvB,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GADb,WACe,WAAA,aAAA,CAAA;AAEA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAHb,WAGe,WAAA,QAAA,CAAA;AACA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAJb,WAIe,WAAA,cAAA,CAAA;AAEC,gBAAA;AAAA,EAA1B,SAAS,EAAC,MAAM,QAAA,CAAQ;AAAA,GANd,WAMgB,WAAA,eAAA,CAAA;AANhB,aAAN,gBAAA;AAAA,EADN,cAAc,aAAa;AAAA,GACf,UAAA;"}
@@ -226,7 +226,7 @@ export interface ReadoutSourceOptions extends ReadoutSrcOptions {
226
226
  * @slot src-picker-content - Provides the source picker context menu content.
227
227
  * @fires {CustomEvent<{value: string, label?: string}>} source-change - Fired when a source picker option is selected.
228
228
  * @fires {CustomEvent<{src: string}>} source-flyout-click - Fired when the source row is clicked while `srcOptions.interaction == 'flyout'`.
229
- * @beta
229
+ * @stable
230
230
  */
231
231
  export declare class ObcReadout extends LitElement {
232
232
  label?: string;