@skra/ui 0.3.1 → 0.5.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 (66) hide show
  1. package/consumer-guide/README.md +2 -1
  2. package/consumer-guide/layout.md +79 -0
  3. package/consumer-guide/setup-and-gotchas.md +2 -2
  4. package/fesm2022/skra-ui-accordion.mjs +2 -2
  5. package/fesm2022/skra-ui-accordion.mjs.map +1 -1
  6. package/fesm2022/skra-ui-alert.mjs +2 -2
  7. package/fesm2022/skra-ui-alert.mjs.map +1 -1
  8. package/fesm2022/skra-ui-avatar.mjs.map +1 -1
  9. package/fesm2022/skra-ui-badge.mjs.map +1 -1
  10. package/fesm2022/skra-ui-button.mjs +2 -2
  11. package/fesm2022/skra-ui-button.mjs.map +1 -1
  12. package/fesm2022/skra-ui-checkbox.mjs +2 -2
  13. package/fesm2022/skra-ui-checkbox.mjs.map +1 -1
  14. package/fesm2022/skra-ui-chip.mjs +2 -2
  15. package/fesm2022/skra-ui-chip.mjs.map +1 -1
  16. package/fesm2022/skra-ui-combobox.mjs +120 -120
  17. package/fesm2022/skra-ui-combobox.mjs.map +1 -1
  18. package/fesm2022/skra-ui-core.mjs +36 -36
  19. package/fesm2022/skra-ui-core.mjs.map +1 -1
  20. package/fesm2022/skra-ui-counter.mjs.map +1 -1
  21. package/fesm2022/skra-ui-datepicker.mjs +605 -190
  22. package/fesm2022/skra-ui-datepicker.mjs.map +1 -1
  23. package/fesm2022/skra-ui-dialog.mjs.map +1 -1
  24. package/fesm2022/skra-ui-field.mjs.map +1 -1
  25. package/fesm2022/skra-ui-icon.mjs.map +1 -1
  26. package/fesm2022/skra-ui-input.mjs +2 -2
  27. package/fesm2022/skra-ui-input.mjs.map +1 -1
  28. package/fesm2022/skra-ui-kbd.mjs.map +1 -1
  29. package/fesm2022/skra-ui-layout.mjs +40 -1
  30. package/fesm2022/skra-ui-layout.mjs.map +1 -1
  31. package/fesm2022/skra-ui-link.mjs +2 -2
  32. package/fesm2022/skra-ui-link.mjs.map +1 -1
  33. package/fesm2022/skra-ui-loading-indicator.mjs.map +1 -1
  34. package/fesm2022/skra-ui-menu.mjs +2 -2
  35. package/fesm2022/skra-ui-menu.mjs.map +1 -1
  36. package/fesm2022/skra-ui-multi-select.mjs +94 -94
  37. package/fesm2022/skra-ui-multi-select.mjs.map +1 -1
  38. package/fesm2022/skra-ui-native-select.mjs +2 -2
  39. package/fesm2022/skra-ui-native-select.mjs.map +1 -1
  40. package/fesm2022/skra-ui-popover.mjs.map +1 -1
  41. package/fesm2022/skra-ui-progress.mjs.map +1 -1
  42. package/fesm2022/skra-ui-radio.mjs +2 -2
  43. package/fesm2022/skra-ui-radio.mjs.map +1 -1
  44. package/fesm2022/skra-ui-rating-display.mjs.map +1 -1
  45. package/fesm2022/skra-ui-select.mjs +92 -92
  46. package/fesm2022/skra-ui-select.mjs.map +1 -1
  47. package/fesm2022/skra-ui-skeleton.mjs +8 -8
  48. package/fesm2022/skra-ui-skeleton.mjs.map +1 -1
  49. package/fesm2022/skra-ui-star-rating.mjs +2 -2
  50. package/fesm2022/skra-ui-star-rating.mjs.map +1 -1
  51. package/fesm2022/skra-ui-status-dot.mjs.map +1 -1
  52. package/fesm2022/skra-ui-switch.mjs +2 -2
  53. package/fesm2022/skra-ui-switch.mjs.map +1 -1
  54. package/fesm2022/skra-ui-tabs.mjs +2 -2
  55. package/fesm2022/skra-ui-tabs.mjs.map +1 -1
  56. package/fesm2022/skra-ui-textarea.mjs +2 -2
  57. package/fesm2022/skra-ui-textarea.mjs.map +1 -1
  58. package/fesm2022/skra-ui-toast.mjs +2 -2
  59. package/fesm2022/skra-ui-toast.mjs.map +1 -1
  60. package/fesm2022/skra-ui-tooltip.mjs.map +1 -1
  61. package/fesm2022/skra-ui-typography.mjs.map +1 -1
  62. package/package.json +2 -2
  63. package/types/skra-ui-datepicker.d.ts +146 -46
  64. package/types/skra-ui-datepicker.d.ts.map +1 -1
  65. package/types/skra-ui-layout.d.ts +33 -2
  66. package/types/skra-ui-layout.d.ts.map +1 -1
