@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.
Files changed (139) hide show
  1. package/README.md +264 -49
  2. package/fesm2022/cdevhub-ngx-tw-accordion.mjs +11 -7
  3. package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -1
  4. package/fesm2022/cdevhub-ngx-tw-alert.mjs +43 -29
  5. package/fesm2022/cdevhub-ngx-tw-alert.mjs.map +1 -1
  6. package/fesm2022/cdevhub-ngx-tw-aspect-ratio.mjs +103 -0
  7. package/fesm2022/cdevhub-ngx-tw-aspect-ratio.mjs.map +1 -0
  8. package/fesm2022/cdevhub-ngx-tw-avatar.mjs +56 -31
  9. package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -1
  10. package/fesm2022/cdevhub-ngx-tw-badge.mjs +61 -35
  11. package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -1
  12. package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +154 -93
  13. package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -1
  14. package/fesm2022/cdevhub-ngx-tw-button.mjs +24 -15
  15. package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -1
  16. package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +3 -3
  17. package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -1
  18. package/fesm2022/cdevhub-ngx-tw-calendar.mjs +408 -215
  19. package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -1
  20. package/fesm2022/cdevhub-ngx-tw-card.mjs +33 -24
  21. package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -1
  22. package/fesm2022/cdevhub-ngx-tw-carousel.mjs +144 -79
  23. package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -1
  24. package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +99 -47
  25. package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -1
  26. package/fesm2022/cdevhub-ngx-tw-code-block.mjs +34 -20
  27. package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -1
  28. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +46 -29
  29. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -1
  30. package/fesm2022/cdevhub-ngx-tw-combobox.mjs +195 -110
  31. package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -1
  32. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +140 -73
  33. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -1
  34. package/fesm2022/cdevhub-ngx-tw-core.mjs +16 -11
  35. package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -1
  36. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +393 -149
  37. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -1
  38. package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +305 -150
  39. package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -1
  40. package/fesm2022/cdevhub-ngx-tw-dialog.mjs +56 -43
  41. package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -1
  42. package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +51 -33
  43. package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -1
  44. package/fesm2022/cdevhub-ngx-tw-file-upload.mjs +905 -0
  45. package/fesm2022/cdevhub-ngx-tw-file-upload.mjs.map +1 -0
  46. package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +49 -26
  47. package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -1
  48. package/fesm2022/cdevhub-ngx-tw-form-field.mjs +133 -74
  49. package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -1
  50. package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs +2 -2
  51. package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs.map +1 -1
  52. package/fesm2022/cdevhub-ngx-tw-icon.mjs +28 -17
  53. package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -1
  54. package/fesm2022/cdevhub-ngx-tw-input.mjs +37 -21
  55. package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -1
  56. package/fesm2022/cdevhub-ngx-tw-item.mjs +33 -24
  57. package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -1
  58. package/fesm2022/cdevhub-ngx-tw-menu.mjs +63 -48
  59. package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -1
  60. package/fesm2022/cdevhub-ngx-tw-number-input.mjs +622 -0
  61. package/fesm2022/cdevhub-ngx-tw-number-input.mjs.map +1 -0
  62. package/fesm2022/cdevhub-ngx-tw-paginator.mjs +137 -71
  63. package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -1
  64. package/fesm2022/cdevhub-ngx-tw-popover.mjs +101 -46
  65. package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -1
  66. package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +57 -30
  67. package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -1
  68. package/fesm2022/cdevhub-ngx-tw-radio.mjs +108 -57
  69. package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -1
  70. package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +46 -26
  71. package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -1
  72. package/fesm2022/cdevhub-ngx-tw-select.mjs +217 -122
  73. package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -1
  74. package/fesm2022/cdevhub-ngx-tw-separator.mjs +21 -12
  75. package/fesm2022/cdevhub-ngx-tw-separator.mjs.map +1 -1
  76. package/fesm2022/cdevhub-ngx-tw-sheet.mjs +58 -44
  77. package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -1
  78. package/fesm2022/cdevhub-ngx-tw-skeleton.mjs +25 -14
  79. package/fesm2022/cdevhub-ngx-tw-skeleton.mjs.map +1 -1
  80. package/fesm2022/cdevhub-ngx-tw-slider.mjs +155 -79
  81. package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -1
  82. package/fesm2022/cdevhub-ngx-tw-sort.mjs +44 -25
  83. package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -1
  84. package/fesm2022/cdevhub-ngx-tw-spinner.mjs +29 -16
  85. package/fesm2022/cdevhub-ngx-tw-spinner.mjs.map +1 -1
  86. package/fesm2022/cdevhub-ngx-tw-split.mjs +72 -42
  87. package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -1
  88. package/fesm2022/cdevhub-ngx-tw-stat.mjs +107 -64
  89. package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -1
  90. package/fesm2022/cdevhub-ngx-tw-stepper.mjs +113 -47
  91. package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -1
  92. package/fesm2022/cdevhub-ngx-tw-switch.mjs +61 -32
  93. package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -1
  94. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +88 -42
  95. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -1
  96. package/fesm2022/cdevhub-ngx-tw-table.mjs +266 -118
  97. package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -1
  98. package/fesm2022/cdevhub-ngx-tw-tabs.mjs +101 -51
  99. package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -1
  100. package/fesm2022/cdevhub-ngx-tw-tags-input.mjs +798 -0
  101. package/fesm2022/cdevhub-ngx-tw-tags-input.mjs.map +1 -0
  102. package/fesm2022/cdevhub-ngx-tw-textarea.mjs +11 -7
  103. package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -1
  104. package/fesm2022/cdevhub-ngx-tw-theme.mjs +22 -14
  105. package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -1
  106. package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +243 -95
  107. package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -1
  108. package/fesm2022/cdevhub-ngx-tw-timeline.mjs +149 -82
  109. package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -1
  110. package/fesm2022/cdevhub-ngx-tw-toast.mjs +89 -55
  111. package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -1
  112. package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +50 -28
  113. package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -1
  114. package/fesm2022/cdevhub-ngx-tw-transfer.mjs +1129 -0
  115. package/fesm2022/cdevhub-ngx-tw-transfer.mjs.map +1 -0
  116. package/fesm2022/cdevhub-ngx-tw-tree.mjs +554 -0
  117. package/fesm2022/cdevhub-ngx-tw-tree.mjs.map +1 -0
  118. package/fesm2022/cdevhub-ngx-tw.mjs +7 -0
  119. package/fesm2022/cdevhub-ngx-tw.mjs.map +1 -1
  120. package/package.json +45 -20
  121. package/theme/index.css +10 -2
  122. package/types/cdevhub-ngx-tw-aspect-ratio.d.ts +40 -0
  123. package/types/cdevhub-ngx-tw-calendar.d.ts +39 -8
  124. package/types/cdevhub-ngx-tw-command-palette.d.ts +7 -0
  125. package/types/cdevhub-ngx-tw-date-picker.d.ts +36 -10
  126. package/types/cdevhub-ngx-tw-file-upload.d.ts +250 -0
  127. package/types/cdevhub-ngx-tw-form-field.d.ts +22 -3
  128. package/types/cdevhub-ngx-tw-icon-lucide.d.ts +21 -3
  129. package/types/cdevhub-ngx-tw-number-input.d.ts +130 -0
  130. package/types/cdevhub-ngx-tw-popover.d.ts +8 -0
  131. package/types/cdevhub-ngx-tw-stepper.d.ts +30 -2
  132. package/types/cdevhub-ngx-tw-tab-nav.d.ts +8 -0
  133. package/types/cdevhub-ngx-tw-table.d.ts +30 -1
  134. package/types/cdevhub-ngx-tw-tabs.d.ts +8 -0
  135. package/types/cdevhub-ngx-tw-tags-input.d.ts +217 -0
  136. package/types/cdevhub-ngx-tw-time-picker.d.ts +31 -6
  137. package/types/cdevhub-ngx-tw-transfer.d.ts +330 -0
  138. package/types/cdevhub-ngx-tw-tree.d.ts +189 -0
  139. 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: "21.2.14", ngImport: i0, type: CodeBlockHeaderDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
