@skra/ui 0.4.0 → 0.6.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 (72) hide show
  1. package/consumer-guide/README.md +88 -85
  2. package/consumer-guide/custom-components.md +154 -0
  3. package/consumer-guide/wrapping-patterns.md +98 -90
  4. package/fesm2022/skra-ui-accordion.mjs +2 -2
  5. package/fesm2022/skra-ui-accordion.mjs.map +1 -1
  6. package/fesm2022/skra-ui-alert.mjs +2 -2
  7. package/fesm2022/skra-ui-alert.mjs.map +1 -1
  8. package/fesm2022/skra-ui-avatar.mjs.map +1 -1
  9. package/fesm2022/skra-ui-badge.mjs.map +1 -1
  10. package/fesm2022/skra-ui-button.mjs +2 -2
  11. package/fesm2022/skra-ui-button.mjs.map +1 -1
  12. package/fesm2022/skra-ui-checkbox.mjs +2 -2
  13. package/fesm2022/skra-ui-checkbox.mjs.map +1 -1
  14. package/fesm2022/skra-ui-chip.mjs +2 -2
  15. package/fesm2022/skra-ui-chip.mjs.map +1 -1
  16. package/fesm2022/skra-ui-combobox.mjs +120 -120
  17. package/fesm2022/skra-ui-combobox.mjs.map +1 -1
  18. package/fesm2022/skra-ui-core.mjs +64 -39
  19. package/fesm2022/skra-ui-core.mjs.map +1 -1
  20. package/fesm2022/skra-ui-counter.mjs.map +1 -1
  21. package/fesm2022/skra-ui-datepicker.mjs +605 -190
  22. package/fesm2022/skra-ui-datepicker.mjs.map +1 -1
  23. package/fesm2022/skra-ui-dialog.mjs.map +1 -1
  24. package/fesm2022/skra-ui-field.mjs.map +1 -1
  25. package/fesm2022/skra-ui-icon.mjs.map +1 -1
  26. package/fesm2022/skra-ui-input.mjs +2 -2
  27. package/fesm2022/skra-ui-input.mjs.map +1 -1
  28. package/fesm2022/skra-ui-kbd.mjs.map +1 -1
  29. package/fesm2022/skra-ui-layout.mjs.map +1 -1
  30. package/fesm2022/skra-ui-link.mjs +2 -2
  31. package/fesm2022/skra-ui-link.mjs.map +1 -1
  32. package/fesm2022/skra-ui-loading-indicator.mjs.map +1 -1
  33. package/fesm2022/skra-ui-menu.mjs +40 -16
  34. package/fesm2022/skra-ui-menu.mjs.map +1 -1
  35. package/fesm2022/skra-ui-multi-select.mjs +94 -94
  36. package/fesm2022/skra-ui-multi-select.mjs.map +1 -1
  37. package/fesm2022/skra-ui-native-select.mjs +2 -2
  38. package/fesm2022/skra-ui-native-select.mjs.map +1 -1
  39. package/fesm2022/skra-ui-popover.mjs +25 -9
  40. package/fesm2022/skra-ui-popover.mjs.map +1 -1
  41. package/fesm2022/skra-ui-progress.mjs.map +1 -1
  42. package/fesm2022/skra-ui-radio.mjs +2 -2
  43. package/fesm2022/skra-ui-radio.mjs.map +1 -1
  44. package/fesm2022/skra-ui-rating-display.mjs +2 -2
  45. package/fesm2022/skra-ui-rating-display.mjs.map +1 -1
  46. package/fesm2022/skra-ui-select.mjs +92 -92
  47. package/fesm2022/skra-ui-select.mjs.map +1 -1
  48. package/fesm2022/skra-ui-skeleton.mjs +8 -8
  49. package/fesm2022/skra-ui-skeleton.mjs.map +1 -1
  50. package/fesm2022/skra-ui-star-rating.mjs +2 -2
  51. package/fesm2022/skra-ui-star-rating.mjs.map +1 -1
  52. package/fesm2022/skra-ui-status-dot.mjs.map +1 -1
  53. package/fesm2022/skra-ui-switch.mjs +2 -2
  54. package/fesm2022/skra-ui-switch.mjs.map +1 -1
  55. package/fesm2022/skra-ui-tabs.mjs +2 -2
  56. package/fesm2022/skra-ui-tabs.mjs.map +1 -1
  57. package/fesm2022/skra-ui-textarea.mjs +2 -2
  58. package/fesm2022/skra-ui-textarea.mjs.map +1 -1
  59. package/fesm2022/skra-ui-toast.mjs +2 -2
  60. package/fesm2022/skra-ui-toast.mjs.map +1 -1
  61. package/fesm2022/skra-ui-tooltip.mjs +7 -2
  62. package/fesm2022/skra-ui-tooltip.mjs.map +1 -1
  63. package/fesm2022/skra-ui-typography.mjs.map +1 -1
  64. package/package.json +3 -3
  65. package/types/skra-ui-core.d.ts.map +1 -1
  66. package/types/skra-ui-datepicker.d.ts +146 -46
  67. package/types/skra-ui-datepicker.d.ts.map +1 -1
  68. package/types/skra-ui-menu.d.ts +18 -6
  69. package/types/skra-ui-menu.d.ts.map +1 -1
  70. package/types/skra-ui-popover.d.ts +13 -4
  71. package/types/skra-ui-popover.d.ts.map +1 -1
  72. package/types/skra-ui-tooltip.d.ts.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"skra-ui-button.mjs","sources":["../../../../libs/ui/button/src/lib/button.directives.ts","../../../../libs/ui/button/src/lib/button/button.ts","../../../../libs/ui/button/src/lib/button/button.html","../../../../libs/ui/button/src/skra-ui-button.ts"],"sourcesContent":["import { Directive } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[skra-start]',\r\n standalone: true,\r\n})\r\nexport class SkraButtonStart {}\r\n\r\n@Directive({\r\n selector: '[skra-end]',\r\n standalone: true,\r\n})\r\nexport class SkraButtonEnd {}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ViewEncapsulation,\r\n booleanAttribute,\r\n input,\r\n computed,\r\n contentChild,\r\n} from '@angular/core';\r\nimport { SkraButtonStart, SkraButtonEnd } from '../button.directives';\r\nimport { SkraLoadingIndicator } from '@skra/ui/loading-indicator';\r\n\r\n/**\r\n * ButtonIntent — semantic role of the action (ADR 035 §3.1).\r\n * Closed enum; extension requires amendment to ADR 035.\r\n */\r\nexport type ButtonIntent =\r\n | 'neutral'\r\n | 'primary'\r\n | 'secondary'\r\n | 'info'\r\n | 'success'\r\n | 'warning'\r\n | 'danger';\r\n\r\n/**\r\n * ButtonEmphasis — visual loudness within the chosen intent (ADR 035 §3.1).\r\n * Skin maps each level to its own treatment (filled / outlined / ghost / other).\r\n */\r\nexport type ButtonEmphasis = 'high' | 'medium' | 'low';\r\n\r\n/**\r\n * ButtonSize — per-instance scale relative to typography and spacing (ADR 035 §3.1).\r\n * Distinct from Density (ADR 016 §3.5), which is subtree-runtime.\r\n */\r\nexport type ButtonSize = 'sm' | 'md' | 'lg';\r\n\r\n@Component({\r\n selector: 'button[skraButton]',\r\n standalone: true,\r\n templateUrl: './button.html',\r\n styleUrl: './button.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n host: {\r\n // Variant Surface reflection (ADR 035 §3.5)\r\n '[attr.data-skra-intent]': 'intent()',\r\n '[attr.data-skra-emphasis]': 'emphasis()',\r\n '[attr.data-skra-size]': 'size()',\r\n\r\n // State Surface reflection — Transient category (ADR 027 §3.1 cat 4)\r\n '[attr.data-skra-loading]': 'loading() ? \"\" : null',\r\n '[attr.aria-busy]': 'loading() ? \"true\" : null',\r\n\r\n // Smart Slots layout reflection (ADR 020 v2.0 §3.2 — slot-presence, exempt from State Surface per ADR 027 §3.6)\r\n '[attr.data-skra-has-start]': 'hasStart() ? \"\" : null',\r\n '[attr.data-skra-has-end]': 'hasEnd() ? \"\" : null',\r\n },\r\n})\r\nexport class SkraButton {\r\n // --- Variant Surface (ADR 035) ---\r\n readonly intent = input<ButtonIntent>('neutral');\r\n readonly emphasis = input<ButtonEmphasis>('high');\r\n readonly size = input<ButtonSize>('md');\r\n\r\n // --- State Surface — Transient (ADR 027 cat 4 + ADR 028) ---\r\n readonly loading = input(false, { transform: booleanAttribute });\r\n\r\n // --- Smart Slots v2.0 (ADR 020) ---\r\n readonly startSlot = contentChild(SkraButtonStart);\r\n readonly endSlot = contentChild(SkraButtonEnd);\r\n\r\n readonly hasStart = computed(() => !!this.startSlot());\r\n readonly hasEnd = computed(() => !!this.endSlot());\r\n\r\n // --- Loading Indicator Slot (ADR 028) ---\r\n readonly loadingIndicatorSlot = contentChild(SkraLoadingIndicator);\r\n readonly hasLoadingIndicator = computed(() => !!this.loadingIndicatorSlot());\r\n}\r\n","@if (hasStart()) {\r\n<span class=\"skra-button-slot-wrapper\">\r\n <ng-content select=\"[skra-start]\"></ng-content>\r\n</span>\r\n}\r\n\r\n<span class=\"skra-button-label-wrapper\">\r\n <ng-content></ng-content>\r\n</span>\r\n\r\n@if (hasEnd()) {\r\n<span class=\"skra-button-slot-wrapper\">\r\n <ng-content select=\"[skra-end]\"></ng-content>\r\n</span>\r\n} @if (loading()) {\r\n<span class=\"skra-button-loading-indicator\" data-skra-loading-indicator>\r\n @if (hasLoadingIndicator()) {\r\n <ng-content select=\"[skraLoadingIndicator]\"></ng-content>\r\n } @else {\r\n <span data-skra-loading-indicator-fallback aria-hidden=\"true\"></span>\r\n }\r\n</span>\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skra-ui-button.mjs","sources":["../../../../libs/ui/button/src/lib/button.directives.ts","../../../../libs/ui/button/src/lib/button/button.ts","../../../../libs/ui/button/src/lib/button/button.html","../../../../libs/ui/button/src/skra-ui-button.ts"],"sourcesContent":["import { Directive } from '@angular/core';\n\n@Directive({\n selector: '[skra-start]',\n standalone: true,\n})\nexport class SkraButtonStart {}\n\n@Directive({\n selector: '[skra-end]',\n standalone: true,\n})\nexport class SkraButtonEnd {}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n input,\n computed,\n contentChild,\n} from '@angular/core';\nimport { SkraButtonStart, SkraButtonEnd } from '../button.directives';\nimport { SkraLoadingIndicator } from '@skra/ui/loading-indicator';\n\n/**\n * ButtonIntent — semantic role of the action (ADR 035 §3.1).\n * Closed enum; extension requires amendment to ADR 035.\n */\nexport type ButtonIntent =\n | 'neutral'\n | 'primary'\n | 'secondary'\n | 'info'\n | 'success'\n | 'warning'\n | 'danger';\n\n/**\n * ButtonEmphasis — visual loudness within the chosen intent (ADR 035 §3.1).\n * Skin maps each level to its own treatment (filled / outlined / ghost / other).\n */\nexport type ButtonEmphasis = 'high' | 'medium' | 'low';\n\n/**\n * ButtonSize — per-instance scale relative to typography and spacing (ADR 035 §3.1).\n * Distinct from Density (ADR 016 §3.5), which is subtree-runtime.\n */\nexport type ButtonSize = 'sm' | 'md' | 'lg';\n\n@Component({\n selector: 'button[skraButton]',\n standalone: true,\n templateUrl: './button.html',\n styleUrl: './button.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n // Variant Surface reflection (ADR 035 §3.5)\n '[attr.data-skra-intent]': 'intent()',\n '[attr.data-skra-emphasis]': 'emphasis()',\n '[attr.data-skra-size]': 'size()',\n\n // State Surface reflection — Transient category (ADR 027 §3.1 cat 4)\n '[attr.data-skra-loading]': 'loading() ? \"\" : null',\n '[attr.aria-busy]': 'loading() ? \"true\" : null',\n\n // Smart Slots layout reflection (ADR 020 v2.0 §3.2 — slot-presence, exempt from State Surface per ADR 027 §3.6)\n '[attr.data-skra-has-start]': 'hasStart() ? \"\" : null',\n '[attr.data-skra-has-end]': 'hasEnd() ? \"\" : null',\n },\n})\nexport class SkraButton {\n // --- Variant Surface (ADR 035) ---\n readonly intent = input<ButtonIntent>('neutral');\n readonly emphasis = input<ButtonEmphasis>('high');\n readonly size = input<ButtonSize>('md');\n\n // --- State Surface — Transient (ADR 027 cat 4 + ADR 028) ---\n readonly loading = input(false, { transform: booleanAttribute });\n\n // --- Smart Slots v2.0 (ADR 020) ---\n readonly startSlot = contentChild(SkraButtonStart);\n readonly endSlot = contentChild(SkraButtonEnd);\n\n readonly hasStart = computed(() => !!this.startSlot());\n readonly hasEnd = computed(() => !!this.endSlot());\n\n // --- Loading Indicator Slot (ADR 028) ---\n readonly loadingIndicatorSlot = contentChild(SkraLoadingIndicator);\n readonly hasLoadingIndicator = computed(() => !!this.loadingIndicatorSlot());\n}\n","@if (hasStart()) {\r\n<span class=\"skra-button-slot-wrapper\">\r\n <ng-content select=\"[skra-start]\"></ng-content>\r\n</span>\r\n}\r\n\r\n<span class=\"skra-button-label-wrapper\">\r\n <ng-content></ng-content>\r\n</span>\r\n\r\n@if (hasEnd()) {\r\n<span class=\"skra-button-slot-wrapper\">\r\n <ng-content select=\"[skra-end]\"></ng-content>\r\n</span>\r\n} @if (loading()) {\r\n<span class=\"skra-button-loading-indicator\" data-skra-loading-indicator>\r\n @if (hasLoadingIndicator()) {\r\n <ng-content select=\"[skraLoadingIndicator]\"></ng-content>\r\n } @else {\r\n <span data-skra-loading-indicator-fallback aria-hidden=\"true\"></span>\r\n }\r\n</span>\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -72,7 +72,7 @@ class SkraCheckbox {
72
72
  }
73
73
  }
