@cdevhub/ngx-tw 0.2.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 +21 -0
- package/README.md +134 -0
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs +108 -0
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-alert.mjs +240 -0
- package/fesm2022/cdevhub-ngx-tw-alert.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs +287 -0
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-badge.mjs +332 -0
- package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +452 -0
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-button.mjs +227 -0
- package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +417 -0
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs +232 -0
- package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs +4482 -0
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-card.mjs +157 -0
- package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs +1454 -0
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +593 -0
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs +228 -0
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +510 -0
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs +1721 -0
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +721 -0
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-core.mjs +861 -0
- package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +1558 -0
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +1833 -0
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs +693 -0
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +331 -0
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +289 -0
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs +572 -0
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs +36 -0
- package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-icon.mjs +278 -0
- package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-input.mjs +355 -0
- package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-item.mjs +241 -0
- package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-menu.mjs +433 -0
- package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs +691 -0
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-popover.mjs +678 -0
- package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +335 -0
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-radio.mjs +708 -0
- package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +319 -0
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-select.mjs +1722 -0
- package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-separator.mjs +115 -0
- package/fesm2022/cdevhub-ngx-tw-separator.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs +768 -0
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-skeleton.mjs +149 -0
- package/fesm2022/cdevhub-ngx-tw-skeleton.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-slider.mjs +1147 -0
- package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-sort.mjs +346 -0
- package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-spinner.mjs +186 -0
- package/fesm2022/cdevhub-ngx-tw-spinner.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-split.mjs +1082 -0
- package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-stat.mjs +579 -0
- package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs +443 -0
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-switch.mjs +391 -0
- package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +315 -0
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-table.mjs +994 -0
- package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs +508 -0
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs +147 -0
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-theme.mjs +178 -0
- package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +1344 -0
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs +1136 -0
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-toast.mjs +1311 -0
- package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +533 -0
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw.mjs +61 -0
- package/fesm2022/cdevhub-ngx-tw.mjs.map +1 -0
- package/package.json +265 -0
- package/theme/_base.css +394 -0
- package/theme/_dark.css +510 -0
- package/theme/_high-contrast.css +290 -0
- package/theme/_semantic.css +317 -0
- package/theme/_typography.css +9 -0
- package/theme/index.css +54 -0
- package/types/cdevhub-ngx-tw-accordion.d.ts +48 -0
- package/types/cdevhub-ngx-tw-alert.d.ts +67 -0
- package/types/cdevhub-ngx-tw-avatar.d.ts +79 -0
- package/types/cdevhub-ngx-tw-badge.d.ts +94 -0
- package/types/cdevhub-ngx-tw-breadcrumbs.d.ts +227 -0
- package/types/cdevhub-ngx-tw-button.d.ts +74 -0
- package/types/cdevhub-ngx-tw-calendar-luxon.d.ts +200 -0
- package/types/cdevhub-ngx-tw-calendar-testing.d.ts +113 -0
- package/types/cdevhub-ngx-tw-calendar.d.ts +1704 -0
- package/types/cdevhub-ngx-tw-card.d.ts +48 -0
- package/types/cdevhub-ngx-tw-carousel.d.ts +406 -0
- package/types/cdevhub-ngx-tw-checkbox.d.ts +136 -0
- package/types/cdevhub-ngx-tw-code-block.d.ts +93 -0
- package/types/cdevhub-ngx-tw-collapsible.d.ts +151 -0
- package/types/cdevhub-ngx-tw-combobox.d.ts +389 -0
- package/types/cdevhub-ngx-tw-command-palette.d.ts +215 -0
- package/types/cdevhub-ngx-tw-core.d.ts +719 -0
- package/types/cdevhub-ngx-tw-date-picker.d.ts +317 -0
- package/types/cdevhub-ngx-tw-date-range-picker.d.ts +313 -0
- package/types/cdevhub-ngx-tw-dialog.d.ts +303 -0
- package/types/cdevhub-ngx-tw-empty-state.d.ts +104 -0
- package/types/cdevhub-ngx-tw-flip-card.d.ts +95 -0
- package/types/cdevhub-ngx-tw-form-field.d.ts +210 -0
- package/types/cdevhub-ngx-tw-icon-lucide.d.ts +29 -0
- package/types/cdevhub-ngx-tw-icon.d.ts +134 -0
- package/types/cdevhub-ngx-tw-input.d.ts +110 -0
- package/types/cdevhub-ngx-tw-item.d.ts +70 -0
- package/types/cdevhub-ngx-tw-menu.d.ts +99 -0
- package/types/cdevhub-ngx-tw-paginator.d.ts +305 -0
- package/types/cdevhub-ngx-tw-popover.d.ts +157 -0
- package/types/cdevhub-ngx-tw-progress-bar.d.ts +100 -0
- package/types/cdevhub-ngx-tw-radio.d.ts +174 -0
- package/types/cdevhub-ngx-tw-segmented-control.d.ts +66 -0
- package/types/cdevhub-ngx-tw-select.d.ts +384 -0
- package/types/cdevhub-ngx-tw-separator.d.ts +28 -0
- package/types/cdevhub-ngx-tw-sheet.d.ts +335 -0
- package/types/cdevhub-ngx-tw-skeleton.d.ts +52 -0
- package/types/cdevhub-ngx-tw-slider.d.ts +258 -0
- package/types/cdevhub-ngx-tw-sort.d.ts +136 -0
- package/types/cdevhub-ngx-tw-spinner.d.ts +50 -0
- package/types/cdevhub-ngx-tw-split.d.ts +265 -0
- package/types/cdevhub-ngx-tw-stat.d.ts +140 -0
- package/types/cdevhub-ngx-tw-stepper.d.ts +127 -0
- package/types/cdevhub-ngx-tw-switch.d.ts +88 -0
- package/types/cdevhub-ngx-tw-tab-nav.d.ts +107 -0
- package/types/cdevhub-ngx-tw-table.d.ts +479 -0
- package/types/cdevhub-ngx-tw-tabs.d.ts +121 -0
- package/types/cdevhub-ngx-tw-textarea.d.ts +62 -0
- package/types/cdevhub-ngx-tw-theme.d.ts +106 -0
- package/types/cdevhub-ngx-tw-time-picker.d.ts +303 -0
- package/types/cdevhub-ngx-tw-timeline.d.ts +278 -0
- package/types/cdevhub-ngx-tw-toast.d.ts +388 -0
- package/types/cdevhub-ngx-tw-tooltip.d.ts +95 -0
- package/types/cdevhub-ngx-tw.d.ts +49 -0
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, computed, Directive, ElementRef, ViewEncapsulation, ChangeDetectionStrategy, Component, input, booleanAttribute, model, output, contentChild, linkedSignal, contentChildren, afterNextRender, effect, isDevMode, untracked } from '@angular/core';
|
|
3
|
+
import { LiveAnnouncer, FocusKeyManager } from '@angular/cdk/a11y';
|
|
4
|
+
import { tv } from 'tailwind-variants';
|
|
5
|
+
|
|
6
|
+
const DISPLAY_DEFAULTS = {
|
|
7
|
+
variant: 'default',
|
|
8
|
+
color: 'neutral',
|
|
9
|
+
size: 'md',
|
|
10
|
+
};
|
|
11
|
+
// ── tv() config ──
|
|
12
|
+
const collapsibleVariants = tv({
|
|
13
|
+
slots: {
|
|
14
|
+
root: 'block rounded-lg overflow-hidden',
|
|
15
|
+
trigger: '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',
|
|
16
|
+
icon: 'size-5 shrink-0 text-fg-muted transition-transform duration-normal motion-reduce:transition-none',
|
|
17
|
+
content: 'text-sm text-fg',
|
|
18
|
+
},
|
|
19
|
+
variants: {
|
|
20
|
+
variant: {
|
|
21
|
+
default: {
|
|
22
|
+
root: 'border-b border-border',
|
|
23
|
+
trigger: 'hover:bg-surface-muted',
|
|
24
|
+
},
|
|
25
|
+
bordered: {
|
|
26
|
+
root: 'border border-border',
|
|
27
|
+
trigger: 'hover:bg-surface-muted',
|
|
28
|
+
content: 'border-t border-border',
|
|
29
|
+
},
|
|
30
|
+
ghost: {
|
|
31
|
+
root: '',
|
|
32
|
+
trigger: 'hover:bg-surface-muted rounded-md',
|
|
33
|
+
},
|
|
34
|
+
filled: {
|
|
35
|
+
root: '',
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
size: {
|
|
39
|
+
xs: { trigger: 'px-2 py-1 text-xs', content: 'p-2' },
|
|
40
|
+
sm: { trigger: 'px-3 py-1.5 text-sm', content: 'p-3' },
|
|
41
|
+
md: { trigger: 'px-4 py-2 text-sm', content: 'p-4' },
|
|
42
|
+
lg: { trigger: 'px-5 py-2.5 text-base', content: 'p-6' },
|
|
43
|
+
xl: { trigger: 'px-6 py-3 text-base', content: 'p-8' },
|
|
44
|
+
},
|
|
45
|
+
color: {
|
|
46
|
+
primary: {},
|
|
47
|
+
secondary: {},
|
|
48
|
+
accent: {},
|
|
49
|
+
neutral: {},
|
|
50
|
+
info: {},
|
|
51
|
+
success: {},
|
|
52
|
+
warning: {},
|
|
53
|
+
error: {},
|
|
54
|
+
},
|
|
55
|
+
disabled: {
|
|
56
|
+
true: { root: 'opacity-50 pointer-events-none' },
|
|
57
|
+
false: {},
|
|
58
|
+
},
|
|
59
|
+
inGroup: {
|
|
60
|
+
true: { root: 'rounded-none border-b-0 border-0' },
|
|
61
|
+
false: {},
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
compoundVariants: [
|
|
65
|
+
// ── Filled + color ──
|
|
66
|
+
{ 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' } },
|
|
67
|
+
{ 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' } },
|
|
68
|
+
{ 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' } },
|
|
69
|
+
{ variant: 'filled', color: 'neutral', class: { root: 'bg-surface-muted', trigger: 'text-fg hover:bg-surface-sunken', content: 'text-fg-muted' } },
|
|
70
|
+
{ 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' } },
|
|
71
|
+
{ 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' } },
|
|
72
|
+
{ 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' } },
|
|
73
|
+
{ 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' } },
|
|
74
|
+
// ── Bordered + color ──
|
|
75
|
+
{ variant: 'bordered', color: 'primary', class: { root: 'border-primary-300' } },
|
|
76
|
+
{ variant: 'bordered', color: 'secondary', class: { root: 'border-secondary-300' } },
|
|
77
|
+
{ variant: 'bordered', color: 'accent', class: { root: 'border-accent-300' } },
|
|
78
|
+
{ variant: 'bordered', color: 'info', class: { root: 'border-info-300' } },
|
|
79
|
+
{ variant: 'bordered', color: 'success', class: { root: 'border-success-300' } },
|
|
80
|
+
{ variant: 'bordered', color: 'warning', class: { root: 'border-warning-300' } },
|
|
81
|
+
{ variant: 'bordered', color: 'error', class: { root: 'border-error-300' } },
|
|
82
|
+
],
|
|
83
|
+
defaultVariants: {
|
|
84
|
+
variant: 'default',
|
|
85
|
+
color: 'neutral',
|
|
86
|
+
size: 'md',
|
|
87
|
+
disabled: false,
|
|
88
|
+
inGroup: false,
|
|
89
|
+
},
|
|
90
|
+
}, {
|
|
91
|
+
twMerge: true,
|
|
92
|
+
});
|
|
93
|
+
// ── Unique ID counter ──
|
|
94
|
+
let nextId = 0;
|
|
95
|
+
// ── CollapsibleIconDirective ──
|
|
96
|
+
class CollapsibleIconDirective {
|
|
97
|
+
collapsible = inject(CollapsibleComponent);
|
|
98
|
+
/** @internal */
|
|
99
|
+
classes = computed(() => {
|
|
100
|
+
const base = this.collapsible.iconClasses();
|
|
101
|
+
return this.collapsible.open() ? `${base} rotate-180` : base;
|
|
102
|
+
}, ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
103
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: CollapsibleIconDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
104
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: CollapsibleIconDirective, isStandalone: true, selector: "[twCollapsibleIcon]", host: { properties: { "class": "classes()" } }, ngImport: i0 });
|
|
105
|
+
}
|
|
106
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: CollapsibleIconDirective, decorators: [{
|
|
107
|
+
type: Directive,
|
|
108
|
+
args: [{
|
|
109
|
+
selector: '[twCollapsibleIcon]',
|
|
110
|
+
host: {
|
|
111
|
+
'[class]': 'classes()',
|
|
112
|
+
},
|
|
113
|
+
}]
|
|
114
|
+
}] });
|
|
115
|
+
// ── CollapsibleTriggerDirective ──
|
|
116
|
+
/**
|
|
117
|
+
* Marks the toggle element inside a `<tw-collapsible>`. Apply this to a
|
|
118
|
+
* native `<button>`; the directive wires up ARIA, keyboard handling, and
|
|
119
|
+
* focus management. Custom hosts (e.g. `<div>`) are not supported.
|
|
120
|
+
*/
|
|
121
|
+
class CollapsibleTriggerDirective {
|
|
122
|
+
/** @internal */
|
|
123
|
+
collapsible = inject(CollapsibleComponent);
|
|
124
|
+
elementRef = inject((ElementRef));
|
|
125
|
+
/** @internal */
|
|
126
|
+
classes = this.collapsible.triggerClasses;
|
|
127
|
+
/** @internal */
|
|
128
|
+
iconClasses = computed(() => {
|
|
129
|
+
const base = this.collapsible.iconClasses();
|
|
130
|
+
return this.collapsible.open() ? `${base} rotate-180` : base;
|
|
131
|
+
}, ...(ngDevMode ? [{ debugName: "iconClasses" }] : /* istanbul ignore next */ []));
|
|
132
|
+
onClick() {
|
|
133
|
+
this.collapsible.toggle();
|
|
134
|
+
}
|
|
135
|
+
onKeydown(event) {
|
|
136
|
+
if (event.key === 'Enter' || event.key === ' ') {
|
|
137
|
+
event.preventDefault();
|
|
138
|
+
this.collapsible.toggle();
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
// Delegate arrow key navigation to group
|
|
142
|
+
const group = this.collapsible.group;
|
|
143
|
+
if (group) {
|
|
144
|
+
group.onTriggerKeydown(event);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
focus() {
|
|
148
|
+
this.elementRef.nativeElement.focus();
|
|
149
|
+
}
|
|
150
|
+
/** @internal FocusableOption: lets FocusKeyManager skip disabled triggers. */
|
|
151
|
+
get disabled() {
|
|
152
|
+
return this.collapsible.disabled();
|
|
153
|
+
}
|
|
154
|
+
/** @internal FocusableOption: text label for typeahead navigation. */
|
|
155
|
+
getLabel() {
|
|
156
|
+
return this.elementRef.nativeElement.textContent?.trim() ?? '';
|
|
157
|
+
}
|
|
158
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: CollapsibleTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
159
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", 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
|
+
<ng-content />
|
|
161
|
+
@if (!collapsible.customIcon()) {
|
|
162
|
+
<svg [class]="iconClasses()" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
|
163
|
+
<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" />
|
|
164
|
+
</svg>
|
|
165
|
+
}
|
|
166
|
+
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
167
|
+
}
|
|
168
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: CollapsibleTriggerDirective, decorators: [{
|
|
169
|
+
type: Component,
|
|
170
|
+
args: [{
|
|
171
|
+
selector: '[twCollapsibleTrigger]',
|
|
172
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
173
|
+
// ViewEncapsulation.None — the directive's host IS the consumer's <button>;
|
|
174
|
+
// scoped styles can't reach a host that lives outside this component's tree.
|
|
175
|
+
encapsulation: ViewEncapsulation.None,
|
|
176
|
+
host: {
|
|
177
|
+
'[class]': 'classes()',
|
|
178
|
+
'[attr.aria-expanded]': 'collapsible.open()',
|
|
179
|
+
'[attr.aria-controls]': 'collapsible.panelId',
|
|
180
|
+
'[attr.aria-disabled]': 'collapsible.disabled() || null',
|
|
181
|
+
'[attr.tabindex]': 'collapsible.disabled() ? -1 : 0',
|
|
182
|
+
'[attr.id]': 'collapsible.triggerId',
|
|
183
|
+
'(click)': 'onClick()',
|
|
184
|
+
'(keydown)': 'onKeydown($event)',
|
|
185
|
+
},
|
|
186
|
+
template: `
|
|
187
|
+
<ng-content />
|
|
188
|
+
@if (!collapsible.customIcon()) {
|
|
189
|
+
<svg [class]="iconClasses()" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
|
190
|
+
<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" />
|
|
191
|
+
</svg>
|
|
192
|
+
}
|
|
193
|
+
`,
|
|
194
|
+
}]
|
|
195
|
+
}] });
|
|
196
|
+
// ── CollapsibleComponent ──
|
|
197
|
+
class CollapsibleComponent {
|
|
198
|
+
/** Unique identifier for this panel. Required when used inside a group. */
|
|
199
|
+
value = input('', ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
200
|
+
/** 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({}, ...(ngDevMode ? [{ debugName: "display" }] : /* istanbul ignore next */ []));
|
|
202
|
+
/** When true, the panel cannot be toggled and appears dimmed. Defaults to `false`. */
|
|
203
|
+
disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
204
|
+
/** When true, content is rendered on first open and kept in the DOM across toggles. Defaults to `false`. */
|
|
205
|
+
keepAlive = input(false, { ...(ngDevMode ? { debugName: "keepAlive" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
206
|
+
/** Whether the panel is expanded. Two-way bindable. Defaults to `false`. */
|
|
207
|
+
open = model(false, ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
|
|
208
|
+
/** Fires after the panel is toggled. Payload is the new open state. */
|
|
209
|
+
toggled = output();
|
|
210
|
+
/** @internal */
|
|
211
|
+
group = inject(CollapsibleGroupComponent, { optional: true });
|
|
212
|
+
liveAnnouncer = inject(LiveAnnouncer);
|
|
213
|
+
/** @internal */
|
|
214
|
+
customIcon = contentChild(CollapsibleIconDirective, ...(ngDevMode ? [{ debugName: "customIcon" }] : /* istanbul ignore next */ []));
|
|
215
|
+
componentId = `tw-collapsible-${nextId++}`;
|
|
216
|
+
triggerId = `${this.componentId}-trigger`;
|
|
217
|
+
panelId = `${this.componentId}-panel`;
|
|
218
|
+
/**
|
|
219
|
+
* @internal Tracks whether the panel has been opened at least once (for keepAlive mode).
|
|
220
|
+
*
|
|
221
|
+
* Latches to `true` the first time `open` is `true` and stays `true` for the
|
|
222
|
+
* lifetime of the component. Implemented as a `linkedSignal` so the derivation
|
|
223
|
+
* lives next to the source — `activated()` reads cleanly as "derived from open".
|
|
224
|
+
*/
|
|
225
|
+
activated = linkedSignal({ ...(ngDevMode ? { debugName: "activated" } : /* istanbul ignore next */ {}), source: () => this.open(),
|
|
226
|
+
computation: (open, prev) => (prev?.value ?? false) || open });
|
|
227
|
+
// ── Resolved display config ──
|
|
228
|
+
/** @internal Resolved decorative configuration. */
|
|
229
|
+
resolvedDisplay = computed(() => ({
|
|
230
|
+
...DISPLAY_DEFAULTS,
|
|
231
|
+
...this.display(),
|
|
232
|
+
}), ...(ngDevMode ? [{ debugName: "resolvedDisplay" }] : /* istanbul ignore next */ []));
|
|
233
|
+
// ── Variant classes ──
|
|
234
|
+
variantResult = computed(() => {
|
|
235
|
+
const { variant, color, size } = this.resolvedDisplay();
|
|
236
|
+
return collapsibleVariants({
|
|
237
|
+
variant,
|
|
238
|
+
color,
|
|
239
|
+
size,
|
|
240
|
+
disabled: this.disabled(),
|
|
241
|
+
inGroup: !!this.group,
|
|
242
|
+
});
|
|
243
|
+
}, ...(ngDevMode ? [{ debugName: "variantResult" }] : /* istanbul ignore next */ []));
|
|
244
|
+
rootClasses = computed(() => this.variantResult().root(), ...(ngDevMode ? [{ debugName: "rootClasses" }] : /* istanbul ignore next */ []));
|
|
245
|
+
triggerClasses = computed(() => this.variantResult().trigger(), ...(ngDevMode ? [{ debugName: "triggerClasses" }] : /* istanbul ignore next */ []));
|
|
246
|
+
iconClasses = computed(() => this.variantResult().icon(), ...(ngDevMode ? [{ debugName: "iconClasses" }] : /* istanbul ignore next */ []));
|
|
247
|
+
contentClasses = computed(() => this.variantResult().content(), ...(ngDevMode ? [{ debugName: "contentClasses" }] : /* istanbul ignore next */ []));
|
|
248
|
+
contentWrapperClasses = computed(() => {
|
|
249
|
+
const base = this.contentClasses();
|
|
250
|
+
return this.keepAlive() ? `${base} collapsible-keep-alive` : base;
|
|
251
|
+
}, ...(ngDevMode ? [{ debugName: "contentWrapperClasses" }] : /* istanbul ignore next */ []));
|
|
252
|
+
/** @internal Toggle the open state. Called by the trigger directive. */
|
|
253
|
+
toggle() {
|
|
254
|
+
if (this.disabled())
|
|
255
|
+
return;
|
|
256
|
+
if (this.group) {
|
|
257
|
+
this.group.toggleItem(this);
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
const next = !this.open();
|
|
261
|
+
this.open.set(next);
|
|
262
|
+
this.toggled.emit(next);
|
|
263
|
+
this.announceState(next);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
/** @internal Set the open state programmatically (used by group). */
|
|
267
|
+
setOpen(value) {
|
|
268
|
+
this.open.set(value);
|
|
269
|
+
}
|
|
270
|
+
/** @internal */
|
|
271
|
+
announceState(isOpen) {
|
|
272
|
+
this.liveAnnouncer.announce(isOpen ? 'Section expanded' : 'Section collapsed');
|
|
273
|
+
}
|
|
274
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: CollapsibleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
275
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", 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
|
+
<ng-content select="[twCollapsibleTrigger]" />
|
|
277
|
+
@if (keepAlive() ? activated() : open()) {
|
|
278
|
+
<div [class]="contentWrapperClasses()"
|
|
279
|
+
[attr.data-open]="open()"
|
|
280
|
+
[attr.id]="panelId"
|
|
281
|
+
[attr.aria-labelledby]="triggerId"
|
|
282
|
+
role="region"
|
|
283
|
+
[animate.enter]="'collapsible-enter'"
|
|
284
|
+
[animate.leave]="keepAlive() ? '' : 'collapsible-leave'">
|
|
285
|
+
<div class="overflow-hidden">
|
|
286
|
+
<ng-content />
|
|
287
|
+
</div>
|
|
288
|
+
</div>
|
|
289
|
+
}
|
|
290
|
+
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
291
|
+
}
|
|
292
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: CollapsibleComponent, decorators: [{
|
|
293
|
+
type: Component,
|
|
294
|
+
args: [{
|
|
295
|
+
selector: 'tw-collapsible',
|
|
296
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
297
|
+
host: {
|
|
298
|
+
'[class]': 'rootClasses()',
|
|
299
|
+
},
|
|
300
|
+
template: `
|
|
301
|
+
<ng-content select="[twCollapsibleTrigger]" />
|
|
302
|
+
@if (keepAlive() ? activated() : open()) {
|
|
303
|
+
<div [class]="contentWrapperClasses()"
|
|
304
|
+
[attr.data-open]="open()"
|
|
305
|
+
[attr.id]="panelId"
|
|
306
|
+
[attr.aria-labelledby]="triggerId"
|
|
307
|
+
role="region"
|
|
308
|
+
[animate.enter]="'collapsible-enter'"
|
|
309
|
+
[animate.leave]="keepAlive() ? '' : 'collapsible-leave'">
|
|
310
|
+
<div class="overflow-hidden">
|
|
311
|
+
<ng-content />
|
|
312
|
+
</div>
|
|
313
|
+
</div>
|
|
314
|
+
}
|
|
315
|
+
`,
|
|
316
|
+
}]
|
|
317
|
+
}], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], display: [{ type: i0.Input, args: [{ isSignal: true, alias: "display", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], keepAlive: [{ type: i0.Input, args: [{ isSignal: true, alias: "keepAlive", required: false }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], toggled: [{ type: i0.Output, args: ["toggled"] }], customIcon: [{ type: i0.ContentChild, args: [i0.forwardRef(() => CollapsibleIconDirective), { isSignal: true }] }] } });
|
|
318
|
+
// ── CollapsibleGroupComponent ──
|
|
319
|
+
class CollapsibleGroupComponent {
|
|
320
|
+
/**
|
|
321
|
+
* When true, only one panel can be open at a time.
|
|
322
|
+
*
|
|
323
|
+
* `AccordionComponent` (subclass) ignores this input and drives the same
|
|
324
|
+
* behaviour from its own `type` input via the `isAccordionMode()` /
|
|
325
|
+
* `canCollapseSingleMode()` virtual hooks below. Consumers using
|
|
326
|
+
* `<tw-collapsible-group>` directly should bind this input; consumers using
|
|
327
|
+
* `<tw-accordion>` should bind `type="single"` / `type="multiple"` instead.
|
|
328
|
+
*
|
|
329
|
+
* Defaults to `false`.
|
|
330
|
+
*/
|
|
331
|
+
accordion = input(false, { ...(ngDevMode ? { debugName: "accordion" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
332
|
+
/** 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, ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
334
|
+
/**
|
|
335
|
+
* @internal Wrapper `role` attribute. Subclasses may override (e.g.
|
|
336
|
+
* `AccordionComponent` returns `null` per APG — accordions don't carry
|
|
337
|
+
* `role="group"`).
|
|
338
|
+
*/
|
|
339
|
+
hostRole = computed(() => 'group', ...(ngDevMode ? [{ debugName: "hostRole" }] : /* istanbul ignore next */ []));
|
|
340
|
+
/**
|
|
341
|
+
* @internal Host class string. Subclasses may override to provide their own
|
|
342
|
+
* variant-driven string (e.g. `AccordionComponent.rootClasses`).
|
|
343
|
+
*/
|
|
344
|
+
hostClasses = computed(() => 'block rounded-lg overflow-hidden divide-y divide-border', ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
|
|
345
|
+
/** @internal */
|
|
346
|
+
items = contentChildren(CollapsibleComponent, ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
|
|
347
|
+
/** @internal */
|
|
348
|
+
triggers = contentChildren(CollapsibleTriggerDirective, { ...(ngDevMode ? { debugName: "triggers" } : /* istanbul ignore next */ {}), descendants: true });
|
|
349
|
+
keyManager = null;
|
|
350
|
+
/**
|
|
351
|
+
* @internal Whether the group is in single-open-panel mode.
|
|
352
|
+
*
|
|
353
|
+
* Subclasses override to bridge their own input surface (e.g. `AccordionComponent`
|
|
354
|
+
* returns `this.type() === 'single'`). All internal toggle/sync/warn logic reads
|
|
355
|
+
* the mode through this hook, never `accordion()` directly — that lets the
|
|
356
|
+
* subclass drive mode from `type` without redeclaring the parent's signal input.
|
|
357
|
+
*/
|
|
358
|
+
isAccordionMode() {
|
|
359
|
+
return this.accordion();
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* @internal Whether re-clicking the open panel in single mode closes it.
|
|
363
|
+
*
|
|
364
|
+
* Defaults to `true` for the bare group component (re-clicking always closes).
|
|
365
|
+
* `AccordionComponent` overrides to honour its `collapsible` opt-out input.
|
|
366
|
+
*/
|
|
367
|
+
canCollapseSingleMode() {
|
|
368
|
+
return true;
|
|
369
|
+
}
|
|
370
|
+
constructor() {
|
|
371
|
+
// Sync children open states from the group value
|
|
372
|
+
afterNextRender(() => {
|
|
373
|
+
this.syncChildrenFromValue();
|
|
374
|
+
});
|
|
375
|
+
// Watch for value changes and sync children
|
|
376
|
+
effect(() => {
|
|
377
|
+
const val = this.value();
|
|
378
|
+
const items = this.items();
|
|
379
|
+
if (items.length === 0)
|
|
380
|
+
return;
|
|
381
|
+
// Read mode via the virtual hook so subclass overrides take effect.
|
|
382
|
+
const accordion = this.isAccordionMode();
|
|
383
|
+
if (isDevMode()) {
|
|
384
|
+
if (accordion && Array.isArray(val)) {
|
|
385
|
+
console.warn('[tw-collapsible-group] `value` is an array but the group is in accordion mode. Use a single string (or null) in accordion mode.');
|
|
386
|
+
}
|
|
387
|
+
else if (!accordion && typeof val === 'string' && val !== '') {
|
|
388
|
+
console.warn('[tw-collapsible-group] `value` is a string but the group is in independent mode. Use a string[] in independent mode.');
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
untracked(() => {
|
|
392
|
+
for (const item of items) {
|
|
393
|
+
const itemValue = item.value();
|
|
394
|
+
if (accordion) {
|
|
395
|
+
item.setOpen(itemValue === val);
|
|
396
|
+
}
|
|
397
|
+
else {
|
|
398
|
+
const openValues = Array.isArray(val) ? val : [];
|
|
399
|
+
item.setOpen(openValues.includes(itemValue));
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
});
|
|
403
|
+
});
|
|
404
|
+
// Rebuild FocusKeyManager whenever the trigger set changes
|
|
405
|
+
effect((onCleanup) => {
|
|
406
|
+
const triggers = this.triggers();
|
|
407
|
+
if (triggers.length === 0) {
|
|
408
|
+
this.keyManager = null;
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
this.keyManager = new FocusKeyManager(triggers)
|
|
412
|
+
.withWrap()
|
|
413
|
+
.withHomeAndEnd()
|
|
414
|
+
.withVerticalOrientation()
|
|
415
|
+
.withTypeAhead();
|
|
416
|
+
onCleanup(() => {
|
|
417
|
+
this.keyManager?.destroy();
|
|
418
|
+
});
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
syncChildrenFromValue() {
|
|
422
|
+
const val = this.value();
|
|
423
|
+
const items = this.items();
|
|
424
|
+
const accordion = this.isAccordionMode();
|
|
425
|
+
for (const item of items) {
|
|
426
|
+
const itemValue = item.value();
|
|
427
|
+
if (accordion) {
|
|
428
|
+
item.setOpen(itemValue === val);
|
|
429
|
+
}
|
|
430
|
+
else {
|
|
431
|
+
const openValues = Array.isArray(val) ? val : [];
|
|
432
|
+
item.setOpen(openValues.includes(itemValue));
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
/** @internal Called by a child collapsible when it is toggled. */
|
|
437
|
+
toggleItem(item) {
|
|
438
|
+
const itemValue = item.value();
|
|
439
|
+
const isCurrentlyOpen = item.open();
|
|
440
|
+
const next = !isCurrentlyOpen;
|
|
441
|
+
if (this.isAccordionMode()) {
|
|
442
|
+
if (next) {
|
|
443
|
+
// Close all others, open this one
|
|
444
|
+
for (const child of this.items()) {
|
|
445
|
+
if (child !== item) {
|
|
446
|
+
child.setOpen(false);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
item.setOpen(true);
|
|
450
|
+
this.value.set(itemValue);
|
|
451
|
+
}
|
|
452
|
+
else {
|
|
453
|
+
// Close this one — honour the subclass's collapsible opt-out, if any.
|
|
454
|
+
if (!this.canCollapseSingleMode())
|
|
455
|
+
return;
|
|
456
|
+
item.setOpen(false);
|
|
457
|
+
this.value.set(null);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
else {
|
|
461
|
+
// Independent mode
|
|
462
|
+
item.setOpen(next);
|
|
463
|
+
const currentOpen = this.items()
|
|
464
|
+
.filter(i => i.open())
|
|
465
|
+
.map(i => i.value());
|
|
466
|
+
this.value.set(currentOpen);
|
|
467
|
+
}
|
|
468
|
+
item.toggled.emit(next);
|
|
469
|
+
item.announceState(next);
|
|
470
|
+
}
|
|
471
|
+
/** @internal Handle keyboard navigation within the group. */
|
|
472
|
+
onTriggerKeydown(event) {
|
|
473
|
+
if (!this.keyManager)
|
|
474
|
+
return;
|
|
475
|
+
// Sync active item with the currently focused trigger.
|
|
476
|
+
// Use event.target (not document.activeElement) so this works under shadow DOM.
|
|
477
|
+
const triggers = this.triggers();
|
|
478
|
+
const focusedIdx = triggers.findIndex(t => t.elementRef.nativeElement === event.target);
|
|
479
|
+
if (focusedIdx >= 0 && focusedIdx !== this.keyManager.activeItemIndex) {
|
|
480
|
+
this.keyManager.setActiveItem(focusedIdx);
|
|
481
|
+
}
|
|
482
|
+
this.keyManager.onKeydown(event);
|
|
483
|
+
}
|
|
484
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: CollapsibleGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
485
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.14", 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
|
+
}
|
|
487
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: CollapsibleGroupComponent, decorators: [{
|
|
488
|
+
type: Component,
|
|
489
|
+
args: [{
|
|
490
|
+
selector: 'tw-collapsible-group',
|
|
491
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
492
|
+
host: {
|
|
493
|
+
// Use bindings (not static attributes) so subclasses can override the values.
|
|
494
|
+
// Angular DOES inherit host metadata across `extends`; literal-string entries
|
|
495
|
+
// can't be turned off by a subclass, but binding expressions are evaluated
|
|
496
|
+
// against the actual instance and so respect subclass overrides of the
|
|
497
|
+
// backing signal/computed.
|
|
498
|
+
'[attr.role]': 'hostRole()',
|
|
499
|
+
'[class]': 'hostClasses()',
|
|
500
|
+
},
|
|
501
|
+
template: `<ng-content />`,
|
|
502
|
+
}]
|
|
503
|
+
}], ctorParameters: () => [], propDecorators: { accordion: [{ type: i0.Input, args: [{ isSignal: true, alias: "accordion", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], items: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => CollapsibleComponent), { isSignal: true }] }], triggers: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => CollapsibleTriggerDirective), { ...{ descendants: true }, isSignal: true }] }] } });
|
|
504
|
+
|
|
505
|
+
/**
|
|
506
|
+
* Generated bundle index. Do not edit.
|
|
507
|
+
*/
|
|
508
|
+
|
|
509
|
+
export { CollapsibleComponent, CollapsibleGroupComponent, CollapsibleIconDirective, CollapsibleTriggerDirective };
|
|
510
|
+
//# sourceMappingURL=cdevhub-ngx-tw-collapsible.mjs.map
|
|
@@ -0,0 +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 signal,\n untracked,\n ViewEncapsulation,\n} from '@angular/core';\nimport { 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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"}
|