@skra/ui 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/LICENSE +201 -201
  2. package/NOTICE +7 -7
  3. package/README.md +39 -39
  4. package/consumer-guide/README.md +84 -84
  5. package/consumer-guide/forms-and-binding.md +19 -3
  6. package/consumer-guide/layout.md +19 -0
  7. package/consumer-guide/overlays.md +100 -100
  8. package/consumer-guide/setup-and-gotchas.md +165 -103
  9. package/consumer-guide/theming-and-encapsulation.md +129 -115
  10. package/fesm2022/skra-ui-accordion.mjs +61 -43
  11. package/fesm2022/skra-ui-accordion.mjs.map +1 -1
  12. package/fesm2022/skra-ui-alert.mjs +26 -18
  13. package/fesm2022/skra-ui-alert.mjs.map +1 -1
  14. package/fesm2022/skra-ui-avatar.mjs +12 -8
  15. package/fesm2022/skra-ui-avatar.mjs.map +1 -1
  16. package/fesm2022/skra-ui-badge.mjs +19 -13
  17. package/fesm2022/skra-ui-badge.mjs.map +1 -1
  18. package/fesm2022/skra-ui-button.mjs +28 -19
  19. package/fesm2022/skra-ui-button.mjs.map +1 -1
  20. package/fesm2022/skra-ui-checkbox.mjs +3 -3
  21. package/fesm2022/skra-ui-checkbox.mjs.map +1 -1
  22. package/fesm2022/skra-ui-chip.mjs +15 -11
  23. package/fesm2022/skra-ui-chip.mjs.map +1 -1
  24. package/fesm2022/skra-ui-combobox.mjs +135 -130
  25. package/fesm2022/skra-ui-combobox.mjs.map +1 -1
  26. package/fesm2022/skra-ui-core.mjs +95 -73
  27. package/fesm2022/skra-ui-core.mjs.map +1 -1
  28. package/fesm2022/skra-ui-counter.mjs +9 -6
  29. package/fesm2022/skra-ui-counter.mjs.map +1 -1
  30. package/fesm2022/skra-ui-datepicker.mjs +334 -307
  31. package/fesm2022/skra-ui-datepicker.mjs.map +1 -1
  32. package/fesm2022/skra-ui-dialog.mjs +5 -4
  33. package/fesm2022/skra-ui-dialog.mjs.map +1 -1
  34. package/fesm2022/skra-ui-field.mjs +44 -34
  35. package/fesm2022/skra-ui-field.mjs.map +1 -1
  36. package/fesm2022/skra-ui-icon.mjs +5 -4
  37. package/fesm2022/skra-ui-icon.mjs.map +1 -1
  38. package/fesm2022/skra-ui-input.mjs +53 -12
  39. package/fesm2022/skra-ui-input.mjs.map +1 -1
  40. package/fesm2022/skra-ui-kbd.mjs +3 -3
  41. package/fesm2022/skra-ui-kbd.mjs.map +1 -1
  42. package/fesm2022/skra-ui-layout.mjs +33 -21
  43. package/fesm2022/skra-ui-layout.mjs.map +1 -1
  44. package/fesm2022/skra-ui-link.mjs +3 -3
  45. package/fesm2022/skra-ui-link.mjs.map +1 -1
  46. package/fesm2022/skra-ui-loading-indicator.mjs +3 -3
  47. package/fesm2022/skra-ui-loading-indicator.mjs.map +1 -1
  48. package/fesm2022/skra-ui-menu.mjs +8 -7
  49. package/fesm2022/skra-ui-menu.mjs.map +1 -1
  50. package/fesm2022/skra-ui-multi-select.mjs +102 -98
  51. package/fesm2022/skra-ui-multi-select.mjs.map +1 -1
  52. package/fesm2022/skra-ui-native-select.mjs +35 -17
  53. package/fesm2022/skra-ui-native-select.mjs.map +1 -1
  54. package/fesm2022/skra-ui-popover.mjs +5 -4
  55. package/fesm2022/skra-ui-popover.mjs.map +1 -1
  56. package/fesm2022/skra-ui-progress.mjs +7 -5
  57. package/fesm2022/skra-ui-progress.mjs.map +1 -1
  58. package/fesm2022/skra-ui-radio.mjs +3 -3
  59. package/fesm2022/skra-ui-radio.mjs.map +1 -1
  60. package/fesm2022/skra-ui-rating-display.mjs +14 -9
  61. package/fesm2022/skra-ui-rating-display.mjs.map +1 -1
  62. package/fesm2022/skra-ui-select.mjs +98 -95
  63. package/fesm2022/skra-ui-select.mjs.map +1 -1
  64. package/fesm2022/skra-ui-skeleton.mjs +16 -13
  65. package/fesm2022/skra-ui-skeleton.mjs.map +1 -1
  66. package/fesm2022/skra-ui-star-rating.mjs +18 -11
  67. package/fesm2022/skra-ui-star-rating.mjs.map +1 -1
  68. package/fesm2022/skra-ui-status-dot.mjs +7 -5
  69. package/fesm2022/skra-ui-status-dot.mjs.map +1 -1
  70. package/fesm2022/skra-ui-switch.mjs +3 -3
  71. package/fesm2022/skra-ui-switch.mjs.map +1 -1
  72. package/fesm2022/skra-ui-tabs.mjs +43 -29
  73. package/fesm2022/skra-ui-tabs.mjs.map +1 -1
  74. package/fesm2022/skra-ui-textarea.mjs +41 -15
  75. package/fesm2022/skra-ui-textarea.mjs.map +1 -1
  76. package/fesm2022/skra-ui-toast.mjs +35 -23
  77. package/fesm2022/skra-ui-toast.mjs.map +1 -1
  78. package/fesm2022/skra-ui-tooltip.mjs +12 -9
  79. package/fesm2022/skra-ui-tooltip.mjs.map +1 -1
  80. package/fesm2022/skra-ui-typography.mjs +9 -6
  81. package/fesm2022/skra-ui-typography.mjs.map +1 -1
  82. package/package.json +5 -5
  83. package/types/skra-ui-input.d.ts +24 -1
  84. package/types/skra-ui-input.d.ts.map +1 -1
  85. package/types/skra-ui-native-select.d.ts +9 -1
  86. package/types/skra-ui-native-select.d.ts.map +1 -1
  87. package/types/skra-ui-textarea.d.ts +10 -1
  88. package/types/skra-ui-textarea.d.ts.map +1 -1
@@ -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';\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\n '[htmlFor]': 'context.fieldId()',\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 '[id]': 'context.labelId()',\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 readonly context = inject(SkraFieldContext);\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 '[id]': 'context.hintId()',\n role: 'note',\n },\n})\nexport class SkraHint {\n readonly context = inject(SkraFieldContext);\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 '[id]': 'context.errorId()',\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 readonly context = inject(SkraFieldContext);\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
+ {"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 {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ViewEncapsulation,\r\n inject,\r\n} from '@angular/core';\r\nimport { SkraFieldContext } from '../field-context/field-context';\r\n\r\n/**\r\n * `label[skraLabelFor]` — form-control label atom. Per ADR 040 this is a\r\n * Component-on-the-native-host carrying its own `label.scss` (typography + colour\r\n * + cursor) via Emulated encapsulation, replacing the ADR 038 slice branch.\r\n *\r\n * `<label>` is content-bearing (its text is the label), so the template MUST be\r\n * `<ng-content>` — `template: ''` would discard the label text. See ADR 040 §2.\r\n *\r\n * Auto-links to its sibling control via `[htmlFor]` sourced from\r\n * `SkraFieldContext.fieldId()` — zero manual ID passing (ADR 013). The label's\r\n * error-state colour is driven by `<skra-field>[data-skra-validation=\"invalid\"]`\r\n * swapping `--skra-comp-field-label-color` through CSS variable inheritance; this\r\n * SCSS is what consumes that variable (the swap was a no-op before the binding\r\n * moved here from the slice).\r\n */\r\n@Component({\r\n selector: 'label[skraLabelFor]',\r\n standalone: true,\r\n // Content-bearing host — see ADR 040 §2.\r\n template: '<ng-content></ng-content>',\r\n styleUrl: './label.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n host: {\r\n // The magic: auto-linking label to input via shared Context ID\r\n '[htmlFor]': 'context.fieldId()',\r\n // Referenceable id so a non-labelable control (a `role=\"radiogroup\"` host like\r\n // <skra-star-rating>, which `for`/`id` can't target) can name itself via\r\n // `aria-labelledby`. Harmless for labelable controls (they use `for`). ADR 013.\r\n '[id]': 'context.labelId()',\r\n // Required marker — reflect the field's required state so the SCSS can paint a\r\n // decorative asterisk (::after). The control already carries `aria-required`,\r\n // so the marker is purely visual (ADR 021 data-attr reflection; ADR 033 keeps\r\n // it out of the accessible name via the empty alt-text in `content`).\r\n '[attr.data-skra-required]': 'context.isRequired() ? \"\" : null',\r\n // Class hook retained for any consumer-side targeting (ADR 024 pattern).\r\n class: 'skra-label',\r\n },\r\n})\r\nexport class SkraLabel {\r\n readonly context = inject(SkraFieldContext);\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ViewEncapsulation,\r\n inject,\r\n} from '@angular/core';\r\nimport { SkraFieldContext } from '../field-context/field-context';\r\n\r\n/**\r\n * Hint component for supplementary field information.\r\n * Auto-receives ID from SkraFieldContext so aria-describedby on input works automatically.\r\n */\r\n@Component({\r\n selector: 'skra-hint',\r\n standalone: true,\r\n template: '<ng-content></ng-content>',\r\n styleUrl: './hint.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n host: {\r\n // Zero-margin reset (ADR 022) lives in hint.component.scss `:host`.\r\n // ID linked from context — input's aria-describedby points here automatically\r\n '[id]': 'context.hintId()',\r\n role: 'note',\r\n },\r\n})\r\nexport class SkraHint {\r\n readonly context = inject(SkraFieldContext);\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ViewEncapsulation,\r\n inject,\r\n} from '@angular/core';\r\nimport { SkraFieldContext } from '../field-context/field-context';\r\n\r\n/**\r\n * Error message atom sibling to `<skra-hint>`. Renders validation feedback\r\n * inside `<skra-field>` with its own a11y semantics: `role=\"alert\"` (which\r\n * carries an implicit `aria-live=\"assertive\"` + `aria-atomic=\"true\"`), so screen\r\n * readers announce a validation error promptly. NO explicit `aria-live` — adding\r\n * `aria-live=\"polite\"` alongside `role=\"alert\"` is contradictory (alert is\r\n * assertive by definition) and behaves inconsistently across AT. Assertive is\r\n * the WAI-ARIA APG pattern for validation errors (decision 2026-05-31, Batch 4\r\n * cleanroom review).\r\n *\r\n * Per ADR 037 (agnostic atom co-existence) — does not infer error state from\r\n * any binding strategy. Consumer renders or omits `<skra-error>` based on\r\n * their own validation source (Signal Forms `.invalid && .touched`, Reactive\r\n * Forms `ctrl.errors`, raw computed signal). The atom itself just supplies\r\n * a11y wiring + visual treatment.\r\n *\r\n * <skra-field [hasError]=\"emailHasError()\">\r\n * <label skraLabelFor>Email</label>\r\n * <input skraInput type=\"email\" />\r\n * <skra-hint>We'll never share your email.</skra-hint>\r\n * @if (emailHasError()) {\r\n * <skra-error>Please enter a valid email address.</skra-error>\r\n * }\r\n * </skra-field>\r\n *\r\n * Separate from `<skra-hint>` per SRP: hint is static helper text\r\n * (role=\"note\", neutral colour); error is dynamic validation feedback\r\n * (role=\"alert\", live region, error colour). One element per visual\r\n * responsibility — the rejected alternative (\"hint that swaps text on error\")\r\n * loaded two responsibilities into a single primitive.\r\n */\r\n@Component({\r\n selector: 'skra-error',\r\n standalone: true,\r\n template: '<ng-content></ng-content>',\r\n styleUrl: './error.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n host: {\r\n // Zero-margin reset (ADR 022) lives in error.component.scss `:host`.\r\n // ID linked from context — input's aria-describedby points here automatically\r\n '[id]': 'context.errorId()',\r\n // role=\"alert\" implies aria-live=\"assertive\" + aria-atomic=\"true\" — do NOT\r\n // add an explicit aria-live (contradicts the implicit assertive). Errors are\r\n // announced promptly per WAI-ARIA APG.\r\n role: 'alert',\r\n },\r\n})\r\nexport class SkraError {\r\n readonly context = inject(SkraFieldContext);\r\n}\r\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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"}
@@ -28,11 +28,12 @@ class SkraIcon {
28
28
  * forbidden by ADR 021); a consumer needing a bespoke size overrides