74
74
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraCheckbox, deps: [], target: i0.ɵɵFactoryTarget.Component });
75
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.1", type: SkraCheckbox, isStandalone: true, selector: "input[type=\"checkbox\"][skraCheckbox]", inputs: { indeterminate: { classPropertyName: "indeterminate", publicName: "indeterminate", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "blockWhenReadonly($event)", "keydown": "blockKeyWhenReadonly($event)" }, properties: { "attr.data-skra-disabled": "context?.isDisabled() ? \"\" : null", "attr.aria-invalid": "context?.hasError() ? \"true\" : null", "attr.aria-readonly": "context?.isReadonly() ? \"true\" : null", "attr.aria-describedby": "context?.describedByIds() ?? null" } }, ngImport: i0, template: '', isInline: true, styles: [":host{appearance:none;flex-shrink:0;cursor:pointer;outline:none;background-repeat:no-repeat;background-position:center;inline-size:var(--skra-comp-field-checkbox-size);block-size:var(--skra-comp-field-checkbox-size);border-width:var(--skra-comp-field-checkbox-border-width);border-style:solid;border-color:var(--skra-comp-field-checkbox-border-color);border-radius:var(--skra-comp-field-checkbox-border-radius);background-color:var(--skra-comp-field-checkbox-background);background-size:70% 70%;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),box-shadow var(--skra-comp-field-motion-duration) var(--skra-comp-field-motion-easing)}:host(:checked){background-color:var(--skra-comp-field-checkbox-checked-background);border-color:var(--skra-comp-field-checkbox-checked-background);background-image:var(--skra-comp-field-checkbox-check-glyph)}:host(:indeterminate){background-color:var(--skra-comp-field-checkbox-checked-background);border-color:var(--skra-comp-field-checkbox-checked-background);background-image:linear-gradient(to bottom,transparent 42%,var(--skra-comp-field-checkbox-check-color) 42%,var(--skra-comp-field-checkbox-check-color) 58%,transparent 58%)}:host(:hover:not(:disabled):not([aria-readonly=true])){border-color:var(--skra-comp-field-checkbox-border-color-hover)}:host(:checked:hover:not(:disabled):not([aria-readonly=true])),:host(:indeterminate:hover:not(:disabled):not([aria-readonly=true])){background-color:var(--skra-comp-field-checkbox-checked-background-hover);border-color:var(--skra-comp-field-checkbox-checked-background-hover)}:host(:focus-visible){box-shadow:0 0 0 var(--skra-comp-field-focus-ring-width) var(--skra-comp-field-focus-ring-color)}:host(:disabled),:host([data-skra-disabled]){cursor:not-allowed;opacity:var(--skra-sys-opacity-disabled)}:host([aria-readonly=true]){cursor:default;background-color:var(--skra-comp-field-background-readonly);border-color:var(--skra-comp-field-border-color-readonly)}:host(:checked[aria-readonly=true]),:host(:indeterminate[aria-readonly=true]){background-color:var(--skra-comp-field-checkbox-checked-background-readonly);border-color:var(--skra-comp-field-checkbox-checked-background-readonly)}: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 });
75
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.1", type: SkraCheckbox, isStandalone: true, selector: "input[type=\"checkbox\"][skraCheckbox]", inputs: { indeterminate: { classPropertyName: "indeterminate", publicName: "indeterminate", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "blockWhenReadonly($event)", "keydown": "blockKeyWhenReadonly($event)" }, properties: { "attr.data-skra-disabled": "context?.isDisabled() ? \"\" : null", "attr.aria-invalid": "context?.hasError() ? \"true\" : null", "attr.aria-readonly": "context?.isReadonly() ? \"true\" : null", "attr.aria-describedby": "context?.describedByIds() ?? null" } }, ngImport: i0, template: '', isInline: true, styles: [":host{appearance:none;flex-shrink:0;cursor:pointer;outline:none;background-repeat:no-repeat;background-position:center;inline-size:var(--skra-comp-field-checkbox-size);block-size:var(--skra-comp-field-checkbox-size);border-width:var(--skra-comp-field-checkbox-border-width);border-style:solid;border-color:var(--skra-comp-field-checkbox-border-color);border-radius:var(--skra-comp-field-checkbox-border-radius);background-color:var(--skra-comp-field-checkbox-background);background-size:70% 70%;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),box-shadow var(--skra-comp-field-motion-duration) var(--skra-comp-field-motion-easing)}:host(:checked){background-color:var(--skra-comp-field-checkbox-checked-background);border-color:var(--skra-comp-field-checkbox-checked-background);background-image:var(--skra-comp-field-checkbox-check-glyph)}:host(:indeterminate){background-color:var(--skra-comp-field-checkbox-checked-background);border-color:var(--skra-comp-field-checkbox-checked-background);background-image:linear-gradient(to bottom,transparent 42%,var(--skra-comp-field-checkbox-check-color) 42%,var(--skra-comp-field-checkbox-check-color) 58%,transparent 58%)}@media(hover:hover)and (pointer:fine){:host(:hover:not(:disabled):not([aria-readonly=true])){border-color:var(--skra-comp-field-checkbox-border-color-hover)}:host(:checked:hover:not(:disabled):not([aria-readonly=true])),:host(:indeterminate:hover:not(:disabled):not([aria-readonly=true])){background-color:var(--skra-comp-field-checkbox-checked-background-hover);border-color:var(--skra-comp-field-checkbox-checked-background-hover)}}:host(:focus-visible){box-shadow:0 0 0 var(--skra-comp-field-focus-ring-width) var(--skra-comp-field-focus-ring-color)}:host(:disabled),:host([data-skra-disabled]){cursor:not-allowed;opacity:var(--skra-sys-opacity-disabled)}:host([aria-readonly=true]){cursor:default;background-color:var(--skra-comp-field-background-readonly);border-color:var(--skra-comp-field-border-color-readonly)}:host(:checked[aria-readonly=true]),:host(:indeterminate[aria-readonly=true]){background-color:var(--skra-comp-field-checkbox-checked-background-readonly);border-color:var(--skra-comp-field-checkbox-checked-background-readonly);--skra-comp-field-checkbox-check-color: var( --skra-comp-field-checkbox-check-color-readonly )}:host(:checked[aria-readonly=true]){background-image:var(--skra-comp-field-checkbox-check-glyph-readonly)}: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 });
76
76
  }
77
77
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraCheckbox, decorators: [{
78
78
  type: Component,
@@ -87,7 +87,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImpor
87
87
  '[attr.aria-describedby]': 'context?.describedByIds() ?? null',
88
88
  '(click)': 'blockWhenReadonly($event)',
89
89
  '(keydown)': 'blockKeyWhenReadonly($event)',
90
- }, styles: [":host{appearance:none;flex-shrink:0;cursor:pointer;outline:none;background-repeat:no-repeat;background-position:center;inline-size:var(--skra-comp-field-checkbox-size);block-size:var(--skra-comp-field-checkbox-size);border-width:var(--skra-comp-field-checkbox-border-width);border-style:solid;border-color:var(--skra-comp-field-checkbox-border-color);border-radius:var(--skra-comp-field-checkbox-border-radius);background-color:var(--skra-comp-field-checkbox-background);background-size:70% 70%;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),box-shadow var(--skra-comp-field-motion-duration) var(--skra-comp-field-motion-easing)}:host(:checked){background-color:var(--skra-comp-field-checkbox-checked-background);border-color:var(--skra-comp-field-checkbox-checked-background);background-image:var(--skra-comp-field-checkbox-check-glyph)}:host(:indeterminate){background-color:var(--skra-comp-field-checkbox-checked-background);border-color:var(--skra-comp-field-checkbox-checked-background);background-image:linear-gradient(to bottom,transparent 42%,var(--skra-comp-field-checkbox-check-color) 42%,var(--skra-comp-field-checkbox-check-color) 58%,transparent 58%)}:host(:hover:not(:disabled):not([aria-readonly=true])){border-color:var(--skra-comp-field-checkbox-border-color-hover)}:host(:checked:hover:not(:disabled):not([aria-readonly=true])),:host(:indeterminate:hover:not(:disabled):not([aria-readonly=true])){background-color:var(--skra-comp-field-checkbox-checked-background-hover);border-color:var(--skra-comp-field-checkbox-checked-background-hover)}:host(:focus-visible){box-shadow:0 0 0 var(--skra-comp-field-focus-ring-width) var(--skra-comp-field-focus-ring-color)}:host(:disabled),:host([data-skra-disabled]){cursor:not-allowed;opacity:var(--skra-sys-opacity-disabled)}:host([aria-readonly=true]){cursor:default;background-color:var(--skra-comp-field-background-readonly);border-color:var(--skra-comp-field-border-color-readonly)}:host(:checked[aria-readonly=true]),:host(:indeterminate[aria-readonly=true]){background-color:var(--skra-comp-field-checkbox-checked-background-readonly);border-color:var(--skra-comp-field-checkbox-checked-background-readonly)}: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"] }]
90
+ }, styles: [":host{appearance:none;flex-shrink:0;cursor:pointer;outline:none;background-repeat:no-repeat;background-position:center;inline-size:var(--skra-comp-field-checkbox-size);block-size:var(--skra-comp-field-checkbox-size);border-width:var(--skra-comp-field-checkbox-border-width);border-style:solid;border-color:var(--skra-comp-field-checkbox-border-color);border-radius:var(--skra-comp-field-checkbox-border-radius);background-color:var(--skra-comp-field-checkbox-background);background-size:70% 70%;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),box-shadow var(--skra-comp-field-motion-duration) var(--skra-comp-field-motion-easing)}:host(:checked){background-color:var(--skra-comp-field-checkbox-checked-background);border-color:var(--skra-comp-field-checkbox-checked-background);background-image:var(--skra-comp-field-checkbox-check-glyph)}:host(:indeterminate){background-color:var(--skra-comp-field-checkbox-checked-background);border-color:var(--skra-comp-field-checkbox-checked-background);background-image:linear-gradient(to bottom,transparent 42%,var(--skra-comp-field-checkbox-check-color) 42%,var(--skra-comp-field-checkbox-check-color) 58%,transparent 58%)}@media(hover:hover)and (pointer:fine){:host(:hover:not(:disabled):not([aria-readonly=true])){border-color:var(--skra-comp-field-checkbox-border-color-hover)}:host(:checked:hover:not(:disabled):not([aria-readonly=true])),:host(:indeterminate:hover:not(:disabled):not([aria-readonly=true])){background-color:var(--skra-comp-field-checkbox-checked-background-hover);border-color:var(--skra-comp-field-checkbox-checked-background-hover)}}:host(:focus-visible){box-shadow:0 0 0 var(--skra-comp-field-focus-ring-width) var(--skra-comp-field-focus-ring-color)}:host(:disabled),:host([data-skra-disabled]){cursor:not-allowed;opacity:var(--skra-sys-opacity-disabled)}:host([aria-readonly=true]){cursor:default;background-color:var(--skra-comp-field-background-readonly);border-color:var(--skra-comp-field-border-color-readonly)}:host(:checked[aria-readonly=true]),:host(:indeterminate[aria-readonly=true]){background-color:var(--skra-comp-field-checkbox-checked-background-readonly);border-color:var(--skra-comp-field-checkbox-checked-background-readonly);--skra-comp-field-checkbox-check-color: var( --skra-comp-field-checkbox-check-color-readonly )}:host(:checked[aria-readonly=true]){background-image:var(--skra-comp-field-checkbox-check-glyph-readonly)}: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"] }]
91
91
  }], ctorParameters: () => [], propDecorators: { indeterminate: [{ type: i0.Input, args: [{ isSignal: true, alias: "indeterminate", required: false }] }] } });
