ngx-com 0.0.21 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/README.md +137 -33
  2. package/fesm2022/ngx-com-components-alert.mjs +21 -11
  3. package/fesm2022/ngx-com-components-alert.mjs.map +1 -1
  4. package/fesm2022/ngx-com-components-avatar.mjs +9 -7
  5. package/fesm2022/ngx-com-components-avatar.mjs.map +1 -1
  6. package/fesm2022/ngx-com-components-button.mjs +1 -1
  7. package/fesm2022/ngx-com-components-button.mjs.map +1 -1
  8. package/fesm2022/ngx-com-components-calendar.mjs +27 -3112
  9. package/fesm2022/ngx-com-components-calendar.mjs.map +1 -1
  10. package/fesm2022/ngx-com-components-card.mjs +8 -8
  11. package/fesm2022/ngx-com-components-card.mjs.map +1 -1
  12. package/fesm2022/ngx-com-components-carousel.mjs +16 -4
  13. package/fesm2022/ngx-com-components-carousel.mjs.map +1 -1
  14. package/fesm2022/ngx-com-components-checkbox.mjs +1 -1
  15. package/fesm2022/ngx-com-components-checkbox.mjs.map +1 -1
  16. package/fesm2022/ngx-com-components-code-block.mjs +9 -9
  17. package/fesm2022/ngx-com-components-code-block.mjs.map +1 -1
  18. package/fesm2022/ngx-com-components-collapsible.mjs +15 -13
  19. package/fesm2022/ngx-com-components-collapsible.mjs.map +1 -1
  20. package/fesm2022/ngx-com-components-confirm.mjs +4 -4
  21. package/fesm2022/ngx-com-components-confirm.mjs.map +1 -1
  22. package/fesm2022/ngx-com-components-datepicker.mjs +2334 -0
  23. package/fesm2022/ngx-com-components-datepicker.mjs.map +1 -0
  24. package/fesm2022/ngx-com-components-dialog.mjs +47 -45
  25. package/fesm2022/ngx-com-components-dialog.mjs.map +1 -1
  26. package/fesm2022/ngx-com-components-dropdown.mjs +446 -340
  27. package/fesm2022/ngx-com-components-dropdown.mjs.map +1 -1
  28. package/fesm2022/ngx-com-components-empty-state.mjs +5 -3
  29. package/fesm2022/ngx-com-components-empty-state.mjs.map +1 -1
  30. package/fesm2022/ngx-com-components-form-field.mjs +11 -6
  31. package/fesm2022/ngx-com-components-form-field.mjs.map +1 -1
  32. package/fesm2022/ngx-com-components-icon-lucide.mjs +41 -0
  33. package/fesm2022/ngx-com-components-icon-lucide.mjs.map +1 -0
  34. package/fesm2022/ngx-com-components-icon.mjs +89 -61
  35. package/fesm2022/ngx-com-components-icon.mjs.map +1 -1
  36. package/fesm2022/ngx-com-components-item.mjs +14 -4
  37. package/fesm2022/ngx-com-components-item.mjs.map +1 -1
  38. package/fesm2022/ngx-com-components-menu.mjs +61 -69
  39. package/fesm2022/ngx-com-components-menu.mjs.map +1 -1
  40. package/fesm2022/ngx-com-components-native-control.mjs +170 -0
  41. package/fesm2022/ngx-com-components-native-control.mjs.map +1 -0
  42. package/fesm2022/ngx-com-components-paginator.mjs +11 -3
  43. package/fesm2022/ngx-com-components-paginator.mjs.map +1 -1
  44. package/fesm2022/ngx-com-components-popover.mjs +58 -33
  45. package/fesm2022/ngx-com-components-popover.mjs.map +1 -1
  46. package/fesm2022/ngx-com-components-radio.mjs +4 -4
  47. package/fesm2022/ngx-com-components-radio.mjs.map +1 -1
  48. package/fesm2022/ngx-com-components-segmented-control.mjs +6 -4
  49. package/fesm2022/ngx-com-components-segmented-control.mjs.map +1 -1
  50. package/fesm2022/ngx-com-components-sort.mjs +63 -57
  51. package/fesm2022/ngx-com-components-sort.mjs.map +1 -1
  52. package/fesm2022/ngx-com-components-spinner.mjs +6 -6
  53. package/fesm2022/ngx-com-components-spinner.mjs.map +1 -1
  54. package/fesm2022/ngx-com-components-switch.mjs +18 -9
  55. package/fesm2022/ngx-com-components-switch.mjs.map +1 -1
  56. package/fesm2022/ngx-com-components-table.mjs +23 -9
  57. package/fesm2022/ngx-com-components-table.mjs.map +1 -1
  58. package/fesm2022/ngx-com-components-tabs.mjs +81 -58
  59. package/fesm2022/ngx-com-components-tabs.mjs.map +1 -1
  60. package/fesm2022/ngx-com-components-timepicker.mjs +1048 -0
  61. package/fesm2022/ngx-com-components-timepicker.mjs.map +1 -0
  62. package/fesm2022/ngx-com-components-toast.mjs +18 -14
  63. package/fesm2022/ngx-com-components-toast.mjs.map +1 -1
  64. package/fesm2022/ngx-com-components-tooltip.mjs +5 -5
  65. package/fesm2022/ngx-com-components-tooltip.mjs.map +1 -1
  66. package/fesm2022/ngx-com-components.mjs +0 -13
  67. package/fesm2022/ngx-com-components.mjs.map +1 -1
  68. package/fesm2022/ngx-com-tokens.mjs +0 -8
  69. package/fesm2022/ngx-com-tokens.mjs.map +1 -1
  70. package/fesm2022/ngx-com-utils.mjs +13 -1
  71. package/fesm2022/ngx-com-utils.mjs.map +1 -1
  72. package/fesm2022/ngx-com.mjs +1 -1
  73. package/fesm2022/ngx-com.mjs.map +1 -1
  74. package/package.json +51 -8
  75. package/styles/animations.css +38 -0
  76. package/styles/candy.css +121 -0
  77. package/styles/dark.css +159 -0
  78. package/styles/forest.css +117 -0
  79. package/styles/ocean.css +117 -0
  80. package/styles/themes.css +7 -0
  81. package/styles/tokens.css +277 -0
  82. package/styles/utilities.css +16 -0
  83. package/types/ngx-com-components-alert.d.ts +14 -4
  84. package/types/ngx-com-components-avatar.d.ts +2 -0
  85. package/types/ngx-com-components-calendar.d.ts +3 -747
  86. package/types/ngx-com-components-card.d.ts +2 -2
  87. package/types/ngx-com-components-carousel.d.ts +11 -1
  88. package/types/ngx-com-components-code-block.d.ts +4 -4
  89. package/types/ngx-com-components-collapsible.d.ts +10 -2
  90. package/types/ngx-com-components-confirm.d.ts +2 -2
  91. package/types/ngx-com-components-datepicker.d.ts +623 -0
  92. package/types/ngx-com-components-dialog.d.ts +5 -2
  93. package/types/ngx-com-components-dropdown.d.ts +22 -4
  94. package/types/ngx-com-components-empty-state.d.ts +2 -0
  95. package/types/ngx-com-components-form-field.d.ts +4 -1
  96. package/types/ngx-com-components-icon-lucide.d.ts +32 -0
  97. package/types/ngx-com-components-icon.d.ts +49 -35
  98. package/types/ngx-com-components-item.d.ts +12 -2
  99. package/types/ngx-com-components-menu.d.ts +38 -38
  100. package/types/ngx-com-components-native-control.d.ts +99 -0
  101. package/types/ngx-com-components-paginator.d.ts +2 -0
  102. package/types/ngx-com-components-popover.d.ts +19 -12
  103. package/types/ngx-com-components-segmented-control.d.ts +3 -1
  104. package/types/ngx-com-components-sort.d.ts +13 -10
  105. package/types/ngx-com-components-switch.d.ts +7 -2
  106. package/types/ngx-com-components-table.d.ts +16 -2
  107. package/types/ngx-com-components-tabs.d.ts +46 -34
  108. package/types/ngx-com-components-timepicker.d.ts +273 -0
  109. package/types/ngx-com-components-toast.d.ts +4 -2
  110. package/types/ngx-com-components-tooltip.d.ts +1 -1
  111. package/types/ngx-com-components.d.ts +6 -7
  112. package/types/ngx-com-tokens.d.ts +5 -3
  113. package/types/ngx-com-utils.d.ts +11 -1
  114. package/types/ngx-com.d.ts +1 -1