29
29
  * `--skra-comp-icon-size` via the sanctioned token-cascade path (ADR 029).
30
30
  */
31
- size = input(null, ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
32
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: SkraIcon, deps: [], target: i0.ɵɵFactoryTarget.Component });
33
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.7", type: SkraIcon, isStandalone: true, selector: "skra-icon", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-skra-size": "size()" } }, ngImport: i0, template: "<ng-content></ng-content>\n", styles: [":host{display:inline-block;margin:0;vertical-align:middle;color:inherit;--_skra-icon-resolved-size: var( --skra-comp-icon-size, var(--skra-comp-icon-size-default) );width:var(--_skra-icon-resolved-size);height:var(--_skra-icon-resolved-size);font-size:var(--_skra-icon-resolved-size);line-height:1}:host[data-skra-size=sm]{--_skra-icon-resolved-size: var(--skra-comp-icon-size-sm)}:host[data-skra-size=md]{--_skra-icon-resolved-size: var(--skra-comp-icon-size-md)}:host[data-skra-size=lg]{--_skra-icon-resolved-size: var(--skra-comp-icon-size-lg)}:host>svg,:host>img{display:block;width:100%;height:100%}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
31
+ size = input(null, /* @ts-ignore */
32
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
33
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraIcon, deps: [], target: i0.ɵɵFactoryTarget.Component });
34
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.1", type: SkraIcon, isStandalone: true, selector: "skra-icon", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-skra-size": "size()" } }, ngImport: i0, template: "<ng-content></ng-content>\n", styles: [":host{display:inline-block;margin:0;vertical-align:middle;color:inherit;--_skra-icon-resolved-size: var( --skra-comp-icon-size, var(--skra-comp-icon-size-default) );width:var(--_skra-icon-resolved-size);height:var(--_skra-icon-resolved-size);font-size:var(--_skra-icon-resolved-size);line-height:1}:host[data-skra-size=sm]{--_skra-icon-resolved-size: var(--skra-comp-icon-size-sm)}:host[data-skra-size=md]{--_skra-icon-resolved-size: var(--skra-comp-icon-size-md)}:host[data-skra-size=lg]{--_skra-icon-resolved-size: var(--skra-comp-icon-size-lg)}:host>svg,:host>img{display:block;width:100%;height:100%}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
34
35
  }