92
92
 
93
93
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"skra-ui-checkbox.mjs","sources":["../../../../libs/ui/checkbox/src/lib/checkbox/checkbox.ts","../../../../libs/ui/checkbox/src/skra-ui-checkbox.ts"],"sourcesContent":["import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n ViewEncapsulation,\r\n booleanAttribute,\r\n effect,\r\n inject,\r\n input,\r\n} from '@angular/core';\r\nimport { SkraFieldContext } from '@skra/ui/field';\r\n\r\n/**\r\n * Wires a native `<input type=\"checkbox\">` to SkraFieldContext when inside\r\n * `<skra-field>` (ADR 013), or stands alone with no cascade. Per ADR 039/040,\r\n * Forge ships no `<skra-checkbox>` wrapper — this is a Component-on-the-native-\r\n * host (`<input>` is void → `template: ''`, ADR 040 §2) carrying its own\r\n * `checkbox.scss` via Emulated encapsulation. Value channel stays consumer-owned\r\n * per ADR 037: bind\r\n * via native `[checked]` + `(change)`, Reactive Forms `formControlName`,\r\n * Signal Forms `[formField]`, or `[(ngModel)]` — all work orthogonally with\r\n * this directive (which only handles a11y + skin context).\r\n *\r\n * <!-- inside Field -->\r\n * <skra-field>\r\n * <input type=\"checkbox\" skraCheckbox [checked]=\"x()\" (change)=\"x.set($any($event.target).checked)\" />\r\n * <label skraLabelFor>Accept ToS</label>\r\n * </skra-field>\r\n *\r\n * <!-- standalone (label wraps input — no id/for needed) -->\r\n * <label>\r\n * <input type=\"checkbox\" skraCheckbox [checked]=\"x()\" (change)=\"x.set($any($event.target).checked)\" />\r\n * Accept ToS\r\n * </label>\r\n *\r\n * Toggle state (`checked`, `indeterminate`) is NOT reflected as `data-skra-*`\r\n * — that would require Forge to observe native state, violating ADR 037. Slice\r\n * CSS targets native `:checked` and `:indeterminate` pseudo-classes directly;\r\n * browsers handle `aria-checked` natively (including `\"mixed\"` for indeterminate).\r\n */\r\n@Component({\r\n selector: 'input[type=\"checkbox\"][skraCheckbox]',\r\n standalone: true,\r\n // Void host — no <ng-content>. See ADR 040 §2.\r\n template: '',\r\n styleUrl: './checkbox.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n host: {\r\n '[attr.data-skra-disabled]': 'context?.isDisabled() ? \"\" : null',\r\n '[attr.aria-invalid]': 'context?.hasError() ? \"true\" : null',\r\n // Readonly is ARIA-only (native `readonly` doesn't apply to checkboxes per\r\n // HTML spec). No `data-skra-readonly` — it was dead surface (no SCSS\r\n // consumer; styling keys off `[aria-readonly]`), removed 2026-05-31 to match\r\n // the select atom's Q-3 ARIA-only pattern (Batch 5 cleanroom review).\r\n '[attr.aria-readonly]': 'context?.isReadonly() ? \"true\" : null',\r\n '[attr.aria-describedby]': 'context?.describedByIds() ?? null',\r\n '(click)': 'blockWhenReadonly($event)',\r\n '(keydown)': 'blockKeyWhenReadonly($event)',\r\n },\r\n})\r\nexport class SkraCheckbox {\r\n private readonly el = inject<ElementRef<HTMLInputElement>>(ElementRef);\r\n readonly context = inject(SkraFieldContext, { optional: true });\r\n\r\n // `indeterminate` is the ONE state Forge writes back to the native input,\r\n // because HTML does not expose it as an attribute — only the JS property.\r\n // Consumer is expected to drive it (e.g. tristate parent-of-children checkbox).\r\n readonly indeterminate = input(false, { transform: booleanAttribute });\r\n\r\n constructor() {\r\n const el = this.el.nativeElement;\r\n\r\n effect(() => {\r\n el.indeterminate = this.indeterminate();\r\n });\r\n\r\n // Field-cascaded native properties — only bind when context is present so\r\n // standalone consumers retain full control of their static attributes.\r\n if (this.context) {\r\n const ctx = this.context;\r\n effect(() => {\r\n el.id = ctx.fieldId();\r\n });\r\n effect(() => {\r\n el.disabled = ctx.isDisabled();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Readonly enforcement — native checkbox has no `[readonly]`, so without this\r\n * the `aria-readonly` we announce would be a lie (the user could still toggle\r\n * it). `preventDefault` on `click` blocks the toggle from both pointer and\r\n * Space/Enter (keyboard activation dispatches a click on form controls).\r\n * Mirrors the `<select skraSelect>` / `skraRadio` readonly guards.\r\n */\r\n protected blockWhenReadonly(event: Event): void {\r\n if (this.context?.isReadonly()) event.preventDefault();\r\n }\r\n\r\n /** Block keyboard activation (Space) when readonly; let `Tab` through. */\r\n protected blockKeyWhenReadonly(event: KeyboardEvent): void {\r\n if (this.context?.isReadonly() && event.key !== 'Tab') {\r\n event.preventDefault();\r\n }\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BG;MAsBU,YAAY,CAAA;AACN,IAAA,EAAE,GAAG,MAAM,CAA+B,UAAU,CAAC;IAC7D,OAAO,GAAG,MAAM,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;;;IAKtD,aAAa,GAAG,KAAK,CAAC,KAAK,qFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAEtE,IAAA,WAAA,GAAA;AACE,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa;QAEhC,MAAM,CAAC,MAAK;AACV,YAAA,EAAE,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE;AACzC,QAAA,CAAC,CAAC;;;AAIF,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;QACJ;IACF;AAEA;;;;;;AAMG;AACO,IAAA,iBAAiB,CAAC,KAAY,EAAA;AACtC,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE;YAAE,KAAK,CAAC,cAAc,EAAE;IACxD;;AAGU,IAAA,oBAAoB,CAAC,KAAoB,EAAA;AACjD,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,EAAE;YACrD,KAAK,CAAC,cAAc,EAAE;QACxB;IACF;uGA7CW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAY,unBAjBb,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,+hFAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAiBD,YAAY,EAAA,UAAA,EAAA,CAAA;kBArBxB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sCAAsC,EAAA,UAAA,EACpC,IAAI,EAAA,QAAA,EAEN,EAAE,EAAA,eAAA,EAEK,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,QAAQ,EAAA,IAAA,EACnC;AACJ,wBAAA,2BAA2B,EAAE,mCAAmC;AAChE,wBAAA,qBAAqB,EAAE,qCAAqC;;;;;AAK5D,wBAAA,sBAAsB,EAAE,uCAAuC;AAC/D,wBAAA,yBAAyB,EAAE,mCAAmC;AAC9D,wBAAA,SAAS,EAAE,2BAA2B;AACtC,wBAAA,WAAW,EAAE,8BAA8B;AAC5C,qBAAA,EAAA,MAAA,EAAA,CAAA,+hFAAA,CAAA,EAAA;;;AC3DH;;AAEG;;;;"}
1
+ {"version":3,"file":"skra-ui-checkbox.mjs","sources":["../../../../libs/ui/checkbox/src/lib/checkbox/checkbox.ts","../../../../libs/ui/checkbox/src/skra-ui-checkbox.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n booleanAttribute,\n effect,\n inject,\n input,\n} from '@angular/core';\nimport { SkraFieldContext } from '@skra/ui/field';\n\n/**\n * Wires a native `<input type=\"checkbox\">` to SkraFieldContext when inside\n * `<skra-field>` (ADR 013), or stands alone with no cascade. Per ADR 039/040,\n * Forge ships no `<skra-checkbox>` wrapper — this is a Component-on-the-native-\n * host (`<input>` is void → `template: ''`, ADR 040 §2) carrying its own\n * `checkbox.scss` via Emulated encapsulation. Value channel stays consumer-owned\n * per ADR 037: bind\n * via native `[checked]` + `(change)`, Reactive Forms `formControlName`,\n * Signal Forms `[formField]`, or `[(ngModel)]` — all work orthogonally with\n * this directive (which only handles a11y + skin context).\n *\n * <!-- inside Field -->\n * <skra-field>\n * <input type=\"checkbox\" skraCheckbox [checked]=\"x()\" (change)=\"x.set($any($event.target).checked)\" />\n * <label skraLabelFor>Accept ToS</label>\n * </skra-field>\n *\n * <!-- standalone (label wraps input — no id/for needed) -->\n * <label>\n * <input type=\"checkbox\" skraCheckbox [checked]=\"x()\" (change)=\"x.set($any($event.target).checked)\" />\n * Accept ToS\n * </label>\n *\n * Toggle state (`checked`, `indeterminate`) is NOT reflected as `data-skra-*`\n * — that would require Forge to observe native state, violating ADR 037. Slice\n * CSS targets native `:checked` and `:indeterminate` pseudo-classes directly;\n * browsers handle `aria-checked` natively (including `\"mixed\"` for indeterminate).\n */\n@Component({\n selector: 'input[type=\"checkbox\"][skraCheckbox]',\n standalone: true,\n // Void host — no <ng-content>. See ADR 040 §2.\n template: '',\n styleUrl: './checkbox.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n '[attr.data-skra-disabled]': 'context?.isDisabled() ? \"\" : null',\n '[attr.aria-invalid]': 'context?.hasError() ? \"true\" : null',\n // Readonly is ARIA-only (native `readonly` doesn't apply to checkboxes per\n // HTML spec). No `data-skra-readonly` — it was dead surface (no SCSS\n // consumer; styling keys off `[aria-readonly]`), removed 2026-05-31 to match\n // the select atom's Q-3 ARIA-only pattern (Batch 5 cleanroom review).\n '[attr.aria-readonly]': 'context?.isReadonly() ? \"true\" : null',\n '[attr.aria-describedby]': 'context?.describedByIds() ?? null',\n '(click)': 'blockWhenReadonly($event)',\n '(keydown)': 'blockKeyWhenReadonly($event)',\n },\n})\nexport class SkraCheckbox {\n private readonly el = inject<ElementRef<HTMLInputElement>>(ElementRef);\n readonly context = inject(SkraFieldContext, { optional: true });\n\n // `indeterminate` is the ONE state Forge writes back to the native input,\n // because HTML does not expose it as an attribute — only the JS property.\n // Consumer is expected to drive it (e.g. tristate parent-of-children checkbox).\n readonly indeterminate = input(false, { transform: booleanAttribute });\n\n constructor() {\n const el = this.el.nativeElement;\n\n effect(() => {\n el.indeterminate = this.indeterminate();\n });\n\n // Field-cascaded native properties — only bind when context is present so\n // standalone consumers retain full control of their static attributes.\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 }\n }\n\n /**\n * Readonly enforcement — native checkbox has no `[readonly]`, so without this\n * the `aria-readonly` we announce would be a lie (the user could still toggle\n * it). `preventDefault` on `click` blocks the toggle from both pointer and\n * Space/Enter (keyboard activation dispatches a click on form controls).\n * Mirrors the `<select skraSelect>` / `skraRadio` readonly guards.\n */\n protected blockWhenReadonly(event: Event): void {\n if (this.context?.isReadonly()) event.preventDefault();\n }\n\n /** Block keyboard activation (Space) when readonly; let `Tab` through. */\n protected blockKeyWhenReadonly(event: KeyboardEvent): void {\n if (this.context?.isReadonly() && event.key !== 'Tab') {\n event.preventDefault();\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BG;MAsBU,YAAY,CAAA;AACN,IAAA,EAAE,GAAG,MAAM,CAA+B,UAAU,CAAC;IAC7D,OAAO,GAAG,MAAM,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;;;IAKtD,aAAa,GAAG,KAAK,CAAC,KAAK,qFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAEtE,IAAA,WAAA,GAAA;AACE,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa;QAEhC,MAAM,CAAC,MAAK;AACV,YAAA,EAAE,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE;AACzC,QAAA,CAAC,CAAC;;;AAIF,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;QACJ;IACF;AAEA;;;;;;AAMG;AACO,IAAA,iBAAiB,CAAC,KAAY,EAAA;AACtC,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE;YAAE,KAAK,CAAC,cAAc,EAAE;IACxD;;AAGU,IAAA,oBAAoB,CAAC,KAAoB,EAAA;AACjD,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,EAAE;YACrD,KAAK,CAAC,cAAc,EAAE;QACxB;IACF;uGA7CW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAY,unBAjBb,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,+wFAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAiBD,YAAY,EAAA,UAAA,EAAA,CAAA;kBArBxB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sCAAsC,EAAA,UAAA,EACpC,IAAI,EAAA,QAAA,EAEN,EAAE,EAAA,eAAA,EAEK,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,QAAQ,EAAA,IAAA,EACnC;AACJ,wBAAA,2BAA2B,EAAE,mCAAmC;AAChE,wBAAA,qBAAqB,EAAE,qCAAqC;;;;;AAK5D,wBAAA,sBAAsB,EAAE,uCAAuC;AAC/D,wBAAA,yBAAyB,EAAE,mCAAmC;AAC9D,wBAAA,SAAS,EAAE,2BAA2B;AACtC,wBAAA,WAAW,EAAE,8BAA8B;AAC5C,qBAAA,EAAA,MAAA,EAAA,CAAA,+wFAAA,CAAA,EAAA;;;AC3DH;;AAEG;;;;"}
@@ -61,7 +61,7 @@ class SkraChip {
61
61
  this.removed.emit();
62
62
  }
63
63
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraChip, deps: [], target: i0.ɵɵFactoryTarget.Component });
64
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.1", type: SkraChip, isStandalone: true, selector: "skra-chip", inputs: { intent: { classPropertyName: "intent", publicName: "intent", isSignal: true, isRequired: false, transformFunction: null }, emphasis: { classPropertyName: "emphasis", publicName: "emphasis", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { removed: "removed" }, host: { properties: { "attr.data-skra-intent": "intent()", "attr.data-skra-emphasis": "emphasis()", "attr.data-skra-disabled": "disabled() ? \"\" : null", "attr.data-skra-has-icon": "hasIcon() ? \"\" : null" } }, queries: [{ propertyName: "iconSlot", first: true, predicate: SkraChipIcon, descendants: true, isSignal: true }], ngImport: i0, template: "@if (hasIcon()) {\r\n<span class=\"skra-chip-icon\">\r\n <ng-content select=\"[skra-chip-icon]\"></ng-content>\r\n</span>\r\n}\r\n\r\n<span class=\"skra-chip-label\">\r\n <ng-content></ng-content>\r\n</span>\r\n\r\n<button\r\n type=\"button\"\r\n class=\"skra-chip-remove\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"onRemove()\"\r\n>\r\n <svg\r\n class=\"skra-chip-remove-glyph\"\r\n aria-hidden=\"true\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2.5\"\r\n stroke-linecap=\"round\"\r\n >\r\n <path d=\"M18 6 6 18\" />\r\n <path d=\"m6 6 12 12\" />\r\n </svg>\r\n <ng-content select=\"[skra-chip-remove-label]\"></ng-content>\r\n</button>\r\n", styles: ["@charset \"UTF-8\";:host{display:inline-flex;align-items:center;box-sizing:border-box;margin:0;white-space:nowrap;min-block-size:var(--skra-comp-chip-remove-size);font-family:var(--skra-sys-typography-role-label-medium-font-family);font-size:var(--skra-sys-typography-role-label-medium-font-size);font-weight:var(--skra-sys-typography-role-label-medium-font-weight);line-height:var(--skra-sys-typography-role-label-medium-line-height);letter-spacing:var(--skra-sys-typography-role-label-medium-letter-spacing);background:var(--skra-comp-chip-background);color:var(--skra-comp-chip-foreground);border-color:var(--skra-comp-chip-border-color);border-width:var(--skra-comp-chip-border-width);border-style:var(--skra-comp-chip-border-style);border-radius:var(--skra-comp-chip-radius);padding-block:var(--skra-comp-chip-padding-block);padding-inline:var(--skra-comp-chip-padding-inline);box-shadow:var(--skra-comp-chip-shadow)}:host([data-skra-emphasis=high]){--skra-comp-chip-border-width: 0}:host([data-skra-disabled]){cursor:not-allowed;background:var(--skra-sys-color-neutral-soft);color:var(--skra-sys-color-neutral-strong);border-color:var(--skra-sys-color-neutral-border)}:host([data-skra-disabled]) .skra-chip-icon,:host([data-skra-disabled]) .skra-chip-remove{opacity:var(--skra-sys-opacity-disabled)}:host([data-skra-intent=neutral][data-skra-emphasis=high]){--skra-comp-chip-background: var( --skra-comp-chip-background-neutral-high, var(--skra-sys-color-neutral-base) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-neutral-high, var(--skra-sys-color-neutral-contrast) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-neutral-high, transparent )}:host([data-skra-intent=neutral][data-skra-emphasis=medium]){--skra-comp-chip-background: var( --skra-comp-chip-background-neutral-medium, var(--skra-sys-color-neutral-soft) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-neutral-medium, var(--skra-sys-color-neutral-strong) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-neutral-medium, var(--skra-sys-color-neutral-border) )}:host([data-skra-intent=info][data-skra-emphasis=high]){--skra-comp-chip-background: var( --skra-comp-chip-background-info-high, var(--skra-sys-color-info-base) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-info-high, var(--skra-sys-color-info-contrast) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-info-high, transparent )}:host([data-skra-intent=info][data-skra-emphasis=medium]){--skra-comp-chip-background: var( --skra-comp-chip-background-info-medium, var(--skra-sys-color-info-soft) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-info-medium, var(--skra-sys-color-info-strong) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-info-medium, var(--skra-sys-color-info-border) )}:host([data-skra-intent=success][data-skra-emphasis=high]){--skra-comp-chip-background: var( --skra-comp-chip-background-success-high, var(--skra-sys-color-success-base) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-success-high, var(--skra-sys-color-success-contrast) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-success-high, transparent )}:host([data-skra-intent=success][data-skra-emphasis=medium]){--skra-comp-chip-background: var( --skra-comp-chip-background-success-medium, var(--skra-sys-color-success-soft) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-success-medium, var(--skra-sys-color-success-strong) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-success-medium, var(--skra-sys-color-success-border) )}:host([data-skra-intent=warning][data-skra-emphasis=high]){--skra-comp-chip-background: var( --skra-comp-chip-background-warning-high, var(--skra-sys-color-warning-base) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-warning-high, var(--skra-sys-color-warning-contrast) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-warning-high, transparent )}:host([data-skra-intent=warning][data-skra-emphasis=medium]){--skra-comp-chip-background: var( --skra-comp-chip-background-warning-medium, var(--skra-sys-color-warning-soft) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-warning-medium, var(--skra-sys-color-warning-strong) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-warning-medium, var(--skra-sys-color-warning-border) )}:host([data-skra-intent=danger][data-skra-emphasis=high]){--skra-comp-chip-background: var( --skra-comp-chip-background-danger-high, var(--skra-sys-color-danger-base) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-danger-high, var(--skra-sys-color-danger-contrast) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-danger-high, transparent )}:host([data-skra-intent=danger][data-skra-emphasis=medium]){--skra-comp-chip-background: var( --skra-comp-chip-background-danger-medium, var(--skra-sys-color-danger-soft) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-danger-medium, var(--skra-sys-color-danger-strong) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-danger-medium, var(--skra-sys-color-danger-border) )}.skra-chip-icon{display:inline-flex;flex-shrink:0;align-items:center;block-size:1lh;margin-inline-end:var(--skra-comp-chip-icon-gap);--skra-comp-icon-size: var(--skra-comp-chip-icon-size)}.skra-chip-label{display:inline-flex;align-items:center;min-inline-size:0}.skra-chip-remove{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;inline-size:var(--skra-comp-chip-remove-size);block-size:var(--skra-comp-chip-remove-size);margin:0;margin-inline-start:var(--skra-comp-chip-remove-gap);padding:0;border:0;background:transparent;color:inherit;cursor:pointer;border-radius:var(--skra-comp-chip-radius);transition:opacity var(--skra-comp-chip-motion-duration) var(--skra-comp-chip-motion-easing)}.skra-chip-remove:hover{opacity:.7}.skra-chip-remove:focus-visible{outline-style:solid;outline-color:var(--skra-comp-chip-focus-ring-color);outline-width:var(--skra-comp-chip-focus-ring-width);outline-offset:2px}.skra-chip-remove:disabled{cursor:not-allowed}.skra-chip-remove-glyph{inline-size:.875em;block-size:.875em;display:block}@media(prefers-reduced-motion:reduce){.skra-chip-remove{transition:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
64
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.1", type: SkraChip, isStandalone: true, selector: "skra-chip", inputs: { intent: { classPropertyName: "intent", publicName: "intent", isSignal: true, isRequired: false, transformFunction: null }, emphasis: { classPropertyName: "emphasis", publicName: "emphasis", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { removed: "removed" }, host: { properties: { "attr.data-skra-intent": "intent()", "attr.data-skra-emphasis": "emphasis()", "attr.data-skra-disabled": "disabled() ? \"\" : null", "attr.data-skra-has-icon": "hasIcon() ? \"\" : null" } }, queries: [{ propertyName: "iconSlot", first: true, predicate: SkraChipIcon, descendants: true, isSignal: true }], ngImport: i0, template: "@if (hasIcon()) {\r\n<span class=\"skra-chip-icon\">\r\n <ng-content select=\"[skra-chip-icon]\"></ng-content>\r\n</span>\r\n}\r\n\r\n<span class=\"skra-chip-label\">\r\n <ng-content></ng-content>\r\n</span>\r\n\r\n<button\r\n type=\"button\"\r\n class=\"skra-chip-remove\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"onRemove()\"\r\n>\r\n <svg\r\n class=\"skra-chip-remove-glyph\"\r\n aria-hidden=\"true\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2.5\"\r\n stroke-linecap=\"round\"\r\n >\r\n <path d=\"M18 6 6 18\" />\r\n <path d=\"m6 6 12 12\" />\r\n </svg>\r\n <ng-content select=\"[skra-chip-remove-label]\"></ng-content>\r\n</button>\r\n", styles: ["@charset \"UTF-8\";:host{display:inline-flex;align-items:center;box-sizing:border-box;margin:0;white-space:nowrap;min-block-size:var(--skra-comp-chip-remove-size);font-family:var(--skra-sys-typography-role-label-medium-font-family);font-size:var(--skra-sys-typography-role-label-medium-font-size);font-weight:var(--skra-sys-typography-role-label-medium-font-weight);line-height:var(--skra-sys-typography-role-label-medium-line-height);letter-spacing:var(--skra-sys-typography-role-label-medium-letter-spacing);background:var(--skra-comp-chip-background);color:var(--skra-comp-chip-foreground);border-color:var(--skra-comp-chip-border-color);border-width:var(--skra-comp-chip-border-width);border-style:var(--skra-comp-chip-border-style);border-radius:var(--skra-comp-chip-radius);padding-block:var(--skra-comp-chip-padding-block);padding-inline:var(--skra-comp-chip-padding-inline);box-shadow:var(--skra-comp-chip-shadow)}:host([data-skra-emphasis=high]){--skra-comp-chip-border-width: 0}:host([data-skra-disabled]){cursor:not-allowed;background:var(--skra-sys-color-neutral-soft);color:var(--skra-sys-color-neutral-strong);border-color:var(--skra-sys-color-neutral-border)}:host([data-skra-disabled]) .skra-chip-icon,:host([data-skra-disabled]) .skra-chip-remove{opacity:var(--skra-sys-opacity-disabled)}:host([data-skra-intent=neutral][data-skra-emphasis=high]){--skra-comp-chip-background: var( --skra-comp-chip-background-neutral-high, var(--skra-sys-color-neutral-base) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-neutral-high, var(--skra-sys-color-neutral-contrast) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-neutral-high, transparent )}:host([data-skra-intent=neutral][data-skra-emphasis=medium]){--skra-comp-chip-background: var( --skra-comp-chip-background-neutral-medium, var(--skra-sys-color-neutral-soft) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-neutral-medium, var(--skra-sys-color-neutral-strong) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-neutral-medium, var(--skra-sys-color-neutral-border) )}:host([data-skra-intent=info][data-skra-emphasis=high]){--skra-comp-chip-background: var( --skra-comp-chip-background-info-high, var(--skra-sys-color-info-base) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-info-high, var(--skra-sys-color-info-contrast) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-info-high, transparent )}:host([data-skra-intent=info][data-skra-emphasis=medium]){--skra-comp-chip-background: var( --skra-comp-chip-background-info-medium, var(--skra-sys-color-info-soft) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-info-medium, var(--skra-sys-color-info-strong) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-info-medium, var(--skra-sys-color-info-border) )}:host([data-skra-intent=success][data-skra-emphasis=high]){--skra-comp-chip-background: var( --skra-comp-chip-background-success-high, var(--skra-sys-color-success-base) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-success-high, var(--skra-sys-color-success-contrast) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-success-high, transparent )}:host([data-skra-intent=success][data-skra-emphasis=medium]){--skra-comp-chip-background: var( --skra-comp-chip-background-success-medium, var(--skra-sys-color-success-soft) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-success-medium, var(--skra-sys-color-success-strong) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-success-medium, var(--skra-sys-color-success-border) )}:host([data-skra-intent=warning][data-skra-emphasis=high]){--skra-comp-chip-background: var( --skra-comp-chip-background-warning-high, var(--skra-sys-color-warning-base) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-warning-high, var(--skra-sys-color-warning-contrast) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-warning-high, transparent )}:host([data-skra-intent=warning][data-skra-emphasis=medium]){--skra-comp-chip-background: var( --skra-comp-chip-background-warning-medium, var(--skra-sys-color-warning-soft) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-warning-medium, var(--skra-sys-color-warning-strong) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-warning-medium, var(--skra-sys-color-warning-border) )}:host([data-skra-intent=danger][data-skra-emphasis=high]){--skra-comp-chip-background: var( --skra-comp-chip-background-danger-high, var(--skra-sys-color-danger-base) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-danger-high, var(--skra-sys-color-danger-contrast) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-danger-high, transparent )}:host([data-skra-intent=danger][data-skra-emphasis=medium]){--skra-comp-chip-background: var( --skra-comp-chip-background-danger-medium, var(--skra-sys-color-danger-soft) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-danger-medium, var(--skra-sys-color-danger-strong) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-danger-medium, var(--skra-sys-color-danger-border) )}.skra-chip-icon{display:inline-flex;flex-shrink:0;align-items:center;block-size:1lh;margin-inline-end:var(--skra-comp-chip-icon-gap);--skra-comp-icon-size: var(--skra-comp-chip-icon-size)}.skra-chip-label{display:inline-flex;align-items:center;min-inline-size:0}.skra-chip-remove{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;inline-size:var(--skra-comp-chip-remove-size);block-size:var(--skra-comp-chip-remove-size);margin:0;margin-inline-start:var(--skra-comp-chip-remove-gap);padding:0;border:0;background:transparent;color:inherit;cursor:pointer;border-radius:var(--skra-comp-chip-radius);transition:opacity var(--skra-comp-chip-motion-duration) var(--skra-comp-chip-motion-easing)}@media(hover:hover)and (pointer:fine){.skra-chip-remove:hover{opacity:.7}}.skra-chip-remove:focus-visible{outline-style:solid;outline-color:var(--skra-comp-chip-focus-ring-color);outline-width:var(--skra-comp-chip-focus-ring-width);outline-offset:2px}.skra-chip-remove:disabled{cursor:not-allowed}.skra-chip-remove-glyph{inline-size:.875em;block-size:.875em;display:block}@media(prefers-reduced-motion:reduce){.skra-chip-remove{transition:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
65
65
  }
