@skra/ui 0.2.0

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 (160) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +7 -0
  3. package/README.md +39 -0
  4. package/consumer-guide/README.md +84 -0
  5. package/consumer-guide/accessible-names.md +80 -0
  6. package/consumer-guide/forms-and-binding.md +149 -0
  7. package/consumer-guide/layout.md +86 -0
  8. package/consumer-guide/overlays.md +100 -0
  9. package/consumer-guide/setup-and-gotchas.md +103 -0
  10. package/consumer-guide/theming-and-encapsulation.md +115 -0
  11. package/consumer-guide/wrapping-patterns.md +90 -0
  12. package/fesm2022/skra-ui-accordion.mjs +333 -0
  13. package/fesm2022/skra-ui-accordion.mjs.map +1 -0
  14. package/fesm2022/skra-ui-alert.mjs +110 -0
  15. package/fesm2022/skra-ui-alert.mjs.map +1 -0
  16. package/fesm2022/skra-ui-avatar.mjs +83 -0
  17. package/fesm2022/skra-ui-avatar.mjs.map +1 -0
  18. package/fesm2022/skra-ui-badge.mjs +91 -0
  19. package/fesm2022/skra-ui-badge.mjs.map +1 -0
  20. package/fesm2022/skra-ui-button.mjs +67 -0
  21. package/fesm2022/skra-ui-button.mjs.map +1 -0
  22. package/fesm2022/skra-ui-checkbox.mjs +98 -0
  23. package/fesm2022/skra-ui-checkbox.mjs.map +1 -0
  24. package/fesm2022/skra-ui-chip.mjs +82 -0
  25. package/fesm2022/skra-ui-chip.mjs.map +1 -0
  26. package/fesm2022/skra-ui-combobox.mjs +335 -0
  27. package/fesm2022/skra-ui-combobox.mjs.map +1 -0
  28. package/fesm2022/skra-ui-core.mjs +529 -0
  29. package/fesm2022/skra-ui-core.mjs.map +1 -0
  30. package/fesm2022/skra-ui-counter.mjs +53 -0
  31. package/fesm2022/skra-ui-counter.mjs.map +1 -0
  32. package/fesm2022/skra-ui-datepicker.mjs +867 -0
  33. package/fesm2022/skra-ui-datepicker.mjs.map +1 -0
  34. package/fesm2022/skra-ui-dialog.mjs +133 -0
  35. package/fesm2022/skra-ui-dialog.mjs.map +1 -0
  36. package/fesm2022/skra-ui-field.mjs +293 -0
  37. package/fesm2022/skra-ui-field.mjs.map +1 -0
  38. package/fesm2022/skra-ui-icon.mjs +54 -0
  39. package/fesm2022/skra-ui-icon.mjs.map +1 -0
  40. package/fesm2022/skra-ui-input.mjs +42 -0
  41. package/fesm2022/skra-ui-input.mjs.map +1 -0
  42. package/fesm2022/skra-ui-kbd.mjs +44 -0
  43. package/fesm2022/skra-ui-kbd.mjs.map +1 -0
  44. package/fesm2022/skra-ui-layout.mjs +119 -0
  45. package/fesm2022/skra-ui-layout.mjs.map +1 -0
  46. package/fesm2022/skra-ui-link.mjs +29 -0
  47. package/fesm2022/skra-ui-link.mjs.map +1 -0
  48. package/fesm2022/skra-ui-loading-indicator.mjs +24 -0
  49. package/fesm2022/skra-ui-loading-indicator.mjs.map +1 -0
  50. package/fesm2022/skra-ui-menu.mjs +334 -0
  51. package/fesm2022/skra-ui-menu.mjs.map +1 -0
  52. package/fesm2022/skra-ui-multi-select.mjs +179 -0
  53. package/fesm2022/skra-ui-multi-select.mjs.map +1 -0
  54. package/fesm2022/skra-ui-native-select.mjs +123 -0
  55. package/fesm2022/skra-ui-native-select.mjs.map +1 -0
  56. package/fesm2022/skra-ui-popover.mjs +158 -0
  57. package/fesm2022/skra-ui-popover.mjs.map +1 -0
  58. package/fesm2022/skra-ui-progress.mjs +57 -0
  59. package/fesm2022/skra-ui-progress.mjs.map +1 -0
  60. package/fesm2022/skra-ui-radio.mjs +92 -0
  61. package/fesm2022/skra-ui-radio.mjs.map +1 -0
  62. package/fesm2022/skra-ui-rating-display.mjs +81 -0
  63. package/fesm2022/skra-ui-rating-display.mjs.map +1 -0
  64. package/fesm2022/skra-ui-select.mjs +151 -0
  65. package/fesm2022/skra-ui-select.mjs.map +1 -0
  66. package/fesm2022/skra-ui-skeleton.mjs +65 -0
  67. package/fesm2022/skra-ui-skeleton.mjs.map +1 -0
  68. package/fesm2022/skra-ui-star-rating.mjs +110 -0
  69. package/fesm2022/skra-ui-star-rating.mjs.map +1 -0
  70. package/fesm2022/skra-ui-status-dot.mjs +61 -0
  71. package/fesm2022/skra-ui-status-dot.mjs.map +1 -0
  72. package/fesm2022/skra-ui-switch.mjs +94 -0
  73. package/fesm2022/skra-ui-switch.mjs.map +1 -0
  74. package/fesm2022/skra-ui-tabs.mjs +356 -0
  75. package/fesm2022/skra-ui-tabs.mjs.map +1 -0
  76. package/fesm2022/skra-ui-textarea.mjs +81 -0
  77. package/fesm2022/skra-ui-textarea.mjs.map +1 -0
  78. package/fesm2022/skra-ui-toast.mjs +208 -0
  79. package/fesm2022/skra-ui-toast.mjs.map +1 -0
  80. package/fesm2022/skra-ui-tooltip.mjs +252 -0
  81. package/fesm2022/skra-ui-tooltip.mjs.map +1 -0
  82. package/fesm2022/skra-ui-typography.mjs +35 -0
  83. package/fesm2022/skra-ui-typography.mjs.map +1 -0
  84. package/fesm2022/skra-ui.mjs +4 -0
  85. package/fesm2022/skra-ui.mjs.map +1 -0
  86. package/package.json +175 -0
  87. package/types/skra-ui-accordion.d.ts +196 -0
  88. package/types/skra-ui-accordion.d.ts.map +1 -0
  89. package/types/skra-ui-alert.d.ts +81 -0
  90. package/types/skra-ui-alert.d.ts.map +1 -0
  91. package/types/skra-ui-avatar.d.ts +71 -0
  92. package/types/skra-ui-avatar.d.ts.map +1 -0
  93. package/types/skra-ui-badge.d.ts +73 -0
  94. package/types/skra-ui-badge.d.ts.map +1 -0
  95. package/types/skra-ui-button.d.ts +45 -0
  96. package/types/skra-ui-button.d.ts.map +1 -0
  97. package/types/skra-ui-checkbox.d.ts +52 -0
  98. package/types/skra-ui-checkbox.d.ts.map +1 -0
  99. package/types/skra-ui-chip.d.ts +60 -0
  100. package/types/skra-ui-chip.d.ts.map +1 -0
  101. package/types/skra-ui-combobox.d.ts +95 -0
  102. package/types/skra-ui-combobox.d.ts.map +1 -0
  103. package/types/skra-ui-core.d.ts +314 -0
  104. package/types/skra-ui-core.d.ts.map +1 -0
  105. package/types/skra-ui-counter.d.ts +33 -0
  106. package/types/skra-ui-counter.d.ts.map +1 -0
  107. package/types/skra-ui-datepicker.d.ts +164 -0
  108. package/types/skra-ui-datepicker.d.ts.map +1 -0
  109. package/types/skra-ui-dialog.d.ts +59 -0
  110. package/types/skra-ui-dialog.d.ts.map +1 -0
  111. package/types/skra-ui-field.d.ts +181 -0
  112. package/types/skra-ui-field.d.ts.map +1 -0
  113. package/types/skra-ui-icon.d.ts +38 -0
  114. package/types/skra-ui-icon.d.ts.map +1 -0
  115. package/types/skra-ui-input.d.ts +22 -0
  116. package/types/skra-ui-input.d.ts.map +1 -0
  117. package/types/skra-ui-kbd.d.ts +33 -0
  118. package/types/skra-ui-kbd.d.ts.map +1 -0
  119. package/types/skra-ui-layout.d.ts +86 -0
  120. package/types/skra-ui-layout.d.ts.map +1 -0
  121. package/types/skra-ui-link.d.ts +20 -0
  122. package/types/skra-ui-link.d.ts.map +1 -0
  123. package/types/skra-ui-loading-indicator.d.ts +9 -0
  124. package/types/skra-ui-loading-indicator.d.ts.map +1 -0
  125. package/types/skra-ui-menu.d.ts +116 -0
  126. package/types/skra-ui-menu.d.ts.map +1 -0
  127. package/types/skra-ui-multi-select.d.ts +47 -0
  128. package/types/skra-ui-multi-select.d.ts.map +1 -0
  129. package/types/skra-ui-native-select.d.ts +74 -0
  130. package/types/skra-ui-native-select.d.ts.map +1 -0
  131. package/types/skra-ui-popover.d.ts +57 -0
  132. package/types/skra-ui-popover.d.ts.map +1 -0
  133. package/types/skra-ui-progress.d.ts +41 -0
  134. package/types/skra-ui-progress.d.ts.map +1 -0
  135. package/types/skra-ui-radio.d.ts +54 -0
  136. package/types/skra-ui-radio.d.ts.map +1 -0
  137. package/types/skra-ui-rating-display.d.ts +56 -0
  138. package/types/skra-ui-rating-display.d.ts.map +1 -0
  139. package/types/skra-ui-select.d.ts +43 -0
  140. package/types/skra-ui-select.d.ts.map +1 -0
  141. package/types/skra-ui-skeleton.d.ts +42 -0
  142. package/types/skra-ui-skeleton.d.ts.map +1 -0
  143. package/types/skra-ui-star-rating.d.ts +71 -0
  144. package/types/skra-ui-star-rating.d.ts.map +1 -0
  145. package/types/skra-ui-status-dot.d.ts +62 -0
  146. package/types/skra-ui-status-dot.d.ts.map +1 -0
  147. package/types/skra-ui-switch.d.ts +54 -0
  148. package/types/skra-ui-switch.d.ts.map +1 -0
  149. package/types/skra-ui-tabs.d.ts +191 -0
  150. package/types/skra-ui-tabs.d.ts.map +1 -0
  151. package/types/skra-ui-textarea.d.ts +55 -0
  152. package/types/skra-ui-textarea.d.ts.map +1 -0
  153. package/types/skra-ui-toast.d.ts +140 -0
  154. package/types/skra-ui-toast.d.ts.map +1 -0
  155. package/types/skra-ui-tooltip.d.ts +90 -0
  156. package/types/skra-ui-tooltip.d.ts.map +1 -0
  157. package/types/skra-ui-typography.d.ts +17 -0
  158. package/types/skra-ui-typography.d.ts.map +1 -0
  159. package/types/skra-ui.d.ts +3 -0
  160. package/types/skra-ui.d.ts.map +1 -0
