ngx-com 0.1.16 → 0.1.18

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 (82) hide show
  1. package/fesm2022/ngx-com-components-alert-testing.mjs +80 -0
  2. package/fesm2022/ngx-com-components-alert-testing.mjs.map +1 -0
  3. package/fesm2022/ngx-com-components-calendar-testing.mjs +157 -0
  4. package/fesm2022/ngx-com-components-calendar-testing.mjs.map +1 -0
  5. package/fesm2022/ngx-com-components-carousel-testing.mjs +121 -0
  6. package/fesm2022/ngx-com-components-carousel-testing.mjs.map +1 -0
  7. package/fesm2022/ngx-com-components-checkbox-testing.mjs +113 -0
  8. package/fesm2022/ngx-com-components-checkbox-testing.mjs.map +1 -0
  9. package/fesm2022/ngx-com-components-checkbox.mjs +2 -2
  10. package/fesm2022/ngx-com-components-checkbox.mjs.map +1 -1
  11. package/fesm2022/ngx-com-components-code-block-testing.mjs +88 -0
  12. package/fesm2022/ngx-com-components-code-block-testing.mjs.map +1 -0
  13. package/fesm2022/ngx-com-components-collapsible-testing.mjs +104 -0
  14. package/fesm2022/ngx-com-components-collapsible-testing.mjs.map +1 -0
  15. package/fesm2022/ngx-com-components-confirm-testing.mjs +150 -0
  16. package/fesm2022/ngx-com-components-confirm-testing.mjs.map +1 -0
  17. package/fesm2022/ngx-com-components-datepicker-testing.mjs +137 -0
  18. package/fesm2022/ngx-com-components-datepicker-testing.mjs.map +1 -0
  19. package/fesm2022/ngx-com-components-dialog-testing.mjs +109 -0
  20. package/fesm2022/ngx-com-components-dialog-testing.mjs.map +1 -0
  21. package/fesm2022/ngx-com-components-dialog.mjs +18 -18
  22. package/fesm2022/ngx-com-components-dialog.mjs.map +1 -1
  23. package/fesm2022/ngx-com-components-dropdown.mjs +39 -0
  24. package/fesm2022/ngx-com-components-dropdown.mjs.map +1 -1
  25. package/fesm2022/ngx-com-components-form-field-testing.mjs +140 -0
  26. package/fesm2022/ngx-com-components-form-field-testing.mjs.map +1 -0
  27. package/fesm2022/ngx-com-components-form-field.mjs +5 -1
  28. package/fesm2022/ngx-com-components-form-field.mjs.map +1 -1
  29. package/fesm2022/ngx-com-components-menu-testing.mjs +298 -0
  30. package/fesm2022/ngx-com-components-menu-testing.mjs.map +1 -0
  31. package/fesm2022/ngx-com-components-paginator-testing.mjs +128 -0
  32. package/fesm2022/ngx-com-components-paginator-testing.mjs.map +1 -0
  33. package/fesm2022/ngx-com-components-popover-testing.mjs +115 -0
  34. package/fesm2022/ngx-com-components-popover-testing.mjs.map +1 -0
  35. package/fesm2022/ngx-com-components-radio-testing.mjs +157 -0
  36. package/fesm2022/ngx-com-components-radio-testing.mjs.map +1 -0
  37. package/fesm2022/ngx-com-components-radio.mjs +2 -2
  38. package/fesm2022/ngx-com-components-radio.mjs.map +1 -1
  39. package/fesm2022/ngx-com-components-segmented-control-testing.mjs +122 -0
  40. package/fesm2022/ngx-com-components-segmented-control-testing.mjs.map +1 -0
  41. package/fesm2022/ngx-com-components-sort-testing.mjs +108 -0
  42. package/fesm2022/ngx-com-components-sort-testing.mjs.map +1 -0
  43. package/fesm2022/ngx-com-components-switch-testing.mjs +103 -0
  44. package/fesm2022/ngx-com-components-switch-testing.mjs.map +1 -0
  45. package/fesm2022/ngx-com-components-switch.mjs +2 -2
  46. package/fesm2022/ngx-com-components-switch.mjs.map +1 -1
  47. package/fesm2022/ngx-com-components-table-testing.mjs +198 -0
  48. package/fesm2022/ngx-com-components-table-testing.mjs.map +1 -0
  49. package/fesm2022/ngx-com-components-tabs-testing.mjs +126 -0
  50. package/fesm2022/ngx-com-components-tabs-testing.mjs.map +1 -0
  51. package/fesm2022/ngx-com-components-timepicker-testing.mjs +117 -0
  52. package/fesm2022/ngx-com-components-timepicker-testing.mjs.map +1 -0
  53. package/fesm2022/ngx-com-components-toast-testing.mjs +172 -0
  54. package/fesm2022/ngx-com-components-toast-testing.mjs.map +1 -0
  55. package/fesm2022/ngx-com-components-toast.mjs +4 -4
  56. package/fesm2022/ngx-com-components-toast.mjs.map +1 -1
  57. package/fesm2022/ngx-com-components-tooltip-testing.mjs +117 -0
  58. package/fesm2022/ngx-com-components-tooltip-testing.mjs.map +1 -0
  59. package/package.json +89 -1
  60. package/types/ngx-com-components-alert-testing.d.ts +41 -0
  61. package/types/ngx-com-components-calendar-testing.d.ts +80 -0
  62. package/types/ngx-com-components-carousel-testing.d.ts +51 -0
  63. package/types/ngx-com-components-checkbox-testing.d.ts +56 -0
  64. package/types/ngx-com-components-code-block-testing.d.ts +45 -0
  65. package/types/ngx-com-components-collapsible-testing.d.ts +53 -0
  66. package/types/ngx-com-components-confirm-testing.d.ts +78 -0
  67. package/types/ngx-com-components-datepicker-testing.d.ts +61 -0
  68. package/types/ngx-com-components-dialog-testing.d.ts +57 -0
  69. package/types/ngx-com-components-dropdown.d.ts +12 -0
  70. package/types/ngx-com-components-form-field-testing.d.ts +61 -0
  71. package/types/ngx-com-components-menu-testing.d.ts +167 -0
  72. package/types/ngx-com-components-paginator-testing.d.ts +58 -0
  73. package/types/ngx-com-components-popover-testing.d.ts +63 -0
  74. package/types/ngx-com-components-radio-testing.d.ts +86 -0
  75. package/types/ngx-com-components-segmented-control-testing.d.ts +66 -0
  76. package/types/ngx-com-components-sort-testing.d.ts +62 -0
  77. package/types/ngx-com-components-switch-testing.d.ts +52 -0
  78. package/types/ngx-com-components-table-testing.d.ts +124 -0
  79. package/types/ngx-com-components-tabs-testing.d.ts +67 -0
  80. package/types/ngx-com-components-timepicker-testing.d.ts +53 -0
  81. package/types/ngx-com-components-toast-testing.d.ts +93 -0
  82. package/types/ngx-com-components-tooltip-testing.d.ts +57 -0
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-com-components-toast.mjs","sources":["../../../projects/com/components/toast/toast.ref.ts","../../../projects/com/components/toast/toast.variants.ts","../../../projects/com/components/toast/toast.utils.ts","../../../projects/com/components/toast/toast.component.ts","../../../projects/com/components/toast/toast.providers.ts","../../../projects/com/components/toast/toast-container.component.ts","../../../projects/com/components/toast/toast.service.ts","../../../projects/com/components/toast/index.ts","../../../projects/com/components/toast/ngx-com-components-toast.ts"],"sourcesContent":["import { Observable, Subject } from 'rxjs';\nimport type { ComToastDismissEvent } from './toast.models';\n\n/**\n * Reference to an active toast notification.\n * Returned by `ComToastService` methods for programmatic control.\n */\nexport class ComToastRef {\n private readonly dismissSubject = new Subject<ComToastDismissEvent>();\n private readonly actionSubject = new Subject<void>();\n private readonly dismissFn: () => void;\n private dismissed = false;\n\n constructor(dismissFn: () => void) {\n this.dismissFn = dismissFn;\n }\n\n /** Programmatically dismiss the toast. */\n dismiss(): void {\n if (!this.dismissed) {\n this.dismissFn();\n }\n }\n\n /** Emits once when the toast is dismissed (for any reason). */\n afterDismissed(): Observable<ComToastDismissEvent> {\n return this.dismissSubject.asObservable();\n }\n\n /** Emits when the action button is clicked. */\n afterAction(): Observable<void> {\n return this.actionSubject.asObservable();\n }\n\n /** @internal */\n _notifyDismissed(event: ComToastDismissEvent): void {\n if (this.dismissed) return;\n this.dismissed = true;\n this.dismissSubject.next(event);\n this.dismissSubject.complete();\n this.actionSubject.complete();\n }\n\n /** @internal */\n _notifyAction(): void {\n this.actionSubject.next();\n }\n}\n","import { cva } from 'class-variance-authority';\nimport type { ComToastType, ComToastPosition } from './toast.models';\n\n/**\n * CVA variants for an individual toast card.\n *\n * @tokens `--color-success`, `--color-success-foreground`,\n * `--color-warn`, `--color-warn-foreground`,\n * `--color-warn-subtle`, `--color-warn-subtle-foreground`,\n * `--color-primary-subtle`, `--color-primary-subtle-foreground`,\n * `--color-border`, `--shadow-overlay`, `--radius-card`\n */\nexport const toastVariants: (props?: {\n type?: ComToastType;\n}) => string = cva(\n [\n 'flex',\n 'w-full',\n 'max-w-sm',\n 'items-start',\n 'gap-3',\n 'rounded-card',\n 'border',\n 'p-4',\n 'shadow-overlay',\n 'pointer-events-auto',\n 'relative',\n 'overflow-hidden',\n ],\n {\n variants: {\n type: {\n success: 'bg-success text-success-foreground border-success',\n warn: 'bg-warn-subtle text-warn-subtle-foreground border-warn',\n error: 'bg-warn text-warn-foreground border-warn',\n info: 'bg-primary-subtle text-primary-subtle-foreground border-primary',\n },\n },\n defaultVariants: {\n type: 'info',\n },\n },\n);\n\n/**\n * CVA variants for the toast container positioning.\n */\nexport const toastContainerVariants: (props?: {\n position?: ComToastPosition;\n}) => string = cva(\n [\n 'flex',\n 'gap-3',\n 'pointer-events-none',\n 'max-h-screen',\n 'p-4',\n ],\n {\n variants: {\n position: {\n 'top-right': 'flex-col items-end',\n 'top-left': 'flex-col items-start',\n 'top-center': 'flex-col items-center',\n 'bottom-right': 'flex-col-reverse items-end',\n 'bottom-left': 'flex-col-reverse items-start',\n 'bottom-center': 'flex-col-reverse items-center',\n },\n },\n defaultVariants: {\n position: 'bottom-right',\n },\n },\n);\n\n/**\n * CVA variants for the toast progress bar.\n */\nexport const toastProgressVariants: (props?: {\n type?: ComToastType;\n}) => string = cva(\n [\n 'absolute',\n 'bottom-0',\n 'left-0',\n 'h-0.5',\n 'rounded-pill',\n ],\n {\n variants: {\n type: {\n success: 'bg-success-foreground-track',\n warn: 'bg-warn-subtle-foreground-track',\n error: 'bg-warn-foreground-track',\n info: 'bg-primary-subtle-foreground-track',\n },\n },\n defaultVariants: {\n type: 'info',\n },\n },\n);\n\n/**\n * CVA variants for the toast close button.\n *\n * @tokens `--color-ring`, `--radius-card`,\n * `--color-success-foreground-muted`, `--color-warn-subtle-foreground-muted`,\n * `--color-warn-foreground-muted`, `--color-primary-subtle-foreground-muted`\n */\nexport const toastCloseButtonVariants: (props?: {\n type?: ComToastType;\n}) => string = cva(\n [\n 'shrink-0',\n 'rounded-card',\n 'p-0.5',\n 'transition-colors',\n 'outline-none',\n 'focus-visible:outline-2',\n 'focus-visible:outline-offset-2',\n 'focus-visible:outline-[--color-ring]',\n ],\n {\n variants: {\n type: {\n success: 'text-success-foreground-muted hover:text-success-foreground',\n warn: 'text-warn-subtle-foreground-muted hover:text-warn-subtle-foreground',\n error: 'text-warn-foreground-muted hover:text-warn-foreground',\n info: 'text-primary-subtle-foreground-muted hover:text-primary-subtle-foreground',\n },\n },\n defaultVariants: {\n type: 'info',\n },\n },\n);\n","export { mergeClasses } from 'ngx-com/utils';\n\nlet toastIdCounter = 0;\n\n/**\n * Generate a unique ID for a toast notification.\n */\nexport function generateToastId(): number {\n return ++toastIdCounter;\n}\n\n/** Default Lucide icon names per toast type. */\nexport const DEFAULT_TOAST_ICONS: Record<string, string> = {\n success: 'circle-check',\n warn: 'triangle-alert',\n error: 'circle-x',\n info: 'info',\n};\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\nimport type { InputSignal, OutputEmitterRef, Signal } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ComIcon } from 'ngx-com/components/icon';\nimport {\n toastVariants,\n toastProgressVariants,\n toastCloseButtonVariants,\n} from './toast.variants';\nimport { mergeClasses, DEFAULT_TOAST_ICONS } from './toast.utils';\nimport type { ComToastState, ComToastTemplateContext } from './toast.models';\n\n/**\n * Internal toast notification component rendered inside the container.\n *\n * @internal Not exported in public API\n *\n * @tokens `--color-success`, `--color-success-foreground`,\n * `--color-warn`, `--color-warn-foreground`,\n * `--color-warn-subtle`, `--color-warn-subtle-foreground`,\n * `--color-primary-subtle`, `--color-primary-subtle-foreground`,\n * `--color-border`, `--shadow-overlay`, `--radius-card`, `--color-ring`\n */\n@Component({\n selector: 'com-toast',\n template: `\n <div\n [class]=\"toastClasses()\"\n [attr.role]=\"ariaRole()\"\n [attr.aria-live]=\"ariaLive()\"\n [attr.data-state]=\"state().visible ? 'open' : 'closed'\"\n (animationend)=\"onAnimationEnd()\"\n >\n @if (state().data.customTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"state().data.customTemplate!\"\n [ngTemplateOutletContext]=\"templateContext()\"\n />\n } @else {\n <com-icon\n [name]=\"resolvedIcon()\"\n size=\"md\"\n class=\"mt-0.5 shrink-0\"\n aria-hidden=\"true\"\n />\n <div class=\"flex-1 min-w-0\">\n @if (state().data.title) {\n <p class=\"text-sm font-semibold\">{{ state().data.title }}</p>\n }\n <p class=\"text-sm\" [class.mt-1]=\"state().data.title\">\n {{ state().data.message }}\n </p>\n @if (state().data.action) {\n <button\n type=\"button\"\n class=\"mt-2 text-sm font-medium underline underline-offset-4\n outline-none\n focus-visible:outline-2\n focus-visible:outline-offset-2\n focus-visible:outline-[--color-ring]\"\n (click)=\"onAction.emit(state().id)\"\n >\n {{ state().data.action!.label }}\n </button>\n }\n </div>\n @if (state().showClose) {\n <button\n type=\"button\"\n [class]=\"closeButtonClasses()\"\n aria-label=\"Dismiss notification\"\n (click)=\"onDismiss.emit(state().id)\"\n >\n <com-icon name=\"x\" size=\"sm\" aria-hidden=\"true\" />\n </button>\n }\n }\n @if (state().showProgress && state().duration > 0) {\n <div\n [class]=\"progressClasses()\"\n [style.width.%]=\"state().remainingPercent\"\n ></div>\n }\n </div>\n `,\n styles: `\n :host {\n display: contents;\n }\n\n [data-state='open'] {\n --tw-enter-opacity: 0;\n --tw-enter-translate-x: 0;\n --tw-enter-translate-y: 0;\n }\n\n [data-state='closed'] {\n --tw-exit-opacity: 0;\n --tw-exit-translate-x: 0;\n --tw-exit-translate-y: 0;\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, ComIcon],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ComToastComponent {\n /** The toast state, set by the container. */\n readonly state: InputSignal<ComToastState> = input.required<ComToastState>();\n\n /** Emitted when the toast should be dismissed. */\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix -- intentional API naming for toast event delegation\n readonly onDismiss: OutputEmitterRef<number> = output<number>();\n\n /** Emitted when the action button is clicked. */\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix -- intentional API naming for toast event delegation\n readonly onAction: OutputEmitterRef<number> = output<number>();\n\n /** Emitted when the mouse enters the toast. */\n readonly mouseEnter: OutputEmitterRef<void> = output<void>();\n\n /** Emitted when the mouse leaves the toast. */\n readonly mouseLeave: OutputEmitterRef<void> = output<void>();\n\n /** Emitted when the exit animation completes. */\n readonly animationDone: OutputEmitterRef<number> = output<number>();\n\n /** Resolved icon name. */\n protected readonly resolvedIcon: Signal<string> = computed(\n () => this.state().data.icon ?? DEFAULT_TOAST_ICONS[this.state().type] ?? 'info',\n );\n\n /** ARIA role based on toast type. */\n protected readonly ariaRole: Signal<string> = computed(() =>\n this.state().type === 'error' ? 'alert' : 'status',\n );\n\n /** ARIA live region politeness. */\n protected readonly ariaLive: Signal<string> = computed(() =>\n this.state().type === 'error' ? 'assertive' : 'polite',\n );\n\n /** Computed toast card classes. */\n protected readonly toastClasses: Signal<string> = computed(() =>\n mergeClasses(\n toastVariants({ type: this.state().type }),\n this.state().visible\n ? 'animate-in fade-in-0 slide-in-from-bottom-2'\n : 'animate-out fade-out-0 slide-out-to-right-full',\n ),\n );\n\n /** Computed progress bar classes. */\n protected readonly progressClasses: Signal<string> = computed(() =>\n mergeClasses(toastProgressVariants({ type: this.state().type })),\n );\n\n /** Computed close button classes. */\n protected readonly closeButtonClasses: Signal<string> = computed(() =>\n mergeClasses(toastCloseButtonVariants({ type: this.state().type })),\n );\n\n /** Template context for custom templates. */\n protected readonly templateContext: Signal<ComToastTemplateContext> = computed(() => ({\n $implicit: this.state().data,\n dismiss: () => this.onDismiss.emit(this.state().id),\n action: () => this.onAction.emit(this.state().id),\n }));\n\n protected onAnimationEnd(): void {\n if (!this.state().visible) {\n this.animationDone.emit(this.state().id);\n }\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport type { Provider } from '@angular/core';\nimport type { ComToastConfig, ComToastContainerData } from './toast.models';\n\n/**\n * Injection token for global toast configuration.\n */\nexport const COM_TOAST_CONFIG: InjectionToken<ComToastConfig> =\n new InjectionToken<ComToastConfig>('COM_TOAST_CONFIG');\n\n/**\n * Injection token for internal container communication.\n * @internal\n */\nexport const COM_TOAST_CONTAINER_DATA: InjectionToken<ComToastContainerData> =\n new InjectionToken<ComToastContainerData>('COM_TOAST_CONTAINER_DATA');\n\n/**\n * Provides global toast configuration.\n *\n * @example\n * ```typescript\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideComToastConfig({ position: 'top-center', duration: 3000 }),\n * ],\n * });\n * ```\n */\nexport function provideComToastConfig(config: ComToastConfig): Provider {\n return { provide: COM_TOAST_CONFIG, useValue: config };\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n} from '@angular/core';\nimport type { Signal } from '@angular/core';\nimport { ComToastComponent } from './toast.component';\nimport { toastContainerVariants } from './toast.variants';\nimport { mergeClasses } from './toast.utils';\nimport { COM_TOAST_CONTAINER_DATA } from './toast.providers';\nimport type { ComToastContainerData, ComToastState } from './toast.models';\n\n/**\n * Internal toast container component that manages positioning and stacking.\n *\n * @internal Not exported in public API\n *\n * @tokens `--color-success`, `--color-success-foreground`,\n * `--color-warn`, `--color-warn-foreground`,\n * `--color-warn-subtle`, `--color-warn-subtle-foreground`,\n * `--color-primary-subtle`, `--color-primary-subtle-foreground`,\n * `--color-border`, `--shadow-overlay`, `--radius-card`\n */\n@Component({\n selector: 'com-toast-container',\n host: {\n '(keydown.escape)': 'onEscapeKey()',\n tabindex: '-1',\n },\n template: `\n <div\n [class]=\"containerClasses()\"\n role=\"region\"\n aria-label=\"Notifications\"\n >\n @for (toast of toasts(); track toast.id) {\n <com-toast\n [state]=\"toast\"\n (onDismiss)=\"containerData.onDismiss($event)\"\n (onAction)=\"containerData.onAction($event)\"\n (mouseEnter)=\"containerData.onMouseEnter(toast.id)\"\n (mouseLeave)=\"containerData.onMouseLeave(toast.id)\"\n (animationDone)=\"containerData.onAnimationDone($event)\"\n />\n }\n </div>\n `,\n styles: `\n :host {\n display: contents;\n }\n `,\n imports: [ComToastComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ComToastContainerComponent {\n protected readonly containerData: ComToastContainerData = inject(COM_TOAST_CONTAINER_DATA);\n\n /** Active toast states, read from the service's signal. */\n protected readonly toasts: Signal<ComToastState[]> = computed(() => this.containerData.toasts());\n\n /** Computed container positioning classes. */\n protected readonly containerClasses: Signal<string> = computed(() =>\n mergeClasses(toastContainerVariants({ position: this.containerData.position() })),\n );\n\n protected onEscapeKey(): void {\n this.containerData.onDismissLatest();\n }\n}\n","import {\n DestroyRef,\n inject,\n Injectable,\n Injector,\n PLATFORM_ID,\n signal,\n} from '@angular/core';\nimport type { WritableSignal } from '@angular/core';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { Overlay } from '@angular/cdk/overlay';\nimport type { GlobalPositionStrategy, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { ComToastRef } from './toast.ref';\nimport { ComToastContainerComponent } from './toast-container.component';\nimport { COM_TOAST_CONFIG, COM_TOAST_CONTAINER_DATA } from './toast.providers';\nimport { generateToastId } from './toast.utils';\nimport type {\n ComToastConfig,\n ComToastContainerData,\n ComToastData,\n ComToastDismissReason,\n ComToastPosition,\n ComToastState,\n ComToastTimerState,\n ComToastType,\n} from './toast.models';\n\n/** Default durations by toast type. */\nconst DEFAULT_DURATION: Record<ComToastType, number> = {\n success: 5000,\n warn: 5000,\n error: 0,\n info: 5000,\n};\n\n/** Fallback timeout for exit animation removal when animationend doesn't fire. */\nconst ANIMATION_FALLBACK_MS = 200;\n\n/**\n * Service for creating toast notifications imperatively.\n *\n * @example\n * ```typescript\n * const toast = inject(ComToastService);\n * toast.success('File uploaded successfully.');\n * toast.error('Failed to save.', 'Error');\n *\n * const ref = toast.show({ type: 'info', message: 'Item deleted.', action: { label: 'Undo' } });\n * ref.afterAction().subscribe(() => undoDelete());\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class ComToastService {\n private readonly overlay = inject(Overlay);\n private readonly injector = inject(Injector);\n private readonly destroyRef = inject(DestroyRef);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly document = inject(DOCUMENT);\n private readonly globalConfig = inject(COM_TOAST_CONFIG, { optional: true });\n\n private overlayRef: OverlayRef | null = null;\n private readonly toasts: WritableSignal<ComToastState[]> = signal([]);\n private readonly position: WritableSignal<ComToastPosition>;\n private readonly timers = new Map<number, ComToastTimerState>();\n private readonly refs = new Map<number, ComToastRef>();\n private readonly animationFallbacks = new Map<number, ReturnType<typeof setTimeout>>();\n private readonly dismissReasons = new Map<number, ComToastDismissReason>();\n private rafHandle: number | null = null;\n\n private readonly config: Required<ComToastConfig>;\n\n constructor() {\n this.config = {\n position: 'bottom-right',\n duration: 5000,\n maxVisible: 5,\n pauseOnHover: true,\n showProgress: true,\n showClose: true,\n ...this.globalConfig,\n };\n this.position = signal(this.config.position);\n this.destroyRef.onDestroy(() => this.dispose());\n }\n\n /**\n * Show a toast notification with full configuration.\n */\n show(data: ComToastData): ComToastRef {\n this.ensureContainer();\n\n const id = generateToastId();\n const type: ComToastType = data.type ?? 'info';\n const duration = data.duration ?? DEFAULT_DURATION[type] ?? this.config.duration;\n const showProgress = data.showProgress ?? this.config.showProgress;\n const showClose = data.showClose ?? this.config.showClose;\n\n const ref = new ComToastRef(() => this.dismiss(id, 'manual'));\n this.refs.set(id, ref);\n\n const state: ComToastState = {\n id,\n data,\n type,\n duration,\n showProgress,\n showClose,\n visible: true,\n remainingPercent: 100,\n };\n\n this.toasts.update((list) => [...list, state]);\n this.enforceMaxVisible();\n\n if (duration > 0) {\n this.startTimer(id, duration);\n }\n\n return ref;\n }\n\n /** Show a success toast. */\n success(message: string, title?: string): ComToastRef {\n return this.showByType('success', message, title);\n }\n\n /** Show a warning toast. */\n warn(message: string, title?: string): ComToastRef {\n return this.showByType('warn', message, title);\n }\n\n /** Show an error toast. */\n error(message: string, title?: string): ComToastRef {\n return this.showByType('error', message, title);\n }\n\n /** Show an info toast. */\n info(message: string, title?: string): ComToastRef {\n return this.showByType('info', message, title);\n }\n\n /** Dismiss all active toasts. */\n dismissAll(): void {\n for (const toast of this.toasts()) {\n this.dismiss(toast.id, 'manual');\n }\n }\n\n // ─── Private ───\n\n private showByType(type: ComToastType, message: string, title?: string): ComToastRef {\n const data: ComToastData = { type, message };\n if (title !== undefined) data.title = title;\n return this.show(data);\n }\n\n private ensureContainer(): void {\n if (this.overlayRef || !isPlatformBrowser(this.platformId)) return;\n\n const positionStrategy = this.buildPositionStrategy(this.config.position);\n\n const containerData: ComToastContainerData = {\n toasts: this.toasts.asReadonly(),\n position: this.position.asReadonly(),\n onMouseEnter: (id: number) => this.pauseTimer(id),\n onMouseLeave: (id: number) => this.resumeTimer(id),\n onDismiss: (id: number) => this.dismiss(id, 'manual'),\n onAction: (id: number) => this.handleAction(id),\n onDismissLatest: () => this.dismissLatest(),\n onAnimationDone: (id: number) => this.removeToast(id),\n };\n\n const containerInjector = Injector.create({\n providers: [{ provide: COM_TOAST_CONTAINER_DATA, useValue: containerData }],\n parent: this.injector,\n });\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy: this.overlay.scrollStrategies.noop(),\n hasBackdrop: false,\n panelClass: 'com-toast-overlay',\n disposeOnNavigation: false,\n });\n\n const portal = new ComponentPortal(ComToastContainerComponent, null, containerInjector);\n this.overlayRef.attach(portal);\n }\n\n private buildPositionStrategy(position: ComToastPosition): GlobalPositionStrategy {\n const strategy = this.overlay.position().global();\n\n switch (position) {\n case 'top-right':\n return strategy.top('0').right('0');\n case 'top-left':\n return strategy.top('0').left('0');\n case 'top-center':\n return strategy.top('0').centerHorizontally();\n case 'bottom-right':\n return strategy.bottom('0').right('0');\n case 'bottom-left':\n return strategy.bottom('0').left('0');\n case 'bottom-center':\n return strategy.bottom('0').centerHorizontally();\n }\n }\n\n private dismiss(id: number, reason: ComToastDismissReason): void {\n this.clearTimer(id);\n this.dismissReasons.set(id, reason);\n\n // Trigger exit animation\n this.updateToast(id, { visible: false });\n\n // Set fallback timeout in case animationend doesn't fire\n const fallback = setTimeout(() => this.removeToast(id), ANIMATION_FALLBACK_MS);\n this.animationFallbacks.set(id, fallback);\n }\n\n private removeToast(id: number): void {\n // Clear animation fallback\n const fallback = this.animationFallbacks.get(id);\n if (fallback) {\n clearTimeout(fallback);\n this.animationFallbacks.delete(id);\n }\n\n // Check if toast still exists (may have been removed already)\n if (!this.toasts().some((t) => t.id === id)) return;\n\n this.toasts.update((list) => list.filter((t) => t.id !== id));\n\n const reason = this.dismissReasons.get(id) ?? 'auto';\n this.dismissReasons.delete(id);\n\n const ref = this.refs.get(id);\n if (ref) {\n ref._notifyDismissed({ reason });\n this.refs.delete(id);\n }\n\n if (this.toasts().length === 0) {\n this.disposeOverlay();\n }\n }\n\n private handleAction(id: number): void {\n const ref = this.refs.get(id);\n if (ref) {\n ref._notifyAction();\n }\n this.dismiss(id, 'action');\n }\n\n private dismissLatest(): void {\n const visible = this.toasts().filter((t) => t.visible);\n const latest = visible[visible.length - 1];\n if (latest) {\n this.dismiss(latest.id, 'manual');\n }\n }\n\n private enforceMaxVisible(): void {\n const currentToasts = this.toasts();\n const visibleCount = currentToasts.filter((t) => t.visible).length;\n\n if (visibleCount > this.config.maxVisible) {\n const oldest = currentToasts.find((t) => t.visible);\n if (oldest) {\n this.dismiss(oldest.id, 'limit');\n }\n }\n }\n\n // ─── Timer (rAF) ───\n\n private startTimer(id: number, duration: number): void {\n const now = this.now();\n this.timers.set(id, {\n startTime: now,\n elapsed: 0,\n duration,\n paused: false,\n pausedAt: 0,\n });\n\n this.ensureRafLoop();\n }\n\n private ensureRafLoop(): void {\n if (this.rafHandle !== null) return;\n\n const win = this.document.defaultView;\n if (!win) return;\n\n const tick = (): void => {\n const now = this.now();\n let needsUpdate = false;\n\n for (const [id, timer] of this.timers) {\n if (timer.paused) continue;\n\n const elapsed = timer.elapsed + (now - timer.startTime);\n const remaining = Math.max(0, 100 - (elapsed / timer.duration) * 100);\n const rounded = Math.round(remaining);\n\n // Find current state to compare\n const toast = this.toasts().find((t) => t.id === id);\n if (!toast || !toast.visible) {\n this.clearTimer(id);\n continue;\n }\n\n if (Math.round(toast.remainingPercent) !== rounded) {\n needsUpdate = true;\n }\n\n if (remaining <= 0) {\n this.clearTimer(id);\n this.dismiss(id, 'auto');\n needsUpdate = true;\n }\n }\n\n // Batch-update all progress values in a single signal write\n if (needsUpdate) {\n const now2 = this.now();\n this.toasts.update((list) =>\n list.map((t) => {\n const timer = this.timers.get(t.id);\n if (!timer || timer.paused) return t;\n\n const elapsed = timer.elapsed + (now2 - timer.startTime);\n const remaining = Math.max(0, 100 - (elapsed / timer.duration) * 100);\n return { ...t, remainingPercent: remaining };\n }),\n );\n }\n\n // Continue loop if there are active timers\n if (this.timers.size > 0) {\n this.rafHandle = win.requestAnimationFrame(tick);\n } else {\n this.rafHandle = null;\n }\n };\n\n this.rafHandle = win.requestAnimationFrame(tick);\n }\n\n private pauseTimer(id: number): void {\n if (!this.config.pauseOnHover) return;\n\n const timer = this.timers.get(id);\n if (!timer || timer.paused) return;\n\n const now = this.now();\n timer.elapsed += now - timer.startTime;\n timer.paused = true;\n timer.pausedAt = now;\n }\n\n private resumeTimer(id: number): void {\n if (!this.config.pauseOnHover) return;\n\n const timer = this.timers.get(id);\n if (!timer || !timer.paused) return;\n\n timer.paused = false;\n timer.startTime = this.now();\n }\n\n private clearTimer(id: number): void {\n this.timers.delete(id);\n }\n\n private now(): number {\n return this.document.defaultView?.performance.now() ?? Date.now();\n }\n\n // ─── Helpers ───\n\n private updateToast(id: number, patch: Partial<ComToastState>): void {\n this.toasts.update((list) =>\n list.map((t) => (t.id === id ? { ...t, ...patch } : t)),\n );\n }\n\n private disposeOverlay(): void {\n if (this.overlayRef) {\n this.overlayRef.dispose();\n this.overlayRef = null;\n }\n\n const win = this.document.defaultView;\n if (this.rafHandle !== null && win) {\n win.cancelAnimationFrame(this.rafHandle);\n this.rafHandle = null;\n }\n }\n\n private dispose(): void {\n for (const id of this.timers.keys()) {\n this.clearTimer(id);\n }\n for (const [, fallback] of this.animationFallbacks) {\n clearTimeout(fallback);\n }\n this.animationFallbacks.clear();\n this.dismissReasons.clear();\n this.refs.clear();\n this.disposeOverlay();\n }\n}\n","// Public API for the toast notification system\n\n// Service\nexport { ComToastService } from './toast.service';\n\n// Ref\nexport { ComToastRef } from './toast.ref';\n\n// Types and interfaces\nexport type {\n ComToastConfig,\n ComToastData,\n ComToastType,\n ComToastPosition,\n ComToastDismissEvent,\n ComToastDismissReason,\n ComToastTemplateContext,\n} from './toast.models';\n\n// Providers\nexport { provideComToastConfig, COM_TOAST_CONFIG } from './toast.providers';\n\n// Variants (for advanced customization)\nexport {\n toastVariants,\n toastContainerVariants,\n toastProgressVariants,\n toastCloseButtonVariants,\n} from './toast.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-toast.mjs","sources":["../../../projects/com/components/toast/toast.ref.ts","../../../projects/com/components/toast/toast.variants.ts","../../../projects/com/components/toast/toast.utils.ts","../../../projects/com/components/toast/toast.component.ts","../../../projects/com/components/toast/toast.providers.ts","../../../projects/com/components/toast/toast-container.component.ts","../../../projects/com/components/toast/toast.service.ts","../../../projects/com/components/toast/index.ts","../../../projects/com/components/toast/ngx-com-components-toast.ts"],"sourcesContent":["import { Observable, Subject } from 'rxjs';\nimport type { ComToastDismissEvent } from './toast.models';\n\n/**\n * Reference to an active toast notification.\n * Returned by `ComToastService` methods for programmatic control.\n */\nexport class ComToastRef {\n private readonly dismissSubject = new Subject<ComToastDismissEvent>();\n private readonly actionSubject = new Subject<void>();\n private readonly dismissFn: () => void;\n private dismissed = false;\n\n constructor(dismissFn: () => void) {\n this.dismissFn = dismissFn;\n }\n\n /** Programmatically dismiss the toast. */\n dismiss(): void {\n if (!this.dismissed) {\n this.dismissFn();\n }\n }\n\n /** Emits once when the toast is dismissed (for any reason). */\n afterDismissed(): Observable<ComToastDismissEvent> {\n return this.dismissSubject.asObservable();\n }\n\n /** Emits when the action button is clicked. */\n afterAction(): Observable<void> {\n return this.actionSubject.asObservable();\n }\n\n /** @internal */\n _notifyDismissed(event: ComToastDismissEvent): void {\n if (this.dismissed) return;\n this.dismissed = true;\n this.dismissSubject.next(event);\n this.dismissSubject.complete();\n this.actionSubject.complete();\n }\n\n /** @internal */\n _notifyAction(): void {\n this.actionSubject.next();\n }\n}\n","import { cva } from 'class-variance-authority';\nimport type { ComToastType, ComToastPosition } from './toast.models';\n\n/**\n * CVA variants for an individual toast card.\n *\n * @tokens `--color-success`, `--color-success-foreground`,\n * `--color-warn`, `--color-warn-foreground`,\n * `--color-warn-subtle`, `--color-warn-subtle-foreground`,\n * `--color-primary-subtle`, `--color-primary-subtle-foreground`,\n * `--color-border`, `--shadow-overlay`, `--radius-card`\n */\nexport const toastVariants: (props?: {\n type?: ComToastType;\n}) => string = cva(\n [\n 'flex',\n 'w-full',\n 'max-w-sm',\n 'items-start',\n 'gap-3',\n 'rounded-card',\n 'border',\n 'p-4',\n 'shadow-overlay',\n 'pointer-events-auto',\n 'relative',\n 'overflow-hidden',\n ],\n {\n variants: {\n type: {\n success: 'bg-success text-success-foreground border-success',\n warn: 'bg-warn-subtle text-warn-subtle-foreground border-warn',\n error: 'bg-warn text-warn-foreground border-warn',\n info: 'bg-primary-subtle text-primary-subtle-foreground border-primary',\n },\n },\n defaultVariants: {\n type: 'info',\n },\n },\n);\n\n/**\n * CVA variants for the toast container positioning.\n */\nexport const toastContainerVariants: (props?: {\n position?: ComToastPosition;\n}) => string = cva(\n [\n 'flex',\n 'gap-3',\n 'pointer-events-none',\n 'max-h-screen',\n 'p-4',\n ],\n {\n variants: {\n position: {\n 'top-right': 'flex-col items-end',\n 'top-left': 'flex-col items-start',\n 'top-center': 'flex-col items-center',\n 'bottom-right': 'flex-col-reverse items-end',\n 'bottom-left': 'flex-col-reverse items-start',\n 'bottom-center': 'flex-col-reverse items-center',\n },\n },\n defaultVariants: {\n position: 'bottom-right',\n },\n },\n);\n\n/**\n * CVA variants for the toast progress bar.\n */\nexport const toastProgressVariants: (props?: {\n type?: ComToastType;\n}) => string = cva(\n [\n 'absolute',\n 'bottom-0',\n 'left-0',\n 'h-0.5',\n 'rounded-pill',\n ],\n {\n variants: {\n type: {\n success: 'bg-success-foreground-track',\n warn: 'bg-warn-subtle-foreground-track',\n error: 'bg-warn-foreground-track',\n info: 'bg-primary-subtle-foreground-track',\n },\n },\n defaultVariants: {\n type: 'info',\n },\n },\n);\n\n/**\n * CVA variants for the toast close button.\n *\n * @tokens `--color-ring`, `--radius-card`,\n * `--color-success-foreground-muted`, `--color-warn-subtle-foreground-muted`,\n * `--color-warn-foreground-muted`, `--color-primary-subtle-foreground-muted`\n */\nexport const toastCloseButtonVariants: (props?: {\n type?: ComToastType;\n}) => string = cva(\n [\n 'shrink-0',\n 'rounded-card',\n 'p-0.5',\n 'transition-colors',\n 'outline-none',\n 'focus-visible:outline-2',\n 'focus-visible:outline-offset-2',\n 'focus-visible:outline-[--color-ring]',\n ],\n {\n variants: {\n type: {\n success: 'text-success-foreground-muted hover:text-success-foreground',\n warn: 'text-warn-subtle-foreground-muted hover:text-warn-subtle-foreground',\n error: 'text-warn-foreground-muted hover:text-warn-foreground',\n info: 'text-primary-subtle-foreground-muted hover:text-primary-subtle-foreground',\n },\n },\n defaultVariants: {\n type: 'info',\n },\n },\n);\n","export { mergeClasses } from 'ngx-com/utils';\n\nlet toastIdCounter = 0;\n\n/**\n * Generate a unique ID for a toast notification.\n */\nexport function generateToastId(): number {\n return ++toastIdCounter;\n}\n\n/** Default Lucide icon names per toast type. */\nexport const DEFAULT_TOAST_ICONS: Record<string, string> = {\n success: 'circle-check',\n warn: 'triangle-alert',\n error: 'circle-x',\n info: 'info',\n};\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\nimport type { InputSignal, OutputEmitterRef, Signal } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ComIcon } from 'ngx-com/components/icon';\nimport {\n toastVariants,\n toastProgressVariants,\n toastCloseButtonVariants,\n} from './toast.variants';\nimport { mergeClasses, DEFAULT_TOAST_ICONS } from './toast.utils';\nimport type { ComToastState, ComToastTemplateContext } from './toast.models';\n\n/**\n * Internal toast notification component rendered inside the container.\n *\n * @internal Not exported in public API\n *\n * @tokens `--color-success`, `--color-success-foreground`,\n * `--color-warn`, `--color-warn-foreground`,\n * `--color-warn-subtle`, `--color-warn-subtle-foreground`,\n * `--color-primary-subtle`, `--color-primary-subtle-foreground`,\n * `--color-border`, `--shadow-overlay`, `--radius-card`, `--color-ring`\n */\n@Component({\n selector: 'com-toast',\n template: `\n <div\n [class]=\"toastClasses()\"\n [attr.role]=\"ariaRole()\"\n [attr.aria-live]=\"ariaLive()\"\n [attr.data-state]=\"state().visible ? 'open' : 'closed'\"\n (animationend)=\"onAnimationEnd()\"\n >\n @if (state().data.customTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"state().data.customTemplate!\"\n [ngTemplateOutletContext]=\"templateContext()\"\n />\n } @else {\n <com-icon\n [name]=\"resolvedIcon()\"\n size=\"md\"\n class=\"mt-0.5 shrink-0\"\n aria-hidden=\"true\"\n />\n <div class=\"flex-1 min-w-0\">\n @if (state().data.title) {\n <p data-part=\"title\" class=\"text-sm font-semibold\">{{ state().data.title }}</p>\n }\n <p data-part=\"message\" class=\"text-sm\" [class.mt-1]=\"state().data.title\">\n {{ state().data.message }}\n </p>\n @if (state().data.action) {\n <button\n type=\"button\"\n class=\"mt-2 text-sm font-medium underline underline-offset-4\n outline-none\n focus-visible:outline-2\n focus-visible:outline-offset-2\n focus-visible:outline-[--color-ring]\"\n (click)=\"onAction.emit(state().id)\"\n >\n {{ state().data.action!.label }}\n </button>\n }\n </div>\n @if (state().showClose) {\n <button\n type=\"button\"\n [class]=\"closeButtonClasses()\"\n aria-label=\"Dismiss notification\"\n (click)=\"onDismiss.emit(state().id)\"\n >\n <com-icon name=\"x\" size=\"sm\" aria-hidden=\"true\" />\n </button>\n }\n }\n @if (state().showProgress && state().duration > 0) {\n <div\n [class]=\"progressClasses()\"\n [style.width.%]=\"state().remainingPercent\"\n ></div>\n }\n </div>\n `,\n styles: `\n :host {\n display: contents;\n }\n\n [data-state='open'] {\n --tw-enter-opacity: 0;\n --tw-enter-translate-x: 0;\n --tw-enter-translate-y: 0;\n }\n\n [data-state='closed'] {\n --tw-exit-opacity: 0;\n --tw-exit-translate-x: 0;\n --tw-exit-translate-y: 0;\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, ComIcon],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ComToastComponent {\n /** The toast state, set by the container. */\n readonly state: InputSignal<ComToastState> = input.required<ComToastState>();\n\n /** Emitted when the toast should be dismissed. */\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix -- intentional API naming for toast event delegation\n readonly onDismiss: OutputEmitterRef<number> = output<number>();\n\n /** Emitted when the action button is clicked. */\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix -- intentional API naming for toast event delegation\n readonly onAction: OutputEmitterRef<number> = output<number>();\n\n /** Emitted when the mouse enters the toast. */\n readonly mouseEnter: OutputEmitterRef<void> = output<void>();\n\n /** Emitted when the mouse leaves the toast. */\n readonly mouseLeave: OutputEmitterRef<void> = output<void>();\n\n /** Emitted when the exit animation completes. */\n readonly animationDone: OutputEmitterRef<number> = output<number>();\n\n /** Resolved icon name. */\n protected readonly resolvedIcon: Signal<string> = computed(\n () => this.state().data.icon ?? DEFAULT_TOAST_ICONS[this.state().type] ?? 'info',\n );\n\n /** ARIA role based on toast type. */\n protected readonly ariaRole: Signal<string> = computed(() =>\n this.state().type === 'error' ? 'alert' : 'status',\n );\n\n /** ARIA live region politeness. */\n protected readonly ariaLive: Signal<string> = computed(() =>\n this.state().type === 'error' ? 'assertive' : 'polite',\n );\n\n /** Computed toast card classes. */\n protected readonly toastClasses: Signal<string> = computed(() =>\n mergeClasses(\n toastVariants({ type: this.state().type }),\n this.state().visible\n ? 'animate-in fade-in-0 slide-in-from-bottom-2'\n : 'animate-out fade-out-0 slide-out-to-right-full',\n ),\n );\n\n /** Computed progress bar classes. */\n protected readonly progressClasses: Signal<string> = computed(() =>\n mergeClasses(toastProgressVariants({ type: this.state().type })),\n );\n\n /** Computed close button classes. */\n protected readonly closeButtonClasses: Signal<string> = computed(() =>\n mergeClasses(toastCloseButtonVariants({ type: this.state().type })),\n );\n\n /** Template context for custom templates. */\n protected readonly templateContext: Signal<ComToastTemplateContext> = computed(() => ({\n $implicit: this.state().data,\n dismiss: () => this.onDismiss.emit(this.state().id),\n action: () => this.onAction.emit(this.state().id),\n }));\n\n protected onAnimationEnd(): void {\n if (!this.state().visible) {\n this.animationDone.emit(this.state().id);\n }\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport type { Provider } from '@angular/core';\nimport type { ComToastConfig, ComToastContainerData } from './toast.models';\n\n/**\n * Injection token for global toast configuration.\n */\nexport const COM_TOAST_CONFIG: InjectionToken<ComToastConfig> =\n new InjectionToken<ComToastConfig>('COM_TOAST_CONFIG');\n\n/**\n * Injection token for internal container communication.\n * @internal\n */\nexport const COM_TOAST_CONTAINER_DATA: InjectionToken<ComToastContainerData> =\n new InjectionToken<ComToastContainerData>('COM_TOAST_CONTAINER_DATA');\n\n/**\n * Provides global toast configuration.\n *\n * @example\n * ```typescript\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideComToastConfig({ position: 'top-center', duration: 3000 }),\n * ],\n * });\n * ```\n */\nexport function provideComToastConfig(config: ComToastConfig): Provider {\n return { provide: COM_TOAST_CONFIG, useValue: config };\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n} from '@angular/core';\nimport type { Signal } from '@angular/core';\nimport { ComToastComponent } from './toast.component';\nimport { toastContainerVariants } from './toast.variants';\nimport { mergeClasses } from './toast.utils';\nimport { COM_TOAST_CONTAINER_DATA } from './toast.providers';\nimport type { ComToastContainerData, ComToastState } from './toast.models';\n\n/**\n * Internal toast container component that manages positioning and stacking.\n *\n * @internal Not exported in public API\n *\n * @tokens `--color-success`, `--color-success-foreground`,\n * `--color-warn`, `--color-warn-foreground`,\n * `--color-warn-subtle`, `--color-warn-subtle-foreground`,\n * `--color-primary-subtle`, `--color-primary-subtle-foreground`,\n * `--color-border`, `--shadow-overlay`, `--radius-card`\n */\n@Component({\n selector: 'com-toast-container',\n host: {\n '(keydown.escape)': 'onEscapeKey()',\n tabindex: '-1',\n },\n template: `\n <div\n [class]=\"containerClasses()\"\n role=\"region\"\n aria-label=\"Notifications\"\n >\n @for (toast of toasts(); track toast.id) {\n <com-toast\n [state]=\"toast\"\n (onDismiss)=\"containerData.onDismiss($event)\"\n (onAction)=\"containerData.onAction($event)\"\n (mouseEnter)=\"containerData.onMouseEnter(toast.id)\"\n (mouseLeave)=\"containerData.onMouseLeave(toast.id)\"\n (animationDone)=\"containerData.onAnimationDone($event)\"\n />\n }\n </div>\n `,\n styles: `\n :host {\n display: contents;\n }\n `,\n imports: [ComToastComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ComToastContainerComponent {\n protected readonly containerData: ComToastContainerData = inject(COM_TOAST_CONTAINER_DATA);\n\n /** Active toast states, read from the service's signal. */\n protected readonly toasts: Signal<ComToastState[]> = computed(() => this.containerData.toasts());\n\n /** Computed container positioning classes. */\n protected readonly containerClasses: Signal<string> = computed(() =>\n mergeClasses(toastContainerVariants({ position: this.containerData.position() })),\n );\n\n protected onEscapeKey(): void {\n this.containerData.onDismissLatest();\n }\n}\n","import {\n DestroyRef,\n inject,\n Injectable,\n Injector,\n PLATFORM_ID,\n signal,\n} from '@angular/core';\nimport type { WritableSignal } from '@angular/core';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { Overlay } from '@angular/cdk/overlay';\nimport type { GlobalPositionStrategy, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { ComToastRef } from './toast.ref';\nimport { ComToastContainerComponent } from './toast-container.component';\nimport { COM_TOAST_CONFIG, COM_TOAST_CONTAINER_DATA } from './toast.providers';\nimport { generateToastId } from './toast.utils';\nimport type {\n ComToastConfig,\n ComToastContainerData,\n ComToastData,\n ComToastDismissReason,\n ComToastPosition,\n ComToastState,\n ComToastTimerState,\n ComToastType,\n} from './toast.models';\n\n/** Default durations by toast type. */\nconst DEFAULT_DURATION: Record<ComToastType, number> = {\n success: 5000,\n warn: 5000,\n error: 0,\n info: 5000,\n};\n\n/** Fallback timeout for exit animation removal when animationend doesn't fire. */\nconst ANIMATION_FALLBACK_MS = 200;\n\n/**\n * Service for creating toast notifications imperatively.\n *\n * @example\n * ```typescript\n * const toast = inject(ComToastService);\n * toast.success('File uploaded successfully.');\n * toast.error('Failed to save.', 'Error');\n *\n * const ref = toast.show({ type: 'info', message: 'Item deleted.', action: { label: 'Undo' } });\n * ref.afterAction().subscribe(() => undoDelete());\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class ComToastService {\n private readonly overlay = inject(Overlay);\n private readonly injector = inject(Injector);\n private readonly destroyRef = inject(DestroyRef);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly document = inject(DOCUMENT);\n private readonly globalConfig = inject(COM_TOAST_CONFIG, { optional: true });\n\n private overlayRef: OverlayRef | null = null;\n private readonly toasts: WritableSignal<ComToastState[]> = signal([]);\n private readonly position: WritableSignal<ComToastPosition>;\n private readonly timers = new Map<number, ComToastTimerState>();\n private readonly refs = new Map<number, ComToastRef>();\n private readonly animationFallbacks = new Map<number, ReturnType<typeof setTimeout>>();\n private readonly dismissReasons = new Map<number, ComToastDismissReason>();\n private rafHandle: number | null = null;\n\n private readonly config: Required<ComToastConfig>;\n\n constructor() {\n this.config = {\n position: 'bottom-right',\n duration: 5000,\n maxVisible: 5,\n pauseOnHover: true,\n showProgress: true,\n showClose: true,\n ...this.globalConfig,\n };\n this.position = signal(this.config.position);\n this.destroyRef.onDestroy(() => this.dispose());\n }\n\n /**\n * Show a toast notification with full configuration.\n */\n show(data: ComToastData): ComToastRef {\n this.ensureContainer();\n\n const id = generateToastId();\n const type: ComToastType = data.type ?? 'info';\n const duration = data.duration ?? DEFAULT_DURATION[type] ?? this.config.duration;\n const showProgress = data.showProgress ?? this.config.showProgress;\n const showClose = data.showClose ?? this.config.showClose;\n\n const ref = new ComToastRef(() => this.dismiss(id, 'manual'));\n this.refs.set(id, ref);\n\n const state: ComToastState = {\n id,\n data,\n type,\n duration,\n showProgress,\n showClose,\n visible: true,\n remainingPercent: 100,\n };\n\n this.toasts.update((list) => [...list, state]);\n this.enforceMaxVisible();\n\n if (duration > 0) {\n this.startTimer(id, duration);\n }\n\n return ref;\n }\n\n /** Show a success toast. */\n success(message: string, title?: string): ComToastRef {\n return this.showByType('success', message, title);\n }\n\n /** Show a warning toast. */\n warn(message: string, title?: string): ComToastRef {\n return this.showByType('warn', message, title);\n }\n\n /** Show an error toast. */\n error(message: string, title?: string): ComToastRef {\n return this.showByType('error', message, title);\n }\n\n /** Show an info toast. */\n info(message: string, title?: string): ComToastRef {\n return this.showByType('info', message, title);\n }\n\n /** Dismiss all active toasts. */\n dismissAll(): void {\n for (const toast of this.toasts()) {\n this.dismiss(toast.id, 'manual');\n }\n }\n\n // ─── Private ───\n\n private showByType(type: ComToastType, message: string, title?: string): ComToastRef {\n const data: ComToastData = { type, message };\n if (title !== undefined) data.title = title;\n return this.show(data);\n }\n\n private ensureContainer(): void {\n if (this.overlayRef || !isPlatformBrowser(this.platformId)) return;\n\n const positionStrategy = this.buildPositionStrategy(this.config.position);\n\n const containerData: ComToastContainerData = {\n toasts: this.toasts.asReadonly(),\n position: this.position.asReadonly(),\n onMouseEnter: (id: number) => this.pauseTimer(id),\n onMouseLeave: (id: number) => this.resumeTimer(id),\n onDismiss: (id: number) => this.dismiss(id, 'manual'),\n onAction: (id: number) => this.handleAction(id),\n onDismissLatest: () => this.dismissLatest(),\n onAnimationDone: (id: number) => this.removeToast(id),\n };\n\n const containerInjector = Injector.create({\n providers: [{ provide: COM_TOAST_CONTAINER_DATA, useValue: containerData }],\n parent: this.injector,\n });\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy: this.overlay.scrollStrategies.noop(),\n hasBackdrop: false,\n panelClass: 'com-toast-overlay',\n disposeOnNavigation: false,\n });\n\n const portal = new ComponentPortal(ComToastContainerComponent, null, containerInjector);\n this.overlayRef.attach(portal);\n }\n\n private buildPositionStrategy(position: ComToastPosition): GlobalPositionStrategy {\n const strategy = this.overlay.position().global();\n\n switch (position) {\n case 'top-right':\n return strategy.top('0').right('0');\n case 'top-left':\n return strategy.top('0').left('0');\n case 'top-center':\n return strategy.top('0').centerHorizontally();\n case 'bottom-right':\n return strategy.bottom('0').right('0');\n case 'bottom-left':\n return strategy.bottom('0').left('0');\n case 'bottom-center':\n return strategy.bottom('0').centerHorizontally();\n }\n }\n\n private dismiss(id: number, reason: ComToastDismissReason): void {\n this.clearTimer(id);\n this.dismissReasons.set(id, reason);\n\n // Trigger exit animation\n this.updateToast(id, { visible: false });\n\n // Set fallback timeout in case animationend doesn't fire\n const fallback = setTimeout(() => this.removeToast(id), ANIMATION_FALLBACK_MS);\n this.animationFallbacks.set(id, fallback);\n }\n\n private removeToast(id: number): void {\n // Clear animation fallback\n const fallback = this.animationFallbacks.get(id);\n if (fallback) {\n clearTimeout(fallback);\n this.animationFallbacks.delete(id);\n }\n\n // Check if toast still exists (may have been removed already)\n if (!this.toasts().some((t) => t.id === id)) return;\n\n this.toasts.update((list) => list.filter((t) => t.id !== id));\n\n const reason = this.dismissReasons.get(id) ?? 'auto';\n this.dismissReasons.delete(id);\n\n const ref = this.refs.get(id);\n if (ref) {\n ref._notifyDismissed({ reason });\n this.refs.delete(id);\n }\n\n if (this.toasts().length === 0) {\n this.disposeOverlay();\n }\n }\n\n private handleAction(id: number): void {\n const ref = this.refs.get(id);\n if (ref) {\n ref._notifyAction();\n }\n this.dismiss(id, 'action');\n }\n\n private dismissLatest(): void {\n const visible = this.toasts().filter((t) => t.visible);\n const latest = visible[visible.length - 1];\n if (latest) {\n this.dismiss(latest.id, 'manual');\n }\n }\n\n private enforceMaxVisible(): void {\n const currentToasts = this.toasts();\n const visibleCount = currentToasts.filter((t) => t.visible).length;\n\n if (visibleCount > this.config.maxVisible) {\n const oldest = currentToasts.find((t) => t.visible);\n if (oldest) {\n this.dismiss(oldest.id, 'limit');\n }\n }\n }\n\n // ─── Timer (rAF) ───\n\n private startTimer(id: number, duration: number): void {\n const now = this.now();\n this.timers.set(id, {\n startTime: now,\n elapsed: 0,\n duration,\n paused: false,\n pausedAt: 0,\n });\n\n this.ensureRafLoop();\n }\n\n private ensureRafLoop(): void {\n if (this.rafHandle !== null) return;\n\n const win = this.document.defaultView;\n if (!win) return;\n\n const tick = (): void => {\n const now = this.now();\n let needsUpdate = false;\n\n for (const [id, timer] of this.timers) {\n if (timer.paused) continue;\n\n const elapsed = timer.elapsed + (now - timer.startTime);\n const remaining = Math.max(0, 100 - (elapsed / timer.duration) * 100);\n const rounded = Math.round(remaining);\n\n // Find current state to compare\n const toast = this.toasts().find((t) => t.id === id);\n if (!toast || !toast.visible) {\n this.clearTimer(id);\n continue;\n }\n\n if (Math.round(toast.remainingPercent) !== rounded) {\n needsUpdate = true;\n }\n\n if (remaining <= 0) {\n this.clearTimer(id);\n this.dismiss(id, 'auto');\n needsUpdate = true;\n }\n }\n\n // Batch-update all progress values in a single signal write\n if (needsUpdate) {\n const now2 = this.now();\n this.toasts.update((list) =>\n list.map((t) => {\n const timer = this.timers.get(t.id);\n if (!timer || timer.paused) return t;\n\n const elapsed = timer.elapsed + (now2 - timer.startTime);\n const remaining = Math.max(0, 100 - (elapsed / timer.duration) * 100);\n return { ...t, remainingPercent: remaining };\n }),\n );\n }\n\n // Continue loop if there are active timers\n if (this.timers.size > 0) {\n this.rafHandle = win.requestAnimationFrame(tick);\n } else {\n this.rafHandle = null;\n }\n };\n\n this.rafHandle = win.requestAnimationFrame(tick);\n }\n\n private pauseTimer(id: number): void {\n if (!this.config.pauseOnHover) return;\n\n const timer = this.timers.get(id);\n if (!timer || timer.paused) return;\n\n const now = this.now();\n timer.elapsed += now - timer.startTime;\n timer.paused = true;\n timer.pausedAt = now;\n }\n\n private resumeTimer(id: number): void {\n if (!this.config.pauseOnHover) return;\n\n const timer = this.timers.get(id);\n if (!timer || !timer.paused) return;\n\n timer.paused = false;\n timer.startTime = this.now();\n }\n\n private clearTimer(id: number): void {\n this.timers.delete(id);\n }\n\n private now(): number {\n return this.document.defaultView?.performance.now() ?? Date.now();\n }\n\n // ─── Helpers ───\n\n private updateToast(id: number, patch: Partial<ComToastState>): void {\n this.toasts.update((list) =>\n list.map((t) => (t.id === id ? { ...t, ...patch } : t)),\n );\n }\n\n private disposeOverlay(): void {\n if (this.overlayRef) {\n this.overlayRef.dispose();\n this.overlayRef = null;\n }\n\n const win = this.document.defaultView;\n if (this.rafHandle !== null && win) {\n win.cancelAnimationFrame(this.rafHandle);\n this.rafHandle = null;\n }\n }\n\n private dispose(): void {\n for (const id of this.timers.keys()) {\n this.clearTimer(id);\n }\n for (const [, fallback] of this.animationFallbacks) {\n clearTimeout(fallback);\n }\n this.animationFallbacks.clear();\n this.dismissReasons.clear();\n this.refs.clear();\n this.disposeOverlay();\n }\n}\n","// Public API for the toast notification system\n\n// Service\nexport { ComToastService } from './toast.service';\n\n// Ref\nexport { ComToastRef } from './toast.ref';\n\n// Types and interfaces\nexport type {\n ComToastConfig,\n ComToastData,\n ComToastType,\n ComToastPosition,\n ComToastDismissEvent,\n ComToastDismissReason,\n ComToastTemplateContext,\n} from './toast.models';\n\n// Providers\nexport { provideComToastConfig, COM_TOAST_CONFIG } from './toast.providers';\n\n// Variants (for advanced customization)\nexport {\n toastVariants,\n toastContainerVariants,\n toastProgressVariants,\n toastCloseButtonVariants,\n} from './toast.variants';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ import { ComponentHarness, HarnessPredicate, TestKey } from '@angular/cdk/testing';
2
+
3
+ /**
4
+ * Harness for interacting with a `[comTooltip]` directive in tests.
5
+ *
6
+ * The tooltip panel is rendered in a CDK overlay, so this harness uses
7
+ * `documentRootLocatorFactory()` to locate the panel in the document root.
8
+ */
9
+ class ComTooltipHarness extends ComponentHarness {
10
+ static hostSelector = '[comTooltip]';
11
+ documentRootLocator = this.documentRootLocatorFactory();
12
+ /**
13
+ * Gets a HarnessPredicate for matching tooltip triggers.
14
+ * @param options Filter options.
15
+ */
16
+ static with(options = {}) {
17
+ return new HarnessPredicate(ComTooltipHarness, options)
18
+ .addOption('text', options.text, async (harness, text) => {
19
+ const triggerText = await harness.getText();
20
+ return HarnessPredicate.stringMatches(triggerText, text);
21
+ });
22
+ }
23
+ /** Gets the trigger element's text content. */
24
+ async getText() {
25
+ const host = await this.host();
26
+ return host.text();
27
+ }
28
+ /** Whether the tooltip is currently open/visible. */
29
+ async isOpen() {
30
+ const host = await this.host();
31
+ const describedBy = await host.getAttribute('aria-describedby');
32
+ return describedBy !== null;
33
+ }
34
+ /**
35
+ * Shows the tooltip by hovering over the trigger element.
36
+ * If the tooltip is already open, this is a no-op.
37
+ */
38
+ async show() {
39
+ if (await this.isOpen()) {
40
+ return;
41
+ }
42
+ const host = await this.host();
43
+ await host.hover();
44
+ await this.forceStabilize();
45
+ }
46
+ /**
47
+ * Hides the tooltip by pressing Escape on the trigger element.
48
+ * If the tooltip is already closed, this is a no-op.
49
+ */
50
+ async hide() {
51
+ if (!(await this.isOpen())) {
52
+ return;
53
+ }
54
+ const host = await this.host();
55
+ await host.sendKeys(TestKey.ESCAPE);
56
+ await this.forceStabilize();
57
+ }
58
+ /**
59
+ * Gets the text content of the tooltip panel.
60
+ * Returns `null` if the tooltip is not open.
61
+ */
62
+ async getTooltipText() {
63
+ if (!(await this.isOpen())) {
64
+ return null;
65
+ }
66
+ const tooltipEl = await this.documentRootLocator.locatorForOptional('com-tooltip-panel [role="tooltip"]')();
67
+ if (!tooltipEl) {
68
+ return null;
69
+ }
70
+ return tooltipEl.text();
71
+ }
72
+ /**
73
+ * Gets the side the tooltip is positioned on (`data-side` attribute).
74
+ * Returns `null` if the tooltip is not open.
75
+ */
76
+ async getTooltipSide() {
77
+ if (!(await this.isOpen())) {
78
+ return null;
79
+ }
80
+ const panelWrapper = await this.documentRootLocator.locatorForOptional('com-tooltip-panel [data-side]')();
81
+ if (!panelWrapper) {
82
+ return null;
83
+ }
84
+ return panelWrapper.getAttribute('data-side');
85
+ }
86
+ /** Gets the `aria-describedby` value from the trigger element. */
87
+ async getAriaDescribedBy() {
88
+ const host = await this.host();
89
+ return host.getAttribute('aria-describedby');
90
+ }
91
+ /** Focuses the trigger element (also shows the tooltip via focusin). */
92
+ async focus() {
93
+ const host = await this.host();
94
+ await host.focus();
95
+ await this.forceStabilize();
96
+ }
97
+ /** Blurs the trigger element (hides the tooltip via focusout). */
98
+ async blur() {
99
+ const host = await this.host();
100
+ await host.blur();
101
+ await this.forceStabilize();
102
+ }
103
+ /** Whether the trigger element is currently focused. */
104
+ async isFocused() {
105
+ const host = await this.host();
106
+ return host.isFocused();
107
+ }
108
+ }
109
+
110
+ // Testing utilities for the tooltip directive
111
+
112
+ /**
113
+ * Generated bundle index. Do not edit.
114
+ */
115
+
116
+ export { ComTooltipHarness };
117
+ //# sourceMappingURL=ngx-com-components-tooltip-testing.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngx-com-components-tooltip-testing.mjs","sources":["../../../projects/com/components/tooltip/testing/tooltip.harness.ts","../../../projects/com/components/tooltip/testing/index.ts","../../../projects/com/components/tooltip/testing/ngx-com-components-tooltip-testing.ts"],"sourcesContent":["import {\n ComponentHarness,\n HarnessPredicate,\n TestKey,\n} from '@angular/cdk/testing';\nimport type { BaseHarnessFilters } from '@angular/cdk/testing';\n\n/** Harness filters for ComTooltipHarness. */\nexport interface ComTooltipHarnessFilters extends BaseHarnessFilters {\n /** Filter by the trigger element's text content. */\n text?: string | RegExp;\n}\n\n/**\n * Harness for interacting with a `[comTooltip]` directive in tests.\n *\n * The tooltip panel is rendered in a CDK overlay, so this harness uses\n * `documentRootLocatorFactory()` to locate the panel in the document root.\n */\nexport class ComTooltipHarness extends ComponentHarness {\n static hostSelector = '[comTooltip]';\n\n private readonly documentRootLocator = this.documentRootLocatorFactory();\n\n /**\n * Gets a HarnessPredicate for matching tooltip triggers.\n * @param options Filter options.\n */\n static with(options: ComTooltipHarnessFilters = {}): HarnessPredicate<ComTooltipHarness> {\n return new HarnessPredicate(ComTooltipHarness, options)\n .addOption('text', options.text, async (harness, text) => {\n const triggerText = await harness.getText();\n return HarnessPredicate.stringMatches(triggerText, text);\n });\n }\n\n /** Gets the trigger element's text content. */\n async getText(): Promise<string> {\n const host = await this.host();\n return host.text();\n }\n\n /** Whether the tooltip is currently open/visible. */\n async isOpen(): Promise<boolean> {\n const host = await this.host();\n const describedBy = await host.getAttribute('aria-describedby');\n return describedBy !== null;\n }\n\n /**\n * Shows the tooltip by hovering over the trigger element.\n * If the tooltip is already open, this is a no-op.\n */\n async show(): Promise<void> {\n if (await this.isOpen()) {\n return;\n }\n const host = await this.host();\n await host.hover();\n await this.forceStabilize();\n }\n\n /**\n * Hides the tooltip by pressing Escape on the trigger element.\n * If the tooltip is already closed, this is a no-op.\n */\n async hide(): Promise<void> {\n if (!(await this.isOpen())) {\n return;\n }\n const host = await this.host();\n await host.sendKeys(TestKey.ESCAPE);\n await this.forceStabilize();\n }\n\n /**\n * Gets the text content of the tooltip panel.\n * Returns `null` if the tooltip is not open.\n */\n async getTooltipText(): Promise<string | null> {\n if (!(await this.isOpen())) {\n return null;\n }\n const tooltipEl = await this.documentRootLocator.locatorForOptional(\n 'com-tooltip-panel [role=\"tooltip\"]',\n )();\n if (!tooltipEl) {\n return null;\n }\n return tooltipEl.text();\n }\n\n /**\n * Gets the side the tooltip is positioned on (`data-side` attribute).\n * Returns `null` if the tooltip is not open.\n */\n async getTooltipSide(): Promise<string | null> {\n if (!(await this.isOpen())) {\n return null;\n }\n const panelWrapper = await this.documentRootLocator.locatorForOptional(\n 'com-tooltip-panel [data-side]',\n )();\n if (!panelWrapper) {\n return null;\n }\n return panelWrapper.getAttribute('data-side');\n }\n\n /** Gets the `aria-describedby` value from the trigger element. */\n async getAriaDescribedBy(): Promise<string | null> {\n const host = await this.host();\n return host.getAttribute('aria-describedby');\n }\n\n /** Focuses the trigger element (also shows the tooltip via focusin). */\n async focus(): Promise<void> {\n const host = await this.host();\n await host.focus();\n await this.forceStabilize();\n }\n\n /** Blurs the trigger element (hides the tooltip via focusout). */\n async blur(): Promise<void> {\n const host = await this.host();\n await host.blur();\n await this.forceStabilize();\n }\n\n /** Whether the trigger element is currently focused. */\n async isFocused(): Promise<boolean> {\n const host = await this.host();\n return host.isFocused();\n }\n}\n","// Testing utilities for the tooltip directive\n\nexport { ComTooltipHarness } from './tooltip.harness';\n\nexport type { ComTooltipHarnessFilters } from './tooltip.harness';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-com",
3
- "version": "0.1.16",
3
+ "version": "0.1.18",
4
4
  "license": "MIT",
5
5
  "description": "A modern Angular component library built with signals, Tailwind CSS, and semantic design tokens",
6
6
  "keywords": [
@@ -96,6 +96,10 @@
96
96
  "types": "./types/ngx-com-components-alert.d.ts",
97
97
  "default": "./fesm2022/ngx-com-components-alert.mjs"
98
98
  },
99
+ "./components/alert/testing": {
100
+ "types": "./types/ngx-com-components-alert-testing.d.ts",
101
+ "default": "./fesm2022/ngx-com-components-alert-testing.mjs"
102
+ },
99
103
  "./components/avatar": {
100
104
  "types": "./types/ngx-com-components-avatar.d.ts",
101
105
  "default": "./fesm2022/ngx-com-components-avatar.mjs"
@@ -112,6 +116,10 @@
112
116
  "types": "./types/ngx-com-components-calendar.d.ts",
113
117
  "default": "./fesm2022/ngx-com-components-calendar.mjs"
114
118
  },
119
+ "./components/calendar/testing": {
120
+ "types": "./types/ngx-com-components-calendar-testing.d.ts",
121
+ "default": "./fesm2022/ngx-com-components-calendar-testing.mjs"
122
+ },
115
123
  "./components/card": {
116
124
  "types": "./types/ngx-com-components-card.d.ts",
117
125
  "default": "./fesm2022/ngx-com-components-card.mjs"
@@ -120,30 +128,58 @@
120
128
  "types": "./types/ngx-com-components-carousel.d.ts",
121
129
  "default": "./fesm2022/ngx-com-components-carousel.mjs"
122
130
  },
131
+ "./components/carousel/testing": {
132
+ "types": "./types/ngx-com-components-carousel-testing.d.ts",
133
+ "default": "./fesm2022/ngx-com-components-carousel-testing.mjs"
134
+ },
123
135
  "./components/checkbox": {
124
136
  "types": "./types/ngx-com-components-checkbox.d.ts",
125
137
  "default": "./fesm2022/ngx-com-components-checkbox.mjs"
126
138
  },
139
+ "./components/checkbox/testing": {
140
+ "types": "./types/ngx-com-components-checkbox-testing.d.ts",
141
+ "default": "./fesm2022/ngx-com-components-checkbox-testing.mjs"
142
+ },
127
143
  "./components/code-block": {
128
144
  "types": "./types/ngx-com-components-code-block.d.ts",
129
145
  "default": "./fesm2022/ngx-com-components-code-block.mjs"
130
146
  },
147
+ "./components/code-block/testing": {
148
+ "types": "./types/ngx-com-components-code-block-testing.d.ts",
149
+ "default": "./fesm2022/ngx-com-components-code-block-testing.mjs"
150
+ },
131
151
  "./components/collapsible": {
132
152
  "types": "./types/ngx-com-components-collapsible.d.ts",
133
153
  "default": "./fesm2022/ngx-com-components-collapsible.mjs"
134
154
  },
155
+ "./components/collapsible/testing": {
156
+ "types": "./types/ngx-com-components-collapsible-testing.d.ts",
157
+ "default": "./fesm2022/ngx-com-components-collapsible-testing.mjs"
158
+ },
135
159
  "./components/confirm": {
136
160
  "types": "./types/ngx-com-components-confirm.d.ts",
137
161
  "default": "./fesm2022/ngx-com-components-confirm.mjs"
138
162
  },
163
+ "./components/confirm/testing": {
164
+ "types": "./types/ngx-com-components-confirm-testing.d.ts",
165
+ "default": "./fesm2022/ngx-com-components-confirm-testing.mjs"
166
+ },
139
167
  "./components/datepicker": {
140
168
  "types": "./types/ngx-com-components-datepicker.d.ts",
141
169
  "default": "./fesm2022/ngx-com-components-datepicker.mjs"
142
170
  },
171
+ "./components/datepicker/testing": {
172
+ "types": "./types/ngx-com-components-datepicker-testing.d.ts",
173
+ "default": "./fesm2022/ngx-com-components-datepicker-testing.mjs"
174
+ },
143
175
  "./components/dialog": {
144
176
  "types": "./types/ngx-com-components-dialog.d.ts",
145
177
  "default": "./fesm2022/ngx-com-components-dialog.mjs"
146
178
  },
179
+ "./components/dialog/testing": {
180
+ "types": "./types/ngx-com-components-dialog-testing.d.ts",
181
+ "default": "./fesm2022/ngx-com-components-dialog-testing.mjs"
182
+ },
147
183
  "./components/dropdown": {
148
184
  "types": "./types/ngx-com-components-dropdown.d.ts",
149
185
  "default": "./fesm2022/ngx-com-components-dropdown.mjs"
@@ -160,6 +196,10 @@
160
196
  "types": "./types/ngx-com-components-form-field.d.ts",
161
197
  "default": "./fesm2022/ngx-com-components-form-field.mjs"
162
198
  },
199
+ "./components/form-field/testing": {
200
+ "types": "./types/ngx-com-components-form-field-testing.d.ts",
201
+ "default": "./fesm2022/ngx-com-components-form-field-testing.mjs"
202
+ },
163
203
  "./components/icon": {
164
204
  "types": "./types/ngx-com-components-icon.d.ts",
165
205
  "default": "./fesm2022/ngx-com-components-icon.mjs"
@@ -176,6 +216,10 @@
176
216
  "types": "./types/ngx-com-components-menu.d.ts",
177
217
  "default": "./fesm2022/ngx-com-components-menu.mjs"
178
218
  },
219
+ "./components/menu/testing": {
220
+ "types": "./types/ngx-com-components-menu-testing.d.ts",
221
+ "default": "./fesm2022/ngx-com-components-menu-testing.mjs"
222
+ },
179
223
  "./components/native-control": {
180
224
  "types": "./types/ngx-com-components-native-control.d.ts",
181
225
  "default": "./fesm2022/ngx-com-components-native-control.mjs"
@@ -184,18 +228,34 @@
184
228
  "types": "./types/ngx-com-components-paginator.d.ts",
185
229
  "default": "./fesm2022/ngx-com-components-paginator.mjs"
186
230
  },
231
+ "./components/paginator/testing": {
232
+ "types": "./types/ngx-com-components-paginator-testing.d.ts",
233
+ "default": "./fesm2022/ngx-com-components-paginator-testing.mjs"
234
+ },
187
235
  "./components/popover": {
188
236
  "types": "./types/ngx-com-components-popover.d.ts",
189
237
  "default": "./fesm2022/ngx-com-components-popover.mjs"
190
238
  },
239
+ "./components/popover/testing": {
240
+ "types": "./types/ngx-com-components-popover-testing.d.ts",
241
+ "default": "./fesm2022/ngx-com-components-popover-testing.mjs"
242
+ },
191
243
  "./components/radio": {
192
244
  "types": "./types/ngx-com-components-radio.d.ts",
193
245
  "default": "./fesm2022/ngx-com-components-radio.mjs"
194
246
  },
247
+ "./components/radio/testing": {
248
+ "types": "./types/ngx-com-components-radio-testing.d.ts",
249
+ "default": "./fesm2022/ngx-com-components-radio-testing.mjs"
250
+ },
195
251
  "./components/segmented-control": {
196
252
  "types": "./types/ngx-com-components-segmented-control.d.ts",
197
253
  "default": "./fesm2022/ngx-com-components-segmented-control.mjs"
198
254
  },
255
+ "./components/segmented-control/testing": {
256
+ "types": "./types/ngx-com-components-segmented-control-testing.d.ts",
257
+ "default": "./fesm2022/ngx-com-components-segmented-control-testing.mjs"
258
+ },
199
259
  "./components/separator": {
200
260
  "types": "./types/ngx-com-components-separator.d.ts",
201
261
  "default": "./fesm2022/ngx-com-components-separator.mjs"
@@ -204,6 +264,10 @@
204
264
  "types": "./types/ngx-com-components-sort.d.ts",
205
265
  "default": "./fesm2022/ngx-com-components-sort.mjs"
206
266
  },
267
+ "./components/sort/testing": {
268
+ "types": "./types/ngx-com-components-sort-testing.d.ts",
269
+ "default": "./fesm2022/ngx-com-components-sort-testing.mjs"
270
+ },
207
271
  "./components/spinner": {
208
272
  "types": "./types/ngx-com-components-spinner.d.ts",
209
273
  "default": "./fesm2022/ngx-com-components-spinner.mjs"
@@ -212,26 +276,50 @@
212
276
  "types": "./types/ngx-com-components-switch.d.ts",
213
277
  "default": "./fesm2022/ngx-com-components-switch.mjs"
214
278
  },
279
+ "./components/switch/testing": {
280
+ "types": "./types/ngx-com-components-switch-testing.d.ts",
281
+ "default": "./fesm2022/ngx-com-components-switch-testing.mjs"
282
+ },
215
283
  "./components/table": {
216
284
  "types": "./types/ngx-com-components-table.d.ts",
217
285
  "default": "./fesm2022/ngx-com-components-table.mjs"
218
286
  },
287
+ "./components/table/testing": {
288
+ "types": "./types/ngx-com-components-table-testing.d.ts",
289
+ "default": "./fesm2022/ngx-com-components-table-testing.mjs"
290
+ },
219
291
  "./components/tabs": {
220
292
  "types": "./types/ngx-com-components-tabs.d.ts",
221
293
  "default": "./fesm2022/ngx-com-components-tabs.mjs"
222
294
  },
295
+ "./components/tabs/testing": {
296
+ "types": "./types/ngx-com-components-tabs-testing.d.ts",
297
+ "default": "./fesm2022/ngx-com-components-tabs-testing.mjs"
298
+ },
223
299
  "./components/timepicker": {
224
300
  "types": "./types/ngx-com-components-timepicker.d.ts",
225
301
  "default": "./fesm2022/ngx-com-components-timepicker.mjs"
226
302
  },
303
+ "./components/timepicker/testing": {
304
+ "types": "./types/ngx-com-components-timepicker-testing.d.ts",
305
+ "default": "./fesm2022/ngx-com-components-timepicker-testing.mjs"
306
+ },
227
307
  "./components/toast": {
228
308
  "types": "./types/ngx-com-components-toast.d.ts",
229
309
  "default": "./fesm2022/ngx-com-components-toast.mjs"
230
310
  },
311
+ "./components/toast/testing": {
312
+ "types": "./types/ngx-com-components-toast-testing.d.ts",
313
+ "default": "./fesm2022/ngx-com-components-toast-testing.mjs"
314
+ },
231
315
  "./components/tooltip": {
232
316
  "types": "./types/ngx-com-components-tooltip.d.ts",
233
317
  "default": "./fesm2022/ngx-com-components-tooltip.mjs"
234
318
  },
319
+ "./components/tooltip/testing": {
320
+ "types": "./types/ngx-com-components-tooltip-testing.d.ts",
321
+ "default": "./fesm2022/ngx-com-components-tooltip-testing.mjs"
322
+ },
235
323
  "./theme": {
236
324
  "types": "./types/ngx-com-theme.d.ts",
237
325
  "default": "./fesm2022/ngx-com-theme.mjs"
@@ -0,0 +1,41 @@
1
+ import { ComponentHarness, BaseHarnessFilters, HarnessPredicate } from '@angular/cdk/testing';
2
+
3
+ /** Harness filters for ComAlertHarness. */
4
+ interface ComAlertHarnessFilters extends BaseHarnessFilters {
5
+ /** Filter by the alert's title text. */
6
+ title?: string | RegExp;
7
+ }
8
+ /**
9
+ * Harness for interacting with a ComAlert in tests.
10
+ */
11
+ declare class ComAlertHarness extends ComponentHarness {
12
+ static hostSelector: string;
13
+ private readonly alertEl;
14
+ private readonly titleEl;
15
+ private readonly descriptionEl;
16
+ private readonly dismissButton;
17
+ /**
18
+ * Gets a HarnessPredicate for matching alerts.
19
+ * @param options Filter options.
20
+ */
21
+ static with(options?: ComAlertHarnessFilters): HarnessPredicate<ComAlertHarness>;
22
+ /** Gets the alert's title text, or null if no title is projected. */
23
+ getTitle(): Promise<string | null>;
24
+ /** Gets the alert's description text, or null if no description is projected. */
25
+ getDescription(): Promise<string | null>;
26
+ /** Gets the full text content of the alert element. */
27
+ getText(): Promise<string>;
28
+ /** Gets the role attribute of the alert element. */
29
+ getRole(): Promise<string | null>;
30
+ /** Gets the aria-live attribute of the alert element. */
31
+ getAriaLive(): Promise<string | null>;
32
+ /** Whether the alert has a dismiss button. */
33
+ isDismissible(): Promise<boolean>;
34
+ /** Clicks the dismiss button. Throws if the alert is not dismissible. */
35
+ dismiss(): Promise<void>;
36
+ /** Whether the alert is currently visible (not dismissed). */
37
+ isVisible(): Promise<boolean>;
38
+ }
39
+
40
+ export { ComAlertHarness };
41
+ export type { ComAlertHarnessFilters };