66
66
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraChip, decorators: [{
67
67
  type: Component,
@@ -75,7 +75,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImpor
75
75
  '[attr.data-skra-disabled]': 'disabled() ? "" : null',
76
76
  // Smart Slot layout reflection (ADR 020 v2.0 — slot-presence, State-Surface-exempt §3.6)
77
77
  '[attr.data-skra-has-icon]': 'hasIcon() ? "" : null',
78
- }, template: "@if (hasIcon()) {\r\n<span class=\"skra-chip-icon\">\r\n <ng-content select=\"[skra-chip-icon]\"></ng-content>\r\n</span>\r\n}\r\n\r\n<span class=\"skra-chip-label\">\r\n <ng-content></ng-content>\r\n</span>\r\n\r\n<button\r\n type=\"button\"\r\n class=\"skra-chip-remove\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"onRemove()\"\r\n>\r\n <svg\r\n class=\"skra-chip-remove-glyph\"\r\n aria-hidden=\"true\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2.5\"\r\n stroke-linecap=\"round\"\r\n >\r\n <path d=\"M18 6 6 18\" />\r\n <path d=\"m6 6 12 12\" />\r\n </svg>\r\n <ng-content select=\"[skra-chip-remove-label]\"></ng-content>\r\n</button>\r\n", styles: ["@charset \"UTF-8\";:host{display:inline-flex;align-items:center;box-sizing:border-box;margin:0;white-space:nowrap;min-block-size:var(--skra-comp-chip-remove-size);font-family:var(--skra-sys-typography-role-label-medium-font-family);font-size:var(--skra-sys-typography-role-label-medium-font-size);font-weight:var(--skra-sys-typography-role-label-medium-font-weight);line-height:var(--skra-sys-typography-role-label-medium-line-height);letter-spacing:var(--skra-sys-typography-role-label-medium-letter-spacing);background:var(--skra-comp-chip-background);color:var(--skra-comp-chip-foreground);border-color:var(--skra-comp-chip-border-color);border-width:var(--skra-comp-chip-border-width);border-style:var(--skra-comp-chip-border-style);border-radius:var(--skra-comp-chip-radius);padding-block:var(--skra-comp-chip-padding-block);padding-inline:var(--skra-comp-chip-padding-inline);box-shadow:var(--skra-comp-chip-shadow)}:host([data-skra-emphasis=high]){--skra-comp-chip-border-width: 0}:host([data-skra-disabled]){cursor:not-allowed;background:var(--skra-sys-color-neutral-soft);color:var(--skra-sys-color-neutral-strong);border-color:var(--skra-sys-color-neutral-border)}:host([data-skra-disabled]) .skra-chip-icon,:host([data-skra-disabled]) .skra-chip-remove{opacity:var(--skra-sys-opacity-disabled)}:host([data-skra-intent=neutral][data-skra-emphasis=high]){--skra-comp-chip-background: var( --skra-comp-chip-background-neutral-high, var(--skra-sys-color-neutral-base) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-neutral-high, var(--skra-sys-color-neutral-contrast) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-neutral-high, transparent )}:host([data-skra-intent=neutral][data-skra-emphasis=medium]){--skra-comp-chip-background: var( --skra-comp-chip-background-neutral-medium, var(--skra-sys-color-neutral-soft) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-neutral-medium, var(--skra-sys-color-neutral-strong) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-neutral-medium, var(--skra-sys-color-neutral-border) )}:host([data-skra-intent=info][data-skra-emphasis=high]){--skra-comp-chip-background: var( --skra-comp-chip-background-info-high, var(--skra-sys-color-info-base) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-info-high, var(--skra-sys-color-info-contrast) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-info-high, transparent )}:host([data-skra-intent=info][data-skra-emphasis=medium]){--skra-comp-chip-background: var( --skra-comp-chip-background-info-medium, var(--skra-sys-color-info-soft) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-info-medium, var(--skra-sys-color-info-strong) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-info-medium, var(--skra-sys-color-info-border) )}:host([data-skra-intent=success][data-skra-emphasis=high]){--skra-comp-chip-background: var( --skra-comp-chip-background-success-high, var(--skra-sys-color-success-base) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-success-high, var(--skra-sys-color-success-contrast) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-success-high, transparent )}:host([data-skra-intent=success][data-skra-emphasis=medium]){--skra-comp-chip-background: var( --skra-comp-chip-background-success-medium, var(--skra-sys-color-success-soft) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-success-medium, var(--skra-sys-color-success-strong) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-success-medium, var(--skra-sys-color-success-border) )}:host([data-skra-intent=warning][data-skra-emphasis=high]){--skra-comp-chip-background: var( --skra-comp-chip-background-warning-high, var(--skra-sys-color-warning-base) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-warning-high, var(--skra-sys-color-warning-contrast) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-warning-high, transparent )}:host([data-skra-intent=warning][data-skra-emphasis=medium]){--skra-comp-chip-background: var( --skra-comp-chip-background-warning-medium, var(--skra-sys-color-warning-soft) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-warning-medium, var(--skra-sys-color-warning-strong) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-warning-medium, var(--skra-sys-color-warning-border) )}:host([data-skra-intent=danger][data-skra-emphasis=high]){--skra-comp-chip-background: var( --skra-comp-chip-background-danger-high, var(--skra-sys-color-danger-base) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-danger-high, var(--skra-sys-color-danger-contrast) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-danger-high, transparent )}:host([data-skra-intent=danger][data-skra-emphasis=medium]){--skra-comp-chip-background: var( --skra-comp-chip-background-danger-medium, var(--skra-sys-color-danger-soft) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-danger-medium, var(--skra-sys-color-danger-strong) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-danger-medium, var(--skra-sys-color-danger-border) )}.skra-chip-icon{display:inline-flex;flex-shrink:0;align-items:center;block-size:1lh;margin-inline-end:var(--skra-comp-chip-icon-gap);--skra-comp-icon-size: var(--skra-comp-chip-icon-size)}.skra-chip-label{display:inline-flex;align-items:center;min-inline-size:0}.skra-chip-remove{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;inline-size:var(--skra-comp-chip-remove-size);block-size:var(--skra-comp-chip-remove-size);margin:0;margin-inline-start:var(--skra-comp-chip-remove-gap);padding:0;border:0;background:transparent;color:inherit;cursor:pointer;border-radius:var(--skra-comp-chip-radius);transition:opacity var(--skra-comp-chip-motion-duration) var(--skra-comp-chip-motion-easing)}.skra-chip-remove:hover{opacity:.7}.skra-chip-remove:focus-visible{outline-style:solid;outline-color:var(--skra-comp-chip-focus-ring-color);outline-width:var(--skra-comp-chip-focus-ring-width);outline-offset:2px}.skra-chip-remove:disabled{cursor:not-allowed}.skra-chip-remove-glyph{inline-size:.875em;block-size:.875em;display:block}@media(prefers-reduced-motion:reduce){.skra-chip-remove{transition:none}}\n"] }]
78
+ }, template: "@if (hasIcon()) {\r\n<span class=\"skra-chip-icon\">\r\n <ng-content select=\"[skra-chip-icon]\"></ng-content>\r\n</span>\r\n}\r\n\r\n<span class=\"skra-chip-label\">\r\n <ng-content></ng-content>\r\n</span>\r\n\r\n<button\r\n type=\"button\"\r\n class=\"skra-chip-remove\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"onRemove()\"\r\n>\r\n <svg\r\n class=\"skra-chip-remove-glyph\"\r\n aria-hidden=\"true\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2.5\"\r\n stroke-linecap=\"round\"\r\n >\r\n <path d=\"M18 6 6 18\" />\r\n <path d=\"m6 6 12 12\" />\r\n </svg>\r\n <ng-content select=\"[skra-chip-remove-label]\"></ng-content>\r\n</button>\r\n", styles: ["@charset \"UTF-8\";:host{display:inline-flex;align-items:center;box-sizing:border-box;margin:0;white-space:nowrap;min-block-size:var(--skra-comp-chip-remove-size);font-family:var(--skra-sys-typography-role-label-medium-font-family);font-size:var(--skra-sys-typography-role-label-medium-font-size);font-weight:var(--skra-sys-typography-role-label-medium-font-weight);line-height:var(--skra-sys-typography-role-label-medium-line-height);letter-spacing:var(--skra-sys-typography-role-label-medium-letter-spacing);background:var(--skra-comp-chip-background);color:var(--skra-comp-chip-foreground);border-color:var(--skra-comp-chip-border-color);border-width:var(--skra-comp-chip-border-width);border-style:var(--skra-comp-chip-border-style);border-radius:var(--skra-comp-chip-radius);padding-block:var(--skra-comp-chip-padding-block);padding-inline:var(--skra-comp-chip-padding-inline);box-shadow:var(--skra-comp-chip-shadow)}:host([data-skra-emphasis=high]){--skra-comp-chip-border-width: 0}:host([data-skra-disabled]){cursor:not-allowed;background:var(--skra-sys-color-neutral-soft);color:var(--skra-sys-color-neutral-strong);border-color:var(--skra-sys-color-neutral-border)}:host([data-skra-disabled]) .skra-chip-icon,:host([data-skra-disabled]) .skra-chip-remove{opacity:var(--skra-sys-opacity-disabled)}:host([data-skra-intent=neutral][data-skra-emphasis=high]){--skra-comp-chip-background: var( --skra-comp-chip-background-neutral-high, var(--skra-sys-color-neutral-base) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-neutral-high, var(--skra-sys-color-neutral-contrast) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-neutral-high, transparent )}:host([data-skra-intent=neutral][data-skra-emphasis=medium]){--skra-comp-chip-background: var( --skra-comp-chip-background-neutral-medium, var(--skra-sys-color-neutral-soft) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-neutral-medium, var(--skra-sys-color-neutral-strong) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-neutral-medium, var(--skra-sys-color-neutral-border) )}:host([data-skra-intent=info][data-skra-emphasis=high]){--skra-comp-chip-background: var( --skra-comp-chip-background-info-high, var(--skra-sys-color-info-base) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-info-high, var(--skra-sys-color-info-contrast) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-info-high, transparent )}:host([data-skra-intent=info][data-skra-emphasis=medium]){--skra-comp-chip-background: var( --skra-comp-chip-background-info-medium, var(--skra-sys-color-info-soft) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-info-medium, var(--skra-sys-color-info-strong) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-info-medium, var(--skra-sys-color-info-border) )}:host([data-skra-intent=success][data-skra-emphasis=high]){--skra-comp-chip-background: var( --skra-comp-chip-background-success-high, var(--skra-sys-color-success-base) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-success-high, var(--skra-sys-color-success-contrast) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-success-high, transparent )}:host([data-skra-intent=success][data-skra-emphasis=medium]){--skra-comp-chip-background: var( --skra-comp-chip-background-success-medium, var(--skra-sys-color-success-soft) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-success-medium, var(--skra-sys-color-success-strong) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-success-medium, var(--skra-sys-color-success-border) )}:host([data-skra-intent=warning][data-skra-emphasis=high]){--skra-comp-chip-background: var( --skra-comp-chip-background-warning-high, var(--skra-sys-color-warning-base) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-warning-high, var(--skra-sys-color-warning-contrast) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-warning-high, transparent )}:host([data-skra-intent=warning][data-skra-emphasis=medium]){--skra-comp-chip-background: var( --skra-comp-chip-background-warning-medium, var(--skra-sys-color-warning-soft) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-warning-medium, var(--skra-sys-color-warning-strong) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-warning-medium, var(--skra-sys-color-warning-border) )}:host([data-skra-intent=danger][data-skra-emphasis=high]){--skra-comp-chip-background: var( --skra-comp-chip-background-danger-high, var(--skra-sys-color-danger-base) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-danger-high, var(--skra-sys-color-danger-contrast) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-danger-high, transparent )}:host([data-skra-intent=danger][data-skra-emphasis=medium]){--skra-comp-chip-background: var( --skra-comp-chip-background-danger-medium, var(--skra-sys-color-danger-soft) );--skra-comp-chip-foreground: var( --skra-comp-chip-foreground-danger-medium, var(--skra-sys-color-danger-strong) );--skra-comp-chip-border-color: var( --skra-comp-chip-border-color-danger-medium, var(--skra-sys-color-danger-border) )}.skra-chip-icon{display:inline-flex;flex-shrink:0;align-items:center;block-size:1lh;margin-inline-end:var(--skra-comp-chip-icon-gap);--skra-comp-icon-size: var(--skra-comp-chip-icon-size)}.skra-chip-label{display:inline-flex;align-items:center;min-inline-size:0}.skra-chip-remove{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;inline-size:var(--skra-comp-chip-remove-size);block-size:var(--skra-comp-chip-remove-size);margin:0;margin-inline-start:var(--skra-comp-chip-remove-gap);padding:0;border:0;background:transparent;color:inherit;cursor:pointer;border-radius:var(--skra-comp-chip-radius);transition:opacity var(--skra-comp-chip-motion-duration) var(--skra-comp-chip-motion-easing)}@media(hover:hover)and (pointer:fine){.skra-chip-remove:hover{opacity:.7}}.skra-chip-remove:focus-visible{outline-style:solid;outline-color:var(--skra-comp-chip-focus-ring-color);outline-width:var(--skra-comp-chip-focus-ring-width);outline-offset:2px}.skra-chip-remove:disabled{cursor:not-allowed}.skra-chip-remove-glyph{inline-size:.875em;block-size:.875em;display:block}@media(prefers-reduced-motion:reduce){.skra-chip-remove{transition:none}}\n"] }]
79
79
  }], propDecorators: { intent: [{ type: i0.Input, args: [{ isSignal: true, alias: "intent", required: false }] }], emphasis: [{ type: i0.Input, args: [{ isSignal: true, alias: "emphasis", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], removed: [{ type: i0.Output, args: ["removed"] }], iconSlot: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SkraChipIcon), { isSignal: true }] }] } });