@@ -10,40 +10,70 @@ interface WeekdayHeader {
10
10
  readonly long: string;
11
11
  }
12
12
 
13
- interface DayCell {
13
+ /** The granularity of the emitted value (ADR 0057 R1). `'year'` is reserved, not yet implemented. */
14
+ type SkraDatePrecision = 'day' | 'month';
15
+
16
+ /**
17
+ * One cell of the calendar grid — a day in `day` view, a month in `month` view. ONE model for both
18
+ * (ADR 0057 R8): the views differ in what a cell means, never in how a cell behaves.
19
+ */
20
+ interface GridCell {
14
21
  readonly key: string;
22
+ /** The value this cell commits, at the active precision. `null` = layout padding (day view only). */
15
23
  readonly iso: string | null;
16
- readonly dayNum: string;
17
- readonly srName: string;
24
+ /** Visible text — the localized day number, or the localized full month name. */
25
+ readonly label: string;
26
+ /**
27
+ * The ADR 033 Path-2 `[skra-sr-only]` extension, INCLUDING its leading separator, and never a
28
+ * restatement of `label` (ADR 0057 R6).
29
+ */
30
+ readonly srExt: string;
18
31
  readonly today: boolean;
19
32
  readonly selected: boolean;
20
33
  readonly disabled: boolean;
21
34
  readonly focused: boolean;
22
35
  }
23
- interface WeekRow {
36
+ interface GridRow {
24
37
  readonly key: number;
25
- readonly days: DayCell[];
38
+ readonly cells: GridCell[];
26
39
  }
27
40
  /**
28
- * SkraDatePicker — pick a single **calendar date** from an APG Date Picker grid in the native top layer.
29
- * Second Tier-3 component. A value-display **trigger** (`<button>`) opens a non-modal top-layer **calendar
30
- * panel** (Popover API, `popover="auto"`, ADR 0044). The value is an **ISO 8601 date-only string**
31
- * (`YYYY-MM-DD`), consumer-owned (ADR 0050/037 — NO `@angular/forms`); all date math is the zoneless
32
- * UTC-calculator discipline in `calendar-math` (no date library). Localization (month/weekday names,
33
- * first-day-of-week, digits) is `Intl`-derived in `calendar-intl`; the 2-D grid keyboard is the
34
- * hand-rolled `SkraCalendarKeyboard` (ADR 0044 §7 — roving REAL focus, not aria-activedescendant).
41
+ * SkraDatePicker — pick a **calendar date** or a **calendar month** from an APG Date Picker grid in the
42
+ * native top layer. Second Tier-3 component. A value-display **trigger** (`<button>`) opens a non-modal
43
+ * top-layer **calendar panel** (Popover API, `popover="auto"`, ADR 0044). The value is an **ISO 8601 string**
44
+ * truncated to the active `precision` (`YYYY-MM-DD` / `YYYY-MM`), consumer-owned (ADR 0050/0057/037 — NO
45
+ * `@angular/forms`); all date math is the zoneless UTC-calculator discipline in `calendar-math` (no date
46
+ * library). Localization (month/weekday names, first-day-of-week, digits) is `Intl`-derived in
47
+ * `calendar-intl`; the 2-D grid keyboard is the hand-rolled `SkraCalendarKeyboard` (ADR 0044 §7 — roving
48
+ * REAL focus, not aria-activedescendant).
49
+ *
50
+ * **Precision is a runtime axis, not a second component (ADR 0057).** `precision="month"` swaps the 7×N day
51
+ * grid for a 3×4 quarter-aligned month grid inside the SAME trigger, panel, positioner, field DI wiring,
52
+ * dismissal model, selection model and keyboard controller. The value channel does not widen — `YYYY-MM` is
53
+ * a truncation of `YYYY-MM-DD`, both `string` — which is exactly why this is an input and cardinality
54
+ * (ADR 0046) is not. `week` / `time` / `datetime-local` are excluded by rule (ADR 0057 R5): they need a
55
+ * second calendar coordinate system or are not grids at all, and stay the native `skraInput` path.
35
56
  *
36
- * No projected content: the calendar days are GENERATED (the structural divergence from select/combobox —
37
- * there is no `skra-option` reuse). The only focusable element in the open panel is the roving day cell;
38
- * the month-nav buttons are pointer affordances (`tabindex="-1"`, driven by PageUp/PageDown on keyboard),
39
- * and Tab dismisses — so no focus-containment machinery is needed (spec Q-1).
57
+ * No projected content: the cells are GENERATED (the structural divergence from select/combobox — there is
58
+ * no `skra-option` reuse). The only focusable element in the open panel is the roving cell; the period-nav
59
+ * buttons are pointer affordances (`tabindex="-1"`, driven by PageUp/PageDown on keyboard), and Tab
60
+ * dismisses — so no focus-containment machinery is needed (spec Q-1).
40
61
  *
41
62
  * Full contract: adr/specs/component-datepicker-spec.md.
42
63
  */
43
64
  declare class SkraDatePicker {
44
- /** Consumer-owned value: ISO 8601 date-only (`YYYY-MM-DD`); `''` = unset. NEVER a Date (ADR 0050/037). */
65
+ /**
66
+ * Consumer-owned value: an ISO 8601 key truncated to `precision` — `YYYY-MM-DD` (`day`) or `YYYY-MM`
67
+ * (`month`); `''` = unset. NEVER a Date (ADR 0050/0057/037).
68
+ */
45
69
  readonly value: _angular_core.InputSignal<string>;
46
- /** Inclusive lower bound (ISO); `''` = unbounded (ADR 0050 §2). */
70
+ /**
71
+ * Value granularity (ADR 0057 R1). `'day'` (default) emits `YYYY-MM-DD` over a 7×N day grid; `'month'`
72
+ * emits `YYYY-MM` over a 3×4 quarter-aligned month grid. NOT a look input, NOT a cardinality flag, and
73
+ * NOT reflected to a `data-skra-*` attribute — precision is configuration, not state.
74
+ */
75
+ readonly precision: _angular_core.InputSignal<SkraDatePrecision>;
76
+ /** Inclusive lower bound (ISO); `''` = unbounded (ADR 0050 §2, truncated to `precision` per ADR 0057 R4). */
47
77
  readonly min: _angular_core.InputSignal<string>;
48
78
  /** Inclusive upper bound (ISO); `''` = unbounded. */
49
79
  readonly max: _angular_core.InputSignal<string>;
@@ -58,7 +88,7 @@ declare class SkraDatePicker {
58
88
  /** Standalone availability source — `SkraFieldContext` wins when present. */
59
89
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
60
90
  readonly readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
61
- /** Fires ONLY on user date selection — never on a programmatic `value()` change (ADR 037/0050). */
91
+ /** Fires ONLY on user selection — never on a programmatic `value()`/`precision()` change (ADR 037/0057 R3). */
62
92
  readonly valueChange: _angular_core.OutputEmitterRef<string>;
63
93
  private readonly triggerRef;
64
94
  private readonly panelRef;
@@ -66,12 +96,28 @@ declare class SkraDatePicker {
66
96
  private readonly injector;
67
97
  private readonly keyboard;
68
98
  readonly panelId: string;
69
- readonly monthYearId: string;
99
+ readonly periodId: string;
70
100
  protected readonly isOpen: _angular_core.WritableSignal<boolean>;
101
+ /**
102
+ * Which grid is on screen. Seeded from `precision` and writable in between (ADR 0057 R9) so the deferred
103
+ * month/year quick-pick — stepping UP from the day grid to pick a month, then back down — is an additive
104
+ * change rather than a rewrite. In MVP nothing writes it, so `view() === precision()` always.
105
+ *
106
+ * NOTE for whoever lands quick-pick: it adds a second focusable element to the open panel and therefore
107
+ * RE-OPENS spec Q-1, which was resolved on the premise that the panel holds exactly one focusable stop
108
+ * and Tab dismisses. Re-resolve Q-1 first.
109
+ */
110
+ protected readonly view: _angular_core.WritableSignal<SkraDatePrecision>;
71
111
  /** Today's LOCAL date (ADR 0050 §3) — stable for the session. */
72
112
  private readonly todayIso;
73
- /** The roving-focus day; SINGLE source of truth for what the grid shows AND which cell is focusable. */
74
- private readonly focusedIso;
113
+ /** The roving-focus cell; SINGLE source of truth for what the grid shows AND which cell is focusable. */
114
+ private readonly focusedKey;
115
+ /**
116
+ * The focused key re-keyed to the active view. A `precision` flip while the panel is closed leaves a key
117
+ * at the previous granularity behind; re-keying defensively keeps every downstream `computed` total
118
+ * without an effect or a reset cascade. `onOpen` re-seeds properly from the value.
119
+ */
120
+ private readonly focusedAt;
75
121
  private positioner?;
76
122
  /** Set when a close should return focus to the trigger (keyboard/select), not on outside-click. */
77
123
  private returnFocus;
@@ -81,50 +127,80 @@ declare class SkraDatePicker {
81
127
  protected readonly isRequired: _angular_core.Signal<boolean>;
82
128
  protected readonly triggerId: _angular_core.Signal<string | null>;
83
129
  protected readonly describedBy: _angular_core.Signal<string | null>;
84
- /** The committed value, defensively normalized: invalid/out-of-range → `''` for display (ADR 0050 §1). */
85
- protected readonly selectedIso: _angular_core.Signal<string>;
130
+ /**
131
+ * The committed value, defensively normalized: wrong-format-for-precision, invalid or out-of-range → `''`
132
+ * for display (ADR 0050 §1 as amended by ADR 0057 R3). Keyed on `precision` (what the value IS), not on
133
+ * `view` (what is on screen) — the two only diverge once quick-pick lands.
134
+ */
135
+ protected readonly selectedKey: _angular_core.Signal<string>;
86
136
  protected readonly formattedValue: _angular_core.Signal<string>;
87
137
  private readonly firstDow;
88
- /** The month being shown — always the focused day's month (keeps the roving tabindex valid). */
89
- private readonly displayedMonth;
90
- protected readonly monthYearLabel: _angular_core.Signal<string>;
91
- protected readonly prevMonthLabel: _angular_core.Signal<string>;
92
- protected readonly nextMonthLabel: _angular_core.Signal<string>;
138
+ /**
139
+ * The container the grid shows — the focused cell's MONTH in day view, its YEAR in month view (`m` is
140
+ * then meaningless). Always derived from the focused cell, which keeps the roving tabindex valid.
141
+ */
142
+ private readonly displayed;
143
+ protected readonly periodLabel: _angular_core.Signal<string>;
144
+ protected readonly prevPeriodLabel: _angular_core.Signal<string>;
145
+ protected readonly nextPeriodLabel: _angular_core.Signal<string>;
146
+ /**
147
+ * `aria-current` token for the cell holding today. ARIA 1.2 has no `month` value, and `date` is
148
+ * defined as the current DATE within a collection of dates — accurate for a day cell, a stretch for a
149
+ * month cell, where the generic `true` ("current item within a set") is the honest mapping.
150
+ */
151
+ protected readonly currentToken: _angular_core.Signal<"true" | "date">;
93
152
  protected readonly weekdayHeadersView: _angular_core.Signal<WeekdayHeader[]>;
94
- protected readonly weeks: _angular_core.Signal<WeekRow[]>;
153
+ /** ONE grid renderer, parameterized by view — the ADR 0057 R8 claim, made structural. */
154
+ protected readonly rows: _angular_core.Signal<GridRow[]>;
95
155
  constructor();
156
+ /**
157
+ * The dev-mode diagnostic, or `null` when the inputs are coherent. Split out of the constructor so it
158
+ * is a plain reactive expression rather than a closure buried in a lifecycle hook.
159
+ */
160
+ private readonly devWarning;
96
161
  protected onTriggerClick(event: MouseEvent): void;
97
162
  protected onTriggerKeydown(event: KeyboardEvent): void;
98
163
  protected onGridKeydown(event: KeyboardEvent): void;
99
- protected goToPreviousMonth(): void;
100
- protected goToNextMonth(): void;
101
- protected selectDate(iso: string): void;
164
+ protected goToPreviousPeriod(): void;
165
+ protected goToNextPeriod(): void;
166
+ /** One period = one month (day view) / one year (month view). */
167
+ private stepPeriod;
168
+ protected selectCell(iso: string): void;
102
169
  protected onPanelToggle(event: Event): void;
103
170
  private onOpen;
104
171
  private onClose;
105
172
  private open;
106
173
  private close;
107
- /** Seed the focused day on open: the valid current value, else today, clamped into `[min,max]`. */
174
+ /** Seed the focused cell on open: the valid current value, else today, clamped into `[min,max]`. */
108
175
  private seedFocus;
109
- private monthOffsetLabel;
176
+ private buildDayRows;
177
+ private buildMonthRows;
178
+ /**
179
+ * The accessible-name separator is baked into the extension rather than left to the template or to the
180
+ * engine: `[skra-sr-only]` is absolutely positioned, so whether the name computation inserts a space
181
+ * between the visible text and the extension is engine-dependent. One explicit space, asserted by test.
182
+ */
183
+ private srExtension;
184
+ private periodOffsetLabel;
110
185
  private emptyCell;
111
186
  private scheduleFocus;
112
- private focusActiveDay;
187
+ private focusActiveCell;
113
188
  /** Read a length comp token (px/rem) off the panel computed style for the positioner. */
114
189
  private cssLenPx;
115
190
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SkraDatePicker, never>;
116
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SkraDatePicker, "skra-datepicker", ["skraDatePicker"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
191
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SkraDatePicker, "skra-datepicker", ["skraDatePicker"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "precision": { "alias": "precision"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
117
192
  }
118
193
 
119
194
  /**
120
195
  * The intent a key produces in the calendar grid. The controller is PURE (no DOM, no focus, no signals);
121
- * the `skra-datepicker` component applies the intent — sets `focusedIso`/`displayedMonth` and moves REAL
122
- * DOM focus (roving). `monthChanged` tells the component the grid will re-stamp so it must re-`focus()`.
196
+ * the `skra-datepicker` component applies the intent — sets `focusedKey`/the displayed period and moves REAL
197
+ * DOM focus (roving). The component re-focuses unconditionally after a `focus` intent, so the intent
198
+ * carries no "did the period change" hint: a field nothing reads is public API that only costs (dropped
199
+ * in the ADR 0057 review, together with its `monthChanged` predecessor).
123
200
  */
124
201
  type CalendarKeyIntent = {
125
202
  readonly type: 'focus';
126
203
  readonly iso: string;
127
- readonly monthChanged: boolean;
128
204
  } | {
129
205
  readonly type: 'select';
130
206
  } | {
@@ -133,20 +209,37 @@ type CalendarKeyIntent = {
133
209
  readonly type: 'none';
134
210
  };
135
211
  interface CalendarKeyContext {
136
- /** The currently focused day (ISO). */
212
+ /** The currently focused cell, as an ISO key AT `view` precision (`YYYY-MM-DD` or `YYYY-MM`). */
137
213
  readonly focusedIso: string;
138
- /** First day of week, ISO 1=Mon … 7=Sun (already resolved by `calendar-intl`). */
214
+ /** First day of week, ISO 1=Mon … 7=Sun (already resolved by `calendar-intl`). Day view only. */
139
215
  readonly firstDayOfWeek: number;
216
+ /** Which grid is on screen — the ADR 0057 precision axis. */
217
+ readonly view: SkraDatePrecision;
140
218
  }
141
219
  /**
142
220
  * SkraCalendarKeyboard — the WAI-ARIA APG **Date Picker Dialog** grid keyboard model (2-D), confined to
143
221
  * ONE file. The THIRD per-pattern keyboard controller and the FIRST that does NOT wrap a CDK key manager:
144
222
  * neither `FocusKeyManager` (Menu) nor `ActiveDescendantKeyManager` (Select/Combobox) models a 2-D grid
145
- * whose focusable cell set is recomputed on month change (ADR 0044 §7 note, 2026-06-14). Date arithmetic
223
+ * whose focusable cell set is recomputed on period change (ADR 0044 §7 note, 2026-06-14). Date arithmetic
146
224
  * is delegated to `calendar-math` (the ADR 0050 single math site); this controller only maps keys to
147
225
  * intents. Roving REAL focus (NOT `aria-activedescendant`) — the divergence from Select/Combobox.
148
226
  *
149
- * Navigation is unclamped (a user may move onto a disabled out-of-range day — APG-discoverable); only
227
+ * **One model, two unit sets (ADR 0057 R8).** The `day` and `month` views share every key, every intent and
228
+ * the whole `switch` below; they differ ONLY in what a step, a row and a page mean. That parameterization is
229
+ * the falsifiable claim behind treating precision as a runtime axis rather than a second component — if this
230
+ * ever needs a second `resolve`, the classification was wrong and the feature splits.
231
+ *
232
+ * | Key | `day` view | `month` view |
233
+ * | --------------------- | ----------------------------- | ----------------------------- |
234
+ * | Left / Right | ∓1 day | ∓1 month |
235
+ * | Up / Down | ∓7 days (one week row) | ∓3 months (one quarter row) |
236
+ * | Home / End | first / last day of the week | first / last month of the quarter |
237
+ * | PageUp / PageDown | ∓1 month (clamped) | ∓1 year |
238
+ * | Shift+PageUp / -Down | ∓1 year (clamped) | ∓10 years |
239
+ *
240
+ * Home/End stay ROW-scoped in both views — APG grid semantics, and one rule beats two.
241
+ *
242
+ * Navigation is unclamped (a user may move onto a disabled out-of-range cell — APG-discoverable); only
150
243
  * SELECTION is range-guarded, and that guard lives in the component (one place, shared with pointer click).
151
244
  */
152
245
  declare class SkraCalendarKeyboard {
@@ -154,11 +247,18 @@ declare class SkraCalendarKeyboard {
154
247
  key: string;
155
248
  shiftKey: boolean;
156
249
  }, ctx: CalendarKeyContext): CalendarKeyIntent;
250
+ /** One cell = one day / one month. */
251
+ private step;
252
+ /** Row start: the week (day view) / the calendar quarter (month view). */
253
+ private rowStart;
254
+ /** Row end: last day of the week / last month of the quarter. */
255
+ private rowEnd;
256
+ /** Page = the next container up; Shift = the one above that. Day math stays clamped (ADR 0050 §4). */
257
+ private page;
157
258
  private toFocus;
158
- private monthChanged;
159
259
  private weekStart;
160
260
  }
161
261
 
162
262
  export { SkraCalendarKeyboard, SkraDatePicker };
163
- export type { CalendarKeyContext, CalendarKeyIntent };
263
+ export type { CalendarKeyContext, CalendarKeyIntent, SkraDatePrecision };
164
264
  //# sourceMappingURL=skra-ui-datepicker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"skra-ui-datepicker.d.ts","sources":["../../../../libs/ui/datepicker/src/lib/datepicker/calendar-intl.ts","../../../../libs/ui/datepicker/src/lib/datepicker/datepicker.ts","../../../../libs/ui/datepicker/src/lib/datepicker/calendar-keyboard.ts"],"mappings":";;;;AAWA;UACiB,aAAa;;AAE5B;AACA;AACA;AACD;;AC2BD,UAAU,OAAO;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACD;AAED,UAAU,OAAO;AACf;AACA,mBAAe,OAAO;AACvB;AAID;;;;;;;;;;;;;;;AAeG;AACH,cAyJa,cAAc;;oBAEX,aAAA,CAAA,WAAA;;kBAEF,aAAA,CAAA,WAAA;;kBAEA,aAAA,CAAA,WAAA;;qBAEG,aAAA,CAAA,WAAA;;6BAEQ,aAAA,CAAA,WAAA;;0BAEH,aAAA,CAAA,WAAA;;wBAEF,aAAA,CAAA,WAAA,CAAA,aAAA;;uBAED,aAAA,CAAA,wBAAA;uBACA,aAAA,CAAA,wBAAA;;0BAGG,aAAA,CAAA,gBAAA;AAEpB;AAEA;AAEA;AACA;AACA;;;AAIA,+BAAyB,aAAA,CAAA,cAAA;;AAGzB;;AAEA;;;;AAOA,mCAA6B,aAAA,CAAA,MAAA;AAG7B,mCAA6B,aAAA,CAAA,MAAA;AAG7B,iCAA2B,aAAA,CAAA,MAAA;AAG3B,mCAA6B,aAAA,CAAA,MAAA;AAG7B,kCAA4B,aAAA,CAAA,MAAA;AAG5B,oCAA8B,aAAA,CAAA,MAAA;;AAM9B,oCAA8B,aAAA,CAAA,MAAA;AAI9B,uCAAiC,aAAA,CAAA,MAAA;AAGjC;;AAIA;AAIA,uCAAiC,aAAA,CAAA,MAAA;AAOjC,uCAAiC,aAAA,CAAA,MAAA;AACjC,uCAAiC,aAAA,CAAA,MAAA;AACjC,2CAAqC,aAAA,CAAA,MAAA,CAAAA,aAAA;AAGrC,8BAAwB,aAAA,CAAA,MAAA,CAAA,OAAA;;AAqDxB,oCAAgC,UAAU;AAI1C,sCAAkC,aAAa;AAS/C,mCAA+B,aAAa;;;AAwC5C;AAQA,mCAA+B,KAAK;AAOpC;AAiBA;AASA;AAGA;;AAKA;AAMA;AAMA;AAaA;AAIA;;AASA;oDA7RW,cAAc;sDAAd,cAAc;AAyS1B;;ACxgBD;;;;AAIG;AACG,KAAM,iBAAiB;AAEvB;AACA;AACA;;AAEA;;AACA;;AACA;;UAEW,kBAAkB;;AAEjC;;AAEA;AACD;AAID;;;;;;;;;;AAUG;AACH,cAAa,oBAAoB;;;;AAEY,YACpC,kBAAkB,GACtB,iBAAiB;AA8CpB;AAQA;AAMA;AAMD;;;;","names":["__calendar_intl.WeekdayHeader"]}
1
+ {"version":3,"file":"skra-ui-datepicker.d.ts","sources":["../../../../libs/ui/datepicker/src/lib/datepicker/calendar-intl.ts","../../../../libs/ui/datepicker/src/lib/datepicker/calendar-math.ts","../../../../libs/ui/datepicker/src/lib/datepicker/datepicker.ts","../../../../libs/ui/datepicker/src/lib/datepicker/calendar-keyboard.ts"],"mappings":";;;;AA6BA;UACiB,aAAa;;AAE5B;AACA;AACA;AACD;;ACsID;KACY,iBAAiB;;AChH7B;;;AAGG;AACH,UAAU,QAAQ;AAChB;;AAEA;;AAEA;AACA;;;AAGG;AACH;AACA;AACA;AACA;AACA;AACD;AAED,UAAU,OAAO;AACf;AACA,oBAAgB,QAAQ;AACzB;AAID;;;;;;;;;;;;;;;;;;;;;;;AAuBG;AACH,cA+Ja,cAAc;AACzB;;;AAGG;oBACW,aAAA,CAAA,WAAA;AACd;;;;AAIG;wBACe,aAAA,CAAA,WAAA,CAAA,iBAAA;;kBAEN,aAAA,CAAA,WAAA;;kBAEA,aAAA,CAAA,WAAA;;qBAEG,aAAA,CAAA,WAAA;;6BAEQ,aAAA,CAAA,WAAA;;0BAEH,aAAA,CAAA,WAAA;;wBAEF,aAAA,CAAA,WAAA,CAAA,aAAA;;uBAED,aAAA,CAAA,wBAAA;uBACA,aAAA,CAAA,wBAAA;;0BAGG,aAAA,CAAA,gBAAA;AAEpB;AAEA;AAEA;AACA;AACA;;;AAIA,+BAAyB,aAAA,CAAA,cAAA;AAEzB;;;;;;;;AAQG;AACH,6BAAuB,aAAA,CAAA,cAAA,CAAA,iBAAA;;AAGvB;;AAEA;AACA;;;;AAIG;AACH;;;;AAUA,mCAA6B,aAAA,CAAA,MAAA;AAG7B,mCAA6B,aAAA,CAAA,MAAA;AAG7B,iCAA2B,aAAA,CAAA,MAAA;AAG3B,mCAA6B,aAAA,CAAA,MAAA;AAG7B,kCAA4B,aAAA,CAAA,MAAA;AAG5B,oCAA8B,aAAA,CAAA,MAAA;AAK9B;;;;AAIG;AACH,oCAA8B,aAAA,CAAA,MAAA;AAQ9B,uCAAiC,aAAA,CAAA,MAAA;AAKjC;AAGA;;;AAGG;AACH;AASA,oCAA8B,aAAA,CAAA,MAAA;AAM9B,wCAAkC,aAAA,CAAA,MAAA;AAGlC,wCAAkC,aAAA,CAAA,MAAA;AAGlC;;;;AAIG;AACH,qCAA+B,aAAA,CAAA,MAAA;AAG/B,2CAAqC,aAAA,CAAA,MAAA,CAAAA,aAAA;;AAIrC,6BAAuB,aAAA,CAAA,MAAA,CAAA,OAAA;;AAgCvB;;;AAGG;AACH;AAsCA,oCAAgC,UAAU;AAI1C,sCAAkC,aAAa;AAS/C,mCAA+B,aAAa;;;;AAwC5C;AAUA;AAuBA,mCAA+B,KAAK;AAOpC;AAiBA;AASA;AAGA;;AAKA;AAQA;AA0BA;AAwBA;;;;AAIG;AACH;AAIA;AAQA;AAaA;AAIA;;AASA;oDArcW,cAAc;sDAAd,cAAc;AAid1B;;ACjtBD;;;;;;AAMG;AACG,KAAM,iBAAiB;AAEvB;AACA;;AAEA;;AACA;;AACA;;UAEW,kBAAkB;;AAEjC;;AAEA;;AAEA,mBAAe,iBAAiB;AACjC;AAOD;;;;;;;;;;;;;;;;;;;;;;;;;AAyBG;AACH,cAAa,oBAAoB;;;;AAEY,YACpC,kBAAkB,GACtB,iBAAiB;;AA+BpB;;AAOA;;AAOA;;AAOA;AAYA;AAIA;AAMD;;;;","names":["__calendar_intl.WeekdayHeader"]}
@@ -81,6 +81,37 @@ declare class SkraGrid {
81
81
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<SkraGrid, "div[skraGrid], section[skraGrid], article[skraGrid], main[skraGrid], nav[skraGrid], aside[skraGrid], header[skraGrid], footer[skraGrid], form[skraGrid], figure[skraGrid], ul[skraGrid], ol[skraGrid], menu[skraGrid]", never, { "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "gap": { "alias": "gap"; "required": false; "isSignal": true; }; "flow": { "alias": "flow"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; "justifyItems": { "alias": "justifyItems"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
82
82
  }
83
83
 
84
- export { SkraBox, SkraGrid, SkraStack };
85
- export type { BoxDisplay, BoxPadding, GridAlign, GridColumns, GridFlow, GridGap, GridMin, StackAlign, StackDirection, StackGap, StackJustify };
84
+ type SurfacePadding = 'none' | 'sm' | 'md' | 'lg';
85
+ /**
86
+ * SkraSurface — the painted container primitive (ADR 0053), Box's painting sibling.
87
+ *
88
+ * Component-on-native-host: layers onto a generic flow/sectioning container via the
89
+ * bounded host allowlist below — NEVER a `<skra-surface>` custom element, and never
90
+ * an interactive host (ADR 0055 R3.1: `a[skraSurface]` / `button[skraSurface]` are
91
+ * unsupported). "Card", "Panel" and "Tile" are consumer compositions of Surface +
92
+ * `[skraStack]`/`[skraBox]` + a heading — not Skra components (ADR 0053 rule 1).
93
+ *
94
+ * **State-reading doctrine (ADR 0055).** Surface is a READER of state, never an
95
+ * OWNER of state. It exposes no `interactive`/`hoverable`/`selected`/`elevation`
96
+ * input and emits no `role`/`tabindex`/`aria-*`. Focus and selection are READ from
97
+ * the markup the consumer authored (see surface.scss) — which is why an
98
+ * informational card gets no interactive paint with zero API, and why a selected
99
+ * card can never disagree with what assistive technology announces.
100
+ *
101
+ * Zero baked semantics: sectioning role and accessible name are 100% consumer-owned
102
+ * (ADR 0053 rule 6). No `container-type` in v1 (ADR 0055 R7.1).
103
+ */
104
+ declare class SkraSurface {
105
+ /**
106
+ * Semantic padding preset, reusing Box's enum for cross-atom consistency
107
+ * (ADR 0053 rule 4). Defaults to `md` rather than Box's `none` — Box is
108
+ * spacing-neutral by construction, a painted container is not (ADR 0055 R1).
109
+ */
110
+ readonly padding: _angular_core.InputSignal<SurfacePadding>;
111
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SkraSurface, never>;
112
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SkraSurface, "div[skraSurface], section[skraSurface], article[skraSurface], main[skraSurface], nav[skraSurface], aside[skraSurface], header[skraSurface], footer[skraSurface], figure[skraSurface]", never, { "padding": { "alias": "padding"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
113
+ }
114
+
115
+ export { SkraBox, SkraGrid, SkraStack, SkraSurface };
116
+ export type { BoxDisplay, BoxPadding, GridAlign, GridColumns, GridFlow, GridGap, GridMin, StackAlign, StackDirection, StackGap, StackJustify, SurfacePadding };
86
117
  //# sourceMappingURL=skra-ui-layout.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"skra-ui-layout.d.ts","sources":["../../../../libs/ui/layout/src/lib/box/box.ts","../../../../libs/ui/layout/src/lib/stack/stack.ts","../../../../libs/ui/layout/src/lib/grid/grid.ts"],"mappings":";;AAOM,KAAM,UAAU;AAChB,KAAM,UAAU;AAEtB;;;;;;;;;;;AAWG;AACH,cAiBa,OAAO;sBACF,aAAA,CAAA,WAAA,CAAA,UAAA;sBACA,aAAA,CAAA,WAAA,CAAA,UAAA;oDAFL,OAAO;sDAAP,OAAO;AAGnB;;KClCW,cAAc;AACpB,KAAM,QAAQ;AACd,KAAM,UAAU;AAChB,KAAM,YAAY;AAExB;;;;;;;;;;;AAWG;AACH,cAoBa,SAAS;wBACF,aAAA,CAAA,WAAA,CAAA,cAAA;kBACN,aAAA,CAAA,WAAA,CAAA,QAAA;oBACE,aAAA,CAAA,WAAA,CAAA,UAAA;sBACE,aAAA,CAAA,WAAA,CAAA,YAAA;mBACH,aAAA,CAAA,wBAAA;oDALF,SAAS;sDAAT,SAAS;AAMrB;;KC5CW,WAAW;AASjB,KAAM,OAAO;AACb,KAAM,OAAO;AACb,KAAM,QAAQ;AACd,KAAM,SAAS;AAErB;;;;;;;;;;;;;;;;;AAiBG;AACH,cAqBa,QAAQ;sBACH,aAAA,CAAA,WAAA,CAAA,WAAA;kBACJ,aAAA,CAAA,WAAA,CAAA,OAAA;kBACA,aAAA,CAAA,WAAA,CAAA,OAAA;mBACC,aAAA,CAAA,WAAA,CAAA,QAAA;oBACC,aAAA,CAAA,WAAA,CAAA,SAAA;2BACO,aAAA,CAAA,WAAA,CAAA,SAAA;oDANV,QAAQ;sDAAR,QAAQ;AAOpB;;;;","names":[]}
1
+ {"version":3,"file":"skra-ui-layout.d.ts","sources":["../../../../libs/ui/layout/src/lib/box/box.ts","../../../../libs/ui/layout/src/lib/stack/stack.ts","../../../../libs/ui/layout/src/lib/grid/grid.ts","../../../../libs/ui/layout/src/lib/surface/surface.ts"],"mappings":";;AAOM,KAAM,UAAU;AAChB,KAAM,UAAU;AAEtB;;;;;;;;;;;AAWG;AACH,cAiBa,OAAO;sBACF,aAAA,CAAA,WAAA,CAAA,UAAA;sBACA,aAAA,CAAA,WAAA,CAAA,UAAA;oDAFL,OAAO;sDAAP,OAAO;AAGnB;;KClCW,cAAc;AACpB,KAAM,QAAQ;AACd,KAAM,UAAU;AAChB,KAAM,YAAY;AAExB;;;;;;;;;;;AAWG;AACH,cAoBa,SAAS;wBACF,aAAA,CAAA,WAAA,CAAA,cAAA;kBACN,aAAA,CAAA,WAAA,CAAA,QAAA;oBACE,aAAA,CAAA,WAAA,CAAA,UAAA;sBACE,aAAA,CAAA,WAAA,CAAA,YAAA;mBACH,aAAA,CAAA,wBAAA;oDALF,SAAS;sDAAT,SAAS;AAMrB;;KC5CW,WAAW;AASjB,KAAM,OAAO;AACb,KAAM,OAAO;AACb,KAAM,QAAQ;AACd,KAAM,SAAS;AAErB;;;;;;;;;;;;;;;;;AAiBG;AACH,cAqBa,QAAQ;sBACH,aAAA,CAAA,WAAA,CAAA,WAAA;kBACJ,aAAA,CAAA,WAAA,CAAA,OAAA;kBACA,aAAA,CAAA,WAAA,CAAA,OAAA;mBACC,aAAA,CAAA,WAAA,CAAA,QAAA;oBACC,aAAA,CAAA,WAAA,CAAA,SAAA;2BACO,aAAA,CAAA,WAAA,CAAA,SAAA;oDANV,QAAQ;sDAAR,QAAQ;AAOpB;;AC5DK,KAAM,cAAc;AAE1B;;;;;;;;;;;;;;;;;;AAkBG;AACH,cAca,WAAW;AACtB;;;;AAIG;sBACa,aAAA,CAAA,WAAA,CAAA,cAAA;oDANL,WAAW;sDAAX,WAAW;AAOvB;;;;","names":[]}