23
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: CodeBlockHeaderDirective, isStandalone: true, selector: "[twCodeBlockHeader]", host: { classAttribute: "inline-flex items-center gap-2 min-w-0" }, ngImport: i0 });
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: "21.2.14", ngImport: i0, type: CodeBlockHeaderDirective, decorators: [{
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(...(ngDevMode ? [{ debugName: "code" }] : /* istanbul ignore next */ []));
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(...(ngDevMode ? [undefined, { debugName: "language" }] : /* istanbul ignore next */ []));
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', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
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({}, ...(ngDevMode ? [{ debugName: "labels" }] : /* istanbul ignore next */ []));
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, ...(ngDevMode ? [{ debugName: "isCopied" }] : /* istanbul ignore next */ []));
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
- }, ...(ngDevMode ? [{ debugName: "resolvedLabels" }] : /* istanbul ignore next */ []));
107
- variantResult = computed(() => codeBlockVariants({ variant: this.variant(), copied: this.isCopied() }), ...(ngDevMode ? [{ debugName: "variantResult" }] : /* istanbul ignore next */ []));
108
- rootClasses = computed(() => this.variantResult().root(), ...(ngDevMode ? [{ debugName: "rootClasses" }] : /* istanbul ignore next */ []));
109
- headerClasses = computed(() => this.variantResult().header(), ...(ngDevMode ? [{ debugName: "headerClasses" }] : /* istanbul ignore next */ []));
110
- headerStartClasses = computed(() => this.variantResult().headerStart(), ...(ngDevMode ? [{ debugName: "headerStartClasses" }] : /* istanbul ignore next */ []));
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
- }, ...(ngDevMode ? [{ debugName: "preClasses" }] : /* istanbul ignore next */ []));
115
- copyButtonClasses = computed(() => this.variantResult().copyButton(), ...(ngDevMode ? [{ debugName: "copyButtonClasses" }] : /* istanbul ignore next */ []));
116
- copyIconClasses = computed(() => this.variantResult().copyIcon(), ...(ngDevMode ? [{ debugName: "copyIconClasses" }] : /* istanbul ignore next */ []));
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
- }, ...(ngDevMode ? [{ debugName: "preAriaLabel" }] : /* istanbul ignore next */ []));
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: "21.2.14", ngImport: i0, type: CodeBlockComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
148
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", 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: `
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: "21.2.14", ngImport: i0, type: CodeBlockComponent, decorators: [{
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
- }, ...(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 });
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: "21.2.14", ngImport: i0, type: CollapsibleIconDirective, decorators: [{
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
- }, ...(ngDevMode ? [{ debugName: "iconClasses" }] : /* istanbul ignore next */ []));
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: "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
+ 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: "21.2.14", ngImport: i0, type: CollapsibleTriggerDirective, decorators: [{
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('', ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
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({}, ...(ngDevMode ? [{ debugName: "display" }] : /* istanbul ignore next */ []));
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, ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
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, ...(ngDevMode ? [{ debugName: "customIcon" }] : /* istanbul ignore next */ []));
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
- }), ...(ngDevMode ? [{ debugName: "resolvedDisplay" }] : /* istanbul ignore next */ []));
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
- }, ...(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 */ []));
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
- }, ...(ngDevMode ? [{ debugName: "contentWrapperClasses" }] : /* istanbul ignore next */ []));
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: "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: `
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: "21.2.14", ngImport: i0, type: CollapsibleComponent, decorators: [{
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, ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
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', ...(ngDevMode ? [{ debugName: "hostRole" }] : /* istanbul ignore next */ []));
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', ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
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, ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
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: "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 });
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: "21.2.14", ngImport: i0, type: CollapsibleGroupComponent, decorators: [{
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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"}