80
80
 
81
81
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"skra-ui-chip.mjs","sources":["../../../../libs/ui/chip/src/lib/chip.directives.ts","../../../../libs/ui/chip/src/lib/chip/chip.ts","../../../../libs/ui/chip/src/lib/chip/chip.html","../../../../libs/ui/chip/src/skra-ui-chip.ts"],"sourcesContent":["import { Directive } from '@angular/core';\r\n\r\n/**\r\n * Marker directive for the leading icon/dot/avatar slot of `<skra-chip>`.\r\n * Detected via `contentChild` (ADR 020 Smart Slots v2.0) to toggle the icon\r\n * wrapper without emitting an empty DOM node. Feedback-local (mirrors\r\n * `SkraBadgeIcon`/`SkraAlertIcon`) to avoid a cross-lib marker dependency.\r\n */\r\n@Directive({\r\n selector: '[skra-chip-icon]',\r\n standalone: true,\r\n})\r\nexport class SkraChipIcon {}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ViewEncapsulation,\r\n booleanAttribute,\r\n computed,\r\n contentChild,\r\n input,\r\n output,\r\n} from '@angular/core';\r\nimport { SkraChipIcon } from '../chip.directives';\r\n\r\n/**\r\n * ChipIntent — semantic meaning (ADR 035 §3.1, downward subset). Excludes the\r\n * action intents `primary`/`secondary` (meaningless for a status/category pill).\r\n * Closed enum; extension requires an ADR 035 amendment.\r\n */\r\nexport type ChipIntent = 'neutral' | 'info' | 'success' | 'warning' | 'danger';\r\n\r\n/**\r\n * ChipEmphasis — visual loudness within the chosen intent (ADR 035 §3.1, subset).\r\n * `high` = filled pill, `medium` = soft/tinted. `low` deferred.\r\n */\r\nexport type ChipEmphasis = 'high' | 'medium';\r\n\r\n/**\r\n * `<skra-chip>` — a small, inline, **removable** labelled pill (Feedback/Status\r\n * family, Wave 2): a selected multi-select value, an applied filter, an input tag.\r\n * The host is a non-interactive presentational pill (the label is plain text, no\r\n * host role/focus); it contains exactly ONE interactive sub-control — the built-in\r\n * remove `<button>` (the Alert dismiss precedent).\r\n *\r\n * SRP-distinct from `<skra-badge>` (a NON-removable status pill): the remove\r\n * control is intrinsic to Chip — there is no `removable` flag, because a chip\r\n * without it would be a Badge. A SELECTABLE/filter chip (a toggle) is a SEPARATE\r\n * deferred atom (ARCHITECTURE_BACKLOG watch-list), NOT a `selectable` variant —\r\n * one atom carrying both interaction models is an SRP smell.\r\n *\r\n * No `live` axis (unlike Badge/Alert): a chip is an input/selection element, not a\r\n * status announcer; add/remove announcements are the consumer's own `aria-live`.\r\n *\r\n * Removal (ADR 037): the remove control fires `(removed)`. Forge does NOT remove\r\n * itself from the DOM — the consumer owns removal (splice the bound array / `@if`).\r\n * The remove control's accessible name comes from a projected\r\n * `[skra-chip-remove-label]` (sr-only; ADR 033 Path 2) — the \"×\" glyph is `aria-hidden`.\r\n */\r\n@Component({\r\n selector: 'skra-chip',\r\n standalone: true,\r\n imports: [SkraChipIcon],\r\n templateUrl: './chip.html',\r\n styleUrl: './chip.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n host: {\r\n // Variant Surface reflection (ADR 035 §3.5; ADR 021 — never [style.--var])\r\n '[attr.data-skra-intent]': 'intent()',\r\n '[attr.data-skra-emphasis]': 'emphasis()',\r\n\r\n // Availability reflection (ADR 027 cat 2; presence boolean). The host is a custom\r\n // element with no native `disabled`, so its reflection is the Forge-semantic\r\n // data-attr; the remove <button> takes the NATIVE `disabled` (native-attr-first).\r\n '[attr.data-skra-disabled]': 'disabled() ? \"\" : null',\r\n\r\n // Smart Slot layout reflection (ADR 020 v2.0 — slot-presence, State-Surface-exempt §3.6)\r\n '[attr.data-skra-has-icon]': 'hasIcon() ? \"\" : null',\r\n },\r\n})\r\nexport class SkraChip {\r\n // --- Variant Surface (ADR 035) ---\r\n readonly intent = input<ChipIntent>('neutral');\r\n readonly emphasis = input<ChipEmphasis>('medium');\r\n\r\n // --- Availability (ADR 027 cat 2) ---\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n\r\n // --- Removal (ADR 037 — consumer-owned presence) ---\r\n readonly removed = output<void>();\r\n\r\n // --- Smart Slots v2.0 (ADR 020) ---\r\n readonly iconSlot = contentChild(SkraChipIcon);\r\n readonly hasIcon = computed(() => !!this.iconSlot());\r\n\r\n protected onRemove(): void {\r\n if (this.disabled()) return;\r\n this.removed.emit();\r\n }\r\n}\r\n","@if (hasIcon()) {\r\n<span class=\"skra-chip-icon\">\r\n <ng-content select=\"[skra-chip-icon]\"></ng-content>\r\n</span>\r\n}\r\n\r\n<span class=\"skra-chip-label\">\r\n <ng-content></ng-content>\r\n</span>\r\n\r\n<button\r\n type=\"button\"\r\n class=\"skra-chip-remove\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"onRemove()\"\r\n>\r\n <svg\r\n class=\"skra-chip-remove-glyph\"\r\n aria-hidden=\"true\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2.5\"\r\n stroke-linecap=\"round\"\r\n >\r\n <path d=\"M18 6 6 18\" />\r\n <path d=\"m6 6 12 12\" />\r\n </svg>\r\n <ng-content select=\"[skra-chip-remove-label]\"></ng-content>\r\n</button>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skra-ui-chip.mjs","sources":["../../../../libs/ui/chip/src/lib/chip.directives.ts","../../../../libs/ui/chip/src/lib/chip/chip.ts","../../../../libs/ui/chip/src/lib/chip/chip.html","../../../../libs/ui/chip/src/skra-ui-chip.ts"],"sourcesContent":["import { Directive } from '@angular/core';\n\n/**\n * Marker directive for the leading icon/dot/avatar slot of `<skra-chip>`.\n * Detected via `contentChild` (ADR 020 Smart Slots v2.0) to toggle the icon\n * wrapper without emitting an empty DOM node. Feedback-local (mirrors\n * `SkraBadgeIcon`/`SkraAlertIcon`) to avoid a cross-lib marker dependency.\n */\n@Directive({\n selector: '[skra-chip-icon]',\n standalone: true,\n})\nexport class SkraChipIcon {}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n contentChild,\n input,\n output,\n} from '@angular/core';\nimport { SkraChipIcon } from '../chip.directives';\n\n/**\n * ChipIntent — semantic meaning (ADR 035 §3.1, downward subset). Excludes the\n * action intents `primary`/`secondary` (meaningless for a status/category pill).\n * Closed enum; extension requires an ADR 035 amendment.\n */\nexport type ChipIntent = 'neutral' | 'info' | 'success' | 'warning' | 'danger';\n\n/**\n * ChipEmphasis — visual loudness within the chosen intent (ADR 035 §3.1, subset).\n * `high` = filled pill, `medium` = soft/tinted. `low` deferred.\n */\nexport type ChipEmphasis = 'high' | 'medium';\n\n/**\n * `<skra-chip>` — a small, inline, **removable** labelled pill (Feedback/Status\n * family, Wave 2): a selected multi-select value, an applied filter, an input tag.\n * The host is a non-interactive presentational pill (the label is plain text, no\n * host role/focus); it contains exactly ONE interactive sub-control — the built-in\n * remove `<button>` (the Alert dismiss precedent).\n *\n * SRP-distinct from `<skra-badge>` (a NON-removable status pill): the remove\n * control is intrinsic to Chip — there is no `removable` flag, because a chip\n * without it would be a Badge. A SELECTABLE/filter chip (a toggle) is a SEPARATE\n * deferred atom (ARCHITECTURE_BACKLOG watch-list), NOT a `selectable` variant —\n * one atom carrying both interaction models is an SRP smell.\n *\n * No `live` axis (unlike Badge/Alert): a chip is an input/selection element, not a\n * status announcer; add/remove announcements are the consumer's own `aria-live`.\n *\n * Removal (ADR 037): the remove control fires `(removed)`. Forge does NOT remove\n * itself from the DOM — the consumer owns removal (splice the bound array / `@if`).\n * The remove control's accessible name comes from a projected\n * `[skra-chip-remove-label]` (sr-only; ADR 033 Path 2) — the \"×\" glyph is `aria-hidden`.\n */\n@Component({\n selector: 'skra-chip',\n standalone: true,\n imports: [SkraChipIcon],\n templateUrl: './chip.html',\n styleUrl: './chip.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n // Variant Surface reflection (ADR 035 §3.5; ADR 021 — never [style.--var])\n '[attr.data-skra-intent]': 'intent()',\n '[attr.data-skra-emphasis]': 'emphasis()',\n\n // Availability reflection (ADR 027 cat 2; presence boolean). The host is a custom\n // element with no native `disabled`, so its reflection is the Forge-semantic\n // data-attr; the remove <button> takes the NATIVE `disabled` (native-attr-first).\n '[attr.data-skra-disabled]': 'disabled() ? \"\" : null',\n\n // Smart Slot layout reflection (ADR 020 v2.0 — slot-presence, State-Surface-exempt §3.6)\n '[attr.data-skra-has-icon]': 'hasIcon() ? \"\" : null',\n },\n})\nexport class SkraChip {\n // --- Variant Surface (ADR 035) ---\n readonly intent = input<ChipIntent>('neutral');\n readonly emphasis = input<ChipEmphasis>('medium');\n\n // --- Availability (ADR 027 cat 2) ---\n readonly disabled = input(false, { transform: booleanAttribute });\n\n // --- Removal (ADR 037 — consumer-owned presence) ---\n readonly removed = output<void>();\n\n // --- Smart Slots v2.0 (ADR 020) ---\n readonly iconSlot = contentChild(SkraChipIcon);\n readonly hasIcon = computed(() => !!this.iconSlot());\n\n protected onRemove(): void {\n if (this.disabled()) return;\n this.removed.emit();\n }\n}\n","@if (hasIcon()) {\r\n<span class=\"skra-chip-icon\">\r\n <ng-content select=\"[skra-chip-icon]\"></ng-content>\r\n</span>\r\n}\r\n\r\n<span class=\"skra-chip-label\">\r\n <ng-content></ng-content>\r\n</span>\r\n\r\n<button\r\n type=\"button\"\r\n class=\"skra-chip-remove\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"onRemove()\"\r\n>\r\n <svg\r\n class=\"skra-chip-remove-glyph\"\r\n aria-hidden=\"true\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2.5\"\r\n stroke-linecap=\"round\"\r\n >\r\n <path d=\"M18 6 6 18\" />\r\n <path d=\"m6 6 12 12\" />\r\n </svg>\r\n <ng-content select=\"[skra-chip-remove-label]\"></ng-content>\r\n</button>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -177,130 +177,130 @@ class SkraCombobox extends _SkraListboxWidgetBase {
177
177
  }
178
178
  }