@@ -52,7 +52,7 @@ const paginatorButtonVariants = cva([
52
52
  'rounded-control',
53
53
  'border border-border',
54
54
  'bg-transparent',
55
- 'transition-colors duration-150',
55
+ 'transition-colors duration-normal',
56
56
  'cursor-pointer',
57
57
  'hover:bg-muted hover:text-muted-foreground',
58
58
  'focus-visible:outline-[1px] focus-visible:outline-offset-2 focus-visible:outline-ring',
@@ -99,7 +99,7 @@ const paginatorSelectVariants = cva([
99
99
  'bg-transparent',
100
100
  'text-foreground',
101
101
  'cursor-pointer',
102
- 'transition-colors duration-150',
102
+ 'transition-colors duration-normal',
103
103
  'hover:bg-muted',
104
104
  'focus-visible:outline-[1px] focus-visible:outline-offset-2 focus-visible:outline-ring',
105
105
  'disabled:cursor-not-allowed disabled:bg-disabled disabled:text-disabled-foreground disabled:border-disabled',
@@ -125,7 +125,7 @@ const paginatorPageButtonVariants = cva([
125
125
  'inline-flex items-center justify-center',
126
126
  'rounded-control',
127
127
  'font-medium',
128
- 'transition-colors duration-150',
128
+ 'transition-colors duration-normal',
129
129
  'cursor-pointer',
130
130
  'focus-visible:outline-[1px] focus-visible:outline-offset-2 focus-visible:outline-ring',
131
131
  'disabled:cursor-not-allowed disabled:bg-disabled disabled:text-disabled-foreground',
@@ -322,6 +322,10 @@ class ComPaginator {
322
322
  pageSizeLabelId = computed(() => {
323
323
  return `com-paginator-page-size-label-${uniqueId++}`;
324
324
  }, ...(ngDevMode ? [{ debugName: "pageSizeLabelId" }] : []));
325
+ /** Unique ID for page size select element. */
326
+ pageSizeSelectId = computed(() => {
327
+ return `com-paginator-page-size-select-${uniqueId++}`;
328
+ }, ...(ngDevMode ? [{ debugName: "pageSizeSelectId" }] : []));
325
329
  /** Classes for the container. */
326
330
  containerClasses = computed(() => paginatorContainerVariants({
327
331
  size: this.size(),
@@ -554,6 +558,7 @@ class ComPaginator {
554
558
  <div class="flex items-center gap-2">
555
559
  <label
556
560
  [id]="pageSizeLabelId()"
561
+ [attr.for]="pageSizeSelectId()"
557
562
  class="text-muted-foreground"
558
563
  [class.text-xs]="size() === 'sm'"
559
564
  [class.text-sm]="size() === 'md'"
@@ -562,6 +567,7 @@ class ComPaginator {
562
567
  </label>
563
568
  <div class="relative">
564
569
  <select
570
+ [id]="pageSizeSelectId()"
565
571
  [attr.aria-labelledby]="pageSizeLabelId()"
566
572
  [class]="selectClasses()"
567
573
  [disabled]="disabled()"
@@ -721,6 +727,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
721
727
  <div class="flex items-center gap-2">
722
728
  <label
723
729
  [id]="pageSizeLabelId()"
730
+ [attr.for]="pageSizeSelectId()"
724
731
  class="text-muted-foreground"
725
732
  [class.text-xs]="size() === 'sm'"
726
733
  [class.text-sm]="size() === 'md'"
@@ -729,6 +736,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
729
736
  </label>
730
737
  <div class="relative">
731
738
  <select
739
+ [id]="pageSizeSelectId()"
732
740
  [attr.aria-labelledby]="pageSizeLabelId()"
733
741
  [class]="selectClasses()"
734
742
  [disabled]="disabled()"
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-com-components-paginator.mjs","sources":["../../../projects/com/components/paginator/paginator.models.ts","../../../projects/com/components/paginator/paginator.variants.ts","../../../projects/com/components/paginator/paginator.component.ts","../../../projects/com/components/paginator/index.ts","../../../projects/com/components/paginator/ngx-com-components-paginator.ts"],"sourcesContent":["/**\n * Event emitted when the paginator changes page index or page size.\n */\nexport interface PageEvent {\n /** The current zero-based page index. */\n pageIndex: number;\n /** The previous zero-based page index. */\n previousPageIndex: number;\n /** The current page size. */\n pageSize: number;\n /** The total number of items being paged. */\n length: number;\n}\n\n/**\n * Function signature for custom range label formatting.\n * Used for i18n and custom label display.\n *\n * @param page Current page index (zero-based)\n * @param pageSize Number of items per page\n * @param length Total number of items\n * @returns Formatted string to display (e.g., \"1 – 10 of 100\")\n */\nexport type RangeLabelFn = (page: number, pageSize: number, length: number) => string;\n\n/**\n * Default range label function.\n * Produces output like \"1 – 10 of 100\" or \"0 of 0\" when empty.\n */\nexport function defaultRangeLabel(page: number, pageSize: number, length: number): string {\n if (length === 0 || pageSize === 0) {\n return `0 of ${length}`;\n }\n\n const startIndex = page * pageSize;\n // Ensure end index doesn't exceed length\n const endIndex = Math.min(startIndex + pageSize, length);\n\n return `${startIndex + 1} – ${endIndex} of ${length}`;\n}\n","import { cva, type VariantProps } from 'class-variance-authority';\n\n// ─── Types ───\n\nexport type PaginatorSize = 'sm' | 'md';\nexport type PaginatorLayout = 'compact' | 'spread';\n\n// ─── Container Variants ───\n\n/**\n * CVA variants for the paginator container.\n * Controls overall layout and spacing.\n */\nexport const paginatorContainerVariants: (props?: {\n size?: PaginatorSize;\n layout?: PaginatorLayout;\n}) => string = cva(\n [\n 'flex items-center',\n 'text-foreground',\n 'select-none',\n ],\n {\n variants: {\n size: {\n sm: 'gap-3 text-xs',\n md: 'gap-4 text-sm',\n },\n layout: {\n compact: 'justify-end',\n spread: 'justify-between',\n },\n },\n defaultVariants: {\n size: 'md',\n layout: 'compact',\n },\n }\n);\n\n// ─── Button Variants ───\n\n/**\n * CVA variants for paginator navigation buttons.\n * Controls button sizing, borders, and interactive states.\n */\nexport const paginatorButtonVariants: (props?: {\n size?: PaginatorSize;\n}) => string = cva(\n [\n 'inline-flex items-center justify-center',\n 'rounded-control',\n 'border border-border',\n 'bg-transparent',\n 'transition-colors duration-150',\n 'cursor-pointer',\n 'hover:bg-muted hover:text-muted-foreground',\n 'focus-visible:outline-[1px] focus-visible:outline-offset-2 focus-visible:outline-ring',\n 'disabled:cursor-not-allowed disabled:bg-disabled disabled:text-disabled-foreground disabled:border-disabled',\n ],\n {\n variants: {\n size: {\n sm: 'h-7 w-7',\n md: 'h-9 w-9',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n }\n);\n\n// ─── Range Label Variants ───\n\n/**\n * CVA variants for the range label text.\n * Controls typography and color.\n */\nexport const paginatorRangeLabelVariants: (props?: {\n size?: PaginatorSize;\n}) => string = cva(\n [\n 'text-muted-foreground',\n 'whitespace-nowrap',\n ],\n {\n variants: {\n size: {\n sm: 'text-xs',\n md: 'text-sm',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n }\n);\n\n// ─── Page Size Selector Variants ───\n\n/**\n * CVA variants for the page size select element.\n * Controls sizing and styling of the native select.\n */\nexport const paginatorSelectVariants: (props?: {\n size?: PaginatorSize;\n}) => string = cva(\n [\n 'appearance-none',\n 'rounded-control',\n 'border border-border',\n 'bg-transparent',\n 'text-foreground',\n 'cursor-pointer',\n 'transition-colors duration-150',\n 'hover:bg-muted',\n 'focus-visible:outline-[1px] focus-visible:outline-offset-2 focus-visible:outline-ring',\n 'disabled:cursor-not-allowed disabled:bg-disabled disabled:text-disabled-foreground disabled:border-disabled',\n 'pr-6', // Space for custom dropdown arrow\n ],\n {\n variants: {\n size: {\n sm: 'h-7 px-2 text-xs',\n md: 'h-9 px-3 text-sm',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n }\n);\n\n// ─── Variant Types ───\n\n// ─── Page Button Variants ───\n\n/**\n * CVA variants for numbered page buttons.\n * Controls button sizing, active state, and interactive states.\n */\nexport const paginatorPageButtonVariants: (props?: {\n size?: PaginatorSize;\n active?: boolean;\n}) => string = cva(\n [\n 'inline-flex items-center justify-center',\n 'rounded-control',\n 'font-medium',\n 'transition-colors duration-150',\n 'cursor-pointer',\n 'focus-visible:outline-[1px] focus-visible:outline-offset-2 focus-visible:outline-ring',\n 'disabled:cursor-not-allowed disabled:bg-disabled disabled:text-disabled-foreground',\n ],\n {\n variants: {\n size: {\n sm: 'h-7 min-w-7 px-1.5 text-xs',\n md: 'h-9 min-w-9 px-2 text-sm',\n },\n active: {\n true: 'bg-primary text-primary-foreground',\n false: 'bg-transparent text-foreground hover:bg-muted hover:text-muted-foreground',\n },\n },\n defaultVariants: {\n size: 'md',\n active: false,\n },\n }\n);\n\n// ─── Ellipsis Variants ───\n\n/**\n * CVA variants for the ellipsis indicator.\n * Controls sizing and styling of the \"...\" text.\n */\nexport const paginatorEllipsisVariants: (props?: {\n size?: PaginatorSize;\n}) => string = cva(\n [\n 'inline-flex items-center justify-center',\n 'text-muted-foreground',\n 'select-none',\n ],\n {\n variants: {\n size: {\n sm: 'h-7 w-7 text-xs',\n md: 'h-9 w-9 text-sm',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n }\n);\n\n// ─── Variant Types ───\n\nexport type PaginatorContainerVariants = VariantProps<typeof paginatorContainerVariants>;\nexport type PaginatorButtonVariants = VariantProps<typeof paginatorButtonVariants>;\nexport type PaginatorRangeLabelVariants = VariantProps<typeof paginatorRangeLabelVariants>;\nexport type PaginatorSelectVariants = VariantProps<typeof paginatorSelectVariants>;\nexport type PaginatorPageButtonVariants = VariantProps<typeof paginatorPageButtonVariants>;\nexport type PaginatorEllipsisVariants = VariantProps<typeof paginatorEllipsisVariants>;\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n input,\n output,\n viewChildren,\n ViewEncapsulation,\n} from '@angular/core';\nimport type {\n InputSignal,\n InputSignalWithTransform,\n OutputEmitterRef,\n Signal,\n} from '@angular/core';\nimport { ComIcon } from 'ngx-com/components/icon';\nimport { defaultRangeLabel, type PageEvent, type RangeLabelFn } from './paginator.models';\nimport {\n paginatorContainerVariants,\n paginatorButtonVariants,\n paginatorRangeLabelVariants,\n paginatorSelectVariants,\n paginatorPageButtonVariants,\n paginatorEllipsisVariants,\n type PaginatorSize,\n type PaginatorLayout,\n} from './paginator.variants';\n\n/** Represents a page number or ellipsis marker in the page range. */\nexport type PageRangeItem = number | 'ellipsis';\n\n/**\n * Paginator component — provides navigation for paginated content.\n *\n * Displays navigation controls, optional page size selector, and range label\n * showing current position within the data set. Supports numbered page buttons\n * when `showPageNumbers` is enabled.\n *\n * @tokens `--color-foreground`, `--color-muted-foreground`,\n * `--color-border`, `--color-muted`,\n * `--color-disabled`, `--color-disabled-foreground`,\n * `--color-ring`, `--color-primary`, `--color-primary-foreground`\n *\n * @example Basic usage\n * ```html\n * <com-paginator\n * [length]=\"100\"\n * [pageSize]=\"10\"\n * [pageIndex]=\"0\"\n * (page)=\"onPageChange($event)\"\n * />\n * ```\n *\n * @example With page size options\n * ```html\n * <com-paginator\n * [length]=\"100\"\n * [pageSize]=\"10\"\n * [pageIndex]=\"0\"\n * [pageSizeOptions]=\"[5, 10, 25, 50]\"\n * (page)=\"onPageChange($event)\"\n * />\n * ```\n *\n * @example With first/last buttons\n * ```html\n * <com-paginator\n * [length]=\"100\"\n * [pageSize]=\"10\"\n * [pageIndex]=\"0\"\n * [showFirstLastButtons]=\"true\"\n * (page)=\"onPageChange($event)\"\n * />\n * ```\n *\n * @example With numbered page buttons\n * ```html\n * <com-paginator\n * [length]=\"97\"\n * [pageSize]=\"10\"\n * [showPageNumbers]=\"true\"\n * (page)=\"onPageChange($event)\"\n * />\n * ```\n *\n * @example Spread layout (summary left, controls right)\n * ```html\n * <com-paginator\n * [length]=\"97\"\n * [pageSize]=\"10\"\n * [showPageNumbers]=\"true\"\n * layout=\"spread\"\n * (page)=\"onPageChange($event)\"\n * />\n * ```\n *\n * @example Small size\n * ```html\n * <com-paginator\n * [length]=\"50\"\n * [pageSize]=\"10\"\n * size=\"sm\"\n * (page)=\"onPageChange($event)\"\n * />\n * ```\n *\n * @example Custom range label (i18n)\n * ```html\n * <com-paginator\n * [length]=\"100\"\n * [pageSize]=\"10\"\n * [rangeLabel]=\"customLabel\"\n * (page)=\"onPageChange($event)\"\n * />\n * ```\n * ```ts\n * customLabel = (page, pageSize, length) => `Seite ${page + 1} von ${Math.ceil(length / pageSize)}`;\n * ```\n */\n@Component({\n selector: 'com-paginator',\n exportAs: 'comPaginator',\n template: `\n <nav\n role=\"navigation\"\n [attr.aria-label]=\"ariaLabel()\"\n [class]=\"containerClasses()\"\n >\n @if (showPageNumbers()) {\n <!-- Spread Layout: Summary on left -->\n @if (layout() === 'spread') {\n <span [class]=\"rangeLabelClasses()\">\n {{ rangeLabelText() }}\n </span>\n }\n\n <!-- Navigation Controls -->\n <div\n class=\"flex items-center gap-1\"\n role=\"group\"\n aria-label=\"Page navigation\"\n (keydown)=\"onPageButtonsKeydown($event)\"\n >\n <!-- Previous Page -->\n <button\n type=\"button\"\n [class]=\"buttonClasses()\"\n [disabled]=\"disabled() || !hasPreviousPage()\"\n aria-label=\"Previous page\"\n (click)=\"previousPage()\"\n >\n <com-icon name=\"chevron-left\" [size]=\"iconSize()\" />\n </button>\n\n <!-- Page Numbers -->\n @for (item of pageRange(); track trackPageItem($index, item)) {\n @if (item === 'ellipsis') {\n <span\n [class]=\"ellipsisClasses()\"\n aria-hidden=\"true\"\n >…</span>\n } @else {\n <button\n #pageBtn\n type=\"button\"\n [class]=\"item === pageIndex() ? activePageButtonClasses() : inactivePageButtonClasses()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'Page ' + (item + 1)\"\n [attr.aria-current]=\"item === pageIndex() ? 'page' : null\"\n [tabindex]=\"item === pageIndex() ? 0 : -1\"\n (click)=\"goToPage(item)\"\n >{{ item + 1 }}</button>\n }\n }\n\n <!-- Next Page -->\n <button\n type=\"button\"\n [class]=\"buttonClasses()\"\n [disabled]=\"disabled() || !hasNextPage()\"\n aria-label=\"Next page\"\n (click)=\"nextPage()\"\n >\n <com-icon name=\"chevron-right\" [size]=\"iconSize()\" />\n </button>\n </div>\n\n <!-- Compact Layout: Summary on right -->\n @if (layout() === 'compact') {\n <span [class]=\"rangeLabelClasses()\">\n {{ rangeLabelText() }}\n </span>\n }\n } @else {\n <!-- Original Layout (no page numbers) -->\n\n <!-- Page Size Selector -->\n @if (!hidePageSize() && pageSizeOptions().length > 0) {\n <div class=\"flex items-center gap-2\">\n <label\n [id]=\"pageSizeLabelId()\"\n class=\"text-muted-foreground\"\n [class.text-xs]=\"size() === 'sm'\"\n [class.text-sm]=\"size() === 'md'\"\n >\n Items per page:\n </label>\n <div class=\"relative\">\n <select\n [attr.aria-labelledby]=\"pageSizeLabelId()\"\n [class]=\"selectClasses()\"\n [disabled]=\"disabled()\"\n [value]=\"pageSize()\"\n (change)=\"onPageSizeChange($event)\"\n >\n @for (option of pageSizeOptions(); track option) {\n <option [value]=\"option\">{{ option }}</option>\n }\n </select>\n <com-icon\n name=\"chevron-down\"\n size=\"xs\"\n class=\"pointer-events-none absolute right-1.5 top-1/2 -translate-y-1/2 text-muted-foreground\"\n />\n </div>\n </div>\n }\n\n <!-- Range Label -->\n <span [class]=\"rangeLabelClasses()\">\n {{ rangeLabelText() }}\n </span>\n\n <!-- Navigation Buttons -->\n <div class=\"flex items-center gap-1\">\n <!-- First Page -->\n @if (showFirstLastButtons()) {\n <button\n type=\"button\"\n [class]=\"buttonClasses()\"\n [disabled]=\"disabled() || !hasPreviousPage()\"\n aria-label=\"First page\"\n (click)=\"firstPage()\"\n >\n <com-icon name=\"chevrons-left\" [size]=\"iconSize()\" />\n </button>\n }\n\n <!-- Previous Page -->\n <button\n type=\"button\"\n [class]=\"buttonClasses()\"\n [disabled]=\"disabled() || !hasPreviousPage()\"\n aria-label=\"Previous page\"\n (click)=\"previousPage()\"\n >\n <com-icon name=\"chevron-left\" [size]=\"iconSize()\" />\n </button>\n\n <!-- Next Page -->\n <button\n type=\"button\"\n [class]=\"buttonClasses()\"\n [disabled]=\"disabled() || !hasNextPage()\"\n aria-label=\"Next page\"\n (click)=\"nextPage()\"\n >\n <com-icon name=\"chevron-right\" [size]=\"iconSize()\" />\n </button>\n\n <!-- Last Page -->\n @if (showFirstLastButtons()) {\n <button\n type=\"button\"\n [class]=\"buttonClasses()\"\n [disabled]=\"disabled() || !hasNextPage()\"\n aria-label=\"Last page\"\n (click)=\"lastPage()\"\n >\n <com-icon name=\"chevrons-right\" [size]=\"iconSize()\" />\n </button>\n }\n </div>\n }\n </nav>\n `,\n styles: `\n com-paginator {\n display: block;\n }\n `,\n imports: [ComIcon],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'com-paginator',\n },\n})\nexport class ComPaginator {\n // ─── View Queries ───\n\n /** Page number buttons for keyboard navigation. */\n private readonly pageButtons = viewChildren<ElementRef<HTMLButtonElement>>('pageBtn');\n\n // ─── Inputs ───\n\n /** Total number of items being paged. */\n readonly length: InputSignal<number> = input<number>(0);\n\n /** Number of items to display per page. */\n readonly pageSize: InputSignal<number> = input<number>(10);\n\n /** Current zero-based page index. */\n readonly pageIndex: InputSignal<number> = input<number>(0);\n\n /** Available page size options. Hides selector if empty. */\n readonly pageSizeOptions: InputSignal<number[]> = input<number[]>([]);\n\n /** Whether to show first/last navigation buttons. */\n readonly showFirstLastButtons: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Whether to show numbered page buttons. */\n readonly showPageNumbers: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Whether all controls are disabled. */\n readonly disabled: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Whether to hide the page size selector. */\n readonly hidePageSize: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Size variant. */\n readonly size: InputSignal<PaginatorSize> = input<PaginatorSize>('md');\n\n /** Layout variant. Only applies when showPageNumbers is true. */\n readonly layout: InputSignal<PaginatorLayout> = input<PaginatorLayout>('compact');\n\n /** Number of pages to show on each side of the current page. */\n readonly siblingCount: InputSignal<number> = input<number>(1);\n\n /** Number of pages to always show at the start and end. */\n readonly boundaryCount: InputSignal<number> = input<number>(1);\n\n /** Accessible label for the nav element. */\n readonly ariaLabel: InputSignal<string> = input<string>('Pagination', { alias: 'aria-label' });\n\n /** Custom function for range label formatting. */\n readonly rangeLabel: InputSignal<RangeLabelFn> = input<RangeLabelFn>(defaultRangeLabel);\n\n // ─── Outputs ───\n\n /** Emits when page index or page size changes. */\n readonly page: OutputEmitterRef<PageEvent> = output<PageEvent>();\n\n // ─── Computed ───\n\n /** Total number of pages. */\n protected readonly numberOfPages: Signal<number> = computed(() => {\n const size = this.pageSize();\n const len = this.length();\n if (size === 0 || len === 0) {\n return 0;\n }\n return Math.ceil(len / size);\n });\n\n /** Whether there is a previous page. */\n protected readonly hasPreviousPage: Signal<boolean> = computed(() => {\n return this.pageIndex() > 0 && this.pageSize() > 0;\n });\n\n /** Whether there is a next page. */\n protected readonly hasNextPage: Signal<boolean> = computed(() => {\n const total = this.numberOfPages();\n return total > 0 && this.pageIndex() < total - 1;\n });\n\n /** The formatted range label text. */\n protected readonly rangeLabelText: Signal<string> = computed(() => {\n const fn = this.rangeLabel();\n return fn(this.pageIndex(), this.pageSize(), this.length());\n });\n\n /** Icon size based on component size. */\n protected readonly iconSize: Signal<'xs' | 'sm'> = computed(() => {\n return this.size() === 'sm' ? 'xs' : 'sm';\n });\n\n /** Unique ID for page size label. */\n protected readonly pageSizeLabelId: Signal<string> = computed(() => {\n return `com-paginator-page-size-label-${uniqueId++}`;\n });\n\n /** Classes for the container. */\n protected readonly containerClasses: Signal<string> = computed(() =>\n paginatorContainerVariants({\n size: this.size(),\n layout: this.showPageNumbers() ? this.layout() : 'compact',\n })\n );\n\n /** Classes for navigation buttons. */\n protected readonly buttonClasses: Signal<string> = computed(() =>\n paginatorButtonVariants({ size: this.size() })\n );\n\n /** Classes for the range label. */\n protected readonly rangeLabelClasses: Signal<string> = computed(() =>\n paginatorRangeLabelVariants({ size: this.size() })\n );\n\n /** Classes for the page size select. */\n protected readonly selectClasses: Signal<string> = computed(() =>\n paginatorSelectVariants({ size: this.size() })\n );\n\n /** Classes for the ellipsis indicator. */\n protected readonly ellipsisClasses: Signal<string> = computed(() =>\n paginatorEllipsisVariants({ size: this.size() })\n );\n\n /** Cached classes for active page button. */\n protected readonly activePageButtonClasses: Signal<string> = computed(() =>\n paginatorPageButtonVariants({ size: this.size(), active: true })\n );\n\n /** Cached classes for inactive page button. */\n protected readonly inactivePageButtonClasses: Signal<string> = computed(() =>\n paginatorPageButtonVariants({ size: this.size(), active: false })\n );\n\n /**\n * Computed page range for numbered pagination.\n * Returns array like [0, 'ellipsis', 3, 4, 5, 'ellipsis', 9] (zero-indexed).\n */\n protected readonly pageRange: Signal<PageRangeItem[]> = computed(() => {\n const totalPages = this.numberOfPages();\n const current = this.pageIndex();\n const siblings = this.siblingCount();\n const boundaries = this.boundaryCount();\n\n if (totalPages === 0) return [];\n\n // If all pages fit without ellipses, show them all\n const totalSlots = 2 * boundaries + 2 * siblings + 3;\n if (totalPages <= totalSlots) {\n return this.range(0, totalPages - 1);\n }\n\n // Collect all page indices that should be visible (Set auto-deduplicates)\n const pages = new Set<number>();\n\n // Boundary pages (always visible)\n for (let i = 0; i < boundaries; i++) pages.add(i);\n for (let i = totalPages - boundaries; i < totalPages; i++) pages.add(i);\n\n // Sibling pages around current (including current)\n const siblingStart = Math.max(0, current - siblings);\n const siblingEnd = Math.min(totalPages - 1, current + siblings);\n for (let i = siblingStart; i <= siblingEnd; i++) pages.add(i);\n\n // Convert to sorted array and insert ellipses at gaps\n const sorted = Array.from(pages).sort((a, b) => a - b);\n const result: PageRangeItem[] = [];\n\n for (let i = 0; i < sorted.length; i++) {\n const page = sorted[i]!;\n const prevPage = sorted[i - 1];\n if (prevPage !== undefined && page - prevPage > 1) {\n result.push('ellipsis');\n }\n result.push(page);\n }\n\n return result;\n });\n\n // ─── Navigation Methods ───\n\n /** Navigate to the first page. */\n firstPage(): void {\n if (this.hasPreviousPage()) {\n this.emitPageEvent(0);\n }\n }\n\n /** Navigate to the previous page. */\n previousPage(): void {\n if (this.hasPreviousPage()) {\n this.emitPageEvent(this.pageIndex() - 1);\n }\n }\n\n /** Navigate to the next page. */\n nextPage(): void {\n if (this.hasNextPage()) {\n this.emitPageEvent(this.pageIndex() + 1);\n }\n }\n\n /** Navigate to the last page. */\n lastPage(): void {\n if (this.hasNextPage()) {\n this.emitPageEvent(this.numberOfPages() - 1);\n }\n }\n\n /** Navigate to a specific page by index (zero-based). */\n goToPage(pageIndex: number): void {\n if (pageIndex >= 0 && pageIndex < this.numberOfPages() && pageIndex !== this.pageIndex()) {\n this.emitPageEvent(pageIndex);\n }\n }\n\n /** Handle page size selection change. */\n protected onPageSizeChange(event: Event): void {\n const select = event.target as HTMLSelectElement;\n const newPageSize = Number(select.value);\n const previousPageSize = this.pageSize();\n const currentPageIndex = this.pageIndex();\n\n // Calculate new page index to keep the first item on the current page visible\n const startIndex = currentPageIndex * previousPageSize;\n const newPageIndex = Math.floor(startIndex / newPageSize);\n\n this.page.emit({\n pageIndex: newPageIndex,\n previousPageIndex: currentPageIndex,\n pageSize: newPageSize,\n length: this.length(),\n });\n }\n\n /** Handle keyboard navigation within page buttons (roving tabindex). */\n protected onPageButtonsKeydown(event: KeyboardEvent): void {\n const target = event.target as HTMLButtonElement;\n\n // Get enabled buttons from viewChildren query\n const buttons = this.pageButtons()\n .map((ref) => ref.nativeElement)\n .filter((btn) => !btn.disabled);\n\n const currentIndex = buttons.indexOf(target);\n if (currentIndex === -1) return;\n\n let newIndex: number;\n switch (event.key) {\n case 'ArrowLeft':\n newIndex = currentIndex > 0 ? currentIndex - 1 : buttons.length - 1;\n break;\n case 'ArrowRight':\n newIndex = currentIndex < buttons.length - 1 ? currentIndex + 1 : 0;\n break;\n case 'Home':\n newIndex = 0;\n break;\n case 'End':\n newIndex = buttons.length - 1;\n break;\n default:\n return;\n }\n\n event.preventDefault();\n buttons[newIndex]?.focus();\n }\n\n /** Track function for page items. */\n protected trackPageItem(index: number, item: PageRangeItem): string {\n return item === 'ellipsis' ? `ellipsis-${index}` : `page-${item}`;\n }\n\n // ─── Private Methods ───\n\n private emitPageEvent(newPageIndex: number): void {\n this.page.emit({\n pageIndex: newPageIndex,\n previousPageIndex: this.pageIndex(),\n pageSize: this.pageSize(),\n length: this.length(),\n });\n }\n\n /** Generate a range of numbers from start to end (inclusive). */\n private range(start: number, end: number): number[] {\n return Array.from({ length: end - start + 1 }, (_, i) => start + i);\n }\n}\n\n/** Counter for generating unique IDs. */\nlet uniqueId = 0;\n","// Public API for the paginator component\n\n// Main component\nexport { ComPaginator } from './paginator.component';\nexport type { PageRangeItem } from './paginator.component';\n\n// Models\nexport { defaultRangeLabel } from './paginator.models';\nexport type { PageEvent, RangeLabelFn } from './paginator.models';\n\n// Variants\nexport {\n paginatorContainerVariants,\n paginatorButtonVariants,\n paginatorRangeLabelVariants,\n paginatorSelectVariants,\n paginatorPageButtonVariants,\n paginatorEllipsisVariants,\n} from './paginator.variants';\n\nexport type {\n PaginatorSize,\n PaginatorLayout,\n PaginatorContainerVariants,\n PaginatorButtonVariants,\n PaginatorRangeLabelVariants,\n PaginatorSelectVariants,\n PaginatorPageButtonVariants,\n PaginatorEllipsisVariants,\n} from './paginator.variants';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AAyBA;;;AAGG;SACa,iBAAiB,CAAC,IAAY,EAAE,QAAgB,EAAE,MAAc,EAAA;IAC9E,IAAI,MAAM,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,EAAE;QAClC,OAAO,CAAA,KAAA,EAAQ,MAAM,CAAA,CAAE;IACzB;AAEA,IAAA,MAAM,UAAU,GAAG,IAAI,GAAG,QAAQ;;AAElC,IAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,QAAQ,EAAE,MAAM,CAAC;IAExD,OAAO,CAAA,EAAG,UAAU,GAAG,CAAC,MAAM,QAAQ,CAAA,IAAA,EAAO,MAAM,CAAA,CAAE;AACvD;;AChCA;AAEA;;;AAGG;AACI,MAAM,0BAA0B,GAGxB,GAAG,CAChB;IACE,mBAAmB;IACnB,iBAAiB;IACjB,aAAa;CACd,EACD;AACE,IAAA,QAAQ,EAAE;AACR,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,eAAe;AACnB,YAAA,EAAE,EAAE,eAAe;AACpB,SAAA;AACD,QAAA,MAAM,EAAE;AACN,YAAA,OAAO,EAAE,aAAa;AACtB,YAAA,MAAM,EAAE,iBAAiB;AAC1B,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,MAAM,EAAE,SAAS;AAClB,KAAA;AACF,CAAA;AAGH;AAEA;;;AAGG;AACI,MAAM,uBAAuB,GAErB,GAAG,CAChB;IACE,yCAAyC;IACzC,iBAAiB;IACjB,sBAAsB;IACtB,gBAAgB;IAChB,gCAAgC;IAChC,gBAAgB;IAChB,4CAA4C;IAC5C,uFAAuF;IACvF,6GAA6G;CAC9G,EACD;AACE,IAAA,QAAQ,EAAE;AACR,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,SAAS;AACb,YAAA,EAAE,EAAE,SAAS;AACd,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,IAAI,EAAE,IAAI;AACX,KAAA;AACF,CAAA;AAGH;AAEA;;;AAGG;AACI,MAAM,2BAA2B,GAEzB,GAAG,CAChB;IACE,uBAAuB;IACvB,mBAAmB;CACpB,EACD;AACE,IAAA,QAAQ,EAAE;AACR,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,SAAS;AACb,YAAA,EAAE,EAAE,SAAS;AACd,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,IAAI,EAAE,IAAI;AACX,KAAA;AACF,CAAA;AAGH;AAEA;;;AAGG;AACI,MAAM,uBAAuB,GAErB,GAAG,CAChB;IACE,iBAAiB;IACjB,iBAAiB;IACjB,sBAAsB;IACtB,gBAAgB;IAChB,iBAAiB;IACjB,gBAAgB;IAChB,gCAAgC;IAChC,gBAAgB;IAChB,uFAAuF;IACvF,6GAA6G;AAC7G,IAAA,MAAM;CACP,EACD;AACE,IAAA,QAAQ,EAAE;AACR,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,kBAAkB;AACtB,YAAA,EAAE,EAAE,kBAAkB;AACvB,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,IAAI,EAAE,IAAI;AACX,KAAA;AACF,CAAA;AAGH;AAEA;AAEA;;;AAGG;AACI,MAAM,2BAA2B,GAGzB,GAAG,CAChB;IACE,yCAAyC;IACzC,iBAAiB;IACjB,aAAa;IACb,gCAAgC;IAChC,gBAAgB;IAChB,uFAAuF;IACvF,oFAAoF;CACrF,EACD;AACE,IAAA,QAAQ,EAAE;AACR,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,4BAA4B;AAChC,YAAA,EAAE,EAAE,0BAA0B;AAC/B,SAAA;AACD,QAAA,MAAM,EAAE;AACN,YAAA,IAAI,EAAE,oCAAoC;AAC1C,YAAA,KAAK,EAAE,2EAA2E;AACnF,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,MAAM,EAAE,KAAK;AACd,KAAA;AACF,CAAA;AAGH;AAEA;;;AAGG;AACI,MAAM,yBAAyB,GAEvB,GAAG,CAChB;IACE,yCAAyC;IACzC,uBAAuB;IACvB,aAAa;CACd,EACD;AACE,IAAA,QAAQ,EAAE;AACR,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,iBAAiB;AACrB,YAAA,EAAE,EAAE,iBAAiB;AACtB,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,IAAI,EAAE,IAAI;AACX,KAAA;AACF,CAAA;;ACpKH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuFG;MAoLU,YAAY,CAAA;;;AAIN,IAAA,WAAW,GAAG,YAAY,CAAgC,SAAS,uDAAC;;;AAK5E,IAAA,MAAM,GAAwB,KAAK,CAAS,CAAC,kDAAC;;AAG9C,IAAA,QAAQ,GAAwB,KAAK,CAAS,EAAE,oDAAC;;AAGjD,IAAA,SAAS,GAAwB,KAAK,CAAS,CAAC,qDAAC;;AAGjD,IAAA,eAAe,GAA0B,KAAK,CAAW,EAAE,2DAAC;;IAG5D,oBAAoB,GAA+C,KAAK,CAAC,KAAK,iEACrF,SAAS,EAAE,gBAAgB,EAAA,CAC3B;;IAGO,eAAe,GAA+C,KAAK,CAAC,KAAK,4DAChF,SAAS,EAAE,gBAAgB,EAAA,CAC3B;;IAGO,QAAQ,GAA+C,KAAK,CAAC,KAAK,qDACzE,SAAS,EAAE,gBAAgB,EAAA,CAC3B;;IAGO,YAAY,GAA+C,KAAK,CAAC,KAAK,yDAC7E,SAAS,EAAE,gBAAgB,EAAA,CAC3B;;AAGO,IAAA,IAAI,GAA+B,KAAK,CAAgB,IAAI,gDAAC;;AAG7D,IAAA,MAAM,GAAiC,KAAK,CAAkB,SAAS,kDAAC;;AAGxE,IAAA,YAAY,GAAwB,KAAK,CAAS,CAAC,wDAAC;;AAGpD,IAAA,aAAa,GAAwB,KAAK,CAAS,CAAC,yDAAC;;IAGrD,SAAS,GAAwB,KAAK,CAAS,YAAY,sDAAI,KAAK,EAAE,YAAY,EAAA,CAAG;;AAGrF,IAAA,UAAU,GAA8B,KAAK,CAAe,iBAAiB,sDAAC;;;IAK9E,IAAI,GAAgC,MAAM,EAAa;;;AAK7C,IAAA,aAAa,GAAmB,QAAQ,CAAC,MAAK;AAC/D,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC5B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE;QACzB,IAAI,IAAI,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,EAAE;AAC3B,YAAA,OAAO,CAAC;QACV;QACA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;AAC9B,IAAA,CAAC,yDAAC;;AAGiB,IAAA,eAAe,GAAoB,QAAQ,CAAC,MAAK;AAClE,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;AACpD,IAAA,CAAC,2DAAC;;AAGiB,IAAA,WAAW,GAAoB,QAAQ,CAAC,MAAK;AAC9D,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE;AAClC,QAAA,OAAO,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,GAAG,KAAK,GAAG,CAAC;AAClD,IAAA,CAAC,uDAAC;;AAGiB,IAAA,cAAc,GAAmB,QAAQ,CAAC,MAAK;AAChE,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE;AAC5B,QAAA,OAAO,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AAC7D,IAAA,CAAC,0DAAC;;AAGiB,IAAA,QAAQ,GAAwB,QAAQ,CAAC,MAAK;AAC/D,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI;AAC3C,IAAA,CAAC,oDAAC;;AAGiB,IAAA,eAAe,GAAmB,QAAQ,CAAC,MAAK;AACjE,QAAA,OAAO,CAAA,8BAAA,EAAiC,QAAQ,EAAE,CAAA,CAAE;AACtD,IAAA,CAAC,2DAAC;;AAGiB,IAAA,gBAAgB,GAAmB,QAAQ,CAAC,MAC7D,0BAA0B,CAAC;AACzB,QAAA,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;AACjB,QAAA,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,SAAS;AAC3D,KAAA,CAAC,4DACH;;AAGkB,IAAA,aAAa,GAAmB,QAAQ,CAAC,MAC1D,uBAAuB,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,yDAC/C;;AAGkB,IAAA,iBAAiB,GAAmB,QAAQ,CAAC,MAC9D,2BAA2B,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,6DACnD;;AAGkB,IAAA,aAAa,GAAmB,QAAQ,CAAC,MAC1D,uBAAuB,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,yDAC/C;;AAGkB,IAAA,eAAe,GAAmB,QAAQ,CAAC,MAC5D,yBAAyB,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,2DACjD;;IAGkB,uBAAuB,GAAmB,QAAQ,CAAC,MACpE,2BAA2B,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,yBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACjE;;IAGkB,yBAAyB,GAAmB,QAAQ,CAAC,MACtE,2BAA2B,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,2BAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAClE;AAED;;;AAGG;AACgB,IAAA,SAAS,GAA4B,QAAQ,CAAC,MAAK;AACpE,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE;AACvC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE;AAChC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE;AACpC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE;QAEvC,IAAI,UAAU,KAAK,CAAC;AAAE,YAAA,OAAO,EAAE;;QAG/B,MAAM,UAAU,GAAG,CAAC,GAAG,UAAU,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC;AACpD,QAAA,IAAI,UAAU,IAAI,UAAU,EAAE;YAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC;QACtC;;AAGA,QAAA,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU;;QAG/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE;AAAE,YAAA,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AACjD,QAAA,KAAK,IAAI,CAAC,GAAG,UAAU,GAAG,UAAU,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE;AAAE,YAAA,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;;AAGvE,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;AACpD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;QAC/D,KAAK,IAAI,CAAC,GAAG,YAAY,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,EAAE;AAAE,YAAA,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;;QAG7D,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACtD,MAAM,MAAM,GAAoB,EAAE;AAElC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACtC,YAAA,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAE;YACvB,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,QAAQ,KAAK,SAAS,IAAI,IAAI,GAAG,QAAQ,GAAG,CAAC,EAAE;AACjD,gBAAA,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;YACzB;AACA,YAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QACnB;AAEA,QAAA,OAAO,MAAM;AACf,IAAA,CAAC,qDAAC;;;IAKF,SAAS,GAAA;AACP,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;AAC1B,YAAA,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QACvB;IACF;;IAGA,YAAY,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;YAC1B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAC1C;IACF;;IAGA,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;YACtB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAC1C;IACF;;IAGA,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;YACtB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QAC9C;IACF;;AAGA,IAAA,QAAQ,CAAC,SAAiB,EAAA;AACxB,QAAA,IAAI,SAAS,IAAI,CAAC,IAAI,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,SAAS,KAAK,IAAI,CAAC,SAAS,EAAE,EAAE;AACxF,YAAA,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC;QAC/B;IACF;;AAGU,IAAA,gBAAgB,CAAC,KAAY,EAAA;AACrC,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA2B;QAChD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;AACxC,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,EAAE;AACxC,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,EAAE;;AAGzC,QAAA,MAAM,UAAU,GAAG,gBAAgB,GAAG,gBAAgB;QACtD,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,WAAW,CAAC;AAEzD,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACb,YAAA,SAAS,EAAE,YAAY;AACvB,YAAA,iBAAiB,EAAE,gBAAgB;AACnC,YAAA,QAAQ,EAAE,WAAW;AACrB,YAAA,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;AACtB,SAAA,CAAC;IACJ;;AAGU,IAAA,oBAAoB,CAAC,KAAoB,EAAA;AACjD,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA2B;;AAGhD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW;aAC7B,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,aAAa;aAC9B,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;QAEjC,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;QAC5C,IAAI,YAAY,KAAK,CAAC,CAAC;YAAE;AAEzB,QAAA,IAAI,QAAgB;AACpB,QAAA,QAAQ,KAAK,CAAC,GAAG;AACf,YAAA,KAAK,WAAW;AACd,gBAAA,QAAQ,GAAG,YAAY,GAAG,CAAC,GAAG,YAAY,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC;gBACnE;AACF,YAAA,KAAK,YAAY;AACf,gBAAA,QAAQ,GAAG,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,YAAY,GAAG,CAAC,GAAG,CAAC;gBACnE;AACF,YAAA,KAAK,MAAM;gBACT,QAAQ,GAAG,CAAC;gBACZ;AACF,YAAA,KAAK,KAAK;AACR,gBAAA,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC;gBAC7B;AACF,YAAA;gBACE;;QAGJ,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE;IAC5B;;IAGU,aAAa,CAAC,KAAa,EAAE,IAAmB,EAAA;AACxD,QAAA,OAAO,IAAI,KAAK,UAAU,GAAG,CAAA,SAAA,EAAY,KAAK,CAAA,CAAE,GAAG,CAAA,KAAA,EAAQ,IAAI,EAAE;IACnE;;AAIQ,IAAA,aAAa,CAAC,YAAoB,EAAA;AACxC,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACb,YAAA,SAAS,EAAE,YAAY;AACvB,YAAA,iBAAiB,EAAE,IAAI,CAAC,SAAS,EAAE;AACnC,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AACzB,YAAA,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;AACtB,SAAA,CAAC;IACJ;;IAGQ,KAAK,CAAC,KAAa,EAAE,GAAW,EAAA;QACtC,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,GAAG,KAAK,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC;IACrE;uGAvSW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,eAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,aAAA,EAAA,SAAA,EAAA,CAAA,SAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAhLb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmKT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,gCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAMS,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,MAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAON,YAAY,EAAA,UAAA,EAAA,CAAA;kBAnLxB,SAAS;+BACE,eAAe,EAAA,QAAA,EACf,cAAc,EAAA,QAAA,EACd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmKT,EAAA,OAAA,EAMQ,CAAC,OAAO,CAAC,EAAA,eAAA,EACD,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,IAAI,EAAA,IAAA,EAC/B;AACJ,wBAAA,KAAK,EAAE,eAAe;AACvB,qBAAA,EAAA,MAAA,EAAA,CAAA,gCAAA,CAAA,EAAA;4EAM0E,SAAS,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,oBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,eAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,MAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;AAsStF;AACA,IAAI,QAAQ,GAAG,CAAC;;ACvlBhB;AAEA;;ACFA;;AAEG;;;;"}
1
+ {"version":3,"file":"ngx-com-components-paginator.mjs","sources":["../../../projects/com/components/paginator/paginator.models.ts","../../../projects/com/components/paginator/paginator.variants.ts","../../../projects/com/components/paginator/paginator.component.ts","../../../projects/com/components/paginator/index.ts","../../../projects/com/components/paginator/ngx-com-components-paginator.ts"],"sourcesContent":["/**\n * Event emitted when the paginator changes page index or page size.\n */\nexport interface PageEvent {\n /** The current zero-based page index. */\n pageIndex: number;\n /** The previous zero-based page index. */\n previousPageIndex: number;\n /** The current page size. */\n pageSize: number;\n /** The total number of items being paged. */\n length: number;\n}\n\n/**\n * Function signature for custom range label formatting.\n * Used for i18n and custom label display.\n *\n * @param page Current page index (zero-based)\n * @param pageSize Number of items per page\n * @param length Total number of items\n * @returns Formatted string to display (e.g., \"1 – 10 of 100\")\n */\nexport type RangeLabelFn = (page: number, pageSize: number, length: number) => string;\n\n/**\n * Default range label function.\n * Produces output like \"1 – 10 of 100\" or \"0 of 0\" when empty.\n */\nexport function defaultRangeLabel(page: number, pageSize: number, length: number): string {\n if (length === 0 || pageSize === 0) {\n return `0 of ${length}`;\n }\n\n const startIndex = page * pageSize;\n // Ensure end index doesn't exceed length\n const endIndex = Math.min(startIndex + pageSize, length);\n\n return `${startIndex + 1} – ${endIndex} of ${length}`;\n}\n","import { cva, type VariantProps } from 'class-variance-authority';\n\n// ─── Types ───\n\nexport type PaginatorSize = 'sm' | 'md';\nexport type PaginatorLayout = 'compact' | 'spread';\n\n// ─── Container Variants ───\n\n/**\n * CVA variants for the paginator container.\n * Controls overall layout and spacing.\n */\nexport const paginatorContainerVariants: (props?: {\n size?: PaginatorSize;\n layout?: PaginatorLayout;\n}) => string = cva(\n [\n 'flex items-center',\n 'text-foreground',\n 'select-none',\n ],\n {\n variants: {\n size: {\n sm: 'gap-3 text-xs',\n md: 'gap-4 text-sm',\n },\n layout: {\n compact: 'justify-end',\n spread: 'justify-between',\n },\n },\n defaultVariants: {\n size: 'md',\n layout: 'compact',\n },\n }\n);\n\n// ─── Button Variants ───\n\n/**\n * CVA variants for paginator navigation buttons.\n * Controls button sizing, borders, and interactive states.\n */\nexport const paginatorButtonVariants: (props?: {\n size?: PaginatorSize;\n}) => string = cva(\n [\n 'inline-flex items-center justify-center',\n 'rounded-control',\n 'border border-border',\n 'bg-transparent',\n 'transition-colors duration-normal',\n 'cursor-pointer',\n 'hover:bg-muted hover:text-muted-foreground',\n 'focus-visible:outline-[1px] focus-visible:outline-offset-2 focus-visible:outline-ring',\n 'disabled:cursor-not-allowed disabled:bg-disabled disabled:text-disabled-foreground disabled:border-disabled',\n ],\n {\n variants: {\n size: {\n sm: 'h-7 w-7',\n md: 'h-9 w-9',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n }\n);\n\n// ─── Range Label Variants ───\n\n/**\n * CVA variants for the range label text.\n * Controls typography and color.\n */\nexport const paginatorRangeLabelVariants: (props?: {\n size?: PaginatorSize;\n}) => string = cva(\n [\n 'text-muted-foreground',\n 'whitespace-nowrap',\n ],\n {\n variants: {\n size: {\n sm: 'text-xs',\n md: 'text-sm',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n }\n);\n\n// ─── Page Size Selector Variants ───\n\n/**\n * CVA variants for the page size select element.\n * Controls sizing and styling of the native select.\n */\nexport const paginatorSelectVariants: (props?: {\n size?: PaginatorSize;\n}) => string = cva(\n [\n 'appearance-none',\n 'rounded-control',\n 'border border-border',\n 'bg-transparent',\n 'text-foreground',\n 'cursor-pointer',\n 'transition-colors duration-normal',\n 'hover:bg-muted',\n 'focus-visible:outline-[1px] focus-visible:outline-offset-2 focus-visible:outline-ring',\n 'disabled:cursor-not-allowed disabled:bg-disabled disabled:text-disabled-foreground disabled:border-disabled',\n 'pr-6', // Space for custom dropdown arrow\n ],\n {\n variants: {\n size: {\n sm: 'h-7 px-2 text-xs',\n md: 'h-9 px-3 text-sm',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n }\n);\n\n// ─── Variant Types ───\n\n// ─── Page Button Variants ───\n\n/**\n * CVA variants for numbered page buttons.\n * Controls button sizing, active state, and interactive states.\n */\nexport const paginatorPageButtonVariants: (props?: {\n size?: PaginatorSize;\n active?: boolean;\n}) => string = cva(\n [\n 'inline-flex items-center justify-center',\n 'rounded-control',\n 'font-medium',\n 'transition-colors duration-normal',\n 'cursor-pointer',\n 'focus-visible:outline-[1px] focus-visible:outline-offset-2 focus-visible:outline-ring',\n 'disabled:cursor-not-allowed disabled:bg-disabled disabled:text-disabled-foreground',\n ],\n {\n variants: {\n size: {\n sm: 'h-7 min-w-7 px-1.5 text-xs',\n md: 'h-9 min-w-9 px-2 text-sm',\n },\n active: {\n true: 'bg-primary text-primary-foreground',\n false: 'bg-transparent text-foreground hover:bg-muted hover:text-muted-foreground',\n },\n },\n defaultVariants: {\n size: 'md',\n active: false,\n },\n }\n);\n\n// ─── Ellipsis Variants ───\n\n/**\n * CVA variants for the ellipsis indicator.\n * Controls sizing and styling of the \"...\" text.\n */\nexport const paginatorEllipsisVariants: (props?: {\n size?: PaginatorSize;\n}) => string = cva(\n [\n 'inline-flex items-center justify-center',\n 'text-muted-foreground',\n 'select-none',\n ],\n {\n variants: {\n size: {\n sm: 'h-7 w-7 text-xs',\n md: 'h-9 w-9 text-sm',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n }\n);\n\n// ─── Variant Types ───\n\nexport type PaginatorContainerVariants = VariantProps<typeof paginatorContainerVariants>;\nexport type PaginatorButtonVariants = VariantProps<typeof paginatorButtonVariants>;\nexport type PaginatorRangeLabelVariants = VariantProps<typeof paginatorRangeLabelVariants>;\nexport type PaginatorSelectVariants = VariantProps<typeof paginatorSelectVariants>;\nexport type PaginatorPageButtonVariants = VariantProps<typeof paginatorPageButtonVariants>;\nexport type PaginatorEllipsisVariants = VariantProps<typeof paginatorEllipsisVariants>;\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n input,\n output,\n viewChildren,\n ViewEncapsulation,\n} from '@angular/core';\nimport type {\n InputSignal,\n InputSignalWithTransform,\n OutputEmitterRef,\n Signal,\n} from '@angular/core';\nimport { ComIcon } from 'ngx-com/components/icon';\nimport { defaultRangeLabel, type PageEvent, type RangeLabelFn } from './paginator.models';\nimport {\n paginatorContainerVariants,\n paginatorButtonVariants,\n paginatorRangeLabelVariants,\n paginatorSelectVariants,\n paginatorPageButtonVariants,\n paginatorEllipsisVariants,\n type PaginatorSize,\n type PaginatorLayout,\n} from './paginator.variants';\n\n/** Represents a page number or ellipsis marker in the page range. */\nexport type PageRangeItem = number | 'ellipsis';\n\n/**\n * Paginator component — provides navigation for paginated content.\n *\n * Displays navigation controls, optional page size selector, and range label\n * showing current position within the data set. Supports numbered page buttons\n * when `showPageNumbers` is enabled.\n *\n * @tokens `--color-foreground`, `--color-muted-foreground`,\n * `--color-border`, `--color-muted`,\n * `--color-disabled`, `--color-disabled-foreground`,\n * `--color-ring`, `--color-primary`, `--color-primary-foreground`\n *\n * @example Basic usage\n * ```html\n * <com-paginator\n * [length]=\"100\"\n * [pageSize]=\"10\"\n * [pageIndex]=\"0\"\n * (page)=\"onPageChange($event)\"\n * />\n * ```\n *\n * @example With page size options\n * ```html\n * <com-paginator\n * [length]=\"100\"\n * [pageSize]=\"10\"\n * [pageIndex]=\"0\"\n * [pageSizeOptions]=\"[5, 10, 25, 50]\"\n * (page)=\"onPageChange($event)\"\n * />\n * ```\n *\n * @example With first/last buttons\n * ```html\n * <com-paginator\n * [length]=\"100\"\n * [pageSize]=\"10\"\n * [pageIndex]=\"0\"\n * [showFirstLastButtons]=\"true\"\n * (page)=\"onPageChange($event)\"\n * />\n * ```\n *\n * @example With numbered page buttons\n * ```html\n * <com-paginator\n * [length]=\"97\"\n * [pageSize]=\"10\"\n * [showPageNumbers]=\"true\"\n * (page)=\"onPageChange($event)\"\n * />\n * ```\n *\n * @example Spread layout (summary left, controls right)\n * ```html\n * <com-paginator\n * [length]=\"97\"\n * [pageSize]=\"10\"\n * [showPageNumbers]=\"true\"\n * layout=\"spread\"\n * (page)=\"onPageChange($event)\"\n * />\n * ```\n *\n * @example Small size\n * ```html\n * <com-paginator\n * [length]=\"50\"\n * [pageSize]=\"10\"\n * size=\"sm\"\n * (page)=\"onPageChange($event)\"\n * />\n * ```\n *\n * @example Custom range label (i18n)\n * ```html\n * <com-paginator\n * [length]=\"100\"\n * [pageSize]=\"10\"\n * [rangeLabel]=\"customLabel\"\n * (page)=\"onPageChange($event)\"\n * />\n * ```\n * ```ts\n * customLabel = (page, pageSize, length) => `Seite ${page + 1} von ${Math.ceil(length / pageSize)}`;\n * ```\n */\n@Component({\n selector: 'com-paginator',\n exportAs: 'comPaginator',\n template: `\n <nav\n role=\"navigation\"\n [attr.aria-label]=\"ariaLabel()\"\n [class]=\"containerClasses()\"\n >\n @if (showPageNumbers()) {\n <!-- Spread Layout: Summary on left -->\n @if (layout() === 'spread') {\n <span [class]=\"rangeLabelClasses()\">\n {{ rangeLabelText() }}\n </span>\n }\n\n <!-- Navigation Controls -->\n <div\n class=\"flex items-center gap-1\"\n role=\"group\"\n aria-label=\"Page navigation\"\n (keydown)=\"onPageButtonsKeydown($event)\"\n >\n <!-- Previous Page -->\n <button\n type=\"button\"\n [class]=\"buttonClasses()\"\n [disabled]=\"disabled() || !hasPreviousPage()\"\n aria-label=\"Previous page\"\n (click)=\"previousPage()\"\n >\n <com-icon name=\"chevron-left\" [size]=\"iconSize()\" />\n </button>\n\n <!-- Page Numbers -->\n @for (item of pageRange(); track trackPageItem($index, item)) {\n @if (item === 'ellipsis') {\n <span\n [class]=\"ellipsisClasses()\"\n aria-hidden=\"true\"\n >…</span>\n } @else {\n <button\n #pageBtn\n type=\"button\"\n [class]=\"item === pageIndex() ? activePageButtonClasses() : inactivePageButtonClasses()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'Page ' + (item + 1)\"\n [attr.aria-current]=\"item === pageIndex() ? 'page' : null\"\n [tabindex]=\"item === pageIndex() ? 0 : -1\"\n (click)=\"goToPage(item)\"\n >{{ item + 1 }}</button>\n }\n }\n\n <!-- Next Page -->\n <button\n type=\"button\"\n [class]=\"buttonClasses()\"\n [disabled]=\"disabled() || !hasNextPage()\"\n aria-label=\"Next page\"\n (click)=\"nextPage()\"\n >\n <com-icon name=\"chevron-right\" [size]=\"iconSize()\" />\n </button>\n </div>\n\n <!-- Compact Layout: Summary on right -->\n @if (layout() === 'compact') {\n <span [class]=\"rangeLabelClasses()\">\n {{ rangeLabelText() }}\n </span>\n }\n } @else {\n <!-- Original Layout (no page numbers) -->\n\n <!-- Page Size Selector -->\n @if (!hidePageSize() && pageSizeOptions().length > 0) {\n <div class=\"flex items-center gap-2\">\n <label\n [id]=\"pageSizeLabelId()\"\n [attr.for]=\"pageSizeSelectId()\"\n class=\"text-muted-foreground\"\n [class.text-xs]=\"size() === 'sm'\"\n [class.text-sm]=\"size() === 'md'\"\n >\n Items per page:\n </label>\n <div class=\"relative\">\n <select\n [id]=\"pageSizeSelectId()\"\n [attr.aria-labelledby]=\"pageSizeLabelId()\"\n [class]=\"selectClasses()\"\n [disabled]=\"disabled()\"\n [value]=\"pageSize()\"\n (change)=\"onPageSizeChange($event)\"\n >\n @for (option of pageSizeOptions(); track option) {\n <option [value]=\"option\">{{ option }}</option>\n }\n </select>\n <com-icon\n name=\"chevron-down\"\n size=\"xs\"\n class=\"pointer-events-none absolute right-1.5 top-1/2 -translate-y-1/2 text-muted-foreground\"\n />\n </div>\n </div>\n }\n\n <!-- Range Label -->\n <span [class]=\"rangeLabelClasses()\">\n {{ rangeLabelText() }}\n </span>\n\n <!-- Navigation Buttons -->\n <div class=\"flex items-center gap-1\">\n <!-- First Page -->\n @if (showFirstLastButtons()) {\n <button\n type=\"button\"\n [class]=\"buttonClasses()\"\n [disabled]=\"disabled() || !hasPreviousPage()\"\n aria-label=\"First page\"\n (click)=\"firstPage()\"\n >\n <com-icon name=\"chevrons-left\" [size]=\"iconSize()\" />\n </button>\n }\n\n <!-- Previous Page -->\n <button\n type=\"button\"\n [class]=\"buttonClasses()\"\n [disabled]=\"disabled() || !hasPreviousPage()\"\n aria-label=\"Previous page\"\n (click)=\"previousPage()\"\n >\n <com-icon name=\"chevron-left\" [size]=\"iconSize()\" />\n </button>\n\n <!-- Next Page -->\n <button\n type=\"button\"\n [class]=\"buttonClasses()\"\n [disabled]=\"disabled() || !hasNextPage()\"\n aria-label=\"Next page\"\n (click)=\"nextPage()\"\n >\n <com-icon name=\"chevron-right\" [size]=\"iconSize()\" />\n </button>\n\n <!-- Last Page -->\n @if (showFirstLastButtons()) {\n <button\n type=\"button\"\n [class]=\"buttonClasses()\"\n [disabled]=\"disabled() || !hasNextPage()\"\n aria-label=\"Last page\"\n (click)=\"lastPage()\"\n >\n <com-icon name=\"chevrons-right\" [size]=\"iconSize()\" />\n </button>\n }\n </div>\n }\n </nav>\n `,\n styles: `\n com-paginator {\n display: block;\n }\n `,\n imports: [ComIcon],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'com-paginator',\n },\n})\nexport class ComPaginator {\n // ─── View Queries ───\n\n /** Page number buttons for keyboard navigation. */\n private readonly pageButtons = viewChildren<ElementRef<HTMLButtonElement>>('pageBtn');\n\n // ─── Inputs ───\n\n /** Total number of items being paged. */\n readonly length: InputSignal<number> = input<number>(0);\n\n /** Number of items to display per page. */\n readonly pageSize: InputSignal<number> = input<number>(10);\n\n /** Current zero-based page index. */\n readonly pageIndex: InputSignal<number> = input<number>(0);\n\n /** Available page size options. Hides selector if empty. */\n readonly pageSizeOptions: InputSignal<number[]> = input<number[]>([]);\n\n /** Whether to show first/last navigation buttons. */\n readonly showFirstLastButtons: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Whether to show numbered page buttons. */\n readonly showPageNumbers: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Whether all controls are disabled. */\n readonly disabled: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Whether to hide the page size selector. */\n readonly hidePageSize: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Size variant. */\n readonly size: InputSignal<PaginatorSize> = input<PaginatorSize>('md');\n\n /** Layout variant. Only applies when showPageNumbers is true. */\n readonly layout: InputSignal<PaginatorLayout> = input<PaginatorLayout>('compact');\n\n /** Number of pages to show on each side of the current page. */\n readonly siblingCount: InputSignal<number> = input<number>(1);\n\n /** Number of pages to always show at the start and end. */\n readonly boundaryCount: InputSignal<number> = input<number>(1);\n\n /** Accessible label for the nav element. */\n readonly ariaLabel: InputSignal<string> = input<string>('Pagination', { alias: 'aria-label' });\n\n /** Custom function for range label formatting. */\n readonly rangeLabel: InputSignal<RangeLabelFn> = input<RangeLabelFn>(defaultRangeLabel);\n\n // ─── Outputs ───\n\n /** Emits when page index or page size changes. */\n readonly page: OutputEmitterRef<PageEvent> = output<PageEvent>();\n\n // ─── Computed ───\n\n /** Total number of pages. */\n protected readonly numberOfPages: Signal<number> = computed(() => {\n const size = this.pageSize();\n const len = this.length();\n if (size === 0 || len === 0) {\n return 0;\n }\n return Math.ceil(len / size);\n });\n\n /** Whether there is a previous page. */\n protected readonly hasPreviousPage: Signal<boolean> = computed(() => {\n return this.pageIndex() > 0 && this.pageSize() > 0;\n });\n\n /** Whether there is a next page. */\n protected readonly hasNextPage: Signal<boolean> = computed(() => {\n const total = this.numberOfPages();\n return total > 0 && this.pageIndex() < total - 1;\n });\n\n /** The formatted range label text. */\n protected readonly rangeLabelText: Signal<string> = computed(() => {\n const fn = this.rangeLabel();\n return fn(this.pageIndex(), this.pageSize(), this.length());\n });\n\n /** Icon size based on component size. */\n protected readonly iconSize: Signal<'xs' | 'sm'> = computed(() => {\n return this.size() === 'sm' ? 'xs' : 'sm';\n });\n\n /** Unique ID for page size label. */\n protected readonly pageSizeLabelId: Signal<string> = computed(() => {\n return `com-paginator-page-size-label-${uniqueId++}`;\n });\n\n /** Unique ID for page size select element. */\n protected readonly pageSizeSelectId: Signal<string> = computed(() => {\n return `com-paginator-page-size-select-${uniqueId++}`;\n });\n\n /** Classes for the container. */\n protected readonly containerClasses: Signal<string> = computed(() =>\n paginatorContainerVariants({\n size: this.size(),\n layout: this.showPageNumbers() ? this.layout() : 'compact',\n })\n );\n\n /** Classes for navigation buttons. */\n protected readonly buttonClasses: Signal<string> = computed(() =>\n paginatorButtonVariants({ size: this.size() })\n );\n\n /** Classes for the range label. */\n protected readonly rangeLabelClasses: Signal<string> = computed(() =>\n paginatorRangeLabelVariants({ size: this.size() })\n );\n\n /** Classes for the page size select. */\n protected readonly selectClasses: Signal<string> = computed(() =>\n paginatorSelectVariants({ size: this.size() })\n );\n\n /** Classes for the ellipsis indicator. */\n protected readonly ellipsisClasses: Signal<string> = computed(() =>\n paginatorEllipsisVariants({ size: this.size() })\n );\n\n /** Cached classes for active page button. */\n protected readonly activePageButtonClasses: Signal<string> = computed(() =>\n paginatorPageButtonVariants({ size: this.size(), active: true })\n );\n\n /** Cached classes for inactive page button. */\n protected readonly inactivePageButtonClasses: Signal<string> = computed(() =>\n paginatorPageButtonVariants({ size: this.size(), active: false })\n );\n\n /**\n * Computed page range for numbered pagination.\n * Returns array like [0, 'ellipsis', 3, 4, 5, 'ellipsis', 9] (zero-indexed).\n */\n protected readonly pageRange: Signal<PageRangeItem[]> = computed(() => {\n const totalPages = this.numberOfPages();\n const current = this.pageIndex();\n const siblings = this.siblingCount();\n const boundaries = this.boundaryCount();\n\n if (totalPages === 0) return [];\n\n // If all pages fit without ellipses, show them all\n const totalSlots = 2 * boundaries + 2 * siblings + 3;\n if (totalPages <= totalSlots) {\n return this.range(0, totalPages - 1);\n }\n\n // Collect all page indices that should be visible (Set auto-deduplicates)\n const pages = new Set<number>();\n\n // Boundary pages (always visible)\n for (let i = 0; i < boundaries; i++) pages.add(i);\n for (let i = totalPages - boundaries; i < totalPages; i++) pages.add(i);\n\n // Sibling pages around current (including current)\n const siblingStart = Math.max(0, current - siblings);\n const siblingEnd = Math.min(totalPages - 1, current + siblings);\n for (let i = siblingStart; i <= siblingEnd; i++) pages.add(i);\n\n // Convert to sorted array and insert ellipses at gaps\n const sorted = Array.from(pages).sort((a, b) => a - b);\n const result: PageRangeItem[] = [];\n\n for (let i = 0; i < sorted.length; i++) {\n const page = sorted[i]!;\n const prevPage = sorted[i - 1];\n if (prevPage !== undefined && page - prevPage > 1) {\n result.push('ellipsis');\n }\n result.push(page);\n }\n\n return result;\n });\n\n // ─── Navigation Methods ───\n\n /** Navigate to the first page. */\n firstPage(): void {\n if (this.hasPreviousPage()) {\n this.emitPageEvent(0);\n }\n }\n\n /** Navigate to the previous page. */\n previousPage(): void {\n if (this.hasPreviousPage()) {\n this.emitPageEvent(this.pageIndex() - 1);\n }\n }\n\n /** Navigate to the next page. */\n nextPage(): void {\n if (this.hasNextPage()) {\n this.emitPageEvent(this.pageIndex() + 1);\n }\n }\n\n /** Navigate to the last page. */\n lastPage(): void {\n if (this.hasNextPage()) {\n this.emitPageEvent(this.numberOfPages() - 1);\n }\n }\n\n /** Navigate to a specific page by index (zero-based). */\n goToPage(pageIndex: number): void {\n if (pageIndex >= 0 && pageIndex < this.numberOfPages() && pageIndex !== this.pageIndex()) {\n this.emitPageEvent(pageIndex);\n }\n }\n\n /** Handle page size selection change. */\n protected onPageSizeChange(event: Event): void {\n const select = event.target as HTMLSelectElement;\n const newPageSize = Number(select.value);\n const previousPageSize = this.pageSize();\n const currentPageIndex = this.pageIndex();\n\n // Calculate new page index to keep the first item on the current page visible\n const startIndex = currentPageIndex * previousPageSize;\n const newPageIndex = Math.floor(startIndex / newPageSize);\n\n this.page.emit({\n pageIndex: newPageIndex,\n previousPageIndex: currentPageIndex,\n pageSize: newPageSize,\n length: this.length(),\n });\n }\n\n /** Handle keyboard navigation within page buttons (roving tabindex). */\n protected onPageButtonsKeydown(event: KeyboardEvent): void {\n const target = event.target as HTMLButtonElement;\n\n // Get enabled buttons from viewChildren query\n const buttons = this.pageButtons()\n .map((ref) => ref.nativeElement)\n .filter((btn) => !btn.disabled);\n\n const currentIndex = buttons.indexOf(target);\n if (currentIndex === -1) return;\n\n let newIndex: number;\n switch (event.key) {\n case 'ArrowLeft':\n newIndex = currentIndex > 0 ? currentIndex - 1 : buttons.length - 1;\n break;\n case 'ArrowRight':\n newIndex = currentIndex < buttons.length - 1 ? currentIndex + 1 : 0;\n break;\n case 'Home':\n newIndex = 0;\n break;\n case 'End':\n newIndex = buttons.length - 1;\n break;\n default:\n return;\n }\n\n event.preventDefault();\n buttons[newIndex]?.focus();\n }\n\n /** Track function for page items. */\n protected trackPageItem(index: number, item: PageRangeItem): string {\n return item === 'ellipsis' ? `ellipsis-${index}` : `page-${item}`;\n }\n\n // ─── Private Methods ───\n\n private emitPageEvent(newPageIndex: number): void {\n this.page.emit({\n pageIndex: newPageIndex,\n previousPageIndex: this.pageIndex(),\n pageSize: this.pageSize(),\n length: this.length(),\n });\n }\n\n /** Generate a range of numbers from start to end (inclusive). */\n private range(start: number, end: number): number[] {\n return Array.from({ length: end - start + 1 }, (_, i) => start + i);\n }\n}\n\n/** Counter for generating unique IDs. */\nlet uniqueId = 0;\n","// Public API for the paginator component\n\n// Main component\nexport { ComPaginator } from './paginator.component';\nexport type { PageRangeItem } from './paginator.component';\n\n// Models\nexport { defaultRangeLabel } from './paginator.models';\nexport type { PageEvent, RangeLabelFn } from './paginator.models';\n\n// Variants\nexport {\n paginatorContainerVariants,\n paginatorButtonVariants,\n paginatorRangeLabelVariants,\n paginatorSelectVariants,\n paginatorPageButtonVariants,\n paginatorEllipsisVariants,\n} from './paginator.variants';\n\nexport type {\n PaginatorSize,\n PaginatorLayout,\n PaginatorContainerVariants,\n PaginatorButtonVariants,\n PaginatorRangeLabelVariants,\n PaginatorSelectVariants,\n PaginatorPageButtonVariants,\n PaginatorEllipsisVariants,\n} from './paginator.variants';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -13,9 +13,9 @@ import { mergeClasses } from 'ngx-com/utils';
13
13
  /**
14
14
  * Popover panel styling variants.
15
15
  *
16
- * @tokens `--color-popover`, `--color-popover-foreground`, `--color-border`, `--shadow-lg`, `--radius-popover`, `--radius-overlay`
16
+ * @tokens `--color-popover`, `--color-popover-foreground`, `--color-border`, `--shadow-overlay`, `--radius-popover`, `--radius-overlay`
17
17
  */
18
- const popoverPanelVariants = cva(['relative', 'bg-popover text-popover-foreground', 'border border-border', 'shadow-lg', 'overflow-hidden'], {
18
+ const popoverPanelVariants = cva(['relative', 'bg-popover text-popover-foreground', 'border border-border', 'shadow-overlay', 'overflow-hidden'], {
19
19
  variants: {
20
20
  variant: {
21
21
  default: 'rounded-popover p-4 min-w-48 max-w-sm',
@@ -72,15 +72,15 @@ const ALIGNMENT_OFFSETS = {
72
72
  *
73
73
  * @tokens `--color-popover`, `--color-border`
74
74
  */
75
- class PopoverArrowComponent {
75
+ class ComPopoverArrow {
76
76
  /** Which side of the popover the arrow is on. */
77
77
  side = input('top', ...(ngDevMode ? [{ debugName: "side" }] : []));
78
78
  /** Alignment along the edge (for offset positioning). */
79
79
  alignment = input('center', ...(ngDevMode ? [{ debugName: "alignment" }] : []));
80
80
  /** Computed CSS classes for the arrow. */
81
81
  arrowClasses = computed(() => mergeClasses(popoverArrowVariants({ side: this.side() }), ALIGNMENT_OFFSETS[this.side()][this.alignment()]), ...(ngDevMode ? [{ debugName: "arrowClasses" }] : []));
82
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: PopoverArrowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
83
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.0", type: PopoverArrowComponent, isStandalone: true, selector: "com-popover-arrow", inputs: { side: { classPropertyName: "side", publicName: "side", isSignal: true, isRequired: false, transformFunction: null }, alignment: { classPropertyName: "alignment", publicName: "alignment", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "pointer-events-none" }, ngImport: i0, template: `
82
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComPopoverArrow, deps: [], target: i0.ɵɵFactoryTarget.Component });
83
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.0", type: ComPopoverArrow, isStandalone: true, selector: "com-popover-arrow", inputs: { side: { classPropertyName: "side", publicName: "side", isSignal: true, isRequired: false, transformFunction: null }, alignment: { classPropertyName: "alignment", publicName: "alignment", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "pointer-events-none" }, ngImport: i0, template: `
84
84
  <svg
85
85
  [class]="arrowClasses()"
86
86
  width="16"
@@ -103,7 +103,7 @@ class PopoverArrowComponent {
103
103
  </svg>
104
104
  `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
105
105
  }
106
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: PopoverArrowComponent, decorators: [{
106
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComPopoverArrow, decorators: [{
107
107
  type: Component,
108
108
  args: [{
109
109
  selector: 'com-popover-arrow',
@@ -142,9 +142,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
142
142
  *
143
143
  * @internal Not exported in public API
144
144
  *
145
- * @tokens `--color-popover`, `--color-popover-foreground`, `--color-border`, `--shadow-lg`, `--radius-popover`, `--radius-overlay`
145
+ * @tokens `--color-popover`, `--color-popover-foreground`, `--color-border`, `--shadow-overlay`, `--radius-popover`, `--radius-overlay`
146
146
  */
147
- class PopoverContentComponent {
147
+ class ComPopoverContent {
148
148
  /** The portal containing consumer content to render. */
149
149
  contentPortal = signal(null, ...(ngDevMode ? [{ debugName: "contentPortal" }] : []));
150
150
  /** Size/padding variant for the panel. */
@@ -165,8 +165,8 @@ class PopoverContentComponent {
165
165
  panelClass = signal('', ...(ngDevMode ? [{ debugName: "panelClass" }] : []));
166
166
  /** Computed CSS classes for the panel. */
167
167
  panelClasses = computed(() => mergeClasses(popoverPanelVariants({ variant: this.variant() }), this.panelClass()), ...(ngDevMode ? [{ debugName: "panelClasses" }] : []));
168
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: PopoverContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
169
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: PopoverContentComponent, isStandalone: true, selector: "com-popover-content", ngImport: i0, template: `
168
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComPopoverContent, deps: [], target: i0.ɵɵFactoryTarget.Component });
169
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ComPopoverContent, isStandalone: true, selector: "com-popover-content", ngImport: i0, template: `
170
170
  <div
171
171
  class="relative"
172
172
  [attr.data-state]="animationState()"
@@ -184,9 +184,9 @@ class PopoverContentComponent {
184
184
  <ng-template [cdkPortalOutlet]="contentPortal()" />
185
185
  </div>
186
186
  </div>
187
- `, isInline: true, styles: [":host{display:contents}[data-state=open]{animation:popover-in .15s ease-out}[data-state=closed]{animation:popover-out .1s ease-in forwards}[data-side=top]{transform-origin:bottom center}[data-side=bottom]{transform-origin:top center}[data-side=left]{transform-origin:right center}[data-side=right]{transform-origin:left center}@keyframes popover-in{0%{opacity:0;transform:scale(.96) translateY(4px)}to{opacity:1;transform:scale(1) translateY(0)}}@keyframes popover-out{0%{opacity:1}to{opacity:0}}@media(prefers-reduced-motion:reduce){[data-state=open],[data-state=closed]{animation:none}}\n"], dependencies: [{ kind: "directive", type: CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "component", type: PopoverArrowComponent, selector: "com-popover-arrow", inputs: ["side", "alignment"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
187
+ `, isInline: true, styles: [":host{display:contents}[data-state=open]{animation:popover-in .15s ease-out}[data-state=closed]{animation:popover-out .1s ease-in forwards}[data-side=top]{transform-origin:bottom center}[data-side=bottom]{transform-origin:top center}[data-side=left]{transform-origin:right center}[data-side=right]{transform-origin:left center}@keyframes popover-in{0%{opacity:0;transform:scale(.96) translateY(4px)}to{opacity:1;transform:scale(1) translateY(0)}}@keyframes popover-out{0%{opacity:1}to{opacity:0}}@media(prefers-reduced-motion:reduce){[data-state=open],[data-state=closed]{animation:none}}\n"], dependencies: [{ kind: "directive", type: CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "component", type: ComPopoverArrow, selector: "com-popover-arrow", inputs: ["side", "alignment"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
188
188
  }
189
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: PopoverContentComponent, decorators: [{
189
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComPopoverContent, decorators: [{
190
190
  type: Component,
191
191
  args: [{ selector: 'com-popover-content', template: `
192
192
  <div
@@ -206,7 +206,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
206
206
  <ng-template [cdkPortalOutlet]="contentPortal()" />
207
207
  </div>
208
208
  </div>
209
- `, imports: [CdkPortalOutlet, PopoverArrowComponent], changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:contents}[data-state=open]{animation:popover-in .15s ease-out}[data-state=closed]{animation:popover-out .1s ease-in forwards}[data-side=top]{transform-origin:bottom center}[data-side=bottom]{transform-origin:top center}[data-side=left]{transform-origin:right center}[data-side=right]{transform-origin:left center}@keyframes popover-in{0%{opacity:0;transform:scale(.96) translateY(4px)}to{opacity:1;transform:scale(1) translateY(0)}}@keyframes popover-out{0%{opacity:1}to{opacity:0}}@media(prefers-reduced-motion:reduce){[data-state=open],[data-state=closed]{animation:none}}\n"] }]
209
+ `, imports: [CdkPortalOutlet, ComPopoverArrow], changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:contents}[data-state=open]{animation:popover-in .15s ease-out}[data-state=closed]{animation:popover-out .1s ease-in forwards}[data-side=top]{transform-origin:bottom center}[data-side=bottom]{transform-origin:top center}[data-side=left]{transform-origin:right center}[data-side=right]{transform-origin:left center}@keyframes popover-in{0%{opacity:0;transform:scale(.96) translateY(4px)}to{opacity:1;transform:scale(1) translateY(0)}}@keyframes popover-out{0%{opacity:1}to{opacity:0}}@media(prefers-reduced-motion:reduce){[data-state=open],[data-state=closed]{animation:none}}\n"] }]
210
210
  }] });
211
211
 
212
212
  /**
@@ -434,7 +434,7 @@ function deriveAlignmentFromPosition(pair) {
434
434
  * Applied to the trigger element, it handles opening, closing, positioning,
435
435
  * and accessibility for floating popover content.
436
436
  *
437
- * @tokens `--color-popover`, `--color-popover-foreground`, `--color-border`, `--shadow-lg`, `--color-ring`
437
+ * @tokens `--color-popover`, `--color-popover-foreground`, `--color-border`, `--shadow-overlay`, `--color-ring`
438
438
  *
439
439
  * @example Basic usage with template
440
440
  * ```html
@@ -480,7 +480,7 @@ function deriveAlignmentFromPosition(pair) {
480
480
  * </button>
481
481
  * ```
482
482
  */
483
- class PopoverTriggerDirective {
483
+ class ComPopoverTrigger {
484
484
  overlay = inject(Overlay);
485
485
  elementRef = inject(ElementRef);
486
486
  viewContainerRef = inject(ViewContainerRef);
@@ -491,6 +491,8 @@ class PopoverTriggerDirective {
491
491
  overlayRef = null;
492
492
  focusTrap = null;
493
493
  scrollCleanup = null;
494
+ closeTimeoutId = null;
495
+ destroyed = false;
494
496
  popoverId = generatePopoverId();
495
497
  // ─── Inputs ───
496
498
  /** Content to render: TemplateRef or Component class. */
@@ -560,6 +562,8 @@ class PopoverTriggerDirective {
560
562
  });
561
563
  // Cleanup on destroy
562
564
  this.destroyRef.onDestroy(() => {
565
+ this.destroyed = true;
566
+ this.cancelPendingClose();
563
567
  this.disposeOverlay();
564
568
  });
565
569
  }
@@ -578,13 +582,16 @@ class PopoverTriggerDirective {
578
582
  }
579
583
  /** Toggle the popover open/close state. */
580
584
  toggle() {
581
- this.popoverOpen() ? this.close() : this.open();
585
+ if (this.popoverOpen()) {
586
+ this.close();
587
+ }
588
+ else {
589
+ this.open();
590
+ }
582
591
  }
583
592
  /** Force recalculation of position. */
584
593
  reposition() {
585
- if (this.overlayRef) {
586
- this.overlayRef.updatePosition();
587
- }
594
+ this.overlayRef?.updatePosition();
588
595
  }
589
596
  // ─── Event Handlers ───
590
597
  onTriggerClick(event) {
@@ -602,6 +609,8 @@ class PopoverTriggerDirective {
602
609
  if (this.popoverTriggerOn() === 'focus') {
603
610
  // Delay to allow focus to move to popover content
604
611
  setTimeout(() => {
612
+ if (this.destroyed)
613
+ return;
605
614
  if (!this.overlayRef?.overlayElement.contains(this.document.activeElement)) {
606
615
  this.close();
607
616
  }
@@ -631,13 +640,23 @@ class PopoverTriggerDirective {
631
640
  closePopover() {
632
641
  this.animationState.set('closed');
633
642
  this.unsubscribeFromScrollEvents();
643
+ this.cancelPendingClose();
634
644
  // Wait for animation to complete before detaching
635
- setTimeout(() => {
645
+ this.closeTimeoutId = setTimeout(() => {
646
+ this.closeTimeoutId = null;
647
+ if (this.destroyed)
648
+ return;
636
649
  this.detachContent();
637
650
  this.destroyFocusTrap();
638
651
  this.popoverClosed.emit();
639
652
  }, 100); // Match animation duration
640
653
  }
654
+ cancelPendingClose() {
655
+ if (this.closeTimeoutId !== null) {
656
+ clearTimeout(this.closeTimeoutId);
657
+ this.closeTimeoutId = null;
658
+ }
659
+ }
641
660
  subscribeToScrollEvents() {
642
661
  if (this.popoverCloseOnScroll())
643
662
  return;
@@ -689,7 +708,7 @@ class PopoverTriggerDirective {
689
708
  { provide: POPOVER_REF, useValue: this },
690
709
  ],
691
710
  });
692
- const contentPortal = new ComponentPortal(PopoverContentComponent, this.viewContainerRef, contentInjector);
711
+ const contentPortal = new ComponentPortal(ComPopoverContent, this.viewContainerRef, contentInjector);
693
712
  const contentRef = this.overlayRef.attach(contentPortal);
694
713
  this.contentComponentRef = contentRef.instance;
695
714
  // Create the inner content portal (template or component)
@@ -761,6 +780,8 @@ class PopoverTriggerDirective {
761
780
  .detachments()
762
781
  .pipe(takeUntilDestroyed(this.destroyRef))
763
782
  .subscribe(() => {
783
+ if (this.destroyed)
784
+ return;
764
785
  this.popoverOpen.set(false);
765
786
  });
766
787
  }
@@ -784,10 +805,10 @@ class PopoverTriggerDirective {
784
805
  }
785
806
  this.contentComponentRef = null;
786
807
  }
787
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: PopoverTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
788
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.0", type: PopoverTriggerDirective, isStandalone: true, selector: "[comPopoverTrigger]", inputs: { comPopoverTrigger: { classPropertyName: "comPopoverTrigger", publicName: "comPopoverTrigger", isSignal: true, isRequired: true, transformFunction: null }, popoverPosition: { classPropertyName: "popoverPosition", publicName: "popoverPosition", isSignal: true, isRequired: false, transformFunction: null }, popoverAlignment: { classPropertyName: "popoverAlignment", publicName: "popoverAlignment", isSignal: true, isRequired: false, transformFunction: null }, popoverTriggerOn: { classPropertyName: "popoverTriggerOn", publicName: "popoverTriggerOn", isSignal: true, isRequired: false, transformFunction: null }, popoverOffset: { classPropertyName: "popoverOffset", publicName: "popoverOffset", isSignal: true, isRequired: false, transformFunction: null }, popoverShowArrow: { classPropertyName: "popoverShowArrow", publicName: "popoverShowArrow", isSignal: true, isRequired: false, transformFunction: null }, popoverVariant: { classPropertyName: "popoverVariant", publicName: "popoverVariant", isSignal: true, isRequired: false, transformFunction: null }, popoverBackdrop: { classPropertyName: "popoverBackdrop", publicName: "popoverBackdrop", isSignal: true, isRequired: false, transformFunction: null }, popoverCloseOnOutside: { classPropertyName: "popoverCloseOnOutside", publicName: "popoverCloseOnOutside", isSignal: true, isRequired: false, transformFunction: null }, popoverCloseOnEscape: { classPropertyName: "popoverCloseOnEscape", publicName: "popoverCloseOnEscape", isSignal: true, isRequired: false, transformFunction: null }, popoverCloseOnScroll: { classPropertyName: "popoverCloseOnScroll", publicName: "popoverCloseOnScroll", isSignal: true, isRequired: false, transformFunction: null }, popoverDisabled: { classPropertyName: "popoverDisabled", publicName: "popoverDisabled", isSignal: true, isRequired: false, transformFunction: null }, popoverOpen: { classPropertyName: "popoverOpen", publicName: "popoverOpen", isSignal: true, isRequired: false, transformFunction: null }, popoverData: { classPropertyName: "popoverData", publicName: "popoverData", isSignal: true, isRequired: false, transformFunction: null }, popoverPanelClass: { classPropertyName: "popoverPanelClass", publicName: "popoverPanelClass", isSignal: true, isRequired: false, transformFunction: null }, popoverTrapFocus: { classPropertyName: "popoverTrapFocus", publicName: "popoverTrapFocus", isSignal: true, isRequired: false, transformFunction: null }, popoverAriaLabel: { classPropertyName: "popoverAriaLabel", publicName: "popoverAriaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { popoverOpen: "popoverOpenChange", popoverOpened: "popoverOpened", popoverClosed: "popoverClosed" }, host: { listeners: { "click": "onTriggerClick($event)", "focus": "onTriggerFocus()", "blur": "onTriggerBlur()", "keydown.escape": "onEscapeKey($event)" }, properties: { "attr.aria-haspopup": "\"dialog\"", "attr.aria-expanded": "popoverOpen()", "attr.aria-controls": "ariaControls()" } }, exportAs: ["comPopoverTrigger"], ngImport: i0 });
808
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComPopoverTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive });
809
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.0", type: ComPopoverTrigger, isStandalone: true, selector: "[comPopoverTrigger]", inputs: { comPopoverTrigger: { classPropertyName: "comPopoverTrigger", publicName: "comPopoverTrigger", isSignal: true, isRequired: true, transformFunction: null }, popoverPosition: { classPropertyName: "popoverPosition", publicName: "popoverPosition", isSignal: true, isRequired: false, transformFunction: null }, popoverAlignment: { classPropertyName: "popoverAlignment", publicName: "popoverAlignment", isSignal: true, isRequired: false, transformFunction: null }, popoverTriggerOn: { classPropertyName: "popoverTriggerOn", publicName: "popoverTriggerOn", isSignal: true, isRequired: false, transformFunction: null }, popoverOffset: { classPropertyName: "popoverOffset", publicName: "popoverOffset", isSignal: true, isRequired: false, transformFunction: null }, popoverShowArrow: { classPropertyName: "popoverShowArrow", publicName: "popoverShowArrow", isSignal: true, isRequired: false, transformFunction: null }, popoverVariant: { classPropertyName: "popoverVariant", publicName: "popoverVariant", isSignal: true, isRequired: false, transformFunction: null }, popoverBackdrop: { classPropertyName: "popoverBackdrop", publicName: "popoverBackdrop", isSignal: true, isRequired: false, transformFunction: null }, popoverCloseOnOutside: { classPropertyName: "popoverCloseOnOutside", publicName: "popoverCloseOnOutside", isSignal: true, isRequired: false, transformFunction: null }, popoverCloseOnEscape: { classPropertyName: "popoverCloseOnEscape", publicName: "popoverCloseOnEscape", isSignal: true, isRequired: false, transformFunction: null }, popoverCloseOnScroll: { classPropertyName: "popoverCloseOnScroll", publicName: "popoverCloseOnScroll", isSignal: true, isRequired: false, transformFunction: null }, popoverDisabled: { classPropertyName: "popoverDisabled", publicName: "popoverDisabled", isSignal: true, isRequired: false, transformFunction: null }, popoverOpen: { classPropertyName: "popoverOpen", publicName: "popoverOpen", isSignal: true, isRequired: false, transformFunction: null }, popoverData: { classPropertyName: "popoverData", publicName: "popoverData", isSignal: true, isRequired: false, transformFunction: null }, popoverPanelClass: { classPropertyName: "popoverPanelClass", publicName: "popoverPanelClass", isSignal: true, isRequired: false, transformFunction: null }, popoverTrapFocus: { classPropertyName: "popoverTrapFocus", publicName: "popoverTrapFocus", isSignal: true, isRequired: false, transformFunction: null }, popoverAriaLabel: { classPropertyName: "popoverAriaLabel", publicName: "popoverAriaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { popoverOpen: "popoverOpenChange", popoverOpened: "popoverOpened", popoverClosed: "popoverClosed" }, host: { listeners: { "click": "onTriggerClick($event)", "focus": "onTriggerFocus()", "blur": "onTriggerBlur()", "keydown.escape": "onEscapeKey($event)" }, properties: { "attr.aria-haspopup": "\"dialog\"", "attr.aria-expanded": "popoverOpen()", "attr.aria-controls": "ariaControls()" } }, exportAs: ["comPopoverTrigger"], ngImport: i0 });
789
810
  }
790
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: PopoverTriggerDirective, decorators: [{
811
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComPopoverTrigger, decorators: [{
791
812
  type: Directive,
792
813
  args: [{
793
814
  selector: '[comPopoverTrigger]',
@@ -808,6 +829,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
808
829
  * Convenience directive that closes the parent popover when clicked.
809
830
  * Applied to elements inside the popover that should dismiss it.
810
831
  *
832
+ * @tokens none
833
+ *
811
834
  * @example
812
835
  * ```html
813
836
  * <ng-template #confirmPop>
@@ -827,7 +850,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
827
850
  * <button [comPopoverClose]="'cancelled'">No</button>
828
851
  * ```
829
852
  */
830
- class PopoverCloseDirective {
853
+ class ComPopoverClose {
831
854
  popoverRef = inject(POPOVER_REF, { optional: true });
832
855
  /**
833
856
  * Optional result value to pass when closing.
@@ -837,10 +860,10 @@ class PopoverCloseDirective {
837
860
  closePopover() {
838
861
  this.popoverRef?.close();
839
862
  }
840
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: PopoverCloseDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
841
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.0", type: PopoverCloseDirective, isStandalone: true, selector: "[comPopoverClose]", inputs: { comPopoverClose: { classPropertyName: "comPopoverClose", publicName: "comPopoverClose", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "closePopover()" }, properties: { "attr.type": "\"button\"" } }, exportAs: ["comPopoverClose"], ngImport: i0 });
863
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComPopoverClose, deps: [], target: i0.ɵɵFactoryTarget.Directive });
864
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.0", type: ComPopoverClose, isStandalone: true, selector: "[comPopoverClose]", inputs: { comPopoverClose: { classPropertyName: "comPopoverClose", publicName: "comPopoverClose", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "closePopover()" }, properties: { "attr.type": "\"button\"" } }, exportAs: ["comPopoverClose"], ngImport: i0 });
842
865
  }
843
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: PopoverCloseDirective, decorators: [{
866
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComPopoverClose, decorators: [{
844
867
  type: Directive,
845
868
  args: [{
846
869
  selector: '[comPopoverClose]',
@@ -860,6 +883,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
860
883
  * This directive is primarily semantic — it marks the template as popover content
861
884
  * and provides access to the TemplateRef for potential content queries.
862
885
  *
886
+ * @tokens none
887
+ *
863
888
  * @example
864
889
  * ```html
865
890
  * <button [comPopoverTrigger]="helpContent">Help</button>
@@ -876,13 +901,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
876
901
  * </ng-template>
877
902
  * ```
878
903
  */
879
- class PopoverTemplateDirective {
904
+ class ComPopoverTemplate {
880
905
  /** Reference to the template for rendering. */
881
906
  templateRef = inject(TemplateRef);
882
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: PopoverTemplateDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
883
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.0", type: PopoverTemplateDirective, isStandalone: true, selector: "[comPopoverTemplate]", exportAs: ["comPopoverTemplate"], ngImport: i0 });
907
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComPopoverTemplate, deps: [], target: i0.ɵɵFactoryTarget.Directive });
908
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.0", type: ComPopoverTemplate, isStandalone: true, selector: "[comPopoverTemplate]", exportAs: ["comPopoverTemplate"], ngImport: i0 });
884
909
  }
885
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: PopoverTemplateDirective, decorators: [{
910
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComPopoverTemplate, decorators: [{
886
911
  type: Directive,
887
912
  args: [{
888
913
  selector: '[comPopoverTemplate]',
@@ -897,5 +922,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
897
922
  * Generated bundle index. Do not edit.
898
923
  */
899
924
 
900
- export { POPOVER_DATA, POPOVER_REF, PopoverCloseDirective, PopoverTemplateDirective, PopoverTriggerDirective, buildPopoverPositions, deriveAlignmentFromPosition, deriveSideFromPosition, popoverArrowVariants, popoverPanelVariants };
925
+ export { ComPopoverClose, ComPopoverTemplate, ComPopoverTrigger, POPOVER_DATA, POPOVER_REF, buildPopoverPositions, deriveAlignmentFromPosition, deriveSideFromPosition, popoverArrowVariants, popoverPanelVariants };
901
926
  //# sourceMappingURL=ngx-com-components-popover.mjs.map