@cdevhub/ngx-tw 0.2.1 → 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/README.md +264 -49
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs +11 -7
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-alert.mjs +43 -29
- package/fesm2022/cdevhub-ngx-tw-alert.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-aspect-ratio.mjs +103 -0
- package/fesm2022/cdevhub-ngx-tw-aspect-ratio.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs +56 -31
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-badge.mjs +61 -35
- package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +154 -93
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-button.mjs +24 -15
- package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +3 -3
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs +408 -215
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-card.mjs +33 -24
- package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs +144 -79
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +99 -47
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs +34 -20
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +46 -29
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs +195 -110
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +140 -73
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-core.mjs +16 -11
- package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +393 -149
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +305 -150
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs +56 -43
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +51 -33
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-file-upload.mjs +905 -0
- package/fesm2022/cdevhub-ngx-tw-file-upload.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +49 -26
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs +133 -74
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs +2 -2
- package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-icon.mjs +28 -17
- package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-input.mjs +37 -21
- package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-item.mjs +33 -24
- package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-menu.mjs +63 -48
- package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-number-input.mjs +622 -0
- package/fesm2022/cdevhub-ngx-tw-number-input.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs +137 -71
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-popover.mjs +101 -46
- package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +57 -30
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-radio.mjs +108 -57
- package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +46 -26
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-select.mjs +217 -122
- package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-separator.mjs +21 -12
- package/fesm2022/cdevhub-ngx-tw-separator.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs +58 -44
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-skeleton.mjs +25 -14
- package/fesm2022/cdevhub-ngx-tw-skeleton.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-slider.mjs +155 -79
- package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-sort.mjs +44 -25
- package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-spinner.mjs +29 -16
- package/fesm2022/cdevhub-ngx-tw-spinner.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-split.mjs +72 -42
- package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-stat.mjs +107 -64
- package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs +113 -47
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-switch.mjs +61 -32
- package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +88 -42
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-table.mjs +266 -118
- package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs +101 -51
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tags-input.mjs +798 -0
- package/fesm2022/cdevhub-ngx-tw-tags-input.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs +11 -7
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-theme.mjs +22 -14
- package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +243 -95
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs +149 -82
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-toast.mjs +89 -55
- package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +50 -28
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-transfer.mjs +1129 -0
- package/fesm2022/cdevhub-ngx-tw-transfer.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-tree.mjs +554 -0
- package/fesm2022/cdevhub-ngx-tw-tree.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw.mjs +7 -0
- package/fesm2022/cdevhub-ngx-tw.mjs.map +1 -1
- package/package.json +45 -20
- package/theme/index.css +10 -2
- package/types/cdevhub-ngx-tw-aspect-ratio.d.ts +40 -0
- package/types/cdevhub-ngx-tw-calendar.d.ts +39 -8
- package/types/cdevhub-ngx-tw-command-palette.d.ts +7 -0
- package/types/cdevhub-ngx-tw-date-picker.d.ts +36 -10
- package/types/cdevhub-ngx-tw-file-upload.d.ts +250 -0
- package/types/cdevhub-ngx-tw-form-field.d.ts +22 -3
- package/types/cdevhub-ngx-tw-icon-lucide.d.ts +21 -3
- package/types/cdevhub-ngx-tw-number-input.d.ts +130 -0
- package/types/cdevhub-ngx-tw-popover.d.ts +8 -0
- package/types/cdevhub-ngx-tw-stepper.d.ts +30 -2
- package/types/cdevhub-ngx-tw-tab-nav.d.ts +8 -0
- package/types/cdevhub-ngx-tw-table.d.ts +30 -1
- package/types/cdevhub-ngx-tw-tabs.d.ts +8 -0
- package/types/cdevhub-ngx-tw-tags-input.d.ts +217 -0
- package/types/cdevhub-ngx-tw-time-picker.d.ts +31 -6
- package/types/cdevhub-ngx-tw-transfer.d.ts +330 -0
- package/types/cdevhub-ngx-tw-tree.d.ts +189 -0
- package/types/cdevhub-ngx-tw.d.ts +7 -0
|
@@ -19,10 +19,10 @@ import { tv } from 'tailwind-variants';
|
|
|
19
19
|
* and serve different jobs (slot row geometry vs the consumer's badge group).
|
|
20
20
|
*/
|
|
21
21
|
class CodeBlockHeaderDirective {
|
|
22
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
23
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
22
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: CodeBlockHeaderDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
23
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: CodeBlockHeaderDirective, isStandalone: true, selector: "[twCodeBlockHeader]", host: { classAttribute: "inline-flex items-center gap-2 min-w-0" }, ngImport: i0 });
|
|
24
24
|
}
|
|
25
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
25
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: CodeBlockHeaderDirective, decorators: [{
|
|
26
26
|
type: Directive,
|
|
27
27
|
args: [{
|
|
28
28
|
selector: '[twCodeBlockHeader]',
|
|
@@ -73,11 +73,14 @@ const codeBlockVariants = tv({
|
|
|
73
73
|
*/
|
|
74
74
|
class CodeBlockComponent {
|
|
75
75
|
/** The code string to display and copy to clipboard. */
|
|
76
|
-
code = input.required(
|
|
76
|
+
code = input.required(/* @ts-ignore */
|
|
77
|
+
...(ngDevMode ? [{ debugName: "code" }] : /* istanbul ignore next */ []));
|
|
77
78
|
/** Optional language label displayed in the header (e.g. `'TypeScript'`, `'HTML'`). */
|
|
78
|
-
language = input(
|
|
79
|
+
language = input(/* @ts-ignore */
|
|
80
|
+
...(ngDevMode ? [undefined, { debugName: "language" }] : /* istanbul ignore next */ []));
|
|
79
81
|
/** Visual style of the container. Defaults to `'filled'`. */
|
|
80
|
-
variant = input('filled',
|
|
82
|
+
variant = input('filled', /* @ts-ignore */
|
|
83
|
+
...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
|
|
81
84
|
/** When true, wraps long lines instead of horizontal scrolling. Defaults to `false`. */
|
|
82
85
|
wrap = input(false, { ...(ngDevMode ? { debugName: "wrap" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
83
86
|
/**
|
|
@@ -85,13 +88,15 @@ class CodeBlockComponent {
|
|
|
85
88
|
* screen-reader announcement. Provide a partial override; missing fields
|
|
86
89
|
* fall back to English defaults.
|
|
87
90
|
*/
|
|
88
|
-
labels = input({},
|
|
91
|
+
labels = input({}, /* @ts-ignore */
|
|
92
|
+
...(ngDevMode ? [{ debugName: "labels" }] : /* istanbul ignore next */ []));
|
|
89
93
|
/** Fires when code is successfully copied to clipboard. */
|
|
90
94
|
copied = output();
|
|
91
95
|
/** Fires when the clipboard copy fails (e.g. user denied permission, no clipboard API available). Payload is an `Error` describing the failure. */
|
|
92
96
|
copyFailed = output();
|
|
93
97
|
/** Whether the copy-to-clipboard button is currently in its "copied" confirmation state. Two-way bindable via `[(isCopied)]`. Set to `true` for ~2s after a successful copy, then auto-resets to `false`. Defaults to `false`. */
|
|
94
|
-
isCopied = model(false,
|
|
98
|
+
isCopied = model(false, /* @ts-ignore */
|
|
99
|
+
...(ngDevMode ? [{ debugName: "isCopied" }] : /* istanbul ignore next */ []));
|
|
95
100
|
clipboard = inject(Clipboard);
|
|
96
101
|
liveAnnouncer = inject(LiveAnnouncer);
|
|
97
102
|
destroyRef = inject(DestroyRef);
|
|
@@ -103,21 +108,30 @@ class CodeBlockComponent {
|
|
|
103
108
|
copied: l.copied ?? 'Copied',
|
|
104
109
|
announcement: l.announcement ?? 'Copied to clipboard',
|
|
105
110
|
};
|
|
106
|
-
},
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
+
}, /* @ts-ignore */
|
|
112
|
+
...(ngDevMode ? [{ debugName: "resolvedLabels" }] : /* istanbul ignore next */ []));
|
|
113
|
+
variantResult = computed(() => codeBlockVariants({ variant: this.variant(), copied: this.isCopied() }), /* @ts-ignore */
|
|
114
|
+
...(ngDevMode ? [{ debugName: "variantResult" }] : /* istanbul ignore next */ []));
|
|
115
|
+
rootClasses = computed(() => this.variantResult().root(), /* @ts-ignore */
|
|
116
|
+
...(ngDevMode ? [{ debugName: "rootClasses" }] : /* istanbul ignore next */ []));
|
|
117
|
+
headerClasses = computed(() => this.variantResult().header(), /* @ts-ignore */
|
|
118
|
+
...(ngDevMode ? [{ debugName: "headerClasses" }] : /* istanbul ignore next */ []));
|
|
119
|
+
headerStartClasses = computed(() => this.variantResult().headerStart(), /* @ts-ignore */
|
|
120
|
+
...(ngDevMode ? [{ debugName: "headerStartClasses" }] : /* istanbul ignore next */ []));
|
|
111
121
|
preClasses = computed(() => {
|
|
112
122
|
const base = this.variantResult().pre();
|
|
113
123
|
return this.wrap() ? `${base} whitespace-pre-wrap` : `${base} whitespace-pre`;
|
|
114
|
-
},
|
|
115
|
-
|
|
116
|
-
|
|
124
|
+
}, /* @ts-ignore */
|
|
125
|
+
...(ngDevMode ? [{ debugName: "preClasses" }] : /* istanbul ignore next */ []));
|
|
126
|
+
copyButtonClasses = computed(() => this.variantResult().copyButton(), /* @ts-ignore */
|
|
127
|
+
...(ngDevMode ? [{ debugName: "copyButtonClasses" }] : /* istanbul ignore next */ []));
|
|
128
|
+
copyIconClasses = computed(() => this.variantResult().copyIcon(), /* @ts-ignore */
|
|
129
|
+
...(ngDevMode ? [{ debugName: "copyIconClasses" }] : /* istanbul ignore next */ []));
|
|
117
130
|
preAriaLabel = computed(() => {
|
|
118
131
|
const lang = this.language();
|
|
119
132
|
return lang ? `${lang} code` : 'Code';
|
|
120
|
-
},
|
|
133
|
+
}, /* @ts-ignore */
|
|
134
|
+
...(ngDevMode ? [{ debugName: "preAriaLabel" }] : /* istanbul ignore next */ []));
|
|
121
135
|
constructor() {
|
|
122
136
|
this.destroyRef.onDestroy(() => {
|
|
123
137
|
if (this.timeoutId) {
|
|
@@ -144,8 +158,8 @@ class CodeBlockComponent {
|
|
|
144
158
|
this.copyFailed.emit(new Error('Clipboard copy failed'));
|
|
145
159
|
}
|
|
146
160
|
}
|
|
147
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
148
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
161
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: CodeBlockComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
162
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: CodeBlockComponent, isStandalone: true, selector: "tw-code-block", inputs: { code: { classPropertyName: "code", publicName: "code", isSignal: true, isRequired: true, transformFunction: null }, language: { classPropertyName: "language", publicName: "language", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, wrap: { classPropertyName: "wrap", publicName: "wrap", isSignal: true, isRequired: false, transformFunction: null }, labels: { classPropertyName: "labels", publicName: "labels", isSignal: true, isRequired: false, transformFunction: null }, isCopied: { classPropertyName: "isCopied", publicName: "isCopied", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { copied: "copied", copyFailed: "copyFailed", isCopied: "isCopiedChange" }, host: { properties: { "class": "rootClasses()" } }, ngImport: i0, template: `
|
|
149
163
|
<div [class]="headerClasses()">
|
|
150
164
|
<div [class]="headerStartClasses()">
|
|
151
165
|
@if (language()) {
|
|
@@ -177,7 +191,7 @@ class CodeBlockComponent {
|
|
|
177
191
|
><code>{{ code() }}</code></pre>
|
|
178
192
|
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
179
193
|
}
|
|
180
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
194
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: CodeBlockComponent, decorators: [{
|
|
181
195
|
type: Component,
|
|
182
196
|
args: [{
|
|
183
197
|
selector: 'tw-code-block',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cdevhub-ngx-tw-code-block.mjs","sources":["../../../projects/ngx-tw/code-block/code-block.ts","../../../projects/ngx-tw/code-block/cdevhub-ngx-tw-code-block.ts"],"sourcesContent":["import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n Directive,\n inject,\n input,\n model,\n output,\n} from '@angular/core';\nimport { Clipboard } from '@angular/cdk/clipboard';\nimport { LiveAnnouncer } from '@angular/cdk/a11y';\nimport { tv } from 'tailwind-variants';\n\n/** Visual style of the code block container. */\nexport type CodeBlockVariant = 'filled' | 'outlined';\n\n/**\n * Localizable strings used by the code block. Provide a partial override —\n * any missing fields fall back to English defaults.\n */\nexport interface CodeBlockLabels {\n /** aria-label for the copy button in its resting state. Defaults to `'Copy code'`. */\n copy?: string;\n /** aria-label for the copy button after a successful copy. Defaults to `'Copied'`. */\n copied?: string;\n /** Text passed to LiveAnnouncer after a successful copy. Defaults to `'Copied to clipboard'`. */\n announcement?: string;\n}\n\n/**\n * Marker directive for projected header content (e.g. filename, secondary\n * actions). Sits alongside the language label inside the code block's\n * header row.\n *\n * @remarks\n * The host class (`inline-flex items-center gap-2 min-w-0`) styles the\n * projected element's *own* children — e.g. a filename `<span>` next to a\n * \"modified\" badge — and is distinct from the library's `headerStart` slot\n * wrapper that contains this element. The two carry overlapping utility names\n * (`items-center gap-2 min-w-0`) because both lay out flex children, but they\n * apply to different DOM nodes (parent slot vs the projected element itself)\n * and serve different jobs (slot row geometry vs the consumer's badge group).\n */\n@Directive({\n selector: '[twCodeBlockHeader]',\n host: {\n class: 'inline-flex items-center gap-2 min-w-0',\n },\n})\nexport class CodeBlockHeaderDirective {}\n\nconst codeBlockVariants = tv({\n slots: {\n root: 'flex flex-col rounded-lg overflow-hidden font-mono text-sm',\n header:\n 'flex items-center justify-between gap-2 px-4 py-2 border-b border-border text-xs text-fg-muted',\n headerStart: 'flex items-center gap-2 min-w-0 flex-1',\n pre: 'p-4 text-fg overflow-x-auto tw-scrollbar-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',\n copyButton:\n 'inline-flex items-center justify-center size-8 rounded-md cursor-pointer text-fg-muted hover:text-fg hover:bg-surface-muted transition-colors duration-normal motion-reduce:transition-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',\n copyIcon: 'size-4 shrink-0',\n },\n variants: {\n variant: {\n filled: { root: 'bg-surface-sunken border border-border-strong' },\n outlined: { root: 'bg-transparent border border-border' },\n },\n copied: {\n true: { copyButton: 'text-success-500 hover:text-success-500' },\n false: {},\n },\n },\n defaultVariants: {\n variant: 'filled',\n copied: false,\n },\n}, {\n twMerge: true,\n});\n\n/**\n * Code-display surface with copy-to-clipboard, optional language label, and a\n * projection slot for filename / extra actions.\n *\n * @remarks\n * **Accessibility.** The inner `<pre tabindex=\"0\" aria-label=\"...\">` is the\n * focusable, keyboard-reachable scroll surface; the host is presentational.\n * The `<pre>` carries `aria-label` for SR users but no landmark role — a\n * documentation page can mount many code blocks at once and ARIA's\n * `landmark-unique` rule (axe best-practice) flags duplicate\n * `region \"<lang> code\"` names. Consumers who want this block to act as a\n * page landmark can wrap it in `<section aria-label=\"…\">` with a unique\n * name.\n */\n@Component({\n selector: 'tw-code-block',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'rootClasses()',\n },\n template: `\n <div [class]=\"headerClasses()\">\n <div [class]=\"headerStartClasses()\">\n @if (language()) {\n <span class=\"font-sans font-medium select-none\">{{ language() }}</span>\n }\n <ng-content select=\"[twCodeBlockHeader]\" />\n </div>\n <button\n type=\"button\"\n [attr.aria-label]=\"isCopied() ? resolvedLabels().copied : resolvedLabels().copy\"\n [class]=\"copyButtonClasses()\"\n (click)=\"copyToClipboard()\"\n >\n @if (isCopied()) {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\" fill=\"currentColor\" [class]=\"copyIconClasses()\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M12.416 3.376a.75.75 0 0 1 .208 1.04l-5 7.5a.75.75 0 0 1-1.154.114l-3-3a.75.75 0 0 1 1.06-1.06l2.353 2.353 4.493-6.74a.75.75 0 0 1 1.04-.207Z\" clip-rule=\"evenodd\"/>\n </svg>\n } @else {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\" fill=\"currentColor\" [class]=\"copyIconClasses()\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M10.986 3H12a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h1.014A2.25 2.25 0 0 1 7.25 1h1.5a2.25 2.25 0 0 1 2.236 2ZM9.5 4v-.75a.75.75 0 0 0-.75-.75h-1.5a.75.75 0 0 0-.75.75V4h3Z\" clip-rule=\"evenodd\"/>\n </svg>\n }\n </button>\n </div>\n <pre\n tabindex=\"0\"\n [attr.aria-label]=\"preAriaLabel()\"\n [class]=\"preClasses()\"\n ><code>{{ code() }}</code></pre>\n `,\n})\nexport class CodeBlockComponent {\n /** The code string to display and copy to clipboard. */\n readonly code = input.required<string>();\n\n /** Optional language label displayed in the header (e.g. `'TypeScript'`, `'HTML'`). */\n readonly language = input<string>();\n\n /** Visual style of the container. Defaults to `'filled'`. */\n readonly variant = input<CodeBlockVariant>('filled');\n\n /** When true, wraps long lines instead of horizontal scrolling. Defaults to `false`. */\n readonly wrap = input(false, { transform: booleanAttribute });\n\n /**\n * Localizable strings for the copy button's aria-labels and the\n * screen-reader announcement. Provide a partial override; missing fields\n * fall back to English defaults.\n */\n readonly labels = input<CodeBlockLabels>({});\n\n /** Fires when code is successfully copied to clipboard. */\n readonly copied = output<void>();\n\n /** Fires when the clipboard copy fails (e.g. user denied permission, no clipboard API available). Payload is an `Error` describing the failure. */\n readonly copyFailed = output<Error>();\n\n /** Whether the copy-to-clipboard button is currently in its \"copied\" confirmation state. Two-way bindable via `[(isCopied)]`. Set to `true` for ~2s after a successful copy, then auto-resets to `false`. Defaults to `false`. */\n readonly isCopied = model(false);\n\n private readonly clipboard = inject(Clipboard);\n private readonly liveAnnouncer = inject(LiveAnnouncer);\n private readonly destroyRef = inject(DestroyRef);\n\n private timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n protected readonly resolvedLabels = computed(() => {\n const l = this.labels();\n return {\n copy: l.copy ?? 'Copy code',\n copied: l.copied ?? 'Copied',\n announcement: l.announcement ?? 'Copied to clipboard',\n };\n });\n\n private readonly variantResult = computed(() =>\n codeBlockVariants({ variant: this.variant(), copied: this.isCopied() }),\n );\n\n protected readonly rootClasses = computed(() => this.variantResult().root());\n protected readonly headerClasses = computed(() => this.variantResult().header());\n protected readonly headerStartClasses = computed(() => this.variantResult().headerStart());\n\n protected readonly preClasses = computed(() => {\n const base = this.variantResult().pre();\n return this.wrap() ? `${base} whitespace-pre-wrap` : `${base} whitespace-pre`;\n });\n\n protected readonly copyButtonClasses = computed(() => this.variantResult().copyButton());\n protected readonly copyIconClasses = computed(() => this.variantResult().copyIcon());\n\n protected readonly preAriaLabel = computed(() => {\n const lang = this.language();\n return lang ? `${lang} code` : 'Code';\n });\n\n constructor() {\n this.destroyRef.onDestroy(() => {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n }\n });\n }\n\n protected copyToClipboard(): void {\n // `Clipboard.copy()` (CDK) is synchronous and returns `false` when the\n // underlying clipboard write was blocked (permissions, insecure context,\n // jsdom). Surface that as `copyFailed` so consumers can show their own\n // fallback UI instead of silently dropping the action.\n const success = this.clipboard.copy(this.code());\n if (success) {\n this.isCopied.set(true);\n this.copied.emit();\n this.liveAnnouncer.announce(this.resolvedLabels().announcement);\n\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n }\n this.timeoutId = setTimeout(() => this.isCopied.set(false), 2000);\n } else {\n this.copyFailed.emit(new Error('Clipboard copy failed'));\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":"cdevhub-ngx-tw-code-block.mjs","sources":["../../../projects/ngx-tw/code-block/code-block.ts","../../../projects/ngx-tw/code-block/cdevhub-ngx-tw-code-block.ts"],"sourcesContent":["import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n Directive,\n inject,\n input,\n model,\n output,\n} from '@angular/core';\nimport { Clipboard } from '@angular/cdk/clipboard';\nimport { LiveAnnouncer } from '@angular/cdk/a11y';\nimport { tv } from 'tailwind-variants';\n\n/** Visual style of the code block container. */\nexport type CodeBlockVariant = 'filled' | 'outlined';\n\n/**\n * Localizable strings used by the code block. Provide a partial override —\n * any missing fields fall back to English defaults.\n */\nexport interface CodeBlockLabels {\n /** aria-label for the copy button in its resting state. Defaults to `'Copy code'`. */\n copy?: string;\n /** aria-label for the copy button after a successful copy. Defaults to `'Copied'`. */\n copied?: string;\n /** Text passed to LiveAnnouncer after a successful copy. Defaults to `'Copied to clipboard'`. */\n announcement?: string;\n}\n\n/**\n * Marker directive for projected header content (e.g. filename, secondary\n * actions). Sits alongside the language label inside the code block's\n * header row.\n *\n * @remarks\n * The host class (`inline-flex items-center gap-2 min-w-0`) styles the\n * projected element's *own* children — e.g. a filename `<span>` next to a\n * \"modified\" badge — and is distinct from the library's `headerStart` slot\n * wrapper that contains this element. The two carry overlapping utility names\n * (`items-center gap-2 min-w-0`) because both lay out flex children, but they\n * apply to different DOM nodes (parent slot vs the projected element itself)\n * and serve different jobs (slot row geometry vs the consumer's badge group).\n */\n@Directive({\n selector: '[twCodeBlockHeader]',\n host: {\n class: 'inline-flex items-center gap-2 min-w-0',\n },\n})\nexport class CodeBlockHeaderDirective {}\n\nconst codeBlockVariants = tv({\n slots: {\n root: 'flex flex-col rounded-lg overflow-hidden font-mono text-sm',\n header:\n 'flex items-center justify-between gap-2 px-4 py-2 border-b border-border text-xs text-fg-muted',\n headerStart: 'flex items-center gap-2 min-w-0 flex-1',\n pre: 'p-4 text-fg overflow-x-auto tw-scrollbar-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',\n copyButton:\n 'inline-flex items-center justify-center size-8 rounded-md cursor-pointer text-fg-muted hover:text-fg hover:bg-surface-muted transition-colors duration-normal motion-reduce:transition-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',\n copyIcon: 'size-4 shrink-0',\n },\n variants: {\n variant: {\n filled: { root: 'bg-surface-sunken border border-border-strong' },\n outlined: { root: 'bg-transparent border border-border' },\n },\n copied: {\n true: { copyButton: 'text-success-500 hover:text-success-500' },\n false: {},\n },\n },\n defaultVariants: {\n variant: 'filled',\n copied: false,\n },\n}, {\n twMerge: true,\n});\n\n/**\n * Code-display surface with copy-to-clipboard, optional language label, and a\n * projection slot for filename / extra actions.\n *\n * @remarks\n * **Accessibility.** The inner `<pre tabindex=\"0\" aria-label=\"...\">` is the\n * focusable, keyboard-reachable scroll surface; the host is presentational.\n * The `<pre>` carries `aria-label` for SR users but no landmark role — a\n * documentation page can mount many code blocks at once and ARIA's\n * `landmark-unique` rule (axe best-practice) flags duplicate\n * `region \"<lang> code\"` names. Consumers who want this block to act as a\n * page landmark can wrap it in `<section aria-label=\"…\">` with a unique\n * name.\n */\n@Component({\n selector: 'tw-code-block',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'rootClasses()',\n },\n template: `\n <div [class]=\"headerClasses()\">\n <div [class]=\"headerStartClasses()\">\n @if (language()) {\n <span class=\"font-sans font-medium select-none\">{{ language() }}</span>\n }\n <ng-content select=\"[twCodeBlockHeader]\" />\n </div>\n <button\n type=\"button\"\n [attr.aria-label]=\"isCopied() ? resolvedLabels().copied : resolvedLabels().copy\"\n [class]=\"copyButtonClasses()\"\n (click)=\"copyToClipboard()\"\n >\n @if (isCopied()) {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\" fill=\"currentColor\" [class]=\"copyIconClasses()\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M12.416 3.376a.75.75 0 0 1 .208 1.04l-5 7.5a.75.75 0 0 1-1.154.114l-3-3a.75.75 0 0 1 1.06-1.06l2.353 2.353 4.493-6.74a.75.75 0 0 1 1.04-.207Z\" clip-rule=\"evenodd\"/>\n </svg>\n } @else {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\" fill=\"currentColor\" [class]=\"copyIconClasses()\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M10.986 3H12a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h1.014A2.25 2.25 0 0 1 7.25 1h1.5a2.25 2.25 0 0 1 2.236 2ZM9.5 4v-.75a.75.75 0 0 0-.75-.75h-1.5a.75.75 0 0 0-.75.75V4h3Z\" clip-rule=\"evenodd\"/>\n </svg>\n }\n </button>\n </div>\n <pre\n tabindex=\"0\"\n [attr.aria-label]=\"preAriaLabel()\"\n [class]=\"preClasses()\"\n ><code>{{ code() }}</code></pre>\n `,\n})\nexport class CodeBlockComponent {\n /** The code string to display and copy to clipboard. */\n readonly code = input.required<string>();\n\n /** Optional language label displayed in the header (e.g. `'TypeScript'`, `'HTML'`). */\n readonly language = input<string>();\n\n /** Visual style of the container. Defaults to `'filled'`. */\n readonly variant = input<CodeBlockVariant>('filled');\n\n /** When true, wraps long lines instead of horizontal scrolling. Defaults to `false`. */\n readonly wrap = input(false, { transform: booleanAttribute });\n\n /**\n * Localizable strings for the copy button's aria-labels and the\n * screen-reader announcement. Provide a partial override; missing fields\n * fall back to English defaults.\n */\n readonly labels = input<CodeBlockLabels>({});\n\n /** Fires when code is successfully copied to clipboard. */\n readonly copied = output<void>();\n\n /** Fires when the clipboard copy fails (e.g. user denied permission, no clipboard API available). Payload is an `Error` describing the failure. */\n readonly copyFailed = output<Error>();\n\n /** Whether the copy-to-clipboard button is currently in its \"copied\" confirmation state. Two-way bindable via `[(isCopied)]`. Set to `true` for ~2s after a successful copy, then auto-resets to `false`. Defaults to `false`. */\n readonly isCopied = model(false);\n\n private readonly clipboard = inject(Clipboard);\n private readonly liveAnnouncer = inject(LiveAnnouncer);\n private readonly destroyRef = inject(DestroyRef);\n\n private timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n protected readonly resolvedLabels = computed(() => {\n const l = this.labels();\n return {\n copy: l.copy ?? 'Copy code',\n copied: l.copied ?? 'Copied',\n announcement: l.announcement ?? 'Copied to clipboard',\n };\n });\n\n private readonly variantResult = computed(() =>\n codeBlockVariants({ variant: this.variant(), copied: this.isCopied() }),\n );\n\n protected readonly rootClasses = computed(() => this.variantResult().root());\n protected readonly headerClasses = computed(() => this.variantResult().header());\n protected readonly headerStartClasses = computed(() => this.variantResult().headerStart());\n\n protected readonly preClasses = computed(() => {\n const base = this.variantResult().pre();\n return this.wrap() ? `${base} whitespace-pre-wrap` : `${base} whitespace-pre`;\n });\n\n protected readonly copyButtonClasses = computed(() => this.variantResult().copyButton());\n protected readonly copyIconClasses = computed(() => this.variantResult().copyIcon());\n\n protected readonly preAriaLabel = computed(() => {\n const lang = this.language();\n return lang ? `${lang} code` : 'Code';\n });\n\n constructor() {\n this.destroyRef.onDestroy(() => {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n }\n });\n }\n\n protected copyToClipboard(): void {\n // `Clipboard.copy()` (CDK) is synchronous and returns `false` when the\n // underlying clipboard write was blocked (permissions, insecure context,\n // jsdom). Surface that as `copyFailed` so consumers can show their own\n // fallback UI instead of silently dropping the action.\n const success = this.clipboard.copy(this.code());\n if (success) {\n this.isCopied.set(true);\n this.copied.emit();\n this.liveAnnouncer.announce(this.resolvedLabels().announcement);\n\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n }\n this.timeoutId = setTimeout(() => this.isCopied.set(false), 2000);\n } else {\n this.copyFailed.emit(new Error('Clipboard copy failed'));\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -99,11 +99,12 @@ class CollapsibleIconDirective {
|
|
|
99
99
|
classes = computed(() => {
|
|
100
100
|
const base = this.collapsible.iconClasses();
|
|
101
101
|
return this.collapsible.open() ? `${base} rotate-180` : base;
|
|
102
|
-
},
|
|
103
|
-
|
|
104
|
-
static
|
|
102
|
+
}, /* @ts-ignore */
|
|
103
|
+
...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
104
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: CollapsibleIconDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
105
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: CollapsibleIconDirective, isStandalone: true, selector: "[twCollapsibleIcon]", host: { properties: { "class": "classes()" } }, ngImport: i0 });
|
|
105
106
|
}
|
|
106
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
107
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: CollapsibleIconDirective, decorators: [{
|
|
107
108
|
type: Directive,
|
|
108
109
|
args: [{
|
|
109
110
|
selector: '[twCollapsibleIcon]',
|
|
@@ -128,7 +129,8 @@ class CollapsibleTriggerDirective {
|
|
|
128
129
|
iconClasses = computed(() => {
|
|
129
130
|
const base = this.collapsible.iconClasses();
|
|
130
131
|
return this.collapsible.open() ? `${base} rotate-180` : base;
|
|
131
|
-
},
|
|
132
|
+
}, /* @ts-ignore */
|
|
133
|
+
...(ngDevMode ? [{ debugName: "iconClasses" }] : /* istanbul ignore next */ []));
|
|
132
134
|
onClick() {
|
|
133
135
|
this.collapsible.toggle();
|
|
134
136
|
}
|
|
@@ -155,8 +157,8 @@ class CollapsibleTriggerDirective {
|
|
|
155
157
|
getLabel() {
|
|
156
158
|
return this.elementRef.nativeElement.textContent?.trim() ?? '';
|
|
157
159
|
}
|
|
158
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
159
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
160
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: CollapsibleTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
161
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: CollapsibleTriggerDirective, isStandalone: true, selector: "[twCollapsibleTrigger]", host: { listeners: { "click": "onClick()", "keydown": "onKeydown($event)" }, properties: { "class": "classes()", "attr.aria-expanded": "collapsible.open()", "attr.aria-controls": "collapsible.panelId", "attr.aria-disabled": "collapsible.disabled() || null", "attr.tabindex": "collapsible.disabled() ? -1 : 0", "attr.id": "collapsible.triggerId" } }, ngImport: i0, template: `
|
|
160
162
|
<ng-content />
|
|
161
163
|
@if (!collapsible.customIcon()) {
|
|
162
164
|
<svg [class]="iconClasses()" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
|
@@ -165,7 +167,7 @@ class CollapsibleTriggerDirective {
|
|
|
165
167
|
}
|
|
166
168
|
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
167
169
|
}
|
|
168
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
170
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: CollapsibleTriggerDirective, decorators: [{
|
|
169
171
|
type: Component,
|
|
170
172
|
args: [{
|
|
171
173
|
selector: '[twCollapsibleTrigger]',
|
|
@@ -196,22 +198,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
196
198
|
// ── CollapsibleComponent ──
|
|
197
199
|
class CollapsibleComponent {
|
|
198
200
|
/** Unique identifier for this panel. Required when used inside a group. */
|
|
199
|
-
value = input('',
|
|
201
|
+
value = input('', /* @ts-ignore */
|
|
202
|
+
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
200
203
|
/** Bundles decorative axes: `variant`, `color`, `size`. Accepts a partial; unset keys fall back to the defaults (`{ variant: 'default', color: 'neutral', size: 'md' }`). */
|
|
201
|
-
display = input({},
|
|
204
|
+
display = input({}, /* @ts-ignore */
|
|
205
|
+
...(ngDevMode ? [{ debugName: "display" }] : /* istanbul ignore next */ []));
|
|
202
206
|
/** When true, the panel cannot be toggled and appears dimmed. Defaults to `false`. */
|
|
203
207
|
disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
204
208
|
/** When true, content is rendered on first open and kept in the DOM across toggles. Defaults to `false`. */
|
|
205
209
|
keepAlive = input(false, { ...(ngDevMode ? { debugName: "keepAlive" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
206
210
|
/** Whether the panel is expanded. Two-way bindable. Defaults to `false`. */
|
|
207
|
-
open = model(false,
|
|
211
|
+
open = model(false, /* @ts-ignore */
|
|
212
|
+
...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
|
|
208
213
|
/** Fires after the panel is toggled. Payload is the new open state. */
|
|
209
214
|
toggled = output();
|
|
210
215
|
/** @internal */
|
|
211
216
|
group = inject(CollapsibleGroupComponent, { optional: true });
|
|
212
217
|
liveAnnouncer = inject(LiveAnnouncer);
|
|
213
218
|
/** @internal */
|
|
214
|
-
customIcon = contentChild(CollapsibleIconDirective,
|
|
219
|
+
customIcon = contentChild(CollapsibleIconDirective, /* @ts-ignore */
|
|
220
|
+
...(ngDevMode ? [{ debugName: "customIcon" }] : /* istanbul ignore next */ []));
|
|
215
221
|
componentId = `tw-collapsible-${nextId++}`;
|
|
216
222
|
triggerId = `${this.componentId}-trigger`;
|
|
217
223
|
panelId = `${this.componentId}-panel`;
|
|
@@ -229,7 +235,8 @@ class CollapsibleComponent {
|
|
|
229
235
|
resolvedDisplay = computed(() => ({
|
|
230
236
|
...DISPLAY_DEFAULTS,
|
|
231
237
|
...this.display(),
|
|
232
|
-
}),
|
|
238
|
+
}), /* @ts-ignore */
|
|
239
|
+
...(ngDevMode ? [{ debugName: "resolvedDisplay" }] : /* istanbul ignore next */ []));
|
|
233
240
|
// ── Variant classes ──
|
|
234
241
|
variantResult = computed(() => {
|
|
235
242
|
const { variant, color, size } = this.resolvedDisplay();
|
|
@@ -240,15 +247,21 @@ class CollapsibleComponent {
|
|
|
240
247
|
disabled: this.disabled(),
|
|
241
248
|
inGroup: !!this.group,
|
|
242
249
|
});
|
|
243
|
-
},
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
250
|
+
}, /* @ts-ignore */
|
|
251
|
+
...(ngDevMode ? [{ debugName: "variantResult" }] : /* istanbul ignore next */ []));
|
|
252
|
+
rootClasses = computed(() => this.variantResult().root(), /* @ts-ignore */
|
|
253
|
+
...(ngDevMode ? [{ debugName: "rootClasses" }] : /* istanbul ignore next */ []));
|
|
254
|
+
triggerClasses = computed(() => this.variantResult().trigger(), /* @ts-ignore */
|
|
255
|
+
...(ngDevMode ? [{ debugName: "triggerClasses" }] : /* istanbul ignore next */ []));
|
|
256
|
+
iconClasses = computed(() => this.variantResult().icon(), /* @ts-ignore */
|
|
257
|
+
...(ngDevMode ? [{ debugName: "iconClasses" }] : /* istanbul ignore next */ []));
|
|
258
|
+
contentClasses = computed(() => this.variantResult().content(), /* @ts-ignore */
|
|
259
|
+
...(ngDevMode ? [{ debugName: "contentClasses" }] : /* istanbul ignore next */ []));
|
|
248
260
|
contentWrapperClasses = computed(() => {
|
|
249
261
|
const base = this.contentClasses();
|
|
250
262
|
return this.keepAlive() ? `${base} collapsible-keep-alive` : base;
|
|
251
|
-
},
|
|
263
|
+
}, /* @ts-ignore */
|
|
264
|
+
...(ngDevMode ? [{ debugName: "contentWrapperClasses" }] : /* istanbul ignore next */ []));
|
|
252
265
|
/** @internal Toggle the open state. Called by the trigger directive. */
|
|
253
266
|
toggle() {
|
|
254
267
|
if (this.disabled())
|
|
@@ -271,8 +284,8 @@ class CollapsibleComponent {
|
|
|
271
284
|
announceState(isOpen) {
|
|
272
285
|
this.liveAnnouncer.announce(isOpen ? 'Section expanded' : 'Section collapsed');
|
|
273
286
|
}
|
|
274
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
275
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
287
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: CollapsibleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
288
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: CollapsibleComponent, isStandalone: true, selector: "tw-collapsible", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, display: { classPropertyName: "display", publicName: "display", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, keepAlive: { classPropertyName: "keepAlive", publicName: "keepAlive", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", toggled: "toggled" }, host: { properties: { "class": "rootClasses()" } }, queries: [{ propertyName: "customIcon", first: true, predicate: CollapsibleIconDirective, descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
276
289
|
<ng-content select="[twCollapsibleTrigger]" />
|
|
277
290
|
@if (keepAlive() ? activated() : open()) {
|
|
278
291
|
<div [class]="contentWrapperClasses()"
|
|
@@ -289,7 +302,7 @@ class CollapsibleComponent {
|
|
|
289
302
|
}
|
|
290
303
|
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
291
304
|
}
|
|
292
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
305
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: CollapsibleComponent, decorators: [{
|
|
293
306
|
type: Component,
|
|
294
307
|
args: [{
|
|
295
308
|
selector: 'tw-collapsible',
|
|
@@ -330,20 +343,24 @@ class CollapsibleGroupComponent {
|
|
|
330
343
|
*/
|
|
331
344
|
accordion = input(false, { ...(ngDevMode ? { debugName: "accordion" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
332
345
|
/** The value(s) of currently open panels. String in accordion mode, string array in independent mode. `null` when no panel is open in accordion mode. Two-way bindable. Defaults to `null`. */
|
|
333
|
-
value = model(null,
|
|
346
|
+
value = model(null, /* @ts-ignore */
|
|
347
|
+
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
334
348
|
/**
|
|
335
349
|
* @internal Wrapper `role` attribute. Subclasses may override (e.g.
|
|
336
350
|
* `AccordionComponent` returns `null` per APG — accordions don't carry
|
|
337
351
|
* `role="group"`).
|
|
338
352
|
*/
|
|
339
|
-
hostRole = computed(() => 'group',
|
|
353
|
+
hostRole = computed(() => 'group', /* @ts-ignore */
|
|
354
|
+
...(ngDevMode ? [{ debugName: "hostRole" }] : /* istanbul ignore next */ []));
|
|
340
355
|
/**
|
|
341
356
|
* @internal Host class string. Subclasses may override to provide their own
|
|
342
357
|
* variant-driven string (e.g. `AccordionComponent.rootClasses`).
|
|
343
358
|
*/
|
|
344
|
-
hostClasses = computed(() => 'block rounded-lg overflow-hidden divide-y divide-border',
|
|
359
|
+
hostClasses = computed(() => 'block rounded-lg overflow-hidden divide-y divide-border', /* @ts-ignore */
|
|
360
|
+
...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
|
|
345
361
|
/** @internal */
|
|
346
|
-
items = contentChildren(CollapsibleComponent,
|
|
362
|
+
items = contentChildren(CollapsibleComponent, /* @ts-ignore */
|
|
363
|
+
...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
|
|
347
364
|
/** @internal */
|
|
348
365
|
triggers = contentChildren(CollapsibleTriggerDirective, { ...(ngDevMode ? { debugName: "triggers" } : /* istanbul ignore next */ {}), descendants: true });
|
|
349
366
|
keyManager = null;
|
|
@@ -481,10 +498,10 @@ class CollapsibleGroupComponent {
|
|
|
481
498
|
}
|
|
482
499
|
this.keyManager.onKeydown(event);
|
|
483
500
|
}
|
|
484
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
485
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "
|
|
501
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: CollapsibleGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
502
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.0.7", type: CollapsibleGroupComponent, isStandalone: true, selector: "tw-collapsible-group", inputs: { accordion: { classPropertyName: "accordion", publicName: "accordion", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { properties: { "attr.role": "hostRole()", "class": "hostClasses()" } }, queries: [{ propertyName: "items", predicate: CollapsibleComponent, isSignal: true }, { propertyName: "triggers", predicate: CollapsibleTriggerDirective, descendants: true, isSignal: true }], ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
486
503
|
}
|
|
487
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
504
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: CollapsibleGroupComponent, decorators: [{
|
|
488
505
|
type: Component,
|
|
489
506
|
args: [{
|
|
490
507
|
selector: 'tw-collapsible-group',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cdevhub-ngx-tw-collapsible.mjs","sources":["../../../projects/ngx-tw/collapsible/collapsible.ts","../../../projects/ngx-tw/collapsible/cdevhub-ngx-tw-collapsible.ts"],"sourcesContent":["import {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n contentChildren,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n isDevMode,\n linkedSignal,\n model,\n output,\n untracked,\n ViewEncapsulation,\n} from '@angular/core';\nimport { type FocusableOption, FocusKeyManager, LiveAnnouncer } from '@angular/cdk/a11y';\nimport { tv } from 'tailwind-variants';\nimport type { TwColor, TwSize } from '@cdevhub/ngx-tw/core';\n\n/** Visual style of the collapsible container. */\nexport type CollapsibleVariant = 'default' | 'bordered' | 'ghost' | 'filled';\n\n/** Decorative axes bundled into a single collapsible input. */\nexport interface CollapsibleDisplay {\n /** Visual style of the panel container. Defaults to `'default'`. */\n variant?: CollapsibleVariant;\n /** Semantic color; applies to the `bordered` and `filled` variants. Defaults to `'neutral'`. */\n color?: TwColor;\n /** Padding scale for the trigger and content sections. Defaults to `'md'`. */\n size?: TwSize;\n}\n\nconst DISPLAY_DEFAULTS: Required<CollapsibleDisplay> = {\n variant: 'default',\n color: 'neutral',\n size: 'md',\n};\n\n// ── tv() config ──\n\nconst collapsibleVariants = tv({\n slots: {\n root: 'block rounded-lg overflow-hidden',\n trigger:\n 'flex w-full items-center justify-between gap-3 bg-transparent border-0 appearance-none cursor-pointer text-sm font-medium text-fg transition-colors duration-normal motion-reduce:transition-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',\n icon: 'size-5 shrink-0 text-fg-muted transition-transform duration-normal motion-reduce:transition-none',\n content: 'text-sm text-fg',\n },\n variants: {\n variant: {\n default: {\n root: 'border-b border-border',\n trigger: 'hover:bg-surface-muted',\n },\n bordered: {\n root: 'border border-border',\n trigger: 'hover:bg-surface-muted',\n content: 'border-t border-border',\n },\n ghost: {\n root: '',\n trigger: 'hover:bg-surface-muted rounded-md',\n },\n filled: {\n root: '',\n },\n },\n size: {\n xs: { trigger: 'px-2 py-1 text-xs', content: 'p-2' },\n sm: { trigger: 'px-3 py-1.5 text-sm', content: 'p-3' },\n md: { trigger: 'px-4 py-2 text-sm', content: 'p-4' },\n lg: { trigger: 'px-5 py-2.5 text-base', content: 'p-6' },\n xl: { trigger: 'px-6 py-3 text-base', content: 'p-8' },\n },\n color: {\n primary: {},\n secondary: {},\n accent: {},\n neutral: {},\n info: {},\n success: {},\n warning: {},\n error: {},\n },\n disabled: {\n true: { root: 'opacity-50 pointer-events-none' },\n false: {},\n },\n inGroup: {\n true: { root: 'rounded-none border-b-0 border-0' },\n false: {},\n },\n },\n compoundVariants: [\n // ── Filled + color ──\n { variant: 'filled', color: 'primary', class: { root: 'bg-primary-50', trigger: 'text-primary-800 hover:bg-primary-100', content: 'text-primary-700', icon: 'text-primary-600' } },\n { variant: 'filled', color: 'secondary', class: { root: 'bg-secondary-50', trigger: 'text-secondary-800 hover:bg-secondary-100', content: 'text-secondary-700', icon: 'text-secondary-600' } },\n { variant: 'filled', color: 'accent', class: { root: 'bg-accent-50', trigger: 'text-accent-800 hover:bg-accent-100', content: 'text-accent-700', icon: 'text-accent-600' } },\n { variant: 'filled', color: 'neutral', class: { root: 'bg-surface-muted', trigger: 'text-fg hover:bg-surface-sunken', content: 'text-fg-muted' } },\n { variant: 'filled', color: 'info', class: { root: 'bg-info-50', trigger: 'text-info-800 hover:bg-info-100', content: 'text-info-700', icon: 'text-info-600' } },\n { variant: 'filled', color: 'success', class: { root: 'bg-success-50', trigger: 'text-success-800 hover:bg-success-100', content: 'text-success-700', icon: 'text-success-600' } },\n { variant: 'filled', color: 'warning', class: { root: 'bg-warning-50', trigger: 'text-warning-800 hover:bg-warning-100', content: 'text-warning-700', icon: 'text-warning-600' } },\n { variant: 'filled', color: 'error', class: { root: 'bg-error-50', trigger: 'text-error-800 hover:bg-error-100', content: 'text-error-700', icon: 'text-error-600' } },\n\n // ── Bordered + color ──\n { variant: 'bordered', color: 'primary', class: { root: 'border-primary-300' } },\n { variant: 'bordered', color: 'secondary', class: { root: 'border-secondary-300' } },\n { variant: 'bordered', color: 'accent', class: { root: 'border-accent-300' } },\n { variant: 'bordered', color: 'info', class: { root: 'border-info-300' } },\n { variant: 'bordered', color: 'success', class: { root: 'border-success-300' } },\n { variant: 'bordered', color: 'warning', class: { root: 'border-warning-300' } },\n { variant: 'bordered', color: 'error', class: { root: 'border-error-300' } },\n ],\n defaultVariants: {\n variant: 'default',\n color: 'neutral',\n size: 'md',\n disabled: false,\n inGroup: false,\n },\n}, {\n twMerge: true,\n});\n\n// ── Unique ID counter ──\nlet nextId = 0;\n\n// ── CollapsibleIconDirective ──\n\n@Directive({\n selector: '[twCollapsibleIcon]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class CollapsibleIconDirective {\n private readonly collapsible = inject(CollapsibleComponent);\n\n /** @internal */\n readonly classes = computed(() => {\n const base = this.collapsible.iconClasses();\n return this.collapsible.open() ? `${base} rotate-180` : base;\n });\n}\n\n// ── CollapsibleTriggerDirective ──\n\n/**\n * Marks the toggle element inside a `<tw-collapsible>`. Apply this to a\n * native `<button>`; the directive wires up ARIA, keyboard handling, and\n * focus management. Custom hosts (e.g. `<div>`) are not supported.\n */\n@Component({\n selector: '[twCollapsibleTrigger]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n // ViewEncapsulation.None — the directive's host IS the consumer's <button>;\n // scoped styles can't reach a host that lives outside this component's tree.\n encapsulation: ViewEncapsulation.None,\n host: {\n '[class]': 'classes()',\n '[attr.aria-expanded]': 'collapsible.open()',\n '[attr.aria-controls]': 'collapsible.panelId',\n '[attr.aria-disabled]': 'collapsible.disabled() || null',\n '[attr.tabindex]': 'collapsible.disabled() ? -1 : 0',\n '[attr.id]': 'collapsible.triggerId',\n '(click)': 'onClick()',\n '(keydown)': 'onKeydown($event)',\n },\n template: `\n <ng-content />\n @if (!collapsible.customIcon()) {\n <svg [class]=\"iconClasses()\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M5.22 8.22a.75.75 0 0 1 1.06 0L10 11.94l3.72-3.72a.75.75 0 1 1 1.06 1.06l-4.25 4.25a.75.75 0 0 1-1.06 0L5.22 9.28a.75.75 0 0 1 0-1.06Z\" clip-rule=\"evenodd\" />\n </svg>\n }\n `,\n})\nexport class CollapsibleTriggerDirective implements FocusableOption {\n /** @internal */\n readonly collapsible = inject(CollapsibleComponent);\n readonly elementRef = inject(ElementRef<HTMLElement>);\n\n /** @internal */\n readonly classes = this.collapsible.triggerClasses;\n\n /** @internal */\n readonly iconClasses = computed(() => {\n const base = this.collapsible.iconClasses();\n return this.collapsible.open() ? `${base} rotate-180` : base;\n });\n\n onClick(): void {\n this.collapsible.toggle();\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.collapsible.toggle();\n return;\n }\n\n // Delegate arrow key navigation to group\n const group = this.collapsible.group;\n if (group) {\n group.onTriggerKeydown(event);\n }\n }\n\n focus(): void {\n this.elementRef.nativeElement.focus();\n }\n\n /** @internal FocusableOption: lets FocusKeyManager skip disabled triggers. */\n get disabled(): boolean {\n return this.collapsible.disabled();\n }\n\n /** @internal FocusableOption: text label for typeahead navigation. */\n getLabel(): string {\n return this.elementRef.nativeElement.textContent?.trim() ?? '';\n }\n}\n\n// ── CollapsibleComponent ──\n\n@Component({\n selector: 'tw-collapsible',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'rootClasses()',\n },\n template: `\n <ng-content select=\"[twCollapsibleTrigger]\" />\n @if (keepAlive() ? activated() : open()) {\n <div [class]=\"contentWrapperClasses()\"\n [attr.data-open]=\"open()\"\n [attr.id]=\"panelId\"\n [attr.aria-labelledby]=\"triggerId\"\n role=\"region\"\n [animate.enter]=\"'collapsible-enter'\"\n [animate.leave]=\"keepAlive() ? '' : 'collapsible-leave'\">\n <div class=\"overflow-hidden\">\n <ng-content />\n </div>\n </div>\n }\n `,\n})\nexport class CollapsibleComponent {\n /** Unique identifier for this panel. Required when used inside a group. */\n readonly value = input<string>('');\n\n /** Bundles decorative axes: `variant`, `color`, `size`. Accepts a partial; unset keys fall back to the defaults (`{ variant: 'default', color: 'neutral', size: 'md' }`). */\n readonly display = input<CollapsibleDisplay>({});\n\n /** When true, the panel cannot be toggled and appears dimmed. Defaults to `false`. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** When true, content is rendered on first open and kept in the DOM across toggles. Defaults to `false`. */\n readonly keepAlive = input(false, { transform: booleanAttribute });\n\n /** Whether the panel is expanded. Two-way bindable. Defaults to `false`. */\n readonly open = model(false);\n\n /** Fires after the panel is toggled. Payload is the new open state. */\n readonly toggled = output<boolean>();\n\n /** @internal */\n readonly group = inject(CollapsibleGroupComponent, { optional: true });\n private readonly liveAnnouncer = inject(LiveAnnouncer);\n\n /** @internal */\n readonly customIcon = contentChild(CollapsibleIconDirective);\n\n private readonly componentId = `tw-collapsible-${nextId++}`;\n readonly triggerId = `${this.componentId}-trigger`;\n readonly panelId = `${this.componentId}-panel`;\n\n /**\n * @internal Tracks whether the panel has been opened at least once (for keepAlive mode).\n *\n * Latches to `true` the first time `open` is `true` and stays `true` for the\n * lifetime of the component. Implemented as a `linkedSignal` so the derivation\n * lives next to the source — `activated()` reads cleanly as \"derived from open\".\n */\n readonly activated = linkedSignal<boolean, boolean>({\n source: () => this.open(),\n computation: (open, prev) => (prev?.value ?? false) || open,\n });\n\n // ── Resolved display config ──\n\n /** @internal Resolved decorative configuration. */\n readonly resolvedDisplay = computed<Required<CollapsibleDisplay>>(() => ({\n ...DISPLAY_DEFAULTS,\n ...this.display(),\n }));\n\n // ── Variant classes ──\n\n private readonly variantResult = computed(() => {\n const { variant, color, size } = this.resolvedDisplay();\n return collapsibleVariants({\n variant,\n color,\n size,\n disabled: this.disabled(),\n inGroup: !!this.group,\n });\n });\n\n readonly rootClasses = computed(() => this.variantResult().root());\n readonly triggerClasses = computed(() => this.variantResult().trigger());\n readonly iconClasses = computed(() => this.variantResult().icon());\n readonly contentClasses = computed(() => this.variantResult().content());\n\n readonly contentWrapperClasses = computed(() => {\n const base = this.contentClasses();\n return this.keepAlive() ? `${base} collapsible-keep-alive` : base;\n });\n\n /** @internal Toggle the open state. Called by the trigger directive. */\n toggle(): void {\n if (this.disabled()) return;\n\n if (this.group) {\n this.group.toggleItem(this);\n } else {\n const next = !this.open();\n this.open.set(next);\n this.toggled.emit(next);\n this.announceState(next);\n }\n }\n\n /** @internal Set the open state programmatically (used by group). */\n setOpen(value: boolean): void {\n this.open.set(value);\n }\n\n /** @internal */\n announceState(isOpen: boolean): void {\n this.liveAnnouncer.announce(\n isOpen ? 'Section expanded' : 'Section collapsed',\n );\n }\n}\n\n// ── CollapsibleGroupComponent ──\n\n@Component({\n selector: 'tw-collapsible-group',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n // Use bindings (not static attributes) so subclasses can override the values.\n // Angular DOES inherit host metadata across `extends`; literal-string entries\n // can't be turned off by a subclass, but binding expressions are evaluated\n // against the actual instance and so respect subclass overrides of the\n // backing signal/computed.\n '[attr.role]': 'hostRole()',\n '[class]': 'hostClasses()',\n },\n template: `<ng-content />`,\n})\nexport class CollapsibleGroupComponent {\n /**\n * When true, only one panel can be open at a time.\n *\n * `AccordionComponent` (subclass) ignores this input and drives the same\n * behaviour from its own `type` input via the `isAccordionMode()` /\n * `canCollapseSingleMode()` virtual hooks below. Consumers using\n * `<tw-collapsible-group>` directly should bind this input; consumers using\n * `<tw-accordion>` should bind `type=\"single\"` / `type=\"multiple\"` instead.\n *\n * Defaults to `false`.\n */\n readonly accordion = input(false, { transform: booleanAttribute });\n\n /** The value(s) of currently open panels. String in accordion mode, string array in independent mode. `null` when no panel is open in accordion mode. Two-way bindable. Defaults to `null`. */\n readonly value = model<string | string[] | null>(null);\n\n /**\n * @internal Wrapper `role` attribute. Subclasses may override (e.g.\n * `AccordionComponent` returns `null` per APG — accordions don't carry\n * `role=\"group\"`).\n */\n readonly hostRole = computed<string | null>(() => 'group');\n\n /**\n * @internal Host class string. Subclasses may override to provide their own\n * variant-driven string (e.g. `AccordionComponent.rootClasses`).\n */\n readonly hostClasses = computed(() => 'block rounded-lg overflow-hidden divide-y divide-border');\n\n /** @internal */\n readonly items = contentChildren(CollapsibleComponent);\n\n /** @internal */\n readonly triggers = contentChildren(CollapsibleTriggerDirective, { descendants: true });\n\n private keyManager: FocusKeyManager<CollapsibleTriggerDirective> | null = null;\n\n /**\n * @internal Whether the group is in single-open-panel mode.\n *\n * Subclasses override to bridge their own input surface (e.g. `AccordionComponent`\n * returns `this.type() === 'single'`). All internal toggle/sync/warn logic reads\n * the mode through this hook, never `accordion()` directly — that lets the\n * subclass drive mode from `type` without redeclaring the parent's signal input.\n */\n protected isAccordionMode(): boolean {\n return this.accordion();\n }\n\n /**\n * @internal Whether re-clicking the open panel in single mode closes it.\n *\n * Defaults to `true` for the bare group component (re-clicking always closes).\n * `AccordionComponent` overrides to honour its `collapsible` opt-out input.\n */\n protected canCollapseSingleMode(): boolean {\n return true;\n }\n\n constructor() {\n // Sync children open states from the group value\n afterNextRender(() => {\n this.syncChildrenFromValue();\n });\n\n // Watch for value changes and sync children\n effect(() => {\n const val = this.value();\n const items = this.items();\n if (items.length === 0) return;\n\n // Read mode via the virtual hook so subclass overrides take effect.\n const accordion = this.isAccordionMode();\n\n if (isDevMode()) {\n if (accordion && Array.isArray(val)) {\n console.warn(\n '[tw-collapsible-group] `value` is an array but the group is in accordion mode. Use a single string (or null) in accordion mode.',\n );\n } else if (!accordion && typeof val === 'string' && val !== '') {\n console.warn(\n '[tw-collapsible-group] `value` is a string but the group is in independent mode. Use a string[] in independent mode.',\n );\n }\n }\n\n untracked(() => {\n for (const item of items) {\n const itemValue = item.value();\n if (accordion) {\n item.setOpen(itemValue === val);\n } else {\n const openValues = Array.isArray(val) ? val : [];\n item.setOpen(openValues.includes(itemValue));\n }\n }\n });\n });\n\n // Rebuild FocusKeyManager whenever the trigger set changes\n effect((onCleanup) => {\n const triggers = this.triggers();\n if (triggers.length === 0) {\n this.keyManager = null;\n return;\n }\n this.keyManager = new FocusKeyManager(triggers)\n .withWrap()\n .withHomeAndEnd()\n .withVerticalOrientation()\n .withTypeAhead();\n\n onCleanup(() => {\n this.keyManager?.destroy();\n });\n });\n }\n\n private syncChildrenFromValue(): void {\n const val = this.value();\n const items = this.items();\n const accordion = this.isAccordionMode();\n for (const item of items) {\n const itemValue = item.value();\n if (accordion) {\n item.setOpen(itemValue === val);\n } else {\n const openValues = Array.isArray(val) ? val : [];\n item.setOpen(openValues.includes(itemValue));\n }\n }\n }\n\n /** @internal Called by a child collapsible when it is toggled. */\n toggleItem(item: CollapsibleComponent): void {\n const itemValue = item.value();\n const isCurrentlyOpen = item.open();\n const next = !isCurrentlyOpen;\n\n if (this.isAccordionMode()) {\n if (next) {\n // Close all others, open this one\n for (const child of this.items()) {\n if (child !== item) {\n child.setOpen(false);\n }\n }\n item.setOpen(true);\n this.value.set(itemValue);\n } else {\n // Close this one — honour the subclass's collapsible opt-out, if any.\n if (!this.canCollapseSingleMode()) return;\n item.setOpen(false);\n this.value.set(null);\n }\n } else {\n // Independent mode\n item.setOpen(next);\n const currentOpen = this.items()\n .filter(i => i.open())\n .map(i => i.value());\n this.value.set(currentOpen);\n }\n\n item.toggled.emit(next);\n item.announceState(next);\n }\n\n /** @internal Handle keyboard navigation within the group. */\n onTriggerKeydown(event: KeyboardEvent): void {\n if (!this.keyManager) return;\n\n // Sync active item with the currently focused trigger.\n // Use event.target (not document.activeElement) so this works under shadow DOM.\n const triggers = this.triggers();\n const focusedIdx = triggers.findIndex(\n t => t.elementRef.nativeElement === event.target,\n );\n if (focusedIdx >= 0 && focusedIdx !== this.keyManager.activeItemIndex) {\n this.keyManager.setActiveItem(focusedIdx);\n }\n\n this.keyManager.onKeydown(event);\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":"cdevhub-ngx-tw-collapsible.mjs","sources":["../../../projects/ngx-tw/collapsible/collapsible.ts","../../../projects/ngx-tw/collapsible/cdevhub-ngx-tw-collapsible.ts"],"sourcesContent":["import {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n contentChildren,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n isDevMode,\n linkedSignal,\n model,\n output,\n untracked,\n ViewEncapsulation,\n} from '@angular/core';\nimport { type FocusableOption, FocusKeyManager, LiveAnnouncer } from '@angular/cdk/a11y';\nimport { tv } from 'tailwind-variants';\nimport type { TwColor, TwSize } from '@cdevhub/ngx-tw/core';\n\n/** Visual style of the collapsible container. */\nexport type CollapsibleVariant = 'default' | 'bordered' | 'ghost' | 'filled';\n\n/** Decorative axes bundled into a single collapsible input. */\nexport interface CollapsibleDisplay {\n /** Visual style of the panel container. Defaults to `'default'`. */\n variant?: CollapsibleVariant;\n /** Semantic color; applies to the `bordered` and `filled` variants. Defaults to `'neutral'`. */\n color?: TwColor;\n /** Padding scale for the trigger and content sections. Defaults to `'md'`. */\n size?: TwSize;\n}\n\nconst DISPLAY_DEFAULTS: Required<CollapsibleDisplay> = {\n variant: 'default',\n color: 'neutral',\n size: 'md',\n};\n\n// ── tv() config ──\n\nconst collapsibleVariants = tv({\n slots: {\n root: 'block rounded-lg overflow-hidden',\n trigger:\n 'flex w-full items-center justify-between gap-3 bg-transparent border-0 appearance-none cursor-pointer text-sm font-medium text-fg transition-colors duration-normal motion-reduce:transition-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',\n icon: 'size-5 shrink-0 text-fg-muted transition-transform duration-normal motion-reduce:transition-none',\n content: 'text-sm text-fg',\n },\n variants: {\n variant: {\n default: {\n root: 'border-b border-border',\n trigger: 'hover:bg-surface-muted',\n },\n bordered: {\n root: 'border border-border',\n trigger: 'hover:bg-surface-muted',\n content: 'border-t border-border',\n },\n ghost: {\n root: '',\n trigger: 'hover:bg-surface-muted rounded-md',\n },\n filled: {\n root: '',\n },\n },\n size: {\n xs: { trigger: 'px-2 py-1 text-xs', content: 'p-2' },\n sm: { trigger: 'px-3 py-1.5 text-sm', content: 'p-3' },\n md: { trigger: 'px-4 py-2 text-sm', content: 'p-4' },\n lg: { trigger: 'px-5 py-2.5 text-base', content: 'p-6' },\n xl: { trigger: 'px-6 py-3 text-base', content: 'p-8' },\n },\n color: {\n primary: {},\n secondary: {},\n accent: {},\n neutral: {},\n info: {},\n success: {},\n warning: {},\n error: {},\n },\n disabled: {\n true: { root: 'opacity-50 pointer-events-none' },\n false: {},\n },\n inGroup: {\n true: { root: 'rounded-none border-b-0 border-0' },\n false: {},\n },\n },\n compoundVariants: [\n // ── Filled + color ──\n { variant: 'filled', color: 'primary', class: { root: 'bg-primary-50', trigger: 'text-primary-800 hover:bg-primary-100', content: 'text-primary-700', icon: 'text-primary-600' } },\n { variant: 'filled', color: 'secondary', class: { root: 'bg-secondary-50', trigger: 'text-secondary-800 hover:bg-secondary-100', content: 'text-secondary-700', icon: 'text-secondary-600' } },\n { variant: 'filled', color: 'accent', class: { root: 'bg-accent-50', trigger: 'text-accent-800 hover:bg-accent-100', content: 'text-accent-700', icon: 'text-accent-600' } },\n { variant: 'filled', color: 'neutral', class: { root: 'bg-surface-muted', trigger: 'text-fg hover:bg-surface-sunken', content: 'text-fg-muted' } },\n { variant: 'filled', color: 'info', class: { root: 'bg-info-50', trigger: 'text-info-800 hover:bg-info-100', content: 'text-info-700', icon: 'text-info-600' } },\n { variant: 'filled', color: 'success', class: { root: 'bg-success-50', trigger: 'text-success-800 hover:bg-success-100', content: 'text-success-700', icon: 'text-success-600' } },\n { variant: 'filled', color: 'warning', class: { root: 'bg-warning-50', trigger: 'text-warning-800 hover:bg-warning-100', content: 'text-warning-700', icon: 'text-warning-600' } },\n { variant: 'filled', color: 'error', class: { root: 'bg-error-50', trigger: 'text-error-800 hover:bg-error-100', content: 'text-error-700', icon: 'text-error-600' } },\n\n // ── Bordered + color ──\n { variant: 'bordered', color: 'primary', class: { root: 'border-primary-300' } },\n { variant: 'bordered', color: 'secondary', class: { root: 'border-secondary-300' } },\n { variant: 'bordered', color: 'accent', class: { root: 'border-accent-300' } },\n { variant: 'bordered', color: 'info', class: { root: 'border-info-300' } },\n { variant: 'bordered', color: 'success', class: { root: 'border-success-300' } },\n { variant: 'bordered', color: 'warning', class: { root: 'border-warning-300' } },\n { variant: 'bordered', color: 'error', class: { root: 'border-error-300' } },\n ],\n defaultVariants: {\n variant: 'default',\n color: 'neutral',\n size: 'md',\n disabled: false,\n inGroup: false,\n },\n}, {\n twMerge: true,\n});\n\n// ── Unique ID counter ──\nlet nextId = 0;\n\n// ── CollapsibleIconDirective ──\n\n@Directive({\n selector: '[twCollapsibleIcon]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class CollapsibleIconDirective {\n private readonly collapsible = inject(CollapsibleComponent);\n\n /** @internal */\n readonly classes = computed(() => {\n const base = this.collapsible.iconClasses();\n return this.collapsible.open() ? `${base} rotate-180` : base;\n });\n}\n\n// ── CollapsibleTriggerDirective ──\n\n/**\n * Marks the toggle element inside a `<tw-collapsible>`. Apply this to a\n * native `<button>`; the directive wires up ARIA, keyboard handling, and\n * focus management. Custom hosts (e.g. `<div>`) are not supported.\n */\n@Component({\n selector: '[twCollapsibleTrigger]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n // ViewEncapsulation.None — the directive's host IS the consumer's <button>;\n // scoped styles can't reach a host that lives outside this component's tree.\n encapsulation: ViewEncapsulation.None,\n host: {\n '[class]': 'classes()',\n '[attr.aria-expanded]': 'collapsible.open()',\n '[attr.aria-controls]': 'collapsible.panelId',\n '[attr.aria-disabled]': 'collapsible.disabled() || null',\n '[attr.tabindex]': 'collapsible.disabled() ? -1 : 0',\n '[attr.id]': 'collapsible.triggerId',\n '(click)': 'onClick()',\n '(keydown)': 'onKeydown($event)',\n },\n template: `\n <ng-content />\n @if (!collapsible.customIcon()) {\n <svg [class]=\"iconClasses()\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M5.22 8.22a.75.75 0 0 1 1.06 0L10 11.94l3.72-3.72a.75.75 0 1 1 1.06 1.06l-4.25 4.25a.75.75 0 0 1-1.06 0L5.22 9.28a.75.75 0 0 1 0-1.06Z\" clip-rule=\"evenodd\" />\n </svg>\n }\n `,\n})\nexport class CollapsibleTriggerDirective implements FocusableOption {\n /** @internal */\n readonly collapsible = inject(CollapsibleComponent);\n readonly elementRef = inject(ElementRef<HTMLElement>);\n\n /** @internal */\n readonly classes = this.collapsible.triggerClasses;\n\n /** @internal */\n readonly iconClasses = computed(() => {\n const base = this.collapsible.iconClasses();\n return this.collapsible.open() ? `${base} rotate-180` : base;\n });\n\n onClick(): void {\n this.collapsible.toggle();\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.collapsible.toggle();\n return;\n }\n\n // Delegate arrow key navigation to group\n const group = this.collapsible.group;\n if (group) {\n group.onTriggerKeydown(event);\n }\n }\n\n focus(): void {\n this.elementRef.nativeElement.focus();\n }\n\n /** @internal FocusableOption: lets FocusKeyManager skip disabled triggers. */\n get disabled(): boolean {\n return this.collapsible.disabled();\n }\n\n /** @internal FocusableOption: text label for typeahead navigation. */\n getLabel(): string {\n return this.elementRef.nativeElement.textContent?.trim() ?? '';\n }\n}\n\n// ── CollapsibleComponent ──\n\n@Component({\n selector: 'tw-collapsible',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'rootClasses()',\n },\n template: `\n <ng-content select=\"[twCollapsibleTrigger]\" />\n @if (keepAlive() ? activated() : open()) {\n <div [class]=\"contentWrapperClasses()\"\n [attr.data-open]=\"open()\"\n [attr.id]=\"panelId\"\n [attr.aria-labelledby]=\"triggerId\"\n role=\"region\"\n [animate.enter]=\"'collapsible-enter'\"\n [animate.leave]=\"keepAlive() ? '' : 'collapsible-leave'\">\n <div class=\"overflow-hidden\">\n <ng-content />\n </div>\n </div>\n }\n `,\n})\nexport class CollapsibleComponent {\n /** Unique identifier for this panel. Required when used inside a group. */\n readonly value = input<string>('');\n\n /** Bundles decorative axes: `variant`, `color`, `size`. Accepts a partial; unset keys fall back to the defaults (`{ variant: 'default', color: 'neutral', size: 'md' }`). */\n readonly display = input<CollapsibleDisplay>({});\n\n /** When true, the panel cannot be toggled and appears dimmed. Defaults to `false`. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** When true, content is rendered on first open and kept in the DOM across toggles. Defaults to `false`. */\n readonly keepAlive = input(false, { transform: booleanAttribute });\n\n /** Whether the panel is expanded. Two-way bindable. Defaults to `false`. */\n readonly open = model(false);\n\n /** Fires after the panel is toggled. Payload is the new open state. */\n readonly toggled = output<boolean>();\n\n /** @internal */\n readonly group = inject(CollapsibleGroupComponent, { optional: true });\n private readonly liveAnnouncer = inject(LiveAnnouncer);\n\n /** @internal */\n readonly customIcon = contentChild(CollapsibleIconDirective);\n\n private readonly componentId = `tw-collapsible-${nextId++}`;\n readonly triggerId = `${this.componentId}-trigger`;\n readonly panelId = `${this.componentId}-panel`;\n\n /**\n * @internal Tracks whether the panel has been opened at least once (for keepAlive mode).\n *\n * Latches to `true` the first time `open` is `true` and stays `true` for the\n * lifetime of the component. Implemented as a `linkedSignal` so the derivation\n * lives next to the source — `activated()` reads cleanly as \"derived from open\".\n */\n readonly activated = linkedSignal<boolean, boolean>({\n source: () => this.open(),\n computation: (open, prev) => (prev?.value ?? false) || open,\n });\n\n // ── Resolved display config ──\n\n /** @internal Resolved decorative configuration. */\n readonly resolvedDisplay = computed<Required<CollapsibleDisplay>>(() => ({\n ...DISPLAY_DEFAULTS,\n ...this.display(),\n }));\n\n // ── Variant classes ──\n\n private readonly variantResult = computed(() => {\n const { variant, color, size } = this.resolvedDisplay();\n return collapsibleVariants({\n variant,\n color,\n size,\n disabled: this.disabled(),\n inGroup: !!this.group,\n });\n });\n\n readonly rootClasses = computed(() => this.variantResult().root());\n readonly triggerClasses = computed(() => this.variantResult().trigger());\n readonly iconClasses = computed(() => this.variantResult().icon());\n readonly contentClasses = computed(() => this.variantResult().content());\n\n readonly contentWrapperClasses = computed(() => {\n const base = this.contentClasses();\n return this.keepAlive() ? `${base} collapsible-keep-alive` : base;\n });\n\n /** @internal Toggle the open state. Called by the trigger directive. */\n toggle(): void {\n if (this.disabled()) return;\n\n if (this.group) {\n this.group.toggleItem(this);\n } else {\n const next = !this.open();\n this.open.set(next);\n this.toggled.emit(next);\n this.announceState(next);\n }\n }\n\n /** @internal Set the open state programmatically (used by group). */\n setOpen(value: boolean): void {\n this.open.set(value);\n }\n\n /** @internal */\n announceState(isOpen: boolean): void {\n this.liveAnnouncer.announce(\n isOpen ? 'Section expanded' : 'Section collapsed',\n );\n }\n}\n\n// ── CollapsibleGroupComponent ──\n\n@Component({\n selector: 'tw-collapsible-group',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n // Use bindings (not static attributes) so subclasses can override the values.\n // Angular DOES inherit host metadata across `extends`; literal-string entries\n // can't be turned off by a subclass, but binding expressions are evaluated\n // against the actual instance and so respect subclass overrides of the\n // backing signal/computed.\n '[attr.role]': 'hostRole()',\n '[class]': 'hostClasses()',\n },\n template: `<ng-content />`,\n})\nexport class CollapsibleGroupComponent {\n /**\n * When true, only one panel can be open at a time.\n *\n * `AccordionComponent` (subclass) ignores this input and drives the same\n * behaviour from its own `type` input via the `isAccordionMode()` /\n * `canCollapseSingleMode()` virtual hooks below. Consumers using\n * `<tw-collapsible-group>` directly should bind this input; consumers using\n * `<tw-accordion>` should bind `type=\"single\"` / `type=\"multiple\"` instead.\n *\n * Defaults to `false`.\n */\n readonly accordion = input(false, { transform: booleanAttribute });\n\n /** The value(s) of currently open panels. String in accordion mode, string array in independent mode. `null` when no panel is open in accordion mode. Two-way bindable. Defaults to `null`. */\n readonly value = model<string | string[] | null>(null);\n\n /**\n * @internal Wrapper `role` attribute. Subclasses may override (e.g.\n * `AccordionComponent` returns `null` per APG — accordions don't carry\n * `role=\"group\"`).\n */\n readonly hostRole = computed<string | null>(() => 'group');\n\n /**\n * @internal Host class string. Subclasses may override to provide their own\n * variant-driven string (e.g. `AccordionComponent.rootClasses`).\n */\n readonly hostClasses = computed(() => 'block rounded-lg overflow-hidden divide-y divide-border');\n\n /** @internal */\n readonly items = contentChildren(CollapsibleComponent);\n\n /** @internal */\n readonly triggers = contentChildren(CollapsibleTriggerDirective, { descendants: true });\n\n private keyManager: FocusKeyManager<CollapsibleTriggerDirective> | null = null;\n\n /**\n * @internal Whether the group is in single-open-panel mode.\n *\n * Subclasses override to bridge their own input surface (e.g. `AccordionComponent`\n * returns `this.type() === 'single'`). All internal toggle/sync/warn logic reads\n * the mode through this hook, never `accordion()` directly — that lets the\n * subclass drive mode from `type` without redeclaring the parent's signal input.\n */\n protected isAccordionMode(): boolean {\n return this.accordion();\n }\n\n /**\n * @internal Whether re-clicking the open panel in single mode closes it.\n *\n * Defaults to `true` for the bare group component (re-clicking always closes).\n * `AccordionComponent` overrides to honour its `collapsible` opt-out input.\n */\n protected canCollapseSingleMode(): boolean {\n return true;\n }\n\n constructor() {\n // Sync children open states from the group value\n afterNextRender(() => {\n this.syncChildrenFromValue();\n });\n\n // Watch for value changes and sync children\n effect(() => {\n const val = this.value();\n const items = this.items();\n if (items.length === 0) return;\n\n // Read mode via the virtual hook so subclass overrides take effect.\n const accordion = this.isAccordionMode();\n\n if (isDevMode()) {\n if (accordion && Array.isArray(val)) {\n console.warn(\n '[tw-collapsible-group] `value` is an array but the group is in accordion mode. Use a single string (or null) in accordion mode.',\n );\n } else if (!accordion && typeof val === 'string' && val !== '') {\n console.warn(\n '[tw-collapsible-group] `value` is a string but the group is in independent mode. Use a string[] in independent mode.',\n );\n }\n }\n\n untracked(() => {\n for (const item of items) {\n const itemValue = item.value();\n if (accordion) {\n item.setOpen(itemValue === val);\n } else {\n const openValues = Array.isArray(val) ? val : [];\n item.setOpen(openValues.includes(itemValue));\n }\n }\n });\n });\n\n // Rebuild FocusKeyManager whenever the trigger set changes\n effect((onCleanup) => {\n const triggers = this.triggers();\n if (triggers.length === 0) {\n this.keyManager = null;\n return;\n }\n this.keyManager = new FocusKeyManager(triggers)\n .withWrap()\n .withHomeAndEnd()\n .withVerticalOrientation()\n .withTypeAhead();\n\n onCleanup(() => {\n this.keyManager?.destroy();\n });\n });\n }\n\n private syncChildrenFromValue(): void {\n const val = this.value();\n const items = this.items();\n const accordion = this.isAccordionMode();\n for (const item of items) {\n const itemValue = item.value();\n if (accordion) {\n item.setOpen(itemValue === val);\n } else {\n const openValues = Array.isArray(val) ? val : [];\n item.setOpen(openValues.includes(itemValue));\n }\n }\n }\n\n /** @internal Called by a child collapsible when it is toggled. */\n toggleItem(item: CollapsibleComponent): void {\n const itemValue = item.value();\n const isCurrentlyOpen = item.open();\n const next = !isCurrentlyOpen;\n\n if (this.isAccordionMode()) {\n if (next) {\n // Close all others, open this one\n for (const child of this.items()) {\n if (child !== item) {\n child.setOpen(false);\n }\n }\n item.setOpen(true);\n this.value.set(itemValue);\n } else {\n // Close this one — honour the subclass's collapsible opt-out, if any.\n if (!this.canCollapseSingleMode()) return;\n item.setOpen(false);\n this.value.set(null);\n }\n } else {\n // Independent mode\n item.setOpen(next);\n const currentOpen = this.items()\n .filter(i => i.open())\n .map(i => i.value());\n this.value.set(currentOpen);\n }\n\n item.toggled.emit(next);\n item.announceState(next);\n }\n\n /** @internal Handle keyboard navigation within the group. */\n onTriggerKeydown(event: KeyboardEvent): void {\n if (!this.keyManager) return;\n\n // Sync active item with the currently focused trigger.\n // Use event.target (not document.activeElement) so this works under shadow DOM.\n const triggers = this.triggers();\n const focusedIdx = triggers.findIndex(\n t => t.elementRef.nativeElement === event.target,\n );\n if (focusedIdx >= 0 && focusedIdx !== this.keyManager.activeItemIndex) {\n this.keyManager.setActiveItem(focusedIdx);\n }\n\n this.keyManager.onKeydown(event);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|