179
179
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraCombobox, deps: [], target: i0.ɵɵFactoryTarget.Component });
180
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.1", type: SkraCombobox, isStandalone: true, selector: "skra-combobox", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", filterChange: "filterChange" }, host: { properties: { "attr.data-skra-loading": "loading() ? \"\" : null", "attr.data-skra-empty": "!loading() && options().length === 0 ? \"\" : null" } }, providers: [{ provide: SKRA_LISTBOX_PANEL, useExisting: SkraCombobox }], exportAs: ["skraCombobox"], usesInheritance: true, ngImport: i0, template: `
181
- <input
182
- #trigger
183
- class="skra-combobox-input"
184
- type="text"
185
- role="combobox"
186
- autocomplete="off"
187
- aria-autocomplete="list"
188
- aria-haspopup="listbox"
189
- [attr.id]="triggerId()"
190
- [attr.aria-controls]="panelId"
191
- [attr.aria-expanded]="isOpen()"
192
- [attr.aria-activedescendant]="activeOptionId()"
193
- [attr.aria-describedby]="describedBy()"
194
- [attr.aria-invalid]="hasError() ? 'true' : null"
195
- [attr.aria-required]="isRequired() ? 'true' : null"
196
- [attr.aria-busy]="loading() ? 'true' : null"
197
- [attr.placeholder]="placeholder()"
198
- [disabled]="isDisabled()"
199
- [readOnly]="isReadonly()"
200
- [value]="displayValue()"
201
- (focus)="onFocus()"
202
- (input)="onInput($event)"
203
- (keydown)="onTriggerKeydown($event)"
204
- (blur)="onBlur()"
205
- />
206
- <button
207
- class="skra-combobox-toggle"
208
- type="button"
209
- tabindex="-1"
210
- aria-hidden="true"
211
- [disabled]="isDisabled()"
212
- (mousedown)="$event.preventDefault()"
213
- (click)="toggle()"
214
- >
215
- <span class="skra-combobox-arrow" aria-hidden="true"></span>
216
- </button>
217
-
218
- <div
219
- #panel
220
- class="skra-combobox-listbox"
221
- [id]="panelId"
222
- role="listbox"
223
- popover="auto"
224
- (mousedown)="$event.preventDefault()"
225
- (toggle)="onPanelToggle($event)"
226
- >
227
- <!-- ONE persistent live region (text swapped via @if) so loading/empty announce reliably —
228
- a region injected on demand is unreliably spoken (ADR 0049 rule 4). Hidden when empty via
229
- :empty in SCSS. -->
230
- <div class="skra-combobox-status" role="status" aria-live="polite">
231
- @if (loading()) {
232
- <ng-content select="[skraLoadingIndicator]"></ng-content>
233
- <span class="skra-combobox-spinner" aria-hidden="true"></span>
234
- } @else if (options().length === 0) {
235
- <ng-content select="[skraComboboxEmpty]"></ng-content>
236
- }
237
- </div>
238
- <ng-content></ng-content>
239
- </div>
180
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.1", type: SkraCombobox, isStandalone: true, selector: "skra-combobox", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", filterChange: "filterChange" }, host: { properties: { "attr.data-skra-loading": "loading() ? \"\" : null", "attr.data-skra-empty": "!loading() && options().length === 0 ? \"\" : null" } }, providers: [{ provide: SKRA_LISTBOX_PANEL, useExisting: SkraCombobox }], exportAs: ["skraCombobox"], usesInheritance: true, ngImport: i0, template: `
181
+ <input
182
+ #trigger
183
+ class="skra-combobox-input"
184
+ type="text"
185
+ role="combobox"
186
+ autocomplete="off"
187
+ aria-autocomplete="list"
188
+ aria-haspopup="listbox"
189
+ [attr.id]="triggerId()"
190
+ [attr.aria-controls]="panelId"
191
+ [attr.aria-expanded]="isOpen()"
192
+ [attr.aria-activedescendant]="activeOptionId()"
193
+ [attr.aria-describedby]="describedBy()"
194
+ [attr.aria-invalid]="hasError() ? 'true' : null"
195
+ [attr.aria-required]="isRequired() ? 'true' : null"
196
+ [attr.aria-busy]="loading() ? 'true' : null"
197
+ [attr.placeholder]="placeholder()"
198
+ [disabled]="isDisabled()"
199
+ [readOnly]="isReadonly()"
200
+ [value]="displayValue()"
201
+ (focus)="onFocus()"
202
+ (input)="onInput($event)"
203
+ (keydown)="onTriggerKeydown($event)"
204
+ (blur)="onBlur()"
205
+ />
206
+ <button
207
+ class="skra-combobox-toggle"
208
+ type="button"
209
+ tabindex="-1"
210
+ aria-hidden="true"
211
+ [disabled]="isDisabled()"
212
+ (mousedown)="$event.preventDefault()"
213
+ (click)="toggle()"
214
+ >
215
+ <span class="skra-combobox-arrow" aria-hidden="true"></span>
216
+ </button>
217
+
218
+ <div
219
+ #panel
220
+ class="skra-combobox-listbox"
221
+ [id]="panelId"
222
+ role="listbox"
223
+ popover="auto"
224
+ (mousedown)="$event.preventDefault()"
225
+ (toggle)="onPanelToggle($event)"
226
+ >
227
+ <!-- ONE persistent live region (text swapped via @if) so loading/empty announce reliably —
228
+ a region injected on demand is unreliably spoken (ADR 0049 rule 4). Hidden when empty via
229
+ :empty in SCSS. -->
230
+ <div class="skra-combobox-status" role="status" aria-live="polite">
231
+ @if (loading()) {
232
+ <ng-content select="[skraLoadingIndicator]"></ng-content>
233
+ <span class="skra-combobox-spinner" aria-hidden="true"></span>
234
+ } @else if (options().length === 0) {
235
+ <ng-content select="[skraComboboxEmpty]"></ng-content>
236
+ }
237
+ </div>
238
+ <ng-content></ng-content>
239
+ </div>
240
240
  `, isInline: true, styles: ["@charset \"UTF-8\";:host{display:flex;align-items:center;gap:var(--skra-comp-combobox-gap);inline-size:100%;min-block-size:var(--skra-comp-combobox-min-block-size);box-sizing:border-box;margin:0;padding-inline:var(--skra-comp-combobox-padding-inline);background:var(--skra-comp-combobox-background);color:var(--skra-comp-combobox-foreground);border-color:var(--skra-comp-combobox-border-color);border-width:var(--skra-comp-combobox-border-width);border-style:var(--skra-comp-combobox-border-style);border-radius:var(--skra-comp-combobox-radius);box-shadow:var(--skra-comp-combobox-shadow);transition:background-color var(--skra-comp-combobox-motion-duration) var(--skra-comp-combobox-motion-easing),border-color var(--skra-comp-combobox-motion-duration) var(--skra-comp-combobox-motion-easing)}:host:has(.skra-combobox-input:focus-visible){outline:var(--skra-comp-combobox-focus-ring-width) solid var(--skra-comp-combobox-focus-ring-color);outline-offset:.125rem}:host([data-skra-disabled]){background:var(--skra-comp-combobox-background-disabled);color:var(--skra-comp-combobox-foreground-disabled)}:host([data-skra-readonly]){background:var(--skra-comp-combobox-background-readonly)}:host([data-skra-validation=invalid]){border-color:var(--skra-comp-combobox-border-color-validation-invalid)}.skra-combobox-input{flex:1 1 auto;min-inline-size:0;box-sizing:border-box;margin:0;padding-block:var(--skra-comp-combobox-padding-block);padding-inline:0;border:none;background:transparent;color:inherit;appearance:none;outline:none;font-family:var(--skra-sys-typography-role-body-medium-font-family);font-size:var(--skra-sys-typography-role-body-medium-font-size);font-weight:var(--skra-sys-typography-role-body-medium-font-weight);line-height:var(--skra-sys-typography-role-body-medium-line-height);letter-spacing:var(--skra-sys-typography-role-body-medium-letter-spacing)}.skra-combobox-input::placeholder{color:var(--skra-comp-combobox-foreground-disabled)}.skra-combobox-input:disabled{color:var(--skra-comp-combobox-foreground-disabled);cursor:not-allowed}.skra-combobox-toggle{flex:none;display:inline-flex;align-items:center;justify-content:center;inline-size:var(--skra-comp-combobox-arrow-icon-size);block-size:var(--skra-comp-combobox-arrow-icon-size);margin:0;padding:0;border:none;background:transparent;cursor:pointer}.skra-combobox-toggle:disabled{cursor:not-allowed}.skra-combobox-arrow{inline-size:100%;block-size:100%;background-color:var(--skra-comp-combobox-arrow-color);mask:url(\"data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%3E%3Cpath%20d='M6%209l6%206%206-6'%20fill='none'%20stroke='%23000'%20stroke-width='2'/%3E%3C/svg%3E\") no-repeat center/contain;-webkit-mask:url(\"data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%3E%3Cpath%20d='M6%209l6%206%206-6'%20fill='none'%20stroke='%23000'%20stroke-width='2'/%3E%3C/svg%3E\") no-repeat center/contain;transition:transform var(--skra-comp-combobox-motion-duration) var(--skra-comp-combobox-motion-easing)}:host:has(.skra-combobox-input[aria-expanded=true]) .skra-combobox-arrow{transform:rotate(180deg)}.skra-combobox-listbox{position:fixed;margin:0;inset:auto;box-sizing:border-box;padding-block:var(--skra-comp-combobox-panel-padding-block);padding-inline:var(--skra-comp-combobox-panel-padding-inline);background:var(--skra-comp-combobox-panel-background);color:var(--skra-comp-combobox-panel-foreground);border:var(--skra-comp-combobox-border-width) solid var(--skra-comp-combobox-panel-border-color);border-radius:var(--skra-comp-combobox-panel-radius);box-shadow:var(--skra-comp-combobox-panel-shadow);inline-size:max-content;max-block-size:var(--skra-comp-combobox-panel-max-block-size);overflow-y:auto;flex-direction:column;opacity:0;transition:opacity var(--skra-comp-combobox-motion-duration) var(--skra-comp-combobox-motion-easing),display var(--skra-comp-combobox-motion-duration) allow-discrete,overlay var(--skra-comp-combobox-motion-duration) allow-discrete}.skra-combobox-listbox:popover-open{display:flex;opacity:1}@starting-style{.skra-combobox-listbox:popover-open{opacity:0}}.skra-combobox-status{display:flex;align-items:center;gap:var(--skra-comp-combobox-gap);padding-block:var(--skra-comp-combobox-status-padding-block);padding-inline:var(--skra-comp-combobox-status-padding-inline);font-family:var(--skra-sys-typography-role-body-small-font-family);font-size:var(--skra-sys-typography-role-body-small-font-size);font-weight:var(--skra-sys-typography-role-body-small-font-weight);line-height:var(--skra-sys-typography-role-body-small-line-height);letter-spacing:var(--skra-sys-typography-role-body-small-letter-spacing)}.skra-combobox-status:empty{display:none}:host([data-skra-empty]) .skra-combobox-status{color:var(--skra-comp-combobox-empty-foreground)}.skra-combobox-status:has([skraLoadingIndicator]) .skra-combobox-spinner{display:none}.skra-combobox-spinner{flex:none;inline-size:1em;block-size:1em;border:.125rem solid var(--skra-comp-combobox-loading-indicator-color);border-block-start-color:transparent;border-radius:50%;animation:skra-combobox-spin .6s linear infinite}@keyframes skra-combobox-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){:host,.skra-combobox-arrow,.skra-combobox-listbox{transition-duration:0ms}.skra-combobox-spinner{animation-duration:0ms}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
241
241
  }
242
242
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraCombobox, decorators: [{
243
243
  type: Component,
244
- args: [{ selector: 'skra-combobox', standalone: true, exportAs: 'skraCombobox', template: `
245
- <input
246
- #trigger
247
- class="skra-combobox-input"
248
- type="text"
249
- role="combobox"
250
- autocomplete="off"
251
- aria-autocomplete="list"
252
- aria-haspopup="listbox"
253
- [attr.id]="triggerId()"
254
- [attr.aria-controls]="panelId"
255
- [attr.aria-expanded]="isOpen()"
256
- [attr.aria-activedescendant]="activeOptionId()"
257
- [attr.aria-describedby]="describedBy()"
258
- [attr.aria-invalid]="hasError() ? 'true' : null"
259
- [attr.aria-required]="isRequired() ? 'true' : null"
260
- [attr.aria-busy]="loading() ? 'true' : null"
261
- [attr.placeholder]="placeholder()"
262
- [disabled]="isDisabled()"
263
- [readOnly]="isReadonly()"
264
- [value]="displayValue()"
265
- (focus)="onFocus()"
266
- (input)="onInput($event)"
267
- (keydown)="onTriggerKeydown($event)"
268
- (blur)="onBlur()"
269
- />
270
- <button
271
- class="skra-combobox-toggle"
272
- type="button"
273
- tabindex="-1"
274
- aria-hidden="true"
275
- [disabled]="isDisabled()"
276
- (mousedown)="$event.preventDefault()"
277
- (click)="toggle()"
278
- >
279
- <span class="skra-combobox-arrow" aria-hidden="true"></span>
280
- </button>
281
-
282
- <div
283
- #panel
284
- class="skra-combobox-listbox"
285
- [id]="panelId"
286
- role="listbox"
287
- popover="auto"
288
- (mousedown)="$event.preventDefault()"
289
- (toggle)="onPanelToggle($event)"
290
- >
291
- <!-- ONE persistent live region (text swapped via @if) so loading/empty announce reliably —
292
- a region injected on demand is unreliably spoken (ADR 0049 rule 4). Hidden when empty via
293
- :empty in SCSS. -->
294
- <div class="skra-combobox-status" role="status" aria-live="polite">
295
- @if (loading()) {
296
- <ng-content select="[skraLoadingIndicator]"></ng-content>
297
- <span class="skra-combobox-spinner" aria-hidden="true"></span>
298
- } @else if (options().length === 0) {
299
- <ng-content select="[skraComboboxEmpty]"></ng-content>
300
- }
301
- </div>
302
- <ng-content></ng-content>
303
- </div>
244
+ args: [{ selector: 'skra-combobox', standalone: true, exportAs: 'skraCombobox', template: `
245
+ <input
246
+ #trigger
247
+ class="skra-combobox-input"
248
+ type="text"
249
+ role="combobox"
250
+ autocomplete="off"
251
+ aria-autocomplete="list"
252
+ aria-haspopup="listbox"
253
+ [attr.id]="triggerId()"
254
+ [attr.aria-controls]="panelId"
255
+ [attr.aria-expanded]="isOpen()"
256
+ [attr.aria-activedescendant]="activeOptionId()"
257
+ [attr.aria-describedby]="describedBy()"
258
+ [attr.aria-invalid]="hasError() ? 'true' : null"
259
+ [attr.aria-required]="isRequired() ? 'true' : null"
260
+ [attr.aria-busy]="loading() ? 'true' : null"
261
+ [attr.placeholder]="placeholder()"
262
+ [disabled]="isDisabled()"
263
+ [readOnly]="isReadonly()"
264
+ [value]="displayValue()"
265
+ (focus)="onFocus()"
266
+ (input)="onInput($event)"
267
+ (keydown)="onTriggerKeydown($event)"
268
+ (blur)="onBlur()"
269
+ />
270
+ <button
271
+ class="skra-combobox-toggle"
272
+ type="button"
273
+ tabindex="-1"
274
+ aria-hidden="true"
275
+ [disabled]="isDisabled()"
276
+ (mousedown)="$event.preventDefault()"
277
+ (click)="toggle()"
278
+ >
279
+ <span class="skra-combobox-arrow" aria-hidden="true"></span>
280
+ </button>
281
+
282
+ <div
283
+ #panel
284
+ class="skra-combobox-listbox"
285
+ [id]="panelId"
286
+ role="listbox"
287
+ popover="auto"
288
+ (mousedown)="$event.preventDefault()"
289
+ (toggle)="onPanelToggle($event)"
290
+ >
291
+ <!-- ONE persistent live region (text swapped via @if) so loading/empty announce reliably —
292
+ a region injected on demand is unreliably spoken (ADR 0049 rule 4). Hidden when empty via
293
+ :empty in SCSS. -->
294
+ <div class="skra-combobox-status" role="status" aria-live="polite">
295
+ @if (loading()) {
296
+ <ng-content select="[skraLoadingIndicator]"></ng-content>
297
+ <span class="skra-combobox-spinner" aria-hidden="true"></span>
298
+ } @else if (options().length === 0) {
299
+ <ng-content select="[skraComboboxEmpty]"></ng-content>
300
+ }
301
+ </div>
302
+ <ng-content></ng-content>
303
+ </div>
304
304
  `, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, host: {
305
305
  '[attr.data-skra-loading]': 'loading() ? "" : null',
306
306
  '[attr.data-skra-empty]': '!loading() && options().length === 0 ? "" : null',