@ngbase/adk 0.1.19 → 0.1.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/fesm2022/ngbase-adk-a11y.mjs +15 -15
  2. package/fesm2022/ngbase-adk-accordion.mjs +12 -12
  3. package/fesm2022/ngbase-adk-autocomplete.mjs +6 -6
  4. package/fesm2022/ngbase-adk-avatar.mjs +6 -6
  5. package/fesm2022/ngbase-adk-bidi.mjs +3 -3
  6. package/fesm2022/ngbase-adk-breadcrumb.mjs +12 -12
  7. package/fesm2022/ngbase-adk-cache.mjs +3 -3
  8. package/fesm2022/ngbase-adk-carousel.mjs +15 -15
  9. package/fesm2022/ngbase-adk-checkbox.mjs +6 -6
  10. package/fesm2022/ngbase-adk-chip.mjs +9 -9
  11. package/fesm2022/ngbase-adk-clipboard.mjs +3 -3
  12. package/fesm2022/ngbase-adk-color-picker.mjs +30 -30
  13. package/fesm2022/ngbase-adk-cookies.mjs +3 -3
  14. package/fesm2022/ngbase-adk-datepicker.mjs +36 -36
  15. package/fesm2022/ngbase-adk-dialog.mjs +12 -12
  16. package/fesm2022/ngbase-adk-drag.mjs +12 -12
  17. package/fesm2022/ngbase-adk-form-field.mjs +20 -20
  18. package/fesm2022/ngbase-adk-form-field.mjs.map +1 -1
  19. package/fesm2022/ngbase-adk-hover-card.mjs +3 -3
  20. package/fesm2022/ngbase-adk-icon.mjs +6 -6
  21. package/fesm2022/ngbase-adk-inline-edit.mjs +9 -9
  22. package/fesm2022/ngbase-adk-jwt.mjs +6 -6
  23. package/fesm2022/ngbase-adk-keys.mjs +6 -6
  24. package/fesm2022/ngbase-adk-list.mjs +6 -6
  25. package/fesm2022/ngbase-adk-mask.mjs +6 -6
  26. package/fesm2022/ngbase-adk-menu.mjs +24 -24
  27. package/fesm2022/ngbase-adk-network.mjs +3 -3
  28. package/fesm2022/ngbase-adk-otp.mjs +9 -9
  29. package/fesm2022/ngbase-adk-pagination.mjs +6 -6
  30. package/fesm2022/ngbase-adk-popover.mjs +21 -21
  31. package/fesm2022/ngbase-adk-portal.mjs +12 -12
  32. package/fesm2022/ngbase-adk-portal.mjs.map +1 -1
  33. package/fesm2022/ngbase-adk-progress.mjs +6 -6
  34. package/fesm2022/ngbase-adk-radio.mjs +9 -9
  35. package/fesm2022/ngbase-adk-resizable.mjs +39 -131
  36. package/fesm2022/ngbase-adk-resizable.mjs.map +1 -1
  37. package/fesm2022/ngbase-adk-scroll-area.mjs +6 -6
  38. package/fesm2022/ngbase-adk-select.mjs +245 -102
  39. package/fesm2022/ngbase-adk-select.mjs.map +1 -1
  40. package/fesm2022/ngbase-adk-selectable.mjs +6 -6
  41. package/fesm2022/ngbase-adk-sheet.mjs +3 -3
  42. package/fesm2022/ngbase-adk-sidenav.mjs +18 -18
  43. package/fesm2022/ngbase-adk-slider.mjs +12 -12
  44. package/fesm2022/ngbase-adk-sonner.mjs +9 -9
  45. package/fesm2022/ngbase-adk-stepper.mjs +12 -12
  46. package/fesm2022/ngbase-adk-switch.mjs +12 -12
  47. package/fesm2022/ngbase-adk-table.mjs +39 -39
  48. package/fesm2022/ngbase-adk-tabs.mjs +21 -21
  49. package/fesm2022/ngbase-adk-toggle-group.mjs +6 -6
  50. package/fesm2022/ngbase-adk-toggle.mjs +3 -3
  51. package/fesm2022/ngbase-adk-tooltip.mjs +9 -9
  52. package/fesm2022/ngbase-adk-tour.mjs +12 -12
  53. package/fesm2022/ngbase-adk-translate.mjs +6 -6
  54. package/fesm2022/ngbase-adk-tree.mjs +15 -15
  55. package/fesm2022/ngbase-adk-utils.mjs +14 -10
  56. package/fesm2022/ngbase-adk-utils.mjs.map +1 -1
  57. package/fesm2022/ngbase-adk-virtualizer.mjs +11 -8
  58. package/fesm2022/ngbase-adk-virtualizer.mjs.map +1 -1
  59. package/package.json +1 -1
  60. package/schematics/components/files/pagination/pagination.ts.template +2 -2
  61. package/schematics/components/files/select/select.ts.template +92 -15
  62. package/schematics/components/files/sidenav/sidenav.ts.template +16 -8
  63. package/schematics/components/files/switch/switch.ts.template +1 -1
  64. package/types/ngbase-adk-color-picker.d.ts +1 -1
  65. package/types/ngbase-adk-form-field.d.ts +1 -1
  66. package/types/ngbase-adk-portal.d.ts +2 -3
  67. package/types/ngbase-adk-resizable.d.ts +3 -3
  68. package/types/ngbase-adk-scroll-area.d.ts +1 -1
  69. package/types/ngbase-adk-select.d.ts +27 -6
  70. package/types/ngbase-adk-virtualizer.d.ts +3 -2
@@ -6,10 +6,10 @@ class RangePipe {
6
6
  transform(value) {
7
7
  return Array.from({ length: value }, (v, k) => k + 1);
8
8
  }
9
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: RangePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
10
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.1.0", ngImport: i0, type: RangePipe, isStandalone: true, name: "range" }); }
9
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: RangePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
10
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.1.2", ngImport: i0, type: RangePipe, isStandalone: true, name: "range" }); }
11
11
  }
