ngx-com 0.0.19 → 0.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/ngx-com-components-alert.mjs +346 -0
- package/fesm2022/ngx-com-components-alert.mjs.map +1 -0
- package/fesm2022/ngx-com-components-button.mjs +1 -1
- package/fesm2022/ngx-com-components-button.mjs.map +1 -1
- package/fesm2022/ngx-com-components-calendar.mjs +29 -36
- package/fesm2022/ngx-com-components-calendar.mjs.map +1 -1
- package/fesm2022/ngx-com-components-card.mjs +1 -1
- package/fesm2022/ngx-com-components-card.mjs.map +1 -1
- package/fesm2022/ngx-com-components-carousel.mjs +708 -0
- package/fesm2022/ngx-com-components-carousel.mjs.map +1 -0
- package/fesm2022/ngx-com-components-checkbox.mjs +17 -8
- package/fesm2022/ngx-com-components-checkbox.mjs.map +1 -1
- package/fesm2022/ngx-com-components-code-block.mjs +158 -0
- package/fesm2022/ngx-com-components-code-block.mjs.map +1 -0
- package/fesm2022/ngx-com-components-collapsible.mjs +1 -1
- package/fesm2022/ngx-com-components-collapsible.mjs.map +1 -1
- package/fesm2022/ngx-com-components-confirm.mjs +3 -3
- package/fesm2022/ngx-com-components-confirm.mjs.map +1 -1
- package/fesm2022/ngx-com-components-dialog.mjs +703 -0
- package/fesm2022/ngx-com-components-dialog.mjs.map +1 -0
- package/fesm2022/ngx-com-components-dropdown.mjs +36 -31
- package/fesm2022/ngx-com-components-dropdown.mjs.map +1 -1
- package/fesm2022/ngx-com-components-form-field.mjs +48 -8
- package/fesm2022/ngx-com-components-form-field.mjs.map +1 -1
- package/fesm2022/ngx-com-components-item.mjs +1 -1
- package/fesm2022/ngx-com-components-item.mjs.map +1 -1
- package/fesm2022/ngx-com-components-paginator.mjs +3 -3
- package/fesm2022/ngx-com-components-paginator.mjs.map +1 -1
- package/fesm2022/ngx-com-components-radio.mjs +16 -9
- package/fesm2022/ngx-com-components-radio.mjs.map +1 -1
- package/fesm2022/ngx-com-components-segmented-control.mjs +1 -1
- package/fesm2022/ngx-com-components-segmented-control.mjs.map +1 -1
- package/fesm2022/ngx-com-components-separator.mjs +102 -0
- package/fesm2022/ngx-com-components-separator.mjs.map +1 -0
- package/fesm2022/ngx-com-components-switch.mjs +258 -0
- package/fesm2022/ngx-com-components-switch.mjs.map +1 -0
- package/fesm2022/ngx-com-components-table.mjs +631 -0
- package/fesm2022/ngx-com-components-table.mjs.map +1 -0
- package/fesm2022/ngx-com-components-tabs.mjs +2 -2
- package/fesm2022/ngx-com-components-tabs.mjs.map +1 -1
- package/fesm2022/ngx-com-components-toast.mjs +783 -0
- package/fesm2022/ngx-com-components-toast.mjs.map +1 -0
- package/package.json +33 -1
- package/types/ngx-com-components-alert.d.ts +166 -0
- package/types/ngx-com-components-carousel.d.ts +281 -0
- package/types/ngx-com-components-checkbox.d.ts +7 -2
- package/types/ngx-com-components-code-block.d.ts +66 -0
- package/types/ngx-com-components-confirm.d.ts +2 -2
- package/types/ngx-com-components-dialog.d.ts +264 -0
- package/types/ngx-com-components-dropdown.d.ts +8 -5
- package/types/ngx-com-components-form-field.d.ts +19 -3
- package/types/ngx-com-components-radio.d.ts +5 -3
- package/types/ngx-com-components-separator.d.ts +75 -0
- package/types/ngx-com-components-switch.d.ts +110 -0
- package/types/ngx-com-components-table.d.ts +377 -0
- package/types/ngx-com-components-toast.d.ts +217 -0
|
@@ -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-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\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-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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"}
|
|
@@ -13,13 +13,13 @@ import { mergeClasses } from 'ngx-com/utils';
|
|
|
13
13
|
/**
|
|
14
14
|
* CVA variants for the confirmation panel backdrop.
|
|
15
15
|
*
|
|
16
|
-
* @tokens `--color-
|
|
16
|
+
* @tokens `--color-backdrop`
|
|
17
17
|
*/
|
|
18
18
|
const confirmBackdropVariants = cva([
|
|
19
19
|
'fixed',
|
|
20
20
|
'inset-0',
|
|
21
21
|
'z-50',
|
|
22
|
-
'bg-
|
|
22
|
+
'bg-backdrop',
|
|
23
23
|
'backdrop-blur-sm',
|
|
24
24
|
], {
|
|
25
25
|
variants: {
|
|
@@ -319,7 +319,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
|
|
|
319
319
|
* and emits `true` (confirmed) or `false` (cancelled) through its output.
|
|
320
320
|
*
|
|
321
321
|
* @tokens `--color-popover`, `--color-popover-foreground`, `--color-border`,
|
|
322
|
-
* `--color-foreground`, `--color-muted-foreground`, `--color-
|
|
322
|
+
* `--color-foreground`, `--color-muted-foreground`, `--color-backdrop`,
|
|
323
323
|
* `--shadow-lg`, `--radius-popover`
|
|
324
324
|
*
|
|
325
325
|
* @example Basic confirmation
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngx-com-components-confirm.mjs","sources":["../../../projects/com/components/confirm/confirm.variants.ts","../../../projects/com/components/confirm/confirm.utils.ts","../../../projects/com/components/confirm/confirm-panel.component.ts","../../../projects/com/components/confirm/confirm.directive.ts","../../../projects/com/components/confirm/index.ts","../../../projects/com/components/confirm/ngx-com-components-confirm.ts"],"sourcesContent":["import { cva } from 'class-variance-authority';\n\n/**\n * CVA variants for the confirmation panel backdrop.\n *\n * @tokens `--color-background`\n */\nexport const confirmBackdropVariants: (props?: {\n visible?: boolean;\n}) => string = cva(\n [\n 'fixed',\n 'inset-0',\n 'z-50',\n 'bg-background/80',\n 'backdrop-blur-sm',\n ],\n {\n variants: {\n visible: {\n true: 'animate-in fade-in-0',\n false: 'animate-out fade-out-0',\n },\n },\n defaultVariants: {\n visible: true,\n },\n },\n);\n\n/**\n * CVA variants for the confirmation panel container.\n *\n * @tokens `--color-popover`, `--color-popover-foreground`, `--color-border`, `--shadow-lg`, `--radius-popover`\n */\nexport const confirmPanelVariants: (props?: {\n visible?: boolean;\n}) => string = cva(\n [\n 'com-confirm-panel',\n 'fixed',\n 'left-1/2',\n 'top-1/2',\n '-translate-x-1/2',\n '-translate-y-1/2',\n 'z-50',\n 'grid',\n 'w-full',\n 'max-w-lg',\n 'gap-4',\n 'border',\n 'border-border',\n 'bg-popover',\n 'text-popover-foreground',\n 'p-6',\n 'shadow-lg',\n 'rounded-popover',\n 'outline-none',\n ],\n {\n variants: {\n visible: {\n true: 'animate-in fade-in-0 zoom-in-95',\n false: 'animate-out fade-out-0 zoom-out-95',\n },\n },\n defaultVariants: {\n visible: true,\n },\n },\n);\n\n/**\n * CVA variants for the confirmation panel title.\n *\n * @tokens `--color-foreground`\n */\nexport const confirmTitleVariants: () => string = cva([\n 'text-lg',\n 'font-semibold',\n 'text-foreground',\n 'leading-none',\n 'tracking-tight',\n]);\n\n/**\n * CVA variants for the confirmation panel message.\n *\n * @tokens `--color-muted-foreground`\n */\nexport const confirmMessageVariants: () => string = cva([\n 'text-sm',\n 'text-muted-foreground',\n]);\n\n/**\n * CVA variants for the confirmation panel footer.\n */\nexport const confirmFooterVariants: () => string = cva([\n 'flex',\n 'flex-col-reverse',\n 'sm:flex-row',\n 'sm:justify-end',\n 'sm:space-x-2',\n]);\n","export { mergeClasses } from 'ngx-com/utils';\n\nlet confirmIdCounter = 0;\n\n/**\n * Generate a unique ID for a confirmation dialog title.\n */\nexport function generateConfirmTitleId(): string {\n return `confirm-title-${++confirmIdCounter}`;\n}\n\n/**\n * Generate a unique ID for a confirmation dialog description.\n */\nexport function generateConfirmDescriptionId(): string {\n return `confirm-desc-${++confirmIdCounter}`;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n signal,\n viewChild,\n} from '@angular/core';\nimport type { AfterViewInit, Signal, WritableSignal } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { FocusTrapFactory, FocusTrap } from '@angular/cdk/a11y';\nimport { ComButton } from 'ngx-com/components/button';\nimport {\n confirmPanelVariants,\n confirmBackdropVariants,\n confirmTitleVariants,\n confirmMessageVariants,\n confirmFooterVariants,\n} from './confirm.variants';\nimport type { ConfirmTemplateContext, ConfirmPanelConfig } from './confirm.models';\nimport { mergeClasses } from './confirm.utils';\n\n/**\n * Internal confirmation panel component rendered inside the CDK overlay.\n * Receives configuration from the directive and manages the dialog UI.\n *\n * @internal Not exported in public API\n *\n * @tokens `--color-popover`, `--color-popover-foreground`, `--color-border`,\n * `--color-foreground`, `--color-muted-foreground`, `--shadow-lg`, `--radius-popover`\n */\n@Component({\n selector: 'com-confirm-panel',\n template: `\n @if (config()?.hasBackdrop) {\n <div\n [class]=\"backdropClasses()\"\n [attr.data-state]=\"visible() ? 'open' : 'closed'\"\n aria-hidden=\"true\"\n ></div>\n }\n <div\n #panelElement\n [class]=\"panelClasses()\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n [attr.aria-labelledby]=\"config()?.title ? config()?.titleId : null\"\n [attr.aria-describedby]=\"config()?.descriptionId\"\n [attr.data-state]=\"visible() ? 'open' : 'closed'\"\n tabindex=\"-1\"\n >\n @if (config()?.customTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"config()!.customTemplate!\"\n [ngTemplateOutletContext]=\"templateContext()\"\n />\n } @else {\n <div class=\"flex flex-col space-y-2\">\n @if (config()?.title) {\n <h2 [id]=\"config()?.titleId\" [class]=\"titleClasses()\">\n {{ config()?.title }}\n </h2>\n }\n <p [id]=\"config()?.descriptionId\" [class]=\"messageClasses()\">\n {{ config()?.message }}\n </p>\n </div>\n <div [class]=\"footerClasses()\">\n <button\n #cancelButton\n comButton\n variant=\"outline\"\n (click)=\"onCancel()\"\n type=\"button\"\n >\n {{ config()?.cancelLabel }}\n </button>\n <button\n comButton\n [color]=\"config()?.confirmColor ?? 'primary'\"\n (click)=\"onConfirm()\"\n type=\"button\"\n >\n {{ config()?.confirmLabel }}\n </button>\n </div>\n }\n </div>\n `,\n styles: `\n :host {\n display: contents;\n }\n\n /* Animation styles using Tailwind animate utilities */\n [data-state='open'] {\n --tw-enter-opacity: 0;\n --tw-enter-scale: 0.95;\n }\n\n [data-state='closed'] {\n --tw-exit-opacity: 0;\n --tw-exit-scale: 0.95;\n }\n\n @media (prefers-reduced-motion: reduce) {\n [data-state='open'],\n [data-state='closed'] {\n animation: none;\n }\n }\n `,\n imports: [NgTemplateOutlet, ComButton],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ConfirmPanelComponent implements AfterViewInit {\n private readonly focusTrapFactory = inject(FocusTrapFactory);\n private focusTrap: FocusTrap | null = null;\n\n /** Reference to the panel element for focus trap. */\n private readonly panelElement = viewChild<ElementRef<HTMLElement>>('panelElement');\n\n /** Reference to the cancel button for initial focus. */\n private readonly cancelButton = viewChild<ElementRef<HTMLButtonElement>>('cancelButton');\n\n /** Panel configuration passed from the directive. */\n readonly config: WritableSignal<ConfirmPanelConfig | null> = signal(null);\n\n /** Whether the panel is visible (for animation state). */\n readonly visible: WritableSignal<boolean> = signal(false);\n\n /** Internal loading state for async operations. */\n readonly loading: WritableSignal<boolean> = signal(false);\n\n /** Function to confirm the action, set by directive. */\n readonly confirmFn: WritableSignal<() => void> = signal(() => {});\n\n /** Function to cancel the action, set by directive. */\n readonly cancelFn: WritableSignal<() => void> = signal(() => {});\n\n /** Computed template context for custom templates. */\n protected readonly templateContext: Signal<ConfirmTemplateContext> = computed(() => ({\n $implicit: this.config()?.message ?? '',\n title: this.config()?.title,\n confirm: () => this.onConfirm(),\n cancel: () => this.onCancel(),\n loading: this.loading(),\n setLoading: (value: boolean) => this.loading.set(value),\n }));\n\n /** Computed backdrop CSS classes. */\n protected readonly backdropClasses: Signal<string> = computed(() =>\n mergeClasses(confirmBackdropVariants({ visible: this.visible() })),\n );\n\n /** Computed panel CSS classes. */\n protected readonly panelClasses: Signal<string> = computed(() =>\n mergeClasses(confirmPanelVariants({ visible: this.visible() })),\n );\n\n /** Computed title CSS classes. */\n protected readonly titleClasses: Signal<string> = computed(() =>\n mergeClasses(confirmTitleVariants()),\n );\n\n /** Computed message CSS classes. */\n protected readonly messageClasses: Signal<string> = computed(() =>\n mergeClasses(confirmMessageVariants()),\n );\n\n /** Computed footer CSS classes. */\n protected readonly footerClasses: Signal<string> = computed(() =>\n mergeClasses(confirmFooterVariants()),\n );\n\n ngAfterViewInit(): void {\n this.setupFocusTrap();\n this.focusCancelButton();\n }\n\n /** Handle confirm button click. */\n protected onConfirm(): void {\n this.confirmFn()();\n }\n\n /** Handle cancel button click. */\n protected onCancel(): void {\n this.cancelFn()();\n }\n\n /** Clean up focus trap on destroy. */\n destroyFocusTrap(): void {\n this.focusTrap?.destroy();\n this.focusTrap = null;\n }\n\n private setupFocusTrap(): void {\n const panelEl = this.panelElement()?.nativeElement;\n if (panelEl) {\n this.focusTrap = this.focusTrapFactory.create(panelEl);\n this.focusTrap.focusInitialElementWhenReady();\n }\n }\n\n private focusCancelButton(): void {\n // Focus cancel button as safer default (prevents accidental confirmation)\n // Use setTimeout to ensure DOM is ready\n setTimeout(() => {\n const cancelBtn = this.cancelButton()?.nativeElement;\n if (cancelBtn) {\n cancelBtn.focus();\n }\n }, 0);\n }\n}\n","import {\n booleanAttribute,\n computed,\n DestroyRef,\n Directive,\n ElementRef,\n inject,\n Injector,\n input,\n output,\n PLATFORM_ID,\n signal,\n ViewContainerRef,\n} from '@angular/core';\nimport type {\n InputSignal,\n InputSignalWithTransform,\n OutputEmitterRef,\n Signal,\n TemplateRef,\n WritableSignal,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { filter } from 'rxjs/operators';\nimport { ConfirmPanelComponent } from './confirm-panel.component';\nimport { generateConfirmTitleId, generateConfirmDescriptionId } from './confirm.utils';\nimport type { ConfirmColor, ConfirmTemplateContext, ConfirmPanelConfig } from './confirm.models';\n\n/**\n * Confirmation directive — intercepts clicks and displays a confirmation panel\n * before allowing the action to proceed.\n *\n * The directive acts as an output gate: it captures clicks, shows confirmation UI,\n * and emits `true` (confirmed) or `false` (cancelled) through its output.\n *\n * @tokens `--color-popover`, `--color-popover-foreground`, `--color-border`,\n * `--color-foreground`, `--color-muted-foreground`, `--color-background`,\n * `--shadow-lg`, `--radius-popover`\n *\n * @example Basic confirmation\n * ```html\n * <button comButton (comConfirm)=\"onDelete($event)\" confirmMessage=\"Delete this item?\">\n * Delete\n * </button>\n * ```\n *\n * @example Destructive action with warn styling\n * ```html\n * <button comButton color=\"warn\"\n * (comConfirm)=\"onPermanentDelete($event)\"\n * confirmTitle=\"Permanent Deletion\"\n * confirmMessage=\"This action cannot be undone.\"\n * confirmLabel=\"Delete Forever\"\n * confirmColor=\"warn\">\n * Delete Permanently\n * </button>\n * ```\n *\n * @example Custom template\n * ```html\n * <button comButton (comConfirm)=\"onAction($event)\" [confirmTpl]=\"customTpl\">\n * Action\n * </button>\n *\n * <ng-template #customTpl let-message let-confirm=\"confirm\" let-cancel=\"cancel\">\n * <div class=\"flex flex-col gap-4\">\n * <p>{{ message }}</p>\n * <div class=\"flex justify-end gap-2\">\n * <button comButton variant=\"ghost\" (click)=\"cancel()\">Cancel</button>\n * <button comButton (click)=\"confirm()\">Confirm</button>\n * </div>\n * </div>\n * </ng-template>\n * ```\n */\n@Directive({\n selector: '[comConfirm]',\n exportAs: 'comConfirm',\n host: {\n '[attr.aria-haspopup]': '\"dialog\"',\n '[attr.aria-expanded]': 'isOpen()',\n '(click)': 'onTriggerClick($event)',\n },\n})\nexport class ComConfirm {\n private readonly overlay = inject(Overlay);\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly injector = inject(Injector);\n private readonly destroyRef = inject(DestroyRef);\n private readonly platformId = inject(PLATFORM_ID);\n\n private overlayRef: OverlayRef | null = null;\n private panelInstance: ConfirmPanelComponent | null = null;\n private readonly titleId = generateConfirmTitleId();\n private readonly descriptionId = generateConfirmDescriptionId();\n\n /** Whether the confirmation panel is currently open. */\n protected readonly isOpen: WritableSignal<boolean> = signal(false);\n\n // ─── Content Inputs ───\n\n /** The confirmation message to display. */\n readonly confirmMessage: InputSignal<string> = input<string>('Are you sure?');\n\n /** Optional title for the confirmation dialog. */\n readonly confirmTitle: InputSignal<string | undefined> = input<string | undefined>(undefined);\n\n /** Label for the confirm button. */\n readonly confirmLabel: InputSignal<string> = input<string>('Confirm');\n\n /** Label for the cancel button. */\n readonly cancelLabel: InputSignal<string> = input<string>('Cancel');\n\n // ─── Styling Inputs ───\n\n /** Color variant for the confirm button. */\n readonly confirmColor: InputSignal<ConfirmColor> = input<ConfirmColor>('primary');\n\n // ─── Behavior Inputs ───\n\n /** When true, clicks pass through without showing confirmation. */\n readonly confirmDisabled: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Whether to show a backdrop behind the panel. */\n readonly confirmBackdrop: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Custom template for the panel content. */\n readonly confirmTpl: InputSignal<TemplateRef<ConfirmTemplateContext> | undefined> =\n input<TemplateRef<ConfirmTemplateContext> | undefined>(undefined);\n\n // ─── Output ───\n\n /**\n * Emits `true` when confirmed, `false` when cancelled or navigated away.\n * This is the main directive output — acts as an output gate for the action.\n */\n readonly comConfirm: OutputEmitterRef<boolean> = output<boolean>();\n\n // ─── Computed ───\n\n private readonly panelConfig: Signal<ConfirmPanelConfig> = computed(() => ({\n message: this.confirmMessage(),\n title: this.confirmTitle(),\n confirmLabel: this.confirmLabel(),\n cancelLabel: this.cancelLabel(),\n confirmColor: this.confirmColor(),\n hasBackdrop: this.confirmBackdrop(),\n customTemplate: this.confirmTpl(),\n titleId: this.titleId,\n descriptionId: this.descriptionId,\n }));\n\n constructor() {\n // Emit false and cleanup on destroy (navigation away)\n this.destroyRef.onDestroy(() => {\n if (this.isOpen()) {\n this.comConfirm.emit(false);\n }\n this.disposeOverlay();\n });\n }\n\n // ─── Public API ───\n\n /** Programmatically open the confirmation dialog. */\n open(): void {\n if (this.isOpen() || this.confirmDisabled()) return;\n this.createOverlay();\n this.attachPanel();\n }\n\n /** Programmatically close the confirmation dialog (emits false). */\n close(): void {\n if (!this.isOpen()) return;\n this.handleCancel();\n }\n\n // ─── Event Handlers ───\n\n protected onTriggerClick(event: Event): void {\n // If disabled, let the click pass through normally\n if (this.confirmDisabled()) return;\n\n // Intercept the click\n event.preventDefault();\n event.stopPropagation();\n\n this.open();\n }\n\n // ─── Overlay Management ───\n\n private createOverlay(): void {\n if (this.overlayRef) return;\n if (!isPlatformBrowser(this.platformId)) return;\n\n // Use GlobalPositionStrategy for centered modal\n const positionStrategy = this.overlay\n .position()\n .global()\n .centerHorizontally()\n .centerVertically();\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy: this.overlay.scrollStrategies.block(),\n hasBackdrop: false, // We handle backdrop in the panel component\n panelClass: 'com-confirm-overlay',\n disposeOnNavigation: true,\n });\n }\n\n private attachPanel(): void {\n if (!this.overlayRef || this.overlayRef.hasAttached()) return;\n\n const portal = new ComponentPortal(ConfirmPanelComponent, this.viewContainerRef, this.injector);\n const componentRef = this.overlayRef.attach(portal);\n this.panelInstance = componentRef.instance;\n\n // Configure panel\n this.panelInstance.config.set(this.panelConfig());\n this.panelInstance.confirmFn.set(() => this.handleConfirm());\n this.panelInstance.cancelFn.set(() => this.handleCancel());\n\n // Subscribe to keyboard events (Escape to cancel)\n this.overlayRef\n .keydownEvents()\n .pipe(\n filter((event) => event.key === 'Escape'),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((event) => {\n event.preventDefault();\n event.stopPropagation();\n this.handleCancel();\n });\n\n // Subscribe to detachments (cleanup)\n this.overlayRef\n .detachments()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.handleDetachment();\n });\n\n // Show panel after a microtask (allows initial styles to apply)\n requestAnimationFrame(() => {\n if (this.panelInstance) {\n this.panelInstance.visible.set(true);\n }\n });\n\n this.isOpen.set(true);\n }\n\n private handleConfirm(): void {\n if (!this.isOpen()) return;\n\n this.comConfirm.emit(true);\n this.closePanel();\n }\n\n private handleCancel(): void {\n if (!this.isOpen()) return;\n\n this.comConfirm.emit(false);\n this.closePanel();\n }\n\n private closePanel(): void {\n if (!this.panelInstance) return;\n\n // Trigger hide animation\n this.panelInstance.visible.set(false);\n\n // Wait for animation to complete before detaching\n setTimeout(() => {\n this.disposeOverlay();\n this.returnFocusToTrigger();\n }, 150); // Match animation duration\n }\n\n private handleDetachment(): void {\n this.isOpen.set(false);\n this.panelInstance?.destroyFocusTrap();\n this.panelInstance = null;\n }\n\n private disposeOverlay(): void {\n if (this.overlayRef) {\n this.panelInstance?.destroyFocusTrap();\n this.overlayRef.dispose();\n this.overlayRef = null;\n }\n this.panelInstance = null;\n this.isOpen.set(false);\n }\n\n private returnFocusToTrigger(): void {\n this.elementRef.nativeElement.focus();\n }\n}\n","// Public API for the confirm directive\n\n// Main directive\nexport { ComConfirm } from './confirm.directive';\n\n// Types and interfaces\nexport type { ConfirmTemplateContext, ConfirmColor } from './confirm.models';\n\n// Variants (for advanced customization)\nexport {\n confirmPanelVariants,\n confirmBackdropVariants,\n confirmTitleVariants,\n confirmMessageVariants,\n confirmFooterVariants,\n} from './confirm.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-confirm.mjs","sources":["../../../projects/com/components/confirm/confirm.variants.ts","../../../projects/com/components/confirm/confirm.utils.ts","../../../projects/com/components/confirm/confirm-panel.component.ts","../../../projects/com/components/confirm/confirm.directive.ts","../../../projects/com/components/confirm/index.ts","../../../projects/com/components/confirm/ngx-com-components-confirm.ts"],"sourcesContent":["import { cva } from 'class-variance-authority';\n\n/**\n * CVA variants for the confirmation panel backdrop.\n *\n * @tokens `--color-backdrop`\n */\nexport const confirmBackdropVariants: (props?: {\n visible?: boolean;\n}) => string = cva(\n [\n 'fixed',\n 'inset-0',\n 'z-50',\n 'bg-backdrop',\n 'backdrop-blur-sm',\n ],\n {\n variants: {\n visible: {\n true: 'animate-in fade-in-0',\n false: 'animate-out fade-out-0',\n },\n },\n defaultVariants: {\n visible: true,\n },\n },\n);\n\n/**\n * CVA variants for the confirmation panel container.\n *\n * @tokens `--color-popover`, `--color-popover-foreground`, `--color-border`, `--shadow-lg`, `--radius-popover`\n */\nexport const confirmPanelVariants: (props?: {\n visible?: boolean;\n}) => string = cva(\n [\n 'com-confirm-panel',\n 'fixed',\n 'left-1/2',\n 'top-1/2',\n '-translate-x-1/2',\n '-translate-y-1/2',\n 'z-50',\n 'grid',\n 'w-full',\n 'max-w-lg',\n 'gap-4',\n 'border',\n 'border-border',\n 'bg-popover',\n 'text-popover-foreground',\n 'p-6',\n 'shadow-lg',\n 'rounded-popover',\n 'outline-none',\n ],\n {\n variants: {\n visible: {\n true: 'animate-in fade-in-0 zoom-in-95',\n false: 'animate-out fade-out-0 zoom-out-95',\n },\n },\n defaultVariants: {\n visible: true,\n },\n },\n);\n\n/**\n * CVA variants for the confirmation panel title.\n *\n * @tokens `--color-foreground`\n */\nexport const confirmTitleVariants: () => string = cva([\n 'text-lg',\n 'font-semibold',\n 'text-foreground',\n 'leading-none',\n 'tracking-tight',\n]);\n\n/**\n * CVA variants for the confirmation panel message.\n *\n * @tokens `--color-muted-foreground`\n */\nexport const confirmMessageVariants: () => string = cva([\n 'text-sm',\n 'text-muted-foreground',\n]);\n\n/**\n * CVA variants for the confirmation panel footer.\n */\nexport const confirmFooterVariants: () => string = cva([\n 'flex',\n 'flex-col-reverse',\n 'sm:flex-row',\n 'sm:justify-end',\n 'sm:space-x-2',\n]);\n","export { mergeClasses } from 'ngx-com/utils';\n\nlet confirmIdCounter = 0;\n\n/**\n * Generate a unique ID for a confirmation dialog title.\n */\nexport function generateConfirmTitleId(): string {\n return `confirm-title-${++confirmIdCounter}`;\n}\n\n/**\n * Generate a unique ID for a confirmation dialog description.\n */\nexport function generateConfirmDescriptionId(): string {\n return `confirm-desc-${++confirmIdCounter}`;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n signal,\n viewChild,\n} from '@angular/core';\nimport type { AfterViewInit, Signal, WritableSignal } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { FocusTrapFactory, FocusTrap } from '@angular/cdk/a11y';\nimport { ComButton } from 'ngx-com/components/button';\nimport {\n confirmPanelVariants,\n confirmBackdropVariants,\n confirmTitleVariants,\n confirmMessageVariants,\n confirmFooterVariants,\n} from './confirm.variants';\nimport type { ConfirmTemplateContext, ConfirmPanelConfig } from './confirm.models';\nimport { mergeClasses } from './confirm.utils';\n\n/**\n * Internal confirmation panel component rendered inside the CDK overlay.\n * Receives configuration from the directive and manages the dialog UI.\n *\n * @internal Not exported in public API\n *\n * @tokens `--color-popover`, `--color-popover-foreground`, `--color-border`,\n * `--color-foreground`, `--color-muted-foreground`, `--shadow-lg`, `--radius-popover`\n */\n@Component({\n selector: 'com-confirm-panel',\n template: `\n @if (config()?.hasBackdrop) {\n <div\n [class]=\"backdropClasses()\"\n [attr.data-state]=\"visible() ? 'open' : 'closed'\"\n aria-hidden=\"true\"\n ></div>\n }\n <div\n #panelElement\n [class]=\"panelClasses()\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n [attr.aria-labelledby]=\"config()?.title ? config()?.titleId : null\"\n [attr.aria-describedby]=\"config()?.descriptionId\"\n [attr.data-state]=\"visible() ? 'open' : 'closed'\"\n tabindex=\"-1\"\n >\n @if (config()?.customTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"config()!.customTemplate!\"\n [ngTemplateOutletContext]=\"templateContext()\"\n />\n } @else {\n <div class=\"flex flex-col space-y-2\">\n @if (config()?.title) {\n <h2 [id]=\"config()?.titleId\" [class]=\"titleClasses()\">\n {{ config()?.title }}\n </h2>\n }\n <p [id]=\"config()?.descriptionId\" [class]=\"messageClasses()\">\n {{ config()?.message }}\n </p>\n </div>\n <div [class]=\"footerClasses()\">\n <button\n #cancelButton\n comButton\n variant=\"outline\"\n (click)=\"onCancel()\"\n type=\"button\"\n >\n {{ config()?.cancelLabel }}\n </button>\n <button\n comButton\n [color]=\"config()?.confirmColor ?? 'primary'\"\n (click)=\"onConfirm()\"\n type=\"button\"\n >\n {{ config()?.confirmLabel }}\n </button>\n </div>\n }\n </div>\n `,\n styles: `\n :host {\n display: contents;\n }\n\n /* Animation styles using Tailwind animate utilities */\n [data-state='open'] {\n --tw-enter-opacity: 0;\n --tw-enter-scale: 0.95;\n }\n\n [data-state='closed'] {\n --tw-exit-opacity: 0;\n --tw-exit-scale: 0.95;\n }\n\n @media (prefers-reduced-motion: reduce) {\n [data-state='open'],\n [data-state='closed'] {\n animation: none;\n }\n }\n `,\n imports: [NgTemplateOutlet, ComButton],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ConfirmPanelComponent implements AfterViewInit {\n private readonly focusTrapFactory = inject(FocusTrapFactory);\n private focusTrap: FocusTrap | null = null;\n\n /** Reference to the panel element for focus trap. */\n private readonly panelElement = viewChild<ElementRef<HTMLElement>>('panelElement');\n\n /** Reference to the cancel button for initial focus. */\n private readonly cancelButton = viewChild<ElementRef<HTMLButtonElement>>('cancelButton');\n\n /** Panel configuration passed from the directive. */\n readonly config: WritableSignal<ConfirmPanelConfig | null> = signal(null);\n\n /** Whether the panel is visible (for animation state). */\n readonly visible: WritableSignal<boolean> = signal(false);\n\n /** Internal loading state for async operations. */\n readonly loading: WritableSignal<boolean> = signal(false);\n\n /** Function to confirm the action, set by directive. */\n readonly confirmFn: WritableSignal<() => void> = signal(() => {});\n\n /** Function to cancel the action, set by directive. */\n readonly cancelFn: WritableSignal<() => void> = signal(() => {});\n\n /** Computed template context for custom templates. */\n protected readonly templateContext: Signal<ConfirmTemplateContext> = computed(() => ({\n $implicit: this.config()?.message ?? '',\n title: this.config()?.title,\n confirm: () => this.onConfirm(),\n cancel: () => this.onCancel(),\n loading: this.loading(),\n setLoading: (value: boolean) => this.loading.set(value),\n }));\n\n /** Computed backdrop CSS classes. */\n protected readonly backdropClasses: Signal<string> = computed(() =>\n mergeClasses(confirmBackdropVariants({ visible: this.visible() })),\n );\n\n /** Computed panel CSS classes. */\n protected readonly panelClasses: Signal<string> = computed(() =>\n mergeClasses(confirmPanelVariants({ visible: this.visible() })),\n );\n\n /** Computed title CSS classes. */\n protected readonly titleClasses: Signal<string> = computed(() =>\n mergeClasses(confirmTitleVariants()),\n );\n\n /** Computed message CSS classes. */\n protected readonly messageClasses: Signal<string> = computed(() =>\n mergeClasses(confirmMessageVariants()),\n );\n\n /** Computed footer CSS classes. */\n protected readonly footerClasses: Signal<string> = computed(() =>\n mergeClasses(confirmFooterVariants()),\n );\n\n ngAfterViewInit(): void {\n this.setupFocusTrap();\n this.focusCancelButton();\n }\n\n /** Handle confirm button click. */\n protected onConfirm(): void {\n this.confirmFn()();\n }\n\n /** Handle cancel button click. */\n protected onCancel(): void {\n this.cancelFn()();\n }\n\n /** Clean up focus trap on destroy. */\n destroyFocusTrap(): void {\n this.focusTrap?.destroy();\n this.focusTrap = null;\n }\n\n private setupFocusTrap(): void {\n const panelEl = this.panelElement()?.nativeElement;\n if (panelEl) {\n this.focusTrap = this.focusTrapFactory.create(panelEl);\n this.focusTrap.focusInitialElementWhenReady();\n }\n }\n\n private focusCancelButton(): void {\n // Focus cancel button as safer default (prevents accidental confirmation)\n // Use setTimeout to ensure DOM is ready\n setTimeout(() => {\n const cancelBtn = this.cancelButton()?.nativeElement;\n if (cancelBtn) {\n cancelBtn.focus();\n }\n }, 0);\n }\n}\n","import {\n booleanAttribute,\n computed,\n DestroyRef,\n Directive,\n ElementRef,\n inject,\n Injector,\n input,\n output,\n PLATFORM_ID,\n signal,\n ViewContainerRef,\n} from '@angular/core';\nimport type {\n InputSignal,\n InputSignalWithTransform,\n OutputEmitterRef,\n Signal,\n TemplateRef,\n WritableSignal,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { filter } from 'rxjs/operators';\nimport { ConfirmPanelComponent } from './confirm-panel.component';\nimport { generateConfirmTitleId, generateConfirmDescriptionId } from './confirm.utils';\nimport type { ConfirmColor, ConfirmTemplateContext, ConfirmPanelConfig } from './confirm.models';\n\n/**\n * Confirmation directive — intercepts clicks and displays a confirmation panel\n * before allowing the action to proceed.\n *\n * The directive acts as an output gate: it captures clicks, shows confirmation UI,\n * and emits `true` (confirmed) or `false` (cancelled) through its output.\n *\n * @tokens `--color-popover`, `--color-popover-foreground`, `--color-border`,\n * `--color-foreground`, `--color-muted-foreground`, `--color-backdrop`,\n * `--shadow-lg`, `--radius-popover`\n *\n * @example Basic confirmation\n * ```html\n * <button comButton (comConfirm)=\"onDelete($event)\" confirmMessage=\"Delete this item?\">\n * Delete\n * </button>\n * ```\n *\n * @example Destructive action with warn styling\n * ```html\n * <button comButton color=\"warn\"\n * (comConfirm)=\"onPermanentDelete($event)\"\n * confirmTitle=\"Permanent Deletion\"\n * confirmMessage=\"This action cannot be undone.\"\n * confirmLabel=\"Delete Forever\"\n * confirmColor=\"warn\">\n * Delete Permanently\n * </button>\n * ```\n *\n * @example Custom template\n * ```html\n * <button comButton (comConfirm)=\"onAction($event)\" [confirmTpl]=\"customTpl\">\n * Action\n * </button>\n *\n * <ng-template #customTpl let-message let-confirm=\"confirm\" let-cancel=\"cancel\">\n * <div class=\"flex flex-col gap-4\">\n * <p>{{ message }}</p>\n * <div class=\"flex justify-end gap-2\">\n * <button comButton variant=\"ghost\" (click)=\"cancel()\">Cancel</button>\n * <button comButton (click)=\"confirm()\">Confirm</button>\n * </div>\n * </div>\n * </ng-template>\n * ```\n */\n@Directive({\n selector: '[comConfirm]',\n exportAs: 'comConfirm',\n host: {\n '[attr.aria-haspopup]': '\"dialog\"',\n '[attr.aria-expanded]': 'isOpen()',\n '(click)': 'onTriggerClick($event)',\n },\n})\nexport class ComConfirm {\n private readonly overlay = inject(Overlay);\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly injector = inject(Injector);\n private readonly destroyRef = inject(DestroyRef);\n private readonly platformId = inject(PLATFORM_ID);\n\n private overlayRef: OverlayRef | null = null;\n private panelInstance: ConfirmPanelComponent | null = null;\n private readonly titleId = generateConfirmTitleId();\n private readonly descriptionId = generateConfirmDescriptionId();\n\n /** Whether the confirmation panel is currently open. */\n protected readonly isOpen: WritableSignal<boolean> = signal(false);\n\n // ─── Content Inputs ───\n\n /** The confirmation message to display. */\n readonly confirmMessage: InputSignal<string> = input<string>('Are you sure?');\n\n /** Optional title for the confirmation dialog. */\n readonly confirmTitle: InputSignal<string | undefined> = input<string | undefined>(undefined);\n\n /** Label for the confirm button. */\n readonly confirmLabel: InputSignal<string> = input<string>('Confirm');\n\n /** Label for the cancel button. */\n readonly cancelLabel: InputSignal<string> = input<string>('Cancel');\n\n // ─── Styling Inputs ───\n\n /** Color variant for the confirm button. */\n readonly confirmColor: InputSignal<ConfirmColor> = input<ConfirmColor>('primary');\n\n // ─── Behavior Inputs ───\n\n /** When true, clicks pass through without showing confirmation. */\n readonly confirmDisabled: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Whether to show a backdrop behind the panel. */\n readonly confirmBackdrop: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Custom template for the panel content. */\n readonly confirmTpl: InputSignal<TemplateRef<ConfirmTemplateContext> | undefined> =\n input<TemplateRef<ConfirmTemplateContext> | undefined>(undefined);\n\n // ─── Output ───\n\n /**\n * Emits `true` when confirmed, `false` when cancelled or navigated away.\n * This is the main directive output — acts as an output gate for the action.\n */\n readonly comConfirm: OutputEmitterRef<boolean> = output<boolean>();\n\n // ─── Computed ───\n\n private readonly panelConfig: Signal<ConfirmPanelConfig> = computed(() => ({\n message: this.confirmMessage(),\n title: this.confirmTitle(),\n confirmLabel: this.confirmLabel(),\n cancelLabel: this.cancelLabel(),\n confirmColor: this.confirmColor(),\n hasBackdrop: this.confirmBackdrop(),\n customTemplate: this.confirmTpl(),\n titleId: this.titleId,\n descriptionId: this.descriptionId,\n }));\n\n constructor() {\n // Emit false and cleanup on destroy (navigation away)\n this.destroyRef.onDestroy(() => {\n if (this.isOpen()) {\n this.comConfirm.emit(false);\n }\n this.disposeOverlay();\n });\n }\n\n // ─── Public API ───\n\n /** Programmatically open the confirmation dialog. */\n open(): void {\n if (this.isOpen() || this.confirmDisabled()) return;\n this.createOverlay();\n this.attachPanel();\n }\n\n /** Programmatically close the confirmation dialog (emits false). */\n close(): void {\n if (!this.isOpen()) return;\n this.handleCancel();\n }\n\n // ─── Event Handlers ───\n\n protected onTriggerClick(event: Event): void {\n // If disabled, let the click pass through normally\n if (this.confirmDisabled()) return;\n\n // Intercept the click\n event.preventDefault();\n event.stopPropagation();\n\n this.open();\n }\n\n // ─── Overlay Management ───\n\n private createOverlay(): void {\n if (this.overlayRef) return;\n if (!isPlatformBrowser(this.platformId)) return;\n\n // Use GlobalPositionStrategy for centered modal\n const positionStrategy = this.overlay\n .position()\n .global()\n .centerHorizontally()\n .centerVertically();\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy: this.overlay.scrollStrategies.block(),\n hasBackdrop: false, // We handle backdrop in the panel component\n panelClass: 'com-confirm-overlay',\n disposeOnNavigation: true,\n });\n }\n\n private attachPanel(): void {\n if (!this.overlayRef || this.overlayRef.hasAttached()) return;\n\n const portal = new ComponentPortal(ConfirmPanelComponent, this.viewContainerRef, this.injector);\n const componentRef = this.overlayRef.attach(portal);\n this.panelInstance = componentRef.instance;\n\n // Configure panel\n this.panelInstance.config.set(this.panelConfig());\n this.panelInstance.confirmFn.set(() => this.handleConfirm());\n this.panelInstance.cancelFn.set(() => this.handleCancel());\n\n // Subscribe to keyboard events (Escape to cancel)\n this.overlayRef\n .keydownEvents()\n .pipe(\n filter((event) => event.key === 'Escape'),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((event) => {\n event.preventDefault();\n event.stopPropagation();\n this.handleCancel();\n });\n\n // Subscribe to detachments (cleanup)\n this.overlayRef\n .detachments()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.handleDetachment();\n });\n\n // Show panel after a microtask (allows initial styles to apply)\n requestAnimationFrame(() => {\n if (this.panelInstance) {\n this.panelInstance.visible.set(true);\n }\n });\n\n this.isOpen.set(true);\n }\n\n private handleConfirm(): void {\n if (!this.isOpen()) return;\n\n this.comConfirm.emit(true);\n this.closePanel();\n }\n\n private handleCancel(): void {\n if (!this.isOpen()) return;\n\n this.comConfirm.emit(false);\n this.closePanel();\n }\n\n private closePanel(): void {\n if (!this.panelInstance) return;\n\n // Trigger hide animation\n this.panelInstance.visible.set(false);\n\n // Wait for animation to complete before detaching\n setTimeout(() => {\n this.disposeOverlay();\n this.returnFocusToTrigger();\n }, 150); // Match animation duration\n }\n\n private handleDetachment(): void {\n this.isOpen.set(false);\n this.panelInstance?.destroyFocusTrap();\n this.panelInstance = null;\n }\n\n private disposeOverlay(): void {\n if (this.overlayRef) {\n this.panelInstance?.destroyFocusTrap();\n this.overlayRef.dispose();\n this.overlayRef = null;\n }\n this.panelInstance = null;\n this.isOpen.set(false);\n }\n\n private returnFocusToTrigger(): void {\n this.elementRef.nativeElement.focus();\n }\n}\n","// Public API for the confirm directive\n\n// Main directive\nexport { ComConfirm } from './confirm.directive';\n\n// Types and interfaces\nexport type { ConfirmTemplateContext, ConfirmColor } from './confirm.models';\n\n// Variants (for advanced customization)\nexport {\n confirmPanelVariants,\n confirmBackdropVariants,\n confirmTitleVariants,\n confirmMessageVariants,\n confirmFooterVariants,\n} from './confirm.variants';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|