@@ -0,0 +1,54 @@
1
+ import { SkraFieldContext } from '@skra/ui/field';
2
+ import * as i0 from '@angular/core';
3
+
4
+ /**
5
+ * Wires a native `<input type="checkbox">` to the **switch** role + skin when inside
6
+ * `<skra-field>` (ADR 013), or standalone with no cascade. Per ADR 039/040, Forge ships
7
+ * no `<skra-switch>` wrapper — this is a Component-on-the-native-host (`<input>` is void →
8
+ * `template: ''`, ADR 040 §2) carrying its own `switch.scss` via Emulated encapsulation. The
9
+ * ADR 039 revision history named this exact pattern as the future switch primitive.
10
+ *
11
+ * **The directive SETS `role="switch"`** (it is not part of the selector) — the consumer must
12
+ * not be asked to repeat an obvious, required ARIA role. No native HTML element produces switch
13
+ * semantics, so `role="switch"` is the legitimate ARIA mechanism (native-attr-first rule 2). The
14
+ * browser maps the native checked state to `aria-checked` (on/off) under this role.
15
+ *
16
+ * <!-- inside Field -->
17
+ * <skra-field>
18
+ * <input type="checkbox" skraSwitch [checked]="x()" (change)="x.set($any($event.target).checked)" />
19
+ * <label skraLabelFor>Enable notifications</label>
20
+ * </skra-field>
21
+ *
22
+ * <!-- standalone (label wraps input — no id/for needed) -->
23
+ * <label>
24
+ * <input type="checkbox" skraSwitch [checked]="x()" (change)="x.set($any($event.target).checked)" />
25
+ * Dark mode
26
+ * </label>
27
+ *
28
+ * Value channel stays consumer-owned per ADR 037 (native `[checked]` + `(change)`, Reactive
29
+ * Forms `formControlName`, Signal Forms `[formField]`, or `[(ngModel)]` — all orthogonal). Toggle
30
+ * state is NOT reflected as `data-skra-*` (that would require Forge to observe native state,
31
+ * violating ADR 037); the skin keys off the native `:checked` pseudo-class.
32
+ *
33
+ * Distinct from `skraCheckbox` (the atom-granularity split): a switch is strictly binary —
34
+ * `role="switch"` forbids `aria-checked="mixed"`, so there is **no `indeterminate` input**.
35
+ */
36
+ declare class SkraSwitch {
37
+ private readonly el;
38
+ readonly context: SkraFieldContext | null;
39
+ constructor();
40
+ /**
41
+ * Readonly enforcement — native checkbox has no `[readonly]`, so without this the
42
+ * `aria-readonly` we announce would be a lie (the user could still toggle it).
43
+ * `preventDefault` on `click` blocks the toggle from both pointer and Space (keyboard
44
+ * activation dispatches a click on form controls). Mirrors the checkbox/radio guards.
45
+ */
46
+ protected blockWhenReadonly(event: Event): void;
47
+ /** Block keyboard activation (Space) when readonly; let `Tab` through. */
48
+ protected blockKeyWhenReadonly(event: KeyboardEvent): void;
49
+ static ɵfac: i0.ɵɵFactoryDeclaration<SkraSwitch, never>;
50
+ static ɵcmp: i0.ɵɵComponentDeclaration<SkraSwitch, "input[type=\"checkbox\"][skraSwitch]", never, {}, {}, never, never, true, never>;
51
+ }
52
+
53
+ export { SkraSwitch };
54
+ //# sourceMappingURL=skra-ui-switch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skra-ui-switch.d.ts","sources":["../../../../libs/ui/switch/src/lib/switch/switch.ts"],"mappings":";;;AAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BG;AACH,cAqBa,UAAU;AACrB;sBACgB,gBAAA;;AAiBhB;;;;;AAKG;AACH,uCAAmC,KAAK;;AAKxC,0CAAsC,aAAa;yCA9BxC,UAAU;2CAAV,UAAU;AAmCtB;;;;","names":[]}
@@ -0,0 +1,191 @@
1
+ import * as _angular_core from '@angular/core';
2
+
3
+ /**
4
+ * SkraTabs — the WAI-ARIA APG **Tabs** coordinator. A directive on a wrapping element that holds a
5
+ * `[skraTablist]` (the `role="tablist"` with its `button[skraTab]` children) and the
6
+ * `[skraTabPanel]` panels as DI descendants. It provides `SkraTabsContext` (the ADR 013 §3.6 non-form
7
+ * Contextual-ID-Sync bus), owns the consumer-facing `[selected]` / `(selectedChange)` (controlled,
8
+ * ADR 037 — NO internal selection state) and `[activation]`, and drives the roving-tabindex keyboard
9
+ * (`SkraTabsKeyboard` → CDK `FocusKeyManager`).
10
+ *
11
+ * <div skraTabs [selected]="tab()" (selectedChange)="tab.set($event)">
12
+ * <div skraTablist aria-label="Account">
13
+ * <button skraTab value="profile">Profile</button>
14
+ * <button skraTab value="security">Security</button>
15
+ * </div>
16
+ * <div skraTabPanel value="profile">…</div>
17
+ * <div skraTabPanel value="security">…</div>
18
+ * </div>
19
+ *
20
+ * Selection is consumer-owned: a click / Enter / Space / (automatic) arrow emits `(selectedChange)`;
21
+ * the visible selection updates when the consumer round-trips `[selected]`. The roving focus position
22
+ * (`tabindex="0"`) is component-owned UI state — it moves immediately, independent of `[selected]`.
23
+ *
24
+ * Full contract: adr/specs/component-tabs-spec.md.
25
+ */
26
+ declare class SkraTabs {
27
+ /** Consumer-owned selection key (matches a tab's `value`); '' / no-match → nothing selected (ADR 037). */
28
+ readonly selected: _angular_core.InputSignal<string>;
29
+ /** Automatic (selection follows roving focus) | manual (Enter/Space selects). */
30
+ readonly activation: _angular_core.InputSignal<"automatic" | "manual">;
31
+ /** Fires ONLY on user activation — never on a programmatic `[selected]` change. */
32
+ readonly selectedChange: _angular_core.OutputEmitterRef<string>;
33
+ private readonly ctx;
34
+ private readonly tabs;
35
+ private readonly panels;
36
+ private readonly keyboard;
37
+ constructor();
38
+ /** Seat the roving stop (`tabindex="0"`) on a real, enabled tab: the selected one if valid, else the
39
+ * first enabled tab (APG — the tablist must always have exactly one tab stop). */
40
+ private reseat;
41
+ /** A tab was activated (click / Enter / Space / automatic arrow). Move the roving stop immediately
42
+ * (UI state), then REQUEST selection from the consumer — never mutate selection internally (ADR 037). */
43
+ private selectTab;
44
+ private onTablistKeydown;
45
+ /** Dev-only nudge: every tab needs a panel of the same `value`, and vice-versa (aria-controls / -labelledby). */
46
+ private warnMismatches;
47
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SkraTabs, never>;
48
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SkraTabs, "[skraTabs]", ["skraTabs"], { "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "activation": { "alias": "activation"; "required": false; "isSignal": true; }; }, { "selectedChange": "selectedChange"; }, ["tabs", "panels"], never, true, never>;
49
+ }
50
+
51
+ /**
52
+ * SkraTablist — the `role="tablist"` container, a Component on the consumer's `<div skraTablist>`
53
+ * (ADR 040, `template: '<ng-content>'` so the projected `button[skraTab]` children render). It carries
54
+ * the rail styling and forwards its `keydown` to the coordinator's roving keyboard (`SkraTabsKeyboard`)
55
+ * via the `SkraTabsContext` bus. Name it for AT with consumer `aria-label`/`aria-labelledby` (ADR 033).
56
+ */
57
+ declare class SkraTablist {
58
+ private readonly ctx;
59
+ constructor();
60
+ protected onKeydown(event: KeyboardEvent): void;
61
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SkraTablist, never>;
62
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SkraTablist, "[skraTablist]", ["skraTablist"], {}, {}, never, ["*"], true, never>;
63
+ }
64
+
65
+ /**
66
+ * The tab shape the keyboard controller drives. Structurally a CDK `FocusableOption`
67
+ * (`focus()`), plus the tabs' own `getValue()` (roving↔selection mapping) and `isDisabled()`
68
+ * (disabled tabs are SKIPPED in the roving order, unlike menu items). Declared HERE —
69
+ * cdk-free — so the only `@angular/cdk` importer stays `tabs-keyboard.ts` (ADR 0044 §7).
70
+ */
71
+ interface SkraTabKeyItem {
72
+ focus(): void;
73
+ isDisabled(): boolean;
74
+ getValue(): string;
75
+ }
76
+
77
+ /**
78
+ * SkraTab — a single tab, a Component on the native command host `button[skraTab]` (ADR 012/040:
79
+ * a `<button>` gives Enter/Space→click + focusability for free; its implicit role is overridden to
80
+ * `role="tab"`, the precedent set by `button[skraMenuItem]`).
81
+ *
82
+ * Roving tabindex: `tabindex="0"` only when this tab is the roving stop (`SkraTabsContext.activeValue`),
83
+ * else `-1` — the controller (`SkraTabsKeyboard`) moves real focus. `aria-selected` reflects the
84
+ * consumer-owned selection (`[selected]`), NOT the roving focus — and is the source of truth for the
85
+ * selected STYLE too (CSS keys off `:host([aria-selected="true"])`; no `data-skra-*`). On activation it
86
+ * REQUESTS selection from the coordinator (`ctx.select`) — it never mutates selection itself (ADR 037).
87
+ *
88
+ * **Disabled is native-attr-first (boundary #9): the consumer sets the native `disabled` attribute** —
89
+ * Forge OBSERVES it (no `disabled` input). A disabled tab is SKIPPED in the roving order (APG).
90
+ */
91
+ declare class SkraTab implements SkraTabKeyItem {
92
+ /** Selection key — matched against `skraTabs [selected]` and the owning panel's `value`. */
93
+ readonly value: _angular_core.InputSignal<string>;
94
+ private readonly host;
95
+ private readonly ctx;
96
+ protected readonly tabId: _angular_core.Signal<string | null>;
97
+ protected readonly panelId: _angular_core.Signal<string | null>;
98
+ protected readonly ariaSelected: _angular_core.Signal<"true" | "false">;
99
+ protected readonly tabindex: _angular_core.Signal<"0" | "-1" | null>;
100
+ constructor();
101
+ focus(): void;
102
+ /** Disabled tabs are skipped in the roving order — read live off the native attribute (no input). */
103
+ isDisabled(): boolean;
104
+ getValue(): string;
105
+ protected onClick(): void;
106
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SkraTab, never>;
107
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SkraTab, "button[skraTab]", ["skraTab"], { "value": { "alias": "value"; "required": true; "isSignal": true; }; }, {}, never, ["*"], true, never>;
108
+ }
109
+
110
+ /**
111
+ * SkraTabPanel — the `role="tabpanel"` for one tab, a Component on the consumer's `<div skraTabPanel>`
112
+ * (ADR 040, `template: '<ng-content>'` so the panel body renders). It is focusable (`tabindex="0"`, APG —
113
+ * keyboard users Tab from the active tab into its content), auto-named by `aria-labelledby`→its tab, and
114
+ * `hidden` when its `value` is not the selected one (removed from the a11y tree; stays in the DOM — lazy
115
+ * mounting is the consumer's own `@if` on the content).
116
+ */
117
+ declare class SkraTabPanel {
118
+ /** Selection key — matched against the owning `button[skraTab]`'s `value`. */
119
+ readonly value: _angular_core.InputSignal<string>;
120
+ private readonly ctx;
121
+ protected readonly panelId: _angular_core.Signal<string | null>;
122
+ protected readonly tabId: _angular_core.Signal<string | null>;
123
+ /** `''` (attribute present) when not selected → hidden; `null` (absent) when selected → shown. */
124
+ protected readonly hidden: _angular_core.Signal<"" | null>;
125
+ constructor();
126
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SkraTabPanel, never>;
127
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SkraTabPanel, "[skraTabPanel]", ["skraTabPanel"], { "value": { "alias": "value"; "required": true; "isSignal": true; }; }, {}, never, ["*"], true, never>;
128
+ }
129
+
130
+ /**
131
+ * DI Context provided per `[skraTabs]` instance — the ADR 013 §3.6 **non-form** Contextual-ID-Sync
132
+ * bus wiring `tab` ↔ `tabpanel`. It carries **IDs + derived, read-only interaction state only**
133
+ * (`selected` mirrors the consumer's `[selected]`; `activeValue` is the roving-focus position). It
134
+ * **never owns value** — selection stays consumer-owned (ADR 037); a tab requests a change through
135
+ * `select()`, which the coordinator implements and from which it emits `(selectedChange)`.
136
+ */
137
+ declare class SkraTabsContext {
138
+ /** Unique per `[skraTabs]` — the prefix for every tab/panel id in this group. */
139
+ private readonly baseId;
140
+ /** Mirror of the consumer's `[selected]` — drives `aria-selected` + panel visibility (read-only to children). */
141
+ readonly selected: _angular_core.WritableSignal<string>;
142
+ /** Roving-focus position — the value of the tab that currently carries `tabindex="0"` (read-only to children). */
143
+ readonly activeValue: _angular_core.WritableSignal<string>;
144
+ /** Activation model (read-only to children). */
145
+ readonly activation: _angular_core.WritableSignal<"automatic" | "manual">;
146
+ tabId(value: string): string;
147
+ panelId(value: string): string;
148
+ isSelected(value: string): boolean;
149
+ /** Coordinator-assigned: a tab/keyboard requests selection (the coordinator emits `(selectedChange)`). */
150
+ select: (value: string) => void;
151
+ /** Coordinator-assigned: the tablist forwards its `keydown` here (routed to the keyboard controller). */
152
+ handleKeydown: (event: KeyboardEvent) => void;
153
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SkraTabsContext, never>;
154
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<SkraTabsContext>;
155
+ }
156
+
157
+ /**
158
+ * SkraTabsKeyboard — the WAI-ARIA APG **Tabs** roving-tabindex keyboard model, confined to ONE file.
159
+ *
160
+ * This is the **only** module in `@skra/navigation` that imports `@angular/cdk` (ADR 0044 §7,
161
+ * generalized library-wide 2026-06-19). It wraps CDK `FocusKeyManager` (roving REAL focus) so the
162
+ * engine is swappable in one file — exactly as `SkraMenuKeyboard` does for the menu. Unlike the menu,
163
+ * tabs use **horizontal** orientation (Left/Right) and **skip** disabled tabs.
164
+ *
165
+ * Owns: Left/Right roving (wrap), Home/End. Enter/Space (native button activation) and selection are
166
+ * the coordinator's job — the controller only moves focus and reports the active tab's value.
167
+ */
168
+ declare class SkraTabsKeyboard {
169
+ private manager?;
170
+ private items;
171
+ /**
172
+ * (Re)build the manager from the current projected tab set. Called from an `effect` on the signal
173
+ * `contentChildren` — a passed array is a static snapshot, so the manager is rebuilt whenever the
174
+ * tab set changes (the documented signal↔CDK seam, mirroring `menu-keyboard.ts`).
175
+ */
176
+ setItems(items: readonly SkraTabKeyItem[]): void;
177
+ /** Delegate Left/Right/Home/End. Enter/Space/Tab are intentionally left to the platform/coordinator. */
178
+ onKeydown(event: KeyboardEvent): void;
179
+ /** The value of the tab the manager currently considers active (focused after `onKeydown`). */
180
+ activeValue(): string | undefined;
181
+ /** Sync the manager's active index to a value WITHOUT moving focus (after a click / on init). */
182
+ setActive(value: string): void;
183
+ /** The first non-disabled tab's value (the roving stop when nothing is selected) — APG. */
184
+ firstEnabledValue(): string | undefined;
185
+ hasValue(value: string): boolean;
186
+ destroy(): void;
187
+ }
188
+
189
+ export { SkraTab, SkraTabPanel, SkraTablist, SkraTabs, SkraTabsContext, SkraTabsKeyboard };
190
+ export type { SkraTabKeyItem };
191
+ //# sourceMappingURL=skra-ui-tabs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skra-ui-tabs.d.ts","sources":["../../../../libs/ui/tabs/src/lib/tabs/tabs.ts","../../../../libs/ui/tabs/src/lib/tabs/tablist.ts","../../../../libs/ui/tabs/src/lib/tabs/tabs-types.ts","../../../../libs/ui/tabs/src/lib/tabs/tab.ts","../../../../libs/ui/tabs/src/lib/tabs/tab-panel.ts","../../../../libs/ui/tabs/src/lib/tabs/tabs-context.ts","../../../../libs/ui/tabs/src/lib/tabs/tabs-keyboard.ts"],"mappings":";;AAiBA;;;;;;;;;;;;;;;;;;;;;;AAsBG;AACH,cAMa,QAAQ;;uBAEF,aAAA,CAAA,WAAA;;yBAEE,aAAA,CAAA,WAAA;;6BAEI,aAAA,CAAA,gBAAA;AAEvB;AACA;AACA;AAGA;;AAyBA;AACkF;AAClF;AASA;AACyG;AACzG;AAOA;;AAWA;oDArEW,QAAQ;sDAAR,QAAQ;AAqFpB;;ACxHD;;;;;AAKG;AACH,cAca,WAAW;AACtB;;AAaA,+BAA2B,aAAa;oDAd7B,WAAW;sDAAX,WAAW;AAiBvB;;AChDD;;;;;AAKG;UACc,cAAc;;;;AAI9B;;ACKD;;;;;;;;;;;;;AAaG;AACH,cAkBa,OAAQ,YAAW,cAAc;;oBAE9B,aAAA,CAAA,WAAA;AAEd;AACA;AAEA,8BAAwB,aAAA,CAAA,MAAA;AAGxB,gCAA0B,aAAA,CAAA,MAAA;AAG1B,qCAA+B,aAAA,CAAA,MAAA;AAG/B,iCAA2B,aAAA,CAAA,MAAA;;AAiB3B;;AAIA;AAGA;;oDAxCW,OAAO;sDAAP,OAAO;AAgDnB;;AClFD;;;;;;AAMG;AACH,cAgBa,YAAY;;oBAET,aAAA,CAAA,WAAA;AAEd;AAEA,gCAA0B,aAAA,CAAA,MAAA;AAG1B,8BAAwB,aAAA,CAAA,MAAA;;AAIxB,+BAAyB,aAAA,CAAA,MAAA;;oDAbd,YAAY;sDAAZ,YAAY;AA2BxB;;AClDD;;;;;;AAMG;AACH,cACa,eAAe;;AAE1B;;uBAGiB,aAAA,CAAA,cAAA;;0BAEG,aAAA,CAAA,cAAA;;yBAED,aAAA,CAAA,cAAA;AAEnB;AAGA;AAGA;;AAKA;;AAEA,2BAAuB,aAAa;oDAxBzB,eAAe;wDAAf,eAAe;AAyB3B;;AC1CD;;;;;;;;;;AAUG;AACH,cAAa,gBAAgB;;;AAI3B;;;;AAIG;AACH,6BAAyB,cAAc;;AAYvC,qBAAiB,aAAa;;;;AAU9B;;;AAUA;AAIA;AAID;;;;","names":[]}
@@ -0,0 +1,55 @@
1
+ import { SkraFieldContext } from '@skra/ui/field';
2
+ import * as i0 from '@angular/core';
3
+
4
+ /**
5
+ * `textarea[skraTextarea]` — multiline text atom. Per ADR 040 this is a
6
+ * Component-on-a-native-host carrying its own host-scoped CSS (`textarea.scss`)
7
+ * via Emulated encapsulation, replacing the ADR 038 slice branch.
8
+ *
9
+ * `<textarea>` is a content-bearing host (its value is its text content), so the
10
+ * template MUST be `<ng-content>` — `template: ''` would discard the consumer's
11
+ * initial text. See ADR 040 §2.
12
+ *
13
+ * Sibling atom to SkraInput — split per atom-granularity rule (memory
14
+ * `feedback_atom_granularity.md`): textarea has capabilities `<input>` does not
15
+ * (multi-line content, native `rows` / `cols`, autosize composition via the
16
+ * sibling `[skraAutoResize]` directive).
17
+ *
18
+ * <skra-field>
19
+ * <label skraLabelFor>Bio</label>
20
+ * <textarea skraTextarea skraAutoResize rows="3"></textarea>
21
+ * </skra-field>
22
+ *
23
+ * Native `rows` / `cols` remain the consumer-facing sizing primitives — Forge
24
+ * does not duplicate them as Angular inputs (boundary #9 native-attr-first).
25
+ */
26
+ declare class SkraTextarea {
27
+ readonly context: SkraFieldContext;
28
+ static ɵfac: i0.ɵɵFactoryDeclaration<SkraTextarea, never>;
29
+ static ɵcmp: i0.ɵɵComponentDeclaration<SkraTextarea, "textarea[skraTextarea]", never, {}, {}, never, ["*"], true, never>;
30
+ }
31
+
32
+ /**
33
+ * Marker directive enabling content-driven sizing on a native form control via
34
+ * the modern CSS `field-sizing: content` declaration shipped from the skin's
35
+ * global utilities layer (`tokens/skins/skra/utilities.scss`).
36
+ *
37
+ * <textarea skraTextarea skraAutoResize rows="2"></textarea>
38
+ * <input skraInput skraAutoResize type="text" />
39
+ *
40
+ * Composition-over-configuration: the host opts in by adding the attribute,
41
+ * not by toggling a boolean Angular input. The directive has no host bindings,
42
+ * no DI, and no template — its sole job is to make the selector available at
43
+ * Angular's compilation stage; CSS does the rest.
44
+ *
45
+ * Wide selector (textarea + input) reflects that `field-sizing: content` is a
46
+ * native CSS capability for both: textarea grows in block-size with rows,
47
+ * input grows in inline-size with content width.
48
+ */
49
+ declare class SkraAutoResizeDirective {
50
+ static ɵfac: i0.ɵɵFactoryDeclaration<SkraAutoResizeDirective, never>;
51
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SkraAutoResizeDirective, "textarea[skraAutoResize], input[skraAutoResize]", never, {}, {}, never, never, true, never>;
52
+ }
53
+
54
+ export { SkraAutoResizeDirective, SkraTextarea };
55
+ //# sourceMappingURL=skra-ui-textarea.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skra-ui-textarea.d.ts","sources":["../../../../libs/ui/textarea/src/lib/textarea/textarea.ts","../../../../libs/ui/textarea/src/lib/auto-resize/auto-resize.directive.ts"],"mappings":";;;AAQA;;;;;;;;;;;;;;;;;;;;;AAqBG;AACH,cAoBa,YAAY;sBACP,gBAAA;yCADL,YAAY;2CAAZ,YAAY;AAExB;;AClDD;;;;;;;;;;;;;;;;AAgBG;AACH,cAIa,uBAAuB;yCAAvB,uBAAuB;2CAAvB,uBAAuB;AAAG;;;;","names":[]}
@@ -0,0 +1,140 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { InjectionToken } from '@angular/core';
3
+
4
+ /**
5
+ * Marker directive for the leading icon slot of `<skra-toast>`.
6
+ * Detected via `contentChild` (ADR 020 Smart Slots v2.0) to toggle the icon
7
+ * wrapper without emitting an empty DOM node. Feedback-local (not the button
8
+ * lib's `[skra-start]`) to avoid a cross-lib marker dependency — mirrors
9
+ * `[skra-alert-icon]` / `[skra-badge-icon]`.
10
+ */
11
+ declare class SkraToastIcon {
12
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SkraToastIcon, never>;
13
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SkraToastIcon, "[skra-toast-icon]", never, {}, {}, never, never, true, never>;
14
+ }
15
+
16
+ /**
17
+ * ToastIntent — semantic feedback meaning (ADR 035 §3.1, downward subset). Excludes the
18
+ * action intents `primary`/`secondary`. Same enum as Alert/Badge.
19
+ */
20
+ type ToastIntent = 'neutral' | 'info' | 'success' | 'warning' | 'danger';
21
+ /** ToastEmphasis — `high` = filled, `medium` = soft. `low` deferred (ADR 035 §3.1). */
22
+ type ToastEmphasis = 'high' | 'medium';
23
+ /**
24
+ * ToastLive — screen-reader announcement politeness (ADR 0052). For Toast the politeness
25
+ * is routed to the REGION's announcer (ADR 0052 §7); it does NOT set a role on this host.
26
+ * Default `polite` (toasts are always dynamically presented — ADR 0052 §4). `assertive`
27
+ * for error toasts, set explicitly by the consumer — NEVER auto-derived from `intent`.
28
+ */
29
+ type ToastLive = 'off' | 'polite' | 'assertive';
30
+ /**
31
+ * `<skra-toast>` — an ephemeral, auto-dismissing feedback message rendered inside a
32
+ * `<skra-toast-region>` top-layer stack (Feedback/Status family, ADR 0052; Tier 2 overlay,
33
+ * ADR 0044). Visually an Alert (intent×emphasis seam, 4th consumer) with a timer.
34
+ *
35
+ * Announcement (ADR 0052 §7): this host carries NO `role`/`aria-live`. On appearance the
36
+ * toast pushes its message text into the region's persistent role-only announcer via the
37
+ * injected `SkraToastAnnouncer`, at the politeness of `live` (`off` → no announcement).
38
+ *
39
+ * Auto-dismiss (WCAG 2.2.1): after `duration` ms the toast emits `(dismissed)`. The timer
40
+ * PAUSES on hover and on focus-within and resumes with the remaining time; `duration=0`
41
+ * disables it (persistent — pair with `dismissible`). Forge does NOT self-remove — the
42
+ * consumer removes the model from its array on `(dismissed)` (agnostic doctrine; the Alert
43
+ * precedent). `(dismissed)` is the single removal channel (timer elapse OR close control).
44
+ */
45
+ declare class SkraToast {
46
+ readonly intent: _angular_core.InputSignal<ToastIntent>;
47
+ readonly emphasis: _angular_core.InputSignal<ToastEmphasis>;
48
+ readonly live: _angular_core.InputSignal<ToastLive>;
49
+ readonly duration: _angular_core.InputSignal<number>;
50
+ readonly dismissible: _angular_core.InputSignalWithTransform<boolean, unknown>;
51
+ readonly dismissed: _angular_core.OutputEmitterRef<void>;
52
+ readonly iconSlot: _angular_core.Signal<SkraToastIcon | undefined>;
53
+ readonly hasIcon: _angular_core.Signal<boolean>;
54
+ /** The message column — its text is the announcement (excludes the icon + sr-only close label). */
55
+ private readonly contentRef;
56
+ private readonly announcer;
57
+ private timerId;
58
+ private remaining;
59
+ private startedAt;
60
+ constructor();
61
+ protected onDismiss(): void;
62
+ /** Pause the countdown, banking the remaining time (WCAG 2.2.1). */
63
+ protected pause(): void;
64
+ /** Resume the countdown with the banked remaining time. */
65
+ protected resume(): void;
66
+ private start;
67
+ private clear;
68
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SkraToast, never>;
69
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SkraToast, "skra-toast", never, { "intent": { "alias": "intent"; "required": false; "isSignal": true; }; "emphasis": { "alias": "emphasis"; "required": false; "isSignal": true; }; "live": { "alias": "live"; "required": false; "isSignal": true; }; "duration": { "alias": "duration"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; }, { "dismissed": "dismissed"; }, ["iconSlot"], ["[skra-toast-icon]", "*", "[skra-toast-close-label]"], true, never>;
70
+ }
71
+
72
+ /**
73
+ * Politeness routed to the toast region's role-only announcer (ADR 0052 §7).
74
+ * `off` never reaches the announcer (no announcement), so the seam only carries
75
+ * the two announced levels.
76
+ */
77
+ type SkraToastPoliteness = 'polite' | 'assertive';
78
+ /**
79
+ * The ADR 0052 §7 announcement seam. Provided by `<skra-toast-region>` and injected
80
+ * (optionally) by each projected `<skra-toast>`. The toast pushes its message text on
81
+ * appearance; the region writes it into the matching PERSISTENT, role-only announcer
82
+ * (`role="status"` for polite / `role="alert"` for assertive) — never a role/`aria-live`
83
+ * on the ephemeral toast host. This is why a live region pre-exists the content it
84
+ * announces (WCAG 4.1.3): the announcers are rendered from the region's first render.
85
+ *
86
+ * Narrow seam (like `SkraSelectPanel` / `SkraFieldContext`): the toast depends on the
87
+ * interface, not the concrete region. Content-projected toasts inject from their DECLARED
88
+ * parent element (= the region), the same DI mechanism as `SkraFieldContext` (ADR 013).
89
+ */
90
+ interface SkraToastAnnouncer {
91
+ /** Announce `text` at the given politeness by writing it into the matching live region. */
92
+ announce(text: string, politeness: SkraToastPoliteness): void;
93
+ }
94
+ declare const SKRA_TOAST_ANNOUNCER: InjectionToken<SkraToastAnnouncer>;
95
+
96
+ /**
97
+ * ToastPlacement — viewport corner, logical (RTL-correct). `block-start`/`block-end` = the
98
+ * top/bottom edge; `inline-start`/`center`/`inline-end` = the horizontal position.
99
+ */
100
+ type ToastPlacement = 'block-start inline-start' | 'block-start center' | 'block-start inline-end' | 'block-end inline-start' | 'block-end center' | 'block-end inline-end';
101
+ /**
102
+ * `<skra-toast-region>` — the persistent, app-root manager for `<skra-toast>` (ADR 0044 §7
103
+ * non-anchored top-layer; ADR 0052 §7 announcer). Place ONCE near the app root; the consumer
104
+ * projects its own `@for` of toast models into it and owns the array (agnostic doctrine —
105
+ * a `ToastService` push/remove helper is a consumer recipe, NOT shipped here).
106
+ *
107
+ * Two mechanisms:
108
+ * - Announcement (ADR 0052 §7): provides `SkraToastAnnouncer` + renders TWO persistent,
109
+ * visually-hidden, role-only announcers (`role="status"` polite / `role="alert"` assertive).
110
+ * A toast pushes its text on appearance; identical repeated messages re-announce via a
111
+ * clear-then-set across two frames (forces a live-region mutation).
112
+ * - Top layer (ADR 0044 §7): a SINGLE `popover="manual"` stack (not `auto` — no light-dismiss /
113
+ * Escape collapse; not N popovers). Shown when non-empty; RE-ASSERTS top-layer order on each
114
+ * addition (`hidePopover()`+`showPopover()`) so a toast raised over an open modal `<dialog>`
115
+ * paints above it. Paint-only — never moves focus, never disturbs the dialog. Zero z-index.
116
+ */
117
+ declare class SkraToastRegion implements SkraToastAnnouncer {
118
+ readonly placement: _angular_core.InputSignal<ToastPlacement>;
119
+ /** The two persistent role-only announcer buffers (ADR 0052 §7). */
120
+ protected readonly politeMsg: _angular_core.WritableSignal<string>;
121
+ protected readonly assertiveMsg: _angular_core.WritableSignal<string>;
122
+ private readonly toasts;
123
+ private readonly stackEl;
124
+ /** Tracked locally — jsdom/SSR have no `:popover-open`; never read it back. */
125
+ private shown;
126
+ private prevCount;
127
+ constructor();
128
+ /**
129
+ * ADR 0052 §7 — write `text` into the matching persistent announcer. Clear-then-set across two
130
+ * animation frames so a repeated IDENTICAL message still mutates the live region and re-announces
131
+ * (the "repeated action" case). `off` toasts never call this.
132
+ */
133
+ announce(text: string, politeness: SkraToastPoliteness): void;
134
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SkraToastRegion, never>;
135
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SkraToastRegion, "skra-toast-region", never, { "placement": { "alias": "placement"; "required": false; "isSignal": true; }; }, {}, ["toasts"], ["*"], true, never>;
136
+ }
137
+
138
+ export { SKRA_TOAST_ANNOUNCER, SkraToast, SkraToastIcon, SkraToastRegion };
139
+ export type { SkraToastAnnouncer, SkraToastPoliteness, ToastEmphasis, ToastIntent, ToastLive, ToastPlacement };
140
+ //# sourceMappingURL=skra-ui-toast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skra-ui-toast.d.ts","sources":["../../../../libs/ui/toast/src/lib/toast.directives.ts","../../../../libs/ui/toast/src/lib/toast/toast.ts","../../../../libs/ui/toast/src/lib/toast/toast-announcer.ts","../../../../libs/ui/toast/src/lib/toast/toast-region.ts"],"mappings":";;;AAEA;;;;;;AAMG;AACH,cAIa,aAAa;oDAAb,aAAa;sDAAb,aAAa;AAAG;;ACQ7B;;;AAGG;AACG,KAAM,WAAW;AAEvB;KACY,aAAa;AAEzB;;;;;AAKG;AACG,KAAM,SAAS;AAErB;;;;;;;;;;;;;;AAcG;AACH,cAsBa,SAAS;qBAEL,aAAA,CAAA,WAAA,CAAA,WAAA;uBACE,aAAA,CAAA,WAAA,CAAA,aAAA;mBAGJ,aAAA,CAAA,WAAA,CAAA,SAAA;uBAGI,aAAA,CAAA,WAAA;0BACG,aAAA,CAAA,wBAAA;wBACF,aAAA,CAAA,gBAAA;uBAGD,aAAA,CAAA,MAAA,CAAA,aAAA;sBACD,aAAA,CAAA,MAAA;;AAGhB;AAGA;;;;;;;;;;AA0CA;AASA;oDAxEW,SAAS;sDAAT,SAAS;AA8ErB;;ACvJD;;;;AAIG;KACS,mBAAmB;AAE/B;;;;;;;;;;;AAWG;UACc,kBAAkB;;uCAEE,mBAAmB;AACvD;AAED,cAAa,oBAAoB,EAAA,cAAA,CAAA,kBAAA;;ACRjC;;;AAGG;AACG,KAAM,cAAc;AAQ1B;;;;;;;;;;;;;;;AAeG;AACH,cAYa,eAAgB,YAAW,kBAAkB;wBACtC,aAAA,CAAA,WAAA,CAAA,cAAA;;AAGlB,kCAA4B,aAAA,CAAA,cAAA;AAC5B,qCAA+B,aAAA,CAAA,cAAA;AAE/B;AACA;;;;;AAmCA;;;;AAIG;uCACgC,mBAAmB;oDAhD3C,eAAe;sDAAf,eAAe;AAsD3B;;;;","names":[]}
@@ -0,0 +1,90 @@
1
+ import * as i0 from '@angular/core';
2
+ import { SkraPlacement } from '@skra/ui/core';
3
+ export { SkraPlacement } from '@skra/ui/core';
4
+
5
+ /**
6
+ * SkraTooltip — a supplementary, non-interactive text description on a focusable trigger, shown on
7
+ * hover AND keyboard focus (ADR 0044 native top layer via the Popover API). Applied to the consumer's
8
+ * own trigger: `<button skraButton [skraTooltip]="'Settings'">`.
9
+ *
10
+ * The bulk of this directive is the WCAG 1.4.13 (Content on Hover or Focus) state machine — the
11
+ * platform's `popover="manual"` gives top-layer rendering but no dismiss/Escape, so Forge wires it:
12
+ * - Dismissible: Escape hides WITHOUT moving focus.
13
+ * - Hoverable: a hide grace-delay lets the pointer travel trigger→panel; hovering the panel keeps it.
14
+ * - Persistent: no auto-timeout.
15
+ * - Keyboard: focus shows immediately (no delay).
16
+ *
17
+ * Accessible-name contract (ADR 033, describedby-only): the tooltip is a DESCRIPTION, never the name —
18
+ * it MERGES its panel id into the trigger's `aria-describedby` (preserving any existing value) and
19
+ * removes only its own token on destroy. The trigger owns its own accessible name (an icon-only button
20
+ * still needs its own `aria-label`). No `ariaLabel` input, no `aria-labelledby` wiring.
21
+ *
22
+ * The panel is created EAGERLY (hidden) so `aria-describedby` resolves and a screen reader announces
23
+ * the description on first focus. Positioning is delegated to `SkraPositioner` (single JS path,
24
+ * geometry-only inline; ADR 0044 §3 rules 4–5). Full contract: adr/specs/component-tooltip-spec.md.
25
+ */
26
+ declare class SkraTooltip {
27
+ /** The tooltip text (bound as `[skraTooltip]="..."`). */
28
+ readonly skraTooltip: i0.InputSignal<string>;
29
+ /** Placement intent; `flip`/`shift` adjust at runtime. */
30
+ readonly placement: i0.InputSignal<SkraPlacement>;
31
+ private readonly host;
32
+ private readonly vcr;
33
+ private readonly renderer;
34
+ private readonly panelRef;
35
+ private readonly panelEl;
36
+ private readonly panelId;
37
+ private positioner?;
38
+ private showTimer?;
39
+ private hideTimer?;
40
+ private docEscapeUnlisten?;
41
+ private open;
42
+ private hovered;
43
+ private focused;
44
+ private panelHovered;
45
+ constructor();
46
+ protected onPointerEnter(): void;
47
+ protected onPointerLeave(): void;
48
+ protected onFocusIn(): void;
49
+ protected onFocusOut(): void;
50
+ private scheduleShow;
51
+ private scheduleHide;
52
+ private show;
53
+ private hide;
54
+ private wireDescribedBy;
55
+ private unwireDescribedBy;
56
+ private describedByTokens;
57
+ private cssTimeMs;
58
+ private cssLenPx;
59
+ private warnIfTriggerNotFocusable;
60
+ private teardown;
61
+ static ɵfac: i0.ɵɵFactoryDeclaration<SkraTooltip, never>;
62
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SkraTooltip, "[skraTooltip]", ["skraTooltip"], { "skraTooltip": { "alias": "skraTooltip"; "required": true; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
63
+ }
64
+
65
+ /**
66
+ * SkraTooltipPanel — the floating tooltip surface (ADR 0044 native top layer via the Popover API).
67
+ *
68
+ * INTERNAL: never placed by consumers in a template. `SkraTooltip` creates it programmatically with
69
+ * `ViewContainerRef.createComponent` (Angular-idiomatic, in-tree → inherits the design-context cascade
70
+ * + the O-8 Shadow-DOM bridge per ADR 0044 §3 rule 3) and drives `showPopover()`/`hidePopover()` on the
71
+ * host element.
72
+ *
73
+ * `popover="manual"` (NOT `auto`): a hover/focus tooltip's show/hide is Forge-owned, not click-toggle
74
+ * light-dismiss. `role="tooltip"` is the AT semantics; the trigger references this panel's `id` via
75
+ * `aria-describedby` (wired by the directive). The 13-axis Universal Surface (ADR 025) + motion live in
76
+ * `tooltip.scss`; geometry (`left`/`top` + `data-skra-placement`) is written by `SkraPositioner`.
77
+ *
78
+ * Full contract: adr/specs/component-tooltip-spec.md.
79
+ */
80
+ declare class SkraTooltipPanel {
81
+ /** Tooltip text; set by the directive and kept in sync. */
82
+ readonly text: i0.InputSignal<string>;
83
+ /** Stable unique id — target of the trigger's `aria-describedby`. */
84
+ readonly panelId: string;
85
+ static ɵfac: i0.ɵɵFactoryDeclaration<SkraTooltipPanel, never>;
86
+ static ɵcmp: i0.ɵɵComponentDeclaration<SkraTooltipPanel, "skra-tooltip-panel", never, { "text": { "alias": "text"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
87
+ }
88
+
89
+ export { SkraTooltip, SkraTooltipPanel };
90
+ //# sourceMappingURL=skra-ui-tooltip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skra-ui-tooltip.d.ts","sources":["../../../../libs/ui/tooltip/src/lib/tooltip/tooltip.ts","../../../../libs/ui/tooltip/src/lib/tooltip/tooltip-panel.ts"],"mappings":";;;;AA0BA;;;;;;;;;;;;;;;;;;;;AAoBG;AACH,cAWa,WAAW;;0BAEFA,EAAA,CAAA,WAAA;;wBAEFA,EAAA,CAAA,WAAA,CAAA,aAAA;AAElB;AACA;AACA;AAEA;AACA;AACA;;;;;;;;;;;;;;AAkEA;AAUA;AASA;AA8BA;AAcA;AAUA;AAkBA;AAOA;AAOA;AAWA;AAWA;yCA7MW,WAAW;2CAAX,WAAW;AAqNvB;;ACtQD;;;;;;;;;;;;;;AAcG;AACH,cAaa,gBAAgB;;mBAEdA,EAAA,CAAA,WAAA;;;yCAFF,gBAAgB;2CAAhB,gBAAgB;AAM5B;;;;","names":["_angular_core"]}
@@ -0,0 +1,17 @@
1
+ import * as _angular_core from '@angular/core';
2
+
3
+ type TypographyRole = 'display-large' | 'display-medium' | 'display-small' | 'headline-large' | 'headline-medium' | 'headline-small' | 'title-large' | 'title-medium' | 'title-small' | 'body-large' | 'body-medium' | 'body-small' | 'label-large' | 'label-medium' | 'label-small';
4
+ type TypographySeverity = 'error' | 'warning' | 'success';
5
+ type TypographyTruncate = 'single' | 'multi';
6
+ declare class SkraTypography {
7
+ readonly role: _angular_core.InputSignal<TypographyRole>;
8
+ readonly severity: _angular_core.InputSignal<TypographySeverity | null>;
9
+ readonly truncate: _angular_core.InputSignal<TypographyTruncate | null>;
10
+ readonly lineClamp: _angular_core.InputSignal<number>;
11
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SkraTypography, never>;
12
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SkraTypography, "[skraTypography]", never, { "role": { "alias": "skraTypography"; "required": false; "isSignal": true; }; "severity": { "alias": "severity"; "required": false; "isSignal": true; }; "truncate": { "alias": "truncate"; "required": false; "isSignal": true; }; "lineClamp": { "alias": "lineClamp"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
13
+ }
14
+
15
+ export { SkraTypography };
16
+ export type { TypographyRole, TypographySeverity, TypographyTruncate };
17
+ //# sourceMappingURL=skra-ui-typography.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skra-ui-typography.d.ts","sources":["../../../../libs/ui/typography/src/lib/typography/typography.ts"],"mappings":";;AAOM,KAAM,cAAc;AAiBpB,KAAM,kBAAkB;KAClB,kBAAkB;AAE9B,cAwBa,cAAc;mBACZ,aAAA,CAAA,WAAA,CAAA,cAAA;uBAGI,aAAA,CAAA,WAAA,CAAA,kBAAA;uBACA,aAAA,CAAA,WAAA,CAAA,kBAAA;wBACC,aAAA,CAAA,WAAA;oDANP,cAAc;sDAAd,cAAc;AAO1B;;;;","names":[]}
@@ -0,0 +1,3 @@
1
+
2
+ export { };
3
+ //# sourceMappingURL=skra-ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skra-ui.d.ts","sources":[],"mappings":"","names":[]}