12
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: RangePipe, decorators: [{
12
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: RangePipe, decorators: [{
13
13
  type: Pipe,
14
14
  args: [{
15
15
  name: 'range',
@@ -123,13 +123,17 @@ class DisableAnimation {
123
123
  constructor() {
124
124
  this.animationDisabled = signal(true, ...(ngDevMode ? [{ debugName: "animationDisabled" }] : []));
125
125
  afterNextRender(() => {
126
- this.animationDisabled.set(false);
126
+ // Use requestAnimationFrame to ensure the DOM has settled
127
+ // before enabling animations, preventing initial render animations
128
+ requestAnimationFrame(() => {
129
+ this.animationDisabled.set(false);
130
+ });
127
131
  });
128
132
  }
129
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: DisableAnimation, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
130
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.1.0", type: DisableAnimation, isStandalone: true, selector: "[disableAnimation]", host: { properties: { "class.no-animation": "animationDisabled()" } }, ngImport: i0 }); }
133
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: DisableAnimation, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
134
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.1.2", type: DisableAnimation, isStandalone: true, selector: "[disableAnimation]", host: { properties: { "class.no-animation": "animationDisabled()" } }, ngImport: i0 }); }
131
135
  }
132
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: DisableAnimation, decorators: [{
136
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: DisableAnimation, decorators: [{
133
137
  type: Directive,
134
138
  args: [{
135
139
  selector: '[disableAnimation]',
@@ -216,10 +220,10 @@ class NumberOnly {
216
220
  }
217
221
  return true;
218
222
  }
219
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NumberOnly, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
220
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.1.0", type: NumberOnly, isStandalone: true, selector: "input[ngbNumberOnly]", inputs: { min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, len: { classPropertyName: "len", publicName: "len", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { listeners: { "input": "setValue($event)" }, properties: { "value": "value()" } }, ngImport: i0 }); }
223
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: NumberOnly, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
224
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.1.2", type: NumberOnly, isStandalone: true, selector: "input[ngbNumberOnly]", inputs: { min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, len: { classPropertyName: "len", publicName: "len", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { listeners: { "input": "setValue($event)" }, properties: { "value": "value()" } }, ngImport: i0 }); }
221
225
  }
222
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NumberOnly, decorators: [{
226
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: NumberOnly, decorators: [{
223
227
  type: Directive,
224
228
  args: [{
225
229
  selector: 'input[ngbNumberOnly]',
@@ -1 +1 @@
1
- {"version":3,"file":"ngbase-adk-utils.mjs","sources":["../../../projects/adk/utils/range.pipe.ts","../../../projects/adk/utils/disposals.ts","../../../projects/adk/utils/utils.ts","../../../projects/adk/utils/ssr.ts","../../../projects/adk/utils/animation.ts","../../../projects/adk/utils/number-only.ts","../../../projects/adk/utils/ngbase-adk-utils.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'range',\n})\nexport class RangePipe implements PipeTransform {\n transform(value: number) {\n return Array.from({ length: value }, (v, k) => k + 1);\n }\n}\n","import { afterNextRender, DestroyRef, inject, Injector } from '@angular/core';\n\ntype Cleanup = () => void;\ntype CleanupRegisterFn = (fn: Cleanup) => void;\n\nexport function disposals() {\n const injector = inject(Injector);\n const destroyRef = inject(DestroyRef);\n return {\n afterNextRender: (fn: (cleanup: CleanupRegisterFn) => void) => {\n const cleanup: Cleanup[] = [];\n const register = (fn: Cleanup) => cleanup.push(fn);\n const runCleanup = () => cleanup.forEach(c => c());\n afterNextRender(\n () => {\n runCleanup();\n fn(register);\n },\n { injector },\n );\n return destroyRef.onDestroy(() => runCleanup());\n },\n };\n}\n\nexport function cleanup(fn: () => void) {\n inject(DestroyRef).onDestroy(fn);\n}\n","import {\n computed,\n inject,\n Injector,\n isSignal,\n linkedSignal,\n runInInjectionContext,\n Signal,\n signal,\n DOCUMENT,\n} from '@angular/core';\nimport { cleanup } from './disposals';\n\nexport function uniqueId(length: number = 7) {\n return Array.from({ length }, () =>\n String.fromCharCode(97 + Math.floor(Math.random() * 26)),\n ).join('');\n}\n\nexport interface ListenerOut {\n on: () => void;\n off: () => void;\n}\n\nexport function documentListener<T extends Event>(\n ev: string,\n fn: (e: T) => void,\n data: Partial<\n AddEventListenerOptions & {\n injector?: Injector;\n lazy?: boolean;\n skip?: number;\n element?: HTMLElement | Document | Window;\n }\n > = {},\n): ListenerOut {\n const { injector = inject(Injector), lazy = false, element, skip = 0, ...listenerOptions } = data;\n let active = false;\n const controller: ListenerOut = { on: () => {}, off: () => {} };\n\n controller.on = () => {\n if (active) return;\n active = true;\n runInInjectionContext(injector, () => {\n const el = element || inject(DOCUMENT);\n let eventCount = 0;\n el.addEventListener(\n ev,\n e => {\n eventCount++;\n if (eventCount <= skip) return;\n fn(e as T);\n },\n listenerOptions,\n );\n\n controller.off = () => {\n active = false;\n eventCount = 0;\n el.removeEventListener(ev, fn as any);\n };\n cleanup(controller.off);\n });\n };\n\n if (!lazy) controller.on();\n return controller;\n}\n\nexport type FilterOptions<T, V = any> = {\n filter: (v: V) => string;\n query?: (v: V, search: string) => boolean;\n key?: keyof T;\n childrenFilter?: (v: T) => V[];\n};\n\nexport function filterFunction<T, V = T>(\n data: Signal<T[]> | T[],\n ops: Signal<FilterOptions<T, V>>,\n) {\n const search = signal('');\n const list = linkedSignal(isSignal(data) ? data : signal(data || []));\n\n const filteredList = computed(() => {\n const options = ops();\n const text = search()?.trim().toLowerCase() || '';\n const lists = list() || [];\n const filter = options.filter ?? ((v: V) => v);\n\n const query = options.query ?? ((v: V, t: string) => filter(v)?.toLowerCase?.().includes(t));\n const vvv = lists.reduce((acc, item) => {\n // Get children from key or childrenFilter\n const children = options.key ? (item[options.key] as V[]) : options.childrenFilter?.(item);\n if (children) {\n const filteredChildren = children?.filter(child => query(child as V, text));\n if (filteredChildren?.length) {\n acc.push({\n ...item,\n [options.key || 'children']: filteredChildren,\n });\n }\n } else if (query(item as unknown as V, text)) {\n acc.push(item);\n }\n return acc;\n }, [] as T[]);\n return vvv;\n });\n return { search, list, filteredList };\n}\n","import { isPlatformBrowser, isPlatformServer } from '@angular/common';\nimport { inject, PLATFORM_ID } from '@angular/core';\n\nexport function isServer() {\n return isPlatformServer(inject(PLATFORM_ID));\n}\n\nexport function isClient() {\n return isPlatformBrowser(inject(PLATFORM_ID));\n}\n","import { afterNextRender, Directive, signal } from '@angular/core';\n\n/**\n * Directive that disables CSS animations on initial render.\n * Adds `no-animation` class initially and removes it after first render.\n * This prevents animations from playing when the component first appears.\n *\n * Requires the following CSS to be defined globally:\n * ```css\n * .no-animation {\n * animation: none !important;\n * transition: none !important;\n * }\n * ```\n */\n@Directive({\n selector: '[disableAnimation]',\n host: {\n '[class.no-animation]': 'animationDisabled()',\n },\n})\nexport class DisableAnimation {\n readonly animationDisabled = signal(true);\n constructor() {\n afterNextRender(() => {\n this.animationDisabled.set(false);\n });\n }\n}\n","import { Directive, effect, ElementRef, inject, input, linkedSignal, model } from '@angular/core';\n\n@Directive({\n selector: 'input[ngbNumberOnly]',\n host: {\n '(input)': 'setValue($event)',\n '[value]': 'value()',\n },\n})\nexport class NumberOnly {\n readonly el = inject<ElementRef<HTMLInputElement>>(ElementRef);\n\n readonly min = input<number | undefined>();\n readonly max = input<number | undefined>();\n readonly len = input<number | undefined>();\n\n readonly value = model<string>('');\n\n // Hacky way to set the min value\n readonly _min = linkedSignal(this.min);\n readonly _max = linkedSignal(this.max);\n readonly _len = linkedSignal(this.len);\n\n constructor() {\n effect(cleanup => {\n const el = this.el.nativeElement;\n el.addEventListener('keydown', this.onKeyDown);\n cleanup(() => el.removeEventListener('keydown', this.onKeyDown));\n });\n }\n\n setValue(ev: Event) {\n const value = (ev.target as HTMLInputElement)?.value;\n this.value.set(value);\n }\n\n private readonly allowedKeys = new Set([\n 'Backspace',\n 'Delete',\n 'Tab',\n 'Escape',\n 'Enter',\n 'Home',\n 'End',\n 'ArrowLeft',\n 'ArrowRight',\n ]);\n\n onKeyDown = (e: KeyboardEvent) => {\n if (this.allowedKeys.has(e.key) || this.isCtrlKey(e)) return;\n if (e.key === 'v' && (e.ctrlKey || e.metaKey)) return e.preventDefault();\n\n if (['ArrowUp', 'ArrowDown'].includes(e.key)) {\n return this.handleArrowUpDown(e);\n }\n\n if (!/^\\d$/.test(e.key) || !this.validateValue(this.getNewValue(e))) {\n e.preventDefault();\n }\n };\n\n private isCtrlKey(e: KeyboardEvent): boolean {\n return ['a', 'c', 'x'].includes(e.key) && (e.ctrlKey || e.metaKey);\n }\n\n private handleArrowUpDown(e: KeyboardEvent) {\n e.preventDefault();\n const currentValue = this.el.nativeElement.value;\n const newValue = +currentValue + (e.key === 'ArrowUp' ? 1 : -1);\n if (this.validateValue(newValue.toString())) {\n this.value.set(newValue.toString().padStart(2, '0'));\n }\n }\n\n private getNewValue(e: KeyboardEvent): string {\n const { value, selectionStart, selectionEnd } = this.el.nativeElement;\n const start = selectionStart ?? value.length;\n const end = selectionEnd ?? value.length;\n return value.slice(0, start) + e.key + value.slice(end);\n }\n\n private validateValue(rawValue: string): boolean {\n const len = this._len();\n const value = +rawValue;\n const min = this._min();\n const max = this._max();\n\n if (len !== undefined && rawValue.length > len) return false;\n if (max !== undefined && value > max) return false;\n\n if (min !== undefined && value < min) {\n const potentialMax = Number(rawValue + '9'.repeat(len ? len - rawValue.length : 1));\n if (potentialMax < min) return false;\n }\n\n return true;\n }\n}\n\nexport function padString(num: number | string): string {\n return num.toString().padStart(2, '0');\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;MAKa,SAAS,CAAA;AACpB,IAAA,SAAS,CAAC,KAAa,EAAA;QACrB,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvD;8GAHW,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;4GAAT,SAAS,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,CAAA;;2FAAT,SAAS,EAAA,UAAA,EAAA,CAAA;kBAHrB,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,OAAO;AACd,iBAAA;;;SCCe,SAAS,GAAA;AACvB,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AACjC,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACrC,OAAO;AACL,QAAA,eAAe,EAAE,CAAC,EAAwC,KAAI;YAC5D,MAAM,OAAO,GAAc,EAAE;AAC7B,YAAA,MAAM,QAAQ,GAAG,CAAC,EAAW,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;AAClD,YAAA,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAClD,eAAe,CACb,MAAK;AACH,gBAAA,UAAU,EAAE;gBACZ,EAAE,CAAC,QAAQ,CAAC;AACd,YAAA,CAAC,EACD,EAAE,QAAQ,EAAE,CACb;YACD,OAAO,UAAU,CAAC,SAAS,CAAC,MAAM,UAAU,EAAE,CAAC;QACjD,CAAC;KACF;AACH;AAEM,SAAU,OAAO,CAAC,EAAc,EAAA;IACpC,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;AAClC;;ACdM,SAAU,QAAQ,CAAC,MAAA,GAAiB,CAAC,EAAA;AACzC,IAAA,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,MAC5B,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CACzD,CAAC,IAAI,CAAC,EAAE,CAAC;AACZ;AAOM,SAAU,gBAAgB,CAC9B,EAAU,EACV,EAAkB,EAClB,OAOI,EAAE,EAAA;IAEN,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,GAAG,CAAC,EAAE,GAAG,eAAe,EAAE,GAAG,IAAI;IACjG,IAAI,MAAM,GAAG,KAAK;AAClB,IAAA,MAAM,UAAU,GAAgB,EAAE,EAAE,EAAE,MAAK,EAAE,CAAC,EAAE,GAAG,EAAE,MAAK,EAAE,CAAC,EAAE;AAE/D,IAAA,UAAU,CAAC,EAAE,GAAG,MAAK;AACnB,QAAA,IAAI,MAAM;YAAE;QACZ,MAAM,GAAG,IAAI;AACb,QAAA,qBAAqB,CAAC,QAAQ,EAAE,MAAK;YACnC,MAAM,EAAE,GAAG,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC;YACtC,IAAI,UAAU,GAAG,CAAC;AAClB,YAAA,EAAE,CAAC,gBAAgB,CACjB,EAAE,EACF,CAAC,IAAG;AACF,gBAAA,UAAU,EAAE;gBACZ,IAAI,UAAU,IAAI,IAAI;oBAAE;gBACxB,EAAE,CAAC,CAAM,CAAC;YACZ,CAAC,EACD,eAAe,CAChB;AAED,YAAA,UAAU,CAAC,GAAG,GAAG,MAAK;gBACpB,MAAM,GAAG,KAAK;gBACd,UAAU,GAAG,CAAC;AACd,gBAAA,EAAE,CAAC,mBAAmB,CAAC,EAAE,EAAE,EAAS,CAAC;AACvC,YAAA,CAAC;AACD,YAAA,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;AACzB,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;AAED,IAAA,IAAI,CAAC,IAAI;QAAE,UAAU,CAAC,EAAE,EAAE;AAC1B,IAAA,OAAO,UAAU;AACnB;AASM,SAAU,cAAc,CAC5B,IAAuB,EACvB,GAAgC,EAAA;AAEhC,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,kDAAC;IACzB,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAErE,IAAA,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAK;AACjC,QAAA,MAAM,OAAO,GAAG,GAAG,EAAE;AACrB,QAAA,MAAM,IAAI,GAAG,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE;AACjD,QAAA,MAAM,KAAK,GAAG,IAAI,EAAE,IAAI,EAAE;AAC1B,QAAA,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAI,KAAK,CAAC,CAAC;AAE9C,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,KAAK,CAAC,CAAI,EAAE,CAAS,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC5F,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAI;;YAErC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,GAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAS,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;YAC1F,IAAI,QAAQ,EAAE;AACZ,gBAAA,MAAM,gBAAgB,GAAG,QAAQ,EAAE,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,KAAU,EAAE,IAAI,CAAC,CAAC;AAC3E,gBAAA,IAAI,gBAAgB,EAAE,MAAM,EAAE;oBAC5B,GAAG,CAAC,IAAI,CAAC;AACP,wBAAA,GAAG,IAAI;AACP,wBAAA,CAAC,OAAO,CAAC,GAAG,IAAI,UAAU,GAAG,gBAAgB;AAC9C,qBAAA,CAAC;gBACJ;YACF;AAAO,iBAAA,IAAI,KAAK,CAAC,IAAoB,EAAE,IAAI,CAAC,EAAE;AAC5C,gBAAA,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YAChB;AACA,YAAA,OAAO,GAAG;QACZ,CAAC,EAAE,EAAS,CAAC;AACb,QAAA,OAAO,GAAG;AACZ,IAAA,CAAC,wDAAC;AACF,IAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE;AACvC;;SC1GgB,QAAQ,GAAA;AACtB,IAAA,OAAO,gBAAgB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAC9C;SAEgB,QAAQ,GAAA;AACtB,IAAA,OAAO,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAC/C;;ACPA;;;;;;;;;;;;AAYG;MAOU,gBAAgB,CAAA;AAE3B,IAAA,WAAA,GAAA;AADS,QAAA,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAC,IAAI,6DAAC;QAEvC,eAAe,CAAC,MAAK;AACnB,YAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC;AACnC,QAAA,CAAC,CAAC;IACJ;8GANW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAN5B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,oBAAoB;AAC9B,oBAAA,IAAI,EAAE;AACJ,wBAAA,sBAAsB,EAAE,qBAAqB;AAC9C,qBAAA;AACF,iBAAA;;;MCXY,UAAU,CAAA;AAcrB,IAAA,WAAA,GAAA;AAbS,QAAA,IAAA,CAAA,EAAE,GAAG,MAAM,CAA+B,UAAU,CAAC;QAErD,IAAA,CAAA,GAAG,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,KAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAsB;QACjC,IAAA,CAAA,GAAG,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,KAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAsB;QACjC,IAAA,CAAA,GAAG,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,KAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAsB;AAEjC,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC;;AAGzB,QAAA,IAAA,CAAA,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,gDAAC;AAC7B,QAAA,IAAA,CAAA,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,gDAAC;AAC7B,QAAA,IAAA,CAAA,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,gDAAC;QAerB,IAAA,CAAA,WAAW,GAAG,IAAI,GAAG,CAAC;YACrC,WAAW;YACX,QAAQ;YACR,KAAK;YACL,QAAQ;YACR,OAAO;YACP,MAAM;YACN,KAAK;YACL,WAAW;YACX,YAAY;AACb,SAAA,CAAC;AAEF,QAAA,IAAA,CAAA,SAAS,GAAG,CAAC,CAAgB,KAAI;AAC/B,YAAA,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;gBAAE;AACtD,YAAA,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC;AAAE,gBAAA,OAAO,CAAC,CAAC,cAAc,EAAE;AAExE,YAAA,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;AAC5C,gBAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAClC;YAEA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE;gBACnE,CAAC,CAAC,cAAc,EAAE;YACpB;AACF,QAAA,CAAC;QAnCC,MAAM,CAAC,OAAO,IAAG;AACf,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa;YAChC,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC;AAC9C,YAAA,OAAO,CAAC,MAAM,EAAE,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;AAClE,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,QAAQ,CAAC,EAAS,EAAA;AAChB,QAAA,MAAM,KAAK,GAAI,EAAE,CAAC,MAA2B,EAAE,KAAK;AACpD,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;IACvB;AA2BQ,IAAA,SAAS,CAAC,CAAgB,EAAA;QAChC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC;IACpE;AAEQ,IAAA,iBAAiB,CAAC,CAAgB,EAAA;QACxC,CAAC,CAAC,cAAc,EAAE;QAClB,MAAM,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK;QAChD,MAAM,QAAQ,GAAG,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/D,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAAE;AAC3C,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACtD;IACF;AAEQ,IAAA,WAAW,CAAC,CAAgB,EAAA;AAClC,QAAA,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa;AACrE,QAAA,MAAM,KAAK,GAAG,cAAc,IAAI,KAAK,CAAC,MAAM;AAC5C,QAAA,MAAM,GAAG,GAAG,YAAY,IAAI,KAAK,CAAC,MAAM;AACxC,QAAA,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;IACzD;AAEQ,IAAA,aAAa,CAAC,QAAgB,EAAA;AACpC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE;AACvB,QAAA,MAAM,KAAK,GAAG,CAAC,QAAQ;AACvB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE;AACvB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE;QAEvB,IAAI,GAAG,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG;AAAE,YAAA,OAAO,KAAK;AAC5D,QAAA,IAAI,GAAG,KAAK,SAAS,IAAI,KAAK,GAAG,GAAG;AAAE,YAAA,OAAO,KAAK;QAElD,IAAI,GAAG,KAAK,SAAS,IAAI,KAAK,GAAG,GAAG,EAAE;YACpC,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACnF,IAAI,YAAY,GAAG,GAAG;AAAE,gBAAA,OAAO,KAAK;QACtC;AAEA,QAAA,OAAO,IAAI;IACb;8GAvFW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAV,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,aAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,kBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAV,UAAU,EAAA,UAAA,EAAA,CAAA;kBAPtB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,sBAAsB;AAChC,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,kBAAkB;AAC7B,wBAAA,SAAS,EAAE,SAAS;AACrB,qBAAA;AACF,iBAAA;;AA2FK,SAAU,SAAS,CAAC,GAAoB,EAAA;IAC5C,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AACxC;;ACrGA;;AAEG;;;;"}
1
+ {"version":3,"file":"ngbase-adk-utils.mjs","sources":["../../../projects/adk/utils/range.pipe.ts","../../../projects/adk/utils/disposals.ts","../../../projects/adk/utils/utils.ts","../../../projects/adk/utils/ssr.ts","../../../projects/adk/utils/animation.ts","../../../projects/adk/utils/number-only.ts","../../../projects/adk/utils/ngbase-adk-utils.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'range',\n})\nexport class RangePipe implements PipeTransform {\n transform(value: number) {\n return Array.from({ length: value }, (v, k) => k + 1);\n }\n}\n","import { afterNextRender, DestroyRef, inject, Injector } from '@angular/core';\n\ntype Cleanup = () => void;\ntype CleanupRegisterFn = (fn: Cleanup) => void;\n\nexport function disposals() {\n const injector = inject(Injector);\n const destroyRef = inject(DestroyRef);\n return {\n afterNextRender: (fn: (cleanup: CleanupRegisterFn) => void) => {\n const cleanup: Cleanup[] = [];\n const register = (fn: Cleanup) => cleanup.push(fn);\n const runCleanup = () => cleanup.forEach(c => c());\n afterNextRender(\n () => {\n runCleanup();\n fn(register);\n },\n { injector },\n );\n return destroyRef.onDestroy(() => runCleanup());\n },\n };\n}\n\nexport function cleanup(fn: () => void) {\n inject(DestroyRef).onDestroy(fn);\n}\n","import {\n computed,\n inject,\n Injector,\n isSignal,\n linkedSignal,\n runInInjectionContext,\n Signal,\n signal,\n DOCUMENT,\n} from '@angular/core';\nimport { cleanup } from './disposals';\n\nexport function uniqueId(length: number = 7) {\n return Array.from({ length }, () =>\n String.fromCharCode(97 + Math.floor(Math.random() * 26)),\n ).join('');\n}\n\nexport interface ListenerOut {\n on: () => void;\n off: () => void;\n}\n\nexport function documentListener<T extends Event>(\n ev: string,\n fn: (e: T) => void,\n data: Partial<\n AddEventListenerOptions & {\n injector?: Injector;\n lazy?: boolean;\n skip?: number;\n element?: HTMLElement | Document | Window;\n }\n > = {},\n): ListenerOut {\n const { injector = inject(Injector), lazy = false, element, skip = 0, ...listenerOptions } = data;\n let active = false;\n const controller: ListenerOut = { on: () => {}, off: () => {} };\n\n controller.on = () => {\n if (active) return;\n active = true;\n runInInjectionContext(injector, () => {\n const el = element || inject(DOCUMENT);\n let eventCount = 0;\n el.addEventListener(\n ev,\n e => {\n eventCount++;\n if (eventCount <= skip) return;\n fn(e as T);\n },\n listenerOptions,\n );\n\n controller.off = () => {\n active = false;\n eventCount = 0;\n el.removeEventListener(ev, fn as any);\n };\n cleanup(controller.off);\n });\n };\n\n if (!lazy) controller.on();\n return controller;\n}\n\nexport type FilterOptions<T, V = any> = {\n filter: (v: V) => string;\n query?: (v: V, search: string) => boolean;\n key?: keyof T;\n childrenFilter?: (v: T) => V[];\n};\n\nexport function filterFunction<T, V = T>(\n data: Signal<T[]> | T[],\n ops: Signal<FilterOptions<T, V>>,\n) {\n const search = signal('');\n const list = linkedSignal(isSignal(data) ? data : signal(data || []));\n\n const filteredList = computed(() => {\n const options = ops();\n const text = search()?.trim().toLowerCase() || '';\n const lists = list() || [];\n const filter = options.filter ?? ((v: V) => v);\n\n const query = options.query ?? ((v: V, t: string) => filter(v)?.toLowerCase?.().includes(t));\n const vvv = lists.reduce((acc, item) => {\n // Get children from key or childrenFilter\n const children = options.key ? (item[options.key] as V[]) : options.childrenFilter?.(item);\n if (children) {\n const filteredChildren = children?.filter(child => query(child as V, text));\n if (filteredChildren?.length) {\n acc.push({\n ...item,\n [options.key || 'children']: filteredChildren,\n });\n }\n } else if (query(item as unknown as V, text)) {\n acc.push(item);\n }\n return acc;\n }, [] as T[]);\n return vvv;\n });\n return { search, list, filteredList };\n}\n","import { isPlatformBrowser, isPlatformServer } from '@angular/common';\nimport { inject, PLATFORM_ID } from '@angular/core';\n\nexport function isServer() {\n return isPlatformServer(inject(PLATFORM_ID));\n}\n\nexport function isClient() {\n return isPlatformBrowser(inject(PLATFORM_ID));\n}\n","import { afterNextRender, Directive, signal } from '@angular/core';\n\n/**\n * Directive that disables CSS animations on initial render.\n * Adds `no-animation` class initially and removes it after first render.\n * This prevents animations from playing when the component first appears.\n *\n * Requires the following CSS to be defined globally:\n * ```css\n * .no-animation {\n * animation: none !important;\n * transition: none !important;\n * }\n * ```\n */\n@Directive({\n selector: '[disableAnimation]',\n host: {\n '[class.no-animation]': 'animationDisabled()',\n },\n})\nexport class DisableAnimation {\n readonly animationDisabled = signal(true);\n constructor() {\n afterNextRender(() => {\n // Use requestAnimationFrame to ensure the DOM has settled\n // before enabling animations, preventing initial render animations\n requestAnimationFrame(() => {\n this.animationDisabled.set(false);\n });\n });\n }\n}\n","import { Directive, effect, ElementRef, inject, input, linkedSignal, model } from '@angular/core';\n\n@Directive({\n selector: 'input[ngbNumberOnly]',\n host: {\n '(input)': 'setValue($event)',\n '[value]': 'value()',\n },\n})\nexport class NumberOnly {\n readonly el = inject<ElementRef<HTMLInputElement>>(ElementRef);\n\n readonly min = input<number | undefined>();\n readonly max = input<number | undefined>();\n readonly len = input<number | undefined>();\n\n readonly value = model<string>('');\n\n // Hacky way to set the min value\n readonly _min = linkedSignal(this.min);\n readonly _max = linkedSignal(this.max);\n readonly _len = linkedSignal(this.len);\n\n constructor() {\n effect(cleanup => {\n const el = this.el.nativeElement;\n el.addEventListener('keydown', this.onKeyDown);\n cleanup(() => el.removeEventListener('keydown', this.onKeyDown));\n });\n }\n\n setValue(ev: Event) {\n const value = (ev.target as HTMLInputElement)?.value;\n this.value.set(value);\n }\n\n private readonly allowedKeys = new Set([\n 'Backspace',\n 'Delete',\n 'Tab',\n 'Escape',\n 'Enter',\n 'Home',\n 'End',\n 'ArrowLeft',\n 'ArrowRight',\n ]);\n\n onKeyDown = (e: KeyboardEvent) => {\n if (this.allowedKeys.has(e.key) || this.isCtrlKey(e)) return;\n if (e.key === 'v' && (e.ctrlKey || e.metaKey)) return e.preventDefault();\n\n if (['ArrowUp', 'ArrowDown'].includes(e.key)) {\n return this.handleArrowUpDown(e);\n }\n\n if (!/^\\d$/.test(e.key) || !this.validateValue(this.getNewValue(e))) {\n e.preventDefault();\n }\n };\n\n private isCtrlKey(e: KeyboardEvent): boolean {\n return ['a', 'c', 'x'].includes(e.key) && (e.ctrlKey || e.metaKey);\n }\n\n private handleArrowUpDown(e: KeyboardEvent) {\n e.preventDefault();\n const currentValue = this.el.nativeElement.value;\n const newValue = +currentValue + (e.key === 'ArrowUp' ? 1 : -1);\n if (this.validateValue(newValue.toString())) {\n this.value.set(newValue.toString().padStart(2, '0'));\n }\n }\n\n private getNewValue(e: KeyboardEvent): string {\n const { value, selectionStart, selectionEnd } = this.el.nativeElement;\n const start = selectionStart ?? value.length;\n const end = selectionEnd ?? value.length;\n return value.slice(0, start) + e.key + value.slice(end);\n }\n\n private validateValue(rawValue: string): boolean {\n const len = this._len();\n const value = +rawValue;\n const min = this._min();\n const max = this._max();\n\n if (len !== undefined && rawValue.length > len) return false;\n if (max !== undefined && value > max) return false;\n\n if (min !== undefined && value < min) {\n const potentialMax = Number(rawValue + '9'.repeat(len ? len - rawValue.length : 1));\n if (potentialMax < min) return false;\n }\n\n return true;\n }\n}\n\nexport function padString(num: number | string): string {\n return num.toString().padStart(2, '0');\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { NgTemplateOutlet } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
- import { inject, TemplateRef, input, Directive, ElementRef, contentChild, numberAttribute, signal, computed, Component } from '@angular/core';
3
+ import { inject, TemplateRef, input, Directive, ElementRef, contentChild, numberAttribute, booleanAttribute, signal, computed, Component } from '@angular/core';
4
4
  import { isClient, cleanup } from '@ngbase/adk/utils';
5
5
 
6
6
  class VirtualFor {
@@ -8,10 +8,10 @@ class VirtualFor {
8
8
  this.template = inject(TemplateRef);
9
9
  this.virtualForOf = input.required(...(ngDevMode ? [{ debugName: "virtualForOf" }] : []));
10
10
  }
11
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: VirtualFor, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
12
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.1.0", type: VirtualFor, isStandalone: true, selector: "[virtualFor][virtualForOf]", inputs: { virtualForOf: { classPropertyName: "virtualForOf", publicName: "virtualForOf", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: "block" }, ngImport: i0 }); }
11
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: VirtualFor, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
12
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.1.2", type: VirtualFor, isStandalone: true, selector: "[virtualFor][virtualForOf]", inputs: { virtualForOf: { classPropertyName: "virtualForOf", publicName: "virtualForOf", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: "block" }, ngImport: i0 }); }
13
13
  }
14
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: VirtualFor, decorators: [{
14
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: VirtualFor, decorators: [{
15
15
  type: Directive,
16
16
  args: [{
17
17
  selector: '[virtualFor][virtualForOf]',
@@ -28,6 +28,7 @@ class Virtualizer {
28
28
  this.itemSize = input.required({ ...(ngDevMode ? { debugName: "itemSize" } : {}), transform: numberAttribute });
29
29
  this.buffer = input(2, ...(ngDevMode ? [{ debugName: "buffer" }] : []));
30
30
  this.orientation = input('vertical', ...(ngDevMode ? [{ debugName: "orientation" }] : []));
31
+ this.handleKeys = input(true, { ...(ngDevMode ? { debugName: "handleKeys" } : {}), transform: booleanAttribute });
31
32
  // Internal signals
32
33
  this.scrollPosition = signal(0, ...(ngDevMode ? [{ debugName: "scrollPosition" }] : []));
33
34
  this.containerSize = signal(0, ...(ngDevMode ? [{ debugName: "containerSize" }] : []));
@@ -73,6 +74,8 @@ class Virtualizer {
73
74
  this.scrollPosition.set(this.isVertical() ? target.scrollTop : target.scrollLeft);
74
75
  }
75
76
  onKeyDown(event) {
77
+ if (!this.handleKeys())
78
+ return;
76
79
  if (!['ArrowDown', 'ArrowUp', 'ArrowLeft', 'ArrowRight'].includes(event.key)) {
77
80
  return;
78
81
  }
@@ -117,8 +120,8 @@ class Virtualizer {
117
120
  ? this.containerRef.nativeElement.clientHeight
118
121
  : this.containerRef.nativeElement.clientWidth);
119
122
  }
120
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: Virtualizer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
121
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: Virtualizer, isStandalone: true, selector: "ngb-virtualizer, [ngbVirtualizer]", inputs: { itemSize: { classPropertyName: "itemSize", publicName: "itemSize", isSignal: true, isRequired: true, transformFunction: null }, buffer: { classPropertyName: "buffer", publicName: "buffer", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "scroll": "onScroll($event)", "keydown": "onKeyDown($event)" }, classAttribute: "block relative overflow-auto contain-strict" }, queries: [{ propertyName: "virtualFor", first: true, predicate: VirtualFor, descendants: true, isSignal: true }], ngImport: i0, template: `
123
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: Virtualizer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
124
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: Virtualizer, isStandalone: true, selector: "ngb-virtualizer, [ngbVirtualizer]", inputs: { itemSize: { classPropertyName: "itemSize", publicName: "itemSize", isSignal: true, isRequired: true, transformFunction: null }, buffer: { classPropertyName: "buffer", publicName: "buffer", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, handleKeys: { classPropertyName: "handleKeys", publicName: "handleKeys", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "scroll": "onScroll($event)", "keydown": "onKeyDown($event)" }, classAttribute: "block relative overflow-auto contain-strict" }, queries: [{ propertyName: "virtualFor", first: true, predicate: VirtualFor, descendants: true, isSignal: true }], ngImport: i0, template: `
122
125
  <div
123
126
  class="virtualizer-content absolute top-0 left-0"
124
127
  [class.w-full]="isVertical()"
@@ -148,7 +151,7 @@ class Virtualizer {
148
151
  </div>
149
152
  `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
150
153
  }
151
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: Virtualizer, decorators: [{
154
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: Virtualizer, decorators: [{
152
155
  type: Component,
153
156
  args: [{
154
157
  selector: 'ngb-virtualizer, [ngbVirtualizer]',
@@ -188,7 +191,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImpor
188
191
  '(keydown)': 'onKeyDown($event)',
189
192
  },
190
193
  }]
191
- }], ctorParameters: () => [], propDecorators: { virtualFor: [{ type: i0.ContentChild, args: [i0.forwardRef(() => VirtualFor), { isSignal: true }] }], itemSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemSize", required: true }] }], buffer: [{ type: i0.Input, args: [{ isSignal: true, alias: "buffer", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }] } });
194
+ }], ctorParameters: () => [], propDecorators: { virtualFor: [{ type: i0.ContentChild, args: [i0.forwardRef(() => VirtualFor), { isSignal: true }] }], itemSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemSize", required: true }] }], buffer: [{ type: i0.Input, args: [{ isSignal: true, alias: "buffer", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], handleKeys: [{ type: i0.Input, args: [{ isSignal: true, alias: "handleKeys", required: false }] }] } });
192
195
 
193
196
  /**
194
197
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"ngbase-adk-virtualizer.mjs","sources":["../../../projects/adk/virtualizer/virtualizer.ts","../../../projects/adk/virtualizer/ngbase-adk-virtualizer.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport {\n Component,\n computed,\n contentChild,\n Directive,\n ElementRef,\n inject,\n input,\n numberAttribute,\n signal,\n TemplateRef,\n} from '@angular/core';\nimport { cleanup, isClient } from '@ngbase/adk/utils';\n\nexport type Orientation = 'vertical' | 'horizontal';\n\nexport interface VirtualForContext<T> {\n $implicit: T;\n index: number;\n}\n\n@Directive({\n selector: '[virtualFor][virtualForOf]',\n\n host: {\n class: 'block',\n },\n})\nexport class VirtualFor<T> {\n public template = inject<TemplateRef<VirtualForContext<T>>>(TemplateRef);\n readonly virtualForOf = input.required<T[]>();\n}\n\ninterface VirtualItem {\n index: number;\n position: number;\n}\n\n@Component({\n selector: 'ngb-virtualizer, [ngbVirtualizer]',\n imports: [NgTemplateOutlet],\n template: `\n <div\n class=\"virtualizer-content absolute top-0 left-0\"\n [class.w-full]=\"isVertical()\"\n [class.h-full]=\"!isVertical()\"\n [style.height.px]=\"isVertical() ? totalContentSize() : '100%'\"\n [style.width.px]=\"!isVertical() ? totalContentSize() : '100%'\"\n >\n @for (item of visibleItems(); track item.index) {\n <div\n class=\"virtualizer-item absolute\"\n [class.w-full]=\"isVertical()\"\n [class.h-full]=\"!isVertical()\"\n [style.transform]=\"getTransform(item)\"\n [style.height.px]=\"isVertical() ? itemSize() : '100%'\"\n [style.width.px]=\"!isVertical() ? itemSize() : '100%'\"\n >\n <ng-container\n [ngTemplateOutlet]=\"virtualFor().template\"\n [ngTemplateOutletContext]=\"{\n $implicit: this.items()[item.index],\n index: item.index,\n }\"\n >\n </ng-container>\n </div>\n }\n </div>\n `,\n host: {\n class: 'block relative overflow-auto contain-strict',\n '(scroll)': 'onScroll($event)',\n '(keydown)': 'onKeyDown($event)',\n },\n})\nexport class Virtualizer<T> {\n private readonly containerRef = inject<ElementRef<HTMLElement>>(ElementRef);\n readonly virtualFor = contentChild.required<VirtualFor<T>>(VirtualFor);\n\n // Input signals\n readonly itemSize = input.required({ transform: numberAttribute });\n readonly buffer = input(2);\n readonly orientation = input<Orientation>('vertical');\n\n // Internal signals\n private readonly scrollPosition = signal(0);\n private readonly containerSize = signal(0);\n\n // Computed values\n readonly items = computed(() => this.virtualFor().virtualForOf());\n private readonly totalItems = computed(() => this.items().length);\n readonly totalContentSize = computed(() => this.totalItems() * this.itemSize());\n\n readonly isVertical = computed(() => this.orientation() === 'vertical');\n\n private readonly visibleIndexes = computed(() => {\n const start = Math.floor(this.scrollPosition() / this.itemSize());\n const visibleCount = Math.ceil(this.containerSize() / this.itemSize());\n\n const bufferSize = this.buffer();\n const startIndex = Math.max(0, start - bufferSize);\n const endIndex = Math.min(this.totalItems(), start + visibleCount + bufferSize);\n\n return { startIndex, endIndex };\n });\n\n readonly visibleItems = computed(() => {\n const { startIndex, endIndex } = this.visibleIndexes();\n const items: VirtualItem[] = [];\n\n for (let i = startIndex; i < endIndex; i++) {\n items.push({\n index: i,\n position: i * this.itemSize(),\n });\n }\n\n return items;\n });\n\n private readonly client = isClient();\n\n constructor() {\n this.updateContainerSize();\n\n if (this.client) {\n const resizeObserver = new ResizeObserver(() => {\n this.updateContainerSize();\n });\n resizeObserver.observe(this.containerRef.nativeElement);\n cleanup(() => resizeObserver.disconnect());\n }\n }\n\n getTransform(item: VirtualItem): string {\n return this.isVertical() ? `translateY(${item.position}px)` : `translateX(${item.position}px)`;\n }\n\n onScroll(event: Event) {\n const target = event.target as HTMLElement;\n this.scrollPosition.set(this.isVertical() ? target.scrollTop : target.scrollLeft);\n }\n\n onKeyDown(event: KeyboardEvent) {\n if (!['ArrowDown', 'ArrowUp', 'ArrowLeft', 'ArrowRight'].includes(event.key)) {\n return;\n }\n\n event.preventDefault();\n const currentIndex = Math.floor(this.scrollPosition() / this.itemSize());\n\n let nextIndex = currentIndex;\n if (this.isVertical()) {\n nextIndex =\n event.key === 'ArrowDown'\n ? Math.min(currentIndex + 1, this.totalItems() - 1)\n : event.key === 'ArrowUp'\n ? Math.max(0, currentIndex - 1)\n : currentIndex;\n } else {\n nextIndex =\n event.key === 'ArrowRight'\n ? Math.min(currentIndex + 1, this.totalItems() - 1)\n : event.key === 'ArrowLeft'\n ? Math.max(0, currentIndex - 1)\n : currentIndex;\n }\n\n this.scrollToIndex(nextIndex);\n }\n\n scrollToIndex(index: number, behavior: ScrollBehavior = 'auto') {\n const position = index * this.itemSize();\n if (this.isVertical()) {\n this.containerRef.nativeElement.scrollTo({\n top: position,\n behavior,\n });\n } else {\n this.containerRef.nativeElement.scrollTo({\n left: position,\n behavior,\n });\n }\n }\n\n private updateContainerSize() {\n this.containerSize.set(\n this.isVertical()\n ? this.containerRef.nativeElement.clientHeight\n : this.containerRef.nativeElement.clientWidth,\n );\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngbase-adk-virtualizer.mjs","sources":["../../../projects/adk/virtualizer/virtualizer.ts","../../../projects/adk/virtualizer/ngbase-adk-virtualizer.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n Component,\n computed,\n contentChild,\n Directive,\n ElementRef,\n inject,\n input,\n numberAttribute,\n signal,\n TemplateRef,\n} from '@angular/core';\nimport { cleanup, isClient } from '@ngbase/adk/utils';\n\nexport type Orientation = 'vertical' | 'horizontal';\n\nexport interface VirtualForContext<T> {\n $implicit: T;\n index: number;\n}\n\n@Directive({\n selector: '[virtualFor][virtualForOf]',\n\n host: {\n class: 'block',\n },\n})\nexport class VirtualFor<T> {\n public template = inject<TemplateRef<VirtualForContext<T>>>(TemplateRef);\n readonly virtualForOf = input.required<T[]>();\n}\n\ninterface VirtualItem {\n index: number;\n position: number;\n}\n\n@Component({\n selector: 'ngb-virtualizer, [ngbVirtualizer]',\n imports: [NgTemplateOutlet],\n template: `\n <div\n class=\"virtualizer-content absolute top-0 left-0\"\n [class.w-full]=\"isVertical()\"\n [class.h-full]=\"!isVertical()\"\n [style.height.px]=\"isVertical() ? totalContentSize() : '100%'\"\n [style.width.px]=\"!isVertical() ? totalContentSize() : '100%'\"\n >\n @for (item of visibleItems(); track item.index) {\n <div\n class=\"virtualizer-item absolute\"\n [class.w-full]=\"isVertical()\"\n [class.h-full]=\"!isVertical()\"\n [style.transform]=\"getTransform(item)\"\n [style.height.px]=\"isVertical() ? itemSize() : '100%'\"\n [style.width.px]=\"!isVertical() ? itemSize() : '100%'\"\n >\n <ng-container\n [ngTemplateOutlet]=\"virtualFor().template\"\n [ngTemplateOutletContext]=\"{\n $implicit: this.items()[item.index],\n index: item.index,\n }\"\n >\n </ng-container>\n </div>\n }\n </div>\n `,\n host: {\n class: 'block relative overflow-auto contain-strict',\n '(scroll)': 'onScroll($event)',\n '(keydown)': 'onKeyDown($event)',\n },\n})\nexport class Virtualizer<T> {\n private readonly containerRef = inject<ElementRef<HTMLElement>>(ElementRef);\n readonly virtualFor = contentChild.required<VirtualFor<T>>(VirtualFor);\n\n // Input signals\n readonly itemSize = input.required({ transform: numberAttribute });\n readonly buffer = input(2);\n readonly orientation = input<Orientation>('vertical');\n readonly handleKeys = input(true, { transform: booleanAttribute });\n\n // Internal signals\n readonly scrollPosition = signal(0);\n private readonly containerSize = signal(0);\n\n // Computed values\n readonly items = computed(() => this.virtualFor().virtualForOf());\n private readonly totalItems = computed(() => this.items().length);\n readonly totalContentSize = computed(() => this.totalItems() * this.itemSize());\n\n readonly isVertical = computed(() => this.orientation() === 'vertical');\n\n private readonly visibleIndexes = computed(() => {\n const start = Math.floor(this.scrollPosition() / this.itemSize());\n const visibleCount = Math.ceil(this.containerSize() / this.itemSize());\n\n const bufferSize = this.buffer();\n const startIndex = Math.max(0, start - bufferSize);\n const endIndex = Math.min(this.totalItems(), start + visibleCount + bufferSize);\n\n return { startIndex, endIndex };\n });\n\n readonly visibleItems = computed(() => {\n const { startIndex, endIndex } = this.visibleIndexes();\n const items: VirtualItem[] = [];\n\n for (let i = startIndex; i < endIndex; i++) {\n items.push({\n index: i,\n position: i * this.itemSize(),\n });\n }\n\n return items;\n });\n\n private readonly client = isClient();\n\n constructor() {\n this.updateContainerSize();\n\n if (this.client) {\n const resizeObserver = new ResizeObserver(() => {\n this.updateContainerSize();\n });\n resizeObserver.observe(this.containerRef.nativeElement);\n cleanup(() => resizeObserver.disconnect());\n }\n }\n\n getTransform(item: VirtualItem): string {\n return this.isVertical() ? `translateY(${item.position}px)` : `translateX(${item.position}px)`;\n }\n\n onScroll(event: Event) {\n const target = event.target as HTMLElement;\n this.scrollPosition.set(this.isVertical() ? target.scrollTop : target.scrollLeft);\n }\n\n onKeyDown(event: KeyboardEvent) {\n if (!this.handleKeys()) return;\n if (!['ArrowDown', 'ArrowUp', 'ArrowLeft', 'ArrowRight'].includes(event.key)) {\n return;\n }\n\n event.preventDefault();\n const currentIndex = Math.floor(this.scrollPosition() / this.itemSize());\n\n let nextIndex = currentIndex;\n if (this.isVertical()) {\n nextIndex =\n event.key === 'ArrowDown'\n ? Math.min(currentIndex + 1, this.totalItems() - 1)\n : event.key === 'ArrowUp'\n ? Math.max(0, currentIndex - 1)\n : currentIndex;\n } else {\n nextIndex =\n event.key === 'ArrowRight'\n ? Math.min(currentIndex + 1, this.totalItems() - 1)\n : event.key === 'ArrowLeft'\n ? Math.max(0, currentIndex - 1)\n : currentIndex;\n }\n\n this.scrollToIndex(nextIndex);\n }\n\n scrollToIndex(index: number, behavior: ScrollBehavior = 'auto') {\n const position = index * this.itemSize();\n if (this.isVertical()) {\n this.containerRef.nativeElement.scrollTo({\n top: position,\n behavior,\n });\n } else {\n this.containerRef.nativeElement.scrollTo({\n left: position,\n behavior,\n });\n }\n }\n\n private updateContainerSize() {\n this.containerSize.set(\n this.isVertical()\n ? this.containerRef.nativeElement.clientHeight\n : this.containerRef.nativeElement.clientWidth,\n );\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ngbase/adk",
3
- "version": "0.1.19",
3
+ "version": "0.1.21",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/ng-base/ngbase.git"
@@ -27,7 +27,7 @@ import { MeeFormField } from '<%= basepath %>/form-field';
27
27
  template: `
28
28
  <div class="flex flex-1 items-center gap-2">
29
29
  <div class="hidden md:block">Rows per page</div>
30
- <<%= name %>-form-field class="!w-auto [&>.mis]:min-h-8 [&>.mis]:py-0">
30
+ <<%= name %>-form-field class="w-auto! [&>.mis]:min-h-8 [&>.mis]:py-0">
31
31
  <<%= name %>-select [value]="size()" (valueChange)="sizeChanged($any($event))">
32
32
  @for (size of sizeOptions(); track size) {
33
33
  <<%= name %>-option [value]="size">
@@ -51,7 +51,7 @@ import { MeeFormField } from '<%= basepath %>/form-field';
51
51
  ngbPaginationBtn="page"
52
52
  [jump]="snap"
53
53
  <%= name %>Button="ghost"
54
- class="ring-offset-foreground aria-[current=page]:bg-muted aria-[current=page]:text-primary min-w-9 !p-2"
54
+ class="ring-offset-foreground aria-[current=page]:bg-muted aria-[current=page]:text-primary min-w-9 p-2!"
55
55
  >
56
56
  {{ snap }}
57
57
  </button>
@@ -3,8 +3,10 @@ import {
3
3
  booleanAttribute,
4
4
  ChangeDetectionStrategy,
5
5
  Component,
6
+ computed,
6
7
  Directive,
7
8
  input,
9
+ viewChild,
8
10
  } from '@angular/core';
9
11
  import { Icon } from '<%= basepath %>/icon';
10
12
  import { provideIcons } from '@ng-icons/core';
@@ -16,6 +18,7 @@ import {
16
18
  NgbSelectOptionGroup,
17
19
  SelectValue,
18
20
  } from '@ngbase/adk/select';
21
+ import { Virtualizer, VirtualFor } from '@ngbase/adk/virtualizer';
19
22
  import { Option } from './option';
20
23
  import { SelectInput } from './select-input';
21
24
  import { PopoverOptions } from '@ngbase/adk/popover';
@@ -32,7 +35,16 @@ export class SelectOption<T> {}
32
35
  changeDetection: ChangeDetectionStrategy.OnPush,
33
36
  viewProviders: [provideIcons({ lucideChevronsUpDown })],
34
37
  providers: [aliasSelect(Select)],
35
- imports: [Icon, SelectInput, Option, NgTemplateOutlet, SelectValue, NgbSelectOptionGroup],
38
+ imports: [
39
+ Icon,
40
+ SelectInput,
41
+ Option,
42
+ NgTemplateOutlet,
43
+ SelectValue,
44
+ NgbSelectOptionGroup,
45
+ Virtualizer,
46
+ VirtualFor,
47
+ ],
36
48
  template: `
37
49
  <button
38
50
  ngbSelectValue
@@ -54,28 +66,66 @@ export class SelectOption<T> {}
54
66
 
55
67
  <!-- Options template -->
56
68
  <ng-template #optionsTemplate>
57
- <div class="flex flex-col overflow-hidden">
69
+ <div
70
+ class="flex flex-col overflow-hidden"
71
+ (keydown)="virtualScroll() && handleVirtualKeydown($event)"
72
+ >
58
73
  <ng-content select="[<%= name %>SelectInput]">
59
74
  @if (options().length) {
60
75
  <input <%= name %>SelectInput placeholder="Search options" [(value)]="optionsFilter.search" />
61
76
  }
62
77
  </ng-content>
63
- <div #optionsGroup ngbSelectOptionGroup class="overflow-auto p-1">
78
+ <div
79
+ #optionsGroup
80
+ ngbSelectOptionGroup
81
+ [class.overflow-auto]="!virtualScroll()"
82
+ class="p-1"
83
+ >
64
84
  <div class="h-full" role="listbox" aria-label="Suggestions">
65
- <ng-content>
66
- @for (option of optionsFilter.filteredList(); track option; let i = $index) {
67
- <<%= name %>-option [value]="option" [ayId]="ayId">
68
- @if (optionTemplate(); as ot) {
69
- <ng-template
70
- [ngTemplateOutlet]="ot.template"
71
- [ngTemplateOutletContext]="{ $implicit: option, index: i }"
72
- />
85
+ @if (virtualScroll()) {
86
+ @if (currentGroupLabel(); as groupLabel) {
87
+ <div
88
+ class="bg-popover text-muted-foreground pointer-events-none sticky top-0 z-10 px-2 py-1.5 text-sm font-medium"
89
+ >
90
+ {{ groupLabel }}
91
+ </div>
92
+ }
93
+ <ngb-virtualizer [itemSize]="itemSize()" [handleKeys]="false" class="h-95">
94
+ <div *virtualFor="let vItem of virtualItems()">
95
+ @if (vItem.type === 'group-header') {
96
+ <div class="bg-popover text-muted-foreground px-2 py-1.5 text-sm font-medium">
97
+ {{ vItem.label }}
98
+ </div>
73
99
  } @else {
74
- {{ option }}
100
+ <<%= name %>-option [value]="vItem.value" class="whitespace-nowrap">
101
+ @if (optionTemplate(); as ot) {
102
+ <ng-template
103
+ [ngTemplateOutlet]="ot.template"
104
+ [ngTemplateOutletContext]="{ $implicit: vItem.value }"
105
+ />
106
+ } @else {
107
+ {{ vItem.value }}
108
+ }
109
+ </<%= name %>-option>
75
110
  }
76
- </<%= name %>-option>
77
- }
78
- </ng-content>
111
+ </div>
112
+ </ngb-virtualizer>
113
+ } @else {
114
+ <ng-content>
115
+ @for (option of optionsFilter.filteredList(); track option; let i = $index) {
116
+ <<%= name %>-option [value]="option">
117
+ @if (optionTemplate(); as ot) {
118
+ <ng-template
119
+ [ngTemplateOutlet]="ot.template"
120
+ [ngTemplateOutletContext]="{ $implicit: option, index: i }"
121
+ />
122
+ } @else {
123
+ {{ option }}
124
+ }
125
+ </<%= name %>-option>
126
+ }
127
+ </ng-content>
128
+ }
79
129
  </div>
80
130
  </div>
81
131
  <ng-content select=".select-footer" />
@@ -89,7 +139,34 @@ export class SelectOption<T> {}
89
139
  })
90
140
  export class Select<T> extends NgbSelect<T> {
91
141
  readonly noIcon = input(false, { transform: booleanAttribute });
142
+ readonly virtualizer = viewChild(Virtualizer);
143
+
144
+ readonly currentGroupLabel = computed(() => {
145
+ const v = this.virtualizer();
146
+ if (!v || !this.virtualScroll()) return '';
147
+ const scrollPos = v.scrollPosition();
148
+ const items = this.virtualItems();
149
+ if (!items.length) return '';
150
+
151
+ const topIndex = Math.floor(scrollPos / this.itemSize());
152
+ // Scan backwards from topIndex to find the last group-header
153
+ for (let i = Math.min(topIndex, items.length - 1); i >= 0; i--) {
154
+ if (items[i].type === 'group-header') {
155
+ // Hide if this group header is still visible (i.e. it's within or at the top of viewport)
156
+ if (i >= topIndex) return '';
157
+ return items[i].label || '';
158
+ }
159
+ }
160
+ return '';
161
+ });
162
+
92
163
  override defaultOptions: Partial<PopoverOptions> = {
93
164
  sideOffset: 16,
94
165
  };
166
+
167
+ constructor() {
168
+ super();
169
+ // Wire up scrollToIndex for keyboard navigation
170
+ this.scrollToIndexFn.set((index: number) => this.virtualizer()?.scrollToIndex(index));
171
+ }
95
172
  }
@@ -64,11 +64,19 @@ const DEFAULT_BREAKPOINTS: SidenavBreakpoints = {
64
64
  md: { query: '(max-width: 768px)', mode: 'over' },
65
65
  };
66
66
 
67
- export function sidenavResponsive(
68
- sidenav: Signal<Sidenav>,
69
- breakpointConfig: SidenavBreakpoints = DEFAULT_BREAKPOINTS,
70
- defaultMode: SidenavType = 'side',
71
- ) {
67
+ export interface SidenavResponsiveOptions {
68
+ /** Breakpoint configuration mapping names to queries and modes */
69
+ breakpoints?: SidenavBreakpoints;
70
+ /** Default mode when no breakpoint matches (default: 'side') */
71
+ defaultMode?: SidenavType;
72
+ /** Initial show state. If not provided, defaults to true when no breakpoint matches */
73
+ initialShow?: boolean;
74
+ }
75
+
76
+ export function sidenavResponsive(sidenav: Signal<Sidenav>, options?: SidenavResponsiveOptions) {
77
+ const breakpointConfig = options?.breakpoints ?? DEFAULT_BREAKPOINTS;
78
+ const defaultMode = options?.defaultMode ?? 'side';
79
+
72
80
  const breakpoints = breakpointObserver();
73
81
 
74
82
  // Build the queries record: { md: '(max-width: 768px)', lg: '(max-width: 1200px)' }
@@ -91,11 +99,11 @@ export function sidenavResponsive(
91
99
  },
92
100
  });
93
101
 
94
- // Initially hidden if any breakpoint matches
102
+ // Use provided initialShow, or default to true when no breakpoint matches
95
103
  const initialMatch = Object.values(breakpointConfig).some(({ query }) =>
96
104
  breakpoints.matches(query),
97
105
  );
98
- const show = signal(!initialMatch);
106
+ const show = signal(options?.initialShow ?? !initialMatch);
99
107
 
100
108
  function toggle() {
101
109
  sidenav().toggle();
@@ -107,5 +115,5 @@ export function sidenavResponsive(
107
115
  );
108
116
  }
109
117
 
110
- return { show, mode, toggle, toggleMode };
118
+ return { show, mode, toggle, toggleMode, state: bp.state };
111
119
  }
@@ -11,7 +11,7 @@ import { NgbSwitch, NgbSwitchLabel, NgbSwitchThumb, NgbSwitchTrack } from '@ngba
11
11
  template: `
12
12
  <button
13
13
  ngbSwitchTrack
14
- class="bg-muted aria-[checked=true]:bg-primary relative w-9 rounded-full border-2 border-transparent transition-colors"
14
+ class="bg-muted aria-checked:bg-primary relative w-9 rounded-full border-2 border-transparent transition-colors"
15
15
  >
16
16
  <span
17
17
  #thumb="ngbSwitchThumb"
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, EffectRef } from '@angular/core';
2
+ import { EffectRef, InjectionToken } from '@angular/core';
3
3
  import * as i1 from '@ngbase/adk/drag';
4
4
  import { FormValueControl } from '@angular/forms/signals';
5
5
 
@@ -60,7 +60,7 @@ declare class AutoHeight {
60
60
 
61
61
  declare class NgbLabel {
62
62
  private readonly formField;
63
- readonly id: string;
63
+ readonly id: string | undefined;
64
64
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgbLabel, never>;
65
65
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NgbLabel, "[ngbLabel]", never, {}, {}, never, never, true, never>;
66
66
  }
@@ -1,7 +1,7 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { ElementRef, ViewContainerRef, InjectionToken, Type, TemplateRef, Injector, ComponentRef, EmbeddedViewRef } from '@angular/core';
3
3
  import * as rxjs from 'rxjs';
4
- import { Subject } from 'rxjs';
4
+ import { ReplaySubject } from 'rxjs';
5
5
 
6
6
  type DialogInput<T = any> = Type<T> | TemplateRef<any>;
7
7
  declare abstract class BaseDialog {
@@ -42,7 +42,7 @@ declare class DialogRef<T = any> {
42
42
  onDestroy: rxjs.Observable<unknown>;
43
43
  private afterClosedSource;
44
44
  afterClosed: rxjs.Observable<any>;
45
- events: Subject<"created">;
45
+ events: ReplaySubject<"created">;
46
46
  private _parent;
47
47
  private _children;
48
48
  get parent(): DialogRef | null;
@@ -121,7 +121,6 @@ declare class PortalService {
121
121
  private appRef;
122
122
  private environmentInjector;
123
123
  private trackElements;
124
- constructor();
125
124
  private componentCreator;
126
125
  appendComponentToBody<T>(component: Type<T>): ComponentRef<T>;
127
126
  create<T>(component: Type<T>, injector: Injector, container: string): ComponentRef<T>;
@@ -44,10 +44,10 @@ declare class NgbResizable {
44
44
  readonly max: _angular_core.InputSignal<string | number | undefined>;
45
45
  readonly lSize: _angular_core.WritableSignal<string | number>;
46
46
  readonly draggable: _angular_core.WritableSignal<boolean>;
47
- reducedSize: number;
47
+ private reducedSize;
48
48
  private localMinSize;
49
49
  private localMaxSize;
50
- private initialReducedSize;
50
+ private lastReducedSize;
51
51
  index: number;
52
52
  str: string;
53
53
  constructor();
@@ -58,7 +58,7 @@ declare class NgbResizable {
58
58
  onDrag(data: DragData): void;
59
59
  handleDrag(event?: DragData): void;
60
60
  private getUpdatedSize;
61
- updateSize(delta: number, direct: 'prev' | 'next', force?: boolean): void;
61
+ updateSize(px: number, direct: 'both' | 'prev' | 'next'): void;
62
62
  private calculateSize;
63
63
  private updateFlex;
64
64
  updateElementSize(str: string): void;
@@ -1,7 +1,7 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { ElementRef } from '@angular/core';
3
3
  import * as i1 from '@ngbase/adk/drag';
4
- import { DragData, Drag } from '@ngbase/adk/drag';
4
+ import { Drag, DragData } from '@ngbase/adk/drag';
5
5
 
6
6
  type ScrollBarOrientation = 'vertical' | 'horizontal' | 'both';
7
7
  declare class NgbScrollBar {