@cdevhub/ngx-tw 0.2.0 → 0.2.1

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 (40) hide show
  1. package/fesm2022/cdevhub-ngx-tw-alert.mjs.map +1 -1
  2. package/fesm2022/cdevhub-ngx-tw-button.mjs +11 -7
  3. package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -1
  4. package/fesm2022/cdevhub-ngx-tw-calendar.mjs +8 -1
  5. package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -1
  6. package/fesm2022/cdevhub-ngx-tw-carousel.mjs +8 -2
  7. package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -1
  8. package/fesm2022/cdevhub-ngx-tw-code-block.mjs +8 -9
  9. package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -1
  10. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -1
  11. package/fesm2022/cdevhub-ngx-tw-combobox.mjs +10 -0
  12. package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -1
  13. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +2 -2
  14. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -1
  15. package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -1
  16. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +2 -0
  17. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -1
  18. package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -1
  19. package/fesm2022/cdevhub-ngx-tw-paginator.mjs +6 -2
  20. package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -1
  21. package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -1
  22. package/fesm2022/cdevhub-ngx-tw-select.mjs +10 -0
  23. package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -1
  24. package/fesm2022/cdevhub-ngx-tw-sort.mjs +3 -0
  25. package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -1
  26. package/fesm2022/cdevhub-ngx-tw-stepper.mjs +2 -2
  27. package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -1
  28. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -1
  29. package/fesm2022/cdevhub-ngx-tw-tabs.mjs +2 -2
  30. package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -1
  31. package/fesm2022/cdevhub-ngx-tw-textarea.mjs +5 -1
  32. package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -1
  33. package/fesm2022/cdevhub-ngx-tw-toast.mjs +11 -0
  34. package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -1
  35. package/package.json +4 -1
  36. package/theme/_dark.css +16 -12
  37. package/theme/_semantic.css +3 -2
  38. package/types/cdevhub-ngx-tw-code-block.d.ts +8 -7
  39. package/types/cdevhub-ngx-tw-select.d.ts +1 -1
  40. package/types/cdevhub-ngx-tw-toast.d.ts +1 -1