35
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: SkraIcon, decorators: [{
36
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraIcon, decorators: [{
36
37
  type: Component,
37
38
  args: [{ selector: 'skra-icon', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, host: {
38
39
  // CSP-Safe State Reflection (ADR 021) — host carries ONLY data-attributes,
@@ -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 {\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;AACM,IAAA,IAAI,GAAG,KAAK,CAAkB,IAAI,2EAAC;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;;;;"}
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 {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ViewEncapsulation,\r\n input,\r\n} from '@angular/core';\r\n\r\nexport type IconSize = 'sm' | 'md' | 'lg';\r\n\r\n/**\r\n * SkraIcon — container atom for icon-shaped content (ADR 034).\r\n *\r\n * Forge owns geometry, layout isolation, color inheritance hook. The shape\r\n * itself is supplied by the consumer via `<ng-content>` — inline SVG, `<img>`,\r\n * a third-party icon library element, or a styled `<span>` are all supported\r\n * equally. Forge ships no icon catalog and makes no rendering-strategy choice\r\n * for the consumer.\r\n *\r\n * Accessibility: this host has NO default ARIA attributes (ADR 034 §3.4). The\r\n * consumer MUST declare semantics explicitly:\r\n * - decorative icon → `<skra-icon aria-hidden=\"true\">`\r\n * - meaningful icon → `<skra-icon role=\"img\" aria-label=\"...\">` (ADR 033 Path 3;\r\n * `role=\"img\"` is required — `aria-label` on the roleless host is ARIA-prohibited)\r\n *\r\n * @see ADR 034 — SkraIcon as a container atom\r\n * @see ADR 033 — Accessible Name Contract\r\n */\r\n@Component({\r\n selector: 'skra-icon',\r\n standalone: true,\r\n templateUrl: './icon.html',\r\n styleUrl: './icon.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n host: {\r\n // CSP-Safe State Reflection (ADR 021) — host carries ONLY data-attributes,\r\n // never an inline `style`. The layout reset (display/margin/vertical-align)\r\n // lives in icon.scss `:host` per Visual Purism (no inline styles) and the\r\n // ADR 041 cleanup precedent (resets belong in SCSS, not host metadata).\r\n\r\n // Size reflection (ADR 021). `null` keeps the attribute absent so the icon\r\n // inherits the cascade-driven --skra-comp-icon-size (e.g. button slot\r\n // wrapper per ADR 030).\r\n '[attr.data-skra-size]': 'size()',\r\n },\r\n})\r\nexport class SkraIcon {\r\n /**\r\n * Preset size token (`'sm' | 'md' | 'lg'`). When `null`, the icon inherits\r\n * `--skra-comp-icon-size` from the surrounding context — typical in button\r\n * slot wrappers (ADR 030 §3.4) where the parent owns the icon size. Arbitrary\r\n * dimensions are not an input (a free value would require an inline style,\r\n * forbidden by ADR 021); a consumer needing a bespoke size overrides\r\n * `--skra-comp-icon-size` via the sanctioned token-cascade path (ADR 029).\r\n */\r\n readonly size = input<IconSize | null>(null);\r\n}\r\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;;;;"}
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { inject, ElementRef, effect, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
3
3
  import { SkraFieldContext } from '@skra/ui/field';
4
4
 
5
5
  /**
@@ -12,27 +12,68 @@ import { SkraFieldContext } from '@skra/ui/field';
12
12
  * DI wiring (ADR 013), host a11y bindings (ADR 021/027), and the agnostic
13
13
  * value posture (ADR 037 — no value channel, no @angular/forms) are unchanged
14
14
  * from the prior directive form.
15
+ *
16
+ * `SkraFieldContext` is injected `{ optional: true }` (ADR 013 §3.7) — the same
17
+ * posture as `skraCheckbox` / `skraRadio` / `skraSwitch`. Inside `<skra-field>`
18
+ * the atom takes the field's id + describedby + availability cascade; standalone
19
+ * it renders the skin only and the consumer owns every attribute, including the
20
+ * accessible name:
21
+ *
22
+ * <!-- inside Field — label association via the DI-generated id/for pair -->
23
+ * <skra-field>
24
+ * <label skraLabelFor>Email</label>
25
+ * <input skraInput type="email" />
26
+ * </skra-field>
27
+ *
28
+ * <!-- standalone: native implicit label (wrapping) — no id/for needed -->
29
+ * <label>Search <input skraInput type="search" /></label>
30
+ *
31
+ * Standalone use does NOT relax the ADR 033 accessible-name contract; it moves
32
+ * the name onto the consumer's own native markup. An input with no name is an
33
+ * a11y defect wherever it appears — including inside a `<skra-field>` that
34
+ * carries no `label[skraLabelFor]` — so the check belongs to the a11y gate, not
35
+ * to this injection site (ADR 013 §3.7).
15
36
  */
16
37
  class SkraInput {
17
- context = inject(SkraFieldContext);
18
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: SkraInput, deps: [], target: i0.ɵɵFactoryTarget.Component });
19
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.7", type: SkraInput, isStandalone: true, selector: "input[skraInput]", host: { properties: { "id": "context.fieldId()", "attr.aria-describedby": "context.describedByIds()", "attr.aria-invalid": "context.hasError() ? \"true\" : null", "attr.aria-required": "context.isRequired() ? \"true\" : null", "attr.disabled": "context.isDisabled() ? \"\" : null", "attr.readonly": "context.isReadonly() ? \"\" : null" } }, ngImport: i0, template: '', isInline: true, styles: [":host{background:var(--skra-comp-field-background);color:var(--skra-comp-field-foreground);border-color:var(--skra-comp-field-border-color);border-width:var(--skra-comp-field-border-width);border-style:var(--skra-comp-field-border-style);border-radius:var(--skra-comp-field-radius);padding-block:var(--skra-comp-field-padding-block);padding-inline:var(--skra-comp-field-padding-inline);box-shadow:var(--skra-comp-field-shadow);font:inherit;outline:none;transition:background-color var(--skra-comp-field-motion-duration) var(--skra-comp-field-motion-easing),border-color var(--skra-comp-field-motion-duration) var(--skra-comp-field-motion-easing),color var(--skra-comp-field-motion-duration) var(--skra-comp-field-motion-easing),box-shadow var(--skra-comp-field-motion-duration) var(--skra-comp-field-motion-easing)}:host(:hover:not(:disabled):not([readonly])){background:var(--skra-comp-field-background-hover);border-color:var(--skra-comp-field-border-color-hover)}:host(:focus-visible){border-color:var(--skra-comp-field-focus-ring-color);box-shadow:0 0 0 var(--skra-comp-field-focus-ring-width) var(--skra-comp-field-focus-ring-color)}:host(:disabled){cursor:not-allowed;opacity:var(--skra-sys-opacity-disabled)}:host([readonly]){cursor:default}:host([aria-invalid=true]){border-color:var(--skra-comp-field-error-color)}:host([aria-invalid=true]:focus-visible){box-shadow:0 0 0 var(--skra-comp-field-focus-ring-width) var(--skra-comp-field-error-color)}@media(prefers-reduced-motion:reduce){:host{transition:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
38
+ el = inject(ElementRef);
39
+ context = inject(SkraFieldContext, { optional: true });
40
+ constructor() {
41
+ const el = this.el.nativeElement;
42
+ // Field-cascaded native properties — only bind when context is present so
43
+ // standalone consumers retain full control of their static attributes
44
+ // (a host `[attr.disabled]="null"` binding would strip a consumer-authored
45
+ // `disabled` / `readonly` / `id`). Mirrors SkraCheckbox.
46
+ if (this.context) {
47
+ const ctx = this.context;
48
+ effect(() => {
49
+ el.id = ctx.fieldId();
50
+ });
51
+ effect(() => {
52
+ el.disabled = ctx.isDisabled();
53
+ });
54
+ effect(() => {
55
+ el.readOnly = ctx.isReadonly();
56
+ });
57
+ }
58
+ }
59
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraInput, deps: [], target: i0.ɵɵFactoryTarget.Component });
60
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.1", type: SkraInput, isStandalone: true, selector: "input[skraInput]", host: { properties: { "attr.aria-describedby": "context?.describedByIds() ?? null", "attr.aria-invalid": "context?.hasError() ? \"true\" : null", "attr.aria-required": "context?.isRequired() ? \"true\" : null" } }, ngImport: i0, template: '', isInline: true, styles: [":host{background:var(--skra-comp-field-background);color:var(--skra-comp-field-foreground);border-color:var(--skra-comp-field-border-color);border-width:var(--skra-comp-field-border-width);border-style:var(--skra-comp-field-border-style);border-radius:var(--skra-comp-field-radius);padding-block:var(--skra-comp-field-padding-block);padding-inline:var(--skra-comp-field-padding-inline);box-shadow:var(--skra-comp-field-shadow);font:inherit;outline:none;transition:background-color var(--skra-comp-field-motion-duration) var(--skra-comp-field-motion-easing),border-color var(--skra-comp-field-motion-duration) var(--skra-comp-field-motion-easing),color var(--skra-comp-field-motion-duration) var(--skra-comp-field-motion-easing),box-shadow var(--skra-comp-field-motion-duration) var(--skra-comp-field-motion-easing)}:host(:hover:not(:disabled):not([readonly])){background:var(--skra-comp-field-background-hover);border-color:var(--skra-comp-field-border-color-hover)}:host(:focus-visible){border-color:var(--skra-comp-field-focus-ring-color);box-shadow:0 0 0 var(--skra-comp-field-focus-ring-width) var(--skra-comp-field-focus-ring-color)}:host(:disabled){cursor:not-allowed;opacity:var(--skra-sys-opacity-disabled)}:host([readonly]){cursor:default}:host([aria-invalid=true]){border-color:var(--skra-comp-field-error-color)}:host([aria-invalid=true]:focus-visible){box-shadow:0 0 0 var(--skra-comp-field-focus-ring-width) var(--skra-comp-field-error-color)}@media(prefers-reduced-motion:reduce){:host{transition:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
20
61
  }
21
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: SkraInput, decorators: [{
62
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraInput, decorators: [{
22
63
  type: Component,
23
64
  args: [{ selector: 'input[skraInput]', standalone: true, template: '', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, host: {
24
- '[id]': 'context.fieldId()',
25
- '[attr.aria-describedby]': 'context.describedByIds()',
26
- '[attr.aria-invalid]': 'context.hasError() ? "true" : null',
27
- '[attr.aria-required]': 'context.isRequired() ? "true" : null',
65
+ // ARIA relationships — Skra-owned, present only while a field cascades them.
66
+ '[attr.aria-describedby]': 'context?.describedByIds() ?? null',
67
+ '[attr.aria-invalid]': 'context?.hasError() ? "true" : null',
68
+ '[attr.aria-required]': 'context?.isRequired() ? "true" : null',
28
69
  // Availability — native attrs only (native-attr-first, boundary #9). <input>
29
70
  // supports native `readonly`/`disabled`, which AT already exposes; NO
30
71
  // `aria-readonly`/`aria-disabled` here (setting both native + ARIA for one
31
72
  // state is forbidden). Readonly styling keys off `:read-only`/`[readonly]`.
32
- '[attr.disabled]': 'context.isDisabled() ? "" : null',
33
- '[attr.readonly]': 'context.isReadonly() ? "" : null',
73
+ // The native props are driven imperatively below, NOT as host bindings —
74
+ // see the constructor note on standalone attribute ownership.
34
75
  }, styles: [":host{background:var(--skra-comp-field-background);color:var(--skra-comp-field-foreground);border-color:var(--skra-comp-field-border-color);border-width:var(--skra-comp-field-border-width);border-style:var(--skra-comp-field-border-style);border-radius:var(--skra-comp-field-radius);padding-block:var(--skra-comp-field-padding-block);padding-inline:var(--skra-comp-field-padding-inline);box-shadow:var(--skra-comp-field-shadow);font:inherit;outline:none;transition:background-color var(--skra-comp-field-motion-duration) var(--skra-comp-field-motion-easing),border-color var(--skra-comp-field-motion-duration) var(--skra-comp-field-motion-easing),color var(--skra-comp-field-motion-duration) var(--skra-comp-field-motion-easing),box-shadow var(--skra-comp-field-motion-duration) var(--skra-comp-field-motion-easing)}:host(:hover:not(:disabled):not([readonly])){background:var(--skra-comp-field-background-hover);border-color:var(--skra-comp-field-border-color-hover)}:host(:focus-visible){border-color:var(--skra-comp-field-focus-ring-color);box-shadow:0 0 0 var(--skra-comp-field-focus-ring-width) var(--skra-comp-field-focus-ring-color)}:host(:disabled){cursor:not-allowed;opacity:var(--skra-sys-opacity-disabled)}:host([readonly]){cursor:default}:host([aria-invalid=true]){border-color:var(--skra-comp-field-error-color)}:host([aria-invalid=true]:focus-visible){box-shadow:0 0 0 var(--skra-comp-field-focus-ring-width) var(--skra-comp-field-error-color)}@media(prefers-reduced-motion:reduce){:host{transition:none}}\n"] }]
35
- }] });
76
+ }], ctorParameters: () => [] });
36
77
 
37
78
  /**
38
79
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"skra-ui-input.mjs","sources":["../../../../libs/ui/input/src/lib/input/input.ts","../../../../libs/ui/input/src/skra-ui-input.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n inject,\n} from '@angular/core';\nimport { SkraFieldContext } from '@skra/ui/field';\n\n/**\n * `input[skraInput]` — text-input atom. Per ADR 040 this is a\n * Component-on-a-native-host (not a directive): `<input>` is a void element, so\n * `template: ''` is correct — there is no consumer content to project. Angular\n * Emulated encapsulation scopes `input.scss` to the host, the same way\n * <skra-button> carries its own CSS. Replaces the ADR 038 global slice branch.\n *\n * DI wiring (ADR 013), host a11y bindings (ADR 021/027), and the agnostic\n * value posture (ADR 037 — no value channel, no @angular/forms) are unchanged\n * from the prior directive form.\n */\n@Component({\n selector: 'input[skraInput]',\n standalone: true,\n // Void host — no <ng-content>. See ADR 040 §2.\n template: '',\n styleUrl: './input.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n '[id]': 'context.fieldId()',\n '[attr.aria-describedby]': 'context.describedByIds()',\n '[attr.aria-invalid]': 'context.hasError() ? \"true\" : null',\n '[attr.aria-required]': 'context.isRequired() ? \"true\" : null',\n // Availability — native attrs only (native-attr-first, boundary #9). <input>\n // supports native `readonly`/`disabled`, which AT already exposes; NO\n // `aria-readonly`/`aria-disabled` here (setting both native + ARIA for one\n // state is forbidden). Readonly styling keys off `:read-only`/`[readonly]`.\n '[attr.disabled]': 'context.isDisabled() ? \"\" : null',\n '[attr.readonly]': 'context.isReadonly() ? \"\" : null',\n },\n})\nexport class SkraInput {\n readonly context = inject(SkraFieldContext);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAQA;;;;;;;;;;AAUG;MAsBU,SAAS,CAAA;AACX,IAAA,OAAO,GAAG,MAAM,CAAC,gBAAgB,CAAC;uGADhC,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAT,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,SAAS,iaAjBV,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,i/CAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAiBD,SAAS,EAAA,UAAA,EAAA,CAAA;kBArBrB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,EAAA,UAAA,EAChB,IAAI,EAAA,QAAA,EAEN,EAAE,EAAA,eAAA,EAEK,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,QAAQ,EAAA,IAAA,EACnC;AACJ,wBAAA,MAAM,EAAE,mBAAmB;AAC3B,wBAAA,yBAAyB,EAAE,0BAA0B;AACrD,wBAAA,qBAAqB,EAAE,oCAAoC;AAC3D,wBAAA,sBAAsB,EAAE,sCAAsC;;;;;AAK9D,wBAAA,iBAAiB,EAAE,kCAAkC;AACrD,wBAAA,iBAAiB,EAAE,kCAAkC;AACtD,qBAAA,EAAA,MAAA,EAAA,CAAA,i/CAAA,CAAA,EAAA;;;ACtCH;;AAEG;;;;"}
1
+ {"version":3,"file":"skra-ui-input.mjs","sources":["../../../../libs/ui/input/src/lib/input/input.ts","../../../../libs/ui/input/src/skra-ui-input.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n effect,\n inject,\n} from '@angular/core';\nimport { SkraFieldContext } from '@skra/ui/field';\n\n/**\n * `input[skraInput]` — text-input atom. Per ADR 040 this is a\n * Component-on-a-native-host (not a directive): `<input>` is a void element, so\n * `template: ''` is correct — there is no consumer content to project. Angular\n * Emulated encapsulation scopes `input.scss` to the host, the same way\n * <skra-button> carries its own CSS. Replaces the ADR 038 global slice branch.\n *\n * DI wiring (ADR 013), host a11y bindings (ADR 021/027), and the agnostic\n * value posture (ADR 037 — no value channel, no @angular/forms) are unchanged\n * from the prior directive form.\n *\n * `SkraFieldContext` is injected `{ optional: true }` (ADR 013 §3.7) — the same\n * posture as `skraCheckbox` / `skraRadio` / `skraSwitch`. Inside `<skra-field>`\n * the atom takes the field's id + describedby + availability cascade; standalone\n * it renders the skin only and the consumer owns every attribute, including the\n * accessible name:\n *\n * <!-- inside Field — label association via the DI-generated id/for pair -->\n * <skra-field>\n * <label skraLabelFor>Email</label>\n * <input skraInput type=\"email\" />\n * </skra-field>\n *\n * <!-- standalone: native implicit label (wrapping) — no id/for needed -->\n * <label>Search <input skraInput type=\"search\" /></label>\n *\n * Standalone use does NOT relax the ADR 033 accessible-name contract; it moves\n * the name onto the consumer's own native markup. An input with no name is an\n * a11y defect wherever it appears — including inside a `<skra-field>` that\n * carries no `label[skraLabelFor]` — so the check belongs to the a11y gate, not\n * to this injection site (ADR 013 §3.7).\n */\n@Component({\n selector: 'input[skraInput]',\n standalone: true,\n // Void host — no <ng-content>. See ADR 040 §2.\n template: '',\n styleUrl: './input.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n // ARIA relationships — Skra-owned, present only while a field cascades them.\n '[attr.aria-describedby]': 'context?.describedByIds() ?? null',\n '[attr.aria-invalid]': 'context?.hasError() ? \"true\" : null',\n '[attr.aria-required]': 'context?.isRequired() ? \"true\" : null',\n // Availability — native attrs only (native-attr-first, boundary #9). <input>\n // supports native `readonly`/`disabled`, which AT already exposes; NO\n // `aria-readonly`/`aria-disabled` here (setting both native + ARIA for one\n // state is forbidden). Readonly styling keys off `:read-only`/`[readonly]`.\n // The native props are driven imperatively below, NOT as host bindings —\n // see the constructor note on standalone attribute ownership.\n },\n})\nexport class SkraInput {\n private readonly el = inject<ElementRef<HTMLInputElement>>(ElementRef);\n readonly context = inject(SkraFieldContext, { optional: true });\n\n constructor() {\n const el = this.el.nativeElement;\n\n // Field-cascaded native properties — only bind when context is present so\n // standalone consumers retain full control of their static attributes\n // (a host `[attr.disabled]=\"null\"` binding would strip a consumer-authored\n // `disabled` / `readonly` / `id`). Mirrors SkraCheckbox.\n if (this.context) {\n const ctx = this.context;\n effect(() => {\n el.id = ctx.fieldId();\n });\n effect(() => {\n el.disabled = ctx.isDisabled();\n });\n effect(() => {\n el.readOnly = ctx.isReadonly();\n });\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BG;MAsBU,SAAS,CAAA;AACH,IAAA,EAAE,GAAG,MAAM,CAA+B,UAAU,CAAC;IAC7D,OAAO,GAAG,MAAM,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAE/D,IAAA,WAAA,GAAA;AACE,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa;;;;;AAMhC,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO;YACxB,MAAM,CAAC,MAAK;AACV,gBAAA,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE;AACvB,YAAA,CAAC,CAAC;YACF,MAAM,CAAC,MAAK;AACV,gBAAA,EAAE,CAAC,QAAQ,GAAG,GAAG,CAAC,UAAU,EAAE;AAChC,YAAA,CAAC,CAAC;YACF,MAAM,CAAC,MAAK;AACV,gBAAA,EAAE,CAAC,QAAQ,GAAG,GAAG,CAAC,UAAU,EAAE;AAChC,YAAA,CAAC,CAAC;QACJ;IACF;uGAvBW,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAT,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,SAAS,mSAjBV,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,i/CAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAiBD,SAAS,EAAA,UAAA,EAAA,CAAA;kBArBrB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,EAAA,UAAA,EAChB,IAAI,EAAA,QAAA,EAEN,EAAE,EAAA,eAAA,EAEK,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,QAAQ,EAAA,IAAA,EACnC;;AAEJ,wBAAA,yBAAyB,EAAE,mCAAmC;AAC9D,wBAAA,qBAAqB,EAAE,qCAAqC;AAC5D,wBAAA,sBAAsB,EAAE,uCAAuC;;;;;;;AAOhE,qBAAA,EAAA,MAAA,EAAA,CAAA,i/CAAA,CAAA,EAAA;;;AC7DH;;AAEG;;;;"}
@@ -26,10 +26,10 @@ import { ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/
26
26
  * deliberately **not** `aria-hidden`: the key name is meaningful content AT must announce.
27
27
  */
28
28
  class SkraKbd {
29
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: SkraKbd, deps: [], target: i0.ɵɵFactoryTarget.Component });
30
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.7", type: SkraKbd, isStandalone: true, selector: "kbd[skraKbd]", host: { classAttribute: "skra-kbd" }, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: [":host{display:inline-flex;align-items:center;justify-content:center;margin:0;white-space:nowrap;vertical-align:baseline;background:var(--skra-comp-kbd-background);color:var(--skra-comp-kbd-foreground);border:var(--skra-comp-kbd-border-width) var(--skra-comp-kbd-border-style) var(--skra-comp-kbd-border-color);border-radius:var(--skra-comp-kbd-radius);padding:var(--skra-comp-kbd-padding-block) var(--skra-comp-kbd-padding-inline);box-shadow:var(--skra-comp-kbd-shadow);font-family:var(--skra-comp-kbd-font-family);font-size:.875em;font-weight:var(--skra-sys-typography-role-label-small-font-weight);line-height:var(--skra-sys-typography-role-label-small-line-height);letter-spacing:var(--skra-sys-typography-role-label-small-letter-spacing);min-inline-size:1em;box-sizing:border-box}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
29
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraKbd, deps: [], target: i0.ɵɵFactoryTarget.Component });
30
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.1", type: SkraKbd, isStandalone: true, selector: "kbd[skraKbd]", host: { classAttribute: "skra-kbd" }, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: [":host{display:inline-flex;align-items:center;justify-content:center;margin:0;white-space:nowrap;vertical-align:baseline;background:var(--skra-comp-kbd-background);color:var(--skra-comp-kbd-foreground);border:var(--skra-comp-kbd-border-width) var(--skra-comp-kbd-border-style) var(--skra-comp-kbd-border-color);border-radius:var(--skra-comp-kbd-radius);padding:var(--skra-comp-kbd-padding-block) var(--skra-comp-kbd-padding-inline);box-shadow:var(--skra-comp-kbd-shadow);font-family:var(--skra-comp-kbd-font-family);font-size:.875em;font-weight:var(--skra-sys-typography-role-label-small-font-weight);line-height:var(--skra-sys-typography-role-label-small-line-height);letter-spacing:var(--skra-sys-typography-role-label-small-letter-spacing);min-inline-size:1em;box-sizing:border-box}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
31
31
  }
32
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: SkraKbd, decorators: [{
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraKbd, decorators: [{
33
33
  type: Component,
34
34
  args: [{ selector: 'kbd[skraKbd]', standalone: true, template: '<ng-content></ng-content>', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, host: {
35
35
  class: 'skra-kbd',
@@ -1 +1 @@
1
- {"version":3,"file":"skra-ui-kbd.mjs","sources":["../../../../libs/ui/kbd/src/lib/kbd/kbd.ts","../../../../libs/ui/kbd/src/skra-ui-kbd.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n} from '@angular/core';\n\n/**\n * `kbd[skraKbd]` — keyboard-key display atom (first resident of `libs/ui/content`, the\n * text-level inline-semantics family). Renders a single key / key-name as a styled key-cap for\n * docs, shortcut hints and help text (\"press `Esc` to close\"). See\n * `adr/specs/component-kbd-spec.md`.\n *\n * **Component-on-the-native-host (ADR 040), NOT `<skra-kbd>`:** native `<kbd>` already carries\n * the correct HTML semantic (\"user keyboard input\"), so we decorate it (ADR 012). `<kbd>` is\n * content-bearing, so the template MUST be `<ng-content>` — `template: ''` would discard the key\n * text (ADR 040 §2; the `label[skraLabelFor]` precedent).\n *\n * **Zero inputs by design.** A key display is purely presentational:\n * - sizing is em-relative (it harmonises with the surrounding text), so there is no `size` input\n * — an explicit size enum would be a look-input (skin-philosophy) and low-demand (90%-rule);\n * - no coherent semantic exists for a `type`, and a `type` enum switching appearance is the SRP\n * smell the Decision Doctrine warns against;\n * - the monospace family is skin-owned (`--skra-comp-kbd-font-family` → `sys.font-family.code`);\n * - key-combos (\"Ctrl+C\") are consumer composition of multiple `<kbd skraKbd>` (agnostic\n * doctrine), not a `combo` input.\n *\n * So there is no input, no output, no `data-skra-*` state (non-interactive — State Surface\n * all-N/A), and no `ariaLabel` (the visible text IS the accessible content, ADR 033). The host is\n * deliberately **not** `aria-hidden`: the key name is meaningful content AT must announce.\n */\n@Component({\n selector: 'kbd[skraKbd]',\n standalone: true,\n // Content-bearing host — see ADR 040 §2 (label precedent).\n template: '<ng-content></ng-content>',\n styleUrl: './kbd.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n class: 'skra-kbd',\n },\n})\nexport class SkraKbd {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAMA;;;;;;;;;;;;;;;;;;;;;;;AAuBG;MAaU,OAAO,CAAA;uGAAP,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAP,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,OAAO,8GARR,2BAA2B,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,oxBAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAQ1B,OAAO,EAAA,UAAA,EAAA,CAAA;kBAZnB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAAA,UAAA,EACZ,IAAI,EAAA,QAAA,EAEN,2BAA2B,EAAA,eAAA,EAEpB,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,QAAQ,EAAA,IAAA,EACnC;AACJ,wBAAA,KAAK,EAAE,UAAU;AAClB,qBAAA,EAAA,MAAA,EAAA,CAAA,oxBAAA,CAAA,EAAA;;;ACxCH;;AAEG;;;;"}
1
+ {"version":3,"file":"skra-ui-kbd.mjs","sources":["../../../../libs/ui/kbd/src/lib/kbd/kbd.ts","../../../../libs/ui/kbd/src/skra-ui-kbd.ts"],"sourcesContent":["import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\n\r\n/**\r\n * `kbd[skraKbd]` — keyboard-key display atom (first resident of `libs/ui/content`, the\r\n * text-level inline-semantics family). Renders a single key / key-name as a styled key-cap for\r\n * docs, shortcut hints and help text (\"press `Esc` to close\"). See\r\n * `adr/specs/component-kbd-spec.md`.\r\n *\r\n * **Component-on-the-native-host (ADR 040), NOT `<skra-kbd>`:** native `<kbd>` already carries\r\n * the correct HTML semantic (\"user keyboard input\"), so we decorate it (ADR 012). `<kbd>` is\r\n * content-bearing, so the template MUST be `<ng-content>` — `template: ''` would discard the key\r\n * text (ADR 040 §2; the `label[skraLabelFor]` precedent).\r\n *\r\n * **Zero inputs by design.** A key display is purely presentational:\r\n * - sizing is em-relative (it harmonises with the surrounding text), so there is no `size` input\r\n * — an explicit size enum would be a look-input (skin-philosophy) and low-demand (90%-rule);\r\n * - no coherent semantic exists for a `type`, and a `type` enum switching appearance is the SRP\r\n * smell the Decision Doctrine warns against;\r\n * - the monospace family is skin-owned (`--skra-comp-kbd-font-family` → `sys.font-family.code`);\r\n * - key-combos (\"Ctrl+C\") are consumer composition of multiple `<kbd skraKbd>` (agnostic\r\n * doctrine), not a `combo` input.\r\n *\r\n * So there is no input, no output, no `data-skra-*` state (non-interactive — State Surface\r\n * all-N/A), and no `ariaLabel` (the visible text IS the accessible content, ADR 033). The host is\r\n * deliberately **not** `aria-hidden`: the key name is meaningful content AT must announce.\r\n */\r\n@Component({\r\n selector: 'kbd[skraKbd]',\r\n standalone: true,\r\n // Content-bearing host — see ADR 040 §2 (label precedent).\r\n template: '<ng-content></ng-content>',\r\n styleUrl: './kbd.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n host: {\r\n class: 'skra-kbd',\r\n },\r\n})\r\nexport class SkraKbd {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAMA;;;;;;;;;;;;;;;;;;;;;;;AAuBG;MAaU,OAAO,CAAA;uGAAP,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAP,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,OAAO,8GARR,2BAA2B,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,oxBAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAQ1B,OAAO,EAAA,UAAA,EAAA,CAAA;kBAZnB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAAA,UAAA,EACZ,IAAI,EAAA,QAAA,EAEN,2BAA2B,EAAA,eAAA,EAEpB,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,QAAQ,EAAA,IAAA,EACnC;AACJ,wBAAA,KAAK,EAAE,UAAU;AAClB,qBAAA,EAAA,MAAA,EAAA,CAAA,oxBAAA,CAAA,EAAA;;;ACxCH;;AAEG;;;;"}
@@ -14,12 +14,14 @@ import { input, ViewEncapsulation, ChangeDetectionStrategy, Component, booleanAt
14
14
  * (ADR 016 §3.3, amended by ADR 041).
15
15
  */
16
16
  class SkraBox {
17
- padding = input('none', ...(ngDevMode ? [{ debugName: "padding" }] : /* istanbul ignore next */ []));
18
- display = input('block', ...(ngDevMode ? [{ debugName: "display" }] : /* istanbul ignore next */ []));
19
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: SkraBox, deps: [], target: i0.ɵɵFactoryTarget.Component });
20
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.7", type: SkraBox, isStandalone: true, selector: "div[skraBox], section[skraBox], article[skraBox], main[skraBox], nav[skraBox], aside[skraBox], header[skraBox], footer[skraBox], form[skraBox], figure[skraBox]", inputs: { padding: { classPropertyName: "padding", publicName: "padding", isSignal: true, isRequired: false, transformFunction: null }, display: { classPropertyName: "display", publicName: "display", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-skra-padding": "padding()", "attr.data-skra-display": "display()" } }, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: [":host{display:block;margin:0;box-sizing:border-box}:host[data-skra-display=block]{display:block}:host[data-skra-display=inline-block]{display:inline-block}:host[data-skra-display=flex]{display:flex}:host[data-skra-padding=none]{padding:0}:host[data-skra-padding=sm]{padding:var(--skra-comp-box-padding-sm)}:host[data-skra-padding=md]{padding:var(--skra-comp-box-padding-md)}:host[data-skra-padding=lg]{padding:var(--skra-comp-box-padding-lg)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
17
+ padding = input('none', /* @ts-ignore */
18
+ ...(ngDevMode ? [{ debugName: "padding" }] : /* istanbul ignore next */ []));
19
+ display = input('block', /* @ts-ignore */
20
+ ...(ngDevMode ? [{ debugName: "display" }] : /* istanbul ignore next */ []));
21
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraBox, deps: [], target: i0.ɵɵFactoryTarget.Component });
22
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.1", type: SkraBox, isStandalone: true, selector: "div[skraBox], section[skraBox], article[skraBox], main[skraBox], nav[skraBox], aside[skraBox], header[skraBox], footer[skraBox], form[skraBox], figure[skraBox]", inputs: { padding: { classPropertyName: "padding", publicName: "padding", isSignal: true, isRequired: false, transformFunction: null }, display: { classPropertyName: "display", publicName: "display", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-skra-padding": "padding()", "attr.data-skra-display": "display()" } }, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: [":host{display:block;margin:0;box-sizing:border-box}:host[data-skra-display=block]{display:block}:host[data-skra-display=inline-block]{display:inline-block}:host[data-skra-display=flex]{display:flex}:host[data-skra-padding=none]{padding:0}:host[data-skra-padding=sm]{padding:var(--skra-comp-box-padding-sm)}:host[data-skra-padding=md]{padding:var(--skra-comp-box-padding-md)}:host[data-skra-padding=lg]{padding:var(--skra-comp-box-padding-lg)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
21
23
  }
22
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: SkraBox, decorators: [{
24
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraBox, decorators: [{
23
25
  type: Component,
24
26
  args: [{ selector: 'div[skraBox], section[skraBox], article[skraBox], main[skraBox], nav[skraBox], aside[skraBox], header[skraBox], footer[skraBox], form[skraBox], figure[skraBox]', standalone: true, template: '<ng-content></ng-content>', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, host: {
25
27
  // CSP-Safe State Reflection (ADR 021) — NO inline styles! The layout reset
@@ -44,15 +46,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImpor
44
46
  * (ADR 016 §3.3, amended by ADR 041).
45
47
  */
46
48
  class SkraStack {
47
- direction = input('column', ...(ngDevMode ? [{ debugName: "direction" }] : /* istanbul ignore next */ []));
48
- gap = input('md', ...(ngDevMode ? [{ debugName: "gap" }] : /* istanbul ignore next */ []));
49
- align = input('stretch', ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
50
- justify = input('start', ...(ngDevMode ? [{ debugName: "justify" }] : /* istanbul ignore next */ []));
49
+ direction = input('column', /* @ts-ignore */
50
+ ...(ngDevMode ? [{ debugName: "direction" }] : /* istanbul ignore next */ []));
51
+ gap = input('md', /* @ts-ignore */
52
+ ...(ngDevMode ? [{ debugName: "gap" }] : /* istanbul ignore next */ []));
53
+ align = input('stretch', /* @ts-ignore */
54
+ ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
55
+ justify = input('start', /* @ts-ignore */
56
+ ...(ngDevMode ? [{ debugName: "justify" }] : /* istanbul ignore next */ []));
51
57
  wrap = input(false, { ...(ngDevMode ? { debugName: "wrap" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
52
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: SkraStack, deps: [], target: i0.ɵɵFactoryTarget.Component });
53
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.7", type: SkraStack, isStandalone: true, selector: "div[skraStack], section[skraStack], article[skraStack], main[skraStack], nav[skraStack], aside[skraStack], header[skraStack], footer[skraStack], form[skraStack], figure[skraStack], ul[skraStack], ol[skraStack], menu[skraStack]", inputs: { direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null }, gap: { classPropertyName: "gap", publicName: "gap", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, justify: { classPropertyName: "justify", publicName: "justify", isSignal: true, isRequired: false, transformFunction: null }, wrap: { classPropertyName: "wrap", publicName: "wrap", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-skra-direction": "direction()", "attr.data-skra-gap": "gap()", "attr.data-skra-align": "align()", "attr.data-skra-justify": "justify()", "attr.data-skra-wrap": "wrap() ? \"\" : null" } }, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: [":host{display:flex;margin:0;box-sizing:border-box}:host[data-skra-direction=column]{flex-direction:column}:host[data-skra-direction=row]{flex-direction:row}:host[data-skra-gap=none]{gap:0}:host[data-skra-gap=sm]{gap:var(--skra-comp-stack-gap-sm)}:host[data-skra-gap=md]{gap:var(--skra-comp-stack-gap-md)}:host[data-skra-gap=lg]{gap:var(--skra-comp-stack-gap-lg)}:host[data-skra-align=start]{align-items:flex-start}:host[data-skra-align=center]{align-items:center}:host[data-skra-align=end]{align-items:flex-end}:host[data-skra-align=stretch]{align-items:stretch}:host[data-skra-justify=start]{justify-content:flex-start}:host[data-skra-justify=center]{justify-content:center}:host[data-skra-justify=end]{justify-content:flex-end}:host[data-skra-justify=between]{justify-content:space-between}:host[data-skra-justify=around]{justify-content:space-around}:host[data-skra-wrap]{flex-wrap:wrap}:host(ul),:host(ol),:host(menu){list-style:none;padding-inline-start:0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
58
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraStack, deps: [], target: i0.ɵɵFactoryTarget.Component });
59
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.1", type: SkraStack, isStandalone: true, selector: "div[skraStack], section[skraStack], article[skraStack], main[skraStack], nav[skraStack], aside[skraStack], header[skraStack], footer[skraStack], form[skraStack], figure[skraStack], ul[skraStack], ol[skraStack], menu[skraStack]", inputs: { direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null }, gap: { classPropertyName: "gap", publicName: "gap", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, justify: { classPropertyName: "justify", publicName: "justify", isSignal: true, isRequired: false, transformFunction: null }, wrap: { classPropertyName: "wrap", publicName: "wrap", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-skra-direction": "direction()", "attr.data-skra-gap": "gap()", "attr.data-skra-align": "align()", "attr.data-skra-justify": "justify()", "attr.data-skra-wrap": "wrap() ? \"\" : null" } }, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: [":host{display:flex;margin:0;box-sizing:border-box}:host[data-skra-direction=column]{flex-direction:column}:host[data-skra-direction=row]{flex-direction:row}:host[data-skra-gap=none]{gap:0}:host[data-skra-gap=sm]{gap:var(--skra-comp-stack-gap-sm)}:host[data-skra-gap=md]{gap:var(--skra-comp-stack-gap-md)}:host[data-skra-gap=lg]{gap:var(--skra-comp-stack-gap-lg)}:host[data-skra-align=start]{align-items:flex-start}:host[data-skra-align=center]{align-items:center}:host[data-skra-align=end]{align-items:flex-end}:host[data-skra-align=stretch]{align-items:stretch}:host[data-skra-justify=start]{justify-content:flex-start}:host[data-skra-justify=center]{justify-content:center}:host[data-skra-justify=end]{justify-content:flex-end}:host[data-skra-justify=between]{justify-content:space-between}:host[data-skra-justify=around]{justify-content:space-around}:host[data-skra-wrap]{flex-wrap:wrap}:host(ul),:host(ol),:host(menu){list-style:none;padding-inline-start:0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
54
60
  }
55
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: SkraStack, decorators: [{
61
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraStack, decorators: [{
56
62
  type: Component,
57
63
  args: [{ selector: 'div[skraStack], section[skraStack], article[skraStack], main[skraStack], nav[skraStack], aside[skraStack], header[skraStack], footer[skraStack], form[skraStack], figure[skraStack], ul[skraStack], ol[skraStack], menu[skraStack]', standalone: true, template: '<ng-content></ng-content>', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, host: {
58
64
  // CSP-Safe State Reflection — only data-attributes, no [style.*]. The
@@ -86,16 +92,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImpor
86
92
  * `@container`; it MUST NOT establish a container-query context (ADR 041 §3.3).
87
93
  */
88
94
  class SkraGrid {
89
- columns = input('auto-fit', ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
90
- min = input('md', ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
91
- gap = input('md', ...(ngDevMode ? [{ debugName: "gap" }] : /* istanbul ignore next */ []));
92
- flow = input('row', ...(ngDevMode ? [{ debugName: "flow" }] : /* istanbul ignore next */ []));
93
- align = input('stretch', ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
94
- justifyItems = input('stretch', ...(ngDevMode ? [{ debugName: "justifyItems" }] : /* istanbul ignore next */ []));
95
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: SkraGrid, deps: [], target: i0.ɵɵFactoryTarget.Component });
96
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.7", type: SkraGrid, isStandalone: true, selector: "div[skraGrid], section[skraGrid], article[skraGrid], main[skraGrid], nav[skraGrid], aside[skraGrid], header[skraGrid], footer[skraGrid], form[skraGrid], figure[skraGrid], ul[skraGrid], ol[skraGrid], menu[skraGrid]", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, gap: { classPropertyName: "gap", publicName: "gap", isSignal: true, isRequired: false, transformFunction: null }, flow: { classPropertyName: "flow", publicName: "flow", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, justifyItems: { classPropertyName: "justifyItems", publicName: "justifyItems", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-skra-columns": "columns()", "attr.data-skra-min": "min()", "attr.data-skra-gap": "gap()", "attr.data-skra-flow": "flow()", "attr.data-skra-align": "align()", "attr.data-skra-justify-items": "justifyItems()" } }, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: [":host{display:grid;margin:0;box-sizing:border-box}:host[data-skra-min=sm]{--skra-comp-grid-track-min: var(--skra-comp-grid-min-sm)}:host[data-skra-min=md]{--skra-comp-grid-track-min: var(--skra-comp-grid-min-md)}:host[data-skra-min=lg]{--skra-comp-grid-track-min: var(--skra-comp-grid-min-lg)}:host[data-skra-columns=\"1\"]{grid-template-columns:repeat(1,minmax(0,1fr))}:host[data-skra-columns=\"2\"]{grid-template-columns:repeat(2,minmax(0,1fr))}:host[data-skra-columns=\"3\"]{grid-template-columns:repeat(3,minmax(0,1fr))}:host[data-skra-columns=\"4\"]{grid-template-columns:repeat(4,minmax(0,1fr))}:host[data-skra-columns=\"5\"]{grid-template-columns:repeat(5,minmax(0,1fr))}:host[data-skra-columns=\"6\"]{grid-template-columns:repeat(6,minmax(0,1fr))}:host[data-skra-columns=auto-fit]{grid-template-columns:repeat(auto-fit,minmax(var(--skra-comp-grid-track-min),1fr))}:host[data-skra-columns=auto-fill]{grid-template-columns:repeat(auto-fill,minmax(var(--skra-comp-grid-track-min),1fr))}:host[data-skra-gap=none]{gap:0}:host[data-skra-gap=sm]{gap:var(--skra-comp-grid-gap-sm)}:host[data-skra-gap=md]{gap:var(--skra-comp-grid-gap-md)}:host[data-skra-gap=lg]{gap:var(--skra-comp-grid-gap-lg)}:host[data-skra-flow=row]{grid-auto-flow:row}:host[data-skra-flow=column]{grid-auto-flow:column}:host[data-skra-flow=dense]{grid-auto-flow:row dense}:host[data-skra-align=start]{align-items:start}:host[data-skra-align=center]{align-items:center}:host[data-skra-align=end]{align-items:end}:host[data-skra-align=stretch]{align-items:stretch}:host[data-skra-justify-items=start]{justify-items:start}:host[data-skra-justify-items=center]{justify-items:center}:host[data-skra-justify-items=end]{justify-items:end}:host[data-skra-justify-items=stretch]{justify-items:stretch}:host(ul),:host(ol),:host(menu){list-style:none;padding-inline-start:0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
95
+ columns = input('auto-fit', /* @ts-ignore */
96
+ ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
97
+ min = input('md', /* @ts-ignore */
98
+ ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
99
+ gap = input('md', /* @ts-ignore */
100
+ ...(ngDevMode ? [{ debugName: "gap" }] : /* istanbul ignore next */ []));
101
+ flow = input('row', /* @ts-ignore */
102
+ ...(ngDevMode ? [{ debugName: "flow" }] : /* istanbul ignore next */ []));
103
+ align = input('stretch', /* @ts-ignore */
104
+ ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
105
+ justifyItems = input('stretch', /* @ts-ignore */
106
+ ...(ngDevMode ? [{ debugName: "justifyItems" }] : /* istanbul ignore next */ []));
107
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraGrid, deps: [], target: i0.ɵɵFactoryTarget.Component });
108
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.1", type: SkraGrid, isStandalone: true, selector: "div[skraGrid], section[skraGrid], article[skraGrid], main[skraGrid], nav[skraGrid], aside[skraGrid], header[skraGrid], footer[skraGrid], form[skraGrid], figure[skraGrid], ul[skraGrid], ol[skraGrid], menu[skraGrid]", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, gap: { classPropertyName: "gap", publicName: "gap", isSignal: true, isRequired: false, transformFunction: null }, flow: { classPropertyName: "flow", publicName: "flow", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, justifyItems: { classPropertyName: "justifyItems", publicName: "justifyItems", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-skra-columns": "columns()", "attr.data-skra-min": "min()", "attr.data-skra-gap": "gap()", "attr.data-skra-flow": "flow()", "attr.data-skra-align": "align()", "attr.data-skra-justify-items": "justifyItems()" } }, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: [":host{display:grid;margin:0;box-sizing:border-box}:host[data-skra-min=sm]{--skra-comp-grid-track-min: var(--skra-comp-grid-min-sm)}:host[data-skra-min=md]{--skra-comp-grid-track-min: var(--skra-comp-grid-min-md)}:host[data-skra-min=lg]{--skra-comp-grid-track-min: var(--skra-comp-grid-min-lg)}:host[data-skra-columns=\"1\"]{grid-template-columns:repeat(1,minmax(0,1fr))}:host[data-skra-columns=\"2\"]{grid-template-columns:repeat(2,minmax(0,1fr))}:host[data-skra-columns=\"3\"]{grid-template-columns:repeat(3,minmax(0,1fr))}:host[data-skra-columns=\"4\"]{grid-template-columns:repeat(4,minmax(0,1fr))}:host[data-skra-columns=\"5\"]{grid-template-columns:repeat(5,minmax(0,1fr))}:host[data-skra-columns=\"6\"]{grid-template-columns:repeat(6,minmax(0,1fr))}:host[data-skra-columns=auto-fit]{grid-template-columns:repeat(auto-fit,minmax(var(--skra-comp-grid-track-min),1fr))}:host[data-skra-columns=auto-fill]{grid-template-columns:repeat(auto-fill,minmax(var(--skra-comp-grid-track-min),1fr))}:host[data-skra-gap=none]{gap:0}:host[data-skra-gap=sm]{gap:var(--skra-comp-grid-gap-sm)}:host[data-skra-gap=md]{gap:var(--skra-comp-grid-gap-md)}:host[data-skra-gap=lg]{gap:var(--skra-comp-grid-gap-lg)}:host[data-skra-flow=row]{grid-auto-flow:row}:host[data-skra-flow=column]{grid-auto-flow:column}:host[data-skra-flow=dense]{grid-auto-flow:row dense}:host[data-skra-align=start]{align-items:start}:host[data-skra-align=center]{align-items:center}:host[data-skra-align=end]{align-items:end}:host[data-skra-align=stretch]{align-items:stretch}:host[data-skra-justify-items=start]{justify-items:start}:host[data-skra-justify-items=center]{justify-items:center}:host[data-skra-justify-items=end]{justify-items:end}:host[data-skra-justify-items=stretch]{justify-items:stretch}:host(ul),:host(ol),:host(menu){list-style:none;padding-inline-start:0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
97
109
  }
98
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: SkraGrid, decorators: [{
110
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraGrid, decorators: [{
99
111
  type: Component,
100
112
  args: [{ selector: 'div[skraGrid], section[skraGrid], article[skraGrid], main[skraGrid], nav[skraGrid], aside[skraGrid], header[skraGrid], footer[skraGrid], form[skraGrid], figure[skraGrid], ul[skraGrid], ol[skraGrid], menu[skraGrid]', standalone: true, template: '<ng-content></ng-content>', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, host: {
101
113
  // CSP-Safe State Reflection — only data-attributes, no [style.*]. The layout
@@ -1 +1 @@
1
- {"version":3,"file":"skra-ui-layout.mjs","sources":["../../../../libs/ui/layout/src/lib/box/box.ts","../../../../libs/ui/layout/src/lib/stack/stack.ts","../../../../libs/ui/layout/src/lib/grid/grid.ts","../../../../libs/ui/layout/src/skra-ui-layout.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n input,\n} from '@angular/core';\n\nexport type BoxPadding = 'none' | 'sm' | 'md' | 'lg';\nexport type BoxDisplay = 'block' | 'inline-block' | 'flex';\n\n/**\n * SkraBox — semantically-neutral spacing/padding primitive (ADR 041).\n *\n * Component-on-native-host: layers onto a generic flow/sectioning container via\n * the bounded host allowlist below — NEVER a `<skra-box>` custom element\n * (ADR 012 §3.1 / ADR 041). Box does NOT arrange children, so list hosts\n * (`ul`/`ol`/`menu`) are intentionally excluded from its allowlist.\n *\n * Box is a pure spacing primitive: it MUST NOT establish a container-query\n * context (`container-type`/`container-name`) — that is an app-level concern\n * (ADR 016 §3.3, amended by ADR 041).\n */\n@Component({\n selector:\n 'div[skraBox], section[skraBox], article[skraBox], main[skraBox], nav[skraBox], aside[skraBox], header[skraBox], footer[skraBox], form[skraBox], figure[skraBox]',\n standalone: true,\n template: '<ng-content></ng-content>',\n styleUrl: './box.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n // CSP-Safe State Reflection (ADR 021) — NO inline styles! The layout reset\n // (margin/box-sizing) + figure UA-margin normalization live in box.scss\n // `:host` (ADR 022 / ADR 041 Host Normalization Contract); host-metadata\n // bare keys would render as junk attributes, not styles.\n '[attr.data-skra-padding]': 'padding()',\n '[attr.data-skra-display]': 'display()',\n },\n})\nexport class SkraBox {\n readonly padding = input<BoxPadding>('none');\n readonly display = input<BoxDisplay>('block');\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n input,\n} from '@angular/core';\n\nexport type StackDirection = 'row' | 'column';\nexport type StackGap = 'none' | 'sm' | 'md' | 'lg';\nexport type StackAlign = 'start' | 'center' | 'end' | 'stretch';\nexport type StackJustify = 'start' | 'center' | 'end' | 'between' | 'around';\n\n/**\n * SkraStack — flex layout primitive that arranges its children (ADR 041).\n *\n * Component-on-native-host via the bounded allowlist below. As a child-arranger\n * it additionally accepts list hosts (`ul`/`ol`/`menu`) — their UA list styling\n * is normalized in stack.scss per the Host Normalization Contract. List markers\n * are restorable without `!important` via a direct `li {}` rule (a direct\n * declaration beats the inherited `list-style: none`).\n *\n * Stack consumes `@container`; it MUST NOT establish a container-query context\n * (ADR 016 §3.3, amended by ADR 041).\n */\n@Component({\n selector:\n 'div[skraStack], section[skraStack], article[skraStack], main[skraStack], nav[skraStack], aside[skraStack], header[skraStack], footer[skraStack], form[skraStack], figure[skraStack], ul[skraStack], ol[skraStack], menu[skraStack]',\n standalone: true,\n template: '<ng-content></ng-content>',\n styleUrl: './stack.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n // CSP-Safe State Reflection — only data-attributes, no [style.*]. The\n // layout reset (margin/box-sizing) + list/UA normalization live in\n // stack.scss `:host` (ADR 022 / ADR 041 Host Normalization Contract);\n // host-metadata bare keys would render as junk attributes, not styles.\n '[attr.data-skra-direction]': 'direction()',\n '[attr.data-skra-gap]': 'gap()',\n '[attr.data-skra-align]': 'align()',\n '[attr.data-skra-justify]': 'justify()',\n '[attr.data-skra-wrap]': 'wrap() ? \"\" : null',\n },\n})\nexport class SkraStack {\n readonly direction = input<StackDirection>('column');\n readonly gap = input<StackGap>('md');\n readonly align = input<StackAlign>('stretch');\n readonly justify = input<StackJustify>('start');\n readonly wrap = input(false, { transform: booleanAttribute });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n input,\n} from '@angular/core';\n\nexport type GridColumns =\n | '1'\n | '2'\n | '3'\n | '4'\n | '5'\n | '6'\n | 'auto-fit'\n | 'auto-fill';\nexport type GridMin = 'sm' | 'md' | 'lg';\nexport type GridGap = 'none' | 'sm' | 'md' | 'lg';\nexport type GridFlow = 'row' | 'column' | 'dense';\nexport type GridAlign = 'start' | 'center' | 'end' | 'stretch';\n\n/**\n * SkraGrid — 2D layout primitive that arranges its children in a CSS Grid\n * (ADR 041, scope O-3). The bucket-only companion to Stack (1D) and Box (spacing).\n *\n * Component-on-native-host via the bounded allowlist below. As a child-arranger\n * it additionally accepts list hosts (`ul`/`ol`/`menu`) — their UA list styling\n * is normalized in grid.scss per the Host Normalization Contract.\n *\n * Bucket-only by design: every axis is an enumerated input reflected as a\n * `data-skra-*` attribute → token. Arbitrary track lists, `grid-template-areas`,\n * named lines and per-item placement are OUT of scope (bespoke = native CSS) —\n * exposing them would force an `[style.*]` host binding (ADR 021 violation).\n *\n * Responsiveness: `columns=\"auto-fit\"` (default) + `min` produce an intrinsically\n * responsive card grid via `repeat(auto-fit, minmax(var(--min), 1fr))` — column\n * count tracks available width with NO media/container queries. Grid consumes\n * `@container`; it MUST NOT establish a container-query context (ADR 041 §3.3).\n */\n@Component({\n selector:\n 'div[skraGrid], section[skraGrid], article[skraGrid], main[skraGrid], nav[skraGrid], aside[skraGrid], header[skraGrid], footer[skraGrid], form[skraGrid], figure[skraGrid], ul[skraGrid], ol[skraGrid], menu[skraGrid]',\n standalone: true,\n template: '<ng-content></ng-content>',\n styleUrl: './grid.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n // CSP-Safe State Reflection — only data-attributes, no [style.*]. The layout\n // reset (margin/box-sizing/display:grid) + list/UA normalization live in\n // grid.scss `:host` (ADR 022 / ADR 041 Host Normalization Contract);\n // host-metadata bare keys would render as junk attributes, not styles.\n '[attr.data-skra-columns]': 'columns()',\n '[attr.data-skra-min]': 'min()',\n '[attr.data-skra-gap]': 'gap()',\n '[attr.data-skra-flow]': 'flow()',\n '[attr.data-skra-align]': 'align()',\n '[attr.data-skra-justify-items]': 'justifyItems()',\n },\n})\nexport class SkraGrid {\n readonly columns = input<GridColumns>('auto-fit');\n readonly min = input<GridMin>('md');\n readonly gap = input<GridGap>('md');\n readonly flow = input<GridFlow>('row');\n readonly align = input<GridAlign>('stretch');\n readonly justifyItems = input<GridAlign>('stretch');\n}\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-layout.mjs","sources":["../../../../libs/ui/layout/src/lib/box/box.ts","../../../../libs/ui/layout/src/lib/stack/stack.ts","../../../../libs/ui/layout/src/lib/grid/grid.ts","../../../../libs/ui/layout/src/skra-ui-layout.ts"],"sourcesContent":["import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ViewEncapsulation,\r\n input,\r\n} from '@angular/core';\r\n\r\nexport type BoxPadding = 'none' | 'sm' | 'md' | 'lg';\r\nexport type BoxDisplay = 'block' | 'inline-block' | 'flex';\r\n\r\n/**\r\n * SkraBox — semantically-neutral spacing/padding primitive (ADR 041).\r\n *\r\n * Component-on-native-host: layers onto a generic flow/sectioning container via\r\n * the bounded host allowlist below — NEVER a `<skra-box>` custom element\r\n * (ADR 012 §3.1 / ADR 041). Box does NOT arrange children, so list hosts\r\n * (`ul`/`ol`/`menu`) are intentionally excluded from its allowlist.\r\n *\r\n * Box is a pure spacing primitive: it MUST NOT establish a container-query\r\n * context (`container-type`/`container-name`) — that is an app-level concern\r\n * (ADR 016 §3.3, amended by ADR 041).\r\n */\r\n@Component({\r\n selector:\r\n 'div[skraBox], section[skraBox], article[skraBox], main[skraBox], nav[skraBox], aside[skraBox], header[skraBox], footer[skraBox], form[skraBox], figure[skraBox]',\r\n standalone: true,\r\n template: '<ng-content></ng-content>',\r\n styleUrl: './box.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n host: {\r\n // CSP-Safe State Reflection (ADR 021) — NO inline styles! The layout reset\r\n // (margin/box-sizing) + figure UA-margin normalization live in box.scss\r\n // `:host` (ADR 022 / ADR 041 Host Normalization Contract); host-metadata\r\n // bare keys would render as junk attributes, not styles.\r\n '[attr.data-skra-padding]': 'padding()',\r\n '[attr.data-skra-display]': 'display()',\r\n },\r\n})\r\nexport class SkraBox {\r\n readonly padding = input<BoxPadding>('none');\r\n readonly display = input<BoxDisplay>('block');\r\n}\r\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\nexport type StackDirection = 'row' | 'column';\r\nexport type StackGap = 'none' | 'sm' | 'md' | 'lg';\r\nexport type StackAlign = 'start' | 'center' | 'end' | 'stretch';\r\nexport type StackJustify = 'start' | 'center' | 'end' | 'between' | 'around';\r\n\r\n/**\r\n * SkraStack — flex layout primitive that arranges its children (ADR 041).\r\n *\r\n * Component-on-native-host via the bounded allowlist below. As a child-arranger\r\n * it additionally accepts list hosts (`ul`/`ol`/`menu`) — their UA list styling\r\n * is normalized in stack.scss per the Host Normalization Contract. List markers\r\n * are restorable without `!important` via a direct `li {}` rule (a direct\r\n * declaration beats the inherited `list-style: none`).\r\n *\r\n * Stack consumes `@container`; it MUST NOT establish a container-query context\r\n * (ADR 016 §3.3, amended by ADR 041).\r\n */\r\n@Component({\r\n selector:\r\n 'div[skraStack], section[skraStack], article[skraStack], main[skraStack], nav[skraStack], aside[skraStack], header[skraStack], footer[skraStack], form[skraStack], figure[skraStack], ul[skraStack], ol[skraStack], menu[skraStack]',\r\n standalone: true,\r\n template: '<ng-content></ng-content>',\r\n styleUrl: './stack.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n host: {\r\n // CSP-Safe State Reflection — only data-attributes, no [style.*]. The\r\n // layout reset (margin/box-sizing) + list/UA normalization live in\r\n // stack.scss `:host` (ADR 022 / ADR 041 Host Normalization Contract);\r\n // host-metadata bare keys would render as junk attributes, not styles.\r\n '[attr.data-skra-direction]': 'direction()',\r\n '[attr.data-skra-gap]': 'gap()',\r\n '[attr.data-skra-align]': 'align()',\r\n '[attr.data-skra-justify]': 'justify()',\r\n '[attr.data-skra-wrap]': 'wrap() ? \"\" : null',\r\n },\r\n})\r\nexport class SkraStack {\r\n readonly direction = input<StackDirection>('column');\r\n readonly gap = input<StackGap>('md');\r\n readonly align = input<StackAlign>('stretch');\r\n readonly justify = input<StackJustify>('start');\r\n readonly wrap = input(false, { transform: booleanAttribute });\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ViewEncapsulation,\r\n input,\r\n} from '@angular/core';\r\n\r\nexport type GridColumns =\r\n | '1'\r\n | '2'\r\n | '3'\r\n | '4'\r\n | '5'\r\n | '6'\r\n | 'auto-fit'\r\n | 'auto-fill';\r\nexport type GridMin = 'sm' | 'md' | 'lg';\r\nexport type GridGap = 'none' | 'sm' | 'md' | 'lg';\r\nexport type GridFlow = 'row' | 'column' | 'dense';\r\nexport type GridAlign = 'start' | 'center' | 'end' | 'stretch';\r\n\r\n/**\r\n * SkraGrid — 2D layout primitive that arranges its children in a CSS Grid\r\n * (ADR 041, scope O-3). The bucket-only companion to Stack (1D) and Box (spacing).\r\n *\r\n * Component-on-native-host via the bounded allowlist below. As a child-arranger\r\n * it additionally accepts list hosts (`ul`/`ol`/`menu`) — their UA list styling\r\n * is normalized in grid.scss per the Host Normalization Contract.\r\n *\r\n * Bucket-only by design: every axis is an enumerated input reflected as a\r\n * `data-skra-*` attribute → token. Arbitrary track lists, `grid-template-areas`,\r\n * named lines and per-item placement are OUT of scope (bespoke = native CSS) —\r\n * exposing them would force an `[style.*]` host binding (ADR 021 violation).\r\n *\r\n * Responsiveness: `columns=\"auto-fit\"` (default) + `min` produce an intrinsically\r\n * responsive card grid via `repeat(auto-fit, minmax(var(--min), 1fr))` — column\r\n * count tracks available width with NO media/container queries. Grid consumes\r\n * `@container`; it MUST NOT establish a container-query context (ADR 041 §3.3).\r\n */\r\n@Component({\r\n selector:\r\n 'div[skraGrid], section[skraGrid], article[skraGrid], main[skraGrid], nav[skraGrid], aside[skraGrid], header[skraGrid], footer[skraGrid], form[skraGrid], figure[skraGrid], ul[skraGrid], ol[skraGrid], menu[skraGrid]',\r\n standalone: true,\r\n template: '<ng-content></ng-content>',\r\n styleUrl: './grid.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n host: {\r\n // CSP-Safe State Reflection — only data-attributes, no [style.*]. The layout\r\n // reset (margin/box-sizing/display:grid) + list/UA normalization live in\r\n // grid.scss `:host` (ADR 022 / ADR 041 Host Normalization Contract);\r\n // host-metadata bare keys would render as junk attributes, not styles.\r\n '[attr.data-skra-columns]': 'columns()',\r\n '[attr.data-skra-min]': 'min()',\r\n '[attr.data-skra-gap]': 'gap()',\r\n '[attr.data-skra-flow]': 'flow()',\r\n '[attr.data-skra-align]': 'align()',\r\n '[attr.data-skra-justify-items]': 'justifyItems()',\r\n },\r\n})\r\nexport class SkraGrid {\r\n readonly columns = input<GridColumns>('auto-fit');\r\n readonly min = input<GridMin>('md');\r\n readonly gap = input<GridGap>('md');\r\n readonly flow = input<GridFlow>('row');\r\n readonly align = input<GridAlign>('stretch');\r\n readonly justifyItems = input<GridAlign>('stretch');\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -13,10 +13,10 @@ import { ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/
13
13
  * the component exposes no `ariaLabel` input.
14
14
  */
15
15
  class SkraLink {
16
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: SkraLink, deps: [], target: i0.ɵɵFactoryTarget.Component });
17
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.7", type: SkraLink, isStandalone: true, selector: "a[skraLink]", ngImport: i0, template: "<ng-content></ng-content>\n", styles: [":host{margin:0;color:var(--skra-comp-link-foreground);text-decoration-line:var(--skra-comp-link-text-decoration-line);text-decoration-thickness:var(--skra-comp-link-text-decoration-thickness);text-underline-offset:var(--skra-comp-link-text-underline-offset);transition:color var(--skra-comp-link-motion-duration) var(--skra-comp-link-motion-easing)}:host:visited{color:var(--skra-comp-link-foreground-visited)}:host:hover{color:var(--skra-comp-link-foreground-hover)}:host:active{color:var(--skra-comp-link-foreground-active)}:host:focus-visible{outline-style:solid;outline-color:var(--skra-comp-link-focus-ring-color);outline-width:var(--skra-comp-link-focus-ring-width);outline-offset:2px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
16
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraLink, deps: [], target: i0.ɵɵFactoryTarget.Component });
17
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.1", type: SkraLink, isStandalone: true, selector: "a[skraLink]", ngImport: i0, template: "<ng-content></ng-content>\n", styles: [":host{margin:0;color:var(--skra-comp-link-foreground);text-decoration-line:var(--skra-comp-link-text-decoration-line);text-decoration-thickness:var(--skra-comp-link-text-decoration-thickness);text-underline-offset:var(--skra-comp-link-text-underline-offset);transition:color var(--skra-comp-link-motion-duration) var(--skra-comp-link-motion-easing)}:host:visited{color:var(--skra-comp-link-foreground-visited)}:host:hover{color:var(--skra-comp-link-foreground-hover)}:host:active{color:var(--skra-comp-link-foreground-active)}:host:focus-visible{outline-style:solid;outline-color:var(--skra-comp-link-focus-ring-color);outline-width:var(--skra-comp-link-focus-ring-width);outline-offset:2px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
18
18
  }
19
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: SkraLink, decorators: [{
19
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraLink, decorators: [{
20
20
  type: Component,
21
21
  args: [{ selector: 'a[skraLink]', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, template: "<ng-content></ng-content>\n", styles: [":host{margin:0;color:var(--skra-comp-link-foreground);text-decoration-line:var(--skra-comp-link-text-decoration-line);text-decoration-thickness:var(--skra-comp-link-text-decoration-thickness);text-underline-offset:var(--skra-comp-link-text-underline-offset);transition:color var(--skra-comp-link-motion-duration) var(--skra-comp-link-motion-easing)}:host:visited{color:var(--skra-comp-link-foreground-visited)}:host:hover{color:var(--skra-comp-link-foreground-hover)}:host:active{color:var(--skra-comp-link-foreground-active)}:host:focus-visible{outline-style:solid;outline-color:var(--skra-comp-link-focus-ring-color);outline-width:var(--skra-comp-link-focus-ring-width);outline-offset:2px}\n"] }]
22
22
  }] });
@@ -1 +1 @@
1
- {"version":3,"file":"skra-ui-link.mjs","sources":["../../../../libs/ui/link/src/lib/link/link.ts","../../../../libs/ui/link/src/lib/link/link.html","../../../../libs/ui/link/src/skra-ui-link.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n} from '@angular/core';\n\n/**\n * SkraLink — text-style anchor primitive (ADR 032 §3.6).\n *\n * Selector: `a[skraLink]` — `<a>` is the sole host.\n *\n * Per ADR 032 §3.6.3 there is no `disabled` input and no `data-skra-*`\n * Availability reflection: a link the user cannot or should not follow should\n * not be a link in the first place. Severity is deferred beyond MVP (§3.6.4).\n * Accessible Name follows ADR 033 Path 1 — visible text is the accessible name;\n * the component exposes no `ariaLabel` input.\n */\n@Component({\n selector: 'a[skraLink]',\n standalone: true,\n templateUrl: './link.html',\n styleUrl: './link.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n})\nexport class SkraLink {}\n","<ng-content></ng-content>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAMA;;;;;;;;;;AAUG;MASU,QAAQ,CAAA;uGAAR,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,uECzBrB,6BACA,EAAA,MAAA,EAAA,CAAA,urBAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FDwBa,QAAQ,EAAA,UAAA,EAAA,CAAA;kBARpB,SAAS;+BACE,aAAa,EAAA,UAAA,EACX,IAAI,EAAA,eAAA,EAGC,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,QAAQ,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,urBAAA,CAAA,EAAA;;;AEvB3C;;AAEG;;;;"}
1
+ {"version":3,"file":"skra-ui-link.mjs","sources":["../../../../libs/ui/link/src/lib/link/link.ts","../../../../libs/ui/link/src/lib/link/link.html","../../../../libs/ui/link/src/skra-ui-link.ts"],"sourcesContent":["import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\n\r\n/**\r\n * SkraLink — text-style anchor primitive (ADR 032 §3.6).\r\n *\r\n * Selector: `a[skraLink]` — `<a>` is the sole host.\r\n *\r\n * Per ADR 032 §3.6.3 there is no `disabled` input and no `data-skra-*`\r\n * Availability reflection: a link the user cannot or should not follow should\r\n * not be a link in the first place. Severity is deferred beyond MVP (§3.6.4).\r\n * Accessible Name follows ADR 033 Path 1 — visible text is the accessible name;\r\n * the component exposes no `ariaLabel` input.\r\n */\r\n@Component({\r\n selector: 'a[skraLink]',\r\n standalone: true,\r\n templateUrl: './link.html',\r\n styleUrl: './link.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n})\r\nexport class SkraLink {}\r\n","<ng-content></ng-content>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAMA;;;;;;;;;;AAUG;MASU,QAAQ,CAAA;uGAAR,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,uECzBrB,6BACA,EAAA,MAAA,EAAA,CAAA,urBAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FDwBa,QAAQ,EAAA,UAAA,EAAA,CAAA;kBARpB,SAAS;+BACE,aAAa,EAAA,UAAA,EACX,IAAI,EAAA,eAAA,EAGC,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,QAAQ,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,urBAAA,CAAA,EAAA;;;AEvB3C;;AAEG;;;;"}
@@ -2,10 +2,10 @@ import * as i0 from '@angular/core';
2
2
  import { Directive } from '@angular/core';
3
3
 
4
4
  class SkraLoadingIndicator {
5
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: SkraLoadingIndicator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.7", type: SkraLoadingIndicator, isStandalone: true, selector: "[skraLoadingIndicator]", host: { attributes: { "aria-hidden": "true" } }, ngImport: i0 });
5
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraLoadingIndicator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.1", type: SkraLoadingIndicator, isStandalone: true, selector: "[skraLoadingIndicator]", host: { attributes: { "aria-hidden": "true" } }, ngImport: i0 });
7
7
  }
8
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: SkraLoadingIndicator, decorators: [{
8
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraLoadingIndicator, decorators: [{
9
9
  type: Directive,
10
10
  args: [{
11
11
  selector: '[skraLoadingIndicator]',
@@ -1 +1 @@
1
- {"version":3,"file":"skra-ui-loading-indicator.mjs","sources":["../../../../libs/ui/loading-indicator/src/lib/loading-indicator.directive.ts","../../../../libs/ui/loading-indicator/src/skra-ui-loading-indicator.ts"],"sourcesContent":["import { Directive } from '@angular/core';\n\n@Directive({\n selector: '[skraLoadingIndicator]',\n standalone: true,\n host: {\n 'aria-hidden': 'true',\n },\n})\nexport class SkraLoadingIndicator {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;MASa,oBAAoB,CAAA;uGAApB,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAPhC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,wBAAwB;AAClC,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,IAAI,EAAE;AACJ,wBAAA,aAAa,EAAE,MAAM;AACtB,qBAAA;AACF,iBAAA;;;ACRD;;AAEG;;;;"}
1
+ {"version":3,"file":"skra-ui-loading-indicator.mjs","sources":["../../../../libs/ui/loading-indicator/src/lib/loading-indicator.directive.ts","../../../../libs/ui/loading-indicator/src/skra-ui-loading-indicator.ts"],"sourcesContent":["import { Directive } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[skraLoadingIndicator]',\r\n standalone: true,\r\n host: {\r\n 'aria-hidden': 'true',\r\n },\r\n})\r\nexport class SkraLoadingIndicator {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;MASa,oBAAoB,CAAA;uGAApB,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAPhC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,wBAAwB;AAClC,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,IAAI,EAAE;AACJ,wBAAA,aAAa,EAAE,MAAM;AACtB,qBAAA;AACF,iBAAA;;;ACRD;;AAEG;;;;"}