@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.
- package/consumer-guide/README.md +2 -1
- package/consumer-guide/layout.md +79 -0
- package/consumer-guide/setup-and-gotchas.md +2 -2
- package/fesm2022/skra-ui-accordion.mjs +2 -2
- package/fesm2022/skra-ui-accordion.mjs.map +1 -1
- package/fesm2022/skra-ui-alert.mjs +2 -2
- package/fesm2022/skra-ui-alert.mjs.map +1 -1
- package/fesm2022/skra-ui-avatar.mjs.map +1 -1
- package/fesm2022/skra-ui-badge.mjs.map +1 -1
- package/fesm2022/skra-ui-button.mjs +2 -2
- package/fesm2022/skra-ui-button.mjs.map +1 -1
- package/fesm2022/skra-ui-checkbox.mjs +2 -2
- package/fesm2022/skra-ui-checkbox.mjs.map +1 -1
- package/fesm2022/skra-ui-chip.mjs +2 -2
- package/fesm2022/skra-ui-chip.mjs.map +1 -1
- package/fesm2022/skra-ui-combobox.mjs +120 -120
- package/fesm2022/skra-ui-combobox.mjs.map +1 -1
- package/fesm2022/skra-ui-core.mjs +36 -36
- package/fesm2022/skra-ui-core.mjs.map +1 -1
- package/fesm2022/skra-ui-counter.mjs.map +1 -1
- package/fesm2022/skra-ui-datepicker.mjs +605 -190
- package/fesm2022/skra-ui-datepicker.mjs.map +1 -1
- package/fesm2022/skra-ui-dialog.mjs.map +1 -1
- package/fesm2022/skra-ui-field.mjs.map +1 -1
- package/fesm2022/skra-ui-icon.mjs.map +1 -1
- package/fesm2022/skra-ui-input.mjs +2 -2
- package/fesm2022/skra-ui-input.mjs.map +1 -1
- package/fesm2022/skra-ui-kbd.mjs.map +1 -1
- package/fesm2022/skra-ui-layout.mjs +40 -1
- package/fesm2022/skra-ui-layout.mjs.map +1 -1
- package/fesm2022/skra-ui-link.mjs +2 -2
- package/fesm2022/skra-ui-link.mjs.map +1 -1
- package/fesm2022/skra-ui-loading-indicator.mjs.map +1 -1
- package/fesm2022/skra-ui-menu.mjs +2 -2
- package/fesm2022/skra-ui-menu.mjs.map +1 -1
- package/fesm2022/skra-ui-multi-select.mjs +94 -94
- package/fesm2022/skra-ui-multi-select.mjs.map +1 -1
- package/fesm2022/skra-ui-native-select.mjs +2 -2
- package/fesm2022/skra-ui-native-select.mjs.map +1 -1
- package/fesm2022/skra-ui-popover.mjs.map +1 -1
- package/fesm2022/skra-ui-progress.mjs.map +1 -1
- package/fesm2022/skra-ui-radio.mjs +2 -2
- package/fesm2022/skra-ui-radio.mjs.map +1 -1
- package/fesm2022/skra-ui-rating-display.mjs.map +1 -1
- package/fesm2022/skra-ui-select.mjs +92 -92
- package/fesm2022/skra-ui-select.mjs.map +1 -1
- package/fesm2022/skra-ui-skeleton.mjs +8 -8
- package/fesm2022/skra-ui-skeleton.mjs.map +1 -1
- package/fesm2022/skra-ui-star-rating.mjs +2 -2
- package/fesm2022/skra-ui-star-rating.mjs.map +1 -1
- package/fesm2022/skra-ui-status-dot.mjs.map +1 -1
- package/fesm2022/skra-ui-switch.mjs +2 -2
- package/fesm2022/skra-ui-switch.mjs.map +1 -1
- package/fesm2022/skra-ui-tabs.mjs +2 -2
- package/fesm2022/skra-ui-tabs.mjs.map +1 -1
- package/fesm2022/skra-ui-textarea.mjs +2 -2
- package/fesm2022/skra-ui-textarea.mjs.map +1 -1
- package/fesm2022/skra-ui-toast.mjs +2 -2
- package/fesm2022/skra-ui-toast.mjs.map +1 -1
- package/fesm2022/skra-ui-tooltip.mjs.map +1 -1
- package/fesm2022/skra-ui-typography.mjs.map +1 -1
- package/package.json +2 -2
- package/types/skra-ui-datepicker.d.ts +146 -46
- package/types/skra-ui-datepicker.d.ts.map +1 -1
- package/types/skra-ui-layout.d.ts +33 -2
- package/types/skra-ui-layout.d.ts.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skra-ui-datepicker.mjs","sources":["../../../../libs/ui/datepicker/src/lib/datepicker/calendar-math.ts","../../../../libs/ui/datepicker/src/lib/datepicker/calendar-keyboard.ts","../../../../libs/ui/datepicker/src/lib/datepicker/calendar-intl.ts","../../../../libs/ui/datepicker/src/lib/datepicker/datepicker.ts","../../../../libs/ui/datepicker/src/skra-ui-datepicker.ts"],"sourcesContent":["/**\r\n * calendar-math — the ONE sanctioned site for DatePicker date arithmetic (ADR 0050 §3/§6).\r\n *\r\n * Zoneless calendar-date discipline (the timezone off-by-one is the bug class this exists to prevent):\r\n * - The value is an ISO 8601 date-only string (`YYYY-MM-DD`) — NEVER materialized as a `Date`.\r\n * - `Date` is used ONLY as a UTC calendar calculator — built via `Date.UTC(...)`, read via `getUTC*`.\r\n * - `new Date(isoString)` is FORBIDDEN (date-only parses as UTC midnight → local accessors shift it).\r\n * - \"today\" uses LOCAL accessors — \"today\" is inherently local-civil.\r\n * - Month length + leap years are delegated to the platform engine, NEVER a hand-written leap rule.\r\n *\r\n * Months are **1-based** here (1=Jan … 12=Dec) to mirror the ISO string; the single 0-based conversion\r\n * happens at the `Date.UTC` call sites. Weekdays are **ISO** (1=Mon … 7=Sun) to match `firstDayOfWeek`.\r\n *\r\n * This module is the ADR 0050 §6 swap-point: a future `Temporal.PlainDate` migration touches only here.\r\n */\r\n\r\n/** A zoneless calendar date. `m` is 1-based (1=Jan … 12=Dec). */\r\nexport interface CalendarDate {\r\n readonly y: number;\r\n readonly m: number;\r\n readonly d: number;\r\n}\r\n\r\nconst ISO_DATE = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\r\n\r\n/** Zero-pad to a fixed width (no locale, no `Intl` — pure formatting). */\r\nfunction pad(n: number, width: number): string {\r\n return String(n).padStart(width, '0');\r\n}\r\n\r\n/** Days in month `m` (1-based) of year `y` — delegated to the engine (leap years handled for free). */\r\nexport function daysInMonth(y: number, m: number): number {\r\n // Date.UTC month is 0-based; passing the 1-based `m` selects the NEXT month, day 0 = last of `m`.\r\n return new Date(Date.UTC(y, m, 0)).getUTCDate();\r\n}\r\n\r\n/** ISO weekday (1=Mon … 7=Sun) of an arbitrary {y,m,d}, via the UTC calculator. */\r\nexport function isoWeekday(y: number, m: number, d: number): number {\r\n const jsDay = new Date(Date.UTC(y, m - 1, d)).getUTCDay(); // 0=Sun … 6=Sat\r\n return ((jsDay + 6) % 7) + 1; // → 1=Mon … 7=Sun\r\n}\r\n\r\n/** Strict `YYYY-MM-DD` parse with real calendar validation. Returns `null` for anything invalid. */\r\nexport function parseIso(iso: string): CalendarDate | null {\r\n const match = ISO_DATE.exec(iso);\r\n if (!match) return null;\r\n const y = Number(match[1]);\r\n const m = Number(match[2]);\r\n const d = Number(match[3]);\r\n if (m < 1 || m > 12) return null;\r\n if (d < 1 || d > daysInMonth(y, m)) return null; // rejects 2026-02-30, 2026-04-31, etc.\r\n return { y, m, d };\r\n}\r\n\r\n/** `true` iff `iso` is a strictly valid `YYYY-MM-DD` calendar date. */\r\nexport function isValidIso(iso: string): boolean {\r\n return parseIso(iso) !== null;\r\n}\r\n\r\n/** Serialize a calendar date to `YYYY-MM-DD`. */\r\nexport function toIso({ y, m, d }: CalendarDate): string {\r\n return `${pad(y, 4)}-${pad(m, 2)}-${pad(d, 2)}`;\r\n}\r\n\r\n/**\r\n * Build a UTC `Date` from an ISO string — the ONLY sanctioned `Date`-from-value site (used by\r\n * `calendar-intl` to feed `Intl.DateTimeFormat`, which MUST also pass `timeZone:'UTC'`). Returns the\r\n * value as a UTC instant; callers MUST read it back via UTC accessors / a UTC-zoned formatter ONLY.\r\n */\r\nexport function toUtcDate(iso: string): Date | null {\r\n const date = parseIso(iso);\r\n if (!date) return null;\r\n return new Date(Date.UTC(date.y, date.m - 1, date.d));\r\n}\r\n\r\n/** Today's LOCAL calendar date as ISO (local accessors — \"today\" is local-civil, ADR 0050 §3). */\r\nexport function today(): string {\r\n const now = new Date();\r\n return toIso({\r\n y: now.getFullYear(),\r\n m: now.getMonth() + 1,\r\n d: now.getDate(),\r\n });\r\n}\r\n\r\n/** Add `n` days (may be negative); crosses month/year boundaries via the UTC engine. */\r\nexport function addDays(iso: string, n: number): string {\r\n const date = parseIso(iso);\r\n if (!date) return iso;\r\n const dt = new Date(Date.UTC(date.y, date.m - 1, date.d));\r\n dt.setUTCDate(dt.getUTCDate() + n);\r\n return toIso({\r\n y: dt.getUTCFullYear(),\r\n m: dt.getUTCMonth() + 1,\r\n d: dt.getUTCDate(),\r\n });\r\n}\r\n\r\n/**\r\n * Add `n` months (may be negative), preserving day-of-month CLAMPED to the target month length\r\n * (ADR 0050 §4): Jan 31 + 1 month → Feb 28/29, never Mar 3.\r\n */\r\nexport function addMonthsClamped(iso: string, n: number): string {\r\n const date = parseIso(iso);\r\n if (!date) return iso;\r\n const total = date.y * 12 + (date.m - 1) + n;\r\n const y = Math.floor(total / 12);\r\n const m = (((total % 12) + 12) % 12) + 1; // 1-based, safe for negative totals\r\n const d = Math.min(date.d, daysInMonth(y, m));\r\n return toIso({ y, m, d });\r\n}\r\n\r\n/** Add `n` years, clamped (Feb 29 + 1 year → Feb 28). Delegates to month arithmetic. */\r\nexport function addYearsClamped(iso: string, n: number): string {\r\n return addMonthsClamped(iso, n * 12);\r\n}\r\n\r\n/** Lexicographic comparison — valid because same-format ISO 8601 date-only strings are byte-sortable. */\r\nexport function compareIso(a: string, b: string): number {\r\n return a < b ? -1 : a > b ? 1 : 0;\r\n}\r\n\r\n/** Inclusive range test. `''` bound = unbounded on that side (ADR 0050 §2, lexicographic). */\r\nexport function isInRange(iso: string, min: string, max: string): boolean {\r\n if (min !== '' && compareIso(iso, min) < 0) return false;\r\n if (max !== '' && compareIso(iso, max) > 0) return false;\r\n return true;\r\n}\r\n\r\n/** Clamp `iso` into `[min,max]` (each `''` = unbounded). Used to seed the displayed month / focus. */\r\nexport function clampIso(iso: string, min: string, max: string): string {\r\n if (min !== '' && compareIso(iso, min) < 0) return min;\r\n if (max !== '' && compareIso(iso, max) > 0) return max;\r\n return iso;\r\n}\r\n\r\n/**\r\n * Build a month grid: weeks of 7 cells, each a day ISO string or `null` (leading/trailing padding —\r\n * adjacent-month days are NOT rendered in MVP). `firstDayOfWeek` is ISO (1=Mon … 7=Sun).\r\n * Pure + deterministic; the component decorates cells with selected/today/disabled/focused state.\r\n */\r\nexport function monthGrid(\r\n y: number,\r\n m: number,\r\n firstDayOfWeek: number,\r\n): (string | null)[][] {\r\n const firstWeekday = isoWeekday(y, m, 1); // ISO weekday of the 1st\r\n const leadingBlanks = (firstWeekday - firstDayOfWeek + 7) % 7;\r\n const dim = daysInMonth(y, m);\r\n\r\n const cells: (string | null)[] = [];\r\n for (let i = 0; i < leadingBlanks; i++) cells.push(null);\r\n for (let d = 1; d <= dim; d++) cells.push(toIso({ y, m, d }));\r\n while (cells.length % 7 !== 0) cells.push(null); // trailing padding\r\n\r\n const weeks: (string | null)[][] = [];\r\n for (let i = 0; i < cells.length; i += 7) weeks.push(cells.slice(i, i + 7));\r\n return weeks;\r\n}\r\n","import {\r\n addDays,\r\n addMonthsClamped,\r\n addYearsClamped,\r\n isoWeekday,\r\n parseIso,\r\n} from './calendar-math';\r\n\r\n/**\r\n * The intent a key produces in the calendar grid. The controller is PURE (no DOM, no focus, no signals);\r\n * the `skra-datepicker` component applies the intent — sets `focusedIso`/`displayedMonth` and moves REAL\r\n * DOM focus (roving). `monthChanged` tells the component the grid will re-stamp so it must re-`focus()`.\r\n */\r\nexport type CalendarKeyIntent =\r\n | {\r\n readonly type: 'focus';\r\n readonly iso: string;\r\n readonly monthChanged: boolean;\r\n }\r\n | { readonly type: 'select' }\r\n | { readonly type: 'close' }\r\n | { readonly type: 'none' };\r\n\r\nexport interface CalendarKeyContext {\r\n /** The currently focused day (ISO). */\r\n readonly focusedIso: string;\r\n /** First day of week, ISO 1=Mon … 7=Sun (already resolved by `calendar-intl`). */\r\n readonly firstDayOfWeek: number;\r\n}\r\n\r\nconst NONE: CalendarKeyIntent = { type: 'none' };\r\n\r\n/**\r\n * SkraCalendarKeyboard — the WAI-ARIA APG **Date Picker Dialog** grid keyboard model (2-D), confined to\r\n * ONE file. The THIRD per-pattern keyboard controller and the FIRST that does NOT wrap a CDK key manager:\r\n * neither `FocusKeyManager` (Menu) nor `ActiveDescendantKeyManager` (Select/Combobox) models a 2-D grid\r\n * whose focusable cell set is recomputed on month change (ADR 0044 §7 note, 2026-06-14). Date arithmetic\r\n * is delegated to `calendar-math` (the ADR 0050 single math site); this controller only maps keys to\r\n * intents. Roving REAL focus (NOT `aria-activedescendant`) — the divergence from Select/Combobox.\r\n *\r\n * Navigation is unclamped (a user may move onto a disabled out-of-range day — APG-discoverable); only\r\n * SELECTION is range-guarded, and that guard lives in the component (one place, shared with pointer click).\r\n */\r\nexport class SkraCalendarKeyboard {\r\n resolve(\r\n event: { key: string; shiftKey: boolean },\r\n ctx: CalendarKeyContext,\r\n ): CalendarKeyIntent {\r\n const { focusedIso, firstDayOfWeek } = ctx;\r\n switch (event.key) {\r\n case 'ArrowLeft':\r\n return this.toFocus(focusedIso, addDays(focusedIso, -1));\r\n case 'ArrowRight':\r\n return this.toFocus(focusedIso, addDays(focusedIso, 1));\r\n case 'ArrowUp':\r\n return this.toFocus(focusedIso, addDays(focusedIso, -7));\r\n case 'ArrowDown':\r\n return this.toFocus(focusedIso, addDays(focusedIso, 7));\r\n case 'Home':\r\n return this.toFocus(\r\n focusedIso,\r\n this.weekStart(focusedIso, firstDayOfWeek),\r\n );\r\n case 'End':\r\n return this.toFocus(\r\n focusedIso,\r\n addDays(this.weekStart(focusedIso, firstDayOfWeek), 6),\r\n );\r\n case 'PageUp':\r\n return this.toFocus(\r\n focusedIso,\r\n event.shiftKey\r\n ? addYearsClamped(focusedIso, -1)\r\n : addMonthsClamped(focusedIso, -1),\r\n );\r\n case 'PageDown':\r\n return this.toFocus(\r\n focusedIso,\r\n event.shiftKey\r\n ? addYearsClamped(focusedIso, 1)\r\n : addMonthsClamped(focusedIso, 1),\r\n );\r\n case 'Enter':\r\n case ' ':\r\n case 'Spacebar': // legacy key name\r\n return { type: 'select' };\r\n case 'Escape':\r\n return { type: 'close' };\r\n default:\r\n return NONE;\r\n }\r\n }\r\n\r\n private toFocus(fromIso: string, toIso: string): CalendarKeyIntent {\r\n return {\r\n type: 'focus',\r\n iso: toIso,\r\n monthChanged: this.monthChanged(fromIso, toIso),\r\n };\r\n }\r\n\r\n private monthChanged(a: string, b: string): boolean {\r\n const pa = parseIso(a);\r\n const pb = parseIso(b);\r\n return !pa || !pb || pa.y !== pb.y || pa.m !== pb.m;\r\n }\r\n\r\n private weekStart(iso: string, firstDayOfWeek: number): string {\r\n const p = parseIso(iso);\r\n if (!p) return iso;\r\n const offset = (isoWeekday(p.y, p.m, p.d) - firstDayOfWeek + 7) % 7;\r\n return addDays(iso, -offset);\r\n }\r\n}\r\n","import { toUtcDate } from './calendar-math';\r\n\r\n/**\r\n * calendar-intl — DatePicker localization via the platform `Intl` (ADR 0050 §5). NO locale string\r\n * catalog is bundled (atoms-agnostic); everything language/digit-related is derived from `Intl`, keyed\r\n * by the consumer `locale`. Every `Date` fed to a formatter comes from `calendar-math.toUtcDate` AND the\r\n * formatter MUST set `timeZone: 'UTC'` (else the displayed date shifts off the zoneless value).\r\n */\r\n\r\nconst UTC = 'UTC';\r\n\r\n/** A localized weekday column header (short label + full name for the `<abbr title>`). */\r\nexport interface WeekdayHeader {\r\n /** ISO weekday 1=Mon … 7=Sun — a stable `@for` track key. */\r\n readonly key: number;\r\n readonly short: string;\r\n readonly long: string;\r\n}\r\n\r\n/** Resolve the host's default BCP-47 locale tag, SSR-safe (no `navigator` in Node). */\r\nfunction hostLocale(): string | undefined {\r\n return typeof navigator !== 'undefined' ? navigator.language : undefined;\r\n}\r\n\r\n/** Trigger display of the selected date (`dateStyle: 'medium'`). `''`/invalid → `''`. */\r\nexport function formatValue(iso: string, locale: string | undefined): string {\r\n const dt = toUtcDate(iso);\r\n if (!dt) return '';\r\n return new Intl.DateTimeFormat(locale, {\r\n dateStyle: 'medium',\r\n timeZone: UTC,\r\n }).format(dt);\r\n}\r\n\r\n/** Header / nav-button label for a month: localized `month long + year` (e.g. \"czerwiec 2026\"). */\r\nexport function formatMonthYear(\r\n y: number,\r\n m: number,\r\n locale: string | undefined,\r\n): string {\r\n const dt = toUtcDate(\r\n `${String(y).padStart(4, '0')}-${String(m).padStart(2, '0')}-01`,\r\n );\r\n if (!dt) return '';\r\n return new Intl.DateTimeFormat(locale, {\r\n month: 'long',\r\n year: 'numeric',\r\n timeZone: UTC,\r\n }).format(dt);\r\n}\r\n\r\n/** Full localized date for a day cell's `[skra-sr-only]` accessible-name extension (ADR 033 Path 2). */\r\nexport function formatDayName(iso: string, locale: string | undefined): string {\r\n const dt = toUtcDate(iso);\r\n if (!dt) return '';\r\n return new Intl.DateTimeFormat(locale, {\r\n dateStyle: 'long',\r\n timeZone: UTC,\r\n }).format(dt);\r\n}\r\n\r\n/** Visible day number, localized digits (e.g. Arabic-Indic `٥`) — never a raw `toString()`. */\r\nexport function formatDayNumber(\r\n day: number,\r\n locale: string | undefined,\r\n): string {\r\n return new Intl.NumberFormat(locale).format(day);\r\n}\r\n\r\n/**\r\n * Localized weekday column headers, 7 entries starting at `firstDayOfWeek` (ISO 1=Mon … 7=Sun).\r\n * Reference week: 2024-01-01 is a Monday, so day-of-month `d` (1–7) maps directly to ISO weekday `d`.\r\n */\r\nexport function weekdayHeaders(\r\n firstDayOfWeek: number,\r\n locale: string | undefined,\r\n): WeekdayHeader[] {\r\n const shortFmt = new Intl.DateTimeFormat(locale, {\r\n weekday: 'short',\r\n timeZone: UTC,\r\n });\r\n const longFmt = new Intl.DateTimeFormat(locale, {\r\n weekday: 'long',\r\n timeZone: UTC,\r\n });\r\n const headers: WeekdayHeader[] = [];\r\n for (let i = 0; i < 7; i++) {\r\n const dow = ((firstDayOfWeek - 1 + i) % 7) + 1; // 1 … 7\r\n const dt = toUtcDate(`2024-01-0${dow}`)!; // dow 1–7 → '2024-01-01' … '2024-01-07'\r\n headers.push({\r\n key: dow,\r\n short: shortFmt.format(dt),\r\n long: longFmt.format(dt),\r\n });\r\n }\r\n return headers;\r\n}\r\n\r\n/**\r\n * Resolve the first day of the week (ISO 1=Mon … 7=Sun): explicit `override` → `Intl` `getWeekInfo` →\r\n * **Monday fallback**. The override is the MVP safety valve — `Intl.Locale.getWeekInfo()` support is\r\n * spotty (older Firefox/Safari), so the detection path genuinely fails in mainstream browsers and the\r\n * Monday fallback is wrong for en-US (Sun) / much of the Middle East (Sat) (ADR 0050 §5).\r\n */\r\nexport function resolveFirstDayOfWeek(\r\n override: number | undefined,\r\n locale: string | undefined,\r\n): number {\r\n if (typeof override === 'number' && override >= 1 && override <= 7)\r\n return override;\r\n try {\r\n const loc = new Intl.Locale(\r\n locale ?? hostLocale() ?? 'en',\r\n ) as Intl.Locale & {\r\n getWeekInfo?: () => { firstDay?: number };\r\n weekInfo?: { firstDay?: number };\r\n };\r\n const info = loc.getWeekInfo?.() ?? loc.weekInfo; // method (modern) or property (older engines)\r\n const firstDay = info?.firstDay;\r\n if (typeof firstDay === 'number' && firstDay >= 1 && firstDay <= 7)\r\n return firstDay;\r\n } catch {\r\n /* unsupported / malformed locale → fall through to the documented fallback */\r\n }\r\n return 1; // Monday (ISO-8601 week start)\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n Injector,\r\n ViewEncapsulation,\r\n afterNextRender,\r\n booleanAttribute,\r\n computed,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { SkraFieldContext } from '@skra/ui/field';\r\n\r\nimport {\r\n _attachPositioner,\r\n type SkraPlacement,\r\n type _PositionerHandle,\r\n} from '@skra/ui/core';\r\nimport { SkraCalendarKeyboard } from './calendar-keyboard';\r\nimport {\r\n addMonthsClamped,\r\n clampIso,\r\n compareIso,\r\n isInRange,\r\n isValidIso,\r\n monthGrid,\r\n parseIso,\r\n toIso,\r\n today,\r\n} from './calendar-math';\r\nimport {\r\n formatDayName,\r\n formatDayNumber,\r\n formatMonthYear,\r\n formatValue,\r\n resolveFirstDayOfWeek,\r\n weekdayHeaders,\r\n} from './calendar-intl';\r\n\r\ninterface DayCell {\r\n readonly key: string;\r\n readonly iso: string | null;\r\n readonly dayNum: string;\r\n readonly srName: string;\r\n readonly today: boolean;\r\n readonly selected: boolean;\r\n readonly disabled: boolean;\r\n readonly focused: boolean;\r\n}\r\n\r\ninterface WeekRow {\r\n readonly key: number;\r\n readonly days: DayCell[];\r\n}\r\n\r\nlet nextDatePickerId = 0;\r\n\r\n/**\r\n * SkraDatePicker — pick a single **calendar date** from an APG Date Picker grid in the native top layer.\r\n * Second Tier-3 component. A value-display **trigger** (`<button>`) opens a non-modal top-layer **calendar\r\n * panel** (Popover API, `popover=\"auto\"`, ADR 0044). The value is an **ISO 8601 date-only string**\r\n * (`YYYY-MM-DD`), consumer-owned (ADR 0050/037 — NO `@angular/forms`); all date math is the zoneless\r\n * UTC-calculator discipline in `calendar-math` (no date library). Localization (month/weekday names,\r\n * first-day-of-week, digits) is `Intl`-derived in `calendar-intl`; the 2-D grid keyboard is the\r\n * hand-rolled `SkraCalendarKeyboard` (ADR 0044 §7 — roving REAL focus, not aria-activedescendant).\r\n *\r\n * No projected content: the calendar days are GENERATED (the structural divergence from select/combobox —\r\n * there is no `skra-option` reuse). The only focusable element in the open panel is the roving day cell;\r\n * the month-nav buttons are pointer affordances (`tabindex=\"-1\"`, driven by PageUp/PageDown on keyboard),\r\n * and Tab dismisses — so no focus-containment machinery is needed (spec Q-1).\r\n *\r\n * Full contract: adr/specs/component-datepicker-spec.md.\r\n */\r\n@Component({\r\n selector: 'skra-datepicker',\r\n standalone: true,\r\n exportAs: 'skraDatePicker',\r\n template: `\r\n <button\r\n #trigger\r\n class=\"skra-datepicker-trigger\"\r\n type=\"button\"\r\n role=\"combobox\"\r\n aria-haspopup=\"dialog\"\r\n [attr.id]=\"triggerId()\"\r\n [attr.popovertarget]=\"panelId\"\r\n [attr.aria-controls]=\"panelId\"\r\n [attr.aria-expanded]=\"isOpen()\"\r\n [attr.aria-describedby]=\"describedBy()\"\r\n [attr.aria-invalid]=\"hasError() ? 'true' : null\"\r\n [attr.aria-required]=\"isRequired() ? 'true' : null\"\r\n [attr.aria-readonly]=\"isReadonly() ? 'true' : null\"\r\n [disabled]=\"isDisabled()\"\r\n (click)=\"onTriggerClick($event)\"\r\n (keydown)=\"onTriggerKeydown($event)\"\r\n >\r\n @if (formattedValue(); as label) {\r\n <span class=\"skra-datepicker-value\">{{ label }}</span>\r\n } @else {\r\n <span class=\"skra-datepicker-placeholder\">{{ placeholder() }}</span>\r\n }\r\n <svg\r\n class=\"skra-datepicker-icon\"\r\n aria-hidden=\"true\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n >\r\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"17\" rx=\"2\" />\r\n <path d=\"M3 9h18M8 2v4M16 2v4\" />\r\n </svg>\r\n </button>\r\n\r\n <div\r\n #panel\r\n class=\"skra-datepicker-panel\"\r\n [id]=\"panelId\"\r\n popover=\"auto\"\r\n role=\"dialog\"\r\n aria-modal=\"false\"\r\n [attr.aria-labelledby]=\"monthYearId\"\r\n (toggle)=\"onPanelToggle($event)\"\r\n >\r\n <div class=\"skra-datepicker-header\">\r\n <button\r\n type=\"button\"\r\n class=\"skra-datepicker-nav\"\r\n tabindex=\"-1\"\r\n [attr.aria-label]=\"prevMonthLabel()\"\r\n (click)=\"goToPreviousMonth()\"\r\n >\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n aria-hidden=\"true\"\r\n >\r\n <path d=\"M15 6l-6 6 6 6\" />\r\n </svg>\r\n </button>\r\n <span\r\n class=\"skra-datepicker-monthyear\"\r\n [id]=\"monthYearId\"\r\n aria-live=\"polite\"\r\n >{{ monthYearLabel() }}</span\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"skra-datepicker-nav\"\r\n tabindex=\"-1\"\r\n [attr.aria-label]=\"nextMonthLabel()\"\r\n (click)=\"goToNextMonth()\"\r\n >\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n aria-hidden=\"true\"\r\n >\r\n <path d=\"M9 6l6 6-6 6\" />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <table\r\n class=\"skra-datepicker-grid\"\r\n role=\"grid\"\r\n [attr.aria-labelledby]=\"monthYearId\"\r\n >\r\n <thead>\r\n <tr>\r\n @for (wd of weekdayHeadersView(); track wd.key) {\r\n <th scope=\"col\" class=\"skra-datepicker-weekday\">\r\n <abbr [title]=\"wd.long\">{{ wd.short }}</abbr>\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (week of weeks(); track week.key) {\r\n <tr>\r\n @for (cell of week.days; track cell.key) {\r\n @if (cell.iso) {\r\n <td\r\n role=\"gridcell\"\r\n [attr.aria-selected]=\"cell.selected ? 'true' : null\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"skra-datepicker-day\"\r\n [attr.tabindex]=\"cell.focused ? 0 : -1\"\r\n [attr.aria-current]=\"cell.today ? 'date' : null\"\r\n [attr.aria-disabled]=\"cell.disabled ? 'true' : null\"\r\n [attr.data-skra-selected]=\"cell.selected ? '' : null\"\r\n [attr.data-skra-today]=\"cell.today ? '' : null\"\r\n (click)=\"selectDate(cell.iso)\"\r\n (keydown)=\"onGridKeydown($event)\"\r\n >\r\n {{ cell.dayNum\r\n }}<span class=\"skra-datepicker-day-sr\" skra-sr-only>{{\r\n cell.srName\r\n }}</span>\r\n </button>\r\n </td>\r\n } @else {\r\n <td class=\"skra-datepicker-day-empty\" aria-hidden=\"true\"></td>\r\n }\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n `,\r\n styleUrl: './datepicker.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n host: {\r\n '[attr.data-skra-disabled]': 'isDisabled() ? \"\" : null',\r\n '[attr.data-skra-readonly]': 'isReadonly() ? \"\" : null',\r\n '[attr.data-skra-validation]': 'hasError() ? \"invalid\" : null',\r\n },\r\n})\r\nexport class SkraDatePicker {\r\n /** Consumer-owned value: ISO 8601 date-only (`YYYY-MM-DD`); `''` = unset. NEVER a Date (ADR 0050/037). */\r\n readonly value = input<string>('');\r\n /** Inclusive lower bound (ISO); `''` = unbounded (ADR 0050 §2). */\r\n readonly min = input<string>('');\r\n /** Inclusive upper bound (ISO); `''` = unbounded. */\r\n readonly max = input<string>('');\r\n /** `Intl` locale (BCP-47); `undefined` → host default (ADR 0050 §5). */\r\n readonly locale = input<string | undefined>(undefined);\r\n /** First day of week, ISO 1=Mon … 7=Sun; overrides `Intl.getWeekInfo` (the MVP safety valve, ADR 0050 §5). */\r\n readonly firstDayOfWeek = input<number | undefined>(undefined);\r\n /** Value-empty hint in the trigger (NOT the accessible name — ADR 033). */\r\n readonly placeholder = input<string>('');\r\n /** Placement intent; flip/shift adjust at runtime. */\r\n readonly placement = input<SkraPlacement>('bottom');\r\n /** Standalone availability source — `SkraFieldContext` wins when present. */\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n readonly readonly = input(false, { transform: booleanAttribute });\r\n\r\n /** Fires ONLY on user date selection — never on a programmatic `value()` change (ADR 037/0050). */\r\n readonly valueChange = output<string>();\r\n\r\n private readonly triggerRef =\r\n viewChild<ElementRef<HTMLButtonElement>>('trigger');\r\n private readonly panelRef = viewChild<ElementRef<HTMLElement>>('panel');\r\n\r\n private readonly context = inject(SkraFieldContext, { optional: true });\r\n private readonly injector = inject(Injector);\r\n private readonly keyboard = new SkraCalendarKeyboard();\r\n\r\n readonly panelId = `skra-datepicker-${nextDatePickerId}`;\r\n readonly monthYearId = `skra-datepicker-monthyear-${nextDatePickerId++}`;\r\n protected readonly isOpen = signal(false);\r\n\r\n /** Today's LOCAL date (ADR 0050 §3) — stable for the session. */\r\n private readonly todayIso = today();\r\n /** The roving-focus day; SINGLE source of truth for what the grid shows AND which cell is focusable. */\r\n private readonly focusedIso = signal(this.todayIso);\r\n\r\n private positioner?: _PositionerHandle;\r\n /** Set when a close should return focus to the trigger (keyboard/select), not on outside-click. */\r\n private returnFocus = false;\r\n\r\n // ── Availability / validation (SkraFieldContext, ADR 013, with standalone fallbacks) ──\r\n protected readonly isDisabled = computed(\r\n () => this.context?.isDisabled() ?? this.disabled(),\r\n );\r\n protected readonly isReadonly = computed(\r\n () => this.context?.isReadonly() ?? this.readonly(),\r\n );\r\n protected readonly hasError = computed(\r\n () => this.context?.hasError() ?? false,\r\n );\r\n protected readonly isRequired = computed(\r\n () => this.context?.isRequired() ?? false,\r\n );\r\n protected readonly triggerId = computed(\r\n () => this.context?.fieldId() || null,\r\n );\r\n protected readonly describedBy = computed(\r\n () => this.context?.describedByIds() ?? null,\r\n );\r\n\r\n // ── Derived calendar state ──\r\n /** The committed value, defensively normalized: invalid/out-of-range → `''` for display (ADR 0050 §1). */\r\n protected readonly selectedIso = computed(() => {\r\n const v = this.value();\r\n return isValidIso(v) && isInRange(v, this.min(), this.max()) ? v : '';\r\n });\r\n protected readonly formattedValue = computed(() =>\r\n formatValue(this.selectedIso(), this.locale()),\r\n );\r\n private readonly firstDow = computed(() =>\r\n resolveFirstDayOfWeek(this.firstDayOfWeek(), this.locale()),\r\n );\r\n /** The month being shown — always the focused day's month (keeps the roving tabindex valid). */\r\n private readonly displayedMonth = computed(() => {\r\n const p = parseIso(this.focusedIso()) ?? parseIso(this.todayIso)!;\r\n return { y: p.y, m: p.m };\r\n });\r\n protected readonly monthYearLabel = computed(() =>\r\n formatMonthYear(\r\n this.displayedMonth().y,\r\n this.displayedMonth().m,\r\n this.locale(),\r\n ),\r\n );\r\n protected readonly prevMonthLabel = computed(() => this.monthOffsetLabel(-1));\r\n protected readonly nextMonthLabel = computed(() => this.monthOffsetLabel(1));\r\n protected readonly weekdayHeadersView = computed(() =>\r\n weekdayHeaders(this.firstDow(), this.locale()),\r\n );\r\n protected readonly weeks = computed<WeekRow[]>(() => {\r\n const { y, m } = this.displayedMonth();\r\n const loc = this.locale();\r\n const sel = this.selectedIso();\r\n const foc = this.focusedIso();\r\n const min = this.min();\r\n const max = this.max();\r\n return monthGrid(y, m, this.firstDow()).map((week, wi) => ({\r\n key: wi,\r\n days: week.map((iso, di) =>\r\n iso === null\r\n ? this.emptyCell(`${wi}-${di}`)\r\n : {\r\n key: iso,\r\n iso,\r\n dayNum: formatDayNumber(parseIso(iso)!.d, loc),\r\n srName: formatDayName(iso, loc),\r\n today: iso === this.todayIso,\r\n selected: iso === sel,\r\n disabled: !isInRange(iso, min, max),\r\n focused: iso === foc,\r\n },\r\n ),\r\n }));\r\n });\r\n\r\n constructor() {\r\n inject(DestroyRef).onDestroy(() => this.positioner?.destroy());\r\n if (typeof ngDevMode !== 'undefined' && ngDevMode) {\r\n // Dev-only sanity warnings (stripped in prod) — never thrown (ADR 0050 §1).\r\n const warn = computed(() => {\r\n const v = this.value();\r\n if (v !== '' && !isValidIso(v))\r\n return `skra-datepicker: value \"${v}\" is not a valid YYYY-MM-DD date; shown as unset.`;\r\n if (\r\n this.min() !== '' &&\r\n this.max() !== '' &&\r\n compareIso(this.min(), this.max()) > 0\r\n )\r\n return `skra-datepicker: min \"${this.min()}\" is after max \"${this.max()}\" — every day is disabled.`;\r\n return null;\r\n });\r\n afterNextRender(\r\n () => {\r\n const message = warn();\r\n if (message) console.warn(message);\r\n },\r\n { injector: this.injector },\r\n );\r\n }\r\n }\r\n\r\n // ── Trigger interaction ──\r\n protected onTriggerClick(event: MouseEvent): void {\r\n if (this.isReadonly()) event.preventDefault(); // block the native popovertarget open\r\n }\r\n\r\n protected onTriggerKeydown(event: KeyboardEvent): void {\r\n if (this.isDisabled() || this.isReadonly() || this.isOpen()) return;\r\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n this.open(); // Enter/Space/click open via the native popovertarget\r\n }\r\n }\r\n\r\n // ── Grid keyboard (APG Date Picker, 2-D) ──\r\n protected onGridKeydown(event: KeyboardEvent): void {\r\n if (event.key === 'Tab') {\r\n // APG: Tab dismisses the calendar; focus returns to the trigger (deterministic, no containment).\r\n event.preventDefault();\r\n this.returnFocus = true;\r\n this.close();\r\n return;\r\n }\r\n const intent = this.keyboard.resolve(event, {\r\n focusedIso: this.focusedIso(),\r\n firstDayOfWeek: this.firstDow(),\r\n });\r\n switch (intent.type) {\r\n case 'focus':\r\n event.preventDefault();\r\n this.focusedIso.set(intent.iso);\r\n this.scheduleFocus(); // re-focus after the grid re-stamps\r\n break;\r\n case 'select':\r\n event.preventDefault();\r\n this.selectDate(this.focusedIso());\r\n break;\r\n case 'close':\r\n this.returnFocus = true;\r\n this.close();\r\n break;\r\n case 'none':\r\n break;\r\n }\r\n }\r\n\r\n // ── Month navigation (pointer; focus stays on the nav button) ──\r\n protected goToPreviousMonth(): void {\r\n this.focusedIso.set(addMonthsClamped(this.focusedIso(), -1));\r\n }\r\n protected goToNextMonth(): void {\r\n this.focusedIso.set(addMonthsClamped(this.focusedIso(), 1));\r\n }\r\n\r\n // ── Selection ──\r\n protected selectDate(iso: string): void {\r\n if (!isInRange(iso, this.min(), this.max())) return; // guard out-of-range (one place: keyboard + pointer)\r\n this.returnFocus = true;\r\n this.valueChange.emit(iso);\r\n this.close();\r\n }\r\n\r\n // ── Panel open / close (native toggle from the Popover API) ──\r\n protected onPanelToggle(event: Event): void {\r\n const open = (event as ToggleEvent).newState === 'open';\r\n this.isOpen.set(open);\r\n if (open) this.onOpen();\r\n else this.onClose();\r\n }\r\n\r\n private onOpen(): void {\r\n this.focusedIso.set(this.seedFocus());\r\n const anchor = this.triggerRef()?.nativeElement;\r\n const panel = this.panelRef()?.nativeElement;\r\n if (anchor && panel) {\r\n this.positioner?.destroy();\r\n this.positioner = _attachPositioner(anchor, panel, () => ({\r\n placement: this.placement(),\r\n offset: this.cssLenPx('--skra-comp-datepicker-panel-offset'),\r\n viewportPadding: this.cssLenPx(\r\n '--skra-comp-datepicker-panel-viewport-padding',\r\n ),\r\n }));\r\n }\r\n this.scheduleFocus();\r\n }\r\n\r\n private onClose(): void {\r\n this.positioner?.destroy();\r\n this.positioner = undefined;\r\n if (this.returnFocus) {\r\n this.returnFocus = false;\r\n this.triggerRef()?.nativeElement.focus();\r\n }\r\n }\r\n\r\n private open(): void {\r\n this.panelRef()?.nativeElement.showPopover?.();\r\n }\r\n private close(): void {\r\n this.panelRef()?.nativeElement.hidePopover?.();\r\n }\r\n\r\n /** Seed the focused day on open: the valid current value, else today, clamped into `[min,max]`. */\r\n private seedFocus(): string {\r\n const v = this.value();\r\n const base = isValidIso(v) ? v : this.todayIso;\r\n return clampIso(base, this.min(), this.max());\r\n }\r\n\r\n private monthOffsetLabel(n: number): string {\r\n const { y, m } = this.displayedMonth();\r\n const ref = parseIso(addMonthsClamped(toIso({ y, m, d: 1 }), n))!;\r\n return formatMonthYear(ref.y, ref.m, this.locale());\r\n }\r\n\r\n private emptyCell(key: string): DayCell {\r\n return {\r\n key,\r\n iso: null,\r\n dayNum: '',\r\n srName: '',\r\n today: false,\r\n selected: false,\r\n disabled: true,\r\n focused: false,\r\n };\r\n }\r\n\r\n private scheduleFocus(): void {\r\n afterNextRender(() => this.focusActiveDay(), { injector: this.injector });\r\n }\r\n\r\n private focusActiveDay(): void {\r\n this.panelRef()\r\n ?.nativeElement.querySelector<HTMLElement>(\r\n '.skra-datepicker-day[tabindex=\"0\"]',\r\n )\r\n ?.focus();\r\n }\r\n\r\n /** Read a length comp token (px/rem) off the panel computed style for the positioner. */\r\n private cssLenPx(prop: string): number {\r\n const el = this.panelRef()?.nativeElement;\r\n if (!el) return 0;\r\n const raw = getComputedStyle(el).getPropertyValue(prop).trim();\r\n if (raw.endsWith('px')) return parseFloat(raw);\r\n if (raw.endsWith('rem')) {\r\n const rootFontSize =\r\n parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;\r\n return parseFloat(raw) * rootFontSize;\r\n }\r\n return parseFloat(raw) || 0;\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"skra-ui-datepicker.mjs","sources":["../../../../libs/ui/datepicker/src/lib/datepicker/calendar-math.ts","../../../../libs/ui/datepicker/src/lib/datepicker/calendar-keyboard.ts","../../../../libs/ui/datepicker/src/lib/datepicker/calendar-intl.ts","../../../../libs/ui/datepicker/src/lib/datepicker/datepicker.ts","../../../../libs/ui/datepicker/src/skra-ui-datepicker.ts"],"sourcesContent":["/**\r\n * calendar-math — the ONE sanctioned site for DatePicker date arithmetic (ADR 0050 §3/§6) AND for every\r\n * precision-aware key operation (ADR 0057 R3 — no parallel helper).\r\n *\r\n * Zoneless calendar-date discipline (the timezone off-by-one is the bug class this exists to prevent):\r\n * - The value is an ISO 8601 date-only string (`YYYY-MM-DD`) — NEVER materialized as a `Date`.\r\n * - `Date` is used ONLY as a UTC calendar calculator — built via `Date.UTC(...)`, read via `getUTC*`.\r\n * - `new Date(isoString)` is FORBIDDEN (date-only parses as UTC midnight → local accessors shift it).\r\n * - \"today\" uses LOCAL accessors — \"today\" is inherently local-civil.\r\n * - Month length + leap years are delegated to the platform engine, NEVER a hand-written leap rule.\r\n *\r\n * Months are **1-based** here (1=Jan … 12=Dec) to mirror the ISO string; the single 0-based conversion\r\n * happens at the `Date.UTC` call sites. Weekdays are **ISO** (1=Mon … 7=Sun) to match `firstDayOfWeek`.\r\n *\r\n * This module is the ADR 0050 §6 swap-point: a future `Temporal.PlainDate` migration touches only here.\r\n */\r\n\r\n/** A zoneless calendar date. `m` is 1-based (1=Jan … 12=Dec). */\r\nexport interface CalendarDate {\r\n readonly y: number;\r\n readonly m: number;\r\n readonly d: number;\r\n}\r\n\r\nconst ISO_DATE = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\r\n\r\n/** Zero-pad to a fixed width (no locale, no `Intl` — pure formatting). */\r\nfunction pad(n: number, width: number): string {\r\n return String(n).padStart(width, '0');\r\n}\r\n\r\n/** Days in month `m` (1-based) of year `y` — delegated to the engine (leap years handled for free). */\r\nexport function daysInMonth(y: number, m: number): number {\r\n // Date.UTC month is 0-based; passing the 1-based `m` selects the NEXT month, day 0 = last of `m`.\r\n return new Date(Date.UTC(y, m, 0)).getUTCDate();\r\n}\r\n\r\n/** ISO weekday (1=Mon … 7=Sun) of an arbitrary {y,m,d}, via the UTC calculator. */\r\nexport function isoWeekday(y: number, m: number, d: number): number {\r\n const jsDay = new Date(Date.UTC(y, m - 1, d)).getUTCDay(); // 0=Sun … 6=Sat\r\n return ((jsDay + 6) % 7) + 1; // → 1=Mon … 7=Sun\r\n}\r\n\r\n/** Strict `YYYY-MM-DD` parse with real calendar validation. Returns `null` for anything invalid. */\r\nexport function parseIso(iso: string): CalendarDate | null {\r\n const match = ISO_DATE.exec(iso);\r\n if (!match) return null;\r\n const y = Number(match[1]);\r\n const m = Number(match[2]);\r\n const d = Number(match[3]);\r\n if (m < 1 || m > 12) return null;\r\n if (d < 1 || d > daysInMonth(y, m)) return null; // rejects 2026-02-30, 2026-04-31, etc.\r\n return { y, m, d };\r\n}\r\n\r\n/** `true` iff `iso` is a strictly valid `YYYY-MM-DD` calendar date. */\r\nexport function isValidIso(iso: string): boolean {\r\n return parseIso(iso) !== null;\r\n}\r\n\r\n/** Serialize a calendar date to `YYYY-MM-DD`. */\r\nexport function toIso({ y, m, d }: CalendarDate): string {\r\n return `${pad(y, 4)}-${pad(m, 2)}-${pad(d, 2)}`;\r\n}\r\n\r\n/**\r\n * Build a UTC `Date` from an ISO string — the ONLY sanctioned `Date`-from-value site (used by\r\n * `calendar-intl` to feed `Intl.DateTimeFormat`, which MUST also pass `timeZone:'UTC'`). Returns the\r\n * value as a UTC instant; callers MUST read it back via UTC accessors / a UTC-zoned formatter ONLY.\r\n */\r\nexport function toUtcDate(iso: string): Date | null {\r\n const date = parseIso(iso);\r\n if (!date) return null;\r\n return new Date(Date.UTC(date.y, date.m - 1, date.d));\r\n}\r\n\r\n/** Today's LOCAL calendar date as ISO (local accessors — \"today\" is local-civil, ADR 0050 §3). */\r\nexport function today(): string {\r\n const now = new Date();\r\n return toIso({\r\n y: now.getFullYear(),\r\n m: now.getMonth() + 1,\r\n d: now.getDate(),\r\n });\r\n}\r\n\r\n/** Add `n` days (may be negative); crosses month/year boundaries via the UTC engine. */\r\nexport function addDays(iso: string, n: number): string {\r\n const date = parseIso(iso);\r\n if (!date) return iso;\r\n const dt = new Date(Date.UTC(date.y, date.m - 1, date.d));\r\n dt.setUTCDate(dt.getUTCDate() + n);\r\n return toIso({\r\n y: dt.getUTCFullYear(),\r\n m: dt.getUTCMonth() + 1,\r\n d: dt.getUTCDate(),\r\n });\r\n}\r\n\r\n/**\r\n * Add `n` months (may be negative), preserving day-of-month CLAMPED to the target month length\r\n * (ADR 0050 §4): Jan 31 + 1 month → Feb 28/29, never Mar 3.\r\n */\r\nexport function addMonthsClamped(iso: string, n: number): string {\r\n const date = parseIso(iso);\r\n if (!date) return iso;\r\n const total = date.y * 12 + (date.m - 1) + n;\r\n const y = Math.floor(total / 12);\r\n const m = (((total % 12) + 12) % 12) + 1; // 1-based, safe for negative totals\r\n const d = Math.min(date.d, daysInMonth(y, m));\r\n return toIso({ y, m, d });\r\n}\r\n\r\n/** Add `n` years, clamped (Feb 29 + 1 year → Feb 28). Delegates to month arithmetic. */\r\nexport function addYearsClamped(iso: string, n: number): string {\r\n return addMonthsClamped(iso, n * 12);\r\n}\r\n\r\n/** Lexicographic comparison — valid because same-format ISO 8601 date-only strings are byte-sortable. */\r\nexport function compareIso(a: string, b: string): number {\r\n return a < b ? -1 : a > b ? 1 : 0;\r\n}\r\n\r\n/** Inclusive range test. `''` bound = unbounded on that side (ADR 0050 §2, lexicographic). */\r\nexport function isInRange(iso: string, min: string, max: string): boolean {\r\n if (min !== '' && compareIso(iso, min) < 0) return false;\r\n if (max !== '' && compareIso(iso, max) > 0) return false;\r\n return true;\r\n}\r\n\r\n/** Clamp `iso` into `[min,max]` (each `''` = unbounded). Used to seed the displayed month / focus. */\r\nexport function clampIso(iso: string, min: string, max: string): string {\r\n if (min !== '' && compareIso(iso, min) < 0) return min;\r\n if (max !== '' && compareIso(iso, max) > 0) return max;\r\n return iso;\r\n}\r\n\r\n/**\r\n * Build a month grid: weeks of 7 cells, each a day ISO string or `null` (leading/trailing padding —\r\n * adjacent-month days are NOT rendered in MVP). `firstDayOfWeek` is ISO (1=Mon … 7=Sun).\r\n * Pure + deterministic; the component decorates cells with selected/today/disabled/focused state.\r\n */\r\nexport function monthGrid(\r\n y: number,\r\n m: number,\r\n firstDayOfWeek: number,\r\n): (string | null)[][] {\r\n const firstWeekday = isoWeekday(y, m, 1); // ISO weekday of the 1st\r\n const leadingBlanks = (firstWeekday - firstDayOfWeek + 7) % 7;\r\n const dim = daysInMonth(y, m);\r\n\r\n const cells: (string | null)[] = [];\r\n for (let i = 0; i < leadingBlanks; i++) cells.push(null);\r\n for (let d = 1; d <= dim; d++) cells.push(toIso({ y, m, d }));\r\n while (cells.length % 7 !== 0) cells.push(null); // trailing padding\r\n\r\n const weeks: (string | null)[][] = [];\r\n for (let i = 0; i < cells.length; i += 7) weeks.push(cells.slice(i, i + 7));\r\n return weeks;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Value precision (ADR 0057) — the ISO truncation chain `year → month → day`.\r\n//\r\n// `YYYY-MM` is a PREFIX of `YYYY-MM-DD`, not a second type, which is why precision is a runtime axis\r\n// and cardinality (ADR 0046) is not. Everything precision-aware lives here, per ADR 0057 R3: there is\r\n// no parallel helper module, and this stays the single `Temporal` swap point (ADR 0050 §6).\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/** The granularity of the emitted value (ADR 0057 R1). `'year'` is reserved, not yet implemented. */\r\nexport type SkraDatePrecision = 'day' | 'month';\r\n\r\n/** A zoneless calendar month. `m` is 1-based (1=Jan … 12=Dec). */\r\nexport interface CalendarMonth {\r\n readonly y: number;\r\n readonly m: number;\r\n}\r\n\r\nconst ISO_MONTH = /^(\\d{4})-(\\d{2})$/;\r\n\r\n/** Strict `YYYY-MM` parse. Returns `null` for anything invalid. */\r\nexport function parseIsoMonth(iso: string): CalendarMonth | null {\r\n const match = ISO_MONTH.exec(iso);\r\n if (!match) return null;\r\n const y = Number(match[1]);\r\n const m = Number(match[2]);\r\n if (m < 1 || m > 12) return null;\r\n return { y, m };\r\n}\r\n\r\n/** Serialize a calendar month to `YYYY-MM`. */\r\nexport function toIsoMonth({ y, m }: CalendarMonth): string {\r\n return `${pad(y, 4)}-${pad(m, 2)}`;\r\n}\r\n\r\n/** `true` iff `iso` is a strictly valid `YYYY-MM` month key. */\r\nexport function isValidIsoMonth(iso: string): boolean {\r\n return parseIsoMonth(iso) !== null;\r\n}\r\n\r\n/** `true` iff `iso` is strictly valid AT `precision` (ADR 0057 R3 — format follows precision). */\r\nexport function isValidAt(iso: string, precision: SkraDatePrecision): boolean {\r\n return precision === 'month' ? isValidIsoMonth(iso) : isValidIso(iso);\r\n}\r\n\r\n/**\r\n * Re-key an ISO key to `precision`, or `''` when it cannot be expressed there.\r\n * Truncating down is a slice (`2026-06-14` → `2026-06`); widening up anchors to the first of the\r\n * month (`2026-06` → `2026-06-01`), which is the only choice that keeps the key valid.\r\n */\r\nexport function reKey(key: string, precision: SkraDatePrecision): string {\r\n if (key === '') return '';\r\n if (precision === 'month') {\r\n if (isValidIsoMonth(key)) return key;\r\n return isValidIso(key) ? key.slice(0, 7) : '';\r\n }\r\n if (isValidIso(key)) return key;\r\n return isValidIsoMonth(key) ? `${key}-01` : '';\r\n}\r\n\r\n/**\r\n * Normalize a `min`/`max` bound to `precision`, or `''` (= unbounded) when it cannot be expressed there.\r\n *\r\n * ADR 0057 R4: in month precision a DAY bound's day component is deliberately ignored — `min=\"2026-03-15\"`\r\n * truncates to `2026-03`, so **March 2026 stays selectable**. The value is the month, not a day inside it,\r\n * so a partially-in-range month is in range. In day precision a MONTH bound is rejected rather than\r\n * guessed: widening it would mean `min` anchors to the 1st but `max` would have to anchor to the last day,\r\n * and inventing that asymmetry silently is worse than treating the bound as unset.\r\n */\r\nexport function boundAt(bound: string, precision: SkraDatePrecision): string {\r\n if (bound === '') return '';\r\n if (precision === 'month') return reKey(bound, 'month');\r\n return isValidIso(bound) ? bound : '';\r\n}\r\n\r\n/**\r\n * Inclusive range test AT `precision` — the candidate and BOTH bounds are truncated to the same\r\n * precision before the lexicographic compare (ADR 0057 R4).\r\n *\r\n * Comparing mixed-precision keys byte-wise is the trap this exists to close: `'2026-03' < '2026-03-15'`\r\n * is lexicographically true, so an un-truncated compare would silently disable a month that is in range.\r\n */\r\nexport function isInRangeAt(\r\n key: string,\r\n min: string,\r\n max: string,\r\n precision: SkraDatePrecision,\r\n): boolean {\r\n const k = reKey(key, precision);\r\n if (k === '') return false;\r\n return isInRange(k, boundAt(min, precision), boundAt(max, precision));\r\n}\r\n\r\n/** Clamp `key` into `[min,max]` AT `precision` (each `''` = unbounded). Seeds the displayed period. */\r\nexport function clampAt(\r\n key: string,\r\n min: string,\r\n max: string,\r\n precision: SkraDatePrecision,\r\n): string {\r\n const k = reKey(key, precision);\r\n if (k === '') return k;\r\n return clampIso(k, boundAt(min, precision), boundAt(max, precision));\r\n}\r\n\r\n/** Add `n` months (may be negative) to a `YYYY-MM` key. No day component, so nothing to clamp. */\r\nexport function addMonthsToKey(key: string, n: number): string {\r\n const month = parseIsoMonth(key);\r\n if (!month) return key;\r\n const total = month.y * 12 + (month.m - 1) + n;\r\n const y = Math.floor(total / 12);\r\n const m = (((total % 12) + 12) % 12) + 1; // 1-based, safe for negative totals\r\n return toIsoMonth({ y, m });\r\n}\r\n\r\n/** Add `n` years to a `YYYY-MM` key. Delegates to month arithmetic. */\r\nexport function addYearsToKey(key: string, n: number): string {\r\n return addMonthsToKey(key, n * 12);\r\n}\r\n\r\n/** First month of the calendar quarter containing `key` (the month grid's ROW start — ADR 0057 §5). */\r\nexport function quarterStartKey(key: string): string {\r\n const month = parseIsoMonth(key);\r\n if (!month) return key;\r\n return toIsoMonth({ y: month.y, m: Math.floor((month.m - 1) / 3) * 3 + 1 });\r\n}\r\n\r\n/** Last month of the calendar quarter containing `key` (the month grid's ROW end). */\r\nexport function quarterEndKey(key: string): string {\r\n return addMonthsToKey(quarterStartKey(key), 2);\r\n}\r\n\r\n/**\r\n * Build a month grid for year `y`: the 12 months as `YYYY-MM` keys in **4 rows × 3 columns**.\r\n * Rows are quarter-aligned, which is what makes Arrow Up/Down (∓3 months) a meaningful step, and\r\n * 3 wide columns fit full localized month names at the panel width the 7-column day grid already sets.\r\n * Unlike `monthGrid` there is no padding — a year always holds exactly 12 months.\r\n */\r\nexport function yearGrid(y: number): string[][] {\r\n const rows: string[][] = [];\r\n for (let q = 0; q < 4; q++) {\r\n const row: string[] = [];\r\n for (let i = 1; i <= 3; i++) row.push(toIsoMonth({ y, m: q * 3 + i }));\r\n rows.push(row);\r\n }\r\n return rows;\r\n}\r\n\r\n/** Today's LOCAL calendar key at `precision` (local accessors — \"today\" is local-civil, ADR 0050 §3). */\r\nexport function todayAt(precision: SkraDatePrecision): string {\r\n return reKey(today(), precision);\r\n}\r\n","import {\r\n addDays,\r\n addMonthsClamped,\r\n addMonthsToKey,\r\n addYearsClamped,\r\n addYearsToKey,\r\n isoWeekday,\r\n parseIso,\r\n quarterEndKey,\r\n quarterStartKey,\r\n type SkraDatePrecision,\r\n} from './calendar-math';\r\n\r\n/**\r\n * The intent a key produces in the calendar grid. The controller is PURE (no DOM, no focus, no signals);\r\n * the `skra-datepicker` component applies the intent — sets `focusedKey`/the displayed period and moves REAL\r\n * DOM focus (roving). The component re-focuses unconditionally after a `focus` intent, so the intent\r\n * carries no \"did the period change\" hint: a field nothing reads is public API that only costs (dropped\r\n * in the ADR 0057 review, together with its `monthChanged` predecessor).\r\n */\r\nexport type CalendarKeyIntent =\r\n | {\r\n readonly type: 'focus';\r\n readonly iso: string;\r\n }\r\n | { readonly type: 'select' }\r\n | { readonly type: 'close' }\r\n | { readonly type: 'none' };\r\n\r\nexport interface CalendarKeyContext {\r\n /** The currently focused cell, as an ISO key AT `view` precision (`YYYY-MM-DD` or `YYYY-MM`). */\r\n readonly focusedIso: string;\r\n /** First day of week, ISO 1=Mon … 7=Sun (already resolved by `calendar-intl`). Day view only. */\r\n readonly firstDayOfWeek: number;\r\n /** Which grid is on screen — the ADR 0057 precision axis. */\r\n readonly view: SkraDatePrecision;\r\n}\r\n\r\nconst NONE: CalendarKeyIntent = { type: 'none' };\r\n\r\n/** Grid width per view — also the Arrow Up/Down step (one row). */\r\nconst COLUMNS: Record<SkraDatePrecision, number> = { day: 7, month: 3 };\r\n\r\n/**\r\n * SkraCalendarKeyboard — the WAI-ARIA APG **Date Picker Dialog** grid keyboard model (2-D), confined to\r\n * ONE file. The THIRD per-pattern keyboard controller and the FIRST that does NOT wrap a CDK key manager:\r\n * neither `FocusKeyManager` (Menu) nor `ActiveDescendantKeyManager` (Select/Combobox) models a 2-D grid\r\n * whose focusable cell set is recomputed on period change (ADR 0044 §7 note, 2026-06-14). Date arithmetic\r\n * is delegated to `calendar-math` (the ADR 0050 single math site); this controller only maps keys to\r\n * intents. Roving REAL focus (NOT `aria-activedescendant`) — the divergence from Select/Combobox.\r\n *\r\n * **One model, two unit sets (ADR 0057 R8).** The `day` and `month` views share every key, every intent and\r\n * the whole `switch` below; they differ ONLY in what a step, a row and a page mean. That parameterization is\r\n * the falsifiable claim behind treating precision as a runtime axis rather than a second component — if this\r\n * ever needs a second `resolve`, the classification was wrong and the feature splits.\r\n *\r\n * | Key | `day` view | `month` view |\r\n * | --------------------- | ----------------------------- | ----------------------------- |\r\n * | Left / Right | ∓1 day | ∓1 month |\r\n * | Up / Down | ∓7 days (one week row) | ∓3 months (one quarter row) |\r\n * | Home / End | first / last day of the week | first / last month of the quarter |\r\n * | PageUp / PageDown | ∓1 month (clamped) | ∓1 year |\r\n * | Shift+PageUp / -Down | ∓1 year (clamped) | ∓10 years |\r\n *\r\n * Home/End stay ROW-scoped in both views — APG grid semantics, and one rule beats two.\r\n *\r\n * Navigation is unclamped (a user may move onto a disabled out-of-range cell — APG-discoverable); only\r\n * SELECTION is range-guarded, and that guard lives in the component (one place, shared with pointer click).\r\n */\r\nexport class SkraCalendarKeyboard {\r\n resolve(\r\n event: { key: string; shiftKey: boolean },\r\n ctx: CalendarKeyContext,\r\n ): CalendarKeyIntent {\r\n const columns = COLUMNS[ctx.view];\r\n switch (event.key) {\r\n case 'ArrowLeft':\r\n return this.toFocus(this.step(ctx, -1));\r\n case 'ArrowRight':\r\n return this.toFocus(this.step(ctx, 1));\r\n case 'ArrowUp':\r\n return this.toFocus(this.step(ctx, -columns));\r\n case 'ArrowDown':\r\n return this.toFocus(this.step(ctx, columns));\r\n case 'Home':\r\n return this.toFocus(this.rowStart(ctx));\r\n case 'End':\r\n return this.toFocus(this.rowEnd(ctx));\r\n case 'PageUp':\r\n return this.toFocus(this.page(ctx, event.shiftKey, -1));\r\n case 'PageDown':\r\n return this.toFocus(this.page(ctx, event.shiftKey, 1));\r\n case 'Enter':\r\n case ' ':\r\n case 'Spacebar': // legacy key name\r\n return { type: 'select' };\r\n case 'Escape':\r\n return { type: 'close' };\r\n default:\r\n return NONE;\r\n }\r\n }\r\n\r\n /** One cell = one day / one month. */\r\n private step(ctx: CalendarKeyContext, n: number): string {\r\n return ctx.view === 'month'\r\n ? addMonthsToKey(ctx.focusedIso, n)\r\n : addDays(ctx.focusedIso, n);\r\n }\r\n\r\n /** Row start: the week (day view) / the calendar quarter (month view). */\r\n private rowStart(ctx: CalendarKeyContext): string {\r\n return ctx.view === 'month'\r\n ? quarterStartKey(ctx.focusedIso)\r\n : this.weekStart(ctx.focusedIso, ctx.firstDayOfWeek);\r\n }\r\n\r\n /** Row end: last day of the week / last month of the quarter. */\r\n private rowEnd(ctx: CalendarKeyContext): string {\r\n return ctx.view === 'month'\r\n ? quarterEndKey(ctx.focusedIso)\r\n : addDays(this.weekStart(ctx.focusedIso, ctx.firstDayOfWeek), 6);\r\n }\r\n\r\n /** Page = the next container up; Shift = the one above that. Day math stays clamped (ADR 0050 §4). */\r\n private page(\r\n ctx: CalendarKeyContext,\r\n shiftKey: boolean,\r\n direction: number,\r\n ): string {\r\n if (ctx.view === 'month')\r\n return addYearsToKey(ctx.focusedIso, direction * (shiftKey ? 10 : 1));\r\n return shiftKey\r\n ? addYearsClamped(ctx.focusedIso, direction)\r\n : addMonthsClamped(ctx.focusedIso, direction);\r\n }\r\n\r\n private toFocus(toIso: string): CalendarKeyIntent {\r\n return { type: 'focus', iso: toIso };\r\n }\r\n\r\n private weekStart(iso: string, firstDayOfWeek: number): string {\r\n const p = parseIso(iso);\r\n if (!p) return iso;\r\n const offset = (isoWeekday(p.y, p.m, p.d) - firstDayOfWeek + 7) % 7;\r\n return addDays(iso, -offset);\r\n }\r\n}\r\n","import { toUtcDate } from './calendar-math';\r\n\r\n/**\r\n * calendar-intl — DatePicker localization via the platform `Intl` (ADR 0050 §5). NO locale string\r\n * catalog is bundled (atoms-agnostic); everything language/digit-related is derived from `Intl`, keyed\r\n * by the consumer `locale`. Every `Date` fed to a formatter comes from `calendar-math.toUtcDate` AND the\r\n * formatter MUST set `timeZone: 'UTC'` (else the displayed date shifts off the zoneless value).\r\n */\r\n\r\nconst UTC = 'UTC';\r\n/**\r\n * The grid, `monthGrid()` and `formatDayNumber()` are all GREGORIAN — non-Gregorian calendars re-shape the\r\n * grid, not just its language, and are out of scope (ADR 0050 Q-8). Every formatter here MUST therefore\r\n * pin the calendar: left to its default, `Intl` follows the LOCALE's, and the widget then labels a\r\n * Gregorian grid with another calendar's months and years. Measured before this was pinned: `fa-IR`\r\n * showed `۱۴۰۴` in the panel header and `۱۴۰۵` in the trigger for ONE value, and a day cell displaying\r\n * `۱۴` named `خرداد ۱۴۰۵` — which is 2026-06-04, not 2026-06-14. Localizing the LANGUAGE is the job;\r\n * re-basing the CALENDAR is a different feature (ADR 0050 §6 adapter seam).\r\n */\r\nconst GREGORY = 'gregory';\r\n\r\n/** Zero-pad a year / month for building the ISO key a formatter is fed. No locale involved. */\r\nfunction pad4(n: number): string {\r\n return String(n).padStart(4, '0');\r\n}\r\nfunction pad2(n: number): string {\r\n return String(n).padStart(2, '0');\r\n}\r\n\r\n/** A localized weekday column header (short label + full name for the `<abbr title>`). */\r\nexport interface WeekdayHeader {\r\n /** ISO weekday 1=Mon … 7=Sun — a stable `@for` track key. */\r\n readonly key: number;\r\n readonly short: string;\r\n readonly long: string;\r\n}\r\n\r\n/** Resolve the host's default BCP-47 locale tag, SSR-safe (no `navigator` in Node). */\r\nfunction hostLocale(): string | undefined {\r\n return typeof navigator !== 'undefined' ? navigator.language : undefined;\r\n}\r\n\r\n/** Trigger display of the selected date, `day` precision (`dateStyle: 'medium'`). `''`/invalid → `''`. */\r\nexport function formatValue(iso: string, locale: string | undefined): string {\r\n const dt = toUtcDate(iso);\r\n if (!dt) return '';\r\n return new Intl.DateTimeFormat(locale, {\r\n dateStyle: 'medium',\r\n timeZone: UTC,\r\n calendar: GREGORY,\r\n }).format(dt);\r\n}\r\n\r\n/**\r\n * Trigger display of the selected month, `month` precision (ADR 0045 — the trigger shows the VALUE).\r\n * Takes a `YYYY-MM` key; `''`/invalid → `''`.\r\n */\r\nexport function formatMonthValue(\r\n key: string,\r\n locale: string | undefined,\r\n): string {\r\n const match = /^(\\d{4})-(\\d{2})$/.exec(key);\r\n if (!match) return '';\r\n return formatMonthYear(Number(match[1]), Number(match[2]), locale);\r\n}\r\n\r\n/** Header / nav-button label for a month: localized `month long + year` (e.g. \"czerwiec 2026\"). */\r\nexport function formatMonthYear(\r\n y: number,\r\n m: number,\r\n locale: string | undefined,\r\n): string {\r\n const dt = toUtcDate(`${pad4(y)}-${pad2(m)}-01`);\r\n if (!dt) return '';\r\n return new Intl.DateTimeFormat(locale, {\r\n month: 'long',\r\n year: 'numeric',\r\n timeZone: UTC,\r\n calendar: GREGORY,\r\n }).format(dt);\r\n}\r\n\r\n/**\r\n * The day cell's `[skra-sr-only]` accessible-name **extension** — the localized month and year, with the\r\n * day number REMOVED (ADR 0057 R6).\r\n *\r\n * The visible text of the cell is already the day number, and `[skra-sr-only]` keeps its content in\r\n * `textContent` (that is the whole point of the clip technique), so an extension formatted with\r\n * `dateStyle: 'long'` restates it: the name computes to `1414 czerwca 2026` in `pl-PL` and\r\n * `14June 14, 2026` in `en-US`. Path 2 extends the visible text; it never repeats it.\r\n *\r\n * The day part is dropped via `formatToParts` so the remaining parts keep the LOCALE's own order, together\r\n * with the literal that separates it from its neighbour (the following one, or the preceding one when the\r\n * day is last) so no stray `, ` or `月` is left behind. Accepted trade-off (ADR 0057 R6): in year-first\r\n * locales the assembled name reads `14 2026年6月` rather than `2026年6月14日` — the visible text is\r\n * positionally first in the DOM and WCAG 2.5.3 requires it to be contained in the name, so perfect\r\n * grammatical order is not reachable without reordering the DOM. Containment and non-duplication are the\r\n * properties that matter.\r\n */\r\nexport function formatDayNameExtension(\r\n iso: string,\r\n locale: string | undefined,\r\n): string {\r\n const dt = toUtcDate(iso);\r\n if (!dt) return '';\r\n const parts = new Intl.DateTimeFormat(locale, {\r\n dateStyle: 'long',\r\n timeZone: UTC,\r\n calendar: GREGORY,\r\n }).formatToParts(dt);\r\n const dayIndex = parts.findIndex((part) => part.type === 'day');\r\n if (dayIndex === -1)\r\n return parts\r\n .map((part) => part.value)\r\n .join('')\r\n .trim();\r\n const separatorIndex =\r\n parts[dayIndex + 1]?.type === 'literal' ? dayIndex + 1 : dayIndex - 1;\r\n return parts\r\n .filter((_, index) => index !== dayIndex && index !== separatorIndex)\r\n .map((part) => part.value)\r\n .join('')\r\n .trim();\r\n}\r\n\r\n/** Visible text of a month cell: the localized full month name (e.g. \"czerwiec\"), no year. */\r\nexport function formatMonthCell(\r\n y: number,\r\n m: number,\r\n locale: string | undefined,\r\n): string {\r\n const dt = toUtcDate(`${pad4(y)}-${pad2(m)}-01`);\r\n if (!dt) return '';\r\n return new Intl.DateTimeFormat(locale, {\r\n month: 'long',\r\n timeZone: UTC,\r\n calendar: GREGORY,\r\n }).format(dt);\r\n}\r\n\r\n/**\r\n * The month cell's `[skra-sr-only]` extension — the localized year (ADR 0057 R6). The visible text is\r\n * already the month name, so the extension carries the year and nothing else.\r\n */\r\nexport function formatYear(y: number, locale: string | undefined): string {\r\n const dt = toUtcDate(`${pad4(y)}-01-01`);\r\n if (!dt) return '';\r\n return new Intl.DateTimeFormat(locale, {\r\n year: 'numeric',\r\n timeZone: UTC,\r\n calendar: GREGORY,\r\n }).format(dt);\r\n}\r\n\r\n/** Visible day number, localized digits (e.g. Arabic-Indic `٥`) — never a raw `toString()`. */\r\nexport function formatDayNumber(\r\n day: number,\r\n locale: string | undefined,\r\n): string {\r\n return new Intl.NumberFormat(locale).format(day);\r\n}\r\n\r\n/**\r\n * Localized weekday column headers, 7 entries starting at `firstDayOfWeek` (ISO 1=Mon … 7=Sun).\r\n * Reference week: 2024-01-01 is a Monday, so day-of-month `d` (1–7) maps directly to ISO weekday `d`.\r\n */\r\nexport function weekdayHeaders(\r\n firstDayOfWeek: number,\r\n locale: string | undefined,\r\n): WeekdayHeader[] {\r\n const shortFmt = new Intl.DateTimeFormat(locale, {\r\n weekday: 'short',\r\n timeZone: UTC,\r\n calendar: GREGORY,\r\n });\r\n const longFmt = new Intl.DateTimeFormat(locale, {\r\n weekday: 'long',\r\n timeZone: UTC,\r\n calendar: GREGORY,\r\n });\r\n const headers: WeekdayHeader[] = [];\r\n for (let i = 0; i < 7; i++) {\r\n const dow = ((firstDayOfWeek - 1 + i) % 7) + 1; // 1 … 7\r\n const dt = toUtcDate(`2024-01-0${dow}`)!; // dow 1–7 → '2024-01-01' … '2024-01-07'\r\n headers.push({\r\n key: dow,\r\n short: shortFmt.format(dt),\r\n long: longFmt.format(dt),\r\n });\r\n }\r\n return headers;\r\n}\r\n\r\n/**\r\n * Resolve the first day of the week (ISO 1=Mon … 7=Sun): explicit `override` → `Intl` `getWeekInfo` →\r\n * **Monday fallback**. The override is the MVP safety valve — `Intl.Locale.getWeekInfo()` support is\r\n * spotty (older Firefox/Safari), so the detection path genuinely fails in mainstream browsers and the\r\n * Monday fallback is wrong for en-US (Sun) / much of the Middle East (Sat) (ADR 0050 §5).\r\n */\r\nexport function resolveFirstDayOfWeek(\r\n override: number | undefined,\r\n locale: string | undefined,\r\n): number {\r\n if (typeof override === 'number' && override >= 1 && override <= 7)\r\n return override;\r\n try {\r\n const loc = new Intl.Locale(\r\n locale ?? hostLocale() ?? 'en',\r\n ) as Intl.Locale & {\r\n getWeekInfo?: () => { firstDay?: number };\r\n weekInfo?: { firstDay?: number };\r\n };\r\n const info = loc.getWeekInfo?.() ?? loc.weekInfo; // method (modern) or property (older engines)\r\n const firstDay = info?.firstDay;\r\n if (typeof firstDay === 'number' && firstDay >= 1 && firstDay <= 7)\r\n return firstDay;\r\n } catch {\r\n /* unsupported / malformed locale → fall through to the documented fallback */\r\n }\r\n return 1; // Monday (ISO-8601 week start)\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n Injector,\r\n ViewEncapsulation,\r\n afterNextRender,\r\n booleanAttribute,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n linkedSignal,\r\n output,\r\n signal,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { SkraFieldContext } from '@skra/ui/field';\r\n\r\nimport {\r\n _attachPositioner,\r\n type SkraPlacement,\r\n type _PositionerHandle,\r\n} from '@skra/ui/core';\r\nimport { SkraCalendarKeyboard } from './calendar-keyboard';\r\nimport {\r\n addMonthsClamped,\r\n addYearsToKey,\r\n boundAt,\r\n clampAt,\r\n compareIso,\r\n isInRangeAt,\r\n isValidAt,\r\n isValidIso,\r\n monthGrid,\r\n parseIso,\r\n parseIsoMonth,\r\n reKey,\r\n toIso,\r\n today,\r\n todayAt,\r\n yearGrid,\r\n type SkraDatePrecision,\r\n} from './calendar-math';\r\nimport {\r\n formatDayNameExtension,\r\n formatDayNumber,\r\n formatMonthCell,\r\n formatMonthValue,\r\n formatMonthYear,\r\n formatValue,\r\n formatYear,\r\n resolveFirstDayOfWeek,\r\n weekdayHeaders,\r\n} from './calendar-intl';\r\n\r\n/**\r\n * One cell of the calendar grid — a day in `day` view, a month in `month` view. ONE model for both\r\n * (ADR 0057 R8): the views differ in what a cell means, never in how a cell behaves.\r\n */\r\ninterface GridCell {\r\n readonly key: string;\r\n /** The value this cell commits, at the active precision. `null` = layout padding (day view only). */\r\n readonly iso: string | null;\r\n /** Visible text — the localized day number, or the localized full month name. */\r\n readonly label: string;\r\n /**\r\n * The ADR 033 Path-2 `[skra-sr-only]` extension, INCLUDING its leading separator, and never a\r\n * restatement of `label` (ADR 0057 R6).\r\n */\r\n readonly srExt: string;\r\n readonly today: boolean;\r\n readonly selected: boolean;\r\n readonly disabled: boolean;\r\n readonly focused: boolean;\r\n}\r\n\r\ninterface GridRow {\r\n readonly key: number;\r\n readonly cells: GridCell[];\r\n}\r\n\r\nlet nextDatePickerId = 0;\r\n\r\n/**\r\n * SkraDatePicker — pick a **calendar date** or a **calendar month** from an APG Date Picker grid in the\r\n * native top layer. Second Tier-3 component. A value-display **trigger** (`<button>`) opens a non-modal\r\n * top-layer **calendar panel** (Popover API, `popover=\"auto\"`, ADR 0044). The value is an **ISO 8601 string**\r\n * truncated to the active `precision` (`YYYY-MM-DD` / `YYYY-MM`), consumer-owned (ADR 0050/0057/037 — NO\r\n * `@angular/forms`); all date math is the zoneless UTC-calculator discipline in `calendar-math` (no date\r\n * library). Localization (month/weekday names, first-day-of-week, digits) is `Intl`-derived in\r\n * `calendar-intl`; the 2-D grid keyboard is the hand-rolled `SkraCalendarKeyboard` (ADR 0044 §7 — roving\r\n * REAL focus, not aria-activedescendant).\r\n *\r\n * **Precision is a runtime axis, not a second component (ADR 0057).** `precision=\"month\"` swaps the 7×N day\r\n * grid for a 3×4 quarter-aligned month grid inside the SAME trigger, panel, positioner, field DI wiring,\r\n * dismissal model, selection model and keyboard controller. The value channel does not widen — `YYYY-MM` is\r\n * a truncation of `YYYY-MM-DD`, both `string` — which is exactly why this is an input and cardinality\r\n * (ADR 0046) is not. `week` / `time` / `datetime-local` are excluded by rule (ADR 0057 R5): they need a\r\n * second calendar coordinate system or are not grids at all, and stay the native `skraInput` path.\r\n *\r\n * No projected content: the cells are GENERATED (the structural divergence from select/combobox — there is\r\n * no `skra-option` reuse). The only focusable element in the open panel is the roving cell; the period-nav\r\n * buttons are pointer affordances (`tabindex=\"-1\"`, driven by PageUp/PageDown on keyboard), and Tab\r\n * dismisses — so no focus-containment machinery is needed (spec Q-1).\r\n *\r\n * Full contract: adr/specs/component-datepicker-spec.md.\r\n */\r\n@Component({\r\n selector: 'skra-datepicker',\r\n standalone: true,\r\n exportAs: 'skraDatePicker',\r\n template: `\r\n <button\r\n #trigger\r\n class=\"skra-datepicker-trigger\"\r\n type=\"button\"\r\n role=\"combobox\"\r\n aria-haspopup=\"dialog\"\r\n [attr.id]=\"triggerId()\"\r\n [attr.popovertarget]=\"panelId\"\r\n [attr.aria-controls]=\"panelId\"\r\n [attr.aria-expanded]=\"isOpen()\"\r\n [attr.aria-describedby]=\"describedBy()\"\r\n [attr.aria-invalid]=\"hasError() ? 'true' : null\"\r\n [attr.aria-required]=\"isRequired() ? 'true' : null\"\r\n [attr.aria-readonly]=\"isReadonly() ? 'true' : null\"\r\n [disabled]=\"isDisabled()\"\r\n (click)=\"onTriggerClick($event)\"\r\n (keydown)=\"onTriggerKeydown($event)\"\r\n >\r\n @if (formattedValue(); as label) {\r\n <span class=\"skra-datepicker-value\">{{ label }}</span>\r\n } @else {\r\n <span class=\"skra-datepicker-placeholder\">{{ placeholder() }}</span>\r\n }\r\n <svg\r\n class=\"skra-datepicker-icon\"\r\n aria-hidden=\"true\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n >\r\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"17\" rx=\"2\" />\r\n <path d=\"M3 9h18M8 2v4M16 2v4\" />\r\n </svg>\r\n </button>\r\n\r\n <div\r\n #panel\r\n class=\"skra-datepicker-panel\"\r\n [id]=\"panelId\"\r\n popover=\"auto\"\r\n role=\"dialog\"\r\n aria-modal=\"false\"\r\n [attr.aria-labelledby]=\"periodId\"\r\n (toggle)=\"onPanelToggle($event)\"\r\n >\r\n <div class=\"skra-datepicker-header\">\r\n <button\r\n type=\"button\"\r\n class=\"skra-datepicker-nav\"\r\n tabindex=\"-1\"\r\n [attr.aria-label]=\"prevPeriodLabel()\"\r\n (click)=\"goToPreviousPeriod()\"\r\n >\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n aria-hidden=\"true\"\r\n >\r\n <path d=\"M15 6l-6 6 6 6\" />\r\n </svg>\r\n </button>\r\n <span\r\n class=\"skra-datepicker-period\"\r\n [id]=\"periodId\"\r\n aria-live=\"polite\"\r\n >{{ periodLabel() }}</span\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"skra-datepicker-nav\"\r\n tabindex=\"-1\"\r\n [attr.aria-label]=\"nextPeriodLabel()\"\r\n (click)=\"goToNextPeriod()\"\r\n >\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n aria-hidden=\"true\"\r\n >\r\n <path d=\"M9 6l6 6-6 6\" />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <table\r\n class=\"skra-datepicker-grid\"\r\n role=\"grid\"\r\n [class.skra-datepicker-grid--month]=\"view() === 'month'\"\r\n [attr.aria-labelledby]=\"periodId\"\r\n >\r\n @if (view() !== 'month') {\r\n <thead>\r\n <tr>\r\n @for (wd of weekdayHeadersView(); track wd.key) {\r\n <th scope=\"col\" class=\"skra-datepicker-weekday\">\r\n <abbr [title]=\"wd.long\">{{ wd.short }}</abbr>\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n }\r\n <tbody>\r\n @for (row of rows(); track row.key) {\r\n <tr>\r\n @for (cell of row.cells; track cell.key) {\r\n @if (cell.iso) {\r\n <td\r\n role=\"gridcell\"\r\n [attr.aria-selected]=\"cell.selected ? 'true' : null\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"skra-datepicker-cell\"\r\n [attr.tabindex]=\"cell.focused ? 0 : -1\"\r\n [attr.aria-current]=\"cell.today ? currentToken() : null\"\r\n [attr.aria-disabled]=\"cell.disabled ? 'true' : null\"\r\n [attr.data-skra-selected]=\"cell.selected ? '' : null\"\r\n [attr.data-skra-today]=\"cell.today ? '' : null\"\r\n (click)=\"selectCell(cell.iso)\"\r\n (keydown)=\"onGridKeydown($event)\"\r\n >\r\n {{ cell.label\r\n }}<span class=\"skra-datepicker-cell-sr\" skra-sr-only>{{\r\n cell.srExt\r\n }}</span>\r\n </button>\r\n </td>\r\n } @else {\r\n <td\r\n class=\"skra-datepicker-cell-empty\"\r\n aria-hidden=\"true\"\r\n ></td>\r\n }\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n `,\r\n styleUrl: './datepicker.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n host: {\r\n '[attr.data-skra-disabled]': 'isDisabled() ? \"\" : null',\r\n '[attr.data-skra-readonly]': 'isReadonly() ? \"\" : null',\r\n '[attr.data-skra-validation]': 'hasError() ? \"invalid\" : null',\r\n },\r\n})\r\nexport class SkraDatePicker {\r\n /**\r\n * Consumer-owned value: an ISO 8601 key truncated to `precision` — `YYYY-MM-DD` (`day`) or `YYYY-MM`\r\n * (`month`); `''` = unset. NEVER a Date (ADR 0050/0057/037).\r\n */\r\n readonly value = input<string>('');\r\n /**\r\n * Value granularity (ADR 0057 R1). `'day'` (default) emits `YYYY-MM-DD` over a 7×N day grid; `'month'`\r\n * emits `YYYY-MM` over a 3×4 quarter-aligned month grid. NOT a look input, NOT a cardinality flag, and\r\n * NOT reflected to a `data-skra-*` attribute — precision is configuration, not state.\r\n */\r\n readonly precision = input<SkraDatePrecision>('day');\r\n /** Inclusive lower bound (ISO); `''` = unbounded (ADR 0050 §2, truncated to `precision` per ADR 0057 R4). */\r\n readonly min = input<string>('');\r\n /** Inclusive upper bound (ISO); `''` = unbounded. */\r\n readonly max = input<string>('');\r\n /** `Intl` locale (BCP-47); `undefined` → host default (ADR 0050 §5). */\r\n readonly locale = input<string | undefined>(undefined);\r\n /** First day of week, ISO 1=Mon … 7=Sun; overrides `Intl.getWeekInfo` (the MVP safety valve, ADR 0050 §5). */\r\n readonly firstDayOfWeek = input<number | undefined>(undefined);\r\n /** Value-empty hint in the trigger (NOT the accessible name — ADR 033). */\r\n readonly placeholder = input<string>('');\r\n /** Placement intent; flip/shift adjust at runtime. */\r\n readonly placement = input<SkraPlacement>('bottom');\r\n /** Standalone availability source — `SkraFieldContext` wins when present. */\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n readonly readonly = input(false, { transform: booleanAttribute });\r\n\r\n /** Fires ONLY on user selection — never on a programmatic `value()`/`precision()` change (ADR 037/0057 R3). */\r\n readonly valueChange = output<string>();\r\n\r\n private readonly triggerRef =\r\n viewChild<ElementRef<HTMLButtonElement>>('trigger');\r\n private readonly panelRef = viewChild<ElementRef<HTMLElement>>('panel');\r\n\r\n private readonly context = inject(SkraFieldContext, { optional: true });\r\n private readonly injector = inject(Injector);\r\n private readonly keyboard = new SkraCalendarKeyboard();\r\n\r\n readonly panelId = `skra-datepicker-${nextDatePickerId}`;\r\n readonly periodId = `skra-datepicker-period-${nextDatePickerId++}`;\r\n protected readonly isOpen = signal(false);\r\n\r\n /**\r\n * Which grid is on screen. Seeded from `precision` and writable in between (ADR 0057 R9) so the deferred\r\n * month/year quick-pick — stepping UP from the day grid to pick a month, then back down — is an additive\r\n * change rather than a rewrite. In MVP nothing writes it, so `view() === precision()` always.\r\n *\r\n * NOTE for whoever lands quick-pick: it adds a second focusable element to the open panel and therefore\r\n * RE-OPENS spec Q-1, which was resolved on the premise that the panel holds exactly one focusable stop\r\n * and Tab dismisses. Re-resolve Q-1 first.\r\n */\r\n protected readonly view = linkedSignal(() => this.precision());\r\n\r\n /** Today's LOCAL date (ADR 0050 §3) — stable for the session. */\r\n private readonly todayIso = today();\r\n /** The roving-focus cell; SINGLE source of truth for what the grid shows AND which cell is focusable. */\r\n private readonly focusedKey = signal(this.todayIso);\r\n /**\r\n * The focused key re-keyed to the active view. A `precision` flip while the panel is closed leaves a key\r\n * at the previous granularity behind; re-keying defensively keeps every downstream `computed` total\r\n * without an effect or a reset cascade. `onOpen` re-seeds properly from the value.\r\n */\r\n private readonly focusedAt = computed(() => {\r\n const view = this.view();\r\n return reKey(this.focusedKey(), view) || todayAt(view);\r\n });\r\n\r\n private positioner?: _PositionerHandle;\r\n /** Set when a close should return focus to the trigger (keyboard/select), not on outside-click. */\r\n private returnFocus = false;\r\n\r\n // ── Availability / validation (SkraFieldContext, ADR 013, with standalone fallbacks) ──\r\n protected readonly isDisabled = computed(\r\n () => this.context?.isDisabled() ?? this.disabled(),\r\n );\r\n protected readonly isReadonly = computed(\r\n () => this.context?.isReadonly() ?? this.readonly(),\r\n );\r\n protected readonly hasError = computed(\r\n () => this.context?.hasError() ?? false,\r\n );\r\n protected readonly isRequired = computed(\r\n () => this.context?.isRequired() ?? false,\r\n );\r\n protected readonly triggerId = computed(\r\n () => this.context?.fieldId() || null,\r\n );\r\n protected readonly describedBy = computed(\r\n () => this.context?.describedByIds() ?? null,\r\n );\r\n\r\n // ── Derived calendar state ──\r\n /**\r\n * The committed value, defensively normalized: wrong-format-for-precision, invalid or out-of-range → `''`\r\n * for display (ADR 0050 §1 as amended by ADR 0057 R3). Keyed on `precision` (what the value IS), not on\r\n * `view` (what is on screen) — the two only diverge once quick-pick lands.\r\n */\r\n protected readonly selectedKey = computed(() => {\r\n const value = this.value();\r\n const precision = this.precision();\r\n return isValidAt(value, precision) &&\r\n isInRangeAt(value, this.min(), this.max(), precision)\r\n ? value\r\n : '';\r\n });\r\n protected readonly formattedValue = computed(() =>\r\n this.precision() === 'month'\r\n ? formatMonthValue(this.selectedKey(), this.locale())\r\n : formatValue(this.selectedKey(), this.locale()),\r\n );\r\n private readonly firstDow = computed(() =>\r\n resolveFirstDayOfWeek(this.firstDayOfWeek(), this.locale()),\r\n );\r\n /**\r\n * The container the grid shows — the focused cell's MONTH in day view, its YEAR in month view (`m` is\r\n * then meaningless). Always derived from the focused cell, which keeps the roving tabindex valid.\r\n */\r\n private readonly displayed = computed(() => {\r\n const key = this.focusedAt();\r\n if (this.view() === 'month') {\r\n const month = parseIsoMonth(key);\r\n return { y: month?.y ?? parseIso(this.todayIso)!.y, m: 1 };\r\n }\r\n const date = parseIso(key) ?? parseIso(this.todayIso)!;\r\n return { y: date.y, m: date.m };\r\n });\r\n protected readonly periodLabel = computed(() => {\r\n const { y, m } = this.displayed();\r\n return this.view() === 'month'\r\n ? formatYear(y, this.locale())\r\n : formatMonthYear(y, m, this.locale());\r\n });\r\n protected readonly prevPeriodLabel = computed(() =>\r\n this.periodOffsetLabel(-1),\r\n );\r\n protected readonly nextPeriodLabel = computed(() =>\r\n this.periodOffsetLabel(1),\r\n );\r\n /**\r\n * `aria-current` token for the cell holding today. ARIA 1.2 has no `month` value, and `date` is\r\n * defined as the current DATE within a collection of dates — accurate for a day cell, a stretch for a\r\n * month cell, where the generic `true` (\"current item within a set\") is the honest mapping.\r\n */\r\n protected readonly currentToken = computed(() =>\r\n this.view() === 'month' ? 'true' : 'date',\r\n );\r\n protected readonly weekdayHeadersView = computed(() =>\r\n weekdayHeaders(this.firstDow(), this.locale()),\r\n );\r\n /** ONE grid renderer, parameterized by view — the ADR 0057 R8 claim, made structural. */\r\n protected readonly rows = computed<GridRow[]>(() =>\r\n this.view() === 'month' ? this.buildMonthRows() : this.buildDayRows(),\r\n );\r\n\r\n constructor() {\r\n inject(DestroyRef).onDestroy(() => this.positioner?.destroy());\r\n\r\n // A `precision` flip while the panel is OPEN re-stamps the whole grid: cells are tracked by their\r\n // ISO key, and a day key never matches a month key, so `@for` destroys and rebuilds every cell\r\n // button and DOM focus falls back to <body>. The roving tabindex survives, but nothing is focused,\r\n // so the arrow keys would be dead until the user clicked. Re-seed and re-focus. (Found in review.)\r\n effect(() => {\r\n this.view(); // the only tracked read — this effect exists to react to a view swap\r\n if (!untracked(() => this.isOpen())) return;\r\n untracked(() => {\r\n this.focusedKey.set(this.seedFocus());\r\n this.scheduleFocus();\r\n });\r\n });\r\n\r\n if (typeof ngDevMode !== 'undefined' && ngDevMode) {\r\n // Dev-only sanity warnings (stripped in prod) — never thrown (ADR 0050 §1). REACTIVE on purpose:\r\n // ADR 0057 R3 contemplates a runtime `precision` flip, and a one-shot first-render check would go\r\n // silent for exactly the mismatch that flip creates. (The `afterNextRender` version this replaces\r\n // read a `computed` once and was reactive in appearance only — found in review.)\r\n effect(() => {\r\n const message = this.devWarning();\r\n if (message) console.warn(message);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * The dev-mode diagnostic, or `null` when the inputs are coherent. Split out of the constructor so it\r\n * is a plain reactive expression rather than a closure buried in a lifecycle hook.\r\n */\r\n private readonly devWarning = computed(() => {\r\n const value = this.value();\r\n const precision = this.precision();\r\n const rawMin = this.min();\r\n const rawMax = this.max();\r\n\r\n if (value !== '' && !isValidAt(value, precision))\r\n return `skra-datepicker: value \"${value}\" is not a valid ${\r\n precision === 'month' ? 'YYYY-MM month' : 'YYYY-MM-DD date'\r\n } key for precision=\"${precision}\"; shown as unset.`;\r\n\r\n const min = boundAt(rawMin, precision);\r\n const max = boundAt(rawMax, precision);\r\n if (min !== '' && max !== '' && compareIso(min, max) > 0)\r\n return `skra-datepicker: min \"${rawMin}\" is after max \"${rawMax}\" — every cell is disabled.`;\r\n\r\n // A bound that cannot be expressed at the active precision is NOT an error, but it is never what\r\n // the author meant, and silence is the failure mode: in month precision a day bound is truncated\r\n // (ADR 0057 R4), and in day precision a month bound is dropped to unbounded rather than guessed.\r\n // Report BOTH bounds — reporting only `min` hid the `max` case.\r\n const ignored = (\r\n [\r\n ['min', rawMin],\r\n ['max', rawMax],\r\n ] as const\r\n ).filter(([, raw]) => raw !== '' && boundAt(raw, precision) !== raw);\r\n if (ignored.length > 0)\r\n return ignored\r\n .map(([name, raw]) =>\r\n precision === 'month'\r\n ? `skra-datepicker: ${name}=\"${raw}\" carries a day component that precision=\"month\" ignores; compared as \"${raw.slice(0, 7)}\".`\r\n : `skra-datepicker: ${name}=\"${raw}\" is not a valid YYYY-MM-DD key for precision=\"day\"; treated as unbounded. A month bound is NOT widened — \"min\" would anchor to the 1st but \"max\" would have to anchor to the last day, and inventing that asymmetry silently is worse.`,\r\n )\r\n .join(' ');\r\n\r\n return null;\r\n });\r\n // ── Trigger interaction ──\r\n protected onTriggerClick(event: MouseEvent): void {\r\n if (this.isReadonly()) event.preventDefault(); // block the native popovertarget open\r\n }\r\n\r\n protected onTriggerKeydown(event: KeyboardEvent): void {\r\n if (this.isDisabled() || this.isReadonly() || this.isOpen()) return;\r\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n this.open(); // Enter/Space/click open via the native popovertarget\r\n }\r\n }\r\n\r\n // ── Grid keyboard (APG Date Picker, 2-D) ──\r\n protected onGridKeydown(event: KeyboardEvent): void {\r\n if (event.key === 'Tab') {\r\n // APG: Tab dismisses the calendar; focus returns to the trigger (deterministic, no containment).\r\n event.preventDefault();\r\n this.returnFocus = true;\r\n this.close();\r\n return;\r\n }\r\n const intent = this.keyboard.resolve(event, {\r\n focusedIso: this.focusedAt(),\r\n firstDayOfWeek: this.firstDow(),\r\n view: this.view(),\r\n });\r\n switch (intent.type) {\r\n case 'focus':\r\n event.preventDefault();\r\n this.focusedKey.set(intent.iso);\r\n this.scheduleFocus(); // re-focus after the grid re-stamps\r\n break;\r\n case 'select':\r\n event.preventDefault();\r\n this.selectCell(this.focusedAt());\r\n break;\r\n case 'close':\r\n this.returnFocus = true;\r\n this.close();\r\n break;\r\n case 'none':\r\n break;\r\n }\r\n }\r\n\r\n // ── Period navigation (pointer; focus stays on the nav button) ──\r\n protected goToPreviousPeriod(): void {\r\n this.stepPeriod(-1);\r\n }\r\n protected goToNextPeriod(): void {\r\n this.stepPeriod(1);\r\n }\r\n /** One period = one month (day view) / one year (month view). */\r\n private stepPeriod(offset: number): void {\r\n const key = this.focusedAt();\r\n this.focusedKey.set(\r\n this.view() === 'month'\r\n ? addYearsToKey(key, offset)\r\n : addMonthsClamped(key, offset),\r\n );\r\n }\r\n\r\n // ── Selection ──\r\n protected selectCell(iso: string): void {\r\n const precision = this.precision();\r\n if (this.view() !== precision) {\r\n // Reserved for the ADR 0057 R9 quick-pick. The moment a NAVIGATION view can differ from the\r\n // terminal precision, a cell click in it is a step DOWN, not a commit — emitting here would\r\n // silently write `2026-06-01` for a click on \"June\" under `precision=\"day\"`. No such view exists\r\n // yet, so this is a hard stop, not a behaviour: the step-down path must be filled in before a\r\n // navigation view can ship. Cheap to add now, invisible to fix later. (Raised in review.)\r\n if (typeof ngDevMode !== 'undefined' && ngDevMode)\r\n console.warn(\r\n `skra-datepicker: a cell was activated in the \"${this.view()}\" view while precision is ` +\r\n `\"${precision}\". Nothing was emitted — a navigation view needs the ADR 0057 R9 step-down path.`,\r\n );\r\n return;\r\n }\r\n // Guard out-of-range in ONE place (keyboard + pointer), at the precision the value is emitted in.\r\n if (!isInRangeAt(iso, this.min(), this.max(), precision)) return;\r\n this.returnFocus = true;\r\n this.valueChange.emit(reKey(iso, precision));\r\n this.close();\r\n }\r\n\r\n // ── Panel open / close (native toggle from the Popover API) ──\r\n protected onPanelToggle(event: Event): void {\r\n const open = (event as ToggleEvent).newState === 'open';\r\n this.isOpen.set(open);\r\n if (open) this.onOpen();\r\n else this.onClose();\r\n }\r\n\r\n private onOpen(): void {\r\n this.focusedKey.set(this.seedFocus());\r\n const anchor = this.triggerRef()?.nativeElement;\r\n const panel = this.panelRef()?.nativeElement;\r\n if (anchor && panel) {\r\n this.positioner?.destroy();\r\n this.positioner = _attachPositioner(anchor, panel, () => ({\r\n placement: this.placement(),\r\n offset: this.cssLenPx('--skra-comp-datepicker-panel-offset'),\r\n viewportPadding: this.cssLenPx(\r\n '--skra-comp-datepicker-panel-viewport-padding',\r\n ),\r\n }));\r\n }\r\n this.scheduleFocus();\r\n }\r\n\r\n private onClose(): void {\r\n this.positioner?.destroy();\r\n this.positioner = undefined;\r\n if (this.returnFocus) {\r\n this.returnFocus = false;\r\n this.triggerRef()?.nativeElement.focus();\r\n }\r\n }\r\n\r\n private open(): void {\r\n this.panelRef()?.nativeElement.showPopover?.();\r\n }\r\n private close(): void {\r\n this.panelRef()?.nativeElement.hidePopover?.();\r\n }\r\n\r\n /** Seed the focused cell on open: the valid current value, else today, clamped into `[min,max]`. */\r\n private seedFocus(): string {\r\n const value = this.value();\r\n const precision = this.precision();\r\n const base = isValidAt(value, precision) ? value : todayAt(precision);\r\n return clampAt(base, this.min(), this.max(), precision);\r\n }\r\n\r\n // ── Grid builders ──\r\n private buildDayRows(): GridRow[] {\r\n const { y, m } = this.displayed();\r\n const locale = this.locale();\r\n const selected = reKey(this.selectedKey(), 'day');\r\n const focused = this.focusedAt();\r\n const min = this.min();\r\n const max = this.max();\r\n return monthGrid(y, m, this.firstDow()).map((week, rowIndex) => ({\r\n key: rowIndex,\r\n cells: week.map((iso, columnIndex) =>\r\n iso === null\r\n ? this.emptyCell(`${rowIndex}-${columnIndex}`)\r\n : {\r\n key: iso,\r\n iso,\r\n label: formatDayNumber(parseIso(iso)!.d, locale),\r\n srExt: this.srExtension(formatDayNameExtension(iso, locale)),\r\n today: iso === this.todayIso,\r\n selected: iso === selected,\r\n disabled: !isInRangeAt(iso, min, max, 'day'),\r\n focused: iso === focused,\r\n },\r\n ),\r\n }));\r\n }\r\n\r\n private buildMonthRows(): GridRow[] {\r\n const { y } = this.displayed();\r\n const locale = this.locale();\r\n const selected = reKey(this.selectedKey(), 'month');\r\n const focused = this.focusedAt();\r\n const todayKey = todayAt('month');\r\n const min = this.min();\r\n const max = this.max();\r\n const yearLabel = this.srExtension(formatYear(y, locale));\r\n return yearGrid(y).map((quarter, rowIndex) => ({\r\n key: rowIndex,\r\n cells: quarter.map((key) => ({\r\n key,\r\n iso: key,\r\n label: formatMonthCell(y, parseIsoMonth(key)!.m, locale),\r\n srExt: yearLabel,\r\n today: key === todayKey,\r\n selected: key === selected,\r\n disabled: !isInRangeAt(key, min, max, 'month'),\r\n focused: key === focused,\r\n })),\r\n }));\r\n }\r\n\r\n /**\r\n * The accessible-name separator is baked into the extension rather than left to the template or to the\r\n * engine: `[skra-sr-only]` is absolutely positioned, so whether the name computation inserts a space\r\n * between the visible text and the extension is engine-dependent. One explicit space, asserted by test.\r\n */\r\n private srExtension(text: string): string {\r\n return text === '' ? '' : ` ${text}`;\r\n }\r\n\r\n private periodOffsetLabel(offset: number): string {\r\n const { y, m } = this.displayed();\r\n const locale = this.locale();\r\n if (this.view() === 'month') return formatYear(y + offset, locale);\r\n const ref = parseIso(addMonthsClamped(toIso({ y, m, d: 1 }), offset));\r\n return ref ? formatMonthYear(ref.y, ref.m, locale) : '';\r\n }\r\n\r\n private emptyCell(key: string): GridCell {\r\n return {\r\n key,\r\n iso: null,\r\n label: '',\r\n srExt: '',\r\n today: false,\r\n selected: false,\r\n disabled: true,\r\n focused: false,\r\n };\r\n }\r\n\r\n private scheduleFocus(): void {\r\n afterNextRender(() => this.focusActiveCell(), { injector: this.injector });\r\n }\r\n\r\n private focusActiveCell(): void {\r\n this.panelRef()\r\n ?.nativeElement.querySelector<HTMLElement>(\r\n '.skra-datepicker-cell[tabindex=\"0\"]',\r\n )\r\n ?.focus();\r\n }\r\n\r\n /** Read a length comp token (px/rem) off the panel computed style for the positioner. */\r\n private cssLenPx(prop: string): number {\r\n const el = this.panelRef()?.nativeElement;\r\n if (!el) return 0;\r\n const raw = getComputedStyle(el).getPropertyValue(prop).trim();\r\n if (raw.endsWith('px')) return parseFloat(raw);\r\n if (raw.endsWith('rem')) {\r\n const rootFontSize =\r\n parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;\r\n return parseFloat(raw) * rootFontSize;\r\n }\r\n return parseFloat(raw) || 0;\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skra-ui-dialog.mjs","sources":["../../../../libs/ui/dialog/src/lib/dialog/dialog.ts","../../../../libs/ui/dialog/src/skra-ui-dialog.ts"],"sourcesContent":["import {\
|
|
1
|
+
{"version":3,"file":"skra-ui-dialog.mjs","sources":["../../../../libs/ui/dialog/src/lib/dialog/dialog.ts","../../../../libs/ui/dialog/src/skra-ui-dialog.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n inject,\n input,\n output,\n} from '@angular/core';\n\n/**\n * DialogSize — width bucket (Variant Surface, ADR 035 Size axis).\n * Closed enum; extension requires an ADR 035 amendment.\n */\nexport type DialogSize = 'sm' | 'md' | 'lg';\n\ndeclare const ngDevMode: boolean | undefined;\n\n/** Tab-focusable elements — for the dev-mode \"no focus target\" nudge only. */\nconst FOCUSABLE_SELECTOR =\n 'a[href],area[href],button:not([disabled]),input:not([disabled]),' +\n 'select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"]),' +\n 'details,summary,[contenteditable]:not([contenteditable=\"false\"])';\n\n/**\n * Composed active element across open shadow roots — the real focused control when the\n * trigger lives inside a Shadow DOM subtree (microfrontend isolation).\n */\nfunction deepActiveElement(): HTMLElement | null {\n let active = document.activeElement as HTMLElement | null;\n while (active?.shadowRoot?.activeElement) {\n active = active.shadowRoot.activeElement as HTMLElement;\n }\n return active;\n}\n\n/**\n * SkraDialog — a Component on the native `<dialog>` host (ADR 012/040/041), rendered in the\n * browser TOP LAYER via `showModal()` (ADR 0044 — no portal, no z-index, dependency-free).\n *\n * Forge owns the token-driven surface + size + enter/leave motion (see `dialog.scss`) and the\n * focus contract (ADR 0044 §3 rule 8): deterministic INITIAL focus via the native `autofocus`\n * attribute (consumer-placed), plus a focus-RETURN safety net. Open/closed state, `role=\"dialog\"`,\n * `aria-modal`, Escape, the `::backdrop` scrim, scroll-lock and focus containment are NATIVE\n * (the scrim + scroll-lock live in the global `_overlay.scss` slice). Accessible name is consumer\n * `aria-labelledby` → projected heading (ADR 033 container carve-out — no `ariaLabel` input).\n *\n * Full contract: adr/specs/component-dialog-spec.md.\n */\n@Component({\n selector: 'dialog[skraDialog]',\n standalone: true,\n exportAs: 'skraDialog',\n template: '<ng-content></ng-content>',\n styleUrl: './dialog.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n // Variant Surface reflection (ADR 035 Size axis)\n '[attr.data-skra-size]': 'size()',\n // Focus-return safety net — fires on EVERY close path (Escape / form submit / close())\n '(close)': 'onClose()',\n // Focus TRAP (ADR 0044 §3 rule 8 — minimal scoped JS where native is insufficient):\n // native `showModal()` makes the background inert, but does NOT cycle Tab last<->first and\n // lets focus escape an enclosing iframe / micro-frontend boundary. This wraps focus in.\n '(keydown)': 'onKeydown($event)',\n },\n})\nexport class SkraDialog {\n /** Width bucket (ADR 035). No look inputs (ADR 025); no `ariaLabel` (ADR 033). */\n readonly size = input<DialogSize>('md');\n\n /**\n * Emitted from `showModal()` once the dialog has entered the top layer. Fills a genuine\n * NATIVE GAP — `<dialog>` fires no \"open\" event, so the dialog's owner otherwise cannot\n * observe opening decoupled from whoever called `showModal()` (lazy content, analytics, …).\n *\n * There is deliberately NO `closed`/`cancel` output (native-first, boundary #9): the native\n * `<dialog>` `(close)`/`(cancel)` events already serve the owner directly on the element\n * (with `returnValue`). A Forge output would duplicate a native event.\n */\n readonly opened = output<void>();\n\n private readonly host = inject<ElementRef<HTMLDialogElement>>(ElementRef);\n private previouslyFocused: HTMLElement | null = null;\n\n /** Native `.open` state (read-only proxy; open/closed stays native — ADR 0044). */\n get open(): boolean {\n return this.host.nativeElement.open;\n }\n\n /** Open as a modal: store the trigger for focus-return, then native `showModal()`. */\n showModal(): void {\n this.previouslyFocused = deepActiveElement();\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n this.warnIfNoFocusTarget();\n }\n this.host.nativeElement.showModal();\n this.opened.emit();\n }\n\n /** Close the dialog. The native `close` event drives focus-return (see `onClose`). */\n close(returnValue?: string): void {\n this.host.nativeElement.close(returnValue);\n }\n\n /** Restore focus to the trigger on any close path (Escape / form submit / `close()`). */\n protected onClose(): void {\n // Restore only if the trigger is still in the document (it may have been removed while\n // the dialog was open). Focusing a detached node is a no-op; guard keeps intent explicit.\n if (this.previouslyFocused?.isConnected) this.previouslyFocused.focus();\n this.previouslyFocused = null;\n }\n\n /**\n * Wrap Tab focus within the modal (ADR 0044 §3 rule 8). Native `showModal()` makes the\n * background `inert` but does NOT cycle Tab last<->first and lets focus leave an enclosing\n * iframe / micro-frontend boundary — the WCAG-over-native gap this minimal JS closes. Modal\n * only (`:modal`); non-modal open dialogs are not trapped. Host-scoped DOM access only.\n */\n protected onKeydown(event: KeyboardEvent): void {\n if (event.key !== 'Tab') return;\n const el = this.host.nativeElement;\n if (!el.matches(':modal')) return;\n const focusables = Array.from(\n el.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR),\n );\n if (focusables.length === 0) {\n event.preventDefault();\n return;\n }\n const first = focusables[0];\n const last = focusables[focusables.length - 1];\n const active = deepActiveElement();\n if (event.shiftKey && (active === first || active === el)) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && active === last) {\n event.preventDefault();\n first.focus();\n }\n }\n\n /** Dev-only a11y nudge: native default initial focus is inconsistent without `autofocus`. */\n private warnIfNoFocusTarget(): void {\n const el = this.host.nativeElement;\n if (\n !el.querySelector('[autofocus]') &&\n !el.querySelector(FOCUSABLE_SELECTOR)\n ) {\n console.warn(\n '[skraDialog] opened with no focusable element or [autofocus] target. ' +\n 'Place `autofocus` on the intended initial control (WAI-ARIA APG) — ' +\n 'browser default initial focus is inconsistent.',\n );\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skra-ui-field.mjs","sources":["../../../../libs/ui/field/src/lib/id-generator/id-generator.service.ts","../../../../libs/ui/field/src/lib/field-context/field-context.ts","../../../../libs/ui/field/src/lib/field/field.component.ts","../../../../libs/ui/field/src/lib/label/label.ts","../../../../libs/ui/field/src/lib/hint/hint.component.ts","../../../../libs/ui/field/src/lib/error/error.component.ts","../../../../libs/ui/field/src/lib/fieldset/fieldset.ts","../../../../libs/ui/field/src/lib/fieldset/legend.ts","../../../../libs/ui/field/src/index.ts","../../../../libs/ui/field/src/skra-ui-field.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n/**\r\n * Root-level service generating unique, short IDs for form elements.\r\n * Implements ADR 013 — deterministic IDs without bloaty UUID libraries.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class IdGeneratorService {\r\n private counter = 0;\r\n\r\n nextId(prefix = 'fg'): string {\r\n return `${prefix}-${++this.counter}`;\r\n }\r\n}\r\n","import { Injectable, signal, computed } from '@angular/core';\r\n\r\n/**\r\n * DI Context service provided per SkraField instance.\r\n * Acts as the synchronization bus between Field, Input, Label, Hint, and Error.\r\n * Implements ADR 013: Signal-based Contextual Interaction.\r\n */\r\n@Injectable()\r\nexport class SkraFieldContext {\r\n readonly fieldId = signal<string>('');\r\n readonly hasError = signal<boolean>(false);\r\n readonly isDisabled = signal<boolean>(false);\r\n readonly isRequired = signal<boolean>(false);\r\n readonly isReadonly = signal<boolean>(false);\r\n\r\n // Derived IDs for aria-describedby linkage\r\n readonly hintId = computed(() => `${this.fieldId()}-hint`);\r\n readonly errorId = computed(() => `${this.fieldId()}-error`);\r\n\r\n // Derived label ID. Labelable controls (input/checkbox/radio) associate via the\r\n // native `for`/`id` pair, so they never needed a referenceable label id. A\r\n // `role=\"radiogroup\"` host (<skra-star-rating>) is NOT labelable by `for`, so it\r\n // must name itself via `aria-labelledby` → the label needs an id. This is the third\r\n // derived id alongside hintId/errorId — an id, never a value (ADR 013 §3.6; the\r\n // context carries id + derived state only). Set on `label[skraLabelFor]`.\r\n readonly labelId = computed(() => `${this.fieldId()}-label`);\r\n\r\n // Combined aria-describedby tokens for the input/textarea host.\r\n // Both ids are always emitted — when <skra-hint> or <skra-error> is not\r\n // rendered, the matching DOM node is absent and browsers / screen readers\r\n // gracefully ignore the dangling reference. Simpler than tracking presence\r\n // via contentChild queries from the directive (which has no template).\r\n readonly describedByIds = computed(\r\n () => `${this.hintId()} ${this.errorId()}`,\r\n );\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n OnInit,\r\n ViewEncapsulation,\r\n booleanAttribute,\r\n effect,\r\n inject,\r\n input,\r\n} from '@angular/core';\r\nimport { SkraFieldContext } from '../field-context/field-context';\r\nimport { IdGeneratorService } from '../id-generator/id-generator.service';\r\n\r\n@Component({\r\n selector: 'skra-field',\r\n standalone: true,\r\n template: '<ng-content></ng-content>',\r\n styleUrl: './field.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n // KEY: provides a new SkraFieldContext instance per field — isolation guaranteed\r\n providers: [SkraFieldContext],\r\n host: {\r\n // CSP-Safe State Reflection (ADR 021). The layout reset (margin) +\r\n // display:flex live in field.component.scss `:host` (ADR 022) — host-metadata\r\n // bare keys (margin, display) render as junk attributes with no styling effect.\r\n // Validation state (ADR 027) — canonical `data-skra-validation=\"invalid\"`,\r\n // NOT the forbidden `data-skra-has-error` (migrated 2026-05-31 per ADR 027\r\n // §3.6 / state-surface-catalog). The control's `aria-invalid` lives on the\r\n // inner <input skraInput> (ADR 013), not on this group host.\r\n '[attr.data-skra-validation]': 'context.hasError() ? \"invalid\" : null',\r\n '[attr.data-skra-disabled]': 'context.isDisabled() ? \"\" : null',\r\n '[attr.data-skra-required]': 'context.isRequired() ? \"\" : null',\r\n '[attr.data-skra-readonly]': 'context.isReadonly() ? \"\" : null',\r\n\r\n // A11y: role=\"group\" groups label+input+hint semantically for screen readers\r\n role: 'group',\r\n },\r\n})\r\nexport class SkraField implements OnInit {\r\n private readonly idGen = inject(IdGeneratorService);\r\n readonly context = inject(SkraFieldContext);\r\n\r\n readonly fieldId = input<string | null>(null);\r\n readonly readonly = input(false, { transform: booleanAttribute });\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n readonly required = input(false, { transform: booleanAttribute });\r\n readonly hasError = input(false, { transform: booleanAttribute });\r\n\r\n constructor() {\r\n // Reactive sync — state inputs propagate to SkraFieldContext on every\r\n // change (not just on init). Replaces the previous ngOnInit-only pattern\r\n // which caused late input changes to silently desync from the context\r\n // (and from sibling atoms reading the context). Matches Checkbox's\r\n // effect() pattern for indeterminate property sync.\r\n effect(() => {\r\n this.context.isReadonly.set(this.readonly());\r\n this.context.isDisabled.set(this.disabled());\r\n this.context.isRequired.set(this.required());\r\n this.context.hasError.set(this.hasError());\r\n });\r\n }\r\n\r\n // fieldId is one-shot — assigned once on init, never changes thereafter\r\n // (a field's identity attribute should be stable for the field's lifetime).\r\n ngOnInit(): void {\r\n this.context.fieldId.set(this.fieldId() ?? this.idGen.nextId('fg'));\r\n }\r\n}\r\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n inject,\n} from '@angular/core';\nimport { SkraFieldContext } from '../field-context/field-context';\n\n/**\n * `label[skraLabelFor]` — form-control label atom. Per ADR 040 this is a\n * Component-on-the-native-host carrying its own `label.scss` (typography + colour\n * + cursor) via Emulated encapsulation, replacing the ADR 038 slice branch.\n *\n * `<label>` is content-bearing (its text is the label), so the template MUST be\n * `<ng-content>` — `template: ''` would discard the label text. See ADR 040 §2.\n *\n * Auto-links to its sibling control via `[htmlFor]` sourced from\n * `SkraFieldContext.fieldId()` — zero manual ID passing (ADR 013). The label's\n * error-state colour is driven by `<skra-field>[data-skra-validation=\"invalid\"]`\n * swapping `--skra-comp-field-label-color` through CSS variable inheritance; this\n * SCSS is what consumes that variable (the swap was a no-op before the binding\n * moved here from the slice).\n */\n@Component({\n selector: 'label[skraLabelFor]',\n standalone: true,\n // Content-bearing host — see ADR 040 §2.\n template: '<ng-content></ng-content>',\n styleUrl: './label.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n // The magic: auto-linking label to input via shared Context ID. Bound as an\n // ATTRIBUTE, not the `htmlFor` property — with no field context the property\n // form would stringify `undefined` into `for=\"undefined\"`.\n '[attr.for]': 'context?.fieldId() ?? null',\n // Referenceable id so a non-labelable control (a `role=\"radiogroup\"` host like\n // <skra-star-rating>, which `for`/`id` can't target) can name itself via\n // `aria-labelledby`. Harmless for labelable controls (they use `for`). ADR 013.\n '[attr.id]': 'context?.labelId() ?? null',\n // Required marker — reflect the field's required state so the SCSS can paint a\n // decorative asterisk (::after). The control already carries `aria-required`,\n // so the marker is purely visual (ADR 021 data-attr reflection; ADR 033 keeps\n // it out of the accessible name via the empty alt-text in `content`).\n '[attr.data-skra-required]': 'context?.isRequired() ? \"\" : null',\n // Class hook retained for any consumer-side targeting (ADR 024 pattern).\n class: 'skra-label',\n },\n})\nexport class SkraLabel {\n // Optional per ADR 013 §3.7 — outside `<skra-field>` the label still carries the\n // skin and the consumer owns association (a wrapping `<label>`, or a hand-written\n // `for`). Mandatory injection would crash the app for a styling-only use.\n readonly context = inject(SkraFieldContext, { optional: true });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n inject,\n} from '@angular/core';\nimport { SkraFieldContext } from '../field-context/field-context';\n\n/**\n * Hint component for supplementary field information.\n * Auto-receives ID from SkraFieldContext so aria-describedby on input works automatically.\n */\n@Component({\n selector: 'skra-hint',\n standalone: true,\n template: '<ng-content></ng-content>',\n styleUrl: './hint.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n // Zero-margin reset (ADR 022) lives in hint.component.scss `:host`.\n // ID linked from context — input's aria-describedby points here automatically\n '[attr.id]': 'context?.hintId() ?? null',\n role: 'note',\n },\n})\nexport class SkraHint {\n // Optional per ADR 013 §3.7 — mirrors SkraError. Outside `<skra-field>` it\n // publishes no id and is plain styled helper text the consumer associates itself.\n readonly context = inject(SkraFieldContext, { optional: true });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n inject,\n} from '@angular/core';\nimport { SkraFieldContext } from '../field-context/field-context';\n\n/**\n * Error message atom sibling to `<skra-hint>`. Renders validation feedback\n * inside `<skra-field>` with its own a11y semantics: `role=\"alert\"` (which\n * carries an implicit `aria-live=\"assertive\"` + `aria-atomic=\"true\"`), so screen\n * readers announce a validation error promptly. NO explicit `aria-live` — adding\n * `aria-live=\"polite\"` alongside `role=\"alert\"` is contradictory (alert is\n * assertive by definition) and behaves inconsistently across AT. Assertive is\n * the WAI-ARIA APG pattern for validation errors (decision 2026-05-31, Batch 4\n * cleanroom review).\n *\n * Per ADR 037 (agnostic atom co-existence) — does not infer error state from\n * any binding strategy. Consumer renders or omits `<skra-error>` based on\n * their own validation source (Signal Forms `.invalid && .touched`, Reactive\n * Forms `ctrl.errors`, raw computed signal). The atom itself just supplies\n * a11y wiring + visual treatment.\n *\n * <skra-field [hasError]=\"emailHasError()\">\n * <label skraLabelFor>Email</label>\n * <input skraInput type=\"email\" />\n * <skra-hint>We'll never share your email.</skra-hint>\n * @if (emailHasError()) {\n * <skra-error>Please enter a valid email address.</skra-error>\n * }\n * </skra-field>\n *\n * Separate from `<skra-hint>` per SRP: hint is static helper text\n * (role=\"note\", neutral colour); error is dynamic validation feedback\n * (role=\"alert\", live region, error colour). One element per visual\n * responsibility — the rejected alternative (\"hint that swaps text on error\")\n * loaded two responsibilities into a single primitive.\n */\n@Component({\n selector: 'skra-error',\n standalone: true,\n template: '<ng-content></ng-content>',\n styleUrl: './error.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n // Zero-margin reset (ADR 022) lives in error.component.scss `:host`.\n // ID linked from context — input's aria-describedby points here automatically\n '[attr.id]': 'context?.errorId() ?? null',\n // role=\"alert\" implies aria-live=\"assertive\" + aria-atomic=\"true\" — do NOT\n // add an explicit aria-live (contradicts the implicit assertive). Errors are\n // announced promptly per WAI-ARIA APG.\n role: 'alert',\n },\n})\nexport class SkraError {\n // Optional per ADR 013 §3.7. A GROUP-level error is a first-class pattern:\n // `<skra-error>` sits as a direct child of `<fieldset skraFieldset>`, outside any\n // `<skra-field>`, to carry one message for a radio/checkbox group (see the\n // Fieldset `WithGroupError` story). It then publishes no id — nothing points at\n // it via `aria-describedby`, and `role=\"alert\"` announces it on its own.\n readonly context = inject(SkraFieldContext, { optional: true });\n}\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ViewEncapsulation,\r\n booleanAttribute,\r\n input,\r\n} from '@angular/core';\r\n\r\n/**\r\n * Forge marker on a native `<fieldset>` used to group related form controls\r\n * (checkbox group, radio group, or any related field cluster). Per ADR 039,\r\n * Forge ships no `<skra-radio-group>` / `<skra-checkbox-group>` component\r\n * wrappers — native `<fieldset>` + `<legend>` IS the WCAG-canonical group\r\n * idiom, and Forge stops reinventing it.\r\n *\r\n * Per ADR 040 this is a Component-on-the-native-host carrying its own\r\n * `fieldset.scss` (chrome reset + group layout) via Emulated encapsulation,\r\n * replacing the ADR 038 slice branch. `<fieldset>` is content-bearing (it holds\r\n * the grouped controls), so the template MUST be `<ng-content>` — `template: ''`\r\n * would discard the entire group. See ADR 040 §2.\r\n *\r\n * The `[disabled]` input cascades to the native `disabled` attribute, and\r\n * native `<fieldset disabled>` already disables every form control inside\r\n * (browser-native behaviour). Forge does not iterate children manually.\r\n *\r\n * Selector is opt-in (`fieldset[skraFieldset]`) so the chrome-reset rules do\r\n * not leak onto bare `<fieldset>` elements outside Forge.\r\n *\r\n * <fieldset skraFieldset [disabled]=\"form.disabled()\">\r\n * <legend skraLegend>Send notifications via</legend>\r\n * <!-- skra-field children with checkboxes -->\r\n * <skra-error *ngIf=\"form.channels().length === 0\">Choose at least one</skra-error>\r\n * </fieldset>\r\n *\r\n * `role=\"group\"` is the explicit ARIA role: while the browser default for\r\n * `<fieldset>` is already group semantics for most AT, declaring it explicitly\r\n * is friendlier to assistive tech that may have idiosyncratic handling.\r\n *\r\n * Native `disabled` is sufficient — `aria-disabled` is NOT set per\r\n * native-attr-first doctrine (memory `feedback_native_attr_first.md`). The\r\n * `data-skra-disabled` reflection drives the visual dimming in `fieldset.scss`.\r\n */\r\n@Component({\r\n selector: 'fieldset[skraFieldset]',\r\n standalone: true,\r\n // Content-bearing host — see ADR 040 §2.\r\n template: '<ng-content></ng-content>',\r\n styleUrl: './fieldset.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n host: {\r\n role: 'group',\r\n '[attr.disabled]': 'disabled() ? \"\" : null',\r\n '[attr.data-skra-disabled]': 'disabled() ? \"\" : null',\r\n },\r\n})\r\nexport class SkraFieldset {\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\n\r\n/**\r\n * `legend[skraLegend]` — visible group label for `<fieldset skraFieldset>`.\r\n * Per ADR 040 this is a Component-on-the-native-host carrying its own\r\n * `legend.scss` (chrome reset + typography role binding per ADR 036) via Emulated\r\n * encapsulation, replacing the ADR 038 slice branch.\r\n *\r\n * `<legend>` is content-bearing (its text is the group label), so the template\r\n * MUST be `<ng-content>` — `template: ''` would discard the label. See ADR 040 §2.\r\n * No host bindings, no inputs, no DI — purely a styled marker.\r\n *\r\n * <fieldset skraFieldset>\r\n * <legend skraLegend>Account preferences</legend>\r\n * ...\r\n * </fieldset>\r\n *\r\n * HTML requires `<legend>` to be the FIRST child of `<fieldset>` for native\r\n * group-label semantics. The browser HTML parser auto-corrects misplaced\r\n * legends (re-parents to fieldset), but Forge documents the canonical form.\r\n */\r\n@Component({\r\n selector: 'legend[skraLegend]',\r\n standalone: true,\r\n // Content-bearing host — see ADR 040 §2.\r\n template: '<ng-content></ng-content>',\r\n styleUrl: './legend.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n})\r\nexport class SkraLegend {}\r\n","// Public API for @skra/ui/field — the field-family (ADR 013 contextual a11y).\r\nexport * from './lib/id-generator/id-generator.service';\r\nexport * from './lib/field-context/field-context';\r\nexport * from './lib/field/field.component';\r\nexport * from './lib/label/label';\r\nexport * from './lib/hint/hint.component';\r\nexport * from './lib/error/error.component';\r\nexport * from './lib/fieldset/fieldset';\r\nexport * from './lib/fieldset/legend';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"skra-ui-field.mjs","sources":["../../../../libs/ui/field/src/lib/id-generator/id-generator.service.ts","../../../../libs/ui/field/src/lib/field-context/field-context.ts","../../../../libs/ui/field/src/lib/field/field.component.ts","../../../../libs/ui/field/src/lib/label/label.ts","../../../../libs/ui/field/src/lib/hint/hint.component.ts","../../../../libs/ui/field/src/lib/error/error.component.ts","../../../../libs/ui/field/src/lib/fieldset/fieldset.ts","../../../../libs/ui/field/src/lib/fieldset/legend.ts","../../../../libs/ui/field/src/index.ts","../../../../libs/ui/field/src/skra-ui-field.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\n/**\n * Root-level service generating unique, short IDs for form elements.\n * Implements ADR 013 — deterministic IDs without bloaty UUID libraries.\n */\n@Injectable({ providedIn: 'root' })\nexport class IdGeneratorService {\n private counter = 0;\n\n nextId(prefix = 'fg'): string {\n return `${prefix}-${++this.counter}`;\n }\n}\n","import { Injectable, signal, computed } from '@angular/core';\n\n/**\n * DI Context service provided per SkraField instance.\n * Acts as the synchronization bus between Field, Input, Label, Hint, and Error.\n * Implements ADR 013: Signal-based Contextual Interaction.\n */\n@Injectable()\nexport class SkraFieldContext {\n readonly fieldId = signal<string>('');\n readonly hasError = signal<boolean>(false);\n readonly isDisabled = signal<boolean>(false);\n readonly isRequired = signal<boolean>(false);\n readonly isReadonly = signal<boolean>(false);\n\n // Derived IDs for aria-describedby linkage\n readonly hintId = computed(() => `${this.fieldId()}-hint`);\n readonly errorId = computed(() => `${this.fieldId()}-error`);\n\n // Derived label ID. Labelable controls (input/checkbox/radio) associate via the\n // native `for`/`id` pair, so they never needed a referenceable label id. A\n // `role=\"radiogroup\"` host (<skra-star-rating>) is NOT labelable by `for`, so it\n // must name itself via `aria-labelledby` → the label needs an id. This is the third\n // derived id alongside hintId/errorId — an id, never a value (ADR 013 §3.6; the\n // context carries id + derived state only). Set on `label[skraLabelFor]`.\n readonly labelId = computed(() => `${this.fieldId()}-label`);\n\n // Combined aria-describedby tokens for the input/textarea host.\n // Both ids are always emitted — when <skra-hint> or <skra-error> is not\n // rendered, the matching DOM node is absent and browsers / screen readers\n // gracefully ignore the dangling reference. Simpler than tracking presence\n // via contentChild queries from the directive (which has no template).\n readonly describedByIds = computed(\n () => `${this.hintId()} ${this.errorId()}`,\n );\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n OnInit,\n ViewEncapsulation,\n booleanAttribute,\n effect,\n inject,\n input,\n} from '@angular/core';\nimport { SkraFieldContext } from '../field-context/field-context';\nimport { IdGeneratorService } from '../id-generator/id-generator.service';\n\n@Component({\n selector: 'skra-field',\n standalone: true,\n template: '<ng-content></ng-content>',\n styleUrl: './field.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n // KEY: provides a new SkraFieldContext instance per field — isolation guaranteed\n providers: [SkraFieldContext],\n host: {\n // CSP-Safe State Reflection (ADR 021). The layout reset (margin) +\n // display:flex live in field.component.scss `:host` (ADR 022) — host-metadata\n // bare keys (margin, display) render as junk attributes with no styling effect.\n // Validation state (ADR 027) — canonical `data-skra-validation=\"invalid\"`,\n // NOT the forbidden `data-skra-has-error` (migrated 2026-05-31 per ADR 027\n // §3.6 / state-surface-catalog). The control's `aria-invalid` lives on the\n // inner <input skraInput> (ADR 013), not on this group host.\n '[attr.data-skra-validation]': 'context.hasError() ? \"invalid\" : null',\n '[attr.data-skra-disabled]': 'context.isDisabled() ? \"\" : null',\n '[attr.data-skra-required]': 'context.isRequired() ? \"\" : null',\n '[attr.data-skra-readonly]': 'context.isReadonly() ? \"\" : null',\n\n // A11y: role=\"group\" groups label+input+hint semantically for screen readers\n role: 'group',\n },\n})\nexport class SkraField implements OnInit {\n private readonly idGen = inject(IdGeneratorService);\n readonly context = inject(SkraFieldContext);\n\n readonly fieldId = input<string | null>(null);\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly required = input(false, { transform: booleanAttribute });\n readonly hasError = input(false, { transform: booleanAttribute });\n\n constructor() {\n // Reactive sync — state inputs propagate to SkraFieldContext on every\n // change (not just on init). Replaces the previous ngOnInit-only pattern\n // which caused late input changes to silently desync from the context\n // (and from sibling atoms reading the context). Matches Checkbox's\n // effect() pattern for indeterminate property sync.\n effect(() => {\n this.context.isReadonly.set(this.readonly());\n this.context.isDisabled.set(this.disabled());\n this.context.isRequired.set(this.required());\n this.context.hasError.set(this.hasError());\n });\n }\n\n // fieldId is one-shot — assigned once on init, never changes thereafter\n // (a field's identity attribute should be stable for the field's lifetime).\n ngOnInit(): void {\n this.context.fieldId.set(this.fieldId() ?? this.idGen.nextId('fg'));\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n inject,\n} from '@angular/core';\nimport { SkraFieldContext } from '../field-context/field-context';\n\n/**\n * `label[skraLabelFor]` — form-control label atom. Per ADR 040 this is a\n * Component-on-the-native-host carrying its own `label.scss` (typography + colour\n * + cursor) via Emulated encapsulation, replacing the ADR 038 slice branch.\n *\n * `<label>` is content-bearing (its text is the label), so the template MUST be\n * `<ng-content>` — `template: ''` would discard the label text. See ADR 040 §2.\n *\n * Auto-links to its sibling control via `[htmlFor]` sourced from\n * `SkraFieldContext.fieldId()` — zero manual ID passing (ADR 013). The label's\n * error-state colour is driven by `<skra-field>[data-skra-validation=\"invalid\"]`\n * swapping `--skra-comp-field-label-color` through CSS variable inheritance; this\n * SCSS is what consumes that variable (the swap was a no-op before the binding\n * moved here from the slice).\n */\n@Component({\n selector: 'label[skraLabelFor]',\n standalone: true,\n // Content-bearing host — see ADR 040 §2.\n template: '<ng-content></ng-content>',\n styleUrl: './label.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n // The magic: auto-linking label to input via shared Context ID. Bound as an\n // ATTRIBUTE, not the `htmlFor` property — with no field context the property\n // form would stringify `undefined` into `for=\"undefined\"`.\n '[attr.for]': 'context?.fieldId() ?? null',\n // Referenceable id so a non-labelable control (a `role=\"radiogroup\"` host like\n // <skra-star-rating>, which `for`/`id` can't target) can name itself via\n // `aria-labelledby`. Harmless for labelable controls (they use `for`). ADR 013.\n '[attr.id]': 'context?.labelId() ?? null',\n // Required marker — reflect the field's required state so the SCSS can paint a\n // decorative asterisk (::after). The control already carries `aria-required`,\n // so the marker is purely visual (ADR 021 data-attr reflection; ADR 033 keeps\n // it out of the accessible name via the empty alt-text in `content`).\n '[attr.data-skra-required]': 'context?.isRequired() ? \"\" : null',\n // Class hook retained for any consumer-side targeting (ADR 024 pattern).\n class: 'skra-label',\n },\n})\nexport class SkraLabel {\n // Optional per ADR 013 §3.7 — outside `<skra-field>` the label still carries the\n // skin and the consumer owns association (a wrapping `<label>`, or a hand-written\n // `for`). Mandatory injection would crash the app for a styling-only use.\n readonly context = inject(SkraFieldContext, { optional: true });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n inject,\n} from '@angular/core';\nimport { SkraFieldContext } from '../field-context/field-context';\n\n/**\n * Hint component for supplementary field information.\n * Auto-receives ID from SkraFieldContext so aria-describedby on input works automatically.\n */\n@Component({\n selector: 'skra-hint',\n standalone: true,\n template: '<ng-content></ng-content>',\n styleUrl: './hint.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n // Zero-margin reset (ADR 022) lives in hint.component.scss `:host`.\n // ID linked from context — input's aria-describedby points here automatically\n '[attr.id]': 'context?.hintId() ?? null',\n role: 'note',\n },\n})\nexport class SkraHint {\n // Optional per ADR 013 §3.7 — mirrors SkraError. Outside `<skra-field>` it\n // publishes no id and is plain styled helper text the consumer associates itself.\n readonly context = inject(SkraFieldContext, { optional: true });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n inject,\n} from '@angular/core';\nimport { SkraFieldContext } from '../field-context/field-context';\n\n/**\n * Error message atom sibling to `<skra-hint>`. Renders validation feedback\n * inside `<skra-field>` with its own a11y semantics: `role=\"alert\"` (which\n * carries an implicit `aria-live=\"assertive\"` + `aria-atomic=\"true\"`), so screen\n * readers announce a validation error promptly. NO explicit `aria-live` — adding\n * `aria-live=\"polite\"` alongside `role=\"alert\"` is contradictory (alert is\n * assertive by definition) and behaves inconsistently across AT. Assertive is\n * the WAI-ARIA APG pattern for validation errors (decision 2026-05-31, Batch 4\n * cleanroom review).\n *\n * Per ADR 037 (agnostic atom co-existence) — does not infer error state from\n * any binding strategy. Consumer renders or omits `<skra-error>` based on\n * their own validation source (Signal Forms `.invalid && .touched`, Reactive\n * Forms `ctrl.errors`, raw computed signal). The atom itself just supplies\n * a11y wiring + visual treatment.\n *\n * <skra-field [hasError]=\"emailHasError()\">\n * <label skraLabelFor>Email</label>\n * <input skraInput type=\"email\" />\n * <skra-hint>We'll never share your email.</skra-hint>\n * @if (emailHasError()) {\n * <skra-error>Please enter a valid email address.</skra-error>\n * }\n * </skra-field>\n *\n * Separate from `<skra-hint>` per SRP: hint is static helper text\n * (role=\"note\", neutral colour); error is dynamic validation feedback\n * (role=\"alert\", live region, error colour). One element per visual\n * responsibility — the rejected alternative (\"hint that swaps text on error\")\n * loaded two responsibilities into a single primitive.\n */\n@Component({\n selector: 'skra-error',\n standalone: true,\n template: '<ng-content></ng-content>',\n styleUrl: './error.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n // Zero-margin reset (ADR 022) lives in error.component.scss `:host`.\n // ID linked from context — input's aria-describedby points here automatically\n '[attr.id]': 'context?.errorId() ?? null',\n // role=\"alert\" implies aria-live=\"assertive\" + aria-atomic=\"true\" — do NOT\n // add an explicit aria-live (contradicts the implicit assertive). Errors are\n // announced promptly per WAI-ARIA APG.\n role: 'alert',\n },\n})\nexport class SkraError {\n // Optional per ADR 013 §3.7. A GROUP-level error is a first-class pattern:\n // `<skra-error>` sits as a direct child of `<fieldset skraFieldset>`, outside any\n // `<skra-field>`, to carry one message for a radio/checkbox group (see the\n // Fieldset `WithGroupError` story). It then publishes no id — nothing points at\n // it via `aria-describedby`, and `role=\"alert\"` announces it on its own.\n readonly context = inject(SkraFieldContext, { optional: true });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n input,\n} from '@angular/core';\n\n/**\n * Forge marker on a native `<fieldset>` used to group related form controls\n * (checkbox group, radio group, or any related field cluster). Per ADR 039,\n * Forge ships no `<skra-radio-group>` / `<skra-checkbox-group>` component\n * wrappers — native `<fieldset>` + `<legend>` IS the WCAG-canonical group\n * idiom, and Forge stops reinventing it.\n *\n * Per ADR 040 this is a Component-on-the-native-host carrying its own\n * `fieldset.scss` (chrome reset + group layout) via Emulated encapsulation,\n * replacing the ADR 038 slice branch. `<fieldset>` is content-bearing (it holds\n * the grouped controls), so the template MUST be `<ng-content>` — `template: ''`\n * would discard the entire group. See ADR 040 §2.\n *\n * The `[disabled]` input cascades to the native `disabled` attribute, and\n * native `<fieldset disabled>` already disables every form control inside\n * (browser-native behaviour). Forge does not iterate children manually.\n *\n * Selector is opt-in (`fieldset[skraFieldset]`) so the chrome-reset rules do\n * not leak onto bare `<fieldset>` elements outside Forge.\n *\n * <fieldset skraFieldset [disabled]=\"form.disabled()\">\n * <legend skraLegend>Send notifications via</legend>\n * <!-- skra-field children with checkboxes -->\n * <skra-error *ngIf=\"form.channels().length === 0\">Choose at least one</skra-error>\n * </fieldset>\n *\n * `role=\"group\"` is the explicit ARIA role: while the browser default for\n * `<fieldset>` is already group semantics for most AT, declaring it explicitly\n * is friendlier to assistive tech that may have idiosyncratic handling.\n *\n * Native `disabled` is sufficient — `aria-disabled` is NOT set per\n * native-attr-first doctrine (memory `feedback_native_attr_first.md`). The\n * `data-skra-disabled` reflection drives the visual dimming in `fieldset.scss`.\n */\n@Component({\n selector: 'fieldset[skraFieldset]',\n standalone: true,\n // Content-bearing host — see ADR 040 §2.\n template: '<ng-content></ng-content>',\n styleUrl: './fieldset.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n role: 'group',\n '[attr.disabled]': 'disabled() ? \"\" : null',\n '[attr.data-skra-disabled]': 'disabled() ? \"\" : null',\n },\n})\nexport class SkraFieldset {\n readonly disabled = input(false, { transform: booleanAttribute });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n} from '@angular/core';\n\n/**\n * `legend[skraLegend]` — visible group label for `<fieldset skraFieldset>`.\n * Per ADR 040 this is a Component-on-the-native-host carrying its own\n * `legend.scss` (chrome reset + typography role binding per ADR 036) via Emulated\n * encapsulation, replacing the ADR 038 slice branch.\n *\n * `<legend>` is content-bearing (its text is the group label), so the template\n * MUST be `<ng-content>` — `template: ''` would discard the label. See ADR 040 §2.\n * No host bindings, no inputs, no DI — purely a styled marker.\n *\n * <fieldset skraFieldset>\n * <legend skraLegend>Account preferences</legend>\n * ...\n * </fieldset>\n *\n * HTML requires `<legend>` to be the FIRST child of `<fieldset>` for native\n * group-label semantics. The browser HTML parser auto-corrects misplaced\n * legends (re-parents to fieldset), but Forge documents the canonical form.\n */\n@Component({\n selector: 'legend[skraLegend]',\n standalone: true,\n // Content-bearing host — see ADR 040 §2.\n template: '<ng-content></ng-content>',\n styleUrl: './legend.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n})\nexport class SkraLegend {}\n","// Public API for @skra/ui/field — the field-family (ADR 013 contextual a11y).\nexport * from './lib/id-generator/id-generator.service';\nexport * from './lib/field-context/field-context';\nexport * from './lib/field/field.component';\nexport * from './lib/label/label';\nexport * from './lib/hint/hint.component';\nexport * from './lib/error/error.component';\nexport * from './lib/fieldset/fieldset';\nexport * from './lib/fieldset/legend';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skra-ui-icon.mjs","sources":["../../../../libs/ui/icon/src/lib/icon/icon.ts","../../../../libs/ui/icon/src/lib/icon/icon.html","../../../../libs/ui/icon/src/skra-ui-icon.ts"],"sourcesContent":["import {\
|
|
1
|
+
{"version":3,"file":"skra-ui-icon.mjs","sources":["../../../../libs/ui/icon/src/lib/icon/icon.ts","../../../../libs/ui/icon/src/lib/icon/icon.html","../../../../libs/ui/icon/src/skra-ui-icon.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n input,\n} from '@angular/core';\n\nexport type IconSize = 'sm' | 'md' | 'lg';\n\n/**\n * SkraIcon — container atom for icon-shaped content (ADR 034).\n *\n * Forge owns geometry, layout isolation, color inheritance hook. The shape\n * itself is supplied by the consumer via `<ng-content>` — inline SVG, `<img>`,\n * a third-party icon library element, or a styled `<span>` are all supported\n * equally. Forge ships no icon catalog and makes no rendering-strategy choice\n * for the consumer.\n *\n * Accessibility: this host has NO default ARIA attributes (ADR 034 §3.4). The\n * consumer MUST declare semantics explicitly:\n * - decorative icon → `<skra-icon aria-hidden=\"true\">`\n * - meaningful icon → `<skra-icon role=\"img\" aria-label=\"...\">` (ADR 033 Path 3;\n * `role=\"img\"` is required — `aria-label` on the roleless host is ARIA-prohibited)\n *\n * @see ADR 034 — SkraIcon as a container atom\n * @see ADR 033 — Accessible Name Contract\n */\n@Component({\n selector: 'skra-icon',\n standalone: true,\n templateUrl: './icon.html',\n styleUrl: './icon.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n // CSP-Safe State Reflection (ADR 021) — host carries ONLY data-attributes,\n // never an inline `style`. The layout reset (display/margin/vertical-align)\n // lives in icon.scss `:host` per Visual Purism (no inline styles) and the\n // ADR 041 cleanup precedent (resets belong in SCSS, not host metadata).\n\n // Size reflection (ADR 021). `null` keeps the attribute absent so the icon\n // inherits the cascade-driven --skra-comp-icon-size (e.g. button slot\n // wrapper per ADR 030).\n '[attr.data-skra-size]': 'size()',\n },\n})\nexport class SkraIcon {\n /**\n * Preset size token (`'sm' | 'md' | 'lg'`). When `null`, the icon inherits\n * `--skra-comp-icon-size` from the surrounding context — typical in button\n * slot wrappers (ADR 030 §3.4) where the parent owns the icon size. Arbitrary\n * dimensions are not an input (a free value would require an inline style,\n * forbidden by ADR 021); a consumer needing a bespoke size overrides\n * `--skra-comp-icon-size` via the sanctioned token-cascade path (ADR 029).\n */\n readonly size = input<IconSize | null>(null);\n}\n","<ng-content></ng-content>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AASA;;;;;;;;;;;;;;;;;AAiBG;MAoBU,QAAQ,CAAA;AACnB;;;;;;;AAOG;IACM,IAAI,GAAG,KAAK,CAAkB,IAAI;6EAAC;uGATjC,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAR,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,QAAQ,iQC9CrB,6BACA,EAAA,MAAA,EAAA,CAAA,gmBAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FD6Ca,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAnBpB,SAAS;+BACE,WAAW,EAAA,UAAA,EACT,IAAI,EAAA,eAAA,EAGC,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,QAAQ,EAAA,IAAA,EACnC;;;;;;;;AASJ,wBAAA,uBAAuB,EAAE,QAAQ;AAClC,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,gmBAAA,CAAA,EAAA;;;AE5CH;;AAEG;;;;"}
|