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.
- package/README.md +137 -33
- package/fesm2022/ngx-com-components-alert.mjs +21 -11
- package/fesm2022/ngx-com-components-alert.mjs.map +1 -1
- package/fesm2022/ngx-com-components-avatar.mjs +9 -7
- package/fesm2022/ngx-com-components-avatar.mjs.map +1 -1
- package/fesm2022/ngx-com-components-button.mjs +1 -1
- package/fesm2022/ngx-com-components-button.mjs.map +1 -1
- package/fesm2022/ngx-com-components-calendar.mjs +27 -3112
- package/fesm2022/ngx-com-components-calendar.mjs.map +1 -1
- package/fesm2022/ngx-com-components-card.mjs +8 -8
- package/fesm2022/ngx-com-components-card.mjs.map +1 -1
- package/fesm2022/ngx-com-components-carousel.mjs +16 -4
- package/fesm2022/ngx-com-components-carousel.mjs.map +1 -1
- package/fesm2022/ngx-com-components-checkbox.mjs +1 -1
- package/fesm2022/ngx-com-components-checkbox.mjs.map +1 -1
- package/fesm2022/ngx-com-components-code-block.mjs +9 -9
- package/fesm2022/ngx-com-components-code-block.mjs.map +1 -1
- package/fesm2022/ngx-com-components-collapsible.mjs +15 -13
- package/fesm2022/ngx-com-components-collapsible.mjs.map +1 -1
- package/fesm2022/ngx-com-components-confirm.mjs +4 -4
- package/fesm2022/ngx-com-components-confirm.mjs.map +1 -1
- package/fesm2022/ngx-com-components-datepicker.mjs +2334 -0
- package/fesm2022/ngx-com-components-datepicker.mjs.map +1 -0
- package/fesm2022/ngx-com-components-dialog.mjs +47 -45
- package/fesm2022/ngx-com-components-dialog.mjs.map +1 -1
- package/fesm2022/ngx-com-components-dropdown.mjs +446 -340
- package/fesm2022/ngx-com-components-dropdown.mjs.map +1 -1
- package/fesm2022/ngx-com-components-empty-state.mjs +5 -3
- package/fesm2022/ngx-com-components-empty-state.mjs.map +1 -1
- package/fesm2022/ngx-com-components-form-field.mjs +11 -6
- package/fesm2022/ngx-com-components-form-field.mjs.map +1 -1
- package/fesm2022/ngx-com-components-icon-lucide.mjs +41 -0
- package/fesm2022/ngx-com-components-icon-lucide.mjs.map +1 -0
- package/fesm2022/ngx-com-components-icon.mjs +89 -61
- package/fesm2022/ngx-com-components-icon.mjs.map +1 -1
- package/fesm2022/ngx-com-components-item.mjs +14 -4
- package/fesm2022/ngx-com-components-item.mjs.map +1 -1
- package/fesm2022/ngx-com-components-menu.mjs +61 -69
- package/fesm2022/ngx-com-components-menu.mjs.map +1 -1
- package/fesm2022/ngx-com-components-native-control.mjs +170 -0
- package/fesm2022/ngx-com-components-native-control.mjs.map +1 -0
- package/fesm2022/ngx-com-components-paginator.mjs +11 -3
- package/fesm2022/ngx-com-components-paginator.mjs.map +1 -1
- package/fesm2022/ngx-com-components-popover.mjs +58 -33
- package/fesm2022/ngx-com-components-popover.mjs.map +1 -1
- package/fesm2022/ngx-com-components-radio.mjs +4 -4
- package/fesm2022/ngx-com-components-radio.mjs.map +1 -1
- package/fesm2022/ngx-com-components-segmented-control.mjs +6 -4
- package/fesm2022/ngx-com-components-segmented-control.mjs.map +1 -1
- package/fesm2022/ngx-com-components-sort.mjs +63 -57
- package/fesm2022/ngx-com-components-sort.mjs.map +1 -1
- package/fesm2022/ngx-com-components-spinner.mjs +6 -6
- package/fesm2022/ngx-com-components-spinner.mjs.map +1 -1
- package/fesm2022/ngx-com-components-switch.mjs +18 -9
- package/fesm2022/ngx-com-components-switch.mjs.map +1 -1
- package/fesm2022/ngx-com-components-table.mjs +23 -9
- package/fesm2022/ngx-com-components-table.mjs.map +1 -1
- package/fesm2022/ngx-com-components-tabs.mjs +81 -58
- package/fesm2022/ngx-com-components-tabs.mjs.map +1 -1
- package/fesm2022/ngx-com-components-timepicker.mjs +1048 -0
- package/fesm2022/ngx-com-components-timepicker.mjs.map +1 -0
- package/fesm2022/ngx-com-components-toast.mjs +18 -14
- package/fesm2022/ngx-com-components-toast.mjs.map +1 -1
- package/fesm2022/ngx-com-components-tooltip.mjs +5 -5
- package/fesm2022/ngx-com-components-tooltip.mjs.map +1 -1
- package/fesm2022/ngx-com-components.mjs +0 -13
- package/fesm2022/ngx-com-components.mjs.map +1 -1
- package/fesm2022/ngx-com-tokens.mjs +0 -8
- package/fesm2022/ngx-com-tokens.mjs.map +1 -1
- package/fesm2022/ngx-com-utils.mjs +13 -1
- package/fesm2022/ngx-com-utils.mjs.map +1 -1
- package/fesm2022/ngx-com.mjs +1 -1
- package/fesm2022/ngx-com.mjs.map +1 -1
- package/package.json +51 -8
- package/styles/animations.css +38 -0
- package/styles/candy.css +121 -0
- package/styles/dark.css +159 -0
- package/styles/forest.css +117 -0
- package/styles/ocean.css +117 -0
- package/styles/themes.css +7 -0
- package/styles/tokens.css +277 -0
- package/styles/utilities.css +16 -0
- package/types/ngx-com-components-alert.d.ts +14 -4
- package/types/ngx-com-components-avatar.d.ts +2 -0
- package/types/ngx-com-components-calendar.d.ts +3 -747
- package/types/ngx-com-components-card.d.ts +2 -2
- package/types/ngx-com-components-carousel.d.ts +11 -1
- package/types/ngx-com-components-code-block.d.ts +4 -4
- package/types/ngx-com-components-collapsible.d.ts +10 -2
- package/types/ngx-com-components-confirm.d.ts +2 -2
- package/types/ngx-com-components-datepicker.d.ts +623 -0
- package/types/ngx-com-components-dialog.d.ts +5 -2
- package/types/ngx-com-components-dropdown.d.ts +22 -4
- package/types/ngx-com-components-empty-state.d.ts +2 -0
- package/types/ngx-com-components-form-field.d.ts +4 -1
- package/types/ngx-com-components-icon-lucide.d.ts +32 -0
- package/types/ngx-com-components-icon.d.ts +49 -35
- package/types/ngx-com-components-item.d.ts +12 -2
- package/types/ngx-com-components-menu.d.ts +38 -38
- package/types/ngx-com-components-native-control.d.ts +99 -0
- package/types/ngx-com-components-paginator.d.ts +2 -0
- package/types/ngx-com-components-popover.d.ts +19 -12
- package/types/ngx-com-components-segmented-control.d.ts +3 -1
- package/types/ngx-com-components-sort.d.ts +13 -10
- package/types/ngx-com-components-switch.d.ts +7 -2
- package/types/ngx-com-components-table.d.ts +16 -2
- package/types/ngx-com-components-tabs.d.ts +46 -34
- package/types/ngx-com-components-timepicker.d.ts +273 -0
- package/types/ngx-com-components-toast.d.ts +4 -2
- package/types/ngx-com-components-tooltip.d.ts +1 -1
- package/types/ngx-com-components.d.ts +6 -7
- package/types/ngx-com-tokens.d.ts +5 -3
- package/types/ngx-com-utils.d.ts +11 -1
- 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-
|
|
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-
|
|
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-
|
|
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":"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"}
|
|
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-
|
|
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-
|
|
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
|
|
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:
|
|
83
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.0", type:
|
|
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:
|
|
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-
|
|
145
|
+
* @tokens `--color-popover`, `--color-popover-foreground`, `--color-border`, `--shadow-overlay`, `--radius-popover`, `--radius-overlay`
|
|
146
146
|
*/
|
|
147
|
-
class
|
|
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:
|
|
169
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type:
|
|
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:
|
|
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:
|
|
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,
|
|
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-
|
|
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
|
|
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()
|
|
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
|
-
|
|
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(
|
|
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:
|
|
788
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.0", type:
|
|
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:
|
|
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
|
|
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:
|
|
841
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.0", type:
|
|
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:
|
|
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
|
|
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:
|
|
883
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.0", type:
|
|
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:
|
|
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 {
|
|
925
|
+
export { ComPopoverClose, ComPopoverTemplate, ComPopoverTrigger, POPOVER_DATA, POPOVER_REF, buildPopoverPositions, deriveAlignmentFromPosition, deriveSideFromPosition, popoverArrowVariants, popoverPanelVariants };
|
|
901
926
|
//# sourceMappingURL=ngx-com-components-popover.mjs.map
|