@tailng-ui/primitives 0.44.0 → 0.46.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/package.json +2 -2
- package/src/lib/form/_shared/select/tng-select.overlay.shared.d.ts.map +1 -1
- package/src/lib/form/_shared/select/tng-select.overlay.shared.js +10 -0
- package/src/lib/form/_shared/select/tng-select.overlay.shared.js.map +1 -1
- package/src/lib/navigation/index.d.ts +1 -0
- package/src/lib/navigation/index.d.ts.map +1 -1
- package/src/lib/navigation/index.js +1 -0
- package/src/lib/navigation/index.js.map +1 -1
- package/src/lib/navigation/pagination/__tests__/tng-pagination.test-harness.d.ts +44 -0
- package/src/lib/navigation/pagination/__tests__/tng-pagination.test-harness.d.ts.map +1 -0
- package/src/lib/navigation/pagination/__tests__/tng-pagination.test-harness.js +194 -0
- package/src/lib/navigation/pagination/__tests__/tng-pagination.test-harness.js.map +1 -0
- package/src/lib/navigation/pagination/index.d.ts +2 -0
- package/src/lib/navigation/pagination/index.d.ts.map +1 -0
- package/src/lib/navigation/pagination/index.js +2 -0
- package/src/lib/navigation/pagination/index.js.map +1 -0
- package/src/lib/navigation/pagination/tng-pagination.d.ts +131 -0
- package/src/lib/navigation/pagination/tng-pagination.d.ts.map +1 -0
- package/src/lib/navigation/pagination/tng-pagination.js +437 -0
- package/src/lib/navigation/pagination/tng-pagination.js.map +1 -0
- package/src/lib/overlay/popover/tng-popover.d.ts +1 -0
- package/src/lib/overlay/popover/tng-popover.d.ts.map +1 -1
- package/src/lib/overlay/popover/tng-popover.js +15 -2
- package/src/lib/overlay/popover/tng-popover.js.map +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tailng-ui/primitives",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.46.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
},
|
|
18
18
|
"peerDependencies": {
|
|
19
19
|
"@angular/core": "^21.1.0",
|
|
20
|
-
"@tailng-ui/cdk": "^0.
|
|
20
|
+
"@tailng-ui/cdk": "^0.32.0",
|
|
21
21
|
"tslib": "^2.3.0"
|
|
22
22
|
},
|
|
23
23
|
"sideEffects": false
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-select.overlay.shared.d.ts","sourceRoot":"","sources":["../../../../../../../../../libs/tailng-ui/primitives/src/lib/form/_shared/select/tng-select.overlay.shared.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"tng-select.overlay.shared.d.ts","sourceRoot":"","sources":["../../../../../../../../../libs/tailng-ui/primitives/src/lib/form/_shared/select/tng-select.overlay.shared.ts"],"names":[],"mappings":";AA6GA,qBAIa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA6C;IAClE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmC;IACzD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsB;IAEjD,OAAO,CAAC,qBAAqB,CAA4B;IACzD,OAAO,CAAC,oBAAoB,CAA6B;IACzD,OAAO,CAAC,oBAAoB,CAA6B;IACzD,OAAO,CAAC,cAAc,CAA+B;IAErD,QAAQ,CAAC,SAAS;;;oBAAqD;IACvE,QAAQ,CAAC,MAAM;;;oBAAkD;IACjE,QAAQ,CAAC,SAAS;;;;oBAA4D;IAG9E,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAoB;IAGjE,SAAS,KAAK,MAAM,IAAI,EAAE,GAAG,IAAI,CAEhC;IAED,OAAO,CAAC,WAAW,CAAwB;IAC3C,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,wBAAwB,CAA6B;;IAsB7D,OAAO,CAAC,UAAU;IAuBlB,OAAO,CAAC,wBAAwB;IAyBhC,OAAO,CAAC,2BAA2B;IASnC,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,sBAAsB;IAqB9B,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,uBAAuB;IAU/B,OAAO,CAAC,sBAAsB;IAgD9B,OAAO,CAAC,oBAAoB;IAsC5B,OAAO,CAAC,mBAAmB;IA0B3B,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,mBAAmB;yCArQhB,gBAAgB;2CAAhB,gBAAgB;CAkR5B"}
|
|
@@ -65,6 +65,8 @@ const PORTALLED_SELECT_THEME_VARS = [
|
|
|
65
65
|
'--tng-semantic-accent-danger',
|
|
66
66
|
'--tng-semantic-focus-ring',
|
|
67
67
|
];
|
|
68
|
+
const TNG_OVERLAY_LAYER_ID_ATTR = 'data-tng-overlay-layer-id';
|
|
69
|
+
const TNG_OVERLAY_OWNER_ID_ATTR = 'data-tng-overlay-owner-id';
|
|
68
70
|
function rectFromClientRect(r) {
|
|
69
71
|
return { left: r.left, top: r.top, width: r.width, height: r.height };
|
|
70
72
|
}
|
|
@@ -74,6 +76,9 @@ function viewportRect() {
|
|
|
74
76
|
function isInside(target, container) {
|
|
75
77
|
return !!target && target instanceof Node && container.contains(target);
|
|
76
78
|
}
|
|
79
|
+
function resolveOverlayOwnerId(host) {
|
|
80
|
+
return host.closest(`[${TNG_OVERLAY_LAYER_ID_ATTR}]`)?.getAttribute(TNG_OVERLAY_LAYER_ID_ATTR) ?? null;
|
|
81
|
+
}
|
|
77
82
|
export class TngSelectOverlay {
|
|
78
83
|
host = inject(TNG_SELECT_HOST);
|
|
79
84
|
elRef = inject((ElementRef));
|
|
@@ -203,6 +208,10 @@ export class TngSelectOverlay {
|
|
|
203
208
|
this.lastFocusedBeforeOpen = document.activeElement;
|
|
204
209
|
this.setupRepositionListeners();
|
|
205
210
|
const panel = this.elRef.nativeElement;
|
|
211
|
+
const ownerId = resolveOverlayOwnerId(this.host.hostElement);
|
|
212
|
+
if (ownerId !== null) {
|
|
213
|
+
panel.setAttribute(TNG_OVERLAY_OWNER_ID_ATTR, ownerId);
|
|
214
|
+
}
|
|
206
215
|
if (panel.parentNode !== document.body) {
|
|
207
216
|
document.body.appendChild(panel);
|
|
208
217
|
}
|
|
@@ -265,6 +274,7 @@ export class TngSelectOverlay {
|
|
|
265
274
|
panel.style.zIndex = '';
|
|
266
275
|
panel.style.width = '';
|
|
267
276
|
panel.style.minWidth = '';
|
|
277
|
+
panel.removeAttribute(TNG_OVERLAY_OWNER_ID_ATTR);
|
|
268
278
|
this.clearPortalledThemeVars();
|
|
269
279
|
this.teardownOutsidePointer();
|
|
270
280
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-select.overlay.shared.js","sourceRoot":"","sources":["../../../../../../../../../libs/tailng-ui/primitives/src/lib/form/_shared/select/tng-select.overlay.shared.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DestroyRef,\n Directive,\n ElementRef,\n HostBinding,\n inject,\n input,\n effect,\n} from '@angular/core';\nimport type {\n TngOverlayCollisionOptions,\n TngOverlayOffset,\n TngOverlayPlacement,\n} from '@tailng-ui/cdk';\nimport { computeOverlayPosition } from '@tailng-ui/cdk';\n\nimport { TNG_SELECT_HOST } from './tng-select.tokens.shared';\nimport type { TngSelectHostApi } from './tng-select.host-api';\n\ntype MaybeRect = Readonly<{\n left: number;\n top: number;\n width: number;\n height: number;\n}>;\n\nconst PORTALLED_SELECT_THEME_VARS = [\n '--tng-select-radius',\n '--tng-select-trigger-width',\n '--tng-select-trigger-min-height',\n '--tng-select-trigger-py',\n '--tng-select-trigger-px',\n '--tng-select-trigger-gap',\n '--tng-select-icon-size',\n '--tng-select-icon-opacity',\n '--tng-select-icon-margin-inline-start',\n '--tng-select-overlay-padding',\n '--tng-select-overlay-radius',\n '--tng-select-overlay-shadow',\n '--tng-select-overlay-max-width',\n '--tng-select-z-overlay',\n '--tng-select-overlay-z-index',\n '--tng-z-overlay',\n '--tng-select-overlay-border',\n '--tng-select-overlay-bg',\n '--tng-select-overlay-max-height',\n '--tng-select-listbox-gap',\n '--tng-select-option-min-height',\n '--tng-select-option-py',\n '--tng-select-option-px',\n '--tng-select-option-radius',\n '--tng-select-option-bg-active',\n '--tng-select-option-border-active',\n '--tng-select-option-bg-selected',\n '--tng-select-option-border-selected',\n '--tng-select-option-fg-selected',\n '--tng-select-option-bg-selected-active',\n '--tng-select-option-border-selected-active',\n '--tng-select-option-shadow-selected-active',\n '--tng-select-option-disabled-opacity',\n '--tng-select-option-font-weight',\n '--tng-select-value-font-size',\n '--tng-select-value-font-weight',\n '--tng-select-value-color',\n '--tng-select-icon-margin-inline-end',\n '--tng-select-border',\n '--tng-select-border-strong',\n '--tng-select-border-hover',\n '--tng-select-bg',\n '--tng-select-surface',\n '--tng-select-fg',\n '--tng-select-muted',\n '--tng-select-brand',\n '--tng-select-danger',\n '--tng-select-focus-ring',\n '--tng-select-ease',\n '--tng-select-shadow',\n '--tng-select-shadow-focus',\n '--tng-semantic-background-base',\n '--tng-semantic-background-surface',\n '--tng-semantic-border-subtle',\n '--tng-semantic-border-strong',\n '--tng-semantic-foreground-primary',\n '--tng-semantic-foreground-secondary',\n '--tng-semantic-foreground-muted',\n '--tng-semantic-accent-brand',\n '--tng-semantic-accent-danger',\n '--tng-semantic-focus-ring',\n] as const;\n\nfunction rectFromClientRect(r: DOMRect | ClientRect): MaybeRect {\n return { left: r.left, top: r.top, width: r.width, height: r.height };\n}\n\nfunction viewportRect(): MaybeRect {\n return { left: 0, top: 0, width: window.innerWidth || 1024, height: window.innerHeight || 768 };\n}\n\nfunction isInside(target: EventTarget | null, container: HTMLElement): boolean {\n return !!target && target instanceof Node && container.contains(target);\n}\n\n@Directive({\n selector: '[tngSelectOverlay]',\n exportAs: 'tngSelectOverlay',\n})\nexport class TngSelectOverlay {\n private readonly host = inject<TngSelectHostApi>(TNG_SELECT_HOST);\n private readonly elRef = inject(ElementRef<HTMLElement>);\n private readonly destroyRef = inject(DestroyRef);\n\n private lastFocusedBeforeOpen: HTMLElement | null = null;\n private removeResizeListener: (() => void) | null = null;\n private removeScrollListener: (() => void) | null = null;\n private resizeObserver: ResizeObserver | null = null;\n\n readonly placement = input<TngOverlayPlacement | undefined>(undefined);\n readonly offset = input<TngOverlayOffset | undefined>(undefined);\n readonly collision = input<TngOverlayCollisionOptions | undefined>(undefined);\n\n @HostBinding('attr.data-slot')\n protected readonly dataSlot: 'select-overlay' = 'select-overlay';\n\n @HostBinding('attr.hidden')\n protected get hidden(): '' | null {\n return this.host.open() ? null : '';\n }\n\n private placeholder: Comment | null = null;\n private originalParent: Node | null = null;\n private removeDocPointerListener: (() => void) | null = null;\n\n constructor() {\n this.placeholder = document.createComment('tng-select-overlay-anchor');\n const hostEl = this.elRef.nativeElement;\n this.originalParent = hostEl.parentNode;\n this.originalParent?.insertBefore(this.placeholder, hostEl);\n\n effect(() => {\n const open = this.host.open();\n if (open) this.mountToBodyAndPosition();\n else this.restoreToPlaceholder();\n });\n\n this.destroyRef.onDestroy(() => {\n this.teardownOutsidePointer();\n this.restoreToPlaceholder(true);\n this.placeholder = null;\n this.originalParent = null;\n });\n }\n\n private reposition(): void {\n if (!this.host.open()) return;\n const panel = this.elRef.nativeElement;\n const trigger = this.findTriggerEl();\n if (!trigger) return;\n\n const anchor = rectFromClientRect(trigger.getBoundingClientRect());\n const overlay = rectFromClientRect(panel.getBoundingClientRect());\n const viewport = viewportRect();\n\n const result = computeOverlayPosition({\n anchorRect: anchor,\n overlayRect: overlay,\n viewportRect: viewport,\n placement: this.placement(),\n offset: this.offset(),\n collision: this.collision(),\n });\n\n panel.style.left = `${result.x}px`;\n panel.style.top = `${result.y}px`;\n }\n\n private setupRepositionListeners(): void {\n let rafId: number | null = null;\n const schedule = () => {\n if (rafId !== null) return;\n rafId = requestAnimationFrame(() => {\n rafId = null;\n this.reposition();\n });\n };\n\n const onResize = () => schedule();\n const onScroll = () => schedule();\n window.addEventListener('resize', onResize);\n window.addEventListener('scroll', onScroll, true);\n this.removeResizeListener = () => window.removeEventListener('resize', onResize);\n this.removeScrollListener = () => window.removeEventListener('scroll', onScroll, true);\n\n if ('ResizeObserver' in window) {\n this.resizeObserver = new ResizeObserver(() => schedule());\n const trigger = this.findTriggerEl();\n if (trigger) this.resizeObserver.observe(trigger);\n this.resizeObserver.observe(this.elRef.nativeElement);\n }\n }\n\n private teardownRepositionListeners(): void {\n this.removeResizeListener?.();\n this.removeScrollListener?.();\n this.removeResizeListener = null;\n this.removeScrollListener = null;\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n }\n\n private findTriggerEl(): HTMLElement | null {\n const root = this.host.hostElement;\n return root.querySelector('[data-slot=\"select-trigger\"]') as HTMLElement | null;\n }\n\n private syncPortalledThemeVars(): void {\n const panel = this.elRef.nativeElement;\n const hostStyles = getComputedStyle(this.host.hostElement);\n\n for (const cssVar of PORTALLED_SELECT_THEME_VARS) {\n const value = hostStyles.getPropertyValue(cssVar).trim();\n if (value) {\n panel.style.setProperty(cssVar, value);\n } else {\n panel.style.removeProperty(cssVar);\n }\n }\n\n const colorScheme = hostStyles.colorScheme?.trim();\n if (colorScheme && colorScheme !== 'normal') {\n panel.style.colorScheme = colorScheme;\n } else {\n panel.style.removeProperty('color-scheme');\n }\n }\n\n private applyPortalledStacking(): void {\n this.elRef.nativeElement.style.zIndex =\n 'var(--tng-select-z-overlay, var(--tng-select-overlay-z-index, var(--tng-z-overlay, 2)))';\n }\n\n private clearPortalledThemeVars(): void {\n const panel = this.elRef.nativeElement;\n\n for (const cssVar of PORTALLED_SELECT_THEME_VARS) {\n panel.style.removeProperty(cssVar);\n }\n\n panel.style.removeProperty('color-scheme');\n }\n\n private mountToBodyAndPosition(): void {\n this.lastFocusedBeforeOpen = document.activeElement as HTMLElement | null;\n this.setupRepositionListeners();\n const panel = this.elRef.nativeElement;\n\n if (panel.parentNode !== document.body) {\n document.body.appendChild(panel);\n }\n\n panel.style.position = 'fixed';\n panel.style.left = '0px';\n panel.style.top = '0px';\n this.syncPortalledThemeVars();\n this.applyPortalledStacking();\n\n queueMicrotask(() => {\n if (!this.host.open()) return;\n const trigger = this.findTriggerEl();\n if (!trigger) return;\n\n const anchor = rectFromClientRect(trigger.getBoundingClientRect());\n const viewportWidth = viewportRect().width;\n const inlineSize = Math.max(0, Math.min(anchor.width, viewportWidth - 16));\n panel.style.width = `${inlineSize}px`;\n panel.style.minWidth = `${inlineSize}px`;\n\n const overlay = rectFromClientRect(panel.getBoundingClientRect());\n const viewport = viewportRect();\n const result = computeOverlayPosition({\n anchorRect: anchor,\n overlayRect: overlay,\n viewportRect: viewport,\n placement: this.placement(),\n offset: this.offset(),\n collision: this.collision(),\n });\n\n panel.style.left = `${result.x}px`;\n panel.style.top = `${result.y}px`;\n });\n\n this.setupOutsidePointer();\n }\n\n private restoreToPlaceholder(force = false): void {\n const panel = this.elRef.nativeElement;\n if (!force && panel.parentNode !== document.body) {\n this.teardownOutsidePointer();\n return;\n }\n\n if (this.placeholder?.parentNode) {\n this.placeholder.parentNode.insertBefore(panel, this.placeholder);\n } else if (this.originalParent) {\n this.originalParent.appendChild(panel);\n }\n\n this.teardownRepositionListeners();\n\n if (\n this.lastFocusedBeforeOpen &&\n document.contains(this.lastFocusedBeforeOpen)\n ) {\n const active = document.activeElement as HTMLElement | null;\n const panelEl = this.elRef.nativeElement;\n if (!active || panelEl.contains(active)) {\n this.lastFocusedBeforeOpen.focus();\n }\n }\n\n this.restoreFocusOnClose();\n panel.style.position = '';\n panel.style.left = '';\n panel.style.top = '';\n panel.style.zIndex = '';\n panel.style.width = '';\n panel.style.minWidth = '';\n this.clearPortalledThemeVars();\n this.teardownOutsidePointer();\n }\n\n private setupOutsidePointer(): void {\n if (this.removeDocPointerListener) return;\n\n const onPointerDown = (ev: PointerEvent) => {\n if (!this.host.open()) return;\n const panel = this.elRef.nativeElement;\n const trigger = this.findTriggerEl();\n if (isInside(ev.target, panel)) return;\n if (trigger && isInside(ev.target, trigger)) return;\n if (\n this.host.multiple() &&\n ev.target &&\n (ev.target as Element).closest?.(\n '[data-slot=\"select-option\"], [data-slot=\"multi-select-option\"]'\n )\n )\n return;\n this.host.close();\n };\n\n document.addEventListener('pointerdown', onPointerDown, true);\n this.removeDocPointerListener = () => {\n document.removeEventListener('pointerdown', onPointerDown, true);\n };\n }\n\n private teardownOutsidePointer(): void {\n this.removeDocPointerListener?.();\n this.removeDocPointerListener = null;\n }\n\n private restoreFocusOnClose(): void {\n const panel = this.elRef.nativeElement;\n const active = document.activeElement as HTMLElement | null;\n if (active && panel.contains(active)) {\n const trigger = this.findTriggerEl();\n trigger?.focus();\n return;\n }\n if (document.activeElement === document.body) {\n const trigger = this.findTriggerEl();\n trigger?.focus();\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tng-select.overlay.shared.js","sourceRoot":"","sources":["../../../../../../../../../libs/tailng-ui/primitives/src/lib/form/_shared/select/tng-select.overlay.shared.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,SAAS,EACT,UAAU,EACV,WAAW,EACX,MAAM,EACN,KAAK,EACL,MAAM,GACP,MAAM,eAAe,CAAC;AAMvB,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAExD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;;AAU7D,MAAM,2BAA2B,GAAG;IAClC,qBAAqB;IACrB,4BAA4B;IAC5B,iCAAiC;IACjC,yBAAyB;IACzB,yBAAyB;IACzB,0BAA0B;IAC1B,wBAAwB;IACxB,2BAA2B;IAC3B,uCAAuC;IACvC,8BAA8B;IAC9B,6BAA6B;IAC7B,6BAA6B;IAC7B,gCAAgC;IAChC,wBAAwB;IACxB,8BAA8B;IAC9B,iBAAiB;IACjB,6BAA6B;IAC7B,yBAAyB;IACzB,iCAAiC;IACjC,0BAA0B;IAC1B,gCAAgC;IAChC,wBAAwB;IACxB,wBAAwB;IACxB,4BAA4B;IAC5B,+BAA+B;IAC/B,mCAAmC;IACnC,iCAAiC;IACjC,qCAAqC;IACrC,iCAAiC;IACjC,wCAAwC;IACxC,4CAA4C;IAC5C,4CAA4C;IAC5C,sCAAsC;IACtC,iCAAiC;IACjC,8BAA8B;IAC9B,gCAAgC;IAChC,0BAA0B;IAC1B,qCAAqC;IACrC,qBAAqB;IACrB,4BAA4B;IAC5B,2BAA2B;IAC3B,iBAAiB;IACjB,sBAAsB;IACtB,iBAAiB;IACjB,oBAAoB;IACpB,oBAAoB;IACpB,qBAAqB;IACrB,yBAAyB;IACzB,mBAAmB;IACnB,qBAAqB;IACrB,2BAA2B;IAC3B,gCAAgC;IAChC,mCAAmC;IACnC,8BAA8B;IAC9B,8BAA8B;IAC9B,mCAAmC;IACnC,qCAAqC;IACrC,iCAAiC;IACjC,6BAA6B;IAC7B,8BAA8B;IAC9B,2BAA2B;CACnB,CAAC;AAEX,MAAM,yBAAyB,GAAG,2BAA2B,CAAC;AAC9D,MAAM,yBAAyB,GAAG,2BAA2B,CAAC;AAE9D,SAAS,kBAAkB,CAAC,CAAuB;IACjD,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AACxE,CAAC;AAED,SAAS,YAAY;IACnB,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,IAAI,GAAG,EAAE,CAAC;AAClG,CAAC;AAED,SAAS,QAAQ,CAAC,MAA0B,EAAE,SAAsB;IAClE,OAAO,CAAC,CAAC,MAAM,IAAI,MAAM,YAAY,IAAI,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAiB;IAC9C,OAAO,IAAI,CAAC,OAAO,CAAc,IAAI,yBAAyB,GAAG,CAAC,EAAE,YAAY,CAAC,yBAAyB,CAAC,IAAI,IAAI,CAAC;AACtH,CAAC;AAMD,MAAM,OAAO,gBAAgB;IACV,IAAI,GAAG,MAAM,CAAmB,eAAe,CAAC,CAAC;IACjD,KAAK,GAAG,MAAM,CAAC,CAAA,UAAuB,CAAA,CAAC,CAAC;IACxC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAEzC,qBAAqB,GAAuB,IAAI,CAAC;IACjD,oBAAoB,GAAwB,IAAI,CAAC;IACjD,oBAAoB,GAAwB,IAAI,CAAC;IACjD,cAAc,GAA0B,IAAI,CAAC;IAE5C,SAAS,GAAG,KAAK,CAAkC,SAAS,qDAAC,CAAC;IAC9D,MAAM,GAAG,KAAK,CAA+B,SAAS,kDAAC,CAAC;IACxD,SAAS,GAAG,KAAK,CAAyC,SAAS,qDAAC,CAAC;IAG3D,QAAQ,GAAqB,gBAAgB,CAAC;IAEjE,IACc,MAAM;QAClB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACtC,CAAC;IAEO,WAAW,GAAmB,IAAI,CAAC;IACnC,cAAc,GAAgB,IAAI,CAAC;IACnC,wBAAwB,GAAwB,IAAI,CAAC;IAE7D;QACE,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;QACxC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC;QACxC,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAE5D,MAAM,CAAC,GAAG,EAAE;YACV,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC9B,IAAI,IAAI;gBAAE,IAAI,CAAC,sBAAsB,EAAE,CAAC;;gBACnC,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE;YAC7B,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC9B,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,OAAO;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACrC,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;QAEhC,MAAM,MAAM,GAAG,sBAAsB,CAAC;YACpC,UAAU,EAAE,MAAM;YAClB,WAAW,EAAE,OAAO;YACpB,YAAY,EAAE,QAAQ;YACtB,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;YAC3B,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;SAC5B,CAAC,CAAC;QAEH,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;QACnC,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;IACpC,CAAC;IAEO,wBAAwB;QAC9B,IAAI,KAAK,GAAkB,IAAI,CAAC;QAChC,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,IAAI,KAAK,KAAK,IAAI;gBAAE,OAAO;YAC3B,KAAK,GAAG,qBAAqB,CAAC,GAAG,EAAE;gBACjC,KAAK,GAAG,IAAI,CAAC;gBACb,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;QAClC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC5C,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,oBAAoB,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACjF,IAAI,CAAC,oBAAoB,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QAEvF,IAAI,gBAAgB,IAAI,MAAM,EAAE,CAAC;YAC/B,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACrC,IAAI,OAAO;gBAAE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAClD,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAEO,2BAA2B;QACjC,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;QAC9B,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;QAC9B,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,cAAc,EAAE,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC7B,CAAC;IAEO,aAAa;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;QACnC,OAAO,IAAI,CAAC,aAAa,CAAC,8BAA8B,CAAuB,CAAC;IAClF,CAAC;IAEO,sBAAsB;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;QACvC,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAE3D,KAAK,MAAM,MAAM,IAAI,2BAA2B,EAAE,CAAC;YACjD,MAAM,KAAK,GAAG,UAAU,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YACzD,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;QACnD,IAAI,WAAW,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC5C,KAAK,CAAC,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAEO,sBAAsB;QAC5B,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM;YACnC,yFAAyF,CAAC;IAC9F,CAAC;IAEO,uBAAuB;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;QAEvC,KAAK,MAAM,MAAM,IAAI,2BAA2B,EAAE,CAAC;YACjD,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;IAC7C,CAAC;IAEO,sBAAsB;QAC5B,IAAI,CAAC,qBAAqB,GAAG,QAAQ,CAAC,aAAmC,CAAC;QAC1E,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;QACvC,MAAM,OAAO,GAAG,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC7D,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,KAAK,CAAC,YAAY,CAAC,yBAAyB,EAAE,OAAO,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,KAAK,CAAC,UAAU,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;YACvC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC;QAC/B,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC;QACzB,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC9B,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAE9B,cAAc,CAAC,GAAG,EAAE;YAClB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAAE,OAAO;YAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACrC,IAAI,CAAC,OAAO;gBAAE,OAAO;YAErB,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;YACnE,MAAM,aAAa,GAAG,YAAY,EAAE,CAAC,KAAK,CAAC;YAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,EAAE,CAAC,CAAC,CAAC;YAC3E,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,UAAU,IAAI,CAAC;YACtC,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,UAAU,IAAI,CAAC;YAEzC,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC,CAAC;YAClE,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,sBAAsB,CAAC;gBACpC,UAAU,EAAE,MAAM;gBAClB,WAAW,EAAE,OAAO;gBACpB,YAAY,EAAE,QAAQ;gBACtB,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;gBAC3B,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;gBACrB,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;aAC5B,CAAC,CAAC;YAEH,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;YACnC,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC7B,CAAC;IAEO,oBAAoB,CAAC,KAAK,GAAG,KAAK;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;QACvC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;YACjD,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC9B,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC;YACjC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACpE,CAAC;aAAM,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC/B,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,CAAC,2BAA2B,EAAE,CAAC;QAEnC,IACE,IAAI,CAAC,qBAAqB;YAC1B,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,EAC7C,CAAC;YACD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAmC,CAAC;YAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;YACzC,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxC,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC;YACrC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;QAC1B,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC;QACtB,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC;QACrB,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC;QACxB,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;QACvB,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;QAC1B,KAAK,CAAC,eAAe,CAAC,yBAAyB,CAAC,CAAC;QACjD,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAChC,CAAC;IAEO,mBAAmB;QACzB,IAAI,IAAI,CAAC,wBAAwB;YAAE,OAAO;QAE1C,MAAM,aAAa,GAAG,CAAC,EAAgB,EAAE,EAAE;YACzC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAAE,OAAO;YAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;YACvC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACrC,IAAI,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;gBAAE,OAAO;YACvC,IAAI,OAAO,IAAI,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;gBAAE,OAAO;YACpD,IACE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;gBACpB,EAAE,CAAC,MAAM;gBACR,EAAE,CAAC,MAAkB,CAAC,OAAO,EAAE,CAC9B,gEAAgE,CACjE;gBAED,OAAO;YACT,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC,CAAC;QAEF,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;QAC9D,IAAI,CAAC,wBAAwB,GAAG,GAAG,EAAE;YACnC,QAAQ,CAAC,mBAAmB,CAAC,aAAa,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;QACnE,CAAC,CAAC;IACJ,CAAC;IAEO,sBAAsB;QAC5B,IAAI,CAAC,wBAAwB,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;IACvC,CAAC;IAEO,mBAAmB;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;QACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAmC,CAAC;QAC5D,IAAI,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACrC,OAAO,EAAE,KAAK,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QACD,IAAI,QAAQ,CAAC,aAAa,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACrC,OAAO,EAAE,KAAK,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;uGAjRU,gBAAgB;2FAAhB,gBAAgB;;2FAAhB,gBAAgB;kBAJ5B,SAAS;mBAAC;oBACT,QAAQ,EAAE,oBAAoB;oBAC9B,QAAQ,EAAE,kBAAkB;iBAC7B;;sBAeE,WAAW;uBAAC,gBAAgB;;sBAG5B,WAAW;uBAAC,aAAa","sourcesContent":["import {\n DestroyRef,\n Directive,\n ElementRef,\n HostBinding,\n inject,\n input,\n effect,\n} from '@angular/core';\nimport type {\n TngOverlayCollisionOptions,\n TngOverlayOffset,\n TngOverlayPlacement,\n} from '@tailng-ui/cdk';\nimport { computeOverlayPosition } from '@tailng-ui/cdk';\n\nimport { TNG_SELECT_HOST } from './tng-select.tokens.shared';\nimport type { TngSelectHostApi } from './tng-select.host-api';\n\ntype MaybeRect = Readonly<{\n left: number;\n top: number;\n width: number;\n height: number;\n}>;\n\nconst PORTALLED_SELECT_THEME_VARS = [\n '--tng-select-radius',\n '--tng-select-trigger-width',\n '--tng-select-trigger-min-height',\n '--tng-select-trigger-py',\n '--tng-select-trigger-px',\n '--tng-select-trigger-gap',\n '--tng-select-icon-size',\n '--tng-select-icon-opacity',\n '--tng-select-icon-margin-inline-start',\n '--tng-select-overlay-padding',\n '--tng-select-overlay-radius',\n '--tng-select-overlay-shadow',\n '--tng-select-overlay-max-width',\n '--tng-select-z-overlay',\n '--tng-select-overlay-z-index',\n '--tng-z-overlay',\n '--tng-select-overlay-border',\n '--tng-select-overlay-bg',\n '--tng-select-overlay-max-height',\n '--tng-select-listbox-gap',\n '--tng-select-option-min-height',\n '--tng-select-option-py',\n '--tng-select-option-px',\n '--tng-select-option-radius',\n '--tng-select-option-bg-active',\n '--tng-select-option-border-active',\n '--tng-select-option-bg-selected',\n '--tng-select-option-border-selected',\n '--tng-select-option-fg-selected',\n '--tng-select-option-bg-selected-active',\n '--tng-select-option-border-selected-active',\n '--tng-select-option-shadow-selected-active',\n '--tng-select-option-disabled-opacity',\n '--tng-select-option-font-weight',\n '--tng-select-value-font-size',\n '--tng-select-value-font-weight',\n '--tng-select-value-color',\n '--tng-select-icon-margin-inline-end',\n '--tng-select-border',\n '--tng-select-border-strong',\n '--tng-select-border-hover',\n '--tng-select-bg',\n '--tng-select-surface',\n '--tng-select-fg',\n '--tng-select-muted',\n '--tng-select-brand',\n '--tng-select-danger',\n '--tng-select-focus-ring',\n '--tng-select-ease',\n '--tng-select-shadow',\n '--tng-select-shadow-focus',\n '--tng-semantic-background-base',\n '--tng-semantic-background-surface',\n '--tng-semantic-border-subtle',\n '--tng-semantic-border-strong',\n '--tng-semantic-foreground-primary',\n '--tng-semantic-foreground-secondary',\n '--tng-semantic-foreground-muted',\n '--tng-semantic-accent-brand',\n '--tng-semantic-accent-danger',\n '--tng-semantic-focus-ring',\n] as const;\n\nconst TNG_OVERLAY_LAYER_ID_ATTR = 'data-tng-overlay-layer-id';\nconst TNG_OVERLAY_OWNER_ID_ATTR = 'data-tng-overlay-owner-id';\n\nfunction rectFromClientRect(r: DOMRect | ClientRect): MaybeRect {\n return { left: r.left, top: r.top, width: r.width, height: r.height };\n}\n\nfunction viewportRect(): MaybeRect {\n return { left: 0, top: 0, width: window.innerWidth || 1024, height: window.innerHeight || 768 };\n}\n\nfunction isInside(target: EventTarget | null, container: HTMLElement): boolean {\n return !!target && target instanceof Node && container.contains(target);\n}\n\nfunction resolveOverlayOwnerId(host: HTMLElement): string | null {\n return host.closest<HTMLElement>(`[${TNG_OVERLAY_LAYER_ID_ATTR}]`)?.getAttribute(TNG_OVERLAY_LAYER_ID_ATTR) ?? null;\n}\n\n@Directive({\n selector: '[tngSelectOverlay]',\n exportAs: 'tngSelectOverlay',\n})\nexport class TngSelectOverlay {\n private readonly host = inject<TngSelectHostApi>(TNG_SELECT_HOST);\n private readonly elRef = inject(ElementRef<HTMLElement>);\n private readonly destroyRef = inject(DestroyRef);\n\n private lastFocusedBeforeOpen: HTMLElement | null = null;\n private removeResizeListener: (() => void) | null = null;\n private removeScrollListener: (() => void) | null = null;\n private resizeObserver: ResizeObserver | null = null;\n\n readonly placement = input<TngOverlayPlacement | undefined>(undefined);\n readonly offset = input<TngOverlayOffset | undefined>(undefined);\n readonly collision = input<TngOverlayCollisionOptions | undefined>(undefined);\n\n @HostBinding('attr.data-slot')\n protected readonly dataSlot: 'select-overlay' = 'select-overlay';\n\n @HostBinding('attr.hidden')\n protected get hidden(): '' | null {\n return this.host.open() ? null : '';\n }\n\n private placeholder: Comment | null = null;\n private originalParent: Node | null = null;\n private removeDocPointerListener: (() => void) | null = null;\n\n constructor() {\n this.placeholder = document.createComment('tng-select-overlay-anchor');\n const hostEl = this.elRef.nativeElement;\n this.originalParent = hostEl.parentNode;\n this.originalParent?.insertBefore(this.placeholder, hostEl);\n\n effect(() => {\n const open = this.host.open();\n if (open) this.mountToBodyAndPosition();\n else this.restoreToPlaceholder();\n });\n\n this.destroyRef.onDestroy(() => {\n this.teardownOutsidePointer();\n this.restoreToPlaceholder(true);\n this.placeholder = null;\n this.originalParent = null;\n });\n }\n\n private reposition(): void {\n if (!this.host.open()) return;\n const panel = this.elRef.nativeElement;\n const trigger = this.findTriggerEl();\n if (!trigger) return;\n\n const anchor = rectFromClientRect(trigger.getBoundingClientRect());\n const overlay = rectFromClientRect(panel.getBoundingClientRect());\n const viewport = viewportRect();\n\n const result = computeOverlayPosition({\n anchorRect: anchor,\n overlayRect: overlay,\n viewportRect: viewport,\n placement: this.placement(),\n offset: this.offset(),\n collision: this.collision(),\n });\n\n panel.style.left = `${result.x}px`;\n panel.style.top = `${result.y}px`;\n }\n\n private setupRepositionListeners(): void {\n let rafId: number | null = null;\n const schedule = () => {\n if (rafId !== null) return;\n rafId = requestAnimationFrame(() => {\n rafId = null;\n this.reposition();\n });\n };\n\n const onResize = () => schedule();\n const onScroll = () => schedule();\n window.addEventListener('resize', onResize);\n window.addEventListener('scroll', onScroll, true);\n this.removeResizeListener = () => window.removeEventListener('resize', onResize);\n this.removeScrollListener = () => window.removeEventListener('scroll', onScroll, true);\n\n if ('ResizeObserver' in window) {\n this.resizeObserver = new ResizeObserver(() => schedule());\n const trigger = this.findTriggerEl();\n if (trigger) this.resizeObserver.observe(trigger);\n this.resizeObserver.observe(this.elRef.nativeElement);\n }\n }\n\n private teardownRepositionListeners(): void {\n this.removeResizeListener?.();\n this.removeScrollListener?.();\n this.removeResizeListener = null;\n this.removeScrollListener = null;\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n }\n\n private findTriggerEl(): HTMLElement | null {\n const root = this.host.hostElement;\n return root.querySelector('[data-slot=\"select-trigger\"]') as HTMLElement | null;\n }\n\n private syncPortalledThemeVars(): void {\n const panel = this.elRef.nativeElement;\n const hostStyles = getComputedStyle(this.host.hostElement);\n\n for (const cssVar of PORTALLED_SELECT_THEME_VARS) {\n const value = hostStyles.getPropertyValue(cssVar).trim();\n if (value) {\n panel.style.setProperty(cssVar, value);\n } else {\n panel.style.removeProperty(cssVar);\n }\n }\n\n const colorScheme = hostStyles.colorScheme?.trim();\n if (colorScheme && colorScheme !== 'normal') {\n panel.style.colorScheme = colorScheme;\n } else {\n panel.style.removeProperty('color-scheme');\n }\n }\n\n private applyPortalledStacking(): void {\n this.elRef.nativeElement.style.zIndex =\n 'var(--tng-select-z-overlay, var(--tng-select-overlay-z-index, var(--tng-z-overlay, 2)))';\n }\n\n private clearPortalledThemeVars(): void {\n const panel = this.elRef.nativeElement;\n\n for (const cssVar of PORTALLED_SELECT_THEME_VARS) {\n panel.style.removeProperty(cssVar);\n }\n\n panel.style.removeProperty('color-scheme');\n }\n\n private mountToBodyAndPosition(): void {\n this.lastFocusedBeforeOpen = document.activeElement as HTMLElement | null;\n this.setupRepositionListeners();\n const panel = this.elRef.nativeElement;\n const ownerId = resolveOverlayOwnerId(this.host.hostElement);\n if (ownerId !== null) {\n panel.setAttribute(TNG_OVERLAY_OWNER_ID_ATTR, ownerId);\n }\n\n if (panel.parentNode !== document.body) {\n document.body.appendChild(panel);\n }\n\n panel.style.position = 'fixed';\n panel.style.left = '0px';\n panel.style.top = '0px';\n this.syncPortalledThemeVars();\n this.applyPortalledStacking();\n\n queueMicrotask(() => {\n if (!this.host.open()) return;\n const trigger = this.findTriggerEl();\n if (!trigger) return;\n\n const anchor = rectFromClientRect(trigger.getBoundingClientRect());\n const viewportWidth = viewportRect().width;\n const inlineSize = Math.max(0, Math.min(anchor.width, viewportWidth - 16));\n panel.style.width = `${inlineSize}px`;\n panel.style.minWidth = `${inlineSize}px`;\n\n const overlay = rectFromClientRect(panel.getBoundingClientRect());\n const viewport = viewportRect();\n const result = computeOverlayPosition({\n anchorRect: anchor,\n overlayRect: overlay,\n viewportRect: viewport,\n placement: this.placement(),\n offset: this.offset(),\n collision: this.collision(),\n });\n\n panel.style.left = `${result.x}px`;\n panel.style.top = `${result.y}px`;\n });\n\n this.setupOutsidePointer();\n }\n\n private restoreToPlaceholder(force = false): void {\n const panel = this.elRef.nativeElement;\n if (!force && panel.parentNode !== document.body) {\n this.teardownOutsidePointer();\n return;\n }\n\n if (this.placeholder?.parentNode) {\n this.placeholder.parentNode.insertBefore(panel, this.placeholder);\n } else if (this.originalParent) {\n this.originalParent.appendChild(panel);\n }\n\n this.teardownRepositionListeners();\n\n if (\n this.lastFocusedBeforeOpen &&\n document.contains(this.lastFocusedBeforeOpen)\n ) {\n const active = document.activeElement as HTMLElement | null;\n const panelEl = this.elRef.nativeElement;\n if (!active || panelEl.contains(active)) {\n this.lastFocusedBeforeOpen.focus();\n }\n }\n\n this.restoreFocusOnClose();\n panel.style.position = '';\n panel.style.left = '';\n panel.style.top = '';\n panel.style.zIndex = '';\n panel.style.width = '';\n panel.style.minWidth = '';\n panel.removeAttribute(TNG_OVERLAY_OWNER_ID_ATTR);\n this.clearPortalledThemeVars();\n this.teardownOutsidePointer();\n }\n\n private setupOutsidePointer(): void {\n if (this.removeDocPointerListener) return;\n\n const onPointerDown = (ev: PointerEvent) => {\n if (!this.host.open()) return;\n const panel = this.elRef.nativeElement;\n const trigger = this.findTriggerEl();\n if (isInside(ev.target, panel)) return;\n if (trigger && isInside(ev.target, trigger)) return;\n if (\n this.host.multiple() &&\n ev.target &&\n (ev.target as Element).closest?.(\n '[data-slot=\"select-option\"], [data-slot=\"multi-select-option\"]'\n )\n )\n return;\n this.host.close();\n };\n\n document.addEventListener('pointerdown', onPointerDown, true);\n this.removeDocPointerListener = () => {\n document.removeEventListener('pointerdown', onPointerDown, true);\n };\n }\n\n private teardownOutsidePointer(): void {\n this.removeDocPointerListener?.();\n this.removeDocPointerListener = null;\n }\n\n private restoreFocusOnClose(): void {\n const panel = this.elRef.nativeElement;\n const active = document.activeElement as HTMLElement | null;\n if (active && panel.contains(active)) {\n const trigger = this.findTriggerEl();\n trigger?.focus();\n return;\n }\n if (document.activeElement === document.body) {\n const trigger = this.findTriggerEl();\n trigger?.focus();\n }\n }\n}\n"]}
|
|
@@ -2,5 +2,6 @@ export * from './breadcrumb/tng-breadcrumb';
|
|
|
2
2
|
export * from './context-menu/tng-context-menu';
|
|
3
3
|
export * from './menu/tng-menu';
|
|
4
4
|
export * from './menubar/tng-menubar';
|
|
5
|
+
export * from './pagination';
|
|
5
6
|
export * from './tabs/tng-tabs';
|
|
6
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../libs/tailng-ui/primitives/src/lib/navigation/index.ts"],"names":[],"mappings":"AACA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../libs/tailng-ui/primitives/src/lib/navigation/index.ts"],"names":[],"mappings":"AACA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC"}
|
|
@@ -3,5 +3,6 @@ export * from './breadcrumb/tng-breadcrumb';
|
|
|
3
3
|
export * from './context-menu/tng-context-menu';
|
|
4
4
|
export * from './menu/tng-menu';
|
|
5
5
|
export * from './menubar/tng-menubar';
|
|
6
|
+
export * from './pagination';
|
|
6
7
|
export * from './tabs/tng-tabs';
|
|
7
8
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../libs/tailng-ui/primitives/src/lib/navigation/index.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC","sourcesContent":["// Navigation primitives\nexport * from './breadcrumb/tng-breadcrumb';\nexport * from './context-menu/tng-context-menu';\nexport * from './menu/tng-menu';\nexport * from './menubar/tng-menubar';\nexport * from './tabs/tng-tabs';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../libs/tailng-ui/primitives/src/lib/navigation/index.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC","sourcesContent":["// Navigation primitives\nexport * from './breadcrumb/tng-breadcrumb';\nexport * from './context-menu/tng-context-menu';\nexport * from './menu/tng-menu';\nexport * from './menubar/tng-menubar';\nexport * from './pagination';\nexport * from './tabs/tng-tabs';\n"]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { ComponentFixture } from '@angular/core/testing';
|
|
2
|
+
import { TngPagination, type TngPaginationChangeEvent, TngPaginationFirst, TngPaginationLast, TngPaginationNext, TngPaginationPage, TngPaginationPageSize, TngPaginationPrevious } from '../tng-pagination';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare const paginationImports: readonly [typeof TngPagination, typeof TngPaginationFirst, typeof TngPaginationPrevious, typeof TngPaginationNext, typeof TngPaginationLast, typeof TngPaginationPage, typeof TngPaginationPageSize];
|
|
5
|
+
export declare class PaginationHarnessComponent {
|
|
6
|
+
readonly ariaLabel: import("@angular/core").WritableSignal<string | null>;
|
|
7
|
+
readonly defaultPageIndex: import("@angular/core").WritableSignal<number>;
|
|
8
|
+
readonly defaultPageSize: import("@angular/core").WritableSignal<number>;
|
|
9
|
+
readonly disabled: import("@angular/core").WritableSignal<boolean>;
|
|
10
|
+
readonly mode: import("@angular/core").WritableSignal<"client" | "server">;
|
|
11
|
+
readonly pageIndex: import("@angular/core").WritableSignal<number | undefined>;
|
|
12
|
+
readonly pageSize: import("@angular/core").WritableSignal<number | undefined>;
|
|
13
|
+
readonly totalItems: import("@angular/core").WritableSignal<number>;
|
|
14
|
+
readonly pageOne: import("@angular/core").WritableSignal<number>;
|
|
15
|
+
readonly pageTwo: import("@angular/core").WritableSignal<number>;
|
|
16
|
+
readonly outsidePage: import("@angular/core").WritableSignal<number>;
|
|
17
|
+
readonly events: string[];
|
|
18
|
+
readonly pageChanges: TngPaginationChangeEvent[];
|
|
19
|
+
readonly pageIndexChanges: number[];
|
|
20
|
+
readonly pageSizeChanges: number[];
|
|
21
|
+
autoSync: boolean;
|
|
22
|
+
onPageChange(event: TngPaginationChangeEvent): void;
|
|
23
|
+
onPageIndexChange(pageIndex: number): void;
|
|
24
|
+
onPageSizeChange(pageSize: number): void;
|
|
25
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<PaginationHarnessComponent, never>;
|
|
26
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<PaginationHarnessComponent, "ng-component", never, {}, {}, never, never, true, never>;
|
|
27
|
+
}
|
|
28
|
+
export declare class PaginationRootOnlyComponent {
|
|
29
|
+
readonly ariaLabel: import("@angular/core").WritableSignal<string | null>;
|
|
30
|
+
readonly totalItems: import("@angular/core").WritableSignal<number>;
|
|
31
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<PaginationRootOnlyComponent, never>;
|
|
32
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<PaginationRootOnlyComponent, "ng-component", never, {}, {}, never, never, true, never>;
|
|
33
|
+
}
|
|
34
|
+
export declare class PaginationDivRootComponent {
|
|
35
|
+
readonly totalItems: import("@angular/core").WritableSignal<number>;
|
|
36
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<PaginationDivRootComponent, never>;
|
|
37
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<PaginationDivRootComponent, "ng-component", never, {}, {}, never, never, true, never>;
|
|
38
|
+
}
|
|
39
|
+
export declare function createPaginationFixture(): ComponentFixture<PaginationHarnessComponent>;
|
|
40
|
+
export declare function createFixture<TComponent>(component: new () => TComponent): ComponentFixture<TComponent>;
|
|
41
|
+
export declare function getByTestId<TElement extends Element>(fixture: ComponentFixture<unknown>, testId: string): TElement;
|
|
42
|
+
export declare function click(element: HTMLElement): void;
|
|
43
|
+
export declare function changeSelectValue(select: HTMLSelectElement, value: string): void;
|
|
44
|
+
//# sourceMappingURL=tng-pagination.test-harness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tng-pagination.test-harness.d.ts","sourceRoot":"","sources":["../../../../../../../../../libs/tailng-ui/primitives/src/lib/navigation/pagination/__tests__/tng-pagination.test-harness.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAG9D,OAAO,EACL,aAAa,EACb,KAAK,wBAAwB,EAC7B,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACtB,MAAM,mBAAmB,CAAC;;AAE3B,eAAO,MAAM,iBAAiB,sMAQpB,CAAC;AAEX,qBAkCa,0BAA0B;IACrC,SAAgB,SAAS,wDAA0C;IACnE,SAAgB,gBAAgB,iDAAa;IAC7C,SAAgB,eAAe,iDAAc;IAC7C,SAAgB,QAAQ,kDAAiB;IACzC,SAAgB,IAAI,8DAAyC;IAC7D,SAAgB,SAAS,6DAAyC;IAClE,SAAgB,QAAQ,6DAAyC;IACjE,SAAgB,UAAU,iDAAc;IACxC,SAAgB,OAAO,iDAAa;IACpC,SAAgB,OAAO,iDAAa;IACpC,SAAgB,WAAW,iDAAc;IAEzC,SAAgB,MAAM,EAAE,MAAM,EAAE,CAAM;IACtC,SAAgB,WAAW,EAAE,wBAAwB,EAAE,CAAM;IAC7D,SAAgB,gBAAgB,EAAE,MAAM,EAAE,CAAM;IAChD,SAAgB,eAAe,EAAE,MAAM,EAAE,CAAM;IACxC,QAAQ,UAAS;IAEjB,YAAY,CAAC,KAAK,EAAE,wBAAwB,GAAG,IAAI;IAKnD,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQ1C,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;yCAhCpC,0BAA0B;2CAA1B,0BAA0B;CAuCtC;AAED,qBAWa,2BAA2B;IACtC,SAAgB,SAAS,wDAAkC;IAC3D,SAAgB,UAAU,iDAAa;yCAF5B,2BAA2B;2CAA3B,2BAA2B;CAGvC;AAED,qBAMa,0BAA0B;IACrC,SAAgB,UAAU,iDAAa;yCAD5B,0BAA0B;2CAA1B,0BAA0B;CAEtC;AAED,wBAAgB,uBAAuB,IAAI,gBAAgB,CAAC,0BAA0B,CAAC,CAOtF;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,UAAU,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAOvG;AAED,wBAAgB,WAAW,CAAC,QAAQ,SAAS,OAAO,EAClD,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAClC,MAAM,EAAE,MAAM,GACb,QAAQ,CAQV;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAOhD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAGhF"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { Component, signal } from '@angular/core';
|
|
2
|
+
import { TestBed } from '@angular/core/testing';
|
|
3
|
+
import { TngPagination, TngPaginationFirst, TngPaginationLast, TngPaginationNext, TngPaginationPage, TngPaginationPageSize, TngPaginationPrevious, } from '../tng-pagination';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export const paginationImports = [
|
|
6
|
+
TngPagination,
|
|
7
|
+
TngPaginationFirst,
|
|
8
|
+
TngPaginationPrevious,
|
|
9
|
+
TngPaginationNext,
|
|
10
|
+
TngPaginationLast,
|
|
11
|
+
TngPaginationPage,
|
|
12
|
+
TngPaginationPageSize,
|
|
13
|
+
];
|
|
14
|
+
export class PaginationHarnessComponent {
|
|
15
|
+
ariaLabel = signal('Results pages', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : []));
|
|
16
|
+
defaultPageIndex = signal(0, ...(ngDevMode ? [{ debugName: "defaultPageIndex" }] : []));
|
|
17
|
+
defaultPageSize = signal(10, ...(ngDevMode ? [{ debugName: "defaultPageSize" }] : []));
|
|
18
|
+
disabled = signal(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
|
|
19
|
+
mode = signal('client', ...(ngDevMode ? [{ debugName: "mode" }] : []));
|
|
20
|
+
pageIndex = signal(undefined, ...(ngDevMode ? [{ debugName: "pageIndex" }] : []));
|
|
21
|
+
pageSize = signal(undefined, ...(ngDevMode ? [{ debugName: "pageSize" }] : []));
|
|
22
|
+
totalItems = signal(25, ...(ngDevMode ? [{ debugName: "totalItems" }] : []));
|
|
23
|
+
pageOne = signal(0, ...(ngDevMode ? [{ debugName: "pageOne" }] : []));
|
|
24
|
+
pageTwo = signal(1, ...(ngDevMode ? [{ debugName: "pageTwo" }] : []));
|
|
25
|
+
outsidePage = signal(99, ...(ngDevMode ? [{ debugName: "outsidePage" }] : []));
|
|
26
|
+
events = [];
|
|
27
|
+
pageChanges = [];
|
|
28
|
+
pageIndexChanges = [];
|
|
29
|
+
pageSizeChanges = [];
|
|
30
|
+
autoSync = false;
|
|
31
|
+
onPageChange(event) {
|
|
32
|
+
this.events.push(`pageChange:${event.trigger}:${event.pageIndex}:${event.pageSize}`);
|
|
33
|
+
this.pageChanges.push(event);
|
|
34
|
+
}
|
|
35
|
+
onPageIndexChange(pageIndex) {
|
|
36
|
+
this.events.push(`pageIndexChange:${pageIndex}`);
|
|
37
|
+
this.pageIndexChanges.push(pageIndex);
|
|
38
|
+
if (this.autoSync) {
|
|
39
|
+
this.pageIndex.set(pageIndex);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
onPageSizeChange(pageSize) {
|
|
43
|
+
this.events.push(`pageSizeChange:${pageSize}`);
|
|
44
|
+
this.pageSizeChanges.push(pageSize);
|
|
45
|
+
if (this.autoSync) {
|
|
46
|
+
this.pageSize.set(pageSize);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: PaginationHarnessComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
50
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.1", type: PaginationHarnessComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: `
|
|
51
|
+
<nav
|
|
52
|
+
tngPagination
|
|
53
|
+
data-testid="pagination"
|
|
54
|
+
[ariaLabel]="ariaLabel()"
|
|
55
|
+
[defaultPageIndex]="defaultPageIndex()"
|
|
56
|
+
[defaultPageSize]="defaultPageSize()"
|
|
57
|
+
[disabled]="disabled()"
|
|
58
|
+
[mode]="mode()"
|
|
59
|
+
[pageIndex]="pageIndex()"
|
|
60
|
+
[pageSize]="pageSize()"
|
|
61
|
+
[totalItems]="totalItems()"
|
|
62
|
+
(pageChange)="onPageChange($event)"
|
|
63
|
+
(pageIndexChange)="onPageIndexChange($event)"
|
|
64
|
+
(pageSizeChange)="onPageSizeChange($event)"
|
|
65
|
+
>
|
|
66
|
+
<button tngPaginationFirst data-testid="first">First</button>
|
|
67
|
+
<button tngPaginationPrevious data-testid="previous">Previous</button>
|
|
68
|
+
<button tngPaginationPage data-testid="page-1" [tngPaginationPage]="pageOne()">One</button>
|
|
69
|
+
<button tngPaginationPage data-testid="page-2" [tngPaginationPage]="pageTwo()">Two</button>
|
|
70
|
+
<button tngPaginationPage data-testid="page-outside" [tngPaginationPage]="outsidePage()">Outside</button>
|
|
71
|
+
<button tngPaginationNext data-testid="next">Next</button>
|
|
72
|
+
<button tngPaginationLast data-testid="last">Last</button>
|
|
73
|
+
<select tngPaginationPageSize data-testid="size">
|
|
74
|
+
<option value="5">5</option>
|
|
75
|
+
<option value="10">10</option>
|
|
76
|
+
<option value="20">20</option>
|
|
77
|
+
<option value="bad">Bad</option>
|
|
78
|
+
</select>
|
|
79
|
+
</nav>
|
|
80
|
+
`, isInline: true, dependencies: [{ kind: "directive", type: TngPagination, selector: "[tngPagination]", inputs: ["pageIndex", "defaultPageIndex", "pageSize", "defaultPageSize", "totalItems", "mode", "disabled", "ariaLabel"], outputs: ["pageIndexChange", "pageSizeChange", "pageChange"], exportAs: ["tngPagination"] }, { kind: "directive", type: TngPaginationFirst, selector: "button[tngPaginationFirst]", exportAs: ["tngPaginationFirst"] }, { kind: "directive", type: TngPaginationPrevious, selector: "button[tngPaginationPrevious]", exportAs: ["tngPaginationPrevious"] }, { kind: "directive", type: TngPaginationNext, selector: "button[tngPaginationNext]", exportAs: ["tngPaginationNext"] }, { kind: "directive", type: TngPaginationLast, selector: "button[tngPaginationLast]", exportAs: ["tngPaginationLast"] }, { kind: "directive", type: TngPaginationPage, selector: "button[tngPaginationPage]", inputs: ["tngPaginationPage"], exportAs: ["tngPaginationPage"] }, { kind: "directive", type: TngPaginationPageSize, selector: "select[tngPaginationPageSize]", exportAs: ["tngPaginationPageSize"] }] });
|
|
81
|
+
}
|
|
82
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: PaginationHarnessComponent, decorators: [{
|
|
83
|
+
type: Component,
|
|
84
|
+
args: [{
|
|
85
|
+
imports: [...paginationImports],
|
|
86
|
+
template: `
|
|
87
|
+
<nav
|
|
88
|
+
tngPagination
|
|
89
|
+
data-testid="pagination"
|
|
90
|
+
[ariaLabel]="ariaLabel()"
|
|
91
|
+
[defaultPageIndex]="defaultPageIndex()"
|
|
92
|
+
[defaultPageSize]="defaultPageSize()"
|
|
93
|
+
[disabled]="disabled()"
|
|
94
|
+
[mode]="mode()"
|
|
95
|
+
[pageIndex]="pageIndex()"
|
|
96
|
+
[pageSize]="pageSize()"
|
|
97
|
+
[totalItems]="totalItems()"
|
|
98
|
+
(pageChange)="onPageChange($event)"
|
|
99
|
+
(pageIndexChange)="onPageIndexChange($event)"
|
|
100
|
+
(pageSizeChange)="onPageSizeChange($event)"
|
|
101
|
+
>
|
|
102
|
+
<button tngPaginationFirst data-testid="first">First</button>
|
|
103
|
+
<button tngPaginationPrevious data-testid="previous">Previous</button>
|
|
104
|
+
<button tngPaginationPage data-testid="page-1" [tngPaginationPage]="pageOne()">One</button>
|
|
105
|
+
<button tngPaginationPage data-testid="page-2" [tngPaginationPage]="pageTwo()">Two</button>
|
|
106
|
+
<button tngPaginationPage data-testid="page-outside" [tngPaginationPage]="outsidePage()">Outside</button>
|
|
107
|
+
<button tngPaginationNext data-testid="next">Next</button>
|
|
108
|
+
<button tngPaginationLast data-testid="last">Last</button>
|
|
109
|
+
<select tngPaginationPageSize data-testid="size">
|
|
110
|
+
<option value="5">5</option>
|
|
111
|
+
<option value="10">10</option>
|
|
112
|
+
<option value="20">20</option>
|
|
113
|
+
<option value="bad">Bad</option>
|
|
114
|
+
</select>
|
|
115
|
+
</nav>
|
|
116
|
+
`,
|
|
117
|
+
}]
|
|
118
|
+
}] });
|
|
119
|
+
export class PaginationRootOnlyComponent {
|
|
120
|
+
ariaLabel = signal('Pages', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : []));
|
|
121
|
+
totalItems = signal(0, ...(ngDevMode ? [{ debugName: "totalItems" }] : []));
|
|
122
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: PaginationRootOnlyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
123
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.1", type: PaginationRootOnlyComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: `
|
|
124
|
+
<nav
|
|
125
|
+
tngPagination
|
|
126
|
+
data-testid="pagination"
|
|
127
|
+
[ariaLabel]="ariaLabel()"
|
|
128
|
+
[totalItems]="totalItems()"
|
|
129
|
+
></nav>
|
|
130
|
+
`, isInline: true, dependencies: [{ kind: "directive", type: TngPagination, selector: "[tngPagination]", inputs: ["pageIndex", "defaultPageIndex", "pageSize", "defaultPageSize", "totalItems", "mode", "disabled", "ariaLabel"], outputs: ["pageIndexChange", "pageSizeChange", "pageChange"], exportAs: ["tngPagination"] }] });
|
|
131
|
+
}
|
|
132
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: PaginationRootOnlyComponent, decorators: [{
|
|
133
|
+
type: Component,
|
|
134
|
+
args: [{
|
|
135
|
+
imports: [TngPagination],
|
|
136
|
+
template: `
|
|
137
|
+
<nav
|
|
138
|
+
tngPagination
|
|
139
|
+
data-testid="pagination"
|
|
140
|
+
[ariaLabel]="ariaLabel()"
|
|
141
|
+
[totalItems]="totalItems()"
|
|
142
|
+
></nav>
|
|
143
|
+
`,
|
|
144
|
+
}]
|
|
145
|
+
}] });
|
|
146
|
+
export class PaginationDivRootComponent {
|
|
147
|
+
totalItems = signal(0, ...(ngDevMode ? [{ debugName: "totalItems" }] : []));
|
|
148
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: PaginationDivRootComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
149
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.1", type: PaginationDivRootComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: `
|
|
150
|
+
<div tngPagination data-testid="pagination" [totalItems]="totalItems()"></div>
|
|
151
|
+
`, isInline: true, dependencies: [{ kind: "directive", type: TngPagination, selector: "[tngPagination]", inputs: ["pageIndex", "defaultPageIndex", "pageSize", "defaultPageSize", "totalItems", "mode", "disabled", "ariaLabel"], outputs: ["pageIndexChange", "pageSizeChange", "pageChange"], exportAs: ["tngPagination"] }] });
|
|
152
|
+
}
|
|
153
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: PaginationDivRootComponent, decorators: [{
|
|
154
|
+
type: Component,
|
|
155
|
+
args: [{
|
|
156
|
+
imports: [TngPagination],
|
|
157
|
+
template: `
|
|
158
|
+
<div tngPagination data-testid="pagination" [totalItems]="totalItems()"></div>
|
|
159
|
+
`,
|
|
160
|
+
}]
|
|
161
|
+
}] });
|
|
162
|
+
export function createPaginationFixture() {
|
|
163
|
+
const fixture = TestBed.configureTestingModule({
|
|
164
|
+
imports: [PaginationHarnessComponent],
|
|
165
|
+
}).createComponent(PaginationHarnessComponent);
|
|
166
|
+
fixture.detectChanges();
|
|
167
|
+
return fixture;
|
|
168
|
+
}
|
|
169
|
+
export function createFixture(component) {
|
|
170
|
+
const fixture = TestBed.configureTestingModule({
|
|
171
|
+
imports: [component],
|
|
172
|
+
}).createComponent(component);
|
|
173
|
+
fixture.detectChanges();
|
|
174
|
+
return fixture;
|
|
175
|
+
}
|
|
176
|
+
export function getByTestId(fixture, testId) {
|
|
177
|
+
const host = fixture.nativeElement;
|
|
178
|
+
const element = host.querySelector(`[data-testid="${testId}"]`);
|
|
179
|
+
if (element === null) {
|
|
180
|
+
throw new Error(`Expected element for data-testid="${testId}".`);
|
|
181
|
+
}
|
|
182
|
+
return element;
|
|
183
|
+
}
|
|
184
|
+
export function click(element) {
|
|
185
|
+
element.dispatchEvent(new MouseEvent('click', {
|
|
186
|
+
bubbles: true,
|
|
187
|
+
cancelable: true,
|
|
188
|
+
}));
|
|
189
|
+
}
|
|
190
|
+
export function changeSelectValue(select, value) {
|
|
191
|
+
select.value = value;
|
|
192
|
+
select.dispatchEvent(new Event('change', { bubbles: true }));
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=tng-pagination.test-harness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tng-pagination.test-harness.js","sourceRoot":"","sources":["../../../../../../../../../libs/tailng-ui/primitives/src/lib/navigation/pagination/__tests__/tng-pagination.test-harness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEhD,OAAO,EACL,aAAa,EAEb,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;;AAE3B,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,aAAa;IACb,kBAAkB;IAClB,qBAAqB;IACrB,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,qBAAqB;CACb,CAAC;AAoCX,MAAM,OAAO,0BAA0B;IACrB,SAAS,GAAG,MAAM,CAAgB,eAAe,qDAAC,CAAC;IACnD,gBAAgB,GAAG,MAAM,CAAC,CAAC,4DAAC,CAAC;IAC7B,eAAe,GAAG,MAAM,CAAC,EAAE,2DAAC,CAAC;IAC7B,QAAQ,GAAG,MAAM,CAAC,KAAK,oDAAC,CAAC;IACzB,IAAI,GAAG,MAAM,CAAsB,QAAQ,gDAAC,CAAC;IAC7C,SAAS,GAAG,MAAM,CAAqB,SAAS,qDAAC,CAAC;IAClD,QAAQ,GAAG,MAAM,CAAqB,SAAS,oDAAC,CAAC;IACjD,UAAU,GAAG,MAAM,CAAC,EAAE,sDAAC,CAAC;IACxB,OAAO,GAAG,MAAM,CAAC,CAAC,mDAAC,CAAC;IACpB,OAAO,GAAG,MAAM,CAAC,CAAC,mDAAC,CAAC;IACpB,WAAW,GAAG,MAAM,CAAC,EAAE,uDAAC,CAAC;IAEzB,MAAM,GAAa,EAAE,CAAC;IACtB,WAAW,GAA+B,EAAE,CAAC;IAC7C,gBAAgB,GAAa,EAAE,CAAC;IAChC,eAAe,GAAa,EAAE,CAAC;IACxC,QAAQ,GAAG,KAAK,CAAC;IAEjB,YAAY,CAAC,KAA+B;QACjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrF,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAEM,iBAAiB,CAAC,SAAiB;QACxC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,SAAS,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAEM,gBAAgB,CAAC,QAAgB;QACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,QAAQ,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;uGAtCU,0BAA0B;2FAA1B,0BAA0B,wEAhC3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BT,4DAzCD,aAAa,gRACb,kBAAkB,yGAClB,qBAAqB,+GACrB,iBAAiB,uGACjB,iBAAiB,uGACjB,iBAAiB,sIACjB,qBAAqB;;2FAqCV,0BAA0B;kBAlCtC,SAAS;mBAAC;oBACT,OAAO,EAAE,CAAC,GAAG,iBAAiB,CAAC;oBAC/B,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BT;iBACF;;AAqDD,MAAM,OAAO,2BAA2B;IACtB,SAAS,GAAG,MAAM,CAAgB,OAAO,qDAAC,CAAC;IAC3C,UAAU,GAAG,MAAM,CAAC,CAAC,sDAAC,CAAC;uGAF5B,2BAA2B;2FAA3B,2BAA2B,wEAT5B;;;;;;;GAOT,4DARS,aAAa;;2FAUZ,2BAA2B;kBAXvC,SAAS;mBAAC;oBACT,OAAO,EAAE,CAAC,aAAa,CAAC;oBACxB,QAAQ,EAAE;;;;;;;GAOT;iBACF;;AAYD,MAAM,OAAO,0BAA0B;IACrB,UAAU,GAAG,MAAM,CAAC,CAAC,sDAAC,CAAC;uGAD5B,0BAA0B;2FAA1B,0BAA0B,wEAJ3B;;GAET,4DAHS,aAAa;;2FAKZ,0BAA0B;kBANtC,SAAS;mBAAC;oBACT,OAAO,EAAE,CAAC,aAAa,CAAC;oBACxB,QAAQ,EAAE;;GAET;iBACF;;AAKD,MAAM,UAAU,uBAAuB;IACrC,MAAM,OAAO,GAAG,OAAO,CAAC,sBAAsB,CAAC;QAC7C,OAAO,EAAE,CAAC,0BAA0B,CAAC;KACtC,CAAC,CAAC,eAAe,CAAC,0BAA0B,CAAC,CAAC;IAE/C,OAAO,CAAC,aAAa,EAAE,CAAC;IACxB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,aAAa,CAAa,SAA+B;IACvE,MAAM,OAAO,GAAG,OAAO,CAAC,sBAAsB,CAAC;QAC7C,OAAO,EAAE,CAAC,SAAS,CAAC;KACrB,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IAE9B,OAAO,CAAC,aAAa,EAAE,CAAC;IACxB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,OAAkC,EAClC,MAAc;IAEd,MAAM,IAAI,GAAG,OAAO,CAAC,aAA4B,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,iBAAiB,MAAM,IAAI,CAAC,CAAC;IAChE,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,qCAAqC,MAAM,IAAI,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,OAAmB,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,OAAoB;IACxC,OAAO,CAAC,aAAa,CACnB,IAAI,UAAU,CAAC,OAAO,EAAE;QACtB,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,IAAI;KACjB,CAAC,CACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAyB,EAAE,KAAa;IACxE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,MAAM,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC/D,CAAC","sourcesContent":["import { Component, signal } from '@angular/core';\nimport type { ComponentFixture } from '@angular/core/testing';\nimport { TestBed } from '@angular/core/testing';\n\nimport {\n TngPagination,\n type TngPaginationChangeEvent,\n TngPaginationFirst,\n TngPaginationLast,\n TngPaginationNext,\n TngPaginationPage,\n TngPaginationPageSize,\n TngPaginationPrevious,\n} from '../tng-pagination';\n\nexport const paginationImports = [\n TngPagination,\n TngPaginationFirst,\n TngPaginationPrevious,\n TngPaginationNext,\n TngPaginationLast,\n TngPaginationPage,\n TngPaginationPageSize,\n] as const;\n\n@Component({\n imports: [...paginationImports],\n template: `\n <nav\n tngPagination\n data-testid=\"pagination\"\n [ariaLabel]=\"ariaLabel()\"\n [defaultPageIndex]=\"defaultPageIndex()\"\n [defaultPageSize]=\"defaultPageSize()\"\n [disabled]=\"disabled()\"\n [mode]=\"mode()\"\n [pageIndex]=\"pageIndex()\"\n [pageSize]=\"pageSize()\"\n [totalItems]=\"totalItems()\"\n (pageChange)=\"onPageChange($event)\"\n (pageIndexChange)=\"onPageIndexChange($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\"\n >\n <button tngPaginationFirst data-testid=\"first\">First</button>\n <button tngPaginationPrevious data-testid=\"previous\">Previous</button>\n <button tngPaginationPage data-testid=\"page-1\" [tngPaginationPage]=\"pageOne()\">One</button>\n <button tngPaginationPage data-testid=\"page-2\" [tngPaginationPage]=\"pageTwo()\">Two</button>\n <button tngPaginationPage data-testid=\"page-outside\" [tngPaginationPage]=\"outsidePage()\">Outside</button>\n <button tngPaginationNext data-testid=\"next\">Next</button>\n <button tngPaginationLast data-testid=\"last\">Last</button>\n <select tngPaginationPageSize data-testid=\"size\">\n <option value=\"5\">5</option>\n <option value=\"10\">10</option>\n <option value=\"20\">20</option>\n <option value=\"bad\">Bad</option>\n </select>\n </nav>\n `,\n})\nexport class PaginationHarnessComponent {\n public readonly ariaLabel = signal<string | null>('Results pages');\n public readonly defaultPageIndex = signal(0);\n public readonly defaultPageSize = signal(10);\n public readonly disabled = signal(false);\n public readonly mode = signal<'client' | 'server'>('client');\n public readonly pageIndex = signal<number | undefined>(undefined);\n public readonly pageSize = signal<number | undefined>(undefined);\n public readonly totalItems = signal(25);\n public readonly pageOne = signal(0);\n public readonly pageTwo = signal(1);\n public readonly outsidePage = signal(99);\n\n public readonly events: string[] = [];\n public readonly pageChanges: TngPaginationChangeEvent[] = [];\n public readonly pageIndexChanges: number[] = [];\n public readonly pageSizeChanges: number[] = [];\n public autoSync = false;\n\n public onPageChange(event: TngPaginationChangeEvent): void {\n this.events.push(`pageChange:${event.trigger}:${event.pageIndex}:${event.pageSize}`);\n this.pageChanges.push(event);\n }\n\n public onPageIndexChange(pageIndex: number): void {\n this.events.push(`pageIndexChange:${pageIndex}`);\n this.pageIndexChanges.push(pageIndex);\n if (this.autoSync) {\n this.pageIndex.set(pageIndex);\n }\n }\n\n public onPageSizeChange(pageSize: number): void {\n this.events.push(`pageSizeChange:${pageSize}`);\n this.pageSizeChanges.push(pageSize);\n if (this.autoSync) {\n this.pageSize.set(pageSize);\n }\n }\n}\n\n@Component({\n imports: [TngPagination],\n template: `\n <nav\n tngPagination\n data-testid=\"pagination\"\n [ariaLabel]=\"ariaLabel()\"\n [totalItems]=\"totalItems()\"\n ></nav>\n `,\n})\nexport class PaginationRootOnlyComponent {\n public readonly ariaLabel = signal<string | null>('Pages');\n public readonly totalItems = signal(0);\n}\n\n@Component({\n imports: [TngPagination],\n template: `\n <div tngPagination data-testid=\"pagination\" [totalItems]=\"totalItems()\"></div>\n `,\n})\nexport class PaginationDivRootComponent {\n public readonly totalItems = signal(0);\n}\n\nexport function createPaginationFixture(): ComponentFixture<PaginationHarnessComponent> {\n const fixture = TestBed.configureTestingModule({\n imports: [PaginationHarnessComponent],\n }).createComponent(PaginationHarnessComponent);\n\n fixture.detectChanges();\n return fixture;\n}\n\nexport function createFixture<TComponent>(component: new () => TComponent): ComponentFixture<TComponent> {\n const fixture = TestBed.configureTestingModule({\n imports: [component],\n }).createComponent(component);\n\n fixture.detectChanges();\n return fixture;\n}\n\nexport function getByTestId<TElement extends Element>(\n fixture: ComponentFixture<unknown>,\n testId: string,\n): TElement {\n const host = fixture.nativeElement as HTMLElement;\n const element = host.querySelector(`[data-testid=\"${testId}\"]`);\n if (element === null) {\n throw new Error(`Expected element for data-testid=\"${testId}\".`);\n }\n\n return element as TElement;\n}\n\nexport function click(element: HTMLElement): void {\n element.dispatchEvent(\n new MouseEvent('click', {\n bubbles: true,\n cancelable: true,\n }),\n );\n}\n\nexport function changeSelectValue(select: HTMLSelectElement, value: string): void {\n select.value = value;\n select.dispatchEvent(new Event('change', { bubbles: true }));\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/navigation/pagination/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/navigation/pagination/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC","sourcesContent":["export * from './tng-pagination';\n"]}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { type TngTablePaginationMode } from '@tailng-ui/cdk';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export type TngPaginationMode = TngTablePaginationMode;
|
|
4
|
+
export type TngPaginationTrigger = 'first' | 'last' | 'next' | 'page' | 'previous' | 'programmatic' | 'size';
|
|
5
|
+
export type TngPaginationChangeEvent = Readonly<{
|
|
6
|
+
mode: TngPaginationMode;
|
|
7
|
+
pageCount: number;
|
|
8
|
+
pageIndex: number;
|
|
9
|
+
pageSize: number;
|
|
10
|
+
previousPageIndex: number;
|
|
11
|
+
previousPageSize: number;
|
|
12
|
+
totalItems: number;
|
|
13
|
+
trigger: TngPaginationTrigger;
|
|
14
|
+
}>;
|
|
15
|
+
export declare class TngPagination {
|
|
16
|
+
private readonly uncontrolledPageIndex;
|
|
17
|
+
private readonly uncontrolledPageSize;
|
|
18
|
+
private readonly hasUncontrolledPageIndex;
|
|
19
|
+
private readonly hasUncontrolledPageSize;
|
|
20
|
+
readonly pageIndex: import("@angular/core").InputSignalWithTransform<number | undefined, unknown>;
|
|
21
|
+
readonly defaultPageIndex: import("@angular/core").InputSignalWithTransform<number, unknown>;
|
|
22
|
+
readonly pageSize: import("@angular/core").InputSignalWithTransform<number | undefined, unknown>;
|
|
23
|
+
readonly defaultPageSize: import("@angular/core").InputSignalWithTransform<number, unknown>;
|
|
24
|
+
readonly totalItems: import("@angular/core").InputSignalWithTransform<number, unknown>;
|
|
25
|
+
readonly mode: import("@angular/core").InputSignalWithTransform<TngTablePaginationMode, unknown>;
|
|
26
|
+
readonly disabled: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
|
|
27
|
+
readonly ariaLabel: import("@angular/core").InputSignalWithTransform<string | null, unknown>;
|
|
28
|
+
readonly pageIndexChange: import("@angular/core").OutputEmitterRef<number>;
|
|
29
|
+
readonly pageSizeChange: import("@angular/core").OutputEmitterRef<number>;
|
|
30
|
+
readonly pageChange: import("@angular/core").OutputEmitterRef<Readonly<{
|
|
31
|
+
mode: TngPaginationMode;
|
|
32
|
+
pageCount: number;
|
|
33
|
+
pageIndex: number;
|
|
34
|
+
pageSize: number;
|
|
35
|
+
previousPageIndex: number;
|
|
36
|
+
previousPageSize: number;
|
|
37
|
+
totalItems: number;
|
|
38
|
+
trigger: TngPaginationTrigger;
|
|
39
|
+
}>>;
|
|
40
|
+
readonly state: import("@angular/core").Signal<Readonly<{
|
|
41
|
+
pageIndex: number;
|
|
42
|
+
pageSize: number;
|
|
43
|
+
}>>;
|
|
44
|
+
readonly pageCount: import("@angular/core").Signal<number>;
|
|
45
|
+
readonly isFirstPage: import("@angular/core").Signal<boolean>;
|
|
46
|
+
readonly isLastPage: import("@angular/core").Signal<boolean>;
|
|
47
|
+
protected get ariaLabelAttr(): string | null;
|
|
48
|
+
protected get dataDisabledAttr(): '' | null;
|
|
49
|
+
protected get dataModeAttr(): TngPaginationMode;
|
|
50
|
+
protected get dataPageCountAttr(): number;
|
|
51
|
+
protected get dataPageIndexAttr(): number;
|
|
52
|
+
protected get dataPageSizeAttr(): number;
|
|
53
|
+
protected readonly dataSlot: "pagination";
|
|
54
|
+
firstPage(): void;
|
|
55
|
+
previousPage(): void;
|
|
56
|
+
nextPage(): void;
|
|
57
|
+
lastPage(): void;
|
|
58
|
+
setPageIndex(pageIndex: number, trigger?: TngPaginationTrigger): void;
|
|
59
|
+
setPageSize(pageSize: number, trigger?: TngPaginationTrigger): void;
|
|
60
|
+
canGoToPreviousPage(): boolean;
|
|
61
|
+
canGoToNextPage(): boolean;
|
|
62
|
+
canGoToPage(pageIndex: number): boolean;
|
|
63
|
+
private rawPageIndex;
|
|
64
|
+
private createController;
|
|
65
|
+
private rawPageSize;
|
|
66
|
+
private commit;
|
|
67
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TngPagination, never>;
|
|
68
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<TngPagination, "[tngPagination]", ["tngPagination"], { "pageIndex": { "alias": "pageIndex"; "required": false; "isSignal": true; }; "defaultPageIndex": { "alias": "defaultPageIndex"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "defaultPageSize": { "alias": "defaultPageSize"; "required": false; "isSignal": true; }; "totalItems": { "alias": "totalItems"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "pageIndexChange": "pageIndexChange"; "pageSizeChange": "pageSizeChange"; "pageChange": "pageChange"; }, never, never, true, never>;
|
|
69
|
+
}
|
|
70
|
+
declare abstract class TngPaginationButton {
|
|
71
|
+
protected readonly pagination: TngPagination;
|
|
72
|
+
readonly disabled: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
|
|
73
|
+
protected get ariaDisabledAttr(): 'true' | null;
|
|
74
|
+
protected get dataDisabledAttr(): '' | null;
|
|
75
|
+
protected get disabledAttr(): '' | null;
|
|
76
|
+
protected readonly typeAttr: "button";
|
|
77
|
+
protected isDisabled(): boolean;
|
|
78
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TngPaginationButton, never>;
|
|
79
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<TngPaginationButton, never, never, { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
80
|
+
}
|
|
81
|
+
export declare class TngPaginationFirst extends TngPaginationButton {
|
|
82
|
+
protected readonly dataSlot: "pagination-first";
|
|
83
|
+
protected isDisabled(): boolean;
|
|
84
|
+
protected onClick(): void;
|
|
85
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TngPaginationFirst, never>;
|
|
86
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<TngPaginationFirst, "button[tngPaginationFirst]", ["tngPaginationFirst"], {}, {}, never, never, true, never>;
|
|
87
|
+
}
|
|
88
|
+
export declare class TngPaginationPrevious extends TngPaginationButton {
|
|
89
|
+
protected readonly dataSlot: "pagination-previous";
|
|
90
|
+
protected isDisabled(): boolean;
|
|
91
|
+
protected onClick(): void;
|
|
92
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TngPaginationPrevious, never>;
|
|
93
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<TngPaginationPrevious, "button[tngPaginationPrevious]", ["tngPaginationPrevious"], {}, {}, never, never, true, never>;
|
|
94
|
+
}
|
|
95
|
+
export declare class TngPaginationNext extends TngPaginationButton {
|
|
96
|
+
protected readonly dataSlot: "pagination-next";
|
|
97
|
+
protected isDisabled(): boolean;
|
|
98
|
+
protected onClick(): void;
|
|
99
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TngPaginationNext, never>;
|
|
100
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<TngPaginationNext, "button[tngPaginationNext]", ["tngPaginationNext"], {}, {}, never, never, true, never>;
|
|
101
|
+
}
|
|
102
|
+
export declare class TngPaginationLast extends TngPaginationButton {
|
|
103
|
+
protected readonly dataSlot: "pagination-last";
|
|
104
|
+
protected isDisabled(): boolean;
|
|
105
|
+
protected onClick(): void;
|
|
106
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TngPaginationLast, never>;
|
|
107
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<TngPaginationLast, "button[tngPaginationLast]", ["tngPaginationLast"], {}, {}, never, never, true, never>;
|
|
108
|
+
}
|
|
109
|
+
export declare class TngPaginationPage extends TngPaginationButton {
|
|
110
|
+
readonly page: import("@angular/core").InputSignalWithTransform<number, unknown>;
|
|
111
|
+
protected get ariaCurrentAttr(): 'page' | null;
|
|
112
|
+
protected get dataCurrentAttr(): '' | null;
|
|
113
|
+
protected readonly dataSlot: "pagination-page";
|
|
114
|
+
protected onClick(): void;
|
|
115
|
+
private isCurrentPage;
|
|
116
|
+
protected isDisabled(): boolean;
|
|
117
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TngPaginationPage, never>;
|
|
118
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<TngPaginationPage, "button[tngPaginationPage]", ["tngPaginationPage"], { "page": { "alias": "tngPaginationPage"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
119
|
+
}
|
|
120
|
+
export declare class TngPaginationPageSize {
|
|
121
|
+
private readonly pagination;
|
|
122
|
+
private readonly hostRef;
|
|
123
|
+
protected readonly dataSlot: "pagination-page-size";
|
|
124
|
+
protected get disabledProp(): boolean;
|
|
125
|
+
protected get valueProp(): string;
|
|
126
|
+
protected onChange(): void;
|
|
127
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TngPaginationPageSize, never>;
|
|
128
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<TngPaginationPageSize, "select[tngPaginationPageSize]", ["tngPaginationPageSize"], {}, {}, never, never, true, never>;
|
|
129
|
+
}
|
|
130
|
+
export {};
|
|
131
|
+
//# sourceMappingURL=tng-pagination.d.ts.map
|