@skra/ui 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -201
- package/NOTICE +7 -7
- package/README.md +39 -39
- package/consumer-guide/README.md +84 -84
- package/consumer-guide/forms-and-binding.md +19 -3
- package/consumer-guide/layout.md +19 -0
- package/consumer-guide/overlays.md +100 -100
- package/consumer-guide/setup-and-gotchas.md +165 -103
- package/consumer-guide/theming-and-encapsulation.md +129 -115
- package/fesm2022/skra-ui-accordion.mjs +61 -43
- package/fesm2022/skra-ui-accordion.mjs.map +1 -1
- package/fesm2022/skra-ui-alert.mjs +26 -18
- package/fesm2022/skra-ui-alert.mjs.map +1 -1
- package/fesm2022/skra-ui-avatar.mjs +12 -8
- package/fesm2022/skra-ui-avatar.mjs.map +1 -1
- package/fesm2022/skra-ui-badge.mjs +19 -13
- package/fesm2022/skra-ui-badge.mjs.map +1 -1
- package/fesm2022/skra-ui-button.mjs +28 -19
- package/fesm2022/skra-ui-button.mjs.map +1 -1
- package/fesm2022/skra-ui-checkbox.mjs +3 -3
- package/fesm2022/skra-ui-checkbox.mjs.map +1 -1
- package/fesm2022/skra-ui-chip.mjs +15 -11
- package/fesm2022/skra-ui-chip.mjs.map +1 -1
- package/fesm2022/skra-ui-combobox.mjs +135 -130
- package/fesm2022/skra-ui-combobox.mjs.map +1 -1
- package/fesm2022/skra-ui-core.mjs +95 -73
- package/fesm2022/skra-ui-core.mjs.map +1 -1
- package/fesm2022/skra-ui-counter.mjs +9 -6
- package/fesm2022/skra-ui-counter.mjs.map +1 -1
- package/fesm2022/skra-ui-datepicker.mjs +334 -307
- package/fesm2022/skra-ui-datepicker.mjs.map +1 -1
- package/fesm2022/skra-ui-dialog.mjs +5 -4
- package/fesm2022/skra-ui-dialog.mjs.map +1 -1
- package/fesm2022/skra-ui-field.mjs +44 -34
- package/fesm2022/skra-ui-field.mjs.map +1 -1
- package/fesm2022/skra-ui-icon.mjs +5 -4
- package/fesm2022/skra-ui-icon.mjs.map +1 -1
- package/fesm2022/skra-ui-input.mjs +53 -12
- package/fesm2022/skra-ui-input.mjs.map +1 -1
- package/fesm2022/skra-ui-kbd.mjs +3 -3
- package/fesm2022/skra-ui-kbd.mjs.map +1 -1
- package/fesm2022/skra-ui-layout.mjs +33 -21
- package/fesm2022/skra-ui-layout.mjs.map +1 -1
- package/fesm2022/skra-ui-link.mjs +3 -3
- package/fesm2022/skra-ui-link.mjs.map +1 -1
- package/fesm2022/skra-ui-loading-indicator.mjs +3 -3
- package/fesm2022/skra-ui-loading-indicator.mjs.map +1 -1
- package/fesm2022/skra-ui-menu.mjs +8 -7
- package/fesm2022/skra-ui-menu.mjs.map +1 -1
- package/fesm2022/skra-ui-multi-select.mjs +102 -98
- package/fesm2022/skra-ui-multi-select.mjs.map +1 -1
- package/fesm2022/skra-ui-native-select.mjs +35 -17
- package/fesm2022/skra-ui-native-select.mjs.map +1 -1
- package/fesm2022/skra-ui-popover.mjs +5 -4
- package/fesm2022/skra-ui-popover.mjs.map +1 -1
- package/fesm2022/skra-ui-progress.mjs +7 -5
- package/fesm2022/skra-ui-progress.mjs.map +1 -1
- package/fesm2022/skra-ui-radio.mjs +3 -3
- package/fesm2022/skra-ui-radio.mjs.map +1 -1
- package/fesm2022/skra-ui-rating-display.mjs +14 -9
- package/fesm2022/skra-ui-rating-display.mjs.map +1 -1
- package/fesm2022/skra-ui-select.mjs +98 -95
- package/fesm2022/skra-ui-select.mjs.map +1 -1
- package/fesm2022/skra-ui-skeleton.mjs +16 -13
- package/fesm2022/skra-ui-skeleton.mjs.map +1 -1
- package/fesm2022/skra-ui-star-rating.mjs +18 -11
- package/fesm2022/skra-ui-star-rating.mjs.map +1 -1
- package/fesm2022/skra-ui-status-dot.mjs +7 -5
- package/fesm2022/skra-ui-status-dot.mjs.map +1 -1
- package/fesm2022/skra-ui-switch.mjs +3 -3
- package/fesm2022/skra-ui-switch.mjs.map +1 -1
- package/fesm2022/skra-ui-tabs.mjs +43 -29
- package/fesm2022/skra-ui-tabs.mjs.map +1 -1
- package/fesm2022/skra-ui-textarea.mjs +41 -15
- package/fesm2022/skra-ui-textarea.mjs.map +1 -1
- package/fesm2022/skra-ui-toast.mjs +35 -23
- package/fesm2022/skra-ui-toast.mjs.map +1 -1
- package/fesm2022/skra-ui-tooltip.mjs +12 -9
- package/fesm2022/skra-ui-tooltip.mjs.map +1 -1
- package/fesm2022/skra-ui-typography.mjs +9 -6
- package/fesm2022/skra-ui-typography.mjs.map +1 -1
- package/package.json +5 -5
- package/types/skra-ui-input.d.ts +24 -1
- package/types/skra-ui-input.d.ts.map +1 -1
- package/types/skra-ui-native-select.d.ts +9 -1
- package/types/skra-ui-native-select.d.ts.map +1 -1
- package/types/skra-ui-textarea.d.ts +10 -1
- package/types/skra-ui-textarea.d.ts.map +1 -1
|
@@ -23,9 +23,11 @@ class SkraAccordionContext {
|
|
|
23
23
|
/** Unique per `[skraAccordion]` — the prefix for every header/panel id in this group. */
|
|
24
24
|
baseId = `skra-accordion-${++accordionInstanceCounter}`;
|
|
25
25
|
/** Mirror of the consumer's `[expanded]` — the set of OPEN item values (read-only to children). */
|
|
26
|
-
expanded = signal([],
|
|
26
|
+
expanded = signal([], /* @ts-ignore */
|
|
27
|
+
...(ngDevMode ? [{ debugName: "expanded" }] : /* istanbul ignore next */ []));
|
|
27
28
|
/** Mirror of the consumer's `[exclusive]` policy (read-only to children). */
|
|
28
|
-
exclusive = signal(false,
|
|
29
|
+
exclusive = signal(false, /* @ts-ignore */
|
|
30
|
+
...(ngDevMode ? [{ debugName: "exclusive" }] : /* istanbul ignore next */ []));
|
|
29
31
|
headerId(value) {
|
|
30
32
|
return `${this.baseId}-header-${idSafe(value)}`;
|
|
31
33
|
}
|
|
@@ -38,10 +40,10 @@ class SkraAccordionContext {
|
|
|
38
40
|
/** Coordinator-assigned: a header requests a toggle; the coordinator resolves the next
|
|
39
41
|
* open-set (applying the exclusive policy) and emits `(expandedChange)` — never mutated here. */
|
|
40
42
|
toggle = () => undefined;
|
|
41
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
42
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
43
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraAccordionContext, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
44
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraAccordionContext });
|
|
43
45
|
}
|
|
44
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
46
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraAccordionContext, decorators: [{
|
|
45
47
|
type: Injectable
|
|
46
48
|
}] });
|
|
47
49
|
|
|
@@ -65,11 +67,15 @@ class SkraAccordionItemContext {
|
|
|
65
67
|
*/
|
|
66
68
|
class SkraAccordionItem {
|
|
67
69
|
/** The item key — matched against `[expanded]` and the id base for its header/panel. */
|
|
68
|
-
value = input.required(
|
|
70
|
+
value = input.required(/* @ts-ignore */
|
|
71
|
+
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
69
72
|
group = inject(SkraAccordionContext, { optional: true });
|
|
70
|
-
expanded = computed(() => this.group?.isExpanded(this.value()) ?? false,
|
|
71
|
-
|
|
72
|
-
|
|
73
|
+
expanded = computed(() => this.group?.isExpanded(this.value()) ?? false, /* @ts-ignore */
|
|
74
|
+
...(ngDevMode ? [{ debugName: "expanded" }] : /* istanbul ignore next */ []));
|
|
75
|
+
headerId = computed(() => this.group?.headerId(this.value()) ?? null, /* @ts-ignore */
|
|
76
|
+
...(ngDevMode ? [{ debugName: "headerId" }] : /* istanbul ignore next */ []));
|
|
77
|
+
panelId = computed(() => this.group?.panelId(this.value()) ?? null, /* @ts-ignore */
|
|
78
|
+
...(ngDevMode ? [{ debugName: "panelId" }] : /* istanbul ignore next */ []));
|
|
73
79
|
toggle() {
|
|
74
80
|
this.group?.toggle(this.value());
|
|
75
81
|
}
|
|
@@ -81,12 +87,12 @@ class SkraAccordionItem {
|
|
|
81
87
|
}
|
|
82
88
|
}
|
|
83
89
|
}
|
|
84
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
85
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "
|
|
90
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraAccordionItem, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
91
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.1", type: SkraAccordionItem, isStandalone: true, selector: "[skraAccordionItem]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null } }, host: { properties: { "attr.data-skra-expanded": "expanded() ? \"\" : null" } }, providers: [
|
|
86
92
|
{ provide: SkraAccordionItemContext, useExisting: SkraAccordionItem },
|
|
87
93
|
], exportAs: ["skraAccordionItem"], ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: ["@charset \"UTF-8\";:host{display:block;margin:0;box-sizing:border-box;border-block-start:var(--skra-comp-accordion-item-divider-width) solid var(--skra-comp-accordion-item-divider-color)}:host(:first-child){border-block-start-width:0}:host([data-skra-expanded]){background:var(--skra-comp-accordion-item-background-expanded)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
88
94
|
}
|
|
89
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
95
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraAccordionItem, decorators: [{
|
|
90
96
|
type: Component,
|
|
91
97
|
args: [{ selector: '[skraAccordionItem]', standalone: true, exportAs: 'skraAccordionItem', template: '<ng-content></ng-content>', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, providers: [
|
|
92
98
|
{ provide: SkraAccordionItemContext, useExisting: SkraAccordionItem },
|
|
@@ -120,7 +126,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImpor
|
|
|
120
126
|
*/
|
|
121
127
|
class SkraAccordion {
|
|
122
128
|
/** Consumer-owned set of OPEN item values (ADR 037). `[]` = all closed; order irrelevant. */
|
|
123
|
-
expanded = input([],
|
|
129
|
+
expanded = input([], /* @ts-ignore */
|
|
130
|
+
...(ngDevMode ? [{ debugName: "expanded" }] : /* istanbul ignore next */ []));
|
|
124
131
|
/** Policy: `true` → opening one item emits a set that drops the others (single-open). */
|
|
125
132
|
exclusive = input(false, { ...(ngDevMode ? { debugName: "exclusive" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
126
133
|
/** Fires ONLY on user toggle — never on a programmatic `[expanded]` change. Carries the resolved next set. */
|
|
@@ -162,10 +169,10 @@ class SkraAccordion {
|
|
|
162
169
|
seen.add(v);
|
|
163
170
|
}
|
|
164
171
|
}
|
|
165
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
166
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "
|
|
172
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraAccordion, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
173
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.1.1", type: SkraAccordion, isStandalone: true, selector: "[skraAccordion]", inputs: { expanded: { classPropertyName: "expanded", publicName: "expanded", isSignal: true, isRequired: false, transformFunction: null }, exclusive: { classPropertyName: "exclusive", publicName: "exclusive", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { expandedChange: "expandedChange" }, providers: [SkraAccordionContext], queries: [{ propertyName: "items", predicate: SkraAccordionItem, descendants: true, isSignal: true }], exportAs: ["skraAccordion"], ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: ["@charset \"UTF-8\";:host{display:block;margin:0;box-sizing:border-box;background:var(--skra-comp-accordion-root-background);border-width:var(--skra-comp-accordion-root-border-width);border-style:solid;border-color:var(--skra-comp-accordion-root-border-color);border-radius:var(--skra-comp-accordion-root-radius);overflow:hidden}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
167
174
|
}
|
|
168
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
175
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraAccordion, decorators: [{
|
|
169
176
|
type: Component,
|
|
170
177
|
args: [{ selector: '[skraAccordion]', standalone: true, exportAs: 'skraAccordion', template: '<ng-content></ng-content>', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, providers: [SkraAccordionContext], styles: ["@charset \"UTF-8\";:host{display:block;margin:0;box-sizing:border-box;background:var(--skra-comp-accordion-root-background);border-width:var(--skra-comp-accordion-root-border-width);border-style:solid;border-color:var(--skra-comp-accordion-root-border-color);border-radius:var(--skra-comp-accordion-root-radius);overflow:hidden}\n"] }]
|
|
171
178
|
}], ctorParameters: () => [], propDecorators: { expanded: [{ type: i0.Input, args: [{ isSignal: true, alias: "expanded", required: false }] }], exclusive: [{ type: i0.Input, args: [{ isSignal: true, alias: "exclusive", required: false }] }], expandedChange: [{ type: i0.Output, args: ["expandedChange"] }], items: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => SkraAccordionItem), { ...{
|
|
@@ -197,10 +204,10 @@ class SkraAccordionHeader {
|
|
|
197
204
|
}
|
|
198
205
|
}
|
|
199
206
|
}
|
|
200
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
201
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
|
|
207
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraAccordionHeader, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
208
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.1", type: SkraAccordionHeader, isStandalone: true, selector: "[skraAccordionHeader]", exportAs: ["skraAccordionHeader"], ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: ["@charset \"UTF-8\";:host{display:block;margin:0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
202
209
|
}
|
|
203
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
210
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraAccordionHeader, decorators: [{
|
|
204
211
|
type: Component,
|
|
205
212
|
args: [{ selector: '[skraAccordionHeader]', standalone: true, exportAs: 'skraAccordionHeader', template: '<ng-content></ng-content>', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, styles: ["@charset \"UTF-8\";:host{display:block;margin:0}\n"] }]
|
|
206
213
|
}], ctorParameters: () => [] });
|
|
@@ -212,10 +219,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImpor
|
|
|
212
219
|
* Button/Chip per-lib marker) to avoid a cross-lib marker dependency.
|
|
213
220
|
*/
|
|
214
221
|
class SkraAccordionStart {
|
|
215
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
216
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
222
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraAccordionStart, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
223
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.1", type: SkraAccordionStart, isStandalone: true, selector: "[skra-start]", ngImport: i0 });
|
|
217
224
|
}
|
|
218
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
225
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraAccordionStart, decorators: [{
|
|
219
226
|
type: Directive,
|
|
220
227
|
args: [{
|
|
221
228
|
selector: '[skra-start]',
|
|
@@ -228,10 +235,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImpor
|
|
|
228
235
|
* idiom — here a presentation override, NOT the loading primitive).
|
|
229
236
|
*/
|
|
230
237
|
class SkraAccordionIndicator {
|
|
231
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
232
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
238
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraAccordionIndicator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
239
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.1", type: SkraAccordionIndicator, isStandalone: true, selector: "[skra-accordion-indicator]", ngImport: i0 });
|
|
233
240
|
}
|
|
234
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
241
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraAccordionIndicator, decorators: [{
|
|
235
242
|
type: Directive,
|
|
236
243
|
args: [{
|
|
237
244
|
selector: '[skra-accordion-indicator]',
|
|
@@ -255,15 +262,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImpor
|
|
|
255
262
|
class SkraAccordionTrigger {
|
|
256
263
|
ctx = inject(SkraAccordionItemContext, { optional: true });
|
|
257
264
|
// Smart Slots v2.0 (ADR 020)
|
|
258
|
-
startSlot = contentChild(SkraAccordionStart,
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
265
|
+
startSlot = contentChild(SkraAccordionStart, /* @ts-ignore */
|
|
266
|
+
...(ngDevMode ? [{ debugName: "startSlot" }] : /* istanbul ignore next */ []));
|
|
267
|
+
indicatorSlot = contentChild(SkraAccordionIndicator, /* @ts-ignore */
|
|
268
|
+
...(ngDevMode ? [{ debugName: "indicatorSlot" }] : /* istanbul ignore next */ []));
|
|
269
|
+
hasStart = computed(() => !!this.startSlot(), /* @ts-ignore */
|
|
270
|
+
...(ngDevMode ? [{ debugName: "hasStart" }] : /* istanbul ignore next */ []));
|
|
271
|
+
hasIndicator = computed(() => !!this.indicatorSlot(), /* @ts-ignore */
|
|
272
|
+
...(ngDevMode ? [{ debugName: "hasIndicator" }] : /* istanbul ignore next */ []));
|
|
262
273
|
// Derived id / state from the item context (null only on standalone misuse)
|
|
263
|
-
headerId = computed(() => this.ctx?.headerId() ?? null,
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
274
|
+
headerId = computed(() => this.ctx?.headerId() ?? null, /* @ts-ignore */
|
|
275
|
+
...(ngDevMode ? [{ debugName: "headerId" }] : /* istanbul ignore next */ []));
|
|
276
|
+
panelId = computed(() => this.ctx?.panelId() ?? null, /* @ts-ignore */
|
|
277
|
+
...(ngDevMode ? [{ debugName: "panelId" }] : /* istanbul ignore next */ []));
|
|
278
|
+
ariaExpanded = computed(() => this.ctx ? (this.ctx.expanded() ? 'true' : 'false') : null, /* @ts-ignore */
|
|
279
|
+
...(ngDevMode ? [{ debugName: "ariaExpanded" }] : /* istanbul ignore next */ []));
|
|
280
|
+
expandedAttr = computed(() => this.ctx?.expanded() ? '' : null, /* @ts-ignore */
|
|
281
|
+
...(ngDevMode ? [{ debugName: "expandedAttr" }] : /* istanbul ignore next */ []));
|
|
267
282
|
onClick() {
|
|
268
283
|
this.ctx?.toggle();
|
|
269
284
|
}
|
|
@@ -275,10 +290,10 @@ class SkraAccordionTrigger {
|
|
|
275
290
|
}
|
|
276
291
|
}
|
|
277
292
|
}
|
|
278
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
279
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
293
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraAccordionTrigger, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
294
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.1", type: SkraAccordionTrigger, isStandalone: true, selector: "button[skraAccordionTrigger]", host: { attributes: { "type": "button" }, listeners: { "click": "onClick()" }, properties: { "attr.id": "headerId()", "attr.aria-controls": "panelId()", "attr.aria-expanded": "ariaExpanded()", "attr.data-skra-expanded": "expandedAttr()", "attr.data-skra-has-start": "hasStart() ? \"\" : null" } }, queries: [{ propertyName: "startSlot", first: true, predicate: SkraAccordionStart, descendants: true, isSignal: true }, { propertyName: "indicatorSlot", first: true, predicate: SkraAccordionIndicator, descendants: true, isSignal: true }], exportAs: ["skraAccordionTrigger"], ngImport: i0, template: "@if (hasStart()) {\r\n<span class=\"skra-accordion-trigger-start\">\r\n <ng-content select=\"[skra-start]\"></ng-content>\r\n</span>\r\n}\r\n\r\n<span class=\"skra-accordion-trigger-label\">\r\n <ng-content></ng-content>\r\n</span>\r\n\r\n@if (hasIndicator()) {\r\n<span class=\"skra-accordion-trigger-indicator\">\r\n <ng-content select=\"[skra-accordion-indicator]\"></ng-content>\r\n</span>\r\n} @else {\r\n<span\r\n class=\"skra-accordion-trigger-indicator\"\r\n data-skra-accordion-indicator\r\n aria-hidden=\"true\"\r\n></span>\r\n}\r\n", styles: ["@charset \"UTF-8\";:host{display:flex;align-items:center;gap:var(--skra-comp-accordion-header-gap);inline-size:100%;min-block-size:var(--skra-comp-accordion-min-block-size);margin:0;box-sizing:border-box;cursor:pointer;text-align:start;background:var(--skra-comp-accordion-background);color:var(--skra-comp-accordion-foreground);border-width:var(--skra-comp-accordion-border-width);border-style:var(--skra-comp-accordion-border-style);border-color:var(--skra-comp-accordion-border-color);border-radius:var(--skra-comp-accordion-radius);padding-block:var(--skra-comp-accordion-padding-block);padding-inline:var(--skra-comp-accordion-padding-inline);box-shadow:var(--skra-comp-accordion-shadow);font-family:var(--skra-sys-typography-role-label-large-font-family);font-size:var(--skra-sys-typography-role-label-large-font-size);font-weight:var(--skra-sys-typography-role-label-large-font-weight);line-height:var(--skra-sys-typography-role-label-large-line-height);letter-spacing:var(--skra-sys-typography-role-label-large-letter-spacing);transition:background var(--skra-comp-accordion-motion-duration) var(--skra-comp-accordion-motion-easing),color var(--skra-comp-accordion-motion-duration) var(--skra-comp-accordion-motion-easing)}:host(:hover){background:var(--skra-comp-accordion-header-background-hover)}:host(:focus-visible){outline-style:solid;outline-color:var(--skra-comp-accordion-focus-ring-color);outline-width:var(--skra-comp-accordion-focus-ring-width);outline-offset:-2px}:host([aria-expanded=true]){color:var(--skra-comp-accordion-header-foreground-expanded)}.skra-accordion-trigger-start{display:inline-flex;flex-shrink:0;align-items:center;block-size:1lh;--skra-comp-icon-size: var(--skra-comp-accordion-icon-size)}.skra-accordion-trigger-label{flex:1 1 auto;min-inline-size:0}.skra-accordion-trigger-indicator{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;inline-size:var(--skra-comp-accordion-indicator-size);block-size:var(--skra-comp-accordion-indicator-size);color:var(--skra-comp-accordion-indicator-color);transition:transform var(--skra-comp-accordion-motion-duration) var(--skra-comp-accordion-motion-easing)}.skra-accordion-trigger-indicator[data-skra-accordion-indicator]:before{content:\"\";inline-size:.5em;block-size:.5em;border-inline-end:.125em solid currentColor;border-block-end:.125em solid currentColor;transform:translateY(-.15em) rotate(45deg)}:host([aria-expanded=true]) .skra-accordion-trigger-indicator{transform:rotate(180deg)}@media(prefers-reduced-motion:reduce){:host{transition:none}.skra-accordion-trigger-indicator{transition:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
280
295
|
}
|
|
281
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
296
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraAccordionTrigger, decorators: [{
|
|
282
297
|
type: Component,
|
|
283
298
|
args: [{ selector: 'button[skraAccordionTrigger]', standalone: true, exportAs: 'skraAccordionTrigger', imports: [SkraAccordionStart, SkraAccordionIndicator], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, host: {
|
|
284
299
|
type: 'button', // never an implicit submit if the accordion sits inside a <form>
|
|
@@ -288,7 +303,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImpor
|
|
|
288
303
|
'[attr.data-skra-expanded]': 'expandedAttr()',
|
|
289
304
|
'[attr.data-skra-has-start]': 'hasStart() ? "" : null',
|
|
290
305
|
'(click)': 'onClick()',
|
|
291
|
-
}, template: "@if (hasStart()) {\n<span class=\"skra-accordion-trigger-start\">\n <ng-content select=\"[skra-start]\"></ng-content>\n</span>\n}\n\n<span class=\"skra-accordion-trigger-label\">\n <ng-content></ng-content>\n</span>\n\n@if (hasIndicator()) {\n<span class=\"skra-accordion-trigger-indicator\">\n <ng-content select=\"[skra-accordion-indicator]\"></ng-content>\n</span>\n} @else {\n<span\n class=\"skra-accordion-trigger-indicator\"\n data-skra-accordion-indicator\n aria-hidden=\"true\"\n></span>\n}\n", styles: ["@charset \"UTF-8\";:host{display:flex;align-items:center;gap:var(--skra-comp-accordion-header-gap);inline-size:100%;min-block-size:var(--skra-comp-accordion-min-block-size);margin:0;box-sizing:border-box;cursor:pointer;text-align:start;background:var(--skra-comp-accordion-background);color:var(--skra-comp-accordion-foreground);border-width:var(--skra-comp-accordion-border-width);border-style:var(--skra-comp-accordion-border-style);border-color:var(--skra-comp-accordion-border-color);border-radius:var(--skra-comp-accordion-radius);padding-block:var(--skra-comp-accordion-padding-block);padding-inline:var(--skra-comp-accordion-padding-inline);box-shadow:var(--skra-comp-accordion-shadow);font-family:var(--skra-sys-typography-role-label-large-font-family);font-size:var(--skra-sys-typography-role-label-large-font-size);font-weight:var(--skra-sys-typography-role-label-large-font-weight);line-height:var(--skra-sys-typography-role-label-large-line-height);letter-spacing:var(--skra-sys-typography-role-label-large-letter-spacing);transition:background var(--skra-comp-accordion-motion-duration) var(--skra-comp-accordion-motion-easing),color var(--skra-comp-accordion-motion-duration) var(--skra-comp-accordion-motion-easing)}:host(:hover){background:var(--skra-comp-accordion-header-background-hover)}:host(:focus-visible){outline-style:solid;outline-color:var(--skra-comp-accordion-focus-ring-color);outline-width:var(--skra-comp-accordion-focus-ring-width);outline-offset:-2px}:host([aria-expanded=true]){color:var(--skra-comp-accordion-header-foreground-expanded)}.skra-accordion-trigger-start{display:inline-flex;flex-shrink:0;align-items:center;block-size:1lh;--skra-comp-icon-size: var(--skra-comp-accordion-icon-size)}.skra-accordion-trigger-label{flex:1 1 auto;min-inline-size:0}.skra-accordion-trigger-indicator{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;inline-size:var(--skra-comp-accordion-indicator-size);block-size:var(--skra-comp-accordion-indicator-size);color:var(--skra-comp-accordion-indicator-color);transition:transform var(--skra-comp-accordion-motion-duration) var(--skra-comp-accordion-motion-easing)}.skra-accordion-trigger-indicator[data-skra-accordion-indicator]:before{content:\"\";inline-size:.5em;block-size:.5em;border-inline-end:.125em solid currentColor;border-block-end:.125em solid currentColor;transform:translateY(-.15em) rotate(45deg)}:host([aria-expanded=true]) .skra-accordion-trigger-indicator{transform:rotate(180deg)}@media(prefers-reduced-motion:reduce){:host{transition:none}.skra-accordion-trigger-indicator{transition:none}}\n"] }]
|
|
306
|
+
}, template: "@if (hasStart()) {\r\n<span class=\"skra-accordion-trigger-start\">\r\n <ng-content select=\"[skra-start]\"></ng-content>\r\n</span>\r\n}\r\n\r\n<span class=\"skra-accordion-trigger-label\">\r\n <ng-content></ng-content>\r\n</span>\r\n\r\n@if (hasIndicator()) {\r\n<span class=\"skra-accordion-trigger-indicator\">\r\n <ng-content select=\"[skra-accordion-indicator]\"></ng-content>\r\n</span>\r\n} @else {\r\n<span\r\n class=\"skra-accordion-trigger-indicator\"\r\n data-skra-accordion-indicator\r\n aria-hidden=\"true\"\r\n></span>\r\n}\r\n", styles: ["@charset \"UTF-8\";:host{display:flex;align-items:center;gap:var(--skra-comp-accordion-header-gap);inline-size:100%;min-block-size:var(--skra-comp-accordion-min-block-size);margin:0;box-sizing:border-box;cursor:pointer;text-align:start;background:var(--skra-comp-accordion-background);color:var(--skra-comp-accordion-foreground);border-width:var(--skra-comp-accordion-border-width);border-style:var(--skra-comp-accordion-border-style);border-color:var(--skra-comp-accordion-border-color);border-radius:var(--skra-comp-accordion-radius);padding-block:var(--skra-comp-accordion-padding-block);padding-inline:var(--skra-comp-accordion-padding-inline);box-shadow:var(--skra-comp-accordion-shadow);font-family:var(--skra-sys-typography-role-label-large-font-family);font-size:var(--skra-sys-typography-role-label-large-font-size);font-weight:var(--skra-sys-typography-role-label-large-font-weight);line-height:var(--skra-sys-typography-role-label-large-line-height);letter-spacing:var(--skra-sys-typography-role-label-large-letter-spacing);transition:background var(--skra-comp-accordion-motion-duration) var(--skra-comp-accordion-motion-easing),color var(--skra-comp-accordion-motion-duration) var(--skra-comp-accordion-motion-easing)}:host(:hover){background:var(--skra-comp-accordion-header-background-hover)}:host(:focus-visible){outline-style:solid;outline-color:var(--skra-comp-accordion-focus-ring-color);outline-width:var(--skra-comp-accordion-focus-ring-width);outline-offset:-2px}:host([aria-expanded=true]){color:var(--skra-comp-accordion-header-foreground-expanded)}.skra-accordion-trigger-start{display:inline-flex;flex-shrink:0;align-items:center;block-size:1lh;--skra-comp-icon-size: var(--skra-comp-accordion-icon-size)}.skra-accordion-trigger-label{flex:1 1 auto;min-inline-size:0}.skra-accordion-trigger-indicator{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;inline-size:var(--skra-comp-accordion-indicator-size);block-size:var(--skra-comp-accordion-indicator-size);color:var(--skra-comp-accordion-indicator-color);transition:transform var(--skra-comp-accordion-motion-duration) var(--skra-comp-accordion-motion-easing)}.skra-accordion-trigger-indicator[data-skra-accordion-indicator]:before{content:\"\";inline-size:.5em;block-size:.5em;border-inline-end:.125em solid currentColor;border-block-end:.125em solid currentColor;transform:translateY(-.15em) rotate(45deg)}:host([aria-expanded=true]) .skra-accordion-trigger-indicator{transform:rotate(180deg)}@media(prefers-reduced-motion:reduce){:host{transition:none}.skra-accordion-trigger-indicator{transition:none}}\n"] }]
|
|
292
307
|
}], ctorParameters: () => [], propDecorators: { startSlot: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SkraAccordionStart), { isSignal: true }] }], indicatorSlot: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SkraAccordionIndicator), { isSignal: true }] }] } });
|
|
293
308
|
|
|
294
309
|
/**
|
|
@@ -301,9 +316,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImpor
|
|
|
301
316
|
*/
|
|
302
317
|
class SkraAccordionPanel {
|
|
303
318
|
ctx = inject(SkraAccordionItemContext, { optional: true });
|
|
304
|
-
panelId = computed(() => this.ctx?.panelId() ?? null,
|
|
305
|
-
|
|
306
|
-
|
|
319
|
+
panelId = computed(() => this.ctx?.panelId() ?? null, /* @ts-ignore */
|
|
320
|
+
...(ngDevMode ? [{ debugName: "panelId" }] : /* istanbul ignore next */ []));
|
|
321
|
+
headerId = computed(() => this.ctx?.headerId() ?? null, /* @ts-ignore */
|
|
322
|
+
...(ngDevMode ? [{ debugName: "headerId" }] : /* istanbul ignore next */ []));
|
|
323
|
+
expandedAttr = computed(() => this.ctx?.expanded() ? '' : null, /* @ts-ignore */
|
|
324
|
+
...(ngDevMode ? [{ debugName: "expandedAttr" }] : /* istanbul ignore next */ []));
|
|
307
325
|
constructor() {
|
|
308
326
|
if (typeof ngDevMode === 'undefined' || ngDevMode) {
|
|
309
327
|
if (!this.ctx) {
|
|
@@ -312,10 +330,10 @@ class SkraAccordionPanel {
|
|
|
312
330
|
}
|
|
313
331
|
}
|
|
314
332
|
}
|
|
315
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
316
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
|
|
333
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraAccordionPanel, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
334
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.1", type: SkraAccordionPanel, isStandalone: true, selector: "[skraAccordionPanel]", host: { attributes: { "role": "region" }, properties: { "attr.id": "panelId()", "attr.aria-labelledby": "headerId()", "attr.data-skra-expanded": "expandedAttr()" } }, exportAs: ["skraAccordionPanel"], ngImport: i0, template: '<div class="skra-accordion-panel-clip"><div class="skra-accordion-panel-inner"><ng-content></ng-content></div></div>', isInline: true, styles: ["@charset \"UTF-8\";:host{display:grid;grid-template-rows:0fr;margin:0;transition:grid-template-rows var(--skra-comp-accordion-motion-duration) var(--skra-comp-accordion-motion-easing)}:host([data-skra-expanded]){grid-template-rows:1fr}.skra-accordion-panel-clip{overflow:hidden;min-block-size:0;visibility:hidden;transition:visibility var(--skra-comp-accordion-motion-duration) allow-discrete}:host([data-skra-expanded]) .skra-accordion-panel-clip{visibility:visible}.skra-accordion-panel-inner{color:var(--skra-comp-accordion-panel-foreground);padding-block:var(--skra-comp-accordion-panel-padding-block);padding-inline:var(--skra-comp-accordion-panel-padding-inline)}.skra-accordion-panel-inner>:first-child{margin-block-start:0}@media(prefers-reduced-motion:reduce){:host{transition:none}.skra-accordion-panel-clip{transition:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
317
335
|
}
|
|
318
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
336
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraAccordionPanel, decorators: [{
|
|
319
337
|
type: Component,
|
|
320
338
|
args: [{ selector: '[skraAccordionPanel]', standalone: true, exportAs: 'skraAccordionPanel', template: '<div class="skra-accordion-panel-clip"><div class="skra-accordion-panel-inner"><ng-content></ng-content></div></div>', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, host: {
|
|
321
339
|
role: 'region',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skra-ui-accordion.mjs","sources":["../../../../libs/ui/accordion/src/lib/accordion/accordion-context.ts","../../../../libs/ui/accordion/src/lib/accordion/accordion-item-context.ts","../../../../libs/ui/accordion/src/lib/accordion/accordion-item.ts","../../../../libs/ui/accordion/src/lib/accordion/accordion.ts","../../../../libs/ui/accordion/src/lib/accordion/accordion-header.ts","../../../../libs/ui/accordion/src/lib/accordion/accordion.directives.ts","../../../../libs/ui/accordion/src/lib/accordion/accordion-trigger.ts","../../../../libs/ui/accordion/src/lib/accordion/accordion-trigger.html","../../../../libs/ui/accordion/src/lib/accordion/accordion-panel.ts","../../../../libs/ui/accordion/src/skra-ui-accordion.ts"],"sourcesContent":["import { Injectable, signal } from '@angular/core';\n\n/** Module-global counter → a deterministic, unique id base per `[skraAccordion]`\n * instance. Lib-local (mirrors `SkraTabsContext`) so `@skra/disclosure` takes no\n * dependency on another lib just for id generation. Stable across SSR↔hydration\n * (same instantiation order yields the same ids — the standard counter technique). */\nlet accordionInstanceCounter = 0;\n\n/** Sanitize a consumer `value` into an id-safe fragment (no spaces / special chars). */\nfunction idSafe(value: string): string {\n return value.replace(/[^a-zA-Z0-9_-]/g, '-');\n}\n\n/**\n * DI Context provided per `[skraAccordion]` instance — the ADR 013 §3.6 **non-form**\n * Contextual-ID-Sync bus (the 2nd consumer of the idiom after `SkraTabsContext`). It\n * carries **IDs + derived, read-only interaction state only** (`expanded` mirrors the\n * consumer's `[expanded]`; `exclusive` mirrors `[exclusive]`). It **never owns value** —\n * the open/closed set stays consumer-owned (ADR 037); a header requests a change through\n * `toggle()`, which the coordinator implements (resolving the exclusive policy) and from\n * which it emits `(expandedChange)`.\n */\n@Injectable()\nexport class SkraAccordionContext {\n /** Unique per `[skraAccordion]` — the prefix for every header/panel id in this group. */\n private readonly baseId = `skra-accordion-${++accordionInstanceCounter}`;\n\n /** Mirror of the consumer's `[expanded]` — the set of OPEN item values (read-only to children). */\n readonly expanded = signal<readonly string[]>([]);\n /** Mirror of the consumer's `[exclusive]` policy (read-only to children). */\n readonly exclusive = signal<boolean>(false);\n\n headerId(value: string): string {\n return `${this.baseId}-header-${idSafe(value)}`;\n }\n panelId(value: string): string {\n return `${this.baseId}-panel-${idSafe(value)}`;\n }\n isExpanded(value: string): boolean {\n return this.expanded().includes(value);\n }\n\n /** Coordinator-assigned: a header requests a toggle; the coordinator resolves the next\n * open-set (applying the exclusive policy) and emits `(expandedChange)` — never mutated here. */\n toggle: (value: string) => void = () => undefined;\n}\n","import type { Signal } from '@angular/core';\n\n/**\n * Per-item DI context provided by `[skraAccordionItem]` (via `useExisting`). It lets\n * `button[skraAccordionHeader]` and `[skraAccordionPanel]` read their shared `value`,\n * derived ids, and open state **without each re-declaring `value`** — the item declares it\n * once. All members are read-only/derived; `toggle()` forwards to the group coordinator\n * (the open/closed set stays consumer-owned, ADR 037). `*Id` are `null` only when an item\n * is used outside a `[skraAccordion]` (standalone misuse → dev-warned).\n */\nexport abstract class SkraAccordionItemContext {\n abstract readonly value: Signal<string>;\n abstract readonly expanded: Signal<boolean>;\n abstract readonly headerId: Signal<string | null>;\n abstract readonly panelId: Signal<string | null>;\n abstract toggle(): void;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n inject,\n input,\n} from '@angular/core';\n\nimport { SkraAccordionContext } from './accordion-context';\nimport { SkraAccordionItemContext } from './accordion-item-context';\n\ndeclare const ngDevMode: boolean | undefined;\n\n/**\n * SkraAccordionItem — one item, a Component on the consumer's `<div skraAccordionItem>`\n * (ADR 040, `template: '<ng-content>'`). It declares `[value]` ONCE and provides\n * `SkraAccordionItemContext` (via `useExisting`) so its `button[skraAccordionHeader]` and\n * `[skraAccordionPanel]` read the shared value/ids/open-state without re-declaring it. It\n * owns the per-item top divider (no double borders) and the open-item box (skins may tint it).\n */\n@Component({\n selector: '[skraAccordionItem]',\n standalone: true,\n exportAs: 'skraAccordionItem',\n template: '<ng-content></ng-content>',\n styleUrl: './accordion-item.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n providers: [\n { provide: SkraAccordionItemContext, useExisting: SkraAccordionItem },\n ],\n host: {\n '[attr.data-skra-expanded]': 'expanded() ? \"\" : null',\n },\n})\nexport class SkraAccordionItem implements SkraAccordionItemContext {\n /** The item key — matched against `[expanded]` and the id base for its header/panel. */\n readonly value = input.required<string>();\n\n private readonly group = inject(SkraAccordionContext, { optional: true });\n\n readonly expanded = computed(\n () => this.group?.isExpanded(this.value()) ?? false,\n );\n readonly headerId = computed(\n () => this.group?.headerId(this.value()) ?? null,\n );\n readonly panelId = computed(() => this.group?.panelId(this.value()) ?? null);\n\n toggle(): void {\n this.group?.toggle(this.value());\n }\n\n constructor() {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n if (!this.group) {\n console.warn(\n '[skraAccordionItem] has no [skraAccordion] ancestor — its header/panel are not wired ' +\n '(no aria-controls / open state). Project it inside <element skraAccordion>.',\n );\n }\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n contentChildren,\n effect,\n inject,\n input,\n output,\n} from '@angular/core';\n\nimport { SkraAccordionContext } from './accordion-context';\nimport { SkraAccordionItem } from './accordion-item';\n\ndeclare const ngDevMode: boolean | undefined;\n\n/**\n * SkraAccordion — the WAI-ARIA APG **Accordion** coordinator. A Component on a wrapping\n * element that holds `[skraAccordionItem]` children (each item wraps a\n * `button[skraAccordionHeader]` + a `[skraAccordionPanel]`). It provides\n * `SkraAccordionContext` (the ADR 013 §3.6 non-form Contextual-ID-Sync bus), owns the\n * consumer-facing `[expanded]` / `(expandedChange)` (controlled, ADR 037 — NO internal open\n * state) and the `[exclusive]` policy, and draws the group's outer border + radius.\n *\n * <div skraAccordion [expanded]=\"open()\" (expandedChange)=\"open.set($event)\">\n * <div skraAccordionItem value=\"general\">\n * <h3><button skraAccordionHeader>General</button></h3>\n * <div skraAccordionPanel>…</div>\n * </div>\n * <div skraAccordionItem value=\"security\"> … </div>\n * </div>\n *\n * Open state is consumer-owned: a header click emits `(expandedChange)` with the resolved\n * next set (the `[exclusive]` policy applied here); the visible state updates when the\n * consumer round-trips `[expanded]`. `[exclusive]` is a POLICY flag on an invariant\n * `string[]` value — NOT a value-type switch, so it does not trigger ADR 0046.\n *\n * Full contract: adr/specs/component-accordion-spec.md.\n */\n@Component({\n selector: '[skraAccordion]',\n standalone: true,\n exportAs: 'skraAccordion',\n template: '<ng-content></ng-content>',\n styleUrl: './accordion.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n providers: [SkraAccordionContext],\n})\nexport class SkraAccordion {\n /** Consumer-owned set of OPEN item values (ADR 037). `[]` = all closed; order irrelevant. */\n readonly expanded = input<readonly string[]>([]);\n /** Policy: `true` → opening one item emits a set that drops the others (single-open). */\n readonly exclusive = input(false, { transform: booleanAttribute });\n /** Fires ONLY on user toggle — never on a programmatic `[expanded]` change. Carries the resolved next set. */\n readonly expandedChange = output<readonly string[]>();\n\n private readonly ctx = inject(SkraAccordionContext);\n private readonly items = contentChildren(SkraAccordionItem, {\n descendants: true,\n });\n\n constructor() {\n // Wire the context bus (a header requests a toggle; the coordinator resolves + emits).\n this.ctx.toggle = (value) => this.toggleItem(value);\n\n // Mirror inputs → context (read-only to children).\n effect(() => this.ctx.expanded.set(this.expanded()));\n effect(() => this.ctx.exclusive.set(this.exclusive()));\n\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n effect(() => this.warnDuplicateValues());\n }\n }\n\n /** A header was activated. Resolve the next open-set per the exclusive policy and REQUEST it\n * from the consumer via `(expandedChange)` — never mutate open state internally (ADR 037). */\n private toggleItem(value: string): void {\n const open = this.expanded();\n const isOpen = open.includes(value);\n let next: readonly string[];\n if (this.exclusive()) {\n next = isOpen ? [] : [value];\n } else {\n next = isOpen ? open.filter((v) => v !== value) : [...open, value];\n }\n this.expandedChange.emit(next);\n }\n\n /** Dev-only nudge: duplicate item values collide on the shared header/panel id base. */\n private warnDuplicateValues(): void {\n const seen = new Set<string>();\n for (const item of this.items()) {\n const v = item.value();\n if (seen.has(v)) {\n console.warn(\n `[skraAccordion] duplicate item value=\"${v}\" — header/panel ids will collide; values must be unique within a group.`,\n );\n }\n seen.add(v);\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n inject,\n} from '@angular/core';\n\ndeclare const ngDevMode: boolean | undefined;\n\n/**\n * SkraAccordionHeader — the heading wrapper, a Component on the consumer's heading element\n * (`<h2 skraAccordionHeader>` … `<h6 skraAccordionHeader>` — the consumer picks the level for\n * the document outline; ADR 012 attach-to-native). It wraps a `button[skraAccordionTrigger]`\n * (the Radix Header+Trigger split, the way Material/Carbon/Radix all OWN the heading box rather\n * than leaving a projected heading's UA margin to leak).\n *\n * Its ONLY job is to OWN the heading's box: because Forge is now the heading's host, its Emulated\n * `:host` CSS can reset the UA heading margin (`margin: 0`) so the collapsed item hugs the\n * trigger height — impossible to do from the item, which only sees the heading as projected\n * content (ADR 040 cross-encapsulation limit; the same reason `_form-controls.scss` exists, but\n * here solved structurally without a global slice). Carries no ARIA role of its own (the native\n * heading element provides the heading semantics).\n */\n@Component({\n selector: '[skraAccordionHeader]',\n standalone: true,\n exportAs: 'skraAccordionHeader',\n template: '<ng-content></ng-content>',\n styleUrl: './accordion-header.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n})\nexport class SkraAccordionHeader {\n constructor() {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n const tag =\n inject<ElementRef<HTMLElement>>(ElementRef).nativeElement.tagName;\n if (!/^H[1-6]$/.test(tag)) {\n console.warn(\n `[skraAccordionHeader] is on <${tag.toLowerCase()}> — APG requires the accordion ` +\n 'trigger to sit inside a heading element (<h2>…<h6>) for screen-reader heading navigation. ' +\n 'Apply it to a heading element.',\n );\n }\n }\n }\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Marker for the leading icon/element slot of `button[skraAccordionTrigger]` (the ADR 003\n * `[skra-start]` convention). Detected via `contentChild` (ADR 020 Smart Slots v2.0) to\n * toggle the start wrapper without emitting an empty DOM node. Lib-local (mirrors the\n * Button/Chip per-lib marker) to avoid a cross-lib marker dependency.\n */\n@Directive({\n selector: '[skra-start]',\n standalone: true,\n})\nexport class SkraAccordionStart {}\n\n/**\n * Marker for the optional expand/collapse indicator override of `button[skraAccordionTrigger]`.\n * When present, it replaces the component-rendered default chevron (the ADR 028 slot+fallback\n * idiom — here a presentation override, NOT the loading primitive).\n */\n@Directive({\n selector: '[skra-accordion-indicator]',\n standalone: true,\n})\nexport class SkraAccordionIndicator {}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n contentChild,\n inject,\n} from '@angular/core';\n\nimport {\n SkraAccordionIndicator,\n SkraAccordionStart,\n} from './accordion.directives';\nimport { SkraAccordionItemContext } from './accordion-item-context';\n\ndeclare const ngDevMode: boolean | undefined;\n\n/**\n * SkraAccordionTrigger — the disclosure trigger, a Component on the native command host\n * `button[skraAccordionTrigger]` (ADR 012/040: a `<button>` gives Enter/Space→click + focus\n * for free — the same attach-to-native-button precedent as `button[skraButton]` / `skraTab` /\n * `skraMenuItem`). It is wrapped by `[skraAccordionHeader]` on a heading element (Radix\n * Header+Trigger split) so the heading owns the document outline + its own box/margin.\n * `aria-expanded` is the canonical Toggle state (no native HTML \"expanded\" attribute on a button\n * → ARIA is correct, boundary #9); the open STYLE keys off `:host([aria-expanded=\"true\"])` (Tabs\n * `aria-selected` precedent). value/ids/open-state come from `SkraAccordionItemContext` — the\n * trigger declares no `value`.\n *\n * **Iron boundary:** no `expanded` / `ariaLabel` / `size` / `severity` inputs.\n */\n@Component({\n selector: 'button[skraAccordionTrigger]',\n standalone: true,\n exportAs: 'skraAccordionTrigger',\n imports: [SkraAccordionStart, SkraAccordionIndicator],\n templateUrl: './accordion-trigger.html',\n styleUrl: './accordion-trigger.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n type: 'button', // never an implicit submit if the accordion sits inside a <form>\n '[attr.id]': 'headerId()',\n '[attr.aria-controls]': 'panelId()',\n '[attr.aria-expanded]': 'ariaExpanded()',\n '[attr.data-skra-expanded]': 'expandedAttr()',\n '[attr.data-skra-has-start]': 'hasStart() ? \"\" : null',\n '(click)': 'onClick()',\n },\n})\nexport class SkraAccordionTrigger {\n private readonly ctx = inject(SkraAccordionItemContext, { optional: true });\n\n // Smart Slots v2.0 (ADR 020)\n protected readonly startSlot = contentChild(SkraAccordionStart);\n protected readonly indicatorSlot = contentChild(SkraAccordionIndicator);\n protected readonly hasStart = computed(() => !!this.startSlot());\n protected readonly hasIndicator = computed(() => !!this.indicatorSlot());\n\n // Derived id / state from the item context (null only on standalone misuse)\n protected readonly headerId = computed(() => this.ctx?.headerId() ?? null);\n protected readonly panelId = computed(() => this.ctx?.panelId() ?? null);\n protected readonly ariaExpanded = computed(() =>\n this.ctx ? (this.ctx.expanded() ? 'true' : 'false') : null,\n );\n protected readonly expandedAttr = computed(() =>\n this.ctx?.expanded() ? '' : null,\n );\n\n protected onClick(): void {\n this.ctx?.toggle();\n }\n\n constructor() {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n if (!this.ctx) {\n console.warn(\n '[skraAccordionTrigger] has no [skraAccordionItem] ancestor — it is not wired to a panel ' +\n '(no aria-controls / toggle). Project it inside <element skraAccordionItem>.',\n );\n }\n }\n }\n}\n","@if (hasStart()) {\n<span class=\"skra-accordion-trigger-start\">\n <ng-content select=\"[skra-start]\"></ng-content>\n</span>\n}\n\n<span class=\"skra-accordion-trigger-label\">\n <ng-content></ng-content>\n</span>\n\n@if (hasIndicator()) {\n<span class=\"skra-accordion-trigger-indicator\">\n <ng-content select=\"[skra-accordion-indicator]\"></ng-content>\n</span>\n} @else {\n<span\n class=\"skra-accordion-trigger-indicator\"\n data-skra-accordion-indicator\n aria-hidden=\"true\"\n></span>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n inject,\n} from '@angular/core';\n\nimport { SkraAccordionItemContext } from './accordion-item-context';\n\ndeclare const ngDevMode: boolean | undefined;\n\n/**\n * SkraAccordionPanel — the disclosed region, a Component on the consumer's\n * `<div skraAccordionPanel>` (ADR 040). `role=\"region\"`, auto-named by `aria-labelledby`→its\n * header. Collapse/expand is a CSS-only `grid-template-rows: 0fr↔1fr` animation driven by\n * `data-skra-expanded` (ADR 021 — no `[style.*]`); the inner wrapper's `visibility:hidden`\n * at the collapsed end removes content from the a11y tree + Tab order (see accordion-panel.scss).\n * value/ids/open-state come from `SkraAccordionItemContext`.\n */\n@Component({\n selector: '[skraAccordionPanel]',\n standalone: true,\n exportAs: 'skraAccordionPanel',\n template:\n '<div class=\"skra-accordion-panel-clip\"><div class=\"skra-accordion-panel-inner\"><ng-content></ng-content></div></div>',\n styleUrl: './accordion-panel.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n role: 'region',\n '[attr.id]': 'panelId()',\n '[attr.aria-labelledby]': 'headerId()',\n '[attr.data-skra-expanded]': 'expandedAttr()',\n },\n})\nexport class SkraAccordionPanel {\n private readonly ctx = inject(SkraAccordionItemContext, { optional: true });\n\n protected readonly panelId = computed(() => this.ctx?.panelId() ?? null);\n protected readonly headerId = computed(() => this.ctx?.headerId() ?? null);\n protected readonly expandedAttr = computed(() =>\n this.ctx?.expanded() ? '' : null,\n );\n\n constructor() {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n if (!this.ctx) {\n console.warn(\n '[skraAccordionPanel] has no [skraAccordionItem] ancestor — it is not wired to a header ' +\n '(no aria-labelledby / show-hide). Project it inside <element skraAccordionItem>.',\n );\n }\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"skra-ui-accordion.mjs","sources":["../../../../libs/ui/accordion/src/lib/accordion/accordion-context.ts","../../../../libs/ui/accordion/src/lib/accordion/accordion-item-context.ts","../../../../libs/ui/accordion/src/lib/accordion/accordion-item.ts","../../../../libs/ui/accordion/src/lib/accordion/accordion.ts","../../../../libs/ui/accordion/src/lib/accordion/accordion-header.ts","../../../../libs/ui/accordion/src/lib/accordion/accordion.directives.ts","../../../../libs/ui/accordion/src/lib/accordion/accordion-trigger.ts","../../../../libs/ui/accordion/src/lib/accordion/accordion-trigger.html","../../../../libs/ui/accordion/src/lib/accordion/accordion-panel.ts","../../../../libs/ui/accordion/src/skra-ui-accordion.ts"],"sourcesContent":["import { Injectable, signal } from '@angular/core';\r\n\r\n/** Module-global counter → a deterministic, unique id base per `[skraAccordion]`\r\n * instance. Lib-local (mirrors `SkraTabsContext`) so `@skra/disclosure` takes no\r\n * dependency on another lib just for id generation. Stable across SSR↔hydration\r\n * (same instantiation order yields the same ids — the standard counter technique). */\r\nlet accordionInstanceCounter = 0;\r\n\r\n/** Sanitize a consumer `value` into an id-safe fragment (no spaces / special chars). */\r\nfunction idSafe(value: string): string {\r\n return value.replace(/[^a-zA-Z0-9_-]/g, '-');\r\n}\r\n\r\n/**\r\n * DI Context provided per `[skraAccordion]` instance — the ADR 013 §3.6 **non-form**\r\n * Contextual-ID-Sync bus (the 2nd consumer of the idiom after `SkraTabsContext`). It\r\n * carries **IDs + derived, read-only interaction state only** (`expanded` mirrors the\r\n * consumer's `[expanded]`; `exclusive` mirrors `[exclusive]`). It **never owns value** —\r\n * the open/closed set stays consumer-owned (ADR 037); a header requests a change through\r\n * `toggle()`, which the coordinator implements (resolving the exclusive policy) and from\r\n * which it emits `(expandedChange)`.\r\n */\r\n@Injectable()\r\nexport class SkraAccordionContext {\r\n /** Unique per `[skraAccordion]` — the prefix for every header/panel id in this group. */\r\n private readonly baseId = `skra-accordion-${++accordionInstanceCounter}`;\r\n\r\n /** Mirror of the consumer's `[expanded]` — the set of OPEN item values (read-only to children). */\r\n readonly expanded = signal<readonly string[]>([]);\r\n /** Mirror of the consumer's `[exclusive]` policy (read-only to children). */\r\n readonly exclusive = signal<boolean>(false);\r\n\r\n headerId(value: string): string {\r\n return `${this.baseId}-header-${idSafe(value)}`;\r\n }\r\n panelId(value: string): string {\r\n return `${this.baseId}-panel-${idSafe(value)}`;\r\n }\r\n isExpanded(value: string): boolean {\r\n return this.expanded().includes(value);\r\n }\r\n\r\n /** Coordinator-assigned: a header requests a toggle; the coordinator resolves the next\r\n * open-set (applying the exclusive policy) and emits `(expandedChange)` — never mutated here. */\r\n toggle: (value: string) => void = () => undefined;\r\n}\r\n","import type { Signal } from '@angular/core';\r\n\r\n/**\r\n * Per-item DI context provided by `[skraAccordionItem]` (via `useExisting`). It lets\r\n * `button[skraAccordionHeader]` and `[skraAccordionPanel]` read their shared `value`,\r\n * derived ids, and open state **without each re-declaring `value`** — the item declares it\r\n * once. All members are read-only/derived; `toggle()` forwards to the group coordinator\r\n * (the open/closed set stays consumer-owned, ADR 037). `*Id` are `null` only when an item\r\n * is used outside a `[skraAccordion]` (standalone misuse → dev-warned).\r\n */\r\nexport abstract class SkraAccordionItemContext {\r\n abstract readonly value: Signal<string>;\r\n abstract readonly expanded: Signal<boolean>;\r\n abstract readonly headerId: Signal<string | null>;\r\n abstract readonly panelId: Signal<string | null>;\r\n abstract toggle(): void;\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ViewEncapsulation,\r\n computed,\r\n inject,\r\n input,\r\n} from '@angular/core';\r\n\r\nimport { SkraAccordionContext } from './accordion-context';\r\nimport { SkraAccordionItemContext } from './accordion-item-context';\r\n\r\ndeclare const ngDevMode: boolean | undefined;\r\n\r\n/**\r\n * SkraAccordionItem — one item, a Component on the consumer's `<div skraAccordionItem>`\r\n * (ADR 040, `template: '<ng-content>'`). It declares `[value]` ONCE and provides\r\n * `SkraAccordionItemContext` (via `useExisting`) so its `button[skraAccordionHeader]` and\r\n * `[skraAccordionPanel]` read the shared value/ids/open-state without re-declaring it. It\r\n * owns the per-item top divider (no double borders) and the open-item box (skins may tint it).\r\n */\r\n@Component({\r\n selector: '[skraAccordionItem]',\r\n standalone: true,\r\n exportAs: 'skraAccordionItem',\r\n template: '<ng-content></ng-content>',\r\n styleUrl: './accordion-item.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n providers: [\r\n { provide: SkraAccordionItemContext, useExisting: SkraAccordionItem },\r\n ],\r\n host: {\r\n '[attr.data-skra-expanded]': 'expanded() ? \"\" : null',\r\n },\r\n})\r\nexport class SkraAccordionItem implements SkraAccordionItemContext {\r\n /** The item key — matched against `[expanded]` and the id base for its header/panel. */\r\n readonly value = input.required<string>();\r\n\r\n private readonly group = inject(SkraAccordionContext, { optional: true });\r\n\r\n readonly expanded = computed(\r\n () => this.group?.isExpanded(this.value()) ?? false,\r\n );\r\n readonly headerId = computed(\r\n () => this.group?.headerId(this.value()) ?? null,\r\n );\r\n readonly panelId = computed(() => this.group?.panelId(this.value()) ?? null);\r\n\r\n toggle(): void {\r\n this.group?.toggle(this.value());\r\n }\r\n\r\n constructor() {\r\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\r\n if (!this.group) {\r\n console.warn(\r\n '[skraAccordionItem] has no [skraAccordion] ancestor — its header/panel are not wired ' +\r\n '(no aria-controls / open state). Project it inside <element skraAccordion>.',\r\n );\r\n }\r\n }\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ViewEncapsulation,\r\n booleanAttribute,\r\n contentChildren,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n} from '@angular/core';\r\n\r\nimport { SkraAccordionContext } from './accordion-context';\r\nimport { SkraAccordionItem } from './accordion-item';\r\n\r\ndeclare const ngDevMode: boolean | undefined;\r\n\r\n/**\r\n * SkraAccordion — the WAI-ARIA APG **Accordion** coordinator. A Component on a wrapping\r\n * element that holds `[skraAccordionItem]` children (each item wraps a\r\n * `button[skraAccordionHeader]` + a `[skraAccordionPanel]`). It provides\r\n * `SkraAccordionContext` (the ADR 013 §3.6 non-form Contextual-ID-Sync bus), owns the\r\n * consumer-facing `[expanded]` / `(expandedChange)` (controlled, ADR 037 — NO internal open\r\n * state) and the `[exclusive]` policy, and draws the group's outer border + radius.\r\n *\r\n * <div skraAccordion [expanded]=\"open()\" (expandedChange)=\"open.set($event)\">\r\n * <div skraAccordionItem value=\"general\">\r\n * <h3><button skraAccordionHeader>General</button></h3>\r\n * <div skraAccordionPanel>…</div>\r\n * </div>\r\n * <div skraAccordionItem value=\"security\"> … </div>\r\n * </div>\r\n *\r\n * Open state is consumer-owned: a header click emits `(expandedChange)` with the resolved\r\n * next set (the `[exclusive]` policy applied here); the visible state updates when the\r\n * consumer round-trips `[expanded]`. `[exclusive]` is a POLICY flag on an invariant\r\n * `string[]` value — NOT a value-type switch, so it does not trigger ADR 0046.\r\n *\r\n * Full contract: adr/specs/component-accordion-spec.md.\r\n */\r\n@Component({\r\n selector: '[skraAccordion]',\r\n standalone: true,\r\n exportAs: 'skraAccordion',\r\n template: '<ng-content></ng-content>',\r\n styleUrl: './accordion.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n providers: [SkraAccordionContext],\r\n})\r\nexport class SkraAccordion {\r\n /** Consumer-owned set of OPEN item values (ADR 037). `[]` = all closed; order irrelevant. */\r\n readonly expanded = input<readonly string[]>([]);\r\n /** Policy: `true` → opening one item emits a set that drops the others (single-open). */\r\n readonly exclusive = input(false, { transform: booleanAttribute });\r\n /** Fires ONLY on user toggle — never on a programmatic `[expanded]` change. Carries the resolved next set. */\r\n readonly expandedChange = output<readonly string[]>();\r\n\r\n private readonly ctx = inject(SkraAccordionContext);\r\n private readonly items = contentChildren(SkraAccordionItem, {\r\n descendants: true,\r\n });\r\n\r\n constructor() {\r\n // Wire the context bus (a header requests a toggle; the coordinator resolves + emits).\r\n this.ctx.toggle = (value) => this.toggleItem(value);\r\n\r\n // Mirror inputs → context (read-only to children).\r\n effect(() => this.ctx.expanded.set(this.expanded()));\r\n effect(() => this.ctx.exclusive.set(this.exclusive()));\r\n\r\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\r\n effect(() => this.warnDuplicateValues());\r\n }\r\n }\r\n\r\n /** A header was activated. Resolve the next open-set per the exclusive policy and REQUEST it\r\n * from the consumer via `(expandedChange)` — never mutate open state internally (ADR 037). */\r\n private toggleItem(value: string): void {\r\n const open = this.expanded();\r\n const isOpen = open.includes(value);\r\n let next: readonly string[];\r\n if (this.exclusive()) {\r\n next = isOpen ? [] : [value];\r\n } else {\r\n next = isOpen ? open.filter((v) => v !== value) : [...open, value];\r\n }\r\n this.expandedChange.emit(next);\r\n }\r\n\r\n /** Dev-only nudge: duplicate item values collide on the shared header/panel id base. */\r\n private warnDuplicateValues(): void {\r\n const seen = new Set<string>();\r\n for (const item of this.items()) {\r\n const v = item.value();\r\n if (seen.has(v)) {\r\n console.warn(\r\n `[skraAccordion] duplicate item value=\"${v}\" — header/panel ids will collide; values must be unique within a group.`,\r\n );\r\n }\r\n seen.add(v);\r\n }\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n ViewEncapsulation,\r\n inject,\r\n} from '@angular/core';\r\n\r\ndeclare const ngDevMode: boolean | undefined;\r\n\r\n/**\r\n * SkraAccordionHeader — the heading wrapper, a Component on the consumer's heading element\r\n * (`<h2 skraAccordionHeader>` … `<h6 skraAccordionHeader>` — the consumer picks the level for\r\n * the document outline; ADR 012 attach-to-native). It wraps a `button[skraAccordionTrigger]`\r\n * (the Radix Header+Trigger split, the way Material/Carbon/Radix all OWN the heading box rather\r\n * than leaving a projected heading's UA margin to leak).\r\n *\r\n * Its ONLY job is to OWN the heading's box: because Forge is now the heading's host, its Emulated\r\n * `:host` CSS can reset the UA heading margin (`margin: 0`) so the collapsed item hugs the\r\n * trigger height — impossible to do from the item, which only sees the heading as projected\r\n * content (ADR 040 cross-encapsulation limit; the same reason `_form-controls.scss` exists, but\r\n * here solved structurally without a global slice). Carries no ARIA role of its own (the native\r\n * heading element provides the heading semantics).\r\n */\r\n@Component({\r\n selector: '[skraAccordionHeader]',\r\n standalone: true,\r\n exportAs: 'skraAccordionHeader',\r\n template: '<ng-content></ng-content>',\r\n styleUrl: './accordion-header.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n})\r\nexport class SkraAccordionHeader {\r\n constructor() {\r\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\r\n const tag =\r\n inject<ElementRef<HTMLElement>>(ElementRef).nativeElement.tagName;\r\n if (!/^H[1-6]$/.test(tag)) {\r\n console.warn(\r\n `[skraAccordionHeader] is on <${tag.toLowerCase()}> — APG requires the accordion ` +\r\n 'trigger to sit inside a heading element (<h2>…<h6>) for screen-reader heading navigation. ' +\r\n 'Apply it to a heading element.',\r\n );\r\n }\r\n }\r\n }\r\n}\r\n","import { Directive } from '@angular/core';\r\n\r\n/**\r\n * Marker for the leading icon/element slot of `button[skraAccordionTrigger]` (the ADR 003\r\n * `[skra-start]` convention). Detected via `contentChild` (ADR 020 Smart Slots v2.0) to\r\n * toggle the start wrapper without emitting an empty DOM node. Lib-local (mirrors the\r\n * Button/Chip per-lib marker) to avoid a cross-lib marker dependency.\r\n */\r\n@Directive({\r\n selector: '[skra-start]',\r\n standalone: true,\r\n})\r\nexport class SkraAccordionStart {}\r\n\r\n/**\r\n * Marker for the optional expand/collapse indicator override of `button[skraAccordionTrigger]`.\r\n * When present, it replaces the component-rendered default chevron (the ADR 028 slot+fallback\r\n * idiom — here a presentation override, NOT the loading primitive).\r\n */\r\n@Directive({\r\n selector: '[skra-accordion-indicator]',\r\n standalone: true,\r\n})\r\nexport class SkraAccordionIndicator {}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ViewEncapsulation,\r\n computed,\r\n contentChild,\r\n inject,\r\n} from '@angular/core';\r\n\r\nimport {\r\n SkraAccordionIndicator,\r\n SkraAccordionStart,\r\n} from './accordion.directives';\r\nimport { SkraAccordionItemContext } from './accordion-item-context';\r\n\r\ndeclare const ngDevMode: boolean | undefined;\r\n\r\n/**\r\n * SkraAccordionTrigger — the disclosure trigger, a Component on the native command host\r\n * `button[skraAccordionTrigger]` (ADR 012/040: a `<button>` gives Enter/Space→click + focus\r\n * for free — the same attach-to-native-button precedent as `button[skraButton]` / `skraTab` /\r\n * `skraMenuItem`). It is wrapped by `[skraAccordionHeader]` on a heading element (Radix\r\n * Header+Trigger split) so the heading owns the document outline + its own box/margin.\r\n * `aria-expanded` is the canonical Toggle state (no native HTML \"expanded\" attribute on a button\r\n * → ARIA is correct, boundary #9); the open STYLE keys off `:host([aria-expanded=\"true\"])` (Tabs\r\n * `aria-selected` precedent). value/ids/open-state come from `SkraAccordionItemContext` — the\r\n * trigger declares no `value`.\r\n *\r\n * **Iron boundary:** no `expanded` / `ariaLabel` / `size` / `severity` inputs.\r\n */\r\n@Component({\r\n selector: 'button[skraAccordionTrigger]',\r\n standalone: true,\r\n exportAs: 'skraAccordionTrigger',\r\n imports: [SkraAccordionStart, SkraAccordionIndicator],\r\n templateUrl: './accordion-trigger.html',\r\n styleUrl: './accordion-trigger.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n host: {\r\n type: 'button', // never an implicit submit if the accordion sits inside a <form>\r\n '[attr.id]': 'headerId()',\r\n '[attr.aria-controls]': 'panelId()',\r\n '[attr.aria-expanded]': 'ariaExpanded()',\r\n '[attr.data-skra-expanded]': 'expandedAttr()',\r\n '[attr.data-skra-has-start]': 'hasStart() ? \"\" : null',\r\n '(click)': 'onClick()',\r\n },\r\n})\r\nexport class SkraAccordionTrigger {\r\n private readonly ctx = inject(SkraAccordionItemContext, { optional: true });\r\n\r\n // Smart Slots v2.0 (ADR 020)\r\n protected readonly startSlot = contentChild(SkraAccordionStart);\r\n protected readonly indicatorSlot = contentChild(SkraAccordionIndicator);\r\n protected readonly hasStart = computed(() => !!this.startSlot());\r\n protected readonly hasIndicator = computed(() => !!this.indicatorSlot());\r\n\r\n // Derived id / state from the item context (null only on standalone misuse)\r\n protected readonly headerId = computed(() => this.ctx?.headerId() ?? null);\r\n protected readonly panelId = computed(() => this.ctx?.panelId() ?? null);\r\n protected readonly ariaExpanded = computed(() =>\r\n this.ctx ? (this.ctx.expanded() ? 'true' : 'false') : null,\r\n );\r\n protected readonly expandedAttr = computed(() =>\r\n this.ctx?.expanded() ? '' : null,\r\n );\r\n\r\n protected onClick(): void {\r\n this.ctx?.toggle();\r\n }\r\n\r\n constructor() {\r\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\r\n if (!this.ctx) {\r\n console.warn(\r\n '[skraAccordionTrigger] has no [skraAccordionItem] ancestor — it is not wired to a panel ' +\r\n '(no aria-controls / toggle). Project it inside <element skraAccordionItem>.',\r\n );\r\n }\r\n }\r\n }\r\n}\r\n","@if (hasStart()) {\r\n<span class=\"skra-accordion-trigger-start\">\r\n <ng-content select=\"[skra-start]\"></ng-content>\r\n</span>\r\n}\r\n\r\n<span class=\"skra-accordion-trigger-label\">\r\n <ng-content></ng-content>\r\n</span>\r\n\r\n@if (hasIndicator()) {\r\n<span class=\"skra-accordion-trigger-indicator\">\r\n <ng-content select=\"[skra-accordion-indicator]\"></ng-content>\r\n</span>\r\n} @else {\r\n<span\r\n class=\"skra-accordion-trigger-indicator\"\r\n data-skra-accordion-indicator\r\n aria-hidden=\"true\"\r\n></span>\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ViewEncapsulation,\r\n computed,\r\n inject,\r\n} from '@angular/core';\r\n\r\nimport { SkraAccordionItemContext } from './accordion-item-context';\r\n\r\ndeclare const ngDevMode: boolean | undefined;\r\n\r\n/**\r\n * SkraAccordionPanel — the disclosed region, a Component on the consumer's\r\n * `<div skraAccordionPanel>` (ADR 040). `role=\"region\"`, auto-named by `aria-labelledby`→its\r\n * header. Collapse/expand is a CSS-only `grid-template-rows: 0fr↔1fr` animation driven by\r\n * `data-skra-expanded` (ADR 021 — no `[style.*]`); the inner wrapper's `visibility:hidden`\r\n * at the collapsed end removes content from the a11y tree + Tab order (see accordion-panel.scss).\r\n * value/ids/open-state come from `SkraAccordionItemContext`.\r\n */\r\n@Component({\r\n selector: '[skraAccordionPanel]',\r\n standalone: true,\r\n exportAs: 'skraAccordionPanel',\r\n template:\r\n '<div class=\"skra-accordion-panel-clip\"><div class=\"skra-accordion-panel-inner\"><ng-content></ng-content></div></div>',\r\n styleUrl: './accordion-panel.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n host: {\r\n role: 'region',\r\n '[attr.id]': 'panelId()',\r\n '[attr.aria-labelledby]': 'headerId()',\r\n '[attr.data-skra-expanded]': 'expandedAttr()',\r\n },\r\n})\r\nexport class SkraAccordionPanel {\r\n private readonly ctx = inject(SkraAccordionItemContext, { optional: true });\r\n\r\n protected readonly panelId = computed(() => this.ctx?.panelId() ?? null);\r\n protected readonly headerId = computed(() => this.ctx?.headerId() ?? null);\r\n protected readonly expandedAttr = computed(() =>\r\n this.ctx?.expanded() ? '' : null,\r\n );\r\n\r\n constructor() {\r\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\r\n if (!this.ctx) {\r\n console.warn(\r\n '[skraAccordionPanel] has no [skraAccordionItem] ancestor — it is not wired to a header ' +\r\n '(no aria-labelledby / show-hide). Project it inside <element skraAccordionItem>.',\r\n );\r\n }\r\n }\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -8,10 +8,10 @@ import { Directive, input, booleanAttribute, output, contentChild, computed, Vie
|
|
|
8
8
|
* lib's `[skra-start]`) to avoid a cross-lib marker dependency.
|
|
9
9
|
*/
|
|
10
10
|
class SkraAlertIcon {
|
|
11
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
12
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
11
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraAlertIcon, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
12
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.1", type: SkraAlertIcon, isStandalone: true, selector: "[skra-alert-icon]", ngImport: i0 });
|
|
13
13
|
}
|
|
14
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
14
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraAlertIcon, decorators: [{
|
|
15
15
|
type: Directive,
|
|
16
16
|
args: [{
|
|
17
17
|
selector: '[skra-alert-icon]',
|
|
@@ -27,10 +27,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImpor
|
|
|
27
27
|
* dynamically-injected alert). The live region announces title + body atomically.
|
|
28
28
|
*/
|
|
29
29
|
class SkraAlertTitle {
|
|
30
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
31
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
30
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraAlertTitle, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
31
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.1", type: SkraAlertTitle, isStandalone: true, selector: "[skra-alert-title]", ngImport: i0 });
|
|
32
32
|
}
|
|
33
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
33
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraAlertTitle, decorators: [{
|
|
34
34
|
type: Directive,
|
|
35
35
|
args: [{
|
|
36
36
|
selector: '[skra-alert-title]',
|
|
@@ -56,18 +56,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImpor
|
|
|
56
56
|
*/
|
|
57
57
|
class SkraAlert {
|
|
58
58
|
// --- Variant Surface (ADR 035) ---
|
|
59
|
-
intent = input('neutral',
|
|
60
|
-
|
|
59
|
+
intent = input('neutral', /* @ts-ignore */
|
|
60
|
+
...(ngDevMode ? [{ debugName: "intent" }] : /* istanbul ignore next */ []));
|
|
61
|
+
emphasis = input('medium', /* @ts-ignore */
|
|
62
|
+
...(ngDevMode ? [{ debugName: "emphasis" }] : /* istanbul ignore next */ []));
|
|
61
63
|
// --- Announcement (ADR 0052) ---
|
|
62
|
-
live = input('off',
|
|
64
|
+
live = input('off', /* @ts-ignore */
|
|
65
|
+
...(ngDevMode ? [{ debugName: "live" }] : /* istanbul ignore next */ []));
|
|
63
66
|
// --- Dismissal ---
|
|
64
67
|
dismissible = input(false, { ...(ngDevMode ? { debugName: "dismissible" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
65
68
|
dismissed = output();
|
|
66
69
|
// --- Smart Slots v2.0 (ADR 020) ---
|
|
67
|
-
iconSlot = contentChild(SkraAlertIcon,
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
70
|
+
iconSlot = contentChild(SkraAlertIcon, /* @ts-ignore */
|
|
71
|
+
...(ngDevMode ? [{ debugName: "iconSlot" }] : /* istanbul ignore next */ []));
|
|
72
|
+
hasIcon = computed(() => !!this.iconSlot(), /* @ts-ignore */
|
|
73
|
+
...(ngDevMode ? [{ debugName: "hasIcon" }] : /* istanbul ignore next */ []));
|
|
74
|
+
titleSlot = contentChild(SkraAlertTitle, /* @ts-ignore */
|
|
75
|
+
...(ngDevMode ? [{ debugName: "titleSlot" }] : /* istanbul ignore next */ []));
|
|
76
|
+
hasTitle = computed(() => !!this.titleSlot(), /* @ts-ignore */
|
|
77
|
+
...(ngDevMode ? [{ debugName: "hasTitle" }] : /* istanbul ignore next */ []));
|
|
71
78
|
/**
|
|
72
79
|
* Map `live` politeness to the implicit-live ARIA role (ADR 0052). The role
|
|
73
80
|
* carries `aria-live` + `aria-atomic` implicitly; `off` → no live region.
|
|
@@ -81,14 +88,15 @@ class SkraAlert {
|
|
|
81
88
|
default:
|
|
82
89
|
return null;
|
|
83
90
|
}
|
|
84
|
-
},
|
|
91
|
+
}, /* @ts-ignore */
|
|
92
|
+
...(ngDevMode ? [{ debugName: "liveRole" }] : /* istanbul ignore next */ []));
|
|
85
93
|
onDismiss() {
|
|
86
94
|
this.dismissed.emit();
|
|
87
95
|
}
|
|
88
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
89
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
96
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraAlert, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
97
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.1", type: SkraAlert, isStandalone: true, selector: "skra-alert", inputs: { intent: { classPropertyName: "intent", publicName: "intent", isSignal: true, isRequired: false, transformFunction: null }, emphasis: { classPropertyName: "emphasis", publicName: "emphasis", isSignal: true, isRequired: false, transformFunction: null }, live: { classPropertyName: "live", publicName: "live", isSignal: true, isRequired: false, transformFunction: null }, dismissible: { classPropertyName: "dismissible", publicName: "dismissible", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dismissed: "dismissed" }, host: { properties: { "attr.data-skra-intent": "intent()", "attr.data-skra-emphasis": "emphasis()", "attr.role": "liveRole()", "attr.data-skra-has-icon": "hasIcon() ? \"\" : null", "attr.data-skra-has-title": "hasTitle() ? \"\" : null" } }, queries: [{ propertyName: "iconSlot", first: true, predicate: SkraAlertIcon, descendants: true, isSignal: true }, { propertyName: "titleSlot", first: true, predicate: SkraAlertTitle, descendants: true, isSignal: true }], ngImport: i0, template: "@if (hasIcon()) {\r\n<span class=\"skra-alert-icon\">\r\n <ng-content select=\"[skra-alert-icon]\"></ng-content>\r\n</span>\r\n}\r\n\r\n<div class=\"skra-alert-content\">\r\n @if (hasTitle()) {\r\n <div class=\"skra-alert-title\">\r\n <ng-content select=\"[skra-alert-title]\"></ng-content>\r\n </div>\r\n }\r\n <div class=\"skra-alert-body\">\r\n <ng-content></ng-content>\r\n </div>\r\n</div>\r\n\r\n@if (dismissible()) {\r\n<button type=\"button\" class=\"skra-alert-dismiss\" (click)=\"onDismiss()\">\r\n <span class=\"skra-alert-dismiss-glyph\" aria-hidden=\"true\">×</span>\r\n <ng-content select=\"[skra-alert-close-label]\"></ng-content>\r\n</button>\r\n}\r\n", styles: ["@charset \"UTF-8\";:host{display:flex;align-items:flex-start;box-sizing:border-box;margin:0;gap:var(--skra-comp-alert-icon-gap);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);background:var(--skra-comp-alert-background);color:var(--skra-comp-alert-foreground);border-color:var(--skra-comp-alert-border-color);border-width:var(--skra-comp-alert-border-width);border-style:var(--skra-comp-alert-border-style);border-radius:var(--skra-comp-alert-radius);padding-block:var(--skra-comp-alert-padding-block);padding-inline:var(--skra-comp-alert-padding-inline);box-shadow:var(--skra-comp-alert-shadow)}:host([data-skra-emphasis=high]){--skra-comp-alert-border-width: 0}:host([data-skra-intent=neutral][data-skra-emphasis=high]){--skra-comp-alert-background: var( --skra-comp-alert-background-neutral-high, var(--skra-sys-color-neutral-base) );--skra-comp-alert-foreground: var( --skra-comp-alert-foreground-neutral-high, var(--skra-sys-color-neutral-contrast) );--skra-comp-alert-border-color: var( --skra-comp-alert-border-color-neutral-high, transparent )}:host([data-skra-intent=neutral][data-skra-emphasis=medium]){--skra-comp-alert-background: var( --skra-comp-alert-background-neutral-medium, var(--skra-sys-color-neutral-soft) );--skra-comp-alert-foreground: var( --skra-comp-alert-foreground-neutral-medium, var(--skra-sys-color-neutral-strong) );--skra-comp-alert-border-color: var( --skra-comp-alert-border-color-neutral-medium, var(--skra-sys-color-neutral-border) )}:host([data-skra-intent=info][data-skra-emphasis=high]){--skra-comp-alert-background: var( --skra-comp-alert-background-info-high, var(--skra-sys-color-info-base) );--skra-comp-alert-foreground: var( --skra-comp-alert-foreground-info-high, var(--skra-sys-color-info-contrast) );--skra-comp-alert-border-color: var( --skra-comp-alert-border-color-info-high, transparent )}:host([data-skra-intent=info][data-skra-emphasis=medium]){--skra-comp-alert-background: var( --skra-comp-alert-background-info-medium, var(--skra-sys-color-info-soft) );--skra-comp-alert-foreground: var( --skra-comp-alert-foreground-info-medium, var(--skra-sys-color-info-strong) );--skra-comp-alert-border-color: var( --skra-comp-alert-border-color-info-medium, var(--skra-sys-color-info-border) )}:host([data-skra-intent=success][data-skra-emphasis=high]){--skra-comp-alert-background: var( --skra-comp-alert-background-success-high, var(--skra-sys-color-success-base) );--skra-comp-alert-foreground: var( --skra-comp-alert-foreground-success-high, var(--skra-sys-color-success-contrast) );--skra-comp-alert-border-color: var( --skra-comp-alert-border-color-success-high, transparent )}:host([data-skra-intent=success][data-skra-emphasis=medium]){--skra-comp-alert-background: var( --skra-comp-alert-background-success-medium, var(--skra-sys-color-success-soft) );--skra-comp-alert-foreground: var( --skra-comp-alert-foreground-success-medium, var(--skra-sys-color-success-strong) );--skra-comp-alert-border-color: var( --skra-comp-alert-border-color-success-medium, var(--skra-sys-color-success-border) )}:host([data-skra-intent=warning][data-skra-emphasis=high]){--skra-comp-alert-background: var( --skra-comp-alert-background-warning-high, var(--skra-sys-color-warning-base) );--skra-comp-alert-foreground: var( --skra-comp-alert-foreground-warning-high, var(--skra-sys-color-warning-contrast) );--skra-comp-alert-border-color: var( --skra-comp-alert-border-color-warning-high, transparent )}:host([data-skra-intent=warning][data-skra-emphasis=medium]){--skra-comp-alert-background: var( --skra-comp-alert-background-warning-medium, var(--skra-sys-color-warning-soft) );--skra-comp-alert-foreground: var( --skra-comp-alert-foreground-warning-medium, var(--skra-sys-color-warning-strong) );--skra-comp-alert-border-color: var( --skra-comp-alert-border-color-warning-medium, var(--skra-sys-color-warning-border) )}:host([data-skra-intent=danger][data-skra-emphasis=high]){--skra-comp-alert-background: var( --skra-comp-alert-background-danger-high, var(--skra-sys-color-danger-base) );--skra-comp-alert-foreground: var( --skra-comp-alert-foreground-danger-high, var(--skra-sys-color-danger-contrast) );--skra-comp-alert-border-color: var( --skra-comp-alert-border-color-danger-high, transparent )}:host([data-skra-intent=danger][data-skra-emphasis=medium]){--skra-comp-alert-background: var( --skra-comp-alert-background-danger-medium, var(--skra-sys-color-danger-soft) );--skra-comp-alert-foreground: var( --skra-comp-alert-foreground-danger-medium, var(--skra-sys-color-danger-strong) );--skra-comp-alert-border-color: var( --skra-comp-alert-border-color-danger-medium, var(--skra-sys-color-danger-border) )}.skra-alert-icon{display:inline-flex;flex-shrink:0;align-items:center;block-size:1lh;--skra-comp-icon-size: var(--skra-comp-alert-icon-size)}.skra-alert-content{flex:1 1 auto;min-inline-size:0;display:flex;flex-direction:column;gap:var(--skra-comp-alert-title-gap)}.skra-alert-title{font-family:var(--skra-sys-typography-role-label-large-font-family);font-size:var(--skra-sys-typography-role-label-large-font-size);font-weight:var(--skra-sys-typography-role-label-large-font-weight);line-height:var(--skra-sys-typography-role-label-large-line-height);letter-spacing:var(--skra-sys-typography-role-label-large-letter-spacing)}.skra-alert-dismiss{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;inline-size:var(--skra-comp-alert-dismiss-size);block-size:var(--skra-comp-alert-dismiss-size);margin:0;padding:0;border:0;background:transparent;color:inherit;cursor:pointer;border-radius:var(--skra-comp-alert-radius);transition:opacity var(--skra-comp-alert-motion-duration) var(--skra-comp-alert-motion-easing)}.skra-alert-dismiss:hover{opacity:.7}.skra-alert-dismiss:focus-visible{outline-style:solid;outline-color:var(--skra-comp-alert-focus-ring-color);outline-width:var(--skra-comp-alert-focus-ring-width);outline-offset:2px}.skra-alert-dismiss-glyph{font-size:1.25em;line-height:1}@media(prefers-reduced-motion:reduce){.skra-alert-dismiss{transition:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
90
98
|
}
|
|
91
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
99
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SkraAlert, decorators: [{
|
|
92
100
|
type: Component,
|
|
93
101
|
args: [{ selector: 'skra-alert', standalone: true, imports: [SkraAlertIcon, SkraAlertTitle], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, host: {
|
|
94
102
|
// Variant Surface reflection (ADR 035 §3.5)
|
|
@@ -99,7 +107,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImpor
|
|
|
99
107
|
// Smart Slots layout reflection (ADR 020 v2.0 — slot-presence, State-Surface-exempt §3.6)
|
|
100
108
|
'[attr.data-skra-has-icon]': 'hasIcon() ? "" : null',
|
|
101
109
|
'[attr.data-skra-has-title]': 'hasTitle() ? "" : null',
|
|
102
|
-
}, template: "@if (hasIcon()) {\n<span class=\"skra-alert-icon\">\n <ng-content select=\"[skra-alert-icon]\"></ng-content>\n</span>\n}\n\n<div class=\"skra-alert-content\">\n @if (hasTitle()) {\n <div class=\"skra-alert-title\">\n <ng-content select=\"[skra-alert-title]\"></ng-content>\n </div>\n }\n <div class=\"skra-alert-body\">\n <ng-content></ng-content>\n </div>\n</div>\n\n@if (dismissible()) {\n<button type=\"button\" class=\"skra-alert-dismiss\" (click)=\"onDismiss()\">\n <span class=\"skra-alert-dismiss-glyph\" aria-hidden=\"true\">×</span>\n <ng-content select=\"[skra-alert-close-label]\"></ng-content>\n</button>\n}\n", styles: ["@charset \"UTF-8\";:host{display:flex;align-items:flex-start;box-sizing:border-box;margin:0;gap:var(--skra-comp-alert-icon-gap);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);background:var(--skra-comp-alert-background);color:var(--skra-comp-alert-foreground);border-color:var(--skra-comp-alert-border-color);border-width:var(--skra-comp-alert-border-width);border-style:var(--skra-comp-alert-border-style);border-radius:var(--skra-comp-alert-radius);padding-block:var(--skra-comp-alert-padding-block);padding-inline:var(--skra-comp-alert-padding-inline);box-shadow:var(--skra-comp-alert-shadow)}:host([data-skra-emphasis=high]){--skra-comp-alert-border-width: 0}:host([data-skra-intent=neutral][data-skra-emphasis=high]){--skra-comp-alert-background: var( --skra-comp-alert-background-neutral-high, var(--skra-sys-color-neutral-base) );--skra-comp-alert-foreground: var( --skra-comp-alert-foreground-neutral-high, var(--skra-sys-color-neutral-contrast) );--skra-comp-alert-border-color: var( --skra-comp-alert-border-color-neutral-high, transparent )}:host([data-skra-intent=neutral][data-skra-emphasis=medium]){--skra-comp-alert-background: var( --skra-comp-alert-background-neutral-medium, var(--skra-sys-color-neutral-soft) );--skra-comp-alert-foreground: var( --skra-comp-alert-foreground-neutral-medium, var(--skra-sys-color-neutral-strong) );--skra-comp-alert-border-color: var( --skra-comp-alert-border-color-neutral-medium, var(--skra-sys-color-neutral-border) )}:host([data-skra-intent=info][data-skra-emphasis=high]){--skra-comp-alert-background: var( --skra-comp-alert-background-info-high, var(--skra-sys-color-info-base) );--skra-comp-alert-foreground: var( --skra-comp-alert-foreground-info-high, var(--skra-sys-color-info-contrast) );--skra-comp-alert-border-color: var( --skra-comp-alert-border-color-info-high, transparent )}:host([data-skra-intent=info][data-skra-emphasis=medium]){--skra-comp-alert-background: var( --skra-comp-alert-background-info-medium, var(--skra-sys-color-info-soft) );--skra-comp-alert-foreground: var( --skra-comp-alert-foreground-info-medium, var(--skra-sys-color-info-strong) );--skra-comp-alert-border-color: var( --skra-comp-alert-border-color-info-medium, var(--skra-sys-color-info-border) )}:host([data-skra-intent=success][data-skra-emphasis=high]){--skra-comp-alert-background: var( --skra-comp-alert-background-success-high, var(--skra-sys-color-success-base) );--skra-comp-alert-foreground: var( --skra-comp-alert-foreground-success-high, var(--skra-sys-color-success-contrast) );--skra-comp-alert-border-color: var( --skra-comp-alert-border-color-success-high, transparent )}:host([data-skra-intent=success][data-skra-emphasis=medium]){--skra-comp-alert-background: var( --skra-comp-alert-background-success-medium, var(--skra-sys-color-success-soft) );--skra-comp-alert-foreground: var( --skra-comp-alert-foreground-success-medium, var(--skra-sys-color-success-strong) );--skra-comp-alert-border-color: var( --skra-comp-alert-border-color-success-medium, var(--skra-sys-color-success-border) )}:host([data-skra-intent=warning][data-skra-emphasis=high]){--skra-comp-alert-background: var( --skra-comp-alert-background-warning-high, var(--skra-sys-color-warning-base) );--skra-comp-alert-foreground: var( --skra-comp-alert-foreground-warning-high, var(--skra-sys-color-warning-contrast) );--skra-comp-alert-border-color: var( --skra-comp-alert-border-color-warning-high, transparent )}:host([data-skra-intent=warning][data-skra-emphasis=medium]){--skra-comp-alert-background: var( --skra-comp-alert-background-warning-medium, var(--skra-sys-color-warning-soft) );--skra-comp-alert-foreground: var( --skra-comp-alert-foreground-warning-medium, var(--skra-sys-color-warning-strong) );--skra-comp-alert-border-color: var( --skra-comp-alert-border-color-warning-medium, var(--skra-sys-color-warning-border) )}:host([data-skra-intent=danger][data-skra-emphasis=high]){--skra-comp-alert-background: var( --skra-comp-alert-background-danger-high, var(--skra-sys-color-danger-base) );--skra-comp-alert-foreground: var( --skra-comp-alert-foreground-danger-high, var(--skra-sys-color-danger-contrast) );--skra-comp-alert-border-color: var( --skra-comp-alert-border-color-danger-high, transparent )}:host([data-skra-intent=danger][data-skra-emphasis=medium]){--skra-comp-alert-background: var( --skra-comp-alert-background-danger-medium, var(--skra-sys-color-danger-soft) );--skra-comp-alert-foreground: var( --skra-comp-alert-foreground-danger-medium, var(--skra-sys-color-danger-strong) );--skra-comp-alert-border-color: var( --skra-comp-alert-border-color-danger-medium, var(--skra-sys-color-danger-border) )}.skra-alert-icon{display:inline-flex;flex-shrink:0;align-items:center;block-size:1lh;--skra-comp-icon-size: var(--skra-comp-alert-icon-size)}.skra-alert-content{flex:1 1 auto;min-inline-size:0;display:flex;flex-direction:column;gap:var(--skra-comp-alert-title-gap)}.skra-alert-title{font-family:var(--skra-sys-typography-role-label-large-font-family);font-size:var(--skra-sys-typography-role-label-large-font-size);font-weight:var(--skra-sys-typography-role-label-large-font-weight);line-height:var(--skra-sys-typography-role-label-large-line-height);letter-spacing:var(--skra-sys-typography-role-label-large-letter-spacing)}.skra-alert-dismiss{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;inline-size:var(--skra-comp-alert-dismiss-size);block-size:var(--skra-comp-alert-dismiss-size);margin:0;padding:0;border:0;background:transparent;color:inherit;cursor:pointer;border-radius:var(--skra-comp-alert-radius);transition:opacity var(--skra-comp-alert-motion-duration) var(--skra-comp-alert-motion-easing)}.skra-alert-dismiss:hover{opacity:.7}.skra-alert-dismiss:focus-visible{outline-style:solid;outline-color:var(--skra-comp-alert-focus-ring-color);outline-width:var(--skra-comp-alert-focus-ring-width);outline-offset:2px}.skra-alert-dismiss-glyph{font-size:1.25em;line-height:1}@media(prefers-reduced-motion:reduce){.skra-alert-dismiss{transition:none}}\n"] }]
|
|
110
|
+
}, template: "@if (hasIcon()) {\r\n<span class=\"skra-alert-icon\">\r\n <ng-content select=\"[skra-alert-icon]\"></ng-content>\r\n</span>\r\n}\r\n\r\n<div class=\"skra-alert-content\">\r\n @if (hasTitle()) {\r\n <div class=\"skra-alert-title\">\r\n <ng-content select=\"[skra-alert-title]\"></ng-content>\r\n </div>\r\n }\r\n <div class=\"skra-alert-body\">\r\n <ng-content></ng-content>\r\n </div>\r\n</div>\r\n\r\n@if (dismissible()) {\r\n<button type=\"button\" class=\"skra-alert-dismiss\" (click)=\"onDismiss()\">\r\n <span class=\"skra-alert-dismiss-glyph\" aria-hidden=\"true\">×</span>\r\n <ng-content select=\"[skra-alert-close-label]\"></ng-content>\r\n</button>\r\n}\r\n", styles: ["@charset \"UTF-8\";:host{display:flex;align-items:flex-start;box-sizing:border-box;margin:0;gap:var(--skra-comp-alert-icon-gap);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);background:var(--skra-comp-alert-background);color:var(--skra-comp-alert-foreground);border-color:var(--skra-comp-alert-border-color);border-width:var(--skra-comp-alert-border-width);border-style:var(--skra-comp-alert-border-style);border-radius:var(--skra-comp-alert-radius);padding-block:var(--skra-comp-alert-padding-block);padding-inline:var(--skra-comp-alert-padding-inline);box-shadow:var(--skra-comp-alert-shadow)}:host([data-skra-emphasis=high]){--skra-comp-alert-border-width: 0}:host([data-skra-intent=neutral][data-skra-emphasis=high]){--skra-comp-alert-background: var( --skra-comp-alert-background-neutral-high, var(--skra-sys-color-neutral-base) );--skra-comp-alert-foreground: var( --skra-comp-alert-foreground-neutral-high, var(--skra-sys-color-neutral-contrast) );--skra-comp-alert-border-color: var( --skra-comp-alert-border-color-neutral-high, transparent )}:host([data-skra-intent=neutral][data-skra-emphasis=medium]){--skra-comp-alert-background: var( --skra-comp-alert-background-neutral-medium, var(--skra-sys-color-neutral-soft) );--skra-comp-alert-foreground: var( --skra-comp-alert-foreground-neutral-medium, var(--skra-sys-color-neutral-strong) );--skra-comp-alert-border-color: var( --skra-comp-alert-border-color-neutral-medium, var(--skra-sys-color-neutral-border) )}:host([data-skra-intent=info][data-skra-emphasis=high]){--skra-comp-alert-background: var( --skra-comp-alert-background-info-high, var(--skra-sys-color-info-base) );--skra-comp-alert-foreground: var( --skra-comp-alert-foreground-info-high, var(--skra-sys-color-info-contrast) );--skra-comp-alert-border-color: var( --skra-comp-alert-border-color-info-high, transparent )}:host([data-skra-intent=info][data-skra-emphasis=medium]){--skra-comp-alert-background: var( --skra-comp-alert-background-info-medium, var(--skra-sys-color-info-soft) );--skra-comp-alert-foreground: var( --skra-comp-alert-foreground-info-medium, var(--skra-sys-color-info-strong) );--skra-comp-alert-border-color: var( --skra-comp-alert-border-color-info-medium, var(--skra-sys-color-info-border) )}:host([data-skra-intent=success][data-skra-emphasis=high]){--skra-comp-alert-background: var( --skra-comp-alert-background-success-high, var(--skra-sys-color-success-base) );--skra-comp-alert-foreground: var( --skra-comp-alert-foreground-success-high, var(--skra-sys-color-success-contrast) );--skra-comp-alert-border-color: var( --skra-comp-alert-border-color-success-high, transparent )}:host([data-skra-intent=success][data-skra-emphasis=medium]){--skra-comp-alert-background: var( --skra-comp-alert-background-success-medium, var(--skra-sys-color-success-soft) );--skra-comp-alert-foreground: var( --skra-comp-alert-foreground-success-medium, var(--skra-sys-color-success-strong) );--skra-comp-alert-border-color: var( --skra-comp-alert-border-color-success-medium, var(--skra-sys-color-success-border) )}:host([data-skra-intent=warning][data-skra-emphasis=high]){--skra-comp-alert-background: var( --skra-comp-alert-background-warning-high, var(--skra-sys-color-warning-base) );--skra-comp-alert-foreground: var( --skra-comp-alert-foreground-warning-high, var(--skra-sys-color-warning-contrast) );--skra-comp-alert-border-color: var( --skra-comp-alert-border-color-warning-high, transparent )}:host([data-skra-intent=warning][data-skra-emphasis=medium]){--skra-comp-alert-background: var( --skra-comp-alert-background-warning-medium, var(--skra-sys-color-warning-soft) );--skra-comp-alert-foreground: var( --skra-comp-alert-foreground-warning-medium, var(--skra-sys-color-warning-strong) );--skra-comp-alert-border-color: var( --skra-comp-alert-border-color-warning-medium, var(--skra-sys-color-warning-border) )}:host([data-skra-intent=danger][data-skra-emphasis=high]){--skra-comp-alert-background: var( --skra-comp-alert-background-danger-high, var(--skra-sys-color-danger-base) );--skra-comp-alert-foreground: var( --skra-comp-alert-foreground-danger-high, var(--skra-sys-color-danger-contrast) );--skra-comp-alert-border-color: var( --skra-comp-alert-border-color-danger-high, transparent )}:host([data-skra-intent=danger][data-skra-emphasis=medium]){--skra-comp-alert-background: var( --skra-comp-alert-background-danger-medium, var(--skra-sys-color-danger-soft) );--skra-comp-alert-foreground: var( --skra-comp-alert-foreground-danger-medium, var(--skra-sys-color-danger-strong) );--skra-comp-alert-border-color: var( --skra-comp-alert-border-color-danger-medium, var(--skra-sys-color-danger-border) )}.skra-alert-icon{display:inline-flex;flex-shrink:0;align-items:center;block-size:1lh;--skra-comp-icon-size: var(--skra-comp-alert-icon-size)}.skra-alert-content{flex:1 1 auto;min-inline-size:0;display:flex;flex-direction:column;gap:var(--skra-comp-alert-title-gap)}.skra-alert-title{font-family:var(--skra-sys-typography-role-label-large-font-family);font-size:var(--skra-sys-typography-role-label-large-font-size);font-weight:var(--skra-sys-typography-role-label-large-font-weight);line-height:var(--skra-sys-typography-role-label-large-line-height);letter-spacing:var(--skra-sys-typography-role-label-large-letter-spacing)}.skra-alert-dismiss{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;inline-size:var(--skra-comp-alert-dismiss-size);block-size:var(--skra-comp-alert-dismiss-size);margin:0;padding:0;border:0;background:transparent;color:inherit;cursor:pointer;border-radius:var(--skra-comp-alert-radius);transition:opacity var(--skra-comp-alert-motion-duration) var(--skra-comp-alert-motion-easing)}.skra-alert-dismiss:hover{opacity:.7}.skra-alert-dismiss:focus-visible{outline-style:solid;outline-color:var(--skra-comp-alert-focus-ring-color);outline-width:var(--skra-comp-alert-focus-ring-width);outline-offset:2px}.skra-alert-dismiss-glyph{font-size:1.25em;line-height:1}@media(prefers-reduced-motion:reduce){.skra-alert-dismiss{transition:none}}\n"] }]
|
|
103
111
|
}], propDecorators: { intent: [{ type: i0.Input, args: [{ isSignal: true, alias: "intent", required: false }] }], emphasis: [{ type: i0.Input, args: [{ isSignal: true, alias: "emphasis", required: false }] }], live: [{ type: i0.Input, args: [{ isSignal: true, alias: "live", required: false }] }], dismissible: [{ type: i0.Input, args: [{ isSignal: true, alias: "dismissible", required: false }] }], dismissed: [{ type: i0.Output, args: ["dismissed"] }], iconSlot: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SkraAlertIcon), { isSignal: true }] }], titleSlot: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SkraAlertTitle), { isSignal: true }] }] } });
|
|
104
112
|
|
|
105
113
|
/**
|