@@ -62,13 +62,14 @@ const codeBlockVariants = tv({
62
62
  * projection slot for filename / extra actions.
63
63
  *
64
64
  * @remarks
65
- * **`role="region"` ownership.** The outer host is a presentational container —
66
- * the inner `<pre tabindex="0" role="region" aria-label="...">` owns the
67
- * scrollable-content region semantics that screen readers and AXE care about.
68
- * Promoting the host to `role="region"` as well would double-announce the
69
- * landmark; the `<pre>` is the focusable, keyboard-reachable target, so the
70
- * region role belongs there. This matches APG guidance for scroll-region
71
- * widgets and Material's `pre`-as-region pattern.
65
+ * **Accessibility.** The inner `<pre tabindex="0" aria-label="...">` is the
66
+ * focusable, keyboard-reachable scroll surface; the host is presentational.
67
+ * The `<pre>` carries `aria-label` for SR users but no landmark role a
68
+ * documentation page can mount many code blocks at once and ARIA's
69
+ * `landmark-unique` rule (axe best-practice) flags duplicate
70
+ * `region "<lang> code"` names. Consumers who want this block to act as a
71
+ * page landmark can wrap it in `<section aria-label="…">` with a unique
72
+ * name.
72
73
  */
73
74
  class CodeBlockComponent {
74
75
  /** The code string to display and copy to clipboard. */
@@ -170,7 +171,6 @@ class CodeBlockComponent {
170
171
  </button>
171
172
  </div>
172
173
  <pre
173
- role="region"
174
174
  tabindex="0"
175
175
  [attr.aria-label]="preAriaLabel()"
176
176
  [class]="preClasses()"
@@ -211,7 +211,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
211
211
  </button>
212
212
  </div>
213
213
  <pre
214
- role="region"
215
214
  tabindex="0"
216
215
  [attr.aria-label]="preAriaLabel()"
217
216
  [class]="preClasses()"
@@ -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 * **`role=\"region\"` ownership.** The outer host is a presentational container —\n * the inner `<pre tabindex=\"0\" role=\"region\" aria-label=\"...\">` owns the\n * scrollable-content region semantics that screen readers and AXE care about.\n * Promoting the host to `role=\"region\"` as well would double-announce the\n * landmark; the `<pre>` is the focusable, keyboard-reachable target, so the\n * region role belongs there. This matches APG guidance for scroll-region\n * widgets and Material's `pre`-as-region pattern.\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 role=\"region\"\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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"}
@@ -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 signal,\n untracked,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FocusableOption, FocusKeyManager, LiveAnnouncer } from '@angular/cdk/a11y';\nimport { tv } from 'tailwind-variants';\nimport type { TwColor, TwSize } from '@cdevhub/ngx-tw/core';\n\n/** Visual style of the collapsible container. */\nexport type CollapsibleVariant = 'default' | 'bordered' | 'ghost' | 'filled';\n\n/** Decorative axes bundled into a single collapsible input. */\nexport interface CollapsibleDisplay {\n /** Visual style of the panel container. Defaults to `'default'`. */\n variant?: CollapsibleVariant;\n /** Semantic color; applies to the `bordered` and `filled` variants. Defaults to `'neutral'`. */\n color?: TwColor;\n /** Padding scale for the trigger and content sections. Defaults to `'md'`. */\n size?: TwSize;\n}\n\nconst DISPLAY_DEFAULTS: Required<CollapsibleDisplay> = {\n variant: 'default',\n color: 'neutral',\n size: 'md',\n};\n\n// ── tv() config ──\n\nconst collapsibleVariants = tv({\n slots: {\n root: 'block rounded-lg overflow-hidden',\n trigger:\n 'flex w-full items-center justify-between gap-3 bg-transparent border-0 appearance-none cursor-pointer text-sm font-medium text-fg transition-colors duration-normal motion-reduce:transition-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',\n icon: 'size-5 shrink-0 text-fg-muted transition-transform duration-normal motion-reduce:transition-none',\n content: 'text-sm text-fg',\n },\n variants: {\n variant: {\n default: {\n root: 'border-b border-border',\n trigger: 'hover:bg-surface-muted',\n },\n bordered: {\n root: 'border border-border',\n trigger: 'hover:bg-surface-muted',\n content: 'border-t border-border',\n },\n ghost: {\n root: '',\n trigger: 'hover:bg-surface-muted rounded-md',\n },\n filled: {\n root: '',\n },\n },\n size: {\n xs: { trigger: 'px-2 py-1 text-xs', content: 'p-2' },\n sm: { trigger: 'px-3 py-1.5 text-sm', content: 'p-3' },\n md: { trigger: 'px-4 py-2 text-sm', content: 'p-4' },\n lg: { trigger: 'px-5 py-2.5 text-base', content: 'p-6' },\n xl: { trigger: 'px-6 py-3 text-base', content: 'p-8' },\n },\n color: {\n primary: {},\n secondary: {},\n accent: {},\n neutral: {},\n info: {},\n success: {},\n warning: {},\n error: {},\n },\n disabled: {\n true: { root: 'opacity-50 pointer-events-none' },\n false: {},\n },\n inGroup: {\n true: { root: 'rounded-none border-b-0 border-0' },\n false: {},\n },\n },\n compoundVariants: [\n // ── Filled + color ──\n { variant: 'filled', color: 'primary', class: { root: 'bg-primary-50', trigger: 'text-primary-800 hover:bg-primary-100', content: 'text-primary-700', icon: 'text-primary-600' } },\n { variant: 'filled', color: 'secondary', class: { root: 'bg-secondary-50', trigger: 'text-secondary-800 hover:bg-secondary-100', content: 'text-secondary-700', icon: 'text-secondary-600' } },\n { variant: 'filled', color: 'accent', class: { root: 'bg-accent-50', trigger: 'text-accent-800 hover:bg-accent-100', content: 'text-accent-700', icon: 'text-accent-600' } },\n { variant: 'filled', color: 'neutral', class: { root: 'bg-surface-muted', trigger: 'text-fg hover:bg-surface-sunken', content: 'text-fg-muted' } },\n { variant: 'filled', color: 'info', class: { root: 'bg-info-50', trigger: 'text-info-800 hover:bg-info-100', content: 'text-info-700', icon: 'text-info-600' } },\n { variant: 'filled', color: 'success', class: { root: 'bg-success-50', trigger: 'text-success-800 hover:bg-success-100', content: 'text-success-700', icon: 'text-success-600' } },\n { variant: 'filled', color: 'warning', class: { root: 'bg-warning-50', trigger: 'text-warning-800 hover:bg-warning-100', content: 'text-warning-700', icon: 'text-warning-600' } },\n { variant: 'filled', color: 'error', class: { root: 'bg-error-50', trigger: 'text-error-800 hover:bg-error-100', content: 'text-error-700', icon: 'text-error-600' } },\n\n // ── Bordered + color ──\n { variant: 'bordered', color: 'primary', class: { root: 'border-primary-300' } },\n { variant: 'bordered', color: 'secondary', class: { root: 'border-secondary-300' } },\n { variant: 'bordered', color: 'accent', class: { root: 'border-accent-300' } },\n { variant: 'bordered', color: 'info', class: { root: 'border-info-300' } },\n { variant: 'bordered', color: 'success', class: { root: 'border-success-300' } },\n { variant: 'bordered', color: 'warning', class: { root: 'border-warning-300' } },\n { variant: 'bordered', color: 'error', class: { root: 'border-error-300' } },\n ],\n defaultVariants: {\n variant: 'default',\n color: 'neutral',\n size: 'md',\n disabled: false,\n inGroup: false,\n },\n}, {\n twMerge: true,\n});\n\n// ── Unique ID counter ──\nlet nextId = 0;\n\n// ── CollapsibleIconDirective ──\n\n@Directive({\n selector: '[twCollapsibleIcon]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class CollapsibleIconDirective {\n private readonly collapsible = inject(CollapsibleComponent);\n\n /** @internal */\n readonly classes = computed(() => {\n const base = this.collapsible.iconClasses();\n return this.collapsible.open() ? `${base} rotate-180` : base;\n });\n}\n\n// ── CollapsibleTriggerDirective ──\n\n/**\n * Marks the toggle element inside a `<tw-collapsible>`. Apply this to a\n * native `<button>`; the directive wires up ARIA, keyboard handling, and\n * focus management. Custom hosts (e.g. `<div>`) are not supported.\n */\n@Component({\n selector: '[twCollapsibleTrigger]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n // ViewEncapsulation.None — the directive's host IS the consumer's <button>;\n // scoped styles can't reach a host that lives outside this component's tree.\n encapsulation: ViewEncapsulation.None,\n host: {\n '[class]': 'classes()',\n '[attr.aria-expanded]': 'collapsible.open()',\n '[attr.aria-controls]': 'collapsible.panelId',\n '[attr.aria-disabled]': 'collapsible.disabled() || null',\n '[attr.tabindex]': 'collapsible.disabled() ? -1 : 0',\n '[attr.id]': 'collapsible.triggerId',\n '(click)': 'onClick()',\n '(keydown)': 'onKeydown($event)',\n },\n template: `\n <ng-content />\n @if (!collapsible.customIcon()) {\n <svg [class]=\"iconClasses()\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M5.22 8.22a.75.75 0 0 1 1.06 0L10 11.94l3.72-3.72a.75.75 0 1 1 1.06 1.06l-4.25 4.25a.75.75 0 0 1-1.06 0L5.22 9.28a.75.75 0 0 1 0-1.06Z\" clip-rule=\"evenodd\" />\n </svg>\n }\n `,\n})\nexport class CollapsibleTriggerDirective implements FocusableOption {\n /** @internal */\n readonly collapsible = inject(CollapsibleComponent);\n readonly elementRef = inject(ElementRef<HTMLElement>);\n\n /** @internal */\n readonly classes = this.collapsible.triggerClasses;\n\n /** @internal */\n readonly iconClasses = computed(() => {\n const base = this.collapsible.iconClasses();\n return this.collapsible.open() ? `${base} rotate-180` : base;\n });\n\n onClick(): void {\n this.collapsible.toggle();\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.collapsible.toggle();\n return;\n }\n\n // Delegate arrow key navigation to group\n const group = this.collapsible.group;\n if (group) {\n group.onTriggerKeydown(event);\n }\n }\n\n focus(): void {\n this.elementRef.nativeElement.focus();\n }\n\n /** @internal FocusableOption: lets FocusKeyManager skip disabled triggers. */\n get disabled(): boolean {\n return this.collapsible.disabled();\n }\n\n /** @internal FocusableOption: text label for typeahead navigation. */\n getLabel(): string {\n return this.elementRef.nativeElement.textContent?.trim() ?? '';\n }\n}\n\n// ── CollapsibleComponent ──\n\n@Component({\n selector: 'tw-collapsible',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'rootClasses()',\n },\n template: `\n <ng-content select=\"[twCollapsibleTrigger]\" />\n @if (keepAlive() ? activated() : open()) {\n <div [class]=\"contentWrapperClasses()\"\n [attr.data-open]=\"open()\"\n [attr.id]=\"panelId\"\n [attr.aria-labelledby]=\"triggerId\"\n role=\"region\"\n [animate.enter]=\"'collapsible-enter'\"\n [animate.leave]=\"keepAlive() ? '' : 'collapsible-leave'\">\n <div class=\"overflow-hidden\">\n <ng-content />\n </div>\n </div>\n }\n `,\n})\nexport class CollapsibleComponent {\n /** Unique identifier for this panel. Required when used inside a group. */\n readonly value = input<string>('');\n\n /** Bundles decorative axes: `variant`, `color`, `size`. Accepts a partial; unset keys fall back to the defaults (`{ variant: 'default', color: 'neutral', size: 'md' }`). */\n readonly display = input<CollapsibleDisplay>({});\n\n /** When true, the panel cannot be toggled and appears dimmed. Defaults to `false`. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** When true, content is rendered on first open and kept in the DOM across toggles. Defaults to `false`. */\n readonly keepAlive = input(false, { transform: booleanAttribute });\n\n /** Whether the panel is expanded. Two-way bindable. Defaults to `false`. */\n readonly open = model(false);\n\n /** Fires after the panel is toggled. Payload is the new open state. */\n readonly toggled = output<boolean>();\n\n /** @internal */\n readonly group = inject(CollapsibleGroupComponent, { optional: true });\n private readonly liveAnnouncer = inject(LiveAnnouncer);\n\n /** @internal */\n readonly customIcon = contentChild(CollapsibleIconDirective);\n\n private readonly componentId = `tw-collapsible-${nextId++}`;\n readonly triggerId = `${this.componentId}-trigger`;\n readonly panelId = `${this.componentId}-panel`;\n\n /**\n * @internal Tracks whether the panel has been opened at least once (for keepAlive mode).\n *\n * Latches to `true` the first time `open` is `true` and stays `true` for the\n * lifetime of the component. Implemented as a `linkedSignal` so the derivation\n * lives next to the source — `activated()` reads cleanly as \"derived from open\".\n */\n readonly activated = linkedSignal<boolean, boolean>({\n source: () => this.open(),\n computation: (open, prev) => (prev?.value ?? false) || open,\n });\n\n // ── Resolved display config ──\n\n /** @internal Resolved decorative configuration. */\n readonly resolvedDisplay = computed<Required<CollapsibleDisplay>>(() => ({\n ...DISPLAY_DEFAULTS,\n ...this.display(),\n }));\n\n // ── Variant classes ──\n\n private readonly variantResult = computed(() => {\n const { variant, color, size } = this.resolvedDisplay();\n return collapsibleVariants({\n variant,\n color,\n size,\n disabled: this.disabled(),\n inGroup: !!this.group,\n });\n });\n\n readonly rootClasses = computed(() => this.variantResult().root());\n readonly triggerClasses = computed(() => this.variantResult().trigger());\n readonly iconClasses = computed(() => this.variantResult().icon());\n readonly contentClasses = computed(() => this.variantResult().content());\n\n readonly contentWrapperClasses = computed(() => {\n const base = this.contentClasses();\n return this.keepAlive() ? `${base} collapsible-keep-alive` : base;\n });\n\n /** @internal Toggle the open state. Called by the trigger directive. */\n toggle(): void {\n if (this.disabled()) return;\n\n if (this.group) {\n this.group.toggleItem(this);\n } else {\n const next = !this.open();\n this.open.set(next);\n this.toggled.emit(next);\n this.announceState(next);\n }\n }\n\n /** @internal Set the open state programmatically (used by group). */\n setOpen(value: boolean): void {\n this.open.set(value);\n }\n\n /** @internal */\n announceState(isOpen: boolean): void {\n this.liveAnnouncer.announce(\n isOpen ? 'Section expanded' : 'Section collapsed',\n );\n }\n}\n\n// ── CollapsibleGroupComponent ──\n\n@Component({\n selector: 'tw-collapsible-group',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n // Use bindings (not static attributes) so subclasses can override the values.\n // Angular DOES inherit host metadata across `extends`; literal-string entries\n // can't be turned off by a subclass, but binding expressions are evaluated\n // against the actual instance and so respect subclass overrides of the\n // backing signal/computed.\n '[attr.role]': 'hostRole()',\n '[class]': 'hostClasses()',\n },\n template: `<ng-content />`,\n})\nexport class CollapsibleGroupComponent {\n /**\n * When true, only one panel can be open at a time.\n *\n * `AccordionComponent` (subclass) ignores this input and drives the same\n * behaviour from its own `type` input via the `isAccordionMode()` /\n * `canCollapseSingleMode()` virtual hooks below. Consumers using\n * `<tw-collapsible-group>` directly should bind this input; consumers using\n * `<tw-accordion>` should bind `type=\"single\"` / `type=\"multiple\"` instead.\n *\n * Defaults to `false`.\n */\n readonly accordion = input(false, { transform: booleanAttribute });\n\n /** The value(s) of currently open panels. String in accordion mode, string array in independent mode. `null` when no panel is open in accordion mode. Two-way bindable. Defaults to `null`. */\n readonly value = model<string | string[] | null>(null);\n\n /**\n * @internal Wrapper `role` attribute. Subclasses may override (e.g.\n * `AccordionComponent` returns `null` per APG — accordions don't carry\n * `role=\"group\"`).\n */\n readonly hostRole = computed<string | null>(() => 'group');\n\n /**\n * @internal Host class string. Subclasses may override to provide their own\n * variant-driven string (e.g. `AccordionComponent.rootClasses`).\n */\n readonly hostClasses = computed(() => 'block rounded-lg overflow-hidden divide-y divide-border');\n\n /** @internal */\n readonly items = contentChildren(CollapsibleComponent);\n\n /** @internal */\n readonly triggers = contentChildren(CollapsibleTriggerDirective, { descendants: true });\n\n private keyManager: FocusKeyManager<CollapsibleTriggerDirective> | null = null;\n\n /**\n * @internal Whether the group is in single-open-panel mode.\n *\n * Subclasses override to bridge their own input surface (e.g. `AccordionComponent`\n * returns `this.type() === 'single'`). All internal toggle/sync/warn logic reads\n * the mode through this hook, never `accordion()` directly — that lets the\n * subclass drive mode from `type` without redeclaring the parent's signal input.\n */\n protected isAccordionMode(): boolean {\n return this.accordion();\n }\n\n /**\n * @internal Whether re-clicking the open panel in single mode closes it.\n *\n * Defaults to `true` for the bare group component (re-clicking always closes).\n * `AccordionComponent` overrides to honour its `collapsible` opt-out input.\n */\n protected canCollapseSingleMode(): boolean {\n return true;\n }\n\n constructor() {\n // Sync children open states from the group value\n afterNextRender(() => {\n this.syncChildrenFromValue();\n });\n\n // Watch for value changes and sync children\n effect(() => {\n const val = this.value();\n const items = this.items();\n if (items.length === 0) return;\n\n // Read mode via the virtual hook so subclass overrides take effect.\n const accordion = this.isAccordionMode();\n\n if (isDevMode()) {\n if (accordion && Array.isArray(val)) {\n console.warn(\n '[tw-collapsible-group] `value` is an array but the group is in accordion mode. Use a single string (or null) in accordion mode.',\n );\n } else if (!accordion && typeof val === 'string' && val !== '') {\n console.warn(\n '[tw-collapsible-group] `value` is a string but the group is in independent mode. Use a string[] in independent mode.',\n );\n }\n }\n\n untracked(() => {\n for (const item of items) {\n const itemValue = item.value();\n if (accordion) {\n item.setOpen(itemValue === val);\n } else {\n const openValues = Array.isArray(val) ? val : [];\n item.setOpen(openValues.includes(itemValue));\n }\n }\n });\n });\n\n // Rebuild FocusKeyManager whenever the trigger set changes\n effect((onCleanup) => {\n const triggers = this.triggers();\n if (triggers.length === 0) {\n this.keyManager = null;\n return;\n }\n this.keyManager = new FocusKeyManager(triggers)\n .withWrap()\n .withHomeAndEnd()\n .withVerticalOrientation()\n .withTypeAhead();\n\n onCleanup(() => {\n this.keyManager?.destroy();\n });\n });\n }\n\n private syncChildrenFromValue(): void {\n const val = this.value();\n const items = this.items();\n const accordion = this.isAccordionMode();\n for (const item of items) {\n const itemValue = item.value();\n if (accordion) {\n item.setOpen(itemValue === val);\n } else {\n const openValues = Array.isArray(val) ? val : [];\n item.setOpen(openValues.includes(itemValue));\n }\n }\n }\n\n /** @internal Called by a child collapsible when it is toggled. */\n toggleItem(item: CollapsibleComponent): void {\n const itemValue = item.value();\n const isCurrentlyOpen = item.open();\n const next = !isCurrentlyOpen;\n\n if (this.isAccordionMode()) {\n if (next) {\n // Close all others, open this one\n for (const child of this.items()) {\n if (child !== item) {\n child.setOpen(false);\n }\n }\n item.setOpen(true);\n this.value.set(itemValue);\n } else {\n // Close this one — honour the subclass's collapsible opt-out, if any.\n if (!this.canCollapseSingleMode()) return;\n item.setOpen(false);\n this.value.set(null);\n }\n } else {\n // Independent mode\n item.setOpen(next);\n const currentOpen = this.items()\n .filter(i => i.open())\n .map(i => i.value());\n this.value.set(currentOpen);\n }\n\n item.toggled.emit(next);\n item.announceState(next);\n }\n\n /** @internal Handle keyboard navigation within the group. */\n onTriggerKeydown(event: KeyboardEvent): void {\n if (!this.keyManager) return;\n\n // Sync active item with the currently focused trigger.\n // Use event.target (not document.activeElement) so this works under shadow DOM.\n const triggers = this.triggers();\n const focusedIdx = triggers.findIndex(\n t => t.elementRef.nativeElement === event.target,\n );\n if (focusedIdx >= 0 && focusedIdx !== this.keyManager.activeItemIndex) {\n this.keyManager.setActiveItem(focusedIdx);\n }\n\n this.keyManager.onKeydown(event);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
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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"}
@@ -177,6 +177,11 @@ class ComboboxOverlayComponent {
177
177
  </div>
178
178
  </li>
179
179
  } @else {
180
+ <!-- ARIA activedescendant listbox: keyboard navigation lives on the
181
+ parent combobox input (via aria-activedescendant). Options are
182
+ click-targets only and never receive DOM focus, so neither a
183
+ keydown nor a tabindex applies here. -->
184
+ <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->
180
185
  <li
181
186
  role="option"
182
187
  [id]="optionIdFn()(row.index)"
@@ -277,6 +282,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
277
282
  </div>
278
283
  </li>
279
284
  } @else {
285
+ <!-- ARIA activedescendant listbox: keyboard navigation lives on the
286
+ parent combobox input (via aria-activedescendant). Options are
287
+ click-targets only and never receive DOM focus, so neither a
288
+ keydown nor a tabindex applies here. -->
289
+ <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->
280
290
  <li
281
291
  role="option"
282
292
  [id]="optionIdFn()(row.index)"