ngx-com 0.0.21 → 0.1.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 (114) hide show
  1. package/README.md +137 -33
  2. package/fesm2022/ngx-com-components-alert.mjs +21 -11
  3. package/fesm2022/ngx-com-components-alert.mjs.map +1 -1
  4. package/fesm2022/ngx-com-components-avatar.mjs +9 -7
  5. package/fesm2022/ngx-com-components-avatar.mjs.map +1 -1
  6. package/fesm2022/ngx-com-components-button.mjs +1 -1
  7. package/fesm2022/ngx-com-components-button.mjs.map +1 -1
  8. package/fesm2022/ngx-com-components-calendar.mjs +27 -3112
  9. package/fesm2022/ngx-com-components-calendar.mjs.map +1 -1
  10. package/fesm2022/ngx-com-components-card.mjs +8 -8
  11. package/fesm2022/ngx-com-components-card.mjs.map +1 -1
  12. package/fesm2022/ngx-com-components-carousel.mjs +16 -4
  13. package/fesm2022/ngx-com-components-carousel.mjs.map +1 -1
  14. package/fesm2022/ngx-com-components-checkbox.mjs +1 -1
  15. package/fesm2022/ngx-com-components-checkbox.mjs.map +1 -1
  16. package/fesm2022/ngx-com-components-code-block.mjs +9 -9
  17. package/fesm2022/ngx-com-components-code-block.mjs.map +1 -1
  18. package/fesm2022/ngx-com-components-collapsible.mjs +15 -13
  19. package/fesm2022/ngx-com-components-collapsible.mjs.map +1 -1
  20. package/fesm2022/ngx-com-components-confirm.mjs +4 -4
  21. package/fesm2022/ngx-com-components-confirm.mjs.map +1 -1
  22. package/fesm2022/ngx-com-components-datepicker.mjs +2334 -0
  23. package/fesm2022/ngx-com-components-datepicker.mjs.map +1 -0
  24. package/fesm2022/ngx-com-components-dialog.mjs +47 -45
  25. package/fesm2022/ngx-com-components-dialog.mjs.map +1 -1
  26. package/fesm2022/ngx-com-components-dropdown.mjs +446 -340
  27. package/fesm2022/ngx-com-components-dropdown.mjs.map +1 -1
  28. package/fesm2022/ngx-com-components-empty-state.mjs +5 -3
  29. package/fesm2022/ngx-com-components-empty-state.mjs.map +1 -1
  30. package/fesm2022/ngx-com-components-form-field.mjs +11 -6
  31. package/fesm2022/ngx-com-components-form-field.mjs.map +1 -1
  32. package/fesm2022/ngx-com-components-icon-lucide.mjs +41 -0
  33. package/fesm2022/ngx-com-components-icon-lucide.mjs.map +1 -0
  34. package/fesm2022/ngx-com-components-icon.mjs +89 -61
  35. package/fesm2022/ngx-com-components-icon.mjs.map +1 -1
  36. package/fesm2022/ngx-com-components-item.mjs +14 -4
  37. package/fesm2022/ngx-com-components-item.mjs.map +1 -1
  38. package/fesm2022/ngx-com-components-menu.mjs +61 -69
  39. package/fesm2022/ngx-com-components-menu.mjs.map +1 -1
  40. package/fesm2022/ngx-com-components-native-control.mjs +170 -0
  41. package/fesm2022/ngx-com-components-native-control.mjs.map +1 -0
  42. package/fesm2022/ngx-com-components-paginator.mjs +11 -3
  43. package/fesm2022/ngx-com-components-paginator.mjs.map +1 -1
  44. package/fesm2022/ngx-com-components-popover.mjs +58 -33
  45. package/fesm2022/ngx-com-components-popover.mjs.map +1 -1
  46. package/fesm2022/ngx-com-components-radio.mjs +4 -4
  47. package/fesm2022/ngx-com-components-radio.mjs.map +1 -1
  48. package/fesm2022/ngx-com-components-segmented-control.mjs +6 -4
  49. package/fesm2022/ngx-com-components-segmented-control.mjs.map +1 -1
  50. package/fesm2022/ngx-com-components-sort.mjs +63 -57
  51. package/fesm2022/ngx-com-components-sort.mjs.map +1 -1
  52. package/fesm2022/ngx-com-components-spinner.mjs +6 -6
  53. package/fesm2022/ngx-com-components-spinner.mjs.map +1 -1
  54. package/fesm2022/ngx-com-components-switch.mjs +18 -9
  55. package/fesm2022/ngx-com-components-switch.mjs.map +1 -1
  56. package/fesm2022/ngx-com-components-table.mjs +23 -9
  57. package/fesm2022/ngx-com-components-table.mjs.map +1 -1
  58. package/fesm2022/ngx-com-components-tabs.mjs +81 -58
  59. package/fesm2022/ngx-com-components-tabs.mjs.map +1 -1
  60. package/fesm2022/ngx-com-components-timepicker.mjs +1048 -0
  61. package/fesm2022/ngx-com-components-timepicker.mjs.map +1 -0
  62. package/fesm2022/ngx-com-components-toast.mjs +18 -14
  63. package/fesm2022/ngx-com-components-toast.mjs.map +1 -1
  64. package/fesm2022/ngx-com-components-tooltip.mjs +5 -5
  65. package/fesm2022/ngx-com-components-tooltip.mjs.map +1 -1
  66. package/fesm2022/ngx-com-components.mjs +0 -13
  67. package/fesm2022/ngx-com-components.mjs.map +1 -1
  68. package/fesm2022/ngx-com-tokens.mjs +0 -8
  69. package/fesm2022/ngx-com-tokens.mjs.map +1 -1
  70. package/fesm2022/ngx-com-utils.mjs +13 -1
  71. package/fesm2022/ngx-com-utils.mjs.map +1 -1
  72. package/fesm2022/ngx-com.mjs +1 -1
  73. package/fesm2022/ngx-com.mjs.map +1 -1
  74. package/package.json +51 -8
  75. package/styles/animations.css +38 -0
  76. package/styles/candy.css +121 -0
  77. package/styles/dark.css +159 -0
  78. package/styles/forest.css +117 -0
  79. package/styles/ocean.css +117 -0
  80. package/styles/themes.css +7 -0
  81. package/styles/tokens.css +277 -0
  82. package/styles/utilities.css +16 -0
  83. package/types/ngx-com-components-alert.d.ts +14 -4
  84. package/types/ngx-com-components-avatar.d.ts +2 -0
  85. package/types/ngx-com-components-calendar.d.ts +3 -747
  86. package/types/ngx-com-components-card.d.ts +2 -2
  87. package/types/ngx-com-components-carousel.d.ts +11 -1
  88. package/types/ngx-com-components-code-block.d.ts +4 -4
  89. package/types/ngx-com-components-collapsible.d.ts +10 -2
  90. package/types/ngx-com-components-confirm.d.ts +2 -2
  91. package/types/ngx-com-components-datepicker.d.ts +623 -0
  92. package/types/ngx-com-components-dialog.d.ts +5 -2
  93. package/types/ngx-com-components-dropdown.d.ts +22 -4
  94. package/types/ngx-com-components-empty-state.d.ts +2 -0
  95. package/types/ngx-com-components-form-field.d.ts +4 -1
  96. package/types/ngx-com-components-icon-lucide.d.ts +32 -0
  97. package/types/ngx-com-components-icon.d.ts +49 -35
  98. package/types/ngx-com-components-item.d.ts +12 -2
  99. package/types/ngx-com-components-menu.d.ts +38 -38
  100. package/types/ngx-com-components-native-control.d.ts +99 -0
  101. package/types/ngx-com-components-paginator.d.ts +2 -0
  102. package/types/ngx-com-components-popover.d.ts +19 -12
  103. package/types/ngx-com-components-segmented-control.d.ts +3 -1
  104. package/types/ngx-com-components-sort.d.ts +13 -10
  105. package/types/ngx-com-components-switch.d.ts +7 -2
  106. package/types/ngx-com-components-table.d.ts +16 -2
  107. package/types/ngx-com-components-tabs.d.ts +46 -34
  108. package/types/ngx-com-components-timepicker.d.ts +273 -0
  109. package/types/ngx-com-components-toast.d.ts +4 -2
  110. package/types/ngx-com-components-tooltip.d.ts +1 -1
  111. package/types/ngx-com-components.d.ts +6 -7
  112. package/types/ngx-com-tokens.d.ts +5 -3
  113. package/types/ngx-com-utils.d.ts +11 -1
  114. package/types/ngx-com.d.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-com-components-checkbox.mjs","sources":["../../../projects/com/components/checkbox/checkbox.variants.ts","../../../projects/com/components/checkbox/checkbox.component.ts","../../../projects/com/components/checkbox/index.ts","../../../projects/com/components/checkbox/ngx-com-components-checkbox.ts"],"sourcesContent":["import { cva } from 'class-variance-authority';\n\n/** Checkbox size variants. */\nexport type CheckboxSize = 'sm' | 'md' | 'lg';\n\n/** Checkbox color variants. */\nexport type CheckboxVariant = 'primary' | 'accent' | 'warn';\n\n/**\n * CVA variants for the visual checkbox box.\n *\n * Uses `peer` selectors to style based on native input state:\n * - `peer-checked:` for checked state\n * - `peer-indeterminate:` for indeterminate state\n * - `peer-focus-visible:` for keyboard focus\n * - `peer-disabled:` for disabled state\n *\n * @tokens `--color-border`, `--color-primary`, `--color-primary-foreground`, `--color-primary-hover`,\n * `--color-accent`, `--color-accent-foreground`, `--color-accent-hover`,\n * `--color-warn`, `--color-warn-foreground`, `--color-warn-hover`,\n * `--color-disabled`, `--color-disabled-foreground`, `--color-ring`, `--radius-interactive-sm`\n */\nexport const checkboxBoxVariants: (props?: {\n variant?: CheckboxVariant;\n size?: CheckboxSize;\n}) => string = cva(\n [\n 'com-checkbox__box',\n 'inline-flex shrink-0 items-center justify-center',\n 'rounded-interactive-sm border-2 border-border',\n 'transition-colors duration-150',\n 'peer-focus-visible:outline-[1px] peer-focus-visible:outline-offset-2 peer-focus-visible:outline-ring',\n 'peer-disabled:cursor-not-allowed peer-disabled:border-disabled peer-disabled:bg-disabled peer-disabled:text-disabled-foreground',\n ],\n {\n variants: {\n variant: {\n primary: [\n 'peer-checked:border-primary peer-checked:bg-primary peer-checked:text-primary-foreground',\n 'peer-indeterminate:border-primary peer-indeterminate:bg-primary peer-indeterminate:text-primary-foreground',\n 'group-hover:border-primary-hover',\n 'peer-checked:group-hover:bg-primary-hover peer-checked:group-hover:border-primary-hover',\n 'peer-indeterminate:group-hover:bg-primary-hover peer-indeterminate:group-hover:border-primary-hover',\n ],\n accent: [\n 'peer-checked:border-accent peer-checked:bg-accent peer-checked:text-accent-foreground',\n 'peer-indeterminate:border-accent peer-indeterminate:bg-accent peer-indeterminate:text-accent-foreground',\n 'group-hover:border-accent-hover',\n 'peer-checked:group-hover:bg-accent-hover peer-checked:group-hover:border-accent-hover',\n 'peer-indeterminate:group-hover:bg-accent-hover peer-indeterminate:group-hover:border-accent-hover',\n ],\n warn: [\n 'peer-checked:border-warn peer-checked:bg-warn peer-checked:text-warn-foreground',\n 'peer-indeterminate:border-warn peer-indeterminate:bg-warn peer-indeterminate:text-warn-foreground',\n 'group-hover:border-warn-hover',\n 'peer-checked:group-hover:bg-warn-hover peer-checked:group-hover:border-warn-hover',\n 'peer-indeterminate:group-hover:bg-warn-hover peer-indeterminate:group-hover:border-warn-hover',\n ],\n },\n size: {\n sm: 'size-4',\n md: 'size-5',\n lg: 'size-6',\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'md',\n },\n }\n);\n\n/** Size-based classes for the checkmark SVG icon. */\nexport const CHECKBOX_ICON_SIZES: Record<CheckboxSize, string> = {\n sm: 'size-3',\n md: 'size-3.5',\n lg: 'size-4',\n};\n\n/** Size-based classes for the label content. */\nexport const CHECKBOX_LABEL_SIZES: Record<CheckboxSize, string> = {\n sm: 'text-sm ms-2',\n md: 'text-base ms-2.5',\n lg: 'text-lg ms-3',\n};\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n model,\n output,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport type {\n InputSignal,\n ModelSignal,\n OutputEmitterRef,\n Signal,\n} from '@angular/core';\nimport { NgControl } from '@angular/forms';\nimport type { ControlValueAccessor } from '@angular/forms';\nimport {\n checkboxBoxVariants,\n CHECKBOX_ICON_SIZES,\n CHECKBOX_LABEL_SIZES,\n} from './checkbox.variants';\nimport type { CheckboxSize, CheckboxVariant } from './checkbox.variants';\n\n/** Event emitted when checkbox state changes. */\nexport interface CheckboxChange {\n checked: boolean;\n source: ComCheckbox;\n}\n\n/** Auto-incrementing ID counter for unique checkbox IDs. */\nlet nextId = 0;\n\n/**\n * Production-grade checkbox component with full accessibility support.\n *\n * Uses a native `<input type=\"checkbox\">` for built-in keyboard handling,\n * `:checked` and `:indeterminate` pseudo-classes, and screen reader support.\n *\n * Implements `ControlValueAccessor` for Reactive Forms integration via\n * `NgControl` injection pattern (no `NG_VALUE_ACCESSOR` provider).\n *\n * @tokens `--color-border`, `--color-primary`, `--color-primary-foreground`, `--color-primary-hover`,\n * `--color-accent`, `--color-accent-foreground`, `--color-accent-hover`,\n * `--color-warn`, `--color-warn-foreground`, `--color-warn-hover`,\n * `--color-disabled`, `--color-disabled-foreground`, `--color-ring`\n *\n * @example Basic usage\n * ```html\n * <com-checkbox [(checked)]=\"isActive\">Enable feature</com-checkbox>\n * ```\n *\n * @example With reactive forms\n * ```html\n * <com-checkbox formControlName=\"acceptTerms\">\n * I accept the <a href=\"/terms\">terms and conditions</a>\n * </com-checkbox>\n * ```\n *\n * @example Indeterminate state\n * ```html\n * <com-checkbox [(indeterminate)]=\"hasPartialSelection\" (changed)=\"onSelectAll($event)\">\n * Select all\n * </com-checkbox>\n * ```\n *\n * @example Variants and sizes\n * ```html\n * <com-checkbox variant=\"accent\" size=\"lg\">Large accent checkbox</com-checkbox>\n * <com-checkbox variant=\"warn\" size=\"sm\">Small warning checkbox</com-checkbox>\n * ```\n */\n@Component({\n selector: 'com-checkbox',\n exportAs: 'comCheckbox',\n template: `\n <label\n class=\"group relative inline-flex items-center\"\n [class.cursor-pointer]=\"!disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n >\n <span><input\n #inputElement\n type=\"checkbox\"\n class=\"peer sr-only\"\n [id]=\"inputId()\"\n [checked]=\"checked()\"\n [disabled]=\"disabled()\"\n [attr.name]=\"name()\"\n [attr.value]=\"htmlValue()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledby()\"\n [attr.aria-describedby]=\"ariaDescribedby()\"\n (change)=\"onInputChange($event)\"\n (blur)=\"onBlur()\"\n /></span>\n <span [class]=\"boxClasses()\">\n @if (checked() && !indeterminate()) {\n <svg\n class=\"pointer-events-none\"\n [class]=\"iconSizeClass()\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <polyline points=\"4 12 9 17 20 6\" />\n </svg>\n }\n @if (indeterminate()) {\n <svg\n class=\"pointer-events-none\"\n [class]=\"iconSizeClass()\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n }\n </span>\n <span\n class=\"com-checkbox__label select-none peer-disabled:cursor-not-allowed peer-disabled:text-disabled-foreground\"\n [class]=\"labelSizeClass()\"\n >\n <ng-content />\n </span>\n </label>\n `,\n styles: `\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'com-checkbox inline-block align-middle',\n '[class.com-checkbox--disabled]': 'disabled()',\n '[class.com-checkbox--checked]': 'checked()',\n '[class.com-checkbox--indeterminate]': 'indeterminate()',\n },\n})\nexport class ComCheckbox implements ControlValueAccessor {\n /** Optional NgControl for reactive forms integration. */\n readonly ngControl: NgControl | null = inject(NgControl, { optional: true, self: true });\n\n /** Reference to the native input element. */\n readonly inputRef: Signal<ElementRef<HTMLInputElement> | undefined> =\n viewChild<ElementRef<HTMLInputElement>>('inputElement');\n\n /** Unique ID for this checkbox instance. */\n private readonly uniqueId: string = `com-checkbox-${nextId++}`;\n\n // Inputs\n readonly size: InputSignal<CheckboxSize> = input<CheckboxSize>('md');\n readonly variant: InputSignal<CheckboxVariant> = input<CheckboxVariant>('primary');\n readonly checked: ModelSignal<boolean> = model<boolean>(false);\n readonly indeterminate: ModelSignal<boolean> = model<boolean>(false);\n readonly disabled: ModelSignal<boolean> = model<boolean>(false);\n readonly htmlValue: InputSignal<string | undefined> = input<string | undefined>(undefined, { alias: 'value' });\n readonly name: InputSignal<string | undefined> = input<string>();\n\n // Signal Forms inputs — set automatically by [formField] via setInputOnDirectives\n readonly touched: ModelSignal<boolean> = model<boolean>(false);\n readonly invalid: InputSignal<boolean> = input<boolean>(false);\n readonly sfErrors: InputSignal<readonly unknown[]> = input<readonly unknown[]>([], { alias: 'errors' });\n readonly sfRequired: InputSignal<boolean> = input<boolean>(false, { alias: 'required' });\n readonly id: InputSignal<string | undefined> = input<string>();\n readonly ariaLabel: InputSignal<string | null> = input<string | null>(null, { alias: 'aria-label' });\n readonly ariaLabelledby: InputSignal<string | null> = input<string | null>(null, { alias: 'aria-labelledby' });\n readonly ariaDescribedby: InputSignal<string | null> = input<string | null>(null, { alias: 'aria-describedby' });\n\n // Outputs\n readonly changed: OutputEmitterRef<CheckboxChange> = output<CheckboxChange>();\n\n // Computed state\n readonly inputId: Signal<string> = computed(() => this.id() ?? this.uniqueId);\n\n protected readonly boxClasses: Signal<string> = computed(() =>\n checkboxBoxVariants({ variant: this.variant(), size: this.size() })\n );\n\n protected readonly iconSizeClass: Signal<string> = computed(() => CHECKBOX_ICON_SIZES[this.size()]);\n protected readonly labelSizeClass: Signal<string> = computed(() => CHECKBOX_LABEL_SIZES[this.size()]);\n\n // CVA callbacks\n private onChange: (value: boolean) => void = () => {};\n protected onTouched: () => void = () => {};\n\n constructor() {\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n\n // Sync indeterminate state to DOM (needed because [indeterminate] is a property, not attribute)\n effect(() => {\n const isIndeterminate = this.indeterminate();\n const inputEl = this.inputRef()?.nativeElement;\n if (inputEl) {\n inputEl.indeterminate = isIndeterminate;\n }\n });\n }\n\n // ControlValueAccessor implementation\n writeValue(value: boolean): void {\n this.checked.set(value ?? false);\n }\n\n registerOnChange(fn: (value: boolean) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled.set(isDisabled);\n }\n\n // Event handlers\n protected onBlur(): void {\n this.onTouched();\n this.touched.set(true);\n }\n\n protected onInputChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n const newChecked = input.checked;\n\n // Clear indeterminate on user interaction\n if (this.indeterminate()) {\n this.indeterminate.set(false);\n input.indeterminate = false;\n }\n\n this.checked.set(newChecked);\n this.onChange(newChecked);\n this.changed.emit({ checked: newChecked, source: this });\n }\n\n // Public API\n /** Focuses this checkbox's input element. */\n focus(): void {\n this.inputRef()?.nativeElement.focus();\n }\n\n /** Toggles the checkbox state programmatically. */\n toggle(): void {\n if (this.disabled()) {\n return;\n }\n\n const newChecked = !this.checked();\n this.checked.set(newChecked);\n this.indeterminate.set(false);\n this.onChange(newChecked);\n this.changed.emit({ checked: newChecked, source: this });\n }\n}\n","// Public API for the checkbox component\n\n// Main component\nexport { ComCheckbox } from './checkbox.component';\n\n// Types\nexport type { CheckboxChange } from './checkbox.component';\n\n// Variants (for advanced customization)\nexport {\n checkboxBoxVariants,\n CHECKBOX_ICON_SIZES,\n CHECKBOX_LABEL_SIZES,\n} from './checkbox.variants';\n\nexport type { CheckboxSize, CheckboxVariant } from './checkbox.variants';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngx-com-components-checkbox.mjs","sources":["../../../projects/com/components/checkbox/checkbox.variants.ts","../../../projects/com/components/checkbox/checkbox.component.ts","../../../projects/com/components/checkbox/index.ts","../../../projects/com/components/checkbox/ngx-com-components-checkbox.ts"],"sourcesContent":["import { cva } from 'class-variance-authority';\n\n/** Checkbox size variants. */\nexport type CheckboxSize = 'sm' | 'md' | 'lg';\n\n/** Checkbox color variants. */\nexport type CheckboxVariant = 'primary' | 'accent' | 'warn';\n\n/**\n * CVA variants for the visual checkbox box.\n *\n * Uses `peer` selectors to style based on native input state:\n * - `peer-checked:` for checked state\n * - `peer-indeterminate:` for indeterminate state\n * - `peer-focus-visible:` for keyboard focus\n * - `peer-disabled:` for disabled state\n *\n * @tokens `--color-border`, `--color-primary`, `--color-primary-foreground`, `--color-primary-hover`,\n * `--color-accent`, `--color-accent-foreground`, `--color-accent-hover`,\n * `--color-warn`, `--color-warn-foreground`, `--color-warn-hover`,\n * `--color-disabled`, `--color-disabled-foreground`, `--color-ring`, `--radius-interactive-sm`\n */\nexport const checkboxBoxVariants: (props?: {\n variant?: CheckboxVariant;\n size?: CheckboxSize;\n}) => string = cva(\n [\n 'com-checkbox__box',\n 'inline-flex shrink-0 items-center justify-center',\n 'rounded-interactive-sm border-2 border-border',\n 'transition-colors duration-normal',\n 'peer-focus-visible:outline-[1px] peer-focus-visible:outline-offset-2 peer-focus-visible:outline-ring',\n 'peer-disabled:cursor-not-allowed peer-disabled:border-disabled peer-disabled:bg-disabled peer-disabled:text-disabled-foreground',\n ],\n {\n variants: {\n variant: {\n primary: [\n 'peer-checked:border-primary peer-checked:bg-primary peer-checked:text-primary-foreground',\n 'peer-indeterminate:border-primary peer-indeterminate:bg-primary peer-indeterminate:text-primary-foreground',\n 'group-hover:border-primary-hover',\n 'peer-checked:group-hover:bg-primary-hover peer-checked:group-hover:border-primary-hover',\n 'peer-indeterminate:group-hover:bg-primary-hover peer-indeterminate:group-hover:border-primary-hover',\n ],\n accent: [\n 'peer-checked:border-accent peer-checked:bg-accent peer-checked:text-accent-foreground',\n 'peer-indeterminate:border-accent peer-indeterminate:bg-accent peer-indeterminate:text-accent-foreground',\n 'group-hover:border-accent-hover',\n 'peer-checked:group-hover:bg-accent-hover peer-checked:group-hover:border-accent-hover',\n 'peer-indeterminate:group-hover:bg-accent-hover peer-indeterminate:group-hover:border-accent-hover',\n ],\n warn: [\n 'peer-checked:border-warn peer-checked:bg-warn peer-checked:text-warn-foreground',\n 'peer-indeterminate:border-warn peer-indeterminate:bg-warn peer-indeterminate:text-warn-foreground',\n 'group-hover:border-warn-hover',\n 'peer-checked:group-hover:bg-warn-hover peer-checked:group-hover:border-warn-hover',\n 'peer-indeterminate:group-hover:bg-warn-hover peer-indeterminate:group-hover:border-warn-hover',\n ],\n },\n size: {\n sm: 'size-4',\n md: 'size-5',\n lg: 'size-6',\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'md',\n },\n }\n);\n\n/** Size-based classes for the checkmark SVG icon. */\nexport const CHECKBOX_ICON_SIZES: Record<CheckboxSize, string> = {\n sm: 'size-3',\n md: 'size-3.5',\n lg: 'size-4',\n};\n\n/** Size-based classes for the label content. */\nexport const CHECKBOX_LABEL_SIZES: Record<CheckboxSize, string> = {\n sm: 'text-sm ms-2',\n md: 'text-base ms-2.5',\n lg: 'text-lg ms-3',\n};\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n model,\n output,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport type {\n InputSignal,\n ModelSignal,\n OutputEmitterRef,\n Signal,\n} from '@angular/core';\nimport { NgControl } from '@angular/forms';\nimport type { ControlValueAccessor } from '@angular/forms';\nimport {\n checkboxBoxVariants,\n CHECKBOX_ICON_SIZES,\n CHECKBOX_LABEL_SIZES,\n} from './checkbox.variants';\nimport type { CheckboxSize, CheckboxVariant } from './checkbox.variants';\n\n/** Event emitted when checkbox state changes. */\nexport interface CheckboxChange {\n checked: boolean;\n source: ComCheckbox;\n}\n\n/** Auto-incrementing ID counter for unique checkbox IDs. */\nlet nextId = 0;\n\n/**\n * Production-grade checkbox component with full accessibility support.\n *\n * Uses a native `<input type=\"checkbox\">` for built-in keyboard handling,\n * `:checked` and `:indeterminate` pseudo-classes, and screen reader support.\n *\n * Implements `ControlValueAccessor` for Reactive Forms integration via\n * `NgControl` injection pattern (no `NG_VALUE_ACCESSOR` provider).\n *\n * @tokens `--color-border`, `--color-primary`, `--color-primary-foreground`, `--color-primary-hover`,\n * `--color-accent`, `--color-accent-foreground`, `--color-accent-hover`,\n * `--color-warn`, `--color-warn-foreground`, `--color-warn-hover`,\n * `--color-disabled`, `--color-disabled-foreground`, `--color-ring`\n *\n * @example Basic usage\n * ```html\n * <com-checkbox [(checked)]=\"isActive\">Enable feature</com-checkbox>\n * ```\n *\n * @example With reactive forms\n * ```html\n * <com-checkbox formControlName=\"acceptTerms\">\n * I accept the <a href=\"/terms\">terms and conditions</a>\n * </com-checkbox>\n * ```\n *\n * @example Indeterminate state\n * ```html\n * <com-checkbox [(indeterminate)]=\"hasPartialSelection\" (changed)=\"onSelectAll($event)\">\n * Select all\n * </com-checkbox>\n * ```\n *\n * @example Variants and sizes\n * ```html\n * <com-checkbox variant=\"accent\" size=\"lg\">Large accent checkbox</com-checkbox>\n * <com-checkbox variant=\"warn\" size=\"sm\">Small warning checkbox</com-checkbox>\n * ```\n */\n@Component({\n selector: 'com-checkbox',\n exportAs: 'comCheckbox',\n template: `\n <label\n class=\"group relative inline-flex items-center\"\n [class.cursor-pointer]=\"!disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n >\n <span><input\n #inputElement\n type=\"checkbox\"\n class=\"peer sr-only\"\n [id]=\"inputId()\"\n [checked]=\"checked()\"\n [disabled]=\"disabled()\"\n [attr.name]=\"name()\"\n [attr.value]=\"htmlValue()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledby()\"\n [attr.aria-describedby]=\"ariaDescribedby()\"\n (change)=\"onInputChange($event)\"\n (blur)=\"onBlur()\"\n /></span>\n <span [class]=\"boxClasses()\">\n @if (checked() && !indeterminate()) {\n <svg\n class=\"pointer-events-none\"\n [class]=\"iconSizeClass()\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <polyline points=\"4 12 9 17 20 6\" />\n </svg>\n }\n @if (indeterminate()) {\n <svg\n class=\"pointer-events-none\"\n [class]=\"iconSizeClass()\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n }\n </span>\n <span\n class=\"com-checkbox__label select-none peer-disabled:cursor-not-allowed peer-disabled:text-disabled-foreground\"\n [class]=\"labelSizeClass()\"\n >\n <ng-content />\n </span>\n </label>\n `,\n styles: `\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'com-checkbox inline-block align-middle',\n '[class.com-checkbox--disabled]': 'disabled()',\n '[class.com-checkbox--checked]': 'checked()',\n '[class.com-checkbox--indeterminate]': 'indeterminate()',\n },\n})\nexport class ComCheckbox implements ControlValueAccessor {\n /** Optional NgControl for reactive forms integration. */\n readonly ngControl: NgControl | null = inject(NgControl, { optional: true, self: true });\n\n /** Reference to the native input element. */\n readonly inputRef: Signal<ElementRef<HTMLInputElement> | undefined> =\n viewChild<ElementRef<HTMLInputElement>>('inputElement');\n\n /** Unique ID for this checkbox instance. */\n private readonly uniqueId: string = `com-checkbox-${nextId++}`;\n\n // Inputs\n readonly size: InputSignal<CheckboxSize> = input<CheckboxSize>('md');\n readonly variant: InputSignal<CheckboxVariant> = input<CheckboxVariant>('primary');\n readonly checked: ModelSignal<boolean> = model<boolean>(false);\n readonly indeterminate: ModelSignal<boolean> = model<boolean>(false);\n readonly disabled: ModelSignal<boolean> = model<boolean>(false);\n readonly htmlValue: InputSignal<string | undefined> = input<string | undefined>(undefined, { alias: 'value' });\n readonly name: InputSignal<string | undefined> = input<string>();\n\n // Signal Forms inputs — set automatically by [formField] via setInputOnDirectives\n readonly touched: ModelSignal<boolean> = model<boolean>(false);\n readonly invalid: InputSignal<boolean> = input<boolean>(false);\n readonly sfErrors: InputSignal<readonly unknown[]> = input<readonly unknown[]>([], { alias: 'errors' });\n readonly sfRequired: InputSignal<boolean> = input<boolean>(false, { alias: 'required' });\n readonly id: InputSignal<string | undefined> = input<string>();\n readonly ariaLabel: InputSignal<string | null> = input<string | null>(null, { alias: 'aria-label' });\n readonly ariaLabelledby: InputSignal<string | null> = input<string | null>(null, { alias: 'aria-labelledby' });\n readonly ariaDescribedby: InputSignal<string | null> = input<string | null>(null, { alias: 'aria-describedby' });\n\n // Outputs\n readonly changed: OutputEmitterRef<CheckboxChange> = output<CheckboxChange>();\n\n // Computed state\n readonly inputId: Signal<string> = computed(() => this.id() ?? this.uniqueId);\n\n protected readonly boxClasses: Signal<string> = computed(() =>\n checkboxBoxVariants({ variant: this.variant(), size: this.size() })\n );\n\n protected readonly iconSizeClass: Signal<string> = computed(() => CHECKBOX_ICON_SIZES[this.size()]);\n protected readonly labelSizeClass: Signal<string> = computed(() => CHECKBOX_LABEL_SIZES[this.size()]);\n\n // CVA callbacks\n private onChange: (value: boolean) => void = () => {};\n protected onTouched: () => void = () => {};\n\n constructor() {\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n\n // Sync indeterminate state to DOM (needed because [indeterminate] is a property, not attribute)\n effect(() => {\n const isIndeterminate = this.indeterminate();\n const inputEl = this.inputRef()?.nativeElement;\n if (inputEl) {\n inputEl.indeterminate = isIndeterminate;\n }\n });\n }\n\n // ControlValueAccessor implementation\n writeValue(value: boolean): void {\n this.checked.set(value ?? false);\n }\n\n registerOnChange(fn: (value: boolean) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled.set(isDisabled);\n }\n\n // Event handlers\n protected onBlur(): void {\n this.onTouched();\n this.touched.set(true);\n }\n\n protected onInputChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n const newChecked = input.checked;\n\n // Clear indeterminate on user interaction\n if (this.indeterminate()) {\n this.indeterminate.set(false);\n input.indeterminate = false;\n }\n\n this.checked.set(newChecked);\n this.onChange(newChecked);\n this.changed.emit({ checked: newChecked, source: this });\n }\n\n // Public API\n /** Focuses this checkbox's input element. */\n focus(): void {\n this.inputRef()?.nativeElement.focus();\n }\n\n /** Toggles the checkbox state programmatically. */\n toggle(): void {\n if (this.disabled()) {\n return;\n }\n\n const newChecked = !this.checked();\n this.checked.set(newChecked);\n this.indeterminate.set(false);\n this.onChange(newChecked);\n this.changed.emit({ checked: newChecked, source: this });\n }\n}\n","// Public API for the checkbox component\n\n// Main component\nexport { ComCheckbox } from './checkbox.component';\n\n// Types\nexport type { CheckboxChange } from './checkbox.component';\n\n// Variants (for advanced customization)\nexport {\n checkboxBoxVariants,\n CHECKBOX_ICON_SIZES,\n CHECKBOX_LABEL_SIZES,\n} from './checkbox.variants';\n\nexport type { CheckboxSize, CheckboxVariant } from './checkbox.variants';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -55,7 +55,7 @@ const codeBlockVariants = cva([
55
55
  * <com-code-block [code]="htmlSnippet" language="HTML" variant="outlined" />
56
56
  * ```
57
57
  */
58
- class ComCodeBlockComponent {
58
+ class ComCodeBlock {
59
59
  /** The raw code string to display. */
60
60
  code = input.required(...(ngDevMode ? [{ debugName: "code" }] : []));
61
61
  /** Language label shown in the header (e.g. 'TypeScript', 'HTML'). */
@@ -82,8 +82,8 @@ class ComCodeBlockComponent {
82
82
  this.copyTimeoutId = setTimeout(() => this.isCopied.set(false), 2000);
83
83
  this.destroyRef.onDestroy(() => clearTimeout(this.copyTimeoutId));
84
84
  }
85
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComCodeBlockComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
86
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ComCodeBlockComponent, isStandalone: true, selector: "com-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 }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { copied: "copied" }, host: { properties: { "class": "hostClasses()" } }, exportAs: ["comCodeBlock"], ngImport: i0, template: `
85
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComCodeBlock, deps: [], target: i0.ɵɵFactoryTarget.Component });
86
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ComCodeBlock, isStandalone: true, selector: "com-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 }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { copied: "copied" }, host: { properties: { "class": "hostClasses()" } }, exportAs: ["comCodeBlock"], ngImport: i0, template: `
87
87
  <div class="flex items-center justify-between px-4 py-2 border-b border-border-subtle text-xs text-muted-foreground">
88
88
  @if (language()) {
89
89
  <span class="select-none font-sans font-medium">{{ language() }}</span>
@@ -92,7 +92,7 @@ class ComCodeBlockComponent {
92
92
  }
93
93
  <button
94
94
  type="button"
95
- class="inline-flex items-center justify-center rounded-md p-1
95
+ class="inline-flex items-center justify-center rounded-interactive-sm p-1
96
96
  text-muted-foreground hover:text-foreground hover:bg-muted-hover
97
97
  transition-colors outline-none
98
98
  focus-visible:outline-2 focus-visible:outline-offset-2
@@ -107,14 +107,14 @@ class ComCodeBlockComponent {
107
107
  }
108
108
  </button>
109
109
  </div>
110
- <pre class="overflow-auto p-4 m-0 flex-1"><code class="whitespace-pre font-mono">{{ code() }}</code></pre>
110
+ <pre class="overflow-auto p-4 m-0 flex-1" tabindex="0" role="region" [attr.aria-label]="language() ? language() + ' code' : 'Code'"><code class="whitespace-pre font-mono">{{ code() }}</code></pre>
111
111
  <span
112
112
  class="sr-only"
113
113
  aria-live="polite"
114
114
  >{{ isCopied() ? 'Copied to clipboard' : '' }}</span>
115
115
  `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "component", type: ComIcon, selector: "com-icon", inputs: ["name", "img", "color", "size", "strokeWidth", "absoluteStrokeWidth", "ariaLabel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
116
116
  }
117
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComCodeBlockComponent, decorators: [{
117
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComCodeBlock, decorators: [{
118
118
  type: Component,
119
119
  args: [{ selector: 'com-code-block', exportAs: 'comCodeBlock', host: {
120
120
  '[class]': 'hostClasses()',
@@ -127,7 +127,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
127
127
  }
128
128
  <button
129
129
  type="button"
130
- class="inline-flex items-center justify-center rounded-md p-1
130
+ class="inline-flex items-center justify-center rounded-interactive-sm p-1
131
131
  text-muted-foreground hover:text-foreground hover:bg-muted-hover
132
132
  transition-colors outline-none
133
133
  focus-visible:outline-2 focus-visible:outline-offset-2
@@ -142,7 +142,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
142
142
  }
143
143
  </button>
144
144
  </div>
145
- <pre class="overflow-auto p-4 m-0 flex-1"><code class="whitespace-pre font-mono">{{ code() }}</code></pre>
145
+ <pre class="overflow-auto p-4 m-0 flex-1" tabindex="0" role="region" [attr.aria-label]="language() ? language() + ' code' : 'Code'"><code class="whitespace-pre font-mono">{{ code() }}</code></pre>
146
146
  <span
147
147
  class="sr-only"
148
148
  aria-live="polite"
@@ -154,5 +154,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
154
154
  * Generated bundle index. Do not edit.
155
155
  */
156
156
 
157
- export { ComCodeBlockComponent, codeBlockVariants };
157
+ export { ComCodeBlock, codeBlockVariants };
158
158
  //# sourceMappingURL=ngx-com-components-code-block.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-com-components-code-block.mjs","sources":["../../../projects/com/components/code-block/code-block.variants.ts","../../../projects/com/components/code-block/code-block.component.ts","../../../projects/com/components/code-block/ngx-com-components-code-block.ts"],"sourcesContent":["import { cva } from 'class-variance-authority';\nimport type { VariantProps } from 'class-variance-authority';\n\nexport type CodeBlockVariant = 'filled' | 'outlined';\n\n/**\n * CVA variants for the code block container.\n *\n * @tokens `--color-muted`, `--color-foreground`,\n * `--color-border`, `--color-border-subtle`,\n * `--radius-card`, `--font-mono`\n */\nexport const codeBlockVariants: (props?: {\n variant?: CodeBlockVariant;\n}) => string = cva(\n [\n 'relative',\n 'flex',\n 'flex-col',\n 'rounded-card',\n 'overflow-hidden',\n 'font-mono',\n 'text-sm',\n ],\n {\n variants: {\n variant: {\n filled: 'bg-muted text-foreground border border-border-subtle',\n outlined: 'bg-transparent text-foreground border border-border',\n },\n },\n defaultVariants: {\n variant: 'filled',\n },\n },\n);\n\nexport type CodeBlockVariants = VariantProps<typeof codeBlockVariants>;\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n inject,\n input,\n output,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport type {\n InputSignal,\n OutputEmitterRef,\n Signal,\n WritableSignal,\n} from '@angular/core';\nimport { Clipboard } from '@angular/cdk/clipboard';\nimport { ComIcon } from 'ngx-com/components/icon';\nimport { mergeClasses } from 'ngx-com/utils';\nimport { codeBlockVariants } from './code-block.variants';\nimport type { CodeBlockVariant } from './code-block.variants';\n\n/**\n * Code block component for displaying code snippets with a language label\n * and copy-to-clipboard functionality.\n *\n * Renders plain monospace text in a styled container — no syntax highlighting.\n * The header bar shows an optional language label and a copy button that\n * provides visual feedback (checkmark icon for 2 seconds) after copying.\n *\n * @tokens `--color-muted`, `--color-muted-foreground`, `--color-muted-hover`,\n * `--color-foreground`, `--color-border`, `--color-border-subtle`,\n * `--color-ring`, `--color-success`,\n * `--font-mono`, `--radius-card`\n *\n * @example Basic usage with language label\n * ```html\n * <com-code-block code=\"const x = 42;\" language=\"TypeScript\" />\n * ```\n *\n * @example Outlined variant\n * ```html\n * <com-code-block [code]=\"htmlSnippet\" language=\"HTML\" variant=\"outlined\" />\n * ```\n */\n@Component({\n selector: 'com-code-block',\n exportAs: 'comCodeBlock',\n host: {\n '[class]': 'hostClasses()',\n },\n template: `\n <div class=\"flex items-center justify-between px-4 py-2 border-b border-border-subtle text-xs text-muted-foreground\">\n @if (language()) {\n <span class=\"select-none font-sans font-medium\">{{ language() }}</span>\n } @else {\n <span></span>\n }\n <button\n type=\"button\"\n class=\"inline-flex items-center justify-center rounded-md p-1\n text-muted-foreground hover:text-foreground hover:bg-muted-hover\n transition-colors outline-none\n focus-visible:outline-2 focus-visible:outline-offset-2\n focus-visible:outline-[--color-ring]\"\n [attr.aria-label]=\"isCopied() ? 'Copied' : 'Copy code'\"\n \t(click)=\"copyToClipboard()\"\n >\n @if (isCopied()) {\n <com-icon name=\"check\" size=\"sm\" class=\"text-success\" aria-hidden=\"true\" />\n } @else {\n <com-icon name=\"clipboard\" size=\"sm\" aria-hidden=\"true\" />\n }\n </button>\n </div>\n <pre class=\"overflow-auto p-4 m-0 flex-1\"><code class=\"whitespace-pre font-mono\">{{ code() }}</code></pre>\n <span\n class=\"sr-only\"\n aria-live=\"polite\"\n >{{ isCopied() ? 'Copied to clipboard' : '' }}</span>\n `,\n styles: `\n :host {\n display: block;\n }\n `,\n imports: [ComIcon],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class ComCodeBlockComponent {\n /** The raw code string to display. */\n readonly code: InputSignal<string> = input.required<string>();\n\n /** Language label shown in the header (e.g. 'TypeScript', 'HTML'). */\n readonly language: InputSignal<string | undefined> = input<string>();\n\n /** Visual variant. */\n readonly variant: InputSignal<CodeBlockVariant> = input<CodeBlockVariant>('filled');\n\n /** Consumer CSS classes — merged with variant classes. */\n readonly userClass: InputSignal<string> = input<string>('', { alias: 'class' });\n\n /** Emitted when code is successfully copied to clipboard. */\n readonly copied: OutputEmitterRef<void> = output<void>();\n\n /** @internal Tracks copy feedback state. */\n protected readonly isCopied: WritableSignal<boolean> = signal(false);\n\n /** @internal Computed host element classes. */\n protected readonly hostClasses: Signal<string> = computed(() =>\n mergeClasses(\n codeBlockVariants({ variant: this.variant() }),\n this.userClass(),\n ),\n );\n\n private readonly clipboard = inject(Clipboard);\n private readonly destroyRef = inject(DestroyRef);\n private copyTimeoutId: ReturnType<typeof setTimeout> | undefined;\n\n /** Copies the code to clipboard and shows feedback for 2 seconds. */\n protected copyToClipboard(): void {\n this.clipboard.copy(this.code());\n this.isCopied.set(true);\n this.copied.emit();\n\n clearTimeout(this.copyTimeoutId);\n this.copyTimeoutId = setTimeout(() => this.isCopied.set(false), 2000);\n\n this.destroyRef.onDestroy(() => clearTimeout(this.copyTimeoutId));\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":"ngx-com-components-code-block.mjs","sources":["../../../projects/com/components/code-block/code-block.variants.ts","../../../projects/com/components/code-block/code-block.component.ts","../../../projects/com/components/code-block/ngx-com-components-code-block.ts"],"sourcesContent":["import { cva } from 'class-variance-authority';\nimport type { VariantProps } from 'class-variance-authority';\n\nexport type CodeBlockVariant = 'filled' | 'outlined';\n\n/**\n * CVA variants for the code block container.\n *\n * @tokens `--color-muted`, `--color-foreground`,\n * `--color-border`, `--color-border-subtle`,\n * `--radius-card`, `--font-mono`\n */\nexport const codeBlockVariants: (props?: {\n variant?: CodeBlockVariant;\n}) => string = cva(\n [\n 'relative',\n 'flex',\n 'flex-col',\n 'rounded-card',\n 'overflow-hidden',\n 'font-mono',\n 'text-sm',\n ],\n {\n variants: {\n variant: {\n filled: 'bg-muted text-foreground border border-border-subtle',\n outlined: 'bg-transparent text-foreground border border-border',\n },\n },\n defaultVariants: {\n variant: 'filled',\n },\n },\n);\n\nexport type CodeBlockVariants = VariantProps<typeof codeBlockVariants>;\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n inject,\n input,\n output,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport type {\n InputSignal,\n OutputEmitterRef,\n Signal,\n WritableSignal,\n} from '@angular/core';\nimport { Clipboard } from '@angular/cdk/clipboard';\nimport { ComIcon } from 'ngx-com/components/icon';\nimport { mergeClasses } from 'ngx-com/utils';\nimport { codeBlockVariants } from './code-block.variants';\nimport type { CodeBlockVariant } from './code-block.variants';\n\n/**\n * Code block component for displaying code snippets with a language label\n * and copy-to-clipboard functionality.\n *\n * Renders plain monospace text in a styled container — no syntax highlighting.\n * The header bar shows an optional language label and a copy button that\n * provides visual feedback (checkmark icon for 2 seconds) after copying.\n *\n * @tokens `--color-muted`, `--color-muted-foreground`, `--color-muted-hover`,\n * `--color-foreground`, `--color-border`, `--color-border-subtle`,\n * `--color-ring`, `--color-success`,\n * `--font-mono`, `--radius-card`\n *\n * @example Basic usage with language label\n * ```html\n * <com-code-block code=\"const x = 42;\" language=\"TypeScript\" />\n * ```\n *\n * @example Outlined variant\n * ```html\n * <com-code-block [code]=\"htmlSnippet\" language=\"HTML\" variant=\"outlined\" />\n * ```\n */\n@Component({\n selector: 'com-code-block',\n exportAs: 'comCodeBlock',\n host: {\n '[class]': 'hostClasses()',\n },\n template: `\n <div class=\"flex items-center justify-between px-4 py-2 border-b border-border-subtle text-xs text-muted-foreground\">\n @if (language()) {\n <span class=\"select-none font-sans font-medium\">{{ language() }}</span>\n } @else {\n <span></span>\n }\n <button\n type=\"button\"\n class=\"inline-flex items-center justify-center rounded-interactive-sm p-1\n text-muted-foreground hover:text-foreground hover:bg-muted-hover\n transition-colors outline-none\n focus-visible:outline-2 focus-visible:outline-offset-2\n focus-visible:outline-[--color-ring]\"\n [attr.aria-label]=\"isCopied() ? 'Copied' : 'Copy code'\"\n \t(click)=\"copyToClipboard()\"\n >\n @if (isCopied()) {\n <com-icon name=\"check\" size=\"sm\" class=\"text-success\" aria-hidden=\"true\" />\n } @else {\n <com-icon name=\"clipboard\" size=\"sm\" aria-hidden=\"true\" />\n }\n </button>\n </div>\n <pre class=\"overflow-auto p-4 m-0 flex-1\" tabindex=\"0\" role=\"region\" [attr.aria-label]=\"language() ? language() + ' code' : 'Code'\"><code class=\"whitespace-pre font-mono\">{{ code() }}</code></pre>\n <span\n class=\"sr-only\"\n aria-live=\"polite\"\n >{{ isCopied() ? 'Copied to clipboard' : '' }}</span>\n `,\n styles: `\n :host {\n display: block;\n }\n `,\n imports: [ComIcon],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class ComCodeBlock {\n /** The raw code string to display. */\n readonly code: InputSignal<string> = input.required<string>();\n\n /** Language label shown in the header (e.g. 'TypeScript', 'HTML'). */\n readonly language: InputSignal<string | undefined> = input<string>();\n\n /** Visual variant. */\n readonly variant: InputSignal<CodeBlockVariant> = input<CodeBlockVariant>('filled');\n\n /** Consumer CSS classes — merged with variant classes. */\n readonly userClass: InputSignal<string> = input<string>('', { alias: 'class' });\n\n /** Emitted when code is successfully copied to clipboard. */\n readonly copied: OutputEmitterRef<void> = output<void>();\n\n /** @internal Tracks copy feedback state. */\n protected readonly isCopied: WritableSignal<boolean> = signal(false);\n\n /** @internal Computed host element classes. */\n protected readonly hostClasses: Signal<string> = computed(() =>\n mergeClasses(\n codeBlockVariants({ variant: this.variant() }),\n this.userClass(),\n ),\n );\n\n private readonly clipboard = inject(Clipboard);\n private readonly destroyRef = inject(DestroyRef);\n private copyTimeoutId: ReturnType<typeof setTimeout> | undefined;\n\n /** Copies the code to clipboard and shows feedback for 2 seconds. */\n protected copyToClipboard(): void {\n this.clipboard.copy(this.code());\n this.isCopied.set(true);\n this.copied.emit();\n\n clearTimeout(this.copyTimeoutId);\n this.copyTimeoutId = setTimeout(() => this.isCopied.set(false), 2000);\n\n this.destroyRef.onDestroy(() => clearTimeout(this.copyTimeoutId));\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { cva } from 'class-variance-authority';
2
2
  import * as i0 from '@angular/core';
3
- import { inject, TemplateRef, Directive, model, input, booleanAttribute, computed, contentChild, ChangeDetectionStrategy, Component, signal, effect } from '@angular/core';
3
+ import { inject, TemplateRef, Directive, model, input, booleanAttribute, computed, contentChild, ChangeDetectionStrategy, Component, linkedSignal } from '@angular/core';
4
4
  import { mergeClasses } from 'ngx-com/utils';
5
5
  import { NgTemplateOutlet } from '@angular/common';
6
6
 
@@ -40,7 +40,7 @@ const collapsibleTriggerVariants = cva([
40
40
  'transition-colors',
41
41
  'focus-visible:outline-[1px] focus-visible:outline-offset-2 focus-visible:outline-ring',
42
42
  'disabled:pointer-events-none disabled:text-disabled-foreground',
43
- '[&>svg]:transition-transform [&>svg]:duration-200',
43
+ '[&>svg]:transition-transform [&>svg]:duration-slow',
44
44
  '[&>svg.com-collapsible-icon]:data-[state=open]:rotate-180',
45
45
  ].join(' '), {
46
46
  variants: {
@@ -66,6 +66,8 @@ const collapsibleTriggerVariants = cva([
66
66
  * Directive to mark a template as the custom trigger layout template.
67
67
  * Replaces the inner content of the trigger while preserving ARIA and keyboard handling.
68
68
  *
69
+ * @tokens none
70
+ *
69
71
  * @example
70
72
  * ```html
71
73
  * <button comCollapsibleTrigger>
@@ -106,6 +108,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
106
108
  * Wraps the content with custom chrome (headers, footers, padding).
107
109
  * The grid animation still applies on the host.
108
110
  *
111
+ * @tokens none
112
+ *
109
113
  * @example
110
114
  * ```html
111
115
  * <com-collapsible-content>
@@ -147,6 +151,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
147
151
  * Directive to mark a template as the custom icon template.
148
152
  * Replaces only the chevron icon inside the default trigger layout.
149
153
  *
154
+ * @tokens none
155
+ *
150
156
  * @example
151
157
  * ```html
152
158
  * <button comCollapsibleTrigger>
@@ -181,6 +187,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
181
187
  * Structural directive for lazy content rendering.
182
188
  * Content is only instantiated on first expand, preserving state on subsequent toggles.
183
189
  *
190
+ * @tokens none
191
+ *
184
192
  * @example
185
193
  * ```html
186
194
  * <com-collapsible-content>
@@ -409,7 +417,7 @@ class ComCollapsibleTrigger {
409
417
  />
410
418
  } @else {
411
419
  <svg
412
- class="com-collapsible-icon h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-200"
420
+ class="com-collapsible-icon h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-slow"
413
421
  [attr.data-state]="collapsible.isOpen() ? 'open' : 'closed'"
414
422
  viewBox="0 0 24 24"
415
423
  fill="none"
@@ -445,7 +453,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
445
453
  />
446
454
  } @else {
447
455
  <svg
448
- class="com-collapsible-icon h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-200"
456
+ class="com-collapsible-icon h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-slow"
449
457
  [attr.data-state]="collapsible.isOpen() ? 'open' : 'closed'"
450
458
  viewBox="0 0 24 24"
451
459
  fill="none"
@@ -525,7 +533,8 @@ class ComCollapsibleContent {
525
533
  /** Lazy content template. */
526
534
  lazyTpl = contentChild(ComCollapsibleLazy, ...(ngDevMode ? [{ debugName: "lazyTpl" }] : []));
527
535
  /** Track if collapsible has ever been opened (for lazy rendering). */
528
- hasBeenOpened = signal(false, ...(ngDevMode ? [{ debugName: "hasBeenOpened" }] : []));
536
+ hasBeenOpened = linkedSignal({ ...(ngDevMode ? { debugName: "hasBeenOpened" } : {}), source: () => this.collapsible.isOpen(),
537
+ computation: (isOpen, previous) => isOpen || (previous?.value ?? false) });
529
538
  // ============ INPUTS ============
530
539
  /** Transition duration in milliseconds. */
531
540
  duration = input(200, ...(ngDevMode ? [{ debugName: "duration" }] : []));
@@ -539,14 +548,7 @@ class ComCollapsibleContent {
539
548
  $implicit: this.collapsible.isOpen(),
540
549
  open: this.collapsible.isOpen(),
541
550
  }), ...(ngDevMode ? [{ debugName: "templateContext" }] : []));
542
- constructor() {
543
- // Track first open for lazy rendering
544
- effect(() => {
545
- if (this.collapsible.isOpen() && !this.hasBeenOpened()) {
546
- this.hasBeenOpened.set(true);
547
- }
548
- });
549
- }
551
+ constructor() { }
550
552
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComCollapsibleContent, deps: [], target: i0.ɵɵFactoryTarget.Component });
551
553
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ComCollapsibleContent, isStandalone: true, selector: "com-collapsible-content", inputs: { duration: { classPropertyName: "duration", publicName: "duration", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.--duration.ms": "duration()", "attr.id": "collapsible.contentId", "attr.role": "\"region\"", "attr.aria-labelledby": "collapsible.triggerId", "attr.data-state": "collapsible.isOpen() ? \"open\" : \"closed\"", "attr.inert": "!collapsible.isOpen() || null" }, classAttribute: "com-collapsible-content" }, queries: [{ propertyName: "contentTpl", first: true, predicate: ComCollapsibleContentTpl, descendants: true, isSignal: true }, { propertyName: "lazyTpl", first: true, predicate: ComCollapsibleLazy, descendants: true, isSignal: true }], ngImport: i0, template: `
552
554
  @if (contentTpl()) {
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-com-components-collapsible.mjs","sources":["../../../projects/com/components/collapsible/collapsible.variants.ts","../../../projects/com/components/collapsible/collapsible-trigger.variants.ts","../../../projects/com/components/collapsible/directives/collapsible-trigger-tpl.directive.ts","../../../projects/com/components/collapsible/directives/collapsible-content-tpl.directive.ts","../../../projects/com/components/collapsible/directives/collapsible-icon-tpl.directive.ts","../../../projects/com/components/collapsible/directives/collapsible-lazy.directive.ts","../../../projects/com/components/collapsible/collapsible.utils.ts","../../../projects/com/components/collapsible/collapsible.directive.ts","../../../projects/com/components/collapsible/collapsible-trigger.component.ts","../../../projects/com/components/collapsible/collapsible-content.component.ts","../../../projects/com/components/collapsible/index.ts","../../../projects/com/components/collapsible/ngx-com-components-collapsible.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\n\n/**\n * Shell variant type for the collapsible container.\n */\nexport type CollapsibleVariant = 'card' | 'bordered' | 'flush' | 'ghost' | 'unstyled';\n\n/**\n * CVA variants for the collapsible shell (root directive).\n *\n * @tokens `--color-border`, `--color-background`, `--color-foreground`, `--shadow-xs`, `--radius-collapsible`\n */\nexport const collapsibleVariants: (props?: {\n variant?: CollapsibleVariant;\n}) => string = cva(\n // Base — structural only\n 'com-collapsible block',\n {\n variants: {\n variant: {\n card: 'rounded-collapsible border border-border bg-background text-foreground shadow-xs',\n bordered: 'rounded-collapsible border border-border',\n flush: 'border-b border-border',\n ghost: '',\n unstyled: '',\n },\n },\n defaultVariants: {\n variant: 'ghost',\n },\n }\n);\n\nexport type CollapsibleVariants = VariantProps<typeof collapsibleVariants>;\n","import { cva, type VariantProps } from 'class-variance-authority';\n\n/**\n * Trigger variant type for the collapsible trigger.\n */\nexport type CollapsibleTriggerVariant = 'ghost' | 'filled' | 'header' | 'unstyled';\n\n/**\n * Trigger size type.\n */\nexport type CollapsibleTriggerSize = 'sm' | 'default' | 'lg';\n\n/**\n * CVA variants for the collapsible trigger directive.\n *\n * @tokens `--color-foreground`, `--color-muted`, `--color-muted-foreground`, `--color-muted-hover`,\n * `--color-ring`, `--color-disabled-foreground`, `--radius-collapsible`\n */\nexport const collapsibleTriggerVariants: (props?: {\n variant?: CollapsibleTriggerVariant;\n size?: CollapsibleTriggerSize;\n}) => string = cva(\n [\n 'com-collapsible-trigger',\n 'flex w-full items-center justify-between',\n 'cursor-pointer select-none',\n 'text-sm font-medium',\n 'transition-colors',\n 'focus-visible:outline-[1px] focus-visible:outline-offset-2 focus-visible:outline-ring',\n 'disabled:pointer-events-none disabled:text-disabled-foreground',\n '[&>svg]:transition-transform [&>svg]:duration-200',\n '[&>svg.com-collapsible-icon]:data-[state=open]:rotate-180',\n ].join(' '),\n {\n variants: {\n variant: {\n ghost: 'rounded-collapsible text-foreground hover:bg-muted hover:text-muted-foreground',\n filled: 'rounded-collapsible bg-muted text-muted-foreground hover:bg-muted-hover',\n header: 'text-foreground hover:text-muted-foreground',\n unstyled: '',\n },\n size: {\n sm: 'px-2 py-1 text-xs gap-1',\n default: 'px-3 py-2 text-sm gap-2',\n lg: 'px-4 py-3 text-base gap-3',\n },\n },\n defaultVariants: {\n variant: 'ghost',\n size: 'default',\n },\n }\n);\n\nexport type CollapsibleTriggerVariants = VariantProps<typeof collapsibleTriggerVariants>;\n","import { Directive, TemplateRef, inject } from '@angular/core';\nimport type { ComCollapsibleTriggerContext } from '../collapsible.models';\n\n/**\n * Directive to mark a template as the custom trigger layout template.\n * Replaces the inner content of the trigger while preserving ARIA and keyboard handling.\n *\n * @example\n * ```html\n * <button comCollapsibleTrigger>\n * <ng-template comCollapsibleTriggerTpl let-open let-toggle=\"toggle\" let-disabled=\"disabled\">\n * <div class=\"flex items-center gap-3 w-full\">\n * <span class=\"h-2 w-2 rounded-full\" [class]=\"open ? 'bg-success' : 'bg-muted'\"></span>\n * <span class=\"font-medium\">Notifications</span>\n * <svg class=\"com-collapsible-icon h-4 w-4\" [attr.data-state]=\"open ? 'open' : 'closed'\">\n * <!-- chevron icon -->\n * </svg>\n * </div>\n * </ng-template>\n * </button>\n * ```\n */\n@Directive({\n selector: 'ng-template[comCollapsibleTriggerTpl]',\n})\nexport class ComCollapsibleTriggerTpl {\n /** Reference to the template. */\n readonly templateRef: TemplateRef<ComCollapsibleTriggerContext> =\n inject<TemplateRef<ComCollapsibleTriggerContext>>(TemplateRef);\n\n /**\n * Static type guard for template type checking.\n * Enables type-safe access to context properties in templates.\n */\n static ngTemplateContextGuard(\n _dir: ComCollapsibleTriggerTpl,\n ctx: unknown\n ): ctx is ComCollapsibleTriggerContext {\n return true;\n }\n}\n","import { Directive, TemplateRef, inject } from '@angular/core';\nimport type { ComCollapsibleContentContext } from '../collapsible.models';\n\n/**\n * Directive to mark a template as the custom content chrome template.\n * Wraps the content with custom chrome (headers, footers, padding).\n * The grid animation still applies on the host.\n *\n * @example\n * ```html\n * <com-collapsible-content>\n * <ng-template comCollapsibleContentTpl let-open=\"open\">\n * <div class=\"border-t border-border\">\n * <div class=\"p-4 space-y-3\">\n * <!-- Content here -->\n * </div>\n * <div class=\"flex justify-end gap-2 px-4 py-3 border-t border-border-subtle bg-muted\">\n * <button>Reset</button>\n * <button>Apply</button>\n * </div>\n * </div>\n * </ng-template>\n * </com-collapsible-content>\n * ```\n */\n@Directive({\n selector: 'ng-template[comCollapsibleContentTpl]',\n})\nexport class ComCollapsibleContentTpl {\n /** Reference to the template. */\n readonly templateRef: TemplateRef<ComCollapsibleContentContext> =\n inject<TemplateRef<ComCollapsibleContentContext>>(TemplateRef);\n\n /**\n * Static type guard for template type checking.\n * Enables type-safe access to context properties in templates.\n */\n static ngTemplateContextGuard(\n _dir: ComCollapsibleContentTpl,\n ctx: unknown\n ): ctx is ComCollapsibleContentContext {\n return true;\n }\n}\n","import { Directive, TemplateRef, inject } from '@angular/core';\nimport type { ComCollapsibleIconContext } from '../collapsible.models';\n\n/**\n * Directive to mark a template as the custom icon template.\n * Replaces only the chevron icon inside the default trigger layout.\n *\n * @example\n * ```html\n * <button comCollapsibleTrigger>\n * Settings\n * <ng-template comCollapsibleIcon let-open=\"open\">\n * <span class=\"text-muted-foreground text-xs\">{{ open ? '▲' : '▼' }}</span>\n * </ng-template>\n * </button>\n * ```\n */\n@Directive({\n selector: 'ng-template[comCollapsibleIcon]',\n})\nexport class ComCollapsibleIconTpl {\n /** Reference to the template. */\n readonly templateRef: TemplateRef<ComCollapsibleIconContext> =\n inject<TemplateRef<ComCollapsibleIconContext>>(TemplateRef);\n\n /**\n * Static type guard for template type checking.\n * Enables type-safe access to context properties in templates.\n */\n static ngTemplateContextGuard(\n _dir: ComCollapsibleIconTpl,\n ctx: unknown\n ): ctx is ComCollapsibleIconContext {\n return true;\n }\n}\n","import { Directive, TemplateRef, inject } from '@angular/core';\n\n/**\n * Structural directive for lazy content rendering.\n * Content is only instantiated on first expand, preserving state on subsequent toggles.\n *\n * @example\n * ```html\n * <com-collapsible-content>\n * <ng-template comCollapsibleLazy>\n * <app-heavy-chart [data]=\"chartData()\" />\n * </ng-template>\n * </com-collapsible-content>\n * ```\n */\n@Directive({\n selector: 'ng-template[comCollapsibleLazy]',\n})\nexport class ComCollapsibleLazy {\n /** Reference to the template. */\n readonly templateRef: TemplateRef<void> = inject<TemplateRef<void>>(TemplateRef);\n}\n","export { mergeClasses } from 'ngx-com/utils';\n\nlet collapsibleIdCounter = 0;\n\n/**\n * Generates a unique ID for collapsible components.\n * @returns A unique string ID\n */\nexport function generateCollapsibleId(): string {\n return `com-collapsible-${++collapsibleIdCounter}`;\n}\n","import {\n booleanAttribute,\n computed,\n Directive,\n input,\n model,\n} from '@angular/core';\nimport type { InputSignal, InputSignalWithTransform, ModelSignal, Signal } from '@angular/core';\nimport { mergeClasses, generateCollapsibleId } from './collapsible.utils';\nimport { collapsibleVariants } from './collapsible.variants';\nimport type { CollapsibleVariant } from './collapsible.variants';\n\n/**\n * Root collapsible directive — manages state and provides shell styling.\n *\n * Works as a DI anchor for child directives (trigger, content).\n * Exposes programmatic control via template reference.\n *\n * @tokens `--color-border`, `--color-background`, `--color-foreground`, `--shadow-xs`\n *\n * @example Basic usage\n * ```html\n * <div comCollapsible variant=\"card\">\n * <button comCollapsibleTrigger>Section Title</button>\n * <com-collapsible-content>\n * <div class=\"p-4\">Content here.</div>\n * </com-collapsible-content>\n * </div>\n * ```\n *\n * @example Two-way binding with external control\n * ```html\n * <div comCollapsible [(open)]=\"sectionOpen\" #section=\"comCollapsible\">\n * <button comCollapsibleTrigger>Advanced</button>\n * <com-collapsible-content>...</com-collapsible-content>\n * </div>\n * <button (click)=\"section.toggle()\">Toggle externally</button>\n * ```\n */\n@Directive({\n selector: '[comCollapsible]',\n exportAs: 'comCollapsible',\n host: {\n '[class]': 'computedClass()',\n '[attr.data-state]': 'isOpen() ? \"open\" : \"closed\"',\n },\n})\nexport class ComCollapsible {\n /** Unique ID for the collapsible instance. */\n private readonly id: string = generateCollapsibleId();\n\n /** ID for the trigger element (used for aria-labelledby). */\n readonly triggerId: string = `${this.id}-trigger`;\n\n /** ID for the content panel (used for aria-controls). */\n readonly contentId: string = `${this.id}-content`;\n\n // ============ INPUTS ============\n\n /** Two-way bound open state. */\n readonly open: ModelSignal<boolean> = model<boolean>(false);\n\n /** Disables the collapsible, preventing state changes. */\n readonly disabled: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Shell preset variant. */\n readonly variant: InputSignal<CollapsibleVariant> = input<CollapsibleVariant>('ghost');\n\n /** Consumer CSS classes — merged with variant classes. */\n readonly userClass: InputSignal<string> = input<string>('', { alias: 'class' });\n\n // ============ COMPUTED STATE ============\n\n /** @internal Computed host class from CVA + consumer overrides. */\n protected readonly computedClass: Signal<string> = computed(() =>\n mergeClasses(\n collapsibleVariants({ variant: this.variant() }),\n this.userClass()\n )\n );\n\n // ============ PUBLIC API ============\n\n /** Returns the current open state. */\n isOpen(): boolean {\n return this.open();\n }\n\n /** Returns the current disabled state. */\n isDisabled(): boolean {\n return this.disabled();\n }\n\n /** Toggles the open state (if not disabled). */\n toggle(): void {\n if (this.disabled()) return;\n this.open.update((v) => !v);\n }\n\n /** Expands the collapsible (if not disabled). */\n expand(): void {\n if (this.disabled()) return;\n this.open.set(true);\n }\n\n /** Collapses the collapsible (if not disabled). */\n collapse(): void {\n if (this.disabled()) return;\n this.open.set(false);\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n inject,\n input,\n} from '@angular/core';\nimport type { InputSignal, InputSignalWithTransform, Signal } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ComCollapsible } from './collapsible.directive';\nimport { ComCollapsibleTriggerTpl } from './directives/collapsible-trigger-tpl.directive';\nimport { ComCollapsibleIconTpl } from './directives/collapsible-icon-tpl.directive';\nimport { mergeClasses } from './collapsible.utils';\nimport { collapsibleTriggerVariants } from './collapsible-trigger.variants';\nimport type { CollapsibleTriggerVariant, CollapsibleTriggerSize } from './collapsible-trigger.variants';\nimport type { ComCollapsibleTriggerContext, ComCollapsibleIconContext } from './collapsible.models';\n\n/**\n * Collapsible trigger component — handles toggle interaction, ARIA, keyboard, and template rendering.\n *\n * Uses attribute selector so it can be applied to `<button>` or any focusable element.\n * Injects the parent `ComCollapsible` directive to access state.\n * Supports custom trigger layout via `comCollapsibleTriggerTpl` and custom icon via `comCollapsibleIcon`.\n *\n * @tokens `--color-foreground`, `--color-muted`, `--color-muted-foreground`, `--color-muted-hover`,\n * `--color-ring`, `--color-disabled-foreground`\n *\n * @example Default trigger with auto icon\n * ```html\n * <button comCollapsibleTrigger>Section Title</button>\n * ```\n *\n * @example Without icon\n * ```html\n * <button comCollapsibleTrigger [showIcon]=\"false\">Section Title</button>\n * ```\n *\n * @example With custom icon\n * ```html\n * <button comCollapsibleTrigger>\n * Settings\n * <ng-template comCollapsibleIcon let-open=\"open\">\n * <span class=\"text-xs text-muted-foreground\">{{ open ? '▲' : '▼' }}</span>\n * </ng-template>\n * </button>\n * ```\n *\n * @example Full trigger layout override\n * ```html\n * <button comCollapsibleTrigger>\n * <ng-template comCollapsibleTriggerTpl let-open let-toggle=\"toggle\">\n * <div class=\"flex items-center gap-3 w-full\">\n * <span class=\"h-2 w-2 rounded-full\" [class]=\"open ? 'bg-success' : 'bg-muted'\"></span>\n * <span class=\"font-medium\">Notifications</span>\n * <svg class=\"com-collapsible-icon h-4 w-4\" [attr.data-state]=\"open ? 'open' : 'closed'\">\n * <!-- chevron -->\n * </svg>\n * </div>\n * </ng-template>\n * </button>\n * ```\n */\n@Component({\n selector: '[comCollapsibleTrigger]',\n template: `\n @if (triggerTpl()) {\n <ng-container\n [ngTemplateOutlet]=\"triggerTpl()!.templateRef\"\n [ngTemplateOutletContext]=\"triggerContext()\"\n />\n } @else {\n <span class=\"flex-1 truncate text-left\">\n <ng-content />\n </span>\n @if (showIcon()) {\n @if (iconTpl()) {\n <ng-container\n [ngTemplateOutlet]=\"iconTpl()!.templateRef\"\n [ngTemplateOutletContext]=\"iconContext()\"\n />\n } @else {\n <svg\n class=\"com-collapsible-icon h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-200\"\n [attr.data-state]=\"collapsible.isOpen() ? 'open' : 'closed'\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n }\n }\n }\n `,\n styles: `\n :host {\n display: flex;\n }\n `,\n imports: [NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'computedClass()',\n '[attr.id]': 'collapsible.triggerId',\n '[attr.type]': '\"button\"',\n '[attr.aria-expanded]': 'collapsible.isOpen()',\n '[attr.aria-controls]': 'collapsible.contentId',\n '[attr.aria-disabled]': 'collapsible.isDisabled() || null',\n '[attr.data-state]': 'collapsible.isOpen() ? \"open\" : \"closed\"',\n '[attr.disabled]': 'collapsible.isDisabled() || null',\n '[tabindex]': 'collapsible.isDisabled() ? -1 : 0',\n '(click)': 'onClick($event)',\n '(keydown.enter)': 'onKeydown($event)',\n '(keydown.space)': 'onKeydown($event)',\n },\n})\nexport class ComCollapsibleTrigger {\n /** Parent collapsible directive (provides state). */\n protected readonly collapsible: ComCollapsible = inject(ComCollapsible);\n\n /** Custom trigger layout template (replaces inner content). */\n protected readonly triggerTpl: Signal<ComCollapsibleTriggerTpl | undefined> =\n contentChild(ComCollapsibleTriggerTpl);\n\n /** Custom icon template (replaces default chevron). */\n protected readonly iconTpl: Signal<ComCollapsibleIconTpl | undefined> =\n contentChild(ComCollapsibleIconTpl);\n\n // ============ INPUTS ============\n\n /** Trigger preset variant. */\n readonly variant: InputSignal<CollapsibleTriggerVariant> =\n input<CollapsibleTriggerVariant>('ghost');\n\n /** Trigger size. */\n readonly size: InputSignal<CollapsibleTriggerSize> =\n input<CollapsibleTriggerSize>('default');\n\n /** Show/hide the toggle icon. */\n readonly showIcon: InputSignalWithTransform<boolean, unknown> = input(true, {\n transform: booleanAttribute,\n });\n\n /** Consumer CSS classes — merged with variant classes. */\n readonly userClass: InputSignal<string> = input<string>('', { alias: 'class' });\n\n // ============ COMPUTED STATE ============\n\n /** @internal Computed host class from CVA + consumer overrides. */\n protected readonly computedClass: Signal<string> = computed(() =>\n mergeClasses(\n collapsibleTriggerVariants({\n variant: this.variant(),\n size: this.size(),\n }),\n this.userClass()\n )\n );\n\n /** Context for trigger template. */\n readonly triggerContext: Signal<ComCollapsibleTriggerContext> = computed(() => ({\n $implicit: this.collapsible.isOpen(),\n open: this.collapsible.isOpen(),\n disabled: this.collapsible.isDisabled(),\n toggle: () => this.collapsible.toggle(),\n }));\n\n /** Context for icon template. */\n readonly iconContext: Signal<ComCollapsibleIconContext> = computed(() => ({\n $implicit: this.collapsible.isOpen(),\n open: this.collapsible.isOpen(),\n }));\n\n // ============ EVENT HANDLERS ============\n\n /** @internal */\n protected onClick(event: Event): void {\n event.preventDefault();\n this.collapsible.toggle();\n }\n\n /** @internal */\n protected onKeydown(event: Event): void {\n event.preventDefault();\n this.collapsible.toggle();\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n inject,\n input,\n signal,\n effect,\n} from '@angular/core';\nimport type { InputSignal, Signal, WritableSignal } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ComCollapsible } from './collapsible.directive';\nimport { ComCollapsibleContentTpl } from './directives/collapsible-content-tpl.directive';\nimport { ComCollapsibleLazy } from './directives/collapsible-lazy.directive';\nimport { mergeClasses } from './collapsible.utils';\nimport type { ComCollapsibleContentContext } from './collapsible.models';\n\n/**\n * Collapsible content component — animated panel with region role.\n *\n * Uses CSS grid technique for smooth height animation without JS measurement.\n * Supports lazy rendering via `comCollapsibleLazy` directive.\n *\n * @tokens None (structural only — styling is applied via templates or consumer classes)\n *\n * @example Basic usage\n * ```html\n * <com-collapsible-content>\n * <div class=\"p-4\">Content here.</div>\n * </com-collapsible-content>\n * ```\n *\n * @example With custom duration\n * ```html\n * <com-collapsible-content [duration]=\"300\">\n * <div class=\"p-4\">Slower animation.</div>\n * </com-collapsible-content>\n * ```\n *\n * @example With content chrome template\n * ```html\n * <com-collapsible-content>\n * <ng-template comCollapsibleContentTpl let-open=\"open\">\n * <div class=\"border-t border-border p-4\">\n * <!-- Content with custom chrome -->\n * </div>\n * </ng-template>\n * </com-collapsible-content>\n * ```\n *\n * @example Lazy content\n * ```html\n * <com-collapsible-content>\n * <ng-template comCollapsibleLazy>\n * <app-heavy-component />\n * </ng-template>\n * </com-collapsible-content>\n * ```\n */\n@Component({\n selector: 'com-collapsible-content',\n template: `\n @if (contentTpl()) {\n <div class=\"com-collapsible-content-inner\" [class]=\"innerClass()\">\n <ng-container\n [ngTemplateOutlet]=\"contentTpl()!.templateRef\"\n [ngTemplateOutletContext]=\"templateContext()\"\n />\n </div>\n } @else if (lazyTpl()) {\n @if (hasBeenOpened()) {\n <div class=\"com-collapsible-content-inner\" [class]=\"innerClass()\">\n <ng-container [ngTemplateOutlet]=\"lazyTpl()!.templateRef\" />\n </div>\n }\n } @else {\n <div class=\"com-collapsible-content-inner\" [class]=\"innerClass()\">\n <ng-content />\n </div>\n }\n `,\n styles: `\n :host {\n display: grid;\n grid-template-rows: 0fr;\n transition: grid-template-rows var(--duration, 200ms) ease;\n }\n :host([data-state='open']) {\n grid-template-rows: 1fr;\n }\n .com-collapsible-content-inner {\n overflow: hidden;\n }\n `,\n imports: [NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'com-collapsible-content',\n '[style.--duration.ms]': 'duration()',\n '[attr.id]': 'collapsible.contentId',\n '[attr.role]': '\"region\"',\n '[attr.aria-labelledby]': 'collapsible.triggerId',\n '[attr.data-state]': 'collapsible.isOpen() ? \"open\" : \"closed\"',\n '[attr.inert]': '!collapsible.isOpen() || null',\n },\n})\nexport class ComCollapsibleContent {\n /** Parent collapsible directive (provides state). */\n protected readonly collapsible: ComCollapsible = inject(ComCollapsible);\n\n /** Custom content chrome template. */\n protected readonly contentTpl: Signal<ComCollapsibleContentTpl | undefined> =\n contentChild(ComCollapsibleContentTpl);\n\n /** Lazy content template. */\n protected readonly lazyTpl: Signal<ComCollapsibleLazy | undefined> =\n contentChild(ComCollapsibleLazy);\n\n /** Track if collapsible has ever been opened (for lazy rendering). */\n protected readonly hasBeenOpened: WritableSignal<boolean> = signal(false);\n\n // ============ INPUTS ============\n\n /** Transition duration in milliseconds. */\n readonly duration: InputSignal<number> = input<number>(200);\n\n /** Consumer CSS classes for the inner wrapper. */\n readonly userClass: InputSignal<string> = input<string>('', { alias: 'class' });\n\n // ============ COMPUTED STATE ============\n\n /** @internal Computed inner wrapper class. */\n protected readonly innerClass: Signal<string> = computed(() =>\n mergeClasses('com-collapsible-content-inner', this.userClass())\n );\n\n /** Context for content template. */\n readonly templateContext: Signal<ComCollapsibleContentContext> = computed(() => ({\n $implicit: this.collapsible.isOpen(),\n open: this.collapsible.isOpen(),\n }));\n\n constructor() {\n // Track first open for lazy rendering\n effect(() => {\n if (this.collapsible.isOpen() && !this.hasBeenOpened()) {\n this.hasBeenOpened.set(true);\n }\n });\n }\n}\n","// Public API for the collapsible component\n\n// Types\nexport type {\n ComCollapsibleTriggerContext,\n ComCollapsibleContentContext,\n ComCollapsibleIconContext,\n} from './collapsible.models';\n\n// Variants\nexport { collapsibleVariants } from './collapsible.variants';\nexport type { CollapsibleVariant, CollapsibleVariants } from './collapsible.variants';\n\nexport { collapsibleTriggerVariants } from './collapsible-trigger.variants';\nexport type {\n CollapsibleTriggerVariant,\n CollapsibleTriggerSize,\n CollapsibleTriggerVariants,\n} from './collapsible-trigger.variants';\n\n// Template directives\nexport { ComCollapsibleTriggerTpl } from './directives/collapsible-trigger-tpl.directive';\nexport { ComCollapsibleContentTpl } from './directives/collapsible-content-tpl.directive';\nexport { ComCollapsibleIconTpl } from './directives/collapsible-icon-tpl.directive';\nexport { ComCollapsibleLazy } from './directives/collapsible-lazy.directive';\n\n// Main components\nexport { ComCollapsible } from './collapsible.directive';\nexport { ComCollapsibleTrigger } from './collapsible-trigger.component';\nexport { ComCollapsibleContent } from './collapsible-content.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngx-com-components-collapsible.mjs","sources":["../../../projects/com/components/collapsible/collapsible.variants.ts","../../../projects/com/components/collapsible/collapsible-trigger.variants.ts","../../../projects/com/components/collapsible/directives/collapsible-trigger-tpl.directive.ts","../../../projects/com/components/collapsible/directives/collapsible-content-tpl.directive.ts","../../../projects/com/components/collapsible/directives/collapsible-icon-tpl.directive.ts","../../../projects/com/components/collapsible/directives/collapsible-lazy.directive.ts","../../../projects/com/components/collapsible/collapsible.utils.ts","../../../projects/com/components/collapsible/collapsible.directive.ts","../../../projects/com/components/collapsible/collapsible-trigger.component.ts","../../../projects/com/components/collapsible/collapsible-content.component.ts","../../../projects/com/components/collapsible/index.ts","../../../projects/com/components/collapsible/ngx-com-components-collapsible.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\n\n/**\n * Shell variant type for the collapsible container.\n */\nexport type CollapsibleVariant = 'card' | 'bordered' | 'flush' | 'ghost' | 'unstyled';\n\n/**\n * CVA variants for the collapsible shell (root directive).\n *\n * @tokens `--color-border`, `--color-background`, `--color-foreground`, `--shadow-xs`, `--radius-collapsible`\n */\nexport const collapsibleVariants: (props?: {\n variant?: CollapsibleVariant;\n}) => string = cva(\n // Base — structural only\n 'com-collapsible block',\n {\n variants: {\n variant: {\n card: 'rounded-collapsible border border-border bg-background text-foreground shadow-xs',\n bordered: 'rounded-collapsible border border-border',\n flush: 'border-b border-border',\n ghost: '',\n unstyled: '',\n },\n },\n defaultVariants: {\n variant: 'ghost',\n },\n }\n);\n\nexport type CollapsibleVariants = VariantProps<typeof collapsibleVariants>;\n","import { cva, type VariantProps } from 'class-variance-authority';\n\n/**\n * Trigger variant type for the collapsible trigger.\n */\nexport type CollapsibleTriggerVariant = 'ghost' | 'filled' | 'header' | 'unstyled';\n\n/**\n * Trigger size type.\n */\nexport type CollapsibleTriggerSize = 'sm' | 'default' | 'lg';\n\n/**\n * CVA variants for the collapsible trigger directive.\n *\n * @tokens `--color-foreground`, `--color-muted`, `--color-muted-foreground`, `--color-muted-hover`,\n * `--color-ring`, `--color-disabled-foreground`, `--radius-collapsible`\n */\nexport const collapsibleTriggerVariants: (props?: {\n variant?: CollapsibleTriggerVariant;\n size?: CollapsibleTriggerSize;\n}) => string = cva(\n [\n 'com-collapsible-trigger',\n 'flex w-full items-center justify-between',\n 'cursor-pointer select-none',\n 'text-sm font-medium',\n 'transition-colors',\n 'focus-visible:outline-[1px] focus-visible:outline-offset-2 focus-visible:outline-ring',\n 'disabled:pointer-events-none disabled:text-disabled-foreground',\n '[&>svg]:transition-transform [&>svg]:duration-slow',\n '[&>svg.com-collapsible-icon]:data-[state=open]:rotate-180',\n ].join(' '),\n {\n variants: {\n variant: {\n ghost: 'rounded-collapsible text-foreground hover:bg-muted hover:text-muted-foreground',\n filled: 'rounded-collapsible bg-muted text-muted-foreground hover:bg-muted-hover',\n header: 'text-foreground hover:text-muted-foreground',\n unstyled: '',\n },\n size: {\n sm: 'px-2 py-1 text-xs gap-1',\n default: 'px-3 py-2 text-sm gap-2',\n lg: 'px-4 py-3 text-base gap-3',\n },\n },\n defaultVariants: {\n variant: 'ghost',\n size: 'default',\n },\n }\n);\n\nexport type CollapsibleTriggerVariants = VariantProps<typeof collapsibleTriggerVariants>;\n","import { Directive, TemplateRef, inject } from '@angular/core';\nimport type { ComCollapsibleTriggerContext } from '../collapsible.models';\n\n/**\n * Directive to mark a template as the custom trigger layout template.\n * Replaces the inner content of the trigger while preserving ARIA and keyboard handling.\n *\n * @tokens none\n *\n * @example\n * ```html\n * <button comCollapsibleTrigger>\n * <ng-template comCollapsibleTriggerTpl let-open let-toggle=\"toggle\" let-disabled=\"disabled\">\n * <div class=\"flex items-center gap-3 w-full\">\n * <span class=\"h-2 w-2 rounded-full\" [class]=\"open ? 'bg-success' : 'bg-muted'\"></span>\n * <span class=\"font-medium\">Notifications</span>\n * <svg class=\"com-collapsible-icon h-4 w-4\" [attr.data-state]=\"open ? 'open' : 'closed'\">\n * <!-- chevron icon -->\n * </svg>\n * </div>\n * </ng-template>\n * </button>\n * ```\n */\n@Directive({\n selector: 'ng-template[comCollapsibleTriggerTpl]',\n})\nexport class ComCollapsibleTriggerTpl {\n /** Reference to the template. */\n readonly templateRef: TemplateRef<ComCollapsibleTriggerContext> =\n inject<TemplateRef<ComCollapsibleTriggerContext>>(TemplateRef);\n\n /**\n * Static type guard for template type checking.\n * Enables type-safe access to context properties in templates.\n */\n static ngTemplateContextGuard(\n _dir: ComCollapsibleTriggerTpl,\n ctx: unknown\n ): ctx is ComCollapsibleTriggerContext {\n return true;\n }\n}\n","import { Directive, TemplateRef, inject } from '@angular/core';\nimport type { ComCollapsibleContentContext } from '../collapsible.models';\n\n/**\n * Directive to mark a template as the custom content chrome template.\n * Wraps the content with custom chrome (headers, footers, padding).\n * The grid animation still applies on the host.\n *\n * @tokens none\n *\n * @example\n * ```html\n * <com-collapsible-content>\n * <ng-template comCollapsibleContentTpl let-open=\"open\">\n * <div class=\"border-t border-border\">\n * <div class=\"p-4 space-y-3\">\n * <!-- Content here -->\n * </div>\n * <div class=\"flex justify-end gap-2 px-4 py-3 border-t border-border-subtle bg-muted\">\n * <button>Reset</button>\n * <button>Apply</button>\n * </div>\n * </div>\n * </ng-template>\n * </com-collapsible-content>\n * ```\n */\n@Directive({\n selector: 'ng-template[comCollapsibleContentTpl]',\n})\nexport class ComCollapsibleContentTpl {\n /** Reference to the template. */\n readonly templateRef: TemplateRef<ComCollapsibleContentContext> =\n inject<TemplateRef<ComCollapsibleContentContext>>(TemplateRef);\n\n /**\n * Static type guard for template type checking.\n * Enables type-safe access to context properties in templates.\n */\n static ngTemplateContextGuard(\n _dir: ComCollapsibleContentTpl,\n ctx: unknown\n ): ctx is ComCollapsibleContentContext {\n return true;\n }\n}\n","import { Directive, TemplateRef, inject } from '@angular/core';\nimport type { ComCollapsibleIconContext } from '../collapsible.models';\n\n/**\n * Directive to mark a template as the custom icon template.\n * Replaces only the chevron icon inside the default trigger layout.\n *\n * @tokens none\n *\n * @example\n * ```html\n * <button comCollapsibleTrigger>\n * Settings\n * <ng-template comCollapsibleIcon let-open=\"open\">\n * <span class=\"text-muted-foreground text-xs\">{{ open ? '▲' : '▼' }}</span>\n * </ng-template>\n * </button>\n * ```\n */\n@Directive({\n selector: 'ng-template[comCollapsibleIcon]',\n})\nexport class ComCollapsibleIconTpl {\n /** Reference to the template. */\n readonly templateRef: TemplateRef<ComCollapsibleIconContext> =\n inject<TemplateRef<ComCollapsibleIconContext>>(TemplateRef);\n\n /**\n * Static type guard for template type checking.\n * Enables type-safe access to context properties in templates.\n */\n static ngTemplateContextGuard(\n _dir: ComCollapsibleIconTpl,\n ctx: unknown\n ): ctx is ComCollapsibleIconContext {\n return true;\n }\n}\n","import { Directive, TemplateRef, inject } from '@angular/core';\n\n/**\n * Structural directive for lazy content rendering.\n * Content is only instantiated on first expand, preserving state on subsequent toggles.\n *\n * @tokens none\n *\n * @example\n * ```html\n * <com-collapsible-content>\n * <ng-template comCollapsibleLazy>\n * <app-heavy-chart [data]=\"chartData()\" />\n * </ng-template>\n * </com-collapsible-content>\n * ```\n */\n@Directive({\n selector: 'ng-template[comCollapsibleLazy]',\n})\nexport class ComCollapsibleLazy {\n /** Reference to the template. */\n readonly templateRef: TemplateRef<void> = inject<TemplateRef<void>>(TemplateRef);\n}\n","export { mergeClasses } from 'ngx-com/utils';\n\nlet collapsibleIdCounter = 0;\n\n/**\n * Generates a unique ID for collapsible components.\n * @returns A unique string ID\n */\nexport function generateCollapsibleId(): string {\n return `com-collapsible-${++collapsibleIdCounter}`;\n}\n","import {\n booleanAttribute,\n computed,\n Directive,\n input,\n model,\n} from '@angular/core';\nimport type { InputSignal, InputSignalWithTransform, ModelSignal, Signal } from '@angular/core';\nimport { mergeClasses, generateCollapsibleId } from './collapsible.utils';\nimport { collapsibleVariants } from './collapsible.variants';\nimport type { CollapsibleVariant } from './collapsible.variants';\n\n/**\n * Root collapsible directive — manages state and provides shell styling.\n *\n * Works as a DI anchor for child directives (trigger, content).\n * Exposes programmatic control via template reference.\n *\n * @tokens `--color-border`, `--color-background`, `--color-foreground`, `--shadow-xs`\n *\n * @example Basic usage\n * ```html\n * <div comCollapsible variant=\"card\">\n * <button comCollapsibleTrigger>Section Title</button>\n * <com-collapsible-content>\n * <div class=\"p-4\">Content here.</div>\n * </com-collapsible-content>\n * </div>\n * ```\n *\n * @example Two-way binding with external control\n * ```html\n * <div comCollapsible [(open)]=\"sectionOpen\" #section=\"comCollapsible\">\n * <button comCollapsibleTrigger>Advanced</button>\n * <com-collapsible-content>...</com-collapsible-content>\n * </div>\n * <button (click)=\"section.toggle()\">Toggle externally</button>\n * ```\n */\n@Directive({\n selector: '[comCollapsible]',\n exportAs: 'comCollapsible',\n host: {\n '[class]': 'computedClass()',\n '[attr.data-state]': 'isOpen() ? \"open\" : \"closed\"',\n },\n})\nexport class ComCollapsible {\n /** Unique ID for the collapsible instance. */\n private readonly id: string = generateCollapsibleId();\n\n /** ID for the trigger element (used for aria-labelledby). */\n readonly triggerId: string = `${this.id}-trigger`;\n\n /** ID for the content panel (used for aria-controls). */\n readonly contentId: string = `${this.id}-content`;\n\n // ============ INPUTS ============\n\n /** Two-way bound open state. */\n readonly open: ModelSignal<boolean> = model<boolean>(false);\n\n /** Disables the collapsible, preventing state changes. */\n readonly disabled: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Shell preset variant. */\n readonly variant: InputSignal<CollapsibleVariant> = input<CollapsibleVariant>('ghost');\n\n /** Consumer CSS classes — merged with variant classes. */\n readonly userClass: InputSignal<string> = input<string>('', { alias: 'class' });\n\n // ============ COMPUTED STATE ============\n\n /** @internal Computed host class from CVA + consumer overrides. */\n protected readonly computedClass: Signal<string> = computed(() =>\n mergeClasses(\n collapsibleVariants({ variant: this.variant() }),\n this.userClass()\n )\n );\n\n // ============ PUBLIC API ============\n\n /** Returns the current open state. */\n isOpen(): boolean {\n return this.open();\n }\n\n /** Returns the current disabled state. */\n isDisabled(): boolean {\n return this.disabled();\n }\n\n /** Toggles the open state (if not disabled). */\n toggle(): void {\n if (this.disabled()) return;\n this.open.update((v) => !v);\n }\n\n /** Expands the collapsible (if not disabled). */\n expand(): void {\n if (this.disabled()) return;\n this.open.set(true);\n }\n\n /** Collapses the collapsible (if not disabled). */\n collapse(): void {\n if (this.disabled()) return;\n this.open.set(false);\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n inject,\n input,\n} from '@angular/core';\nimport type { InputSignal, InputSignalWithTransform, Signal } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ComCollapsible } from './collapsible.directive';\nimport { ComCollapsibleTriggerTpl } from './directives/collapsible-trigger-tpl.directive';\nimport { ComCollapsibleIconTpl } from './directives/collapsible-icon-tpl.directive';\nimport { mergeClasses } from './collapsible.utils';\nimport { collapsibleTriggerVariants } from './collapsible-trigger.variants';\nimport type { CollapsibleTriggerVariant, CollapsibleTriggerSize } from './collapsible-trigger.variants';\nimport type { ComCollapsibleTriggerContext, ComCollapsibleIconContext } from './collapsible.models';\n\n/**\n * Collapsible trigger component — handles toggle interaction, ARIA, keyboard, and template rendering.\n *\n * Uses attribute selector so it can be applied to `<button>` or any focusable element.\n * Injects the parent `ComCollapsible` directive to access state.\n * Supports custom trigger layout via `comCollapsibleTriggerTpl` and custom icon via `comCollapsibleIcon`.\n *\n * @tokens `--color-foreground`, `--color-muted`, `--color-muted-foreground`, `--color-muted-hover`,\n * `--color-ring`, `--color-disabled-foreground`\n *\n * @example Default trigger with auto icon\n * ```html\n * <button comCollapsibleTrigger>Section Title</button>\n * ```\n *\n * @example Without icon\n * ```html\n * <button comCollapsibleTrigger [showIcon]=\"false\">Section Title</button>\n * ```\n *\n * @example With custom icon\n * ```html\n * <button comCollapsibleTrigger>\n * Settings\n * <ng-template comCollapsibleIcon let-open=\"open\">\n * <span class=\"text-xs text-muted-foreground\">{{ open ? '▲' : '▼' }}</span>\n * </ng-template>\n * </button>\n * ```\n *\n * @example Full trigger layout override\n * ```html\n * <button comCollapsibleTrigger>\n * <ng-template comCollapsibleTriggerTpl let-open let-toggle=\"toggle\">\n * <div class=\"flex items-center gap-3 w-full\">\n * <span class=\"h-2 w-2 rounded-full\" [class]=\"open ? 'bg-success' : 'bg-muted'\"></span>\n * <span class=\"font-medium\">Notifications</span>\n * <svg class=\"com-collapsible-icon h-4 w-4\" [attr.data-state]=\"open ? 'open' : 'closed'\">\n * <!-- chevron -->\n * </svg>\n * </div>\n * </ng-template>\n * </button>\n * ```\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector -- intentional attribute selector for host element flexibility\n selector: '[comCollapsibleTrigger]',\n template: `\n @if (triggerTpl()) {\n <ng-container\n [ngTemplateOutlet]=\"triggerTpl()!.templateRef\"\n [ngTemplateOutletContext]=\"triggerContext()\"\n />\n } @else {\n <span class=\"flex-1 truncate text-left\">\n <ng-content />\n </span>\n @if (showIcon()) {\n @if (iconTpl()) {\n <ng-container\n [ngTemplateOutlet]=\"iconTpl()!.templateRef\"\n [ngTemplateOutletContext]=\"iconContext()\"\n />\n } @else {\n <svg\n class=\"com-collapsible-icon h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-slow\"\n [attr.data-state]=\"collapsible.isOpen() ? 'open' : 'closed'\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n }\n }\n }\n `,\n styles: `\n :host {\n display: flex;\n }\n `,\n imports: [NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'computedClass()',\n '[attr.id]': 'collapsible.triggerId',\n '[attr.type]': '\"button\"',\n '[attr.aria-expanded]': 'collapsible.isOpen()',\n '[attr.aria-controls]': 'collapsible.contentId',\n '[attr.aria-disabled]': 'collapsible.isDisabled() || null',\n '[attr.data-state]': 'collapsible.isOpen() ? \"open\" : \"closed\"',\n '[attr.disabled]': 'collapsible.isDisabled() || null',\n '[tabindex]': 'collapsible.isDisabled() ? -1 : 0',\n '(click)': 'onClick($event)',\n '(keydown.enter)': 'onKeydown($event)',\n '(keydown.space)': 'onKeydown($event)',\n },\n})\nexport class ComCollapsibleTrigger {\n /** Parent collapsible directive (provides state). */\n protected readonly collapsible: ComCollapsible = inject(ComCollapsible);\n\n /** Custom trigger layout template (replaces inner content). */\n protected readonly triggerTpl: Signal<ComCollapsibleTriggerTpl | undefined> =\n contentChild<ComCollapsibleTriggerTpl>(ComCollapsibleTriggerTpl);\n\n /** Custom icon template (replaces default chevron). */\n protected readonly iconTpl: Signal<ComCollapsibleIconTpl | undefined> =\n contentChild<ComCollapsibleIconTpl>(ComCollapsibleIconTpl);\n\n // ============ INPUTS ============\n\n /** Trigger preset variant. */\n readonly variant: InputSignal<CollapsibleTriggerVariant> =\n input<CollapsibleTriggerVariant>('ghost');\n\n /** Trigger size. */\n readonly size: InputSignal<CollapsibleTriggerSize> =\n input<CollapsibleTriggerSize>('default');\n\n /** Show/hide the toggle icon. */\n readonly showIcon: InputSignalWithTransform<boolean, unknown> = input(true, {\n transform: booleanAttribute,\n });\n\n /** Consumer CSS classes — merged with variant classes. */\n readonly userClass: InputSignal<string> = input<string>('', { alias: 'class' });\n\n // ============ COMPUTED STATE ============\n\n /** @internal Computed host class from CVA + consumer overrides. */\n protected readonly computedClass: Signal<string> = computed(() =>\n mergeClasses(\n collapsibleTriggerVariants({\n variant: this.variant(),\n size: this.size(),\n }),\n this.userClass()\n )\n );\n\n /** Context for trigger template. */\n readonly triggerContext: Signal<ComCollapsibleTriggerContext> = computed(() => ({\n $implicit: this.collapsible.isOpen(),\n open: this.collapsible.isOpen(),\n disabled: this.collapsible.isDisabled(),\n toggle: () => this.collapsible.toggle(),\n }));\n\n /** Context for icon template. */\n readonly iconContext: Signal<ComCollapsibleIconContext> = computed(() => ({\n $implicit: this.collapsible.isOpen(),\n open: this.collapsible.isOpen(),\n }));\n\n // ============ EVENT HANDLERS ============\n\n /** @internal */\n protected onClick(event: Event): void {\n event.preventDefault();\n this.collapsible.toggle();\n }\n\n /** @internal */\n protected onKeydown(event: Event): void {\n event.preventDefault();\n this.collapsible.toggle();\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n inject,\n input,\n linkedSignal,\n} from '@angular/core';\nimport type { InputSignal, Signal } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ComCollapsible } from './collapsible.directive';\nimport { ComCollapsibleContentTpl } from './directives/collapsible-content-tpl.directive';\nimport { ComCollapsibleLazy } from './directives/collapsible-lazy.directive';\nimport { mergeClasses } from './collapsible.utils';\nimport type { ComCollapsibleContentContext } from './collapsible.models';\n\n/**\n * Collapsible content component — animated panel with region role.\n *\n * Uses CSS grid technique for smooth height animation without JS measurement.\n * Supports lazy rendering via `comCollapsibleLazy` directive.\n *\n * @tokens None (structural only — styling is applied via templates or consumer classes)\n *\n * @example Basic usage\n * ```html\n * <com-collapsible-content>\n * <div class=\"p-4\">Content here.</div>\n * </com-collapsible-content>\n * ```\n *\n * @example With custom duration\n * ```html\n * <com-collapsible-content [duration]=\"300\">\n * <div class=\"p-4\">Slower animation.</div>\n * </com-collapsible-content>\n * ```\n *\n * @example With content chrome template\n * ```html\n * <com-collapsible-content>\n * <ng-template comCollapsibleContentTpl let-open=\"open\">\n * <div class=\"border-t border-border p-4\">\n * <!-- Content with custom chrome -->\n * </div>\n * </ng-template>\n * </com-collapsible-content>\n * ```\n *\n * @example Lazy content\n * ```html\n * <com-collapsible-content>\n * <ng-template comCollapsibleLazy>\n * <app-heavy-component />\n * </ng-template>\n * </com-collapsible-content>\n * ```\n */\n@Component({\n selector: 'com-collapsible-content',\n template: `\n @if (contentTpl()) {\n <div class=\"com-collapsible-content-inner\" [class]=\"innerClass()\">\n <ng-container\n [ngTemplateOutlet]=\"contentTpl()!.templateRef\"\n [ngTemplateOutletContext]=\"templateContext()\"\n />\n </div>\n } @else if (lazyTpl()) {\n @if (hasBeenOpened()) {\n <div class=\"com-collapsible-content-inner\" [class]=\"innerClass()\">\n <ng-container [ngTemplateOutlet]=\"lazyTpl()!.templateRef\" />\n </div>\n }\n } @else {\n <div class=\"com-collapsible-content-inner\" [class]=\"innerClass()\">\n <ng-content />\n </div>\n }\n `,\n styles: `\n :host {\n display: grid;\n grid-template-rows: 0fr;\n transition: grid-template-rows var(--duration, 200ms) ease;\n }\n :host([data-state='open']) {\n grid-template-rows: 1fr;\n }\n .com-collapsible-content-inner {\n overflow: hidden;\n }\n `,\n imports: [NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'com-collapsible-content',\n '[style.--duration.ms]': 'duration()',\n '[attr.id]': 'collapsible.contentId',\n '[attr.role]': '\"region\"',\n '[attr.aria-labelledby]': 'collapsible.triggerId',\n '[attr.data-state]': 'collapsible.isOpen() ? \"open\" : \"closed\"',\n '[attr.inert]': '!collapsible.isOpen() || null',\n },\n})\nexport class ComCollapsibleContent {\n /** Parent collapsible directive (provides state). */\n protected readonly collapsible: ComCollapsible = inject(ComCollapsible);\n\n /** Custom content chrome template. */\n protected readonly contentTpl: Signal<ComCollapsibleContentTpl | undefined> =\n contentChild<ComCollapsibleContentTpl>(ComCollapsibleContentTpl);\n\n /** Lazy content template. */\n protected readonly lazyTpl: Signal<ComCollapsibleLazy | undefined> =\n contentChild<ComCollapsibleLazy>(ComCollapsibleLazy);\n\n /** Track if collapsible has ever been opened (for lazy rendering). */\n protected readonly hasBeenOpened: Signal<boolean> = linkedSignal({\n source: () => this.collapsible.isOpen(),\n computation: (isOpen: boolean, previous: { value: boolean } | undefined) => isOpen || (previous?.value ?? false),\n });\n\n // ============ INPUTS ============\n\n /** Transition duration in milliseconds. */\n readonly duration: InputSignal<number> = input<number>(200);\n\n /** Consumer CSS classes for the inner wrapper. */\n readonly userClass: InputSignal<string> = input<string>('', { alias: 'class' });\n\n // ============ COMPUTED STATE ============\n\n /** @internal Computed inner wrapper class. */\n protected readonly innerClass: Signal<string> = computed(() =>\n mergeClasses('com-collapsible-content-inner', this.userClass())\n );\n\n /** Context for content template. */\n readonly templateContext: Signal<ComCollapsibleContentContext> = computed(() => ({\n $implicit: this.collapsible.isOpen(),\n open: this.collapsible.isOpen(),\n }));\n\n constructor() {}\n}\n","// Public API for the collapsible component\n\n// Types\nexport type {\n ComCollapsibleTriggerContext,\n ComCollapsibleContentContext,\n ComCollapsibleIconContext,\n} from './collapsible.models';\n\n// Variants\nexport { collapsibleVariants } from './collapsible.variants';\nexport type { CollapsibleVariant, CollapsibleVariants } from './collapsible.variants';\n\nexport { collapsibleTriggerVariants } from './collapsible-trigger.variants';\nexport type {\n CollapsibleTriggerVariant,\n CollapsibleTriggerSize,\n CollapsibleTriggerVariants,\n} from './collapsible-trigger.variants';\n\n// Template directives\nexport { ComCollapsibleTriggerTpl } from './directives/collapsible-trigger-tpl.directive';\nexport { ComCollapsibleContentTpl } from './directives/collapsible-content-tpl.directive';\nexport { ComCollapsibleIconTpl } from './directives/collapsible-icon-tpl.directive';\nexport { ComCollapsibleLazy } from './directives/collapsible-lazy.directive';\n\n// Main components\nexport { ComCollapsible } from './collapsible.directive';\nexport { ComCollapsibleTrigger } from './collapsible-trigger.component';\nexport { ComCollapsibleContent } from './collapsible-content.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -35,7 +35,7 @@ const confirmBackdropVariants = cva([
35
35
  /**
36
36
  * CVA variants for the confirmation panel container.
37
37
  *
38
- * @tokens `--color-popover`, `--color-popover-foreground`, `--color-border`, `--shadow-lg`, `--radius-popover`
38
+ * @tokens `--color-popover`, `--color-popover-foreground`, `--color-border`, `--shadow-overlay`, `--radius-popover`
39
39
  */
40
40
  const confirmPanelVariants = cva([
41
41
  'com-confirm-panel',
@@ -54,7 +54,7 @@ const confirmPanelVariants = cva([
54
54
  'bg-popover',
55
55
  'text-popover-foreground',
56
56
  'p-6',
57
- 'shadow-lg',
57
+ 'shadow-overlay',
58
58
  'rounded-popover',
59
59
  'outline-none',
60
60
  ], {
@@ -121,7 +121,7 @@ function generateConfirmDescriptionId() {
121
121
  * @internal Not exported in public API
122
122
  *
123
123
  * @tokens `--color-popover`, `--color-popover-foreground`, `--color-border`,
124
- * `--color-foreground`, `--color-muted-foreground`, `--shadow-lg`, `--radius-popover`
124
+ * `--color-foreground`, `--color-muted-foreground`, `--shadow-overlay`, `--radius-popover`
125
125
  */
126
126
  class ConfirmPanelComponent {
127
127
  focusTrapFactory = inject(FocusTrapFactory);
@@ -320,7 +320,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
320
320
  *
321
321
  * @tokens `--color-popover`, `--color-popover-foreground`, `--color-border`,
322
322
  * `--color-foreground`, `--color-muted-foreground`, `--color-backdrop`,
323
- * `--shadow-lg`, `--radius-popover`
323
+ * `--shadow-overlay`, `--radius-popover`
324
324
  *
325
325
  * @example Basic confirmation
326
326
  * ```html