ngx-kit 7.2.0 → 7.3.1

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 (72) hide show
  1. package/angle-selector/README.md +34 -34
  2. package/box-shadow/README.md +33 -33
  3. package/color-picker/README.md +52 -52
  4. package/{shared → core}/README.md +117 -117
  5. package/data-table/README.md +120 -120
  6. package/date-picker/README.md +74 -74
  7. package/dialog/README.md +122 -92
  8. package/drag-resize/README.md +53 -55
  9. package/fesm2022/ngx-kit-angle-selector.mjs +9 -26
  10. package/fesm2022/ngx-kit-angle-selector.mjs.map +1 -1
  11. package/fesm2022/ngx-kit-box-shadow.mjs +330 -356
  12. package/fesm2022/ngx-kit-box-shadow.mjs.map +1 -1
  13. package/fesm2022/ngx-kit-color-picker.mjs +132 -272
  14. package/fesm2022/ngx-kit-color-picker.mjs.map +1 -1
  15. package/fesm2022/{ngx-kit-shared.mjs → ngx-kit-core.mjs} +845 -277
  16. package/fesm2022/ngx-kit-core.mjs.map +1 -0
  17. package/fesm2022/ngx-kit-data-table.mjs +3 -3
  18. package/fesm2022/ngx-kit-data-table.mjs.map +1 -1
  19. package/fesm2022/ngx-kit-date-picker.mjs +153 -147
  20. package/fesm2022/ngx-kit-date-picker.mjs.map +1 -1
  21. package/fesm2022/ngx-kit-dialog.mjs +430 -331
  22. package/fesm2022/ngx-kit-dialog.mjs.map +1 -1
  23. package/fesm2022/ngx-kit-drag-resize.mjs +126 -45
  24. package/fesm2022/ngx-kit-drag-resize.mjs.map +1 -1
  25. package/fesm2022/ngx-kit-drawer-menu.mjs +2 -2
  26. package/fesm2022/ngx-kit-drawer-menu.mjs.map +1 -1
  27. package/fesm2022/ngx-kit-dropzone.mjs.map +1 -1
  28. package/fesm2022/ngx-kit-form-field.mjs.map +1 -1
  29. package/fesm2022/ngx-kit-gallery.mjs +3 -3
  30. package/fesm2022/ngx-kit-gallery.mjs.map +1 -1
  31. package/fesm2022/ngx-kit-gradient-picker.mjs +20 -38
  32. package/fesm2022/ngx-kit-gradient-picker.mjs.map +1 -1
  33. package/fesm2022/ngx-kit-grid-layout.mjs +19 -18
  34. package/fesm2022/ngx-kit-grid-layout.mjs.map +1 -1
  35. package/fesm2022/ngx-kit-image-editor.mjs +3 -3
  36. package/fesm2022/ngx-kit-image-editor.mjs.map +1 -1
  37. package/fesm2022/ngx-kit-menu.mjs +1 -1
  38. package/fesm2022/ngx-kit-menu.mjs.map +1 -1
  39. package/fesm2022/ngx-kit-message.mjs +1 -1
  40. package/fesm2022/ngx-kit-message.mjs.map +1 -1
  41. package/fesm2022/ngx-kit-notify.mjs +1 -1
  42. package/fesm2022/ngx-kit-notify.mjs.map +1 -1
  43. package/fesm2022/ngx-kit-time-picker.mjs +1 -1
  44. package/fesm2022/ngx-kit-time-picker.mjs.map +1 -1
  45. package/fesm2022/ngx-kit-virtual-scroll.mjs +2 -2
  46. package/fesm2022/ngx-kit-virtual-scroll.mjs.map +1 -1
  47. package/gallery/README.md +71 -71
  48. package/gradient-picker/README.md +41 -41
  49. package/grid-layout/README.md +64 -64
  50. package/image-editor/README.md +44 -44
  51. package/menu/README.md +85 -85
  52. package/message/README.md +70 -70
  53. package/notify/README.md +56 -56
  54. package/package.json +5 -9
  55. package/time-picker/README.md +89 -89
  56. package/types/ngx-kit-angle-selector.d.ts +13 -16
  57. package/types/ngx-kit-box-shadow.d.ts +37 -95
  58. package/types/ngx-kit-color-picker.d.ts +61 -58
  59. package/types/{ngx-kit-shared.d.ts → ngx-kit-core.d.ts} +156 -34
  60. package/types/ngx-kit-data-table.d.ts +2 -2
  61. package/types/ngx-kit-date-picker.d.ts +30 -29
  62. package/types/ngx-kit-dialog.d.ts +208 -107
  63. package/types/ngx-kit-drag-resize.d.ts +33 -6
  64. package/types/ngx-kit-gradient-picker.d.ts +4 -7
  65. package/types/ngx-kit-grid-layout.d.ts +0 -1
  66. package/types/ngx-kit-menu.d.ts +1 -1
  67. package/types/ngx-kit-time-picker.d.ts +1 -1
  68. package/virtual-scroll/README.md +199 -199
  69. package/fesm2022/ngx-kit-shared.mjs.map +0 -1
  70. package/fesm2022/ngx-kit-webflow.mjs +0 -709
  71. package/fesm2022/ngx-kit-webflow.mjs.map +0 -1
  72. package/types/ngx-kit-webflow.d.ts +0 -286
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-kit-notify.mjs","sources":["../../../projects/libs/notify/models/notify-config.ts","../../../projects/libs/notify/notify-facade.ts","../../../projects/libs/notify/components/notification.component.ts","../../../projects/libs/notify/components/notification.component.html","../../../projects/libs/notify/services/notify.service.ts","../../../projects/libs/notify/notify-provider.ts","../../../projects/libs/notify/ngx-kit-notify.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { NgxNotifyOptions } from './notify-options';\nimport { NgxNotifyService } from '../services/notify.service';\n\nexport const NGX_NOTIFY_CONFIG = new InjectionToken<NgxNotifyOptions>('NgxNotifyOption');\nexport const NGX_NOTIFY_API = new InjectionToken<NgxNotifyService>('NgxNotifyService');\n\nexport const NGX_NOTIFY_DEFAULTS: Required<NgxNotifyOptions> = {\n timeout: 3000,\n position: 'top-center',\n maxVisible: 10,\n allowHtml: false,\n pauseOnHover: true,\n dismissible: true,\n closeOnTap: true,\n containerClass: 'ngx-bg-notify',\n notificationClass: 'ngx-notify',\n};\n","import { Injector } from '@angular/core';\nimport { NgxNotifyOptions } from './models/notify-options';\nimport { NGX_NOTIFY_API } from './models/notify-config';\nimport { NgxNotifyPayload } from './models/notify.model';\n\n/**\n * Static facade so call sites can use: Notify.warn('msg', opts)\n * Module will set the service instance in its constructor.\n */\nexport class Notify {\n static injector: Injector;\n\n static show(\n type: 'info' | 'success' | 'warning' | 'error' = 'info',\n message: string,\n description?: string,\n options?: NgxNotifyOptions,\n ): NgxNotifyPayload {\n if (!Notify.injector) {\n throw new Error(\n 'ngx-kit: Error on EnvironmentProvider. Ensure \"provideNotify()\" in root provider.',\n );\n }\n return Notify.injector.get(NGX_NOTIFY_API).show(message, description, type, options);\n }\n\n static info(message: string, description?: string, options?: NgxNotifyOptions) {\n return this.show('info', message, description, options);\n }\n\n static success(message: string, description?: string, options?: NgxNotifyOptions) {\n return this.show('success', message, description, options);\n }\n static warning(message: string, description?: string, options?: NgxNotifyOptions) {\n return this.show('warning', message, description, options);\n }\n static error(message: string, description?: string, options?: NgxNotifyOptions) {\n return this.show('error', message, description, options);\n }\n}\n","import {\n Component,\n OnInit,\n OnDestroy,\n Input,\n ChangeDetectorRef,\n DOCUMENT,\n inject,\n ElementRef,\n afterNextRender,\n signal,\n output,\n input,\n effect,\n viewChild,\n} from '@angular/core';\nimport { INotifyEnd, NgxNotifyPayload } from '../models/notify.model';\nimport { CommonModule } from '@angular/common';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\n@Component({\n selector: 'ngx-notification',\n templateUrl: './notification.component.html',\n styleUrls: ['./notification.component.scss'],\n imports: [CommonModule],\n})\nexport class NgxNotificationComponent implements OnInit, OnDestroy {\n payload = input.required<NgxNotifyPayload>();\n @Input() containerClass = 'ngx-notify';\n\n bar = viewChild<ElementRef<HTMLElement>>('bar');\n onClose = output<INotifyEnd>();\n onFinish = output<INotifyEnd>();\n\n private _rafId = 0;\n private _duration = 0;\n private _remaining = 0;\n private _endTs = 0;\n private _paused = false;\n\n safeMessage: SafeHtml | string = '';\n safeDescription: SafeHtml | string = '';\n showClass = signal('');\n protected doc = inject(DOCUMENT);\n protected el = inject(ElementRef);\n protected sanitizer = inject(DomSanitizer);\n protected chdr = inject(ChangeDetectorRef);\n constructor() {\n afterNextRender(() => {\n this.showClass.set('ngx-show');\n this.chdr.detectChanges();\n });\n effect(() => {\n const payload = this.payload();\n\n // decide how to render message\n if (payload.options.allowHtml) {\n this.safeMessage = this.sanitizer.bypassSecurityTrustHtml(payload.message);\n this.safeDescription = this.sanitizer.bypassSecurityTrustHtml(payload.description ?? '');\n } else {\n this.safeMessage = this.escapeHtml(payload.message);\n this.safeDescription = this.escapeHtml(payload.description);\n }\n });\n effect(() => {\n const timeout = this.payload().options.timeout ?? 0;\n this.startTimer(timeout);\n });\n }\n\n ngOnInit(): void {}\n\n ngOnDestroy(): void {\n this.clearTimer();\n }\n\n // Public API to start timer (used by service when created)\n startTimer(ms: number) {\n this.clearTimer();\n\n if (!this._paused) {\n this._duration = ms;\n }\n this._remaining = ms;\n this._endTs = performance.now() + ms;\n\n const bar = this.bar()?.nativeElement;\n if (bar) {\n bar.style.transition = `transform ${ms}ms linear`;\n bar.style.transform = 'scaleX(1)';\n }\n\n this.animateProgress();\n }\n pauseTimer() {\n this._paused = true;\n cancelAnimationFrame(this._rafId);\n this._remaining = Math.max(0, this._endTs - performance.now());\n const bar = this.bar()?.nativeElement;\n if (bar) {\n const matrix = getComputedStyle(bar).transform;\n bar.style.transition = 'none';\n bar.style.transform = matrix;\n }\n }\n\n resumeTimer() {\n if (!this._paused || this._remaining <= 0) {\n return;\n }\n\n this._paused = false;\n\n this.startTimer(this._remaining);\n }\n\n private clearTimer() {\n cancelAnimationFrame(this._rafId);\n this._rafId = 0;\n }\n\n private animateProgress() {\n const update = () => {\n const remaining = Math.max(0, this._endTs - performance.now());\n if (remaining <= 0) {\n this.onFinish.emit({\n id: this.payload().id,\n el: this.el.nativeElement,\n });\n return;\n }\n\n this._rafId = requestAnimationFrame(update);\n };\n\n this._rafId = requestAnimationFrame(update);\n }\n\n close(ev?: Event) {\n if (ev) ev.stopPropagation();\n this.onClose.emit({ id: this.payload().id, el: this.el.nativeElement });\n }\n\n onMouseEnter() {\n if (this.payload().options.pauseOnHover) this.pauseTimer();\n }\n onMouseLeave() {\n if (this.payload().options.pauseOnHover) this.resumeTimer();\n }\n onTap() {\n if (this.payload().options.closeOnTap) this.close();\n }\n\n escapeHtml(input?: string) {\n if (!input) return '';\n const div = this.doc.createElement('div');\n div.appendChild(this.doc.createTextNode(input));\n return div.textContent;\n }\n}\n","<div\n class=\"{{ containerClass }} {{ containerClass }}-{{ payload().type }} {{ showClass() }}\"\n role=\"status\"\n (mouseenter)=\"onMouseEnter()\"\n (mouseleave)=\"onMouseLeave()\"\n (click)=\"onTap()\"\n [attr.aria-live]=\"\n payload().type === 'error' || payload().type === 'warning' ? 'assertive' : 'polite'\n \"\n [attr.data-id]=\"payload().id\">\n <div class=\"ngx-notify-icon-container\">\n <div class=\"ngx-notify-icon\">\n @switch (payload().type) {\n @case ('success') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\">\n <path\n fill=\"currentColor\"\n d=\"M235.3 331.3C229.1 337.6 218.9 337.6 212.7 331.3L148.7 267.3C142.4 261.1 142.4 250.9 148.7 244.7C154.9 238.4 165.1 238.4 171.3 244.7L224 297.4L340.7 180.7C346.9 174.4 357.1 174.4 363.3 180.7C369.6 186.9 369.6 197.1 363.3 203.3L235.3 331.3zM512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM256 32C132.3 32 32 132.3 32 256C32 379.7 132.3 480 256 480C379.7 480 480 379.7 480 256C480 132.3 379.7 32 256 32z\" />\n </svg>\n }\n @case ('error') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\">\n <path\n fill=\"currentColor\"\n d=\"M180.7 180.7C186.9 174.4 197.1 174.4 203.3 180.7L256 233.4L308.7 180.7C314.9 174.4 325.1 174.4 331.3 180.7C337.6 186.9 337.6 197.1 331.3 203.3L278.6 255.1L331.3 308.7C337.6 314.9 337.6 325.1 331.3 331.3C325.1 337.6 314.9 337.6 308.7 331.3L256 278.6L203.3 331.3C197.1 337.6 186.9 337.6 180.7 331.3C174.4 325.1 174.4 314.9 180.7 308.7L233.4 255.1L180.7 203.3C174.4 197.1 174.4 186.9 180.7 180.7V180.7zM.0669 191.5C.0669 172.4 7.652 154.1 21.16 140.6L140.6 21.15C154.1 7.648 172.4 .0625 191.5 .0625H320.5C339.6 .0625 357.9 7.648 371.4 21.15L490.8 140.6C504.3 154.1 511.9 172.4 511.9 191.5V320.5C511.9 339.6 504.3 357.9 490.8 371.4L371.4 490.8C357.9 504.3 339.6 511.9 320.5 511.9H191.5C172.4 511.9 154.1 504.3 140.6 490.8L21.15 371.4C7.652 357.9 .0666 339.6 .0666 320.5L.0669 191.5zM43.78 163.2C36.28 170.7 32.07 180.9 32.07 191.5V320.5C32.07 331.1 36.28 341.3 43.78 348.8L163.2 468.2C170.7 475.7 180.9 479.9 191.5 479.9H320.5C331.1 479.9 341.3 475.7 348.8 468.2L468.2 348.8C475.7 341.3 479.9 331.1 479.9 320.5V191.5C479.9 180.9 475.7 170.7 468.2 163.2L348.8 43.78C341.3 36.28 331.1 32.06 320.5 32.06H191.5C180.9 32.06 170.7 36.28 163.2 43.78L43.78 163.2zM43.78 348.8L21.15 371.4z\" />\n </svg>\n }\n @case ('warning') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\">\n <path\n fill=\"currentColor\"\n d=\"M256 360c-13.25 0-23.1 10.74-23.1 24c0 13.25 10.75 24 23.1 24c13.25 0 23.1-10.75 23.1-24C280 370.7 269.3 360 256 360zM256 320c8.843 0 15.1-7.156 15.1-16V160c0-8.844-7.155-16-15.1-16S240 151.2 240 160v144C240 312.8 247.2 320 256 320zM504.3 397.3L304.5 59.38C294.4 42.27 276.2 32.03 256 32C235.8 32 217.7 42.22 207.5 59.36l-199.9 338c-10.05 16.97-10.2 37.34-.4218 54.5C17.29 469.5 35.55 480 56.1 480h399.9c20.51 0 38.75-10.53 48.81-28.17C514.6 434.7 514.4 414.3 504.3 397.3zM476.1 435.1C472.7 443.5 464.8 448 455.1 448H56.1c-8.906 0-16.78-4.484-21.08-12c-4.078-7.156-4.015-15.3 .1562-22.36L235.1 75.66C239.4 68.36 247.2 64 256 64c0 0-.0156 0 0 0c8.765 .0156 16.56 4.359 20.86 11.64l199.9 338C480.1 420.7 481.1 428.8 476.1 435.1z\" />\n </svg>\n }\n @case ('info') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\">\n <path\n fill=\"currentColor\"\n d=\"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 480c-123.5 0-224-100.5-224-224s100.5-224 224-224s224 100.5 224 224S379.5 480 256 480zM256 184c13.25 0 24-10.74 24-24c0-13.25-10.75-24-24-24S232 146.7 232 160C232 173.3 242.7 184 256 184zM304 352h-32V240C272 231.2 264.8 224 256 224H224C215.2 224 208 231.2 208 240S215.2 256 224 256h16v96h-32C199.2 352 192 359.2 192 368C192 376.8 199.2 384 208 384h96c8.836 0 16-7.164 16-16C320 359.2 312.8 352 304 352z\" />\n </svg>\n }\n }\n </div>\n </div>\n\n <div class=\"ngx-notify-content\">\n <div class=\"ngx-notify-title\" [innerHTML]=\"safeMessage\"></div>\n <div class=\"ngx-notify-description\" [innerHTML]=\"safeDescription\"></div>\n </div>\n\n @if (payload().options.dismissible) {\n <div class=\"ngx-notify-close-container\">\n <button class=\"ngx-notify-close\" (click)=\"close($event)\" aria-label=\"close\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\n <path\n fill=\"currentColor\"\n d=\"M315.3 411.3c-6.253 6.253-16.37 6.253-22.63 0L160 278.6l-132.7 132.7c-6.253 6.253-16.37 6.253-22.63 0c-6.253-6.253-6.253-16.37 0-22.63L137.4 256L4.69 123.3c-6.253-6.253-6.253-16.37 0-22.63c6.253-6.253 16.37-6.253 22.63 0L160 233.4l132.7-132.7c6.253-6.253 16.37-6.253 22.63 0c6.253 6.253 6.253 16.37 0 22.63L182.6 256l132.7 132.7C321.6 394.9 321.6 405.1 315.3 411.3z\" />\n </svg>\n </button>\n </div>\n }\n\n <div class=\"ngx-notify-progress\">\n <div class=\"progress-bar\" #bar></div>\n </div>\n</div>\n","import {\n Injectable,\n ComponentRef,\n DOCUMENT,\n inject,\n createComponent,\n EnvironmentInjector,\n ApplicationRef,\n EventEmitter,\n} from '@angular/core';\nimport { NgxNotifyOptions } from '../models/notify-options';\nimport { INotifyEnd, NgxNotifyPayload, NgxNotifyType } from '../models/notify.model';\nimport { WINDOW } from 'ngx-kit/shared';\nimport { NGX_NOTIFY_CONFIG } from '../models/notify-config';\nimport { NgxNotificationComponent } from '../components/notification.component';\n\n// We'll include a tiny inline uuid fallback if uuid package is not available\nfunction makeId() {\n // simple random id\n return 'n_' + Math.random().toString(36).substr(2, 9);\n}\n\n@Injectable({ providedIn: 'root' })\nexport class NgxNotifyService {\n private queue: NgxNotifyPayload[] = [];\n private visible: { ref: ComponentRef<any>; payload: NgxNotifyPayload }[] = [];\n private container: HTMLElement | null = null;\n\n private envInjector = inject(EnvironmentInjector);\n private appRef = inject(ApplicationRef);\n private doc = inject(DOCUMENT);\n private win = inject(WINDOW);\n private defaultOptions = inject(NGX_NOTIFY_CONFIG);\n constructor() {}\n\n configureContainer(position: NgxNotifyOptions['position'], containerClass: string) {\n if (!this.container) {\n this.container = this.doc.createElement('div');\n this.doc.body.appendChild(this.container);\n }\n\n this.container.className = containerClass + ' ngx-notify-container ' + `ngx-pos-${position}`;\n this.container.style.position = 'fixed';\n this.container.style.zIndex = '99999';\n\n // center special\n if (position === 'center') {\n this.container.style.left = '50%';\n this.container.style.top = '50%';\n this.container.style.transform = 'translate(-50%,-50%)';\n this.container.style.display = 'flex';\n this.container.style.flexDirection = 'column';\n this.container.style.alignItems = 'center';\n this.container.style.pointerEvents = 'none';\n } else {\n if (position?.includes('center')) {\n this.container.style.left = '50%';\n this.container.style.transform = 'translateX(-50%)';\n } else {\n this.container.style.transform = 'translateX(0)';\n }\n // corners\n if (position?.includes('top')) {\n this.container.style.top = '20px';\n } else {\n this.container.style.bottom = '20px';\n }\n if (position?.includes('left')) {\n this.container.style.left = '20px';\n this.container.style.right = 'auto';\n }\n if (position?.includes('right')) {\n this.container.style.right = '20px';\n this.container.style.left = 'auto';\n }\n // else container.style.right = '20px';\n this.container.style.display = 'flex';\n this.container.style.flexDirection = 'column';\n if (position?.includes('bottom')) this.container.style.flexDirection = 'column-reverse';\n this.container.style.pointerEvents = 'none';\n }\n }\n\n show(\n message: string,\n description?: string,\n type: NgxNotifyType = 'info',\n options?: NgxNotifyOptions,\n ) {\n const opts: NgxNotifyOptions = { ...this.defaultOptions, ...(options || {}) };\n const id =\n typeof (this.win as any).crypto?.randomUUID === 'function'\n ? (this.win as any).crypto.randomUUID()\n : makeId();\n\n const payload: NgxNotifyPayload = {\n id,\n message,\n description,\n type,\n options: opts,\n onClose: new EventEmitter(),\n onFinish: new EventEmitter(),\n close: () => this.close(id),\n };\n\n this.configureContainer(opts.position!, opts.containerClass!);\n\n // queue or show immediately\n if (this.visible.length >= opts.maxVisible!) {\n this.queue.push(payload);\n } else {\n this._createAndShow(payload);\n }\n return payload;\n }\n\n private _createAndShow(payload: NgxNotifyPayload) {\n if (!this.container)\n this.configureContainer(payload.options.position!, payload.options.containerClass!);\n const host = document.createElement('div');\n this.container!.appendChild(host);\n\n const compRef = createComponent(NgxNotificationComponent, {\n environmentInjector: this.envInjector,\n hostElement: host,\n });\n\n compRef.setInput('payload', payload);\n compRef.instance.onClose.subscribe((d) => {\n this.removeEl(d);\n payload.onClose.emit(d);\n });\n compRef.instance.onFinish.subscribe((d) => {\n this.removeEl(d);\n payload.onFinish.emit(d);\n payload.onClose.emit(d);\n });\n\n // Registers the component’s view so it participates in change detection cycle.\n this.appRef.attachView(compRef.hostView);\n // store visible\n this.visible.push({ ref: compRef, payload });\n }\n\n private close(id: string) {\n const el = this.visible.find((x) => x.payload.id == id)?.ref?.instance?.el;\n if (el) {\n this.removeEl({ id, el });\n }\n // if in queue remove it\n this.queue = this.queue.filter((q) => q.id !== id);\n }\n private removeNode(node: HTMLElement, id: string) {\n node.style.opacity = '0';\n node.style.transform = 'translateY(-30px)';\n node.style.transition = 'all 300ms';\n setTimeout(() => {\n const item = this.visible.find((x) => x.payload.id === id);\n if (item) {\n this.appRef.detachView(item.ref.hostView);\n item.ref.destroy();\n }\n this.visible = this.visible.filter((v) => v.payload.id !== id);\n // show next in queue\n this._showNextIfPossible();\n }, 300);\n }\n\n private removeEl(d: INotifyEnd) {\n if (d.el) this.removeNode(d.el, d.id);\n else {\n // if in queue remove it\n this.queue = this.queue.filter((q) => q.id !== d.id);\n }\n }\n\n private _showNextIfPossible() {\n if (!this.queue.length) return;\n const next = this.queue.shift()!;\n // ensure we don't exceed maxVisible\n if (this.visible.length < next.options.maxVisible!) {\n this._createAndShow(next);\n } else {\n // push back\n this.queue.unshift(next);\n }\n }\n}\n","import {\n EnvironmentProviders,\n inject,\n Injector,\n makeEnvironmentProviders,\n provideEnvironmentInitializer,\n} from '@angular/core';\nimport { NGX_NOTIFY_API, NGX_NOTIFY_CONFIG, NGX_NOTIFY_DEFAULTS } from './models/notify-config';\nimport { NgxNotifyOptions } from './models/notify-options';\nimport { Notify as NotifyFacade } from './notify-facade';\nimport { NgxNotifyService } from './services/notify.service';\nexport function provideNotify(options?: NgxNotifyOptions): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: NGX_NOTIFY_CONFIG,\n useValue: { ...NGX_NOTIFY_DEFAULTS, ...(options || {}) },\n },\n {\n provide: NGX_NOTIFY_API,\n useExisting: NgxNotifyService,\n },\n provideEnvironmentInitializer(() => {\n NotifyFacade.injector = inject(Injector);\n }),\n ]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["NotifyFacade"],"mappings":"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"}
1
+ {"version":3,"file":"ngx-kit-notify.mjs","sources":["../../../projects/libs/notify/models/notify-config.ts","../../../projects/libs/notify/notify-facade.ts","../../../projects/libs/notify/components/notification.component.ts","../../../projects/libs/notify/components/notification.component.html","../../../projects/libs/notify/services/notify.service.ts","../../../projects/libs/notify/notify-provider.ts","../../../projects/libs/notify/ngx-kit-notify.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { NgxNotifyOptions } from './notify-options';\nimport { NgxNotifyService } from '../services/notify.service';\n\nexport const NGX_NOTIFY_CONFIG = new InjectionToken<NgxNotifyOptions>('NgxNotifyOption');\nexport const NGX_NOTIFY_API = new InjectionToken<NgxNotifyService>('NgxNotifyService');\n\nexport const NGX_NOTIFY_DEFAULTS: Required<NgxNotifyOptions> = {\n timeout: 3000,\n position: 'top-center',\n maxVisible: 10,\n allowHtml: false,\n pauseOnHover: true,\n dismissible: true,\n closeOnTap: true,\n containerClass: 'ngx-bg-notify',\n notificationClass: 'ngx-notify',\n};\n","import { Injector } from '@angular/core';\nimport { NgxNotifyOptions } from './models/notify-options';\nimport { NGX_NOTIFY_API } from './models/notify-config';\nimport { NgxNotifyPayload } from './models/notify.model';\n\n/**\n * Static facade so call sites can use: Notify.warn('msg', opts)\n * Module will set the service instance in its constructor.\n */\nexport class Notify {\n static injector: Injector;\n\n static show(\n type: 'info' | 'success' | 'warning' | 'error' = 'info',\n message: string,\n description?: string,\n options?: NgxNotifyOptions,\n ): NgxNotifyPayload {\n if (!Notify.injector) {\n throw new Error(\n 'ngx-kit: Error on EnvironmentProvider. Ensure \"provideNotify()\" in root provider.',\n );\n }\n return Notify.injector.get(NGX_NOTIFY_API).show(message, description, type, options);\n }\n\n static info(message: string, description?: string, options?: NgxNotifyOptions) {\n return this.show('info', message, description, options);\n }\n\n static success(message: string, description?: string, options?: NgxNotifyOptions) {\n return this.show('success', message, description, options);\n }\n static warning(message: string, description?: string, options?: NgxNotifyOptions) {\n return this.show('warning', message, description, options);\n }\n static error(message: string, description?: string, options?: NgxNotifyOptions) {\n return this.show('error', message, description, options);\n }\n}\n","import {\n Component,\n OnInit,\n OnDestroy,\n Input,\n ChangeDetectorRef,\n DOCUMENT,\n inject,\n ElementRef,\n afterNextRender,\n signal,\n output,\n input,\n effect,\n viewChild,\n} from '@angular/core';\nimport { INotifyEnd, NgxNotifyPayload } from '../models/notify.model';\nimport { CommonModule } from '@angular/common';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\n@Component({\n selector: 'ngx-notification',\n templateUrl: './notification.component.html',\n styleUrls: ['./notification.component.scss'],\n imports: [CommonModule],\n})\nexport class NgxNotificationComponent implements OnInit, OnDestroy {\n payload = input.required<NgxNotifyPayload>();\n @Input() containerClass = 'ngx-notify';\n\n bar = viewChild<ElementRef<HTMLElement>>('bar');\n onClose = output<INotifyEnd>();\n onFinish = output<INotifyEnd>();\n\n private _rafId = 0;\n private _duration = 0;\n private _remaining = 0;\n private _endTs = 0;\n private _paused = false;\n\n safeMessage: SafeHtml | string = '';\n safeDescription: SafeHtml | string = '';\n showClass = signal('');\n protected doc = inject(DOCUMENT);\n protected el = inject(ElementRef);\n protected sanitizer = inject(DomSanitizer);\n protected chdr = inject(ChangeDetectorRef);\n constructor() {\n afterNextRender(() => {\n this.showClass.set('ngx-show');\n this.chdr.detectChanges();\n });\n effect(() => {\n const payload = this.payload();\n\n // decide how to render message\n if (payload.options.allowHtml) {\n this.safeMessage = this.sanitizer.bypassSecurityTrustHtml(payload.message);\n this.safeDescription = this.sanitizer.bypassSecurityTrustHtml(payload.description ?? '');\n } else {\n this.safeMessage = this.escapeHtml(payload.message);\n this.safeDescription = this.escapeHtml(payload.description);\n }\n });\n effect(() => {\n const timeout = this.payload().options.timeout ?? 0;\n this.startTimer(timeout);\n });\n }\n\n ngOnInit(): void {}\n\n ngOnDestroy(): void {\n this.clearTimer();\n }\n\n // Public API to start timer (used by service when created)\n startTimer(ms: number) {\n this.clearTimer();\n\n if (!this._paused) {\n this._duration = ms;\n }\n this._remaining = ms;\n this._endTs = performance.now() + ms;\n\n const bar = this.bar()?.nativeElement;\n if (bar) {\n bar.style.transition = `transform ${ms}ms linear`;\n bar.style.transform = 'scaleX(1)';\n }\n\n this.animateProgress();\n }\n pauseTimer() {\n this._paused = true;\n cancelAnimationFrame(this._rafId);\n this._remaining = Math.max(0, this._endTs - performance.now());\n const bar = this.bar()?.nativeElement;\n if (bar) {\n const matrix = getComputedStyle(bar).transform;\n bar.style.transition = 'none';\n bar.style.transform = matrix;\n }\n }\n\n resumeTimer() {\n if (!this._paused || this._remaining <= 0) {\n return;\n }\n\n this._paused = false;\n\n this.startTimer(this._remaining);\n }\n\n private clearTimer() {\n cancelAnimationFrame(this._rafId);\n this._rafId = 0;\n }\n\n private animateProgress() {\n const update = () => {\n const remaining = Math.max(0, this._endTs - performance.now());\n if (remaining <= 0) {\n this.onFinish.emit({\n id: this.payload().id,\n el: this.el.nativeElement,\n });\n return;\n }\n\n this._rafId = requestAnimationFrame(update);\n };\n\n this._rafId = requestAnimationFrame(update);\n }\n\n close(ev?: Event) {\n if (ev) ev.stopPropagation();\n this.onClose.emit({ id: this.payload().id, el: this.el.nativeElement });\n }\n\n onMouseEnter() {\n if (this.payload().options.pauseOnHover) this.pauseTimer();\n }\n onMouseLeave() {\n if (this.payload().options.pauseOnHover) this.resumeTimer();\n }\n onTap() {\n if (this.payload().options.closeOnTap) this.close();\n }\n\n escapeHtml(input?: string) {\n if (!input) return '';\n const div = this.doc.createElement('div');\n div.appendChild(this.doc.createTextNode(input));\n return div.textContent;\n }\n}\n","<div\n class=\"{{ containerClass }} {{ containerClass }}-{{ payload().type }} {{ showClass() }}\"\n role=\"status\"\n (mouseenter)=\"onMouseEnter()\"\n (mouseleave)=\"onMouseLeave()\"\n (click)=\"onTap()\"\n [attr.aria-live]=\"\n payload().type === 'error' || payload().type === 'warning' ? 'assertive' : 'polite'\n \"\n [attr.data-id]=\"payload().id\">\n <div class=\"ngx-notify-icon-container\">\n <div class=\"ngx-notify-icon\">\n @switch (payload().type) {\n @case ('success') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\">\n <path\n fill=\"currentColor\"\n d=\"M235.3 331.3C229.1 337.6 218.9 337.6 212.7 331.3L148.7 267.3C142.4 261.1 142.4 250.9 148.7 244.7C154.9 238.4 165.1 238.4 171.3 244.7L224 297.4L340.7 180.7C346.9 174.4 357.1 174.4 363.3 180.7C369.6 186.9 369.6 197.1 363.3 203.3L235.3 331.3zM512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM256 32C132.3 32 32 132.3 32 256C32 379.7 132.3 480 256 480C379.7 480 480 379.7 480 256C480 132.3 379.7 32 256 32z\" />\n </svg>\n }\n @case ('error') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\">\n <path\n fill=\"currentColor\"\n d=\"M180.7 180.7C186.9 174.4 197.1 174.4 203.3 180.7L256 233.4L308.7 180.7C314.9 174.4 325.1 174.4 331.3 180.7C337.6 186.9 337.6 197.1 331.3 203.3L278.6 255.1L331.3 308.7C337.6 314.9 337.6 325.1 331.3 331.3C325.1 337.6 314.9 337.6 308.7 331.3L256 278.6L203.3 331.3C197.1 337.6 186.9 337.6 180.7 331.3C174.4 325.1 174.4 314.9 180.7 308.7L233.4 255.1L180.7 203.3C174.4 197.1 174.4 186.9 180.7 180.7V180.7zM.0669 191.5C.0669 172.4 7.652 154.1 21.16 140.6L140.6 21.15C154.1 7.648 172.4 .0625 191.5 .0625H320.5C339.6 .0625 357.9 7.648 371.4 21.15L490.8 140.6C504.3 154.1 511.9 172.4 511.9 191.5V320.5C511.9 339.6 504.3 357.9 490.8 371.4L371.4 490.8C357.9 504.3 339.6 511.9 320.5 511.9H191.5C172.4 511.9 154.1 504.3 140.6 490.8L21.15 371.4C7.652 357.9 .0666 339.6 .0666 320.5L.0669 191.5zM43.78 163.2C36.28 170.7 32.07 180.9 32.07 191.5V320.5C32.07 331.1 36.28 341.3 43.78 348.8L163.2 468.2C170.7 475.7 180.9 479.9 191.5 479.9H320.5C331.1 479.9 341.3 475.7 348.8 468.2L468.2 348.8C475.7 341.3 479.9 331.1 479.9 320.5V191.5C479.9 180.9 475.7 170.7 468.2 163.2L348.8 43.78C341.3 36.28 331.1 32.06 320.5 32.06H191.5C180.9 32.06 170.7 36.28 163.2 43.78L43.78 163.2zM43.78 348.8L21.15 371.4z\" />\n </svg>\n }\n @case ('warning') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\">\n <path\n fill=\"currentColor\"\n d=\"M256 360c-13.25 0-23.1 10.74-23.1 24c0 13.25 10.75 24 23.1 24c13.25 0 23.1-10.75 23.1-24C280 370.7 269.3 360 256 360zM256 320c8.843 0 15.1-7.156 15.1-16V160c0-8.844-7.155-16-15.1-16S240 151.2 240 160v144C240 312.8 247.2 320 256 320zM504.3 397.3L304.5 59.38C294.4 42.27 276.2 32.03 256 32C235.8 32 217.7 42.22 207.5 59.36l-199.9 338c-10.05 16.97-10.2 37.34-.4218 54.5C17.29 469.5 35.55 480 56.1 480h399.9c20.51 0 38.75-10.53 48.81-28.17C514.6 434.7 514.4 414.3 504.3 397.3zM476.1 435.1C472.7 443.5 464.8 448 455.1 448H56.1c-8.906 0-16.78-4.484-21.08-12c-4.078-7.156-4.015-15.3 .1562-22.36L235.1 75.66C239.4 68.36 247.2 64 256 64c0 0-.0156 0 0 0c8.765 .0156 16.56 4.359 20.86 11.64l199.9 338C480.1 420.7 481.1 428.8 476.1 435.1z\" />\n </svg>\n }\n @case ('info') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\">\n <path\n fill=\"currentColor\"\n d=\"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 480c-123.5 0-224-100.5-224-224s100.5-224 224-224s224 100.5 224 224S379.5 480 256 480zM256 184c13.25 0 24-10.74 24-24c0-13.25-10.75-24-24-24S232 146.7 232 160C232 173.3 242.7 184 256 184zM304 352h-32V240C272 231.2 264.8 224 256 224H224C215.2 224 208 231.2 208 240S215.2 256 224 256h16v96h-32C199.2 352 192 359.2 192 368C192 376.8 199.2 384 208 384h96c8.836 0 16-7.164 16-16C320 359.2 312.8 352 304 352z\" />\n </svg>\n }\n }\n </div>\n </div>\n\n <div class=\"ngx-notify-content\">\n <div class=\"ngx-notify-title\" [innerHTML]=\"safeMessage\"></div>\n <div class=\"ngx-notify-description\" [innerHTML]=\"safeDescription\"></div>\n </div>\n\n @if (payload().options.dismissible) {\n <div class=\"ngx-notify-close-container\">\n <button class=\"ngx-notify-close\" (click)=\"close($event)\" aria-label=\"close\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\n <path\n fill=\"currentColor\"\n d=\"M315.3 411.3c-6.253 6.253-16.37 6.253-22.63 0L160 278.6l-132.7 132.7c-6.253 6.253-16.37 6.253-22.63 0c-6.253-6.253-6.253-16.37 0-22.63L137.4 256L4.69 123.3c-6.253-6.253-6.253-16.37 0-22.63c6.253-6.253 16.37-6.253 22.63 0L160 233.4l132.7-132.7c6.253-6.253 16.37-6.253 22.63 0c6.253 6.253 6.253 16.37 0 22.63L182.6 256l132.7 132.7C321.6 394.9 321.6 405.1 315.3 411.3z\" />\n </svg>\n </button>\n </div>\n }\n\n <div class=\"ngx-notify-progress\">\n <div class=\"progress-bar\" #bar></div>\n </div>\n</div>\n","import {\n Injectable,\n ComponentRef,\n DOCUMENT,\n inject,\n createComponent,\n EnvironmentInjector,\n ApplicationRef,\n EventEmitter,\n} from '@angular/core';\nimport { NgxNotifyOptions } from '../models/notify-options';\nimport { INotifyEnd, NgxNotifyPayload, NgxNotifyType } from '../models/notify.model';\nimport { WINDOW } from 'ngx-kit/core';\nimport { NGX_NOTIFY_CONFIG } from '../models/notify-config';\nimport { NgxNotificationComponent } from '../components/notification.component';\n\n// We'll include a tiny inline uuid fallback if uuid package is not available\nfunction makeId() {\n // simple random id\n return 'n_' + Math.random().toString(36).substr(2, 9);\n}\n\n@Injectable({ providedIn: 'root' })\nexport class NgxNotifyService {\n private queue: NgxNotifyPayload[] = [];\n private visible: { ref: ComponentRef<any>; payload: NgxNotifyPayload }[] = [];\n private container: HTMLElement | null = null;\n\n private envInjector = inject(EnvironmentInjector);\n private appRef = inject(ApplicationRef);\n private doc = inject(DOCUMENT);\n private win = inject(WINDOW);\n private defaultOptions = inject(NGX_NOTIFY_CONFIG);\n constructor() {}\n\n configureContainer(position: NgxNotifyOptions['position'], containerClass: string) {\n if (!this.container) {\n this.container = this.doc.createElement('div');\n this.doc.body.appendChild(this.container);\n }\n\n this.container.className = containerClass + ' ngx-notify-container ' + `ngx-pos-${position}`;\n this.container.style.position = 'fixed';\n this.container.style.zIndex = '99999';\n\n // center special\n if (position === 'center') {\n this.container.style.left = '50%';\n this.container.style.top = '50%';\n this.container.style.transform = 'translate(-50%,-50%)';\n this.container.style.display = 'flex';\n this.container.style.flexDirection = 'column';\n this.container.style.alignItems = 'center';\n this.container.style.pointerEvents = 'none';\n } else {\n if (position?.includes('center')) {\n this.container.style.left = '50%';\n this.container.style.transform = 'translateX(-50%)';\n } else {\n this.container.style.transform = 'translateX(0)';\n }\n // corners\n if (position?.includes('top')) {\n this.container.style.top = '20px';\n } else {\n this.container.style.bottom = '20px';\n }\n if (position?.includes('left')) {\n this.container.style.left = '20px';\n this.container.style.right = 'auto';\n }\n if (position?.includes('right')) {\n this.container.style.right = '20px';\n this.container.style.left = 'auto';\n }\n // else container.style.right = '20px';\n this.container.style.display = 'flex';\n this.container.style.flexDirection = 'column';\n if (position?.includes('bottom')) this.container.style.flexDirection = 'column-reverse';\n this.container.style.pointerEvents = 'none';\n }\n }\n\n show(\n message: string,\n description?: string,\n type: NgxNotifyType = 'info',\n options?: NgxNotifyOptions,\n ) {\n const opts: NgxNotifyOptions = { ...this.defaultOptions, ...(options || {}) };\n const id =\n typeof (this.win as any).crypto?.randomUUID === 'function'\n ? (this.win as any).crypto.randomUUID()\n : makeId();\n\n const payload: NgxNotifyPayload = {\n id,\n message,\n description,\n type,\n options: opts,\n onClose: new EventEmitter(),\n onFinish: new EventEmitter(),\n close: () => this.close(id),\n };\n\n this.configureContainer(opts.position!, opts.containerClass!);\n\n // queue or show immediately\n if (this.visible.length >= opts.maxVisible!) {\n this.queue.push(payload);\n } else {\n this._createAndShow(payload);\n }\n return payload;\n }\n\n private _createAndShow(payload: NgxNotifyPayload) {\n if (!this.container)\n this.configureContainer(payload.options.position!, payload.options.containerClass!);\n const host = document.createElement('div');\n this.container!.appendChild(host);\n\n const compRef = createComponent(NgxNotificationComponent, {\n environmentInjector: this.envInjector,\n hostElement: host,\n });\n\n compRef.setInput('payload', payload);\n compRef.instance.onClose.subscribe((d) => {\n this.removeEl(d);\n payload.onClose.emit(d);\n });\n compRef.instance.onFinish.subscribe((d) => {\n this.removeEl(d);\n payload.onFinish.emit(d);\n payload.onClose.emit(d);\n });\n\n // Registers the component’s view so it participates in change detection cycle.\n this.appRef.attachView(compRef.hostView);\n // store visible\n this.visible.push({ ref: compRef, payload });\n }\n\n private close(id: string) {\n const el = this.visible.find((x) => x.payload.id == id)?.ref?.instance?.el;\n if (el) {\n this.removeEl({ id, el });\n }\n // if in queue remove it\n this.queue = this.queue.filter((q) => q.id !== id);\n }\n private removeNode(node: HTMLElement, id: string) {\n node.style.opacity = '0';\n node.style.transform = 'translateY(-30px)';\n node.style.transition = 'all 300ms';\n setTimeout(() => {\n const item = this.visible.find((x) => x.payload.id === id);\n if (item) {\n this.appRef.detachView(item.ref.hostView);\n item.ref.destroy();\n }\n this.visible = this.visible.filter((v) => v.payload.id !== id);\n // show next in queue\n this._showNextIfPossible();\n }, 300);\n }\n\n private removeEl(d: INotifyEnd) {\n if (d.el) this.removeNode(d.el, d.id);\n else {\n // if in queue remove it\n this.queue = this.queue.filter((q) => q.id !== d.id);\n }\n }\n\n private _showNextIfPossible() {\n if (!this.queue.length) return;\n const next = this.queue.shift()!;\n // ensure we don't exceed maxVisible\n if (this.visible.length < next.options.maxVisible!) {\n this._createAndShow(next);\n } else {\n // push back\n this.queue.unshift(next);\n }\n }\n}\n","import {\n EnvironmentProviders,\n inject,\n Injector,\n makeEnvironmentProviders,\n provideEnvironmentInitializer,\n} from '@angular/core';\nimport { NGX_NOTIFY_API, NGX_NOTIFY_CONFIG, NGX_NOTIFY_DEFAULTS } from './models/notify-config';\nimport { NgxNotifyOptions } from './models/notify-options';\nimport { Notify as NotifyFacade } from './notify-facade';\nimport { NgxNotifyService } from './services/notify.service';\nexport function provideNotify(options?: NgxNotifyOptions): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: NGX_NOTIFY_CONFIG,\n useValue: { ...NGX_NOTIFY_DEFAULTS, ...(options || {}) },\n },\n {\n provide: NGX_NOTIFY_API,\n useExisting: NgxNotifyService,\n },\n provideEnvironmentInitializer(() => {\n NotifyFacade.injector = inject(Injector);\n }),\n ]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["NotifyFacade"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { InjectionToken, inject, output, model, input, viewChild, signal, computed, forwardRef, Component, ViewContainerRef, Renderer2, HostListener, Directive } from '@angular/core';
3
3
  import { CommonModule } from '@angular/common';
4
- import { BrowserService, OverlayService } from 'ngx-kit/shared';
4
+ import { BrowserService, OverlayService } from 'ngx-kit/core';
5
5
  import { NG_VALUE_ACCESSOR, NG_VALIDATORS } from '@angular/forms';
6
6
 
7
7
  class NgxTimePickerConfig {
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-kit-time-picker.mjs","sources":["../../../projects/libs/time-picker/types/config.ts","../../../projects/libs/time-picker/utils/normalize.ts","../../../projects/libs/time-picker/components/time-picker/time-picker.ts","../../../projects/libs/time-picker/components/time-picker/time-picker.html","../../../projects/libs/time-picker/directives/time-picker.directive.ts","../../../projects/libs/time-picker/providers/provide-time-picker.ts","../../../projects/libs/time-picker/ngx-kit-time-picker.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport class NgxTimePickerConfig {\n cancelButtonText: string = 'Cancel';\n confirmButtonText: string = 'Ok';\n amText: string = 'AM';\n pmText: string = 'PM';\n format: '12' | '24' = '12';\n minuteStep: number = 1;\n autoSwitchToMinute: boolean = true;\n}\n\nexport const DEFAULT_TIME_PICKER_CONFIG = new NgxTimePickerConfig();\nexport const NGX_TIME_PICKER_CONFIG = new InjectionToken<NgxTimePickerConfig>(\n 'ngx-time-picker-config',\n {\n factory: () => DEFAULT_TIME_PICKER_CONFIG,\n },\n);\n","export function normalizeTime(value: string): string | null {\n const match = value.match(/^(\\d{1,2}):(\\d{2})$/);\n\n if (!match) {\n return null;\n }\n\n const hour = Number(match[1]);\n const minute = Number(match[2]);\n\n if (hour < 0 || hour > 23 || minute < 0 || minute > 59) {\n return null;\n }\n\n return [hour.toString().padStart(2, '0'), minute.toString().padStart(2, '0')].join(':');\n}\n","import {\n Component,\n computed,\n ElementRef,\n EventEmitter,\n forwardRef,\n inject,\n input,\n model,\n OnInit,\n output,\n Output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { BrowserService } from 'ngx-kit/shared';\nimport {\n AbstractControl,\n ControlValueAccessor,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n Validator,\n} from '@angular/forms';\nimport type { NgxTimePickerMode } from '../../types/mode';\nimport { NGX_TIME_PICKER_CONFIG } from '../../types/config';\nimport { normalizeTime } from '../../utils/normalize';\n\n@Component({\n selector: 'ngx-time-picker',\n templateUrl: './time-picker.html',\n styleUrls: ['./time-picker.scss'],\n imports: [CommonModule],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NgxInputTimePickerComponent),\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => NgxInputTimePickerComponent),\n multi: true,\n },\n ],\n})\nexport class NgxInputTimePickerComponent implements ControlValueAccessor, Validator, OnInit {\n protected readonly browserService = inject(BrowserService);\n\n readonly change = output<string | null>();\n readonly cancel = output<void>();\n\n protected readonly config = inject(NGX_TIME_PICKER_CONFIG);\n isDisabled = false;\n\n /**\n * Time value.\n *\n * Example:\n * 14:35\n */\n readonly value = model<string>('12:00');\n\n /**\n * 12h or 24h.\n */\n readonly format = input<'12' | '24'>(this.config.format);\n\n /**\n * Minute step.\n */\n readonly minuteStep = input(this.config.minuteStep);\n\n /**\n * Whether the clock is disabled.\n */\n readonly disabled = input(false);\n\n /**\n * Whether to automatically switch from hour to minute.\n */\n readonly autoSwitchToMinute = input<boolean>(this.config.autoSwitchToMinute);\n\n readonly clock = viewChild<ElementRef<SVGSVGElement>>('clock');\n\n readonly mode = signal<NgxTimePickerMode>('hour');\n\n private dragging = false;\n\n readonly parsedTime = computed(() => {\n const value = this.value();\n\n const [hour, minute] = value.split(':').map(Number);\n\n return {\n hour: Number.isFinite(hour) ? hour : 12,\n minute: Number.isFinite(minute) ? minute : 0,\n };\n });\n\n readonly displayHour = computed(() => {\n const { hour } = this.parsedTime();\n\n if (this.format() === '12') {\n const h = hour % 12;\n return h === 0 ? 12 : h;\n }\n\n return hour;\n });\n readonly isPm = computed(() => {\n const hour = Number(this.value().split(':')[0]);\n\n return hour >= 12;\n });\n readonly displayMinute = computed(() => {\n return this.parsedTime().minute;\n });\n\n readonly hourNumbers = computed(() => {\n if (this.format() === '24') {\n return Array.from({ length: 24 }, (_, i) => i);\n }\n\n return Array.from({ length: 12 }, (_, i) => i + 1);\n });\n\n readonly minuteNumbers = computed(() => {\n const step = Math.max(1, 5);\n\n const values: number[] = [];\n\n for (let i = 0; i < 60; i += step) {\n values.push(i);\n }\n\n return values;\n });\n\n readonly hourAngle = computed(() => {\n const { hour } = this.parsedTime();\n\n if (this.format() === '24') {\n /*\n * MUI-like 24 hour clock.\n *\n * 0 -> 0°\n * 6 -> 90°\n * 12 -> 180°\n * 18 -> 270°\n */\n return (hour % 12) * 30;\n }\n\n const h = hour % 12;\n\n return h * 30;\n });\n\n readonly minuteAngle = computed(() => {\n return this.parsedTime().minute * 6;\n });\n\n readonly currentAngle = computed(() => {\n return this.mode() === 'hour' ? this.hourAngle() : this.minuteAngle();\n });\n\n readonly handLength = computed(() => {\n if (this.mode() === 'hour' && this.format() === '24') {\n const hour = this.parsedTime().hour;\n\n if (hour >= 13 && hour <= 23) {\n return 58;\n }\n }\n\n return 86;\n });\n\n readonly hourRadius = computed(() => {\n if (this.mode() !== 'hour') {\n return 94;\n }\n\n if (this.format() !== '24') {\n return 94;\n }\n\n const hour = this.parsedTime().hour;\n\n // 00, 13..23 → inner ring\n if (hour === 0 || hour >= 13) {\n return 58;\n }\n\n // 01..12 → outer ring\n return 94;\n });\n readonly selectedPosition = computed(() => {\n const angle = this.currentAngle();\n\n const radians = ((angle - 90) * Math.PI) / 180;\n\n const radius = this.mode() === 'hour' ? this.hourRadius() : 94;\n\n return {\n x: 120 + Math.cos(radians) * radius,\n y: 120 + Math.sin(radians) * radius,\n };\n });\n readonly handEnd = computed(() => {\n const angle = this.currentAngle();\n\n const radians = ((angle - 90) * Math.PI) / 180;\n\n const radius = this.mode() === 'hour' ? this.hourRadius() : 94;\n\n return {\n x: 120 + Math.cos(radians) * radius,\n y: 120 + Math.sin(radians) * radius,\n };\n });\n\n protected _onChange = (value: string) => {};\n protected _onTouched = () => {};\n protected _validatorOnChange = () => {};\n constructor() {}\n\n ngOnInit(): void {}\n\n writeValue(value: string): void {\n if (!value) {\n this.value.set('12:00');\n return;\n }\n\n const normalized = normalizeTime(value);\n\n if (normalized === null) {\n // invalid value\n return;\n }\n\n this.value.set(normalized);\n }\n validate(control: AbstractControl): ValidationErrors | null {\n return null;\n }\n registerOnChange(fn: any): void {\n this._onChange = fn;\n }\n registerOnTouched(fn: any): void {\n this._onTouched = fn;\n }\n registerOnValidatorChange?(fn: () => void): void {\n this._validatorOnChange = fn;\n }\n setDisabledState(disabled: boolean): void {\n this.isDisabled = disabled;\n }\n\n startPointer(event: PointerEvent): void {\n if (this.disabled()) {\n return;\n }\n\n event.preventDefault();\n\n this.dragging = true;\n\n const target = event.currentTarget as HTMLElement;\n\n target.setPointerCapture?.(event.pointerId);\n\n this.updateFromPointer(event);\n }\n\n movePointer(event: PointerEvent): void {\n if (!this.dragging || this.disabled()) {\n return;\n }\n\n event.preventDefault();\n\n this.updateFromPointer(event);\n }\n\n endPointer(event: PointerEvent): void {\n if (!this.dragging) {\n return;\n }\n\n this.dragging = false;\n\n const target = event.currentTarget as HTMLElement;\n\n target.releasePointerCapture?.(event.pointerId);\n\n if (this.mode() === 'hour' && this.autoSwitchToMinute()) {\n this.mode.set('minute');\n }\n }\n\n selectHour(hour: number): void {\n if (this.disabled()) {\n return;\n }\n\n let normalizedHour = hour;\n\n if (this.format() === '12') {\n const currentHour = this.parsedTime().hour;\n\n const isPm = currentHour >= 12;\n\n normalizedHour = hour === 12 ? (isPm ? 12 : 0) : isPm ? hour + 12 : hour;\n }\n\n this.setTime(normalizedHour, this.parsedTime().minute);\n\n if (this.autoSwitchToMinute()) {\n this.mode.set('minute');\n }\n }\n\n selectMinute(minute: number): void {\n if (this.disabled()) {\n return;\n }\n\n this.setTime(this.parsedTime().hour, minute);\n }\n\n setMode(mode: NgxTimePickerMode): void {\n if (!this.disabled()) {\n this.mode.set(mode);\n }\n }\n\n private updateFromPointer(event: PointerEvent): void {\n const svg = this.clock()?.nativeElement;\n\n if (!svg) {\n return;\n }\n\n const rect = svg.getBoundingClientRect();\n\n const x = ((event.clientX - rect.left) / rect.width) * 240;\n\n const y = ((event.clientY - rect.top) / rect.height) * 240;\n\n if (this.mode() === 'hour') {\n this.updateHourFromPointer(x, y);\n return;\n }\n\n this.updateMinuteFromPointer(x, y);\n }\n\n private updateHourFromPointer(x: number, y: number): void {\n const dx = x - 120;\n const dy = y - 120;\n\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n let angle = (Math.atan2(dy, dx) * 180) / Math.PI + 90;\n\n if (angle < 0) {\n angle += 360;\n }\n\n let hour = Math.round(angle / 30) % 12;\n\n if (this.format() === '12') {\n hour = hour === 0 ? 12 : hour;\n\n this.setTime(hour, this.parsedTime().minute);\n\n return;\n }\n\n /*\n * 24 hour mode\n *\n * Outer ring:\n * 1 ... 12\n *\n * Inner ring:\n * 13 ... 23, 00\n */\n const INNER_RING_THRESHOLD = 76;\n\n const isInnerRing = distance < INNER_RING_THRESHOLD;\n\n if (isInnerRing) {\n /*\n * Inner ring:\n *\n * 12 position -> 00\n * 1 position -> 13\n * 2 position -> 14\n * ...\n * 11 position -> 23\n */\n hour = hour === 0 ? 0 : hour + 12;\n } else {\n /*\n * Outer ring:\n *\n * 12 position -> 12\n * 1 ... 11 -> 1 ... 11\n */\n hour = hour === 0 ? 12 : hour;\n }\n\n this.setTime(hour, this.parsedTime().minute);\n }\n private updateMinuteFromPointer(x: number, y: number): void {\n const dx = x - 120;\n const dy = y - 120;\n\n let angle = (Math.atan2(dy, dx) * 180) / Math.PI + 90;\n\n if (angle < 0) {\n angle += 360;\n }\n\n let minute = Math.round(angle / 6);\n\n minute %= 60;\n\n const step = Math.max(1, this.minuteStep());\n\n minute = Math.round(minute / step) * step;\n\n if (minute >= 60) {\n minute = 0;\n }\n\n this.setTime(this.parsedTime().hour, minute);\n }\n\n private setTime(hour: number, minute: number): void {\n const h = String(hour).padStart(2, '0');\n const m = String(minute).padStart(2, '0');\n\n this.value.set(`${h}:${m}`);\n }\n\n formatHour(hour: number): string {\n if (this.format() === '24') {\n return String(hour).padStart(2, '0');\n }\n\n return String(hour);\n }\n\n formatMinute(minute: number): string {\n return String(minute).padStart(2, '0');\n }\n\n numberPosition(index: number, total: number, radius = 94): { x: number; y: number } {\n const angle = (index / total) * 360 - 90;\n\n const radians = (angle * Math.PI) / 180;\n\n return {\n x: 120 + Math.cos(radians) * radius,\n y: 120 + Math.sin(radians) * radius,\n };\n }\n\n hourPosition(hour: number, inner = false): { x: number; y: number } {\n const normalized = hour % 12;\n\n const angle = normalized * 30 - 90;\n\n const radians = (angle * Math.PI) / 180;\n\n const radius = inner ? 58 : 94;\n\n return {\n x: 120 + Math.cos(radians) * radius,\n y: 120 + Math.sin(radians) * radius,\n };\n }\n\n minutePosition(minute: number): {\n x: number;\n y: number;\n } {\n const angle = minute * 6 - 90;\n\n const radians = (angle * Math.PI) / 180;\n\n return {\n x: 120 + Math.cos(radians) * 94,\n y: 120 + Math.sin(radians) * 94,\n };\n }\n\n togglePmAm(val: 'AM' | 'PM'): void {\n const [hour, minute] = this.value().split(':').map(Number);\n\n let newHour = hour;\n\n if (val === 'AM') {\n // 12:xx PM → 00:xx\n if (hour >= 12) {\n newHour = hour - 12;\n }\n } else {\n // 00:xx AM → 12:xx PM\n if (hour < 12) {\n newHour = hour + 12;\n }\n }\n\n const value = `${String(newHour).padStart(2, '0')}:${String(minute).padStart(2, '0')}`;\n\n this.value.set(value);\n }\n ok() {\n this.change.emit(this.value());\n this._onChange(this.value());\n }\n\n close() {\n this.cancel.emit();\n }\n}\n","<div class=\"ngx-time-picker\" [class.ngx-time-picker--disabled]=\"disabled()\">\n <!-- Header -->\n <div class=\"ngx-time-picker__header\">\n <button\n type=\"button\"\n class=\"ngx-time-picker__value\"\n [class.active]=\"mode() === 'hour'\"\n [disabled]=\"disabled()\"\n (click)=\"setMode('hour')\">\n {{ formatHour(displayHour()) }}\n </button>\n\n <span class=\"ngx-time-picker__separator\">:</span>\n\n <button\n type=\"button\"\n class=\"ngx-time-picker__value\"\n [class.active]=\"mode() === 'minute'\"\n [disabled]=\"disabled()\"\n (click)=\"setMode('minute')\">\n {{ formatMinute(displayMinute()) }}\n </button>\n\n @if (format() == '12') {\n <div class=\"ngx-time-picker_format\">\n <button [class.active]=\"!isPm()\" (click)=\"togglePmAm('AM')\">\n {{ config.amText }}\n </button>\n <button [class.active]=\"isPm()\" (click)=\"togglePmAm('PM')\">\n {{ config.pmText }}\n </button>\n </div>\n }\n </div>\n\n <!-- Clock -->\n <div class=\"ngx-time-picker__clock-wrapper\">\n <svg\n #clock\n class=\"ngx-time-picker__clock\"\n viewBox=\"0 0 240 240\"\n xmlns=\"http://www.w3.org/2000/svg\"\n (pointerdown)=\"startPointer($event)\"\n (pointermove)=\"movePointer($event)\"\n (pointerup)=\"endPointer($event)\"\n (pointercancel)=\"endPointer($event)\">\n <!-- Background -->\n <circle class=\"clock-background\" cx=\"120\" cy=\"120\" r=\"112\" />\n\n <!-- Selected hand line -->\n <line class=\"clock-hand\" x1=\"120\" y1=\"120\" [attr.x2]=\"handEnd().x\" [attr.y2]=\"handEnd().y\" />\n\n <!-- Selected circle -->\n <circle\n class=\"clock-selected\"\n [attr.cx]=\"selectedPosition().x\"\n [attr.cy]=\"selectedPosition().y\"\n r=\"18\" />\n\n <!-- Center -->\n <circle class=\"clock-center\" cx=\"120\" cy=\"120\" r=\"5\" />\n\n <!-- HOURS -->\n @if (mode() === 'hour') {\n @for (hour of hourNumbers(); track hour) {\n @if (format() === '24' && (hour >= 13 || hour == 0)) {\n <g class=\"clock-number clock-number--inner\" (click)=\"selectHour(hour)\">\n <circle\n [attr.cx]=\"hourPosition(hour - 12, true).x\"\n [attr.cy]=\"hourPosition(hour - 12, true).y\"\n r=\"16\" />\n\n <text\n [attr.x]=\"hourPosition(hour - 12, true).x\"\n [attr.y]=\"hourPosition(hour - 12, true).y\">\n {{ hour == 0 ? '00' : hour }}\n </text>\n </g>\n } @else {\n <g\n class=\"clock-number\"\n [class.selected]=\"displayHour() == hour\"\n (click)=\"selectHour(hour)\">\n <circle [attr.cx]=\"hourPosition(hour).x\" [attr.cy]=\"hourPosition(hour).y\" r=\"18\" />\n\n <text [attr.x]=\"hourPosition(hour).x\" [attr.y]=\"hourPosition(hour).y\">\n {{ hour }}\n </text>\n </g>\n }\n }\n }\n\n <!-- MINUTES -->\n @if (mode() === 'minute') {\n @for (minute of minuteNumbers(); track minute) {\n <g\n class=\"clock-number\"\n [class.selected]=\"displayMinute() == minute\"\n (click)=\"selectMinute(minute)\">\n <circle\n [attr.cx]=\"minutePosition(minute).x\"\n [attr.cy]=\"minutePosition(minute).y\"\n r=\"18\" />\n\n <text [attr.x]=\"minutePosition(minute).x\" [attr.y]=\"minutePosition(minute).y\">\n {{ formatMinute(minute) }}\n </text>\n </g>\n }\n }\n </svg>\n </div>\n <div class=\"ngx-time-picker--footer\">\n <button (click)=\"close()\">\n {{ config.cancelButtonText }}\n </button>\n\n <button (click)=\"ok()\">\n {{ config.confirmButtonText }}\n </button>\n </div>\n</div>\n","import {\n Directive,\n ElementRef,\n EventEmitter,\n forwardRef,\n HostListener,\n inject,\n input,\n model,\n output,\n Output,\n Renderer2,\n signal,\n ViewContainerRef,\n} from '@angular/core';\nimport {\n AbstractControl,\n ControlValueAccessor,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n Validator,\n} from '@angular/forms';\nimport { OverlayRef, OverlayService } from 'ngx-kit/shared';\nimport { NgxInputTimePickerComponent } from '../components/time-picker/time-picker';\nimport { NGX_TIME_PICKER_CONFIG } from '../types/config';\nimport { normalizeTime } from '../utils/normalize';\n\n@Directive({\n selector: '[ngxInputTimePicker]',\n exportAs: 'ngxInputTimePicker',\n host: {\n class: 'ngx-datepicker-input',\n '[attr.readOnly]': 'true',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NgxInputTimePicker),\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => NgxInputTimePicker),\n multi: true,\n },\n ],\n})\nexport class NgxInputTimePicker implements ControlValueAccessor, Validator {\n protected readonly config = inject(NGX_TIME_PICKER_CONFIG);\n\n openOnCLick = input<boolean>(true);\n\n readonly change = output<string | null>();\n protected readonly value = signal<string>('');\n\n readonly format = input<'12' | '24'>(this.config.format);\n\n private pickerRef?: OverlayRef<NgxInputTimePickerComponent>;\n\n protected _onChange = (value: string | null | undefined) => {};\n protected _onTouched = () => {};\n protected _validatorOnChange = () => {};\n\n private isDisabled = false;\n\n private readonly overlayService = inject(OverlayService);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly renderer = inject(Renderer2);\n constructor(private el: ElementRef<HTMLInputElement>) {}\n\n ngOnDestroy(): void {\n this.destroy();\n }\n\n @HostListener('click', ['$event'])\n onClick(ev: Event) {\n if (this.openOnCLick() && !this.isDisabled) {\n ev.stopPropagation();\n ev.preventDefault();\n this.toggle();\n }\n }\n\n @HostListener('input', ['$event'])\n onInput(event: Event) {\n const input = event.target as HTMLInputElement;\n this.value.set(input.value ?? '');\n this._formatValue();\n this._onChange(this.value());\n }\n\n @HostListener('blur')\n onBlur() {\n this._onTouched();\n }\n\n writeValue(value: string): void {\n this.value.set(value);\n this._formatValue();\n }\n\n registerOnChange(fn: any): void {\n this._onChange = fn;\n }\n registerOnTouched(fn: any): void {\n this._onTouched = fn;\n }\n registerOnValidatorChange?(fn: () => void): void {\n this._validatorOnChange = fn;\n }\n setDisabledState(disabled: boolean): void {\n this.isDisabled = disabled;\n if (disabled) {\n this.renderer.setProperty(this.el.nativeElement, 'disabled', disabled);\n } else {\n this.renderer.removeAttribute(this.el.nativeElement, 'disabled');\n }\n }\n\n public toggle() {\n if (this.pickerRef || this.isDisabled) {\n this.destroy();\n return;\n }\n\n this.pickerRef = this.overlayService.open({\n anchor: this.el.nativeElement,\n component: NgxInputTimePickerComponent,\n viewContainerRef: this.viewContainerRef,\n alignment: 'center',\n placement: 'bottom',\n margin: 2,\n configure: (instance, ref) => {\n instance.writeValue(this.value());\n\n instance.change.subscribe((c: string | null) => {\n this.value.set(c ?? '');\n this.emitChange();\n this.destroy();\n });\n\n instance.cancel.subscribe(() => ref.close());\n },\n onClosed: () => {\n this.pickerRef = undefined;\n },\n });\n }\n\n private destroy() {\n this.pickerRef?.close();\n this.pickerRef = undefined;\n }\n private async emitChange() {\n this._onChange(this.value());\n this._formatValue();\n this.change.emit(this.value());\n this._onTouched();\n }\n\n validate(control: AbstractControl): ValidationErrors | null {\n const raw = this.value();\n if (!raw) return null; // empty is handled by Validators.required, not us\n return normalizeTime(raw) === null ? { invalid: true } : null;\n }\n\n protected _formatValue() {\n this.renderer.setProperty(this.el.nativeElement, 'value', this.value());\n }\n}\n","import { Provider } from '@angular/core';\nimport {\n DEFAULT_TIME_PICKER_CONFIG,\n NGX_TIME_PICKER_CONFIG,\n type NgxTimePickerConfig,\n} from '../types/config';\n\nexport function provideTimePicker(config: Partial<NgxTimePickerConfig>): Provider[] {\n const configuration = { ...DEFAULT_TIME_PICKER_CONFIG, ...config };\n return [\n {\n provide: NGX_TIME_PICKER_CONFIG,\n useValue: configuration,\n },\n ];\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;MAEa,mBAAmB,CAAA;IAC9B,gBAAgB,GAAW,QAAQ;IACnC,iBAAiB,GAAW,IAAI;IAChC,MAAM,GAAW,IAAI;IACrB,MAAM,GAAW,IAAI;IACrB,MAAM,GAAgB,IAAI;IAC1B,UAAU,GAAW,CAAC;IACtB,kBAAkB,GAAY,IAAI;AACnC;AAEM,MAAM,0BAA0B,GAAG,IAAI,mBAAmB;MACpD,sBAAsB,GAAG,IAAI,cAAc,CACtD,wBAAwB,EACxB;AACE,IAAA,OAAO,EAAE,MAAM,0BAA0B;AAC1C,CAAA;;ACjBG,SAAU,aAAa,CAAC,KAAa,EAAA;IACzC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC;IAEhD,IAAI,CAAC,KAAK,EAAE;AACV,QAAA,OAAO,IAAI;IACb;IAEA,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAE/B,IAAA,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,EAAE,EAAE;AACtD,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AACzF;;MCgCa,2BAA2B,CAAA;AACnB,IAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;IAEjD,MAAM,GAAG,MAAM,EAAiB;IAChC,MAAM,GAAG,MAAM,EAAQ;AAEb,IAAA,MAAM,GAAG,MAAM,CAAC,sBAAsB,CAAC;IAC1D,UAAU,GAAG,KAAK;AAElB;;;;;AAKG;IACM,KAAK,GAAG,KAAK,CAAS,OAAO;8EAAC;AAEvC;;AAEG;AACM,IAAA,MAAM,GAAG,KAAK,CAAc,IAAI,CAAC,MAAM,CAAC,MAAM;+EAAC;AAExD;;AAEG;AACM,IAAA,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU;mFAAC;AAEnD;;AAEG;IACM,QAAQ,GAAG,KAAK,CAAC,KAAK;iFAAC;AAEhC;;AAEG;AACM,IAAA,kBAAkB,GAAG,KAAK,CAAU,IAAI,CAAC,MAAM,CAAC,kBAAkB;2FAAC;IAEnE,KAAK,GAAG,SAAS,CAA4B,OAAO;8EAAC;IAErD,IAAI,GAAG,MAAM,CAAoB,MAAM;6EAAC;IAEzC,QAAQ,GAAG,KAAK;AAEf,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AAClC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAE1B,QAAA,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;QAEnD,OAAO;AACL,YAAA,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,EAAE;AACvC,YAAA,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC;SAC7C;IACH,CAAC;mFAAC;AAEO,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;QACnC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE;AAElC,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;AAC1B,YAAA,MAAM,CAAC,GAAG,IAAI,GAAG,EAAE;YACnB,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC;QACzB;AAEA,QAAA,OAAO,IAAI;IACb,CAAC;oFAAC;AACO,IAAA,IAAI,GAAG,QAAQ,CAAC,MAAK;AAC5B,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE/C,OAAO,IAAI,IAAI,EAAE;IACnB,CAAC;6EAAC;AACO,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AACrC,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM;IACjC,CAAC;sFAAC;AAEO,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACnC,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;AAC1B,YAAA,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QAChD;QAEA,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC;oFAAC;AAEO,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QAE3B,MAAM,MAAM,GAAa,EAAE;AAE3B,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE;AACjC,YAAA,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAChB;AAEA,QAAA,OAAO,MAAM;IACf,CAAC;sFAAC;AAEO,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;QACjC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE;AAElC,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;AAC1B;;;;;;;AAOG;AACH,YAAA,OAAO,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE;QACzB;AAEA,QAAA,MAAM,CAAC,GAAG,IAAI,GAAG,EAAE;QAEnB,OAAO,CAAC,GAAG,EAAE;IACf,CAAC;kFAAC;AAEO,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;QACnC,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,GAAG,CAAC;IACrC,CAAC;oFAAC;AAEO,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;QACpC,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE;IACvE,CAAC;qFAAC;AAEO,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AAClC,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI;YAEnC,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,EAAE;AAC5B,gBAAA,OAAO,EAAE;YACX;QACF;AAEA,QAAA,OAAO,EAAE;IACX,CAAC;mFAAC;AAEO,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AAClC,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,MAAM,EAAE;AAC1B,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;AAC1B,YAAA,OAAO,EAAE;QACX;QAEA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI;;QAGnC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE;AAC5B,YAAA,OAAO,EAAE;QACX;;AAGA,QAAA,OAAO,EAAE;IACX,CAAC;mFAAC;AACO,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;AACxC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE;AAEjC,QAAA,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,IAAI,GAAG;AAE9C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;QAE9D,OAAO;YACL,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,MAAM;YACnC,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,MAAM;SACpC;IACH,CAAC;yFAAC;AACO,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;AAC/B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE;AAEjC,QAAA,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,IAAI,GAAG;AAE9C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;QAE9D,OAAO;YACL,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,MAAM;YACnC,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,MAAM;SACpC;IACH,CAAC;gFAAC;AAEQ,IAAA,SAAS,GAAG,CAAC,KAAa,KAAI,EAAE,CAAC;AACjC,IAAA,UAAU,GAAG,MAAK,EAAE,CAAC;AACrB,IAAA,kBAAkB,GAAG,MAAK,EAAE,CAAC;AACvC,IAAA,WAAA,GAAA,EAAe;AAEf,IAAA,QAAQ,KAAU;AAElB,IAAA,UAAU,CAAC,KAAa,EAAA;QACtB,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;YACvB;QACF;AAEA,QAAA,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC;AAEvC,QAAA,IAAI,UAAU,KAAK,IAAI,EAAE;;YAEvB;QACF;AAEA,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC;IAC5B;AACA,IAAA,QAAQ,CAAC,OAAwB,EAAA;AAC/B,QAAA,OAAO,IAAI;IACb;AACA,IAAA,gBAAgB,CAAC,EAAO,EAAA;AACtB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AACA,IAAA,iBAAiB,CAAC,EAAO,EAAA;AACvB,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;IACtB;AACA,IAAA,yBAAyB,CAAE,EAAc,EAAA;AACvC,QAAA,IAAI,CAAC,kBAAkB,GAAG,EAAE;IAC9B;AACA,IAAA,gBAAgB,CAAC,QAAiB,EAAA;AAChC,QAAA,IAAI,CAAC,UAAU,GAAG,QAAQ;IAC5B;AAEA,IAAA,YAAY,CAAC,KAAmB,EAAA;AAC9B,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACnB;QACF;QAEA,KAAK,CAAC,cAAc,EAAE;AAEtB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AAEpB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,aAA4B;QAEjD,MAAM,CAAC,iBAAiB,GAAG,KAAK,CAAC,SAAS,CAAC;AAE3C,QAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;IAC/B;AAEA,IAAA,WAAW,CAAC,KAAmB,EAAA;QAC7B,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACrC;QACF;QAEA,KAAK,CAAC,cAAc,EAAE;AAEtB,QAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;IAC/B;AAEA,IAAA,UAAU,CAAC,KAAmB,EAAA;AAC5B,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB;QACF;AAEA,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;AAErB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,aAA4B;QAEjD,MAAM,CAAC,qBAAqB,GAAG,KAAK,CAAC,SAAS,CAAC;AAE/C,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE;AACvD,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzB;IACF;AAEA,IAAA,UAAU,CAAC,IAAY,EAAA;AACrB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACnB;QACF;QAEA,IAAI,cAAc,GAAG,IAAI;AAEzB,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;YAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI;AAE1C,YAAA,MAAM,IAAI,GAAG,WAAW,IAAI,EAAE;AAE9B,YAAA,cAAc,GAAG,IAAI,KAAK,EAAE,IAAI,IAAI,GAAG,EAAE,GAAG,CAAC,IAAI,IAAI,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI;QAC1E;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC;AAEtD,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE;AAC7B,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzB;IACF;AAEA,IAAA,YAAY,CAAC,MAAc,EAAA;AACzB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACnB;QACF;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC;IAC9C;AAEA,IAAA,OAAO,CAAC,IAAuB,EAAA;AAC7B,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;AACpB,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;QACrB;IACF;AAEQ,IAAA,iBAAiB,CAAC,KAAmB,EAAA;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,aAAa;QAEvC,IAAI,CAAC,GAAG,EAAE;YACR;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,GAAG,CAAC,qBAAqB,EAAE;AAExC,QAAA,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,GAAG;AAE1D,QAAA,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG;AAE1D,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,MAAM,EAAE;AAC1B,YAAA,IAAI,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC;YAChC;QACF;AAEA,QAAA,IAAI,CAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC,CAAC;IACpC;IAEQ,qBAAqB,CAAC,CAAS,EAAE,CAAS,EAAA;AAChD,QAAA,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG;AAClB,QAAA,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG;AAElB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QAE7C,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE;AAErD,QAAA,IAAI,KAAK,GAAG,CAAC,EAAE;YACb,KAAK,IAAI,GAAG;QACd;AAEA,QAAA,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,EAAE;AAEtC,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;AAC1B,YAAA,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI;AAE7B,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC;YAE5C;QACF;AAEA;;;;;;;;AAQG;QACH,MAAM,oBAAoB,GAAG,EAAE;AAE/B,QAAA,MAAM,WAAW,GAAG,QAAQ,GAAG,oBAAoB;QAEnD,IAAI,WAAW,EAAE;AACf;;;;;;;;AAQG;AACH,YAAA,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE;QACnC;aAAO;AACL;;;;;AAKG;AACH,YAAA,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI;QAC/B;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC;IAC9C;IACQ,uBAAuB,CAAC,CAAS,EAAE,CAAS,EAAA;AAClD,QAAA,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG;AAClB,QAAA,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG;QAElB,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE;AAErD,QAAA,IAAI,KAAK,GAAG,CAAC,EAAE;YACb,KAAK,IAAI,GAAG;QACd;QAEA,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;QAElC,MAAM,IAAI,EAAE;AAEZ,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;QAE3C,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI;AAEzC,QAAA,IAAI,MAAM,IAAI,EAAE,EAAE;YAChB,MAAM,GAAG,CAAC;QACZ;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC;IAC9C;IAEQ,OAAO,CAAC,IAAY,EAAE,MAAc,EAAA;AAC1C,QAAA,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AACvC,QAAA,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QAEzC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAC;IAC7B;AAEA,IAAA,UAAU,CAAC,IAAY,EAAA;AACrB,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;YAC1B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QACtC;AAEA,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB;AAEA,IAAA,YAAY,CAAC,MAAc,EAAA;QACzB,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;IACxC;AAEA,IAAA,cAAc,CAAC,KAAa,EAAE,KAAa,EAAE,MAAM,GAAG,EAAE,EAAA;QACtD,MAAM,KAAK,GAAG,CAAC,KAAK,GAAG,KAAK,IAAI,GAAG,GAAG,EAAE;QAExC,MAAM,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG;QAEvC,OAAO;YACL,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,MAAM;YACnC,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,MAAM;SACpC;IACH;AAEA,IAAA,YAAY,CAAC,IAAY,EAAE,KAAK,GAAG,KAAK,EAAA;AACtC,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAAE;AAE5B,QAAA,MAAM,KAAK,GAAG,UAAU,GAAG,EAAE,GAAG,EAAE;QAElC,MAAM,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG;QAEvC,MAAM,MAAM,GAAG,KAAK,GAAG,EAAE,GAAG,EAAE;QAE9B,OAAO;YACL,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,MAAM;YACnC,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,MAAM;SACpC;IACH;AAEA,IAAA,cAAc,CAAC,MAAc,EAAA;AAI3B,QAAA,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE;QAE7B,MAAM,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG;QAEvC,OAAO;YACL,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE;YAC/B,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE;SAChC;IACH;AAEA,IAAA,UAAU,CAAC,GAAgB,EAAA;QACzB,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;QAE1D,IAAI,OAAO,GAAG,IAAI;AAElB,QAAA,IAAI,GAAG,KAAK,IAAI,EAAE;;AAEhB,YAAA,IAAI,IAAI,IAAI,EAAE,EAAE;AACd,gBAAA,OAAO,GAAG,IAAI,GAAG,EAAE;YACrB;QACF;aAAO;;AAEL,YAAA,IAAI,IAAI,GAAG,EAAE,EAAE;AACb,gBAAA,OAAO,GAAG,IAAI,GAAG,EAAE;YACrB;QACF;QAEA,MAAM,KAAK,GAAG,CAAA,EAAG,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,CAAA,EAAI,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,CAAE;AAEtF,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;IACvB;IACA,EAAE,GAAA;QACA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAC9B;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;uGApeW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA3B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,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,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,aAAA,EAAA,EAAA,SAAA,EAb3B;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,2BAA2B,CAAC;AAC1D,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACD,YAAA;AACE,gBAAA,OAAO,EAAE,aAAa;AACtB,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,2BAA2B,CAAC;AAC1D,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;SACF,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,OAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7CH,y7HA2HA,q+ED1FY,YAAY,EAAA,CAAA,EAAA,CAAA;;2FAcX,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAlBvC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,OAAA,EAGlB,CAAC,YAAY,CAAC,EAAA,SAAA,EACZ;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,iCAAiC,CAAC;AAC1D,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACD,wBAAA;AACE,4BAAA,OAAO,EAAE,aAAa;AACtB,4BAAA,WAAW,EAAE,UAAU,CAAC,iCAAiC,CAAC;AAC1D,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACF,qBAAA,EAAA,QAAA,EAAA,y7HAAA,EAAA,MAAA,EAAA,CAAA,86EAAA,CAAA,EAAA;ytBAuCqD,OAAO,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MEpClD,kBAAkB,CAAA;AAqBT,IAAA,EAAA;AApBD,IAAA,MAAM,GAAG,MAAM,CAAC,sBAAsB,CAAC;IAE1D,WAAW,GAAG,KAAK,CAAU,IAAI;oFAAC;IAEzB,MAAM,GAAG,MAAM,EAAiB;IACtB,KAAK,GAAG,MAAM,CAAS,EAAE;8EAAC;AAEpC,IAAA,MAAM,GAAG,KAAK,CAAc,IAAI,CAAC,MAAM,CAAC,MAAM;+EAAC;AAEhD,IAAA,SAAS;AAEP,IAAA,SAAS,GAAG,CAAC,KAAgC,KAAI,EAAE,CAAC;AACpD,IAAA,UAAU,GAAG,MAAK,EAAE,CAAC;AACrB,IAAA,kBAAkB,GAAG,MAAK,EAAE,CAAC;IAE/B,UAAU,GAAG,KAAK;AAET,IAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,IAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC3C,IAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;AAC7C,IAAA,WAAA,CAAoB,EAAgC,EAAA;QAAhC,IAAA,CAAA,EAAE,GAAF,EAAE;IAAiC;IAEvD,WAAW,GAAA;QACT,IAAI,CAAC,OAAO,EAAE;IAChB;AAGA,IAAA,OAAO,CAAC,EAAS,EAAA;QACf,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAC1C,EAAE,CAAC,eAAe,EAAE;YACpB,EAAE,CAAC,cAAc,EAAE;YACnB,IAAI,CAAC,MAAM,EAAE;QACf;IACF;AAGA,IAAA,OAAO,CAAC,KAAY,EAAA;AAClB,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B;QAC9C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,YAAY,EAAE;QACnB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAC9B;IAGA,MAAM,GAAA;QACJ,IAAI,CAAC,UAAU,EAAE;IACnB;AAEA,IAAA,UAAU,CAAC,KAAa,EAAA;AACtB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;QACrB,IAAI,CAAC,YAAY,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,EAAO,EAAA;AACtB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AACA,IAAA,iBAAiB,CAAC,EAAO,EAAA;AACvB,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;IACtB;AACA,IAAA,yBAAyB,CAAE,EAAc,EAAA;AACvC,QAAA,IAAI,CAAC,kBAAkB,GAAG,EAAE;IAC9B;AACA,IAAA,gBAAgB,CAAC,QAAiB,EAAA;AAChC,QAAA,IAAI,CAAC,UAAU,GAAG,QAAQ;QAC1B,IAAI,QAAQ,EAAE;AACZ,YAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,UAAU,EAAE,QAAQ,CAAC;QACxE;aAAO;AACL,YAAA,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,UAAU,CAAC;QAClE;IACF;IAEO,MAAM,GAAA;QACX,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE;YACrC,IAAI,CAAC,OAAO,EAAE;YACd;QACF;QAEA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;AACxC,YAAA,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,aAAa;AAC7B,YAAA,SAAS,EAAE,2BAA2B;YACtC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;AACvC,YAAA,SAAS,EAAE,QAAQ;AACnB,YAAA,SAAS,EAAE,QAAQ;AACnB,YAAA,MAAM,EAAE,CAAC;AACT,YAAA,SAAS,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAI;gBAC3B,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAEjC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAgB,KAAI;oBAC7C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;oBACvB,IAAI,CAAC,UAAU,EAAE;oBACjB,IAAI,CAAC,OAAO,EAAE;AAChB,gBAAA,CAAC,CAAC;AAEF,gBAAA,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;YAC9C,CAAC;YACD,QAAQ,EAAE,MAAK;AACb,gBAAA,IAAI,CAAC,SAAS,GAAG,SAAS;YAC5B,CAAC;AACF,SAAA,CAAC;IACJ;IAEQ,OAAO,GAAA;AACb,QAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE;AACvB,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;IAC5B;AACQ,IAAA,MAAM,UAAU,GAAA;QACtB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,YAAY,EAAE;QACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,UAAU,EAAE;IACnB;AAEA,IAAA,QAAQ,CAAC,OAAwB,EAAA;AAC/B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE;AACxB,QAAA,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;AACtB,QAAA,OAAO,aAAa,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI;IAC/D;IAEU,YAAY,GAAA;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IACzE;uGAzHW,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,EAAA,UAAA,EAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,sBAAA,EAAA,EAAA,SAAA,EAblB;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,kBAAkB,CAAC;AACjD,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACD,YAAA;AACE,gBAAA,OAAO,EAAE,aAAa;AACtB,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,kBAAkB,CAAC;AACjD,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACF,SAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAEU,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBApB9B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,sBAAsB;AAChC,oBAAA,QAAQ,EAAE,oBAAoB;AAC9B,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,sBAAsB;AAC7B,wBAAA,iBAAiB,EAAE,MAAM;AAC1B,qBAAA;AACD,oBAAA,SAAS,EAAE;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,wBAAwB,CAAC;AACjD,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACD,wBAAA;AACE,4BAAA,OAAO,EAAE,aAAa;AACtB,4BAAA,WAAW,EAAE,UAAU,CAAC,wBAAwB,CAAC;AACjD,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACF,qBAAA;AACF,iBAAA;;sBA4BE,YAAY;uBAAC,OAAO,EAAE,CAAC,QAAQ,CAAC;;sBAShC,YAAY;uBAAC,OAAO,EAAE,CAAC,QAAQ,CAAC;;sBAQhC,YAAY;uBAAC,MAAM;;;ACrFhB,SAAU,iBAAiB,CAAC,MAAoC,EAAA;IACpE,MAAM,aAAa,GAAG,EAAE,GAAG,0BAA0B,EAAE,GAAG,MAAM,EAAE;IAClE,OAAO;AACL,QAAA;AACE,YAAA,OAAO,EAAE,sBAAsB;AAC/B,YAAA,QAAQ,EAAE,aAAa;AACxB,SAAA;KACF;AACH;;ACfA;;AAEG;;;;"}
1
+ {"version":3,"file":"ngx-kit-time-picker.mjs","sources":["../../../projects/libs/time-picker/types/config.ts","../../../projects/libs/time-picker/utils/normalize.ts","../../../projects/libs/time-picker/components/time-picker/time-picker.ts","../../../projects/libs/time-picker/components/time-picker/time-picker.html","../../../projects/libs/time-picker/directives/time-picker.directive.ts","../../../projects/libs/time-picker/providers/provide-time-picker.ts","../../../projects/libs/time-picker/ngx-kit-time-picker.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport class NgxTimePickerConfig {\n cancelButtonText: string = 'Cancel';\n confirmButtonText: string = 'Ok';\n amText: string = 'AM';\n pmText: string = 'PM';\n format: '12' | '24' = '12';\n minuteStep: number = 1;\n autoSwitchToMinute: boolean = true;\n}\n\nexport const DEFAULT_TIME_PICKER_CONFIG = new NgxTimePickerConfig();\nexport const NGX_TIME_PICKER_CONFIG = new InjectionToken<NgxTimePickerConfig>(\n 'ngx-time-picker-config',\n {\n factory: () => DEFAULT_TIME_PICKER_CONFIG,\n },\n);\n","export function normalizeTime(value: string): string | null {\n const match = value.match(/^(\\d{1,2}):(\\d{2})$/);\n\n if (!match) {\n return null;\n }\n\n const hour = Number(match[1]);\n const minute = Number(match[2]);\n\n if (hour < 0 || hour > 23 || minute < 0 || minute > 59) {\n return null;\n }\n\n return [hour.toString().padStart(2, '0'), minute.toString().padStart(2, '0')].join(':');\n}\n","import {\n Component,\n computed,\n ElementRef,\n EventEmitter,\n forwardRef,\n inject,\n input,\n model,\n OnInit,\n output,\n Output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { BrowserService } from 'ngx-kit/core';\nimport {\n AbstractControl,\n ControlValueAccessor,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n Validator,\n} from '@angular/forms';\nimport type { NgxTimePickerMode } from '../../types/mode';\nimport { NGX_TIME_PICKER_CONFIG } from '../../types/config';\nimport { normalizeTime } from '../../utils/normalize';\n\n@Component({\n selector: 'ngx-time-picker',\n templateUrl: './time-picker.html',\n styleUrls: ['./time-picker.scss'],\n imports: [CommonModule],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NgxInputTimePickerComponent),\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => NgxInputTimePickerComponent),\n multi: true,\n },\n ],\n})\nexport class NgxInputTimePickerComponent implements ControlValueAccessor, Validator, OnInit {\n protected readonly browserService = inject(BrowserService);\n\n readonly change = output<string | null>();\n readonly cancel = output<void>();\n\n protected readonly config = inject(NGX_TIME_PICKER_CONFIG);\n isDisabled = false;\n\n /**\n * Time value.\n *\n * Example:\n * 14:35\n */\n readonly value = model<string>('12:00');\n\n /**\n * 12h or 24h.\n */\n readonly format = input<'12' | '24'>(this.config.format);\n\n /**\n * Minute step.\n */\n readonly minuteStep = input(this.config.minuteStep);\n\n /**\n * Whether the clock is disabled.\n */\n readonly disabled = input(false);\n\n /**\n * Whether to automatically switch from hour to minute.\n */\n readonly autoSwitchToMinute = input<boolean>(this.config.autoSwitchToMinute);\n\n readonly clock = viewChild<ElementRef<SVGSVGElement>>('clock');\n\n readonly mode = signal<NgxTimePickerMode>('hour');\n\n private dragging = false;\n\n readonly parsedTime = computed(() => {\n const value = this.value();\n\n const [hour, minute] = value.split(':').map(Number);\n\n return {\n hour: Number.isFinite(hour) ? hour : 12,\n minute: Number.isFinite(minute) ? minute : 0,\n };\n });\n\n readonly displayHour = computed(() => {\n const { hour } = this.parsedTime();\n\n if (this.format() === '12') {\n const h = hour % 12;\n return h === 0 ? 12 : h;\n }\n\n return hour;\n });\n readonly isPm = computed(() => {\n const hour = Number(this.value().split(':')[0]);\n\n return hour >= 12;\n });\n readonly displayMinute = computed(() => {\n return this.parsedTime().minute;\n });\n\n readonly hourNumbers = computed(() => {\n if (this.format() === '24') {\n return Array.from({ length: 24 }, (_, i) => i);\n }\n\n return Array.from({ length: 12 }, (_, i) => i + 1);\n });\n\n readonly minuteNumbers = computed(() => {\n const step = Math.max(1, 5);\n\n const values: number[] = [];\n\n for (let i = 0; i < 60; i += step) {\n values.push(i);\n }\n\n return values;\n });\n\n readonly hourAngle = computed(() => {\n const { hour } = this.parsedTime();\n\n if (this.format() === '24') {\n /*\n * MUI-like 24 hour clock.\n *\n * 0 -> 0°\n * 6 -> 90°\n * 12 -> 180°\n * 18 -> 270°\n */\n return (hour % 12) * 30;\n }\n\n const h = hour % 12;\n\n return h * 30;\n });\n\n readonly minuteAngle = computed(() => {\n return this.parsedTime().minute * 6;\n });\n\n readonly currentAngle = computed(() => {\n return this.mode() === 'hour' ? this.hourAngle() : this.minuteAngle();\n });\n\n readonly handLength = computed(() => {\n if (this.mode() === 'hour' && this.format() === '24') {\n const hour = this.parsedTime().hour;\n\n if (hour >= 13 && hour <= 23) {\n return 58;\n }\n }\n\n return 86;\n });\n\n readonly hourRadius = computed(() => {\n if (this.mode() !== 'hour') {\n return 94;\n }\n\n if (this.format() !== '24') {\n return 94;\n }\n\n const hour = this.parsedTime().hour;\n\n // 00, 13..23 → inner ring\n if (hour === 0 || hour >= 13) {\n return 58;\n }\n\n // 01..12 → outer ring\n return 94;\n });\n readonly selectedPosition = computed(() => {\n const angle = this.currentAngle();\n\n const radians = ((angle - 90) * Math.PI) / 180;\n\n const radius = this.mode() === 'hour' ? this.hourRadius() : 94;\n\n return {\n x: 120 + Math.cos(radians) * radius,\n y: 120 + Math.sin(radians) * radius,\n };\n });\n readonly handEnd = computed(() => {\n const angle = this.currentAngle();\n\n const radians = ((angle - 90) * Math.PI) / 180;\n\n const radius = this.mode() === 'hour' ? this.hourRadius() : 94;\n\n return {\n x: 120 + Math.cos(radians) * radius,\n y: 120 + Math.sin(radians) * radius,\n };\n });\n\n protected _onChange = (value: string) => {};\n protected _onTouched = () => {};\n protected _validatorOnChange = () => {};\n constructor() {}\n\n ngOnInit(): void {}\n\n writeValue(value: string): void {\n if (!value) {\n this.value.set('12:00');\n return;\n }\n\n const normalized = normalizeTime(value);\n\n if (normalized === null) {\n // invalid value\n return;\n }\n\n this.value.set(normalized);\n }\n validate(control: AbstractControl): ValidationErrors | null {\n return null;\n }\n registerOnChange(fn: any): void {\n this._onChange = fn;\n }\n registerOnTouched(fn: any): void {\n this._onTouched = fn;\n }\n registerOnValidatorChange?(fn: () => void): void {\n this._validatorOnChange = fn;\n }\n setDisabledState(disabled: boolean): void {\n this.isDisabled = disabled;\n }\n\n startPointer(event: PointerEvent): void {\n if (this.disabled()) {\n return;\n }\n\n event.preventDefault();\n\n this.dragging = true;\n\n const target = event.currentTarget as HTMLElement;\n\n target.setPointerCapture?.(event.pointerId);\n\n this.updateFromPointer(event);\n }\n\n movePointer(event: PointerEvent): void {\n if (!this.dragging || this.disabled()) {\n return;\n }\n\n event.preventDefault();\n\n this.updateFromPointer(event);\n }\n\n endPointer(event: PointerEvent): void {\n if (!this.dragging) {\n return;\n }\n\n this.dragging = false;\n\n const target = event.currentTarget as HTMLElement;\n\n target.releasePointerCapture?.(event.pointerId);\n\n if (this.mode() === 'hour' && this.autoSwitchToMinute()) {\n this.mode.set('minute');\n }\n }\n\n selectHour(hour: number): void {\n if (this.disabled()) {\n return;\n }\n\n let normalizedHour = hour;\n\n if (this.format() === '12') {\n const currentHour = this.parsedTime().hour;\n\n const isPm = currentHour >= 12;\n\n normalizedHour = hour === 12 ? (isPm ? 12 : 0) : isPm ? hour + 12 : hour;\n }\n\n this.setTime(normalizedHour, this.parsedTime().minute);\n\n if (this.autoSwitchToMinute()) {\n this.mode.set('minute');\n }\n }\n\n selectMinute(minute: number): void {\n if (this.disabled()) {\n return;\n }\n\n this.setTime(this.parsedTime().hour, minute);\n }\n\n setMode(mode: NgxTimePickerMode): void {\n if (!this.disabled()) {\n this.mode.set(mode);\n }\n }\n\n private updateFromPointer(event: PointerEvent): void {\n const svg = this.clock()?.nativeElement;\n\n if (!svg) {\n return;\n }\n\n const rect = svg.getBoundingClientRect();\n\n const x = ((event.clientX - rect.left) / rect.width) * 240;\n\n const y = ((event.clientY - rect.top) / rect.height) * 240;\n\n if (this.mode() === 'hour') {\n this.updateHourFromPointer(x, y);\n return;\n }\n\n this.updateMinuteFromPointer(x, y);\n }\n\n private updateHourFromPointer(x: number, y: number): void {\n const dx = x - 120;\n const dy = y - 120;\n\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n let angle = (Math.atan2(dy, dx) * 180) / Math.PI + 90;\n\n if (angle < 0) {\n angle += 360;\n }\n\n let hour = Math.round(angle / 30) % 12;\n\n if (this.format() === '12') {\n hour = hour === 0 ? 12 : hour;\n\n this.setTime(hour, this.parsedTime().minute);\n\n return;\n }\n\n /*\n * 24 hour mode\n *\n * Outer ring:\n * 1 ... 12\n *\n * Inner ring:\n * 13 ... 23, 00\n */\n const INNER_RING_THRESHOLD = 76;\n\n const isInnerRing = distance < INNER_RING_THRESHOLD;\n\n if (isInnerRing) {\n /*\n * Inner ring:\n *\n * 12 position -> 00\n * 1 position -> 13\n * 2 position -> 14\n * ...\n * 11 position -> 23\n */\n hour = hour === 0 ? 0 : hour + 12;\n } else {\n /*\n * Outer ring:\n *\n * 12 position -> 12\n * 1 ... 11 -> 1 ... 11\n */\n hour = hour === 0 ? 12 : hour;\n }\n\n this.setTime(hour, this.parsedTime().minute);\n }\n private updateMinuteFromPointer(x: number, y: number): void {\n const dx = x - 120;\n const dy = y - 120;\n\n let angle = (Math.atan2(dy, dx) * 180) / Math.PI + 90;\n\n if (angle < 0) {\n angle += 360;\n }\n\n let minute = Math.round(angle / 6);\n\n minute %= 60;\n\n const step = Math.max(1, this.minuteStep());\n\n minute = Math.round(minute / step) * step;\n\n if (minute >= 60) {\n minute = 0;\n }\n\n this.setTime(this.parsedTime().hour, minute);\n }\n\n private setTime(hour: number, minute: number): void {\n const h = String(hour).padStart(2, '0');\n const m = String(minute).padStart(2, '0');\n\n this.value.set(`${h}:${m}`);\n }\n\n formatHour(hour: number): string {\n if (this.format() === '24') {\n return String(hour).padStart(2, '0');\n }\n\n return String(hour);\n }\n\n formatMinute(minute: number): string {\n return String(minute).padStart(2, '0');\n }\n\n numberPosition(index: number, total: number, radius = 94): { x: number; y: number } {\n const angle = (index / total) * 360 - 90;\n\n const radians = (angle * Math.PI) / 180;\n\n return {\n x: 120 + Math.cos(radians) * radius,\n y: 120 + Math.sin(radians) * radius,\n };\n }\n\n hourPosition(hour: number, inner = false): { x: number; y: number } {\n const normalized = hour % 12;\n\n const angle = normalized * 30 - 90;\n\n const radians = (angle * Math.PI) / 180;\n\n const radius = inner ? 58 : 94;\n\n return {\n x: 120 + Math.cos(radians) * radius,\n y: 120 + Math.sin(radians) * radius,\n };\n }\n\n minutePosition(minute: number): {\n x: number;\n y: number;\n } {\n const angle = minute * 6 - 90;\n\n const radians = (angle * Math.PI) / 180;\n\n return {\n x: 120 + Math.cos(radians) * 94,\n y: 120 + Math.sin(radians) * 94,\n };\n }\n\n togglePmAm(val: 'AM' | 'PM'): void {\n const [hour, minute] = this.value().split(':').map(Number);\n\n let newHour = hour;\n\n if (val === 'AM') {\n // 12:xx PM → 00:xx\n if (hour >= 12) {\n newHour = hour - 12;\n }\n } else {\n // 00:xx AM → 12:xx PM\n if (hour < 12) {\n newHour = hour + 12;\n }\n }\n\n const value = `${String(newHour).padStart(2, '0')}:${String(minute).padStart(2, '0')}`;\n\n this.value.set(value);\n }\n ok() {\n this.change.emit(this.value());\n this._onChange(this.value());\n }\n\n close() {\n this.cancel.emit();\n }\n}\n","<div class=\"ngx-time-picker\" [class.ngx-time-picker--disabled]=\"disabled()\">\n <!-- Header -->\n <div class=\"ngx-time-picker__header\">\n <button\n type=\"button\"\n class=\"ngx-time-picker__value\"\n [class.active]=\"mode() === 'hour'\"\n [disabled]=\"disabled()\"\n (click)=\"setMode('hour')\">\n {{ formatHour(displayHour()) }}\n </button>\n\n <span class=\"ngx-time-picker__separator\">:</span>\n\n <button\n type=\"button\"\n class=\"ngx-time-picker__value\"\n [class.active]=\"mode() === 'minute'\"\n [disabled]=\"disabled()\"\n (click)=\"setMode('minute')\">\n {{ formatMinute(displayMinute()) }}\n </button>\n\n @if (format() == '12') {\n <div class=\"ngx-time-picker_format\">\n <button [class.active]=\"!isPm()\" (click)=\"togglePmAm('AM')\">\n {{ config.amText }}\n </button>\n <button [class.active]=\"isPm()\" (click)=\"togglePmAm('PM')\">\n {{ config.pmText }}\n </button>\n </div>\n }\n </div>\n\n <!-- Clock -->\n <div class=\"ngx-time-picker__clock-wrapper\">\n <svg\n #clock\n class=\"ngx-time-picker__clock\"\n viewBox=\"0 0 240 240\"\n xmlns=\"http://www.w3.org/2000/svg\"\n (pointerdown)=\"startPointer($event)\"\n (pointermove)=\"movePointer($event)\"\n (pointerup)=\"endPointer($event)\"\n (pointercancel)=\"endPointer($event)\">\n <!-- Background -->\n <circle class=\"clock-background\" cx=\"120\" cy=\"120\" r=\"112\" />\n\n <!-- Selected hand line -->\n <line class=\"clock-hand\" x1=\"120\" y1=\"120\" [attr.x2]=\"handEnd().x\" [attr.y2]=\"handEnd().y\" />\n\n <!-- Selected circle -->\n <circle\n class=\"clock-selected\"\n [attr.cx]=\"selectedPosition().x\"\n [attr.cy]=\"selectedPosition().y\"\n r=\"18\" />\n\n <!-- Center -->\n <circle class=\"clock-center\" cx=\"120\" cy=\"120\" r=\"5\" />\n\n <!-- HOURS -->\n @if (mode() === 'hour') {\n @for (hour of hourNumbers(); track hour) {\n @if (format() === '24' && (hour >= 13 || hour == 0)) {\n <g class=\"clock-number clock-number--inner\" (click)=\"selectHour(hour)\">\n <circle\n [attr.cx]=\"hourPosition(hour - 12, true).x\"\n [attr.cy]=\"hourPosition(hour - 12, true).y\"\n r=\"16\" />\n\n <text\n [attr.x]=\"hourPosition(hour - 12, true).x\"\n [attr.y]=\"hourPosition(hour - 12, true).y\">\n {{ hour == 0 ? '00' : hour }}\n </text>\n </g>\n } @else {\n <g\n class=\"clock-number\"\n [class.selected]=\"displayHour() == hour\"\n (click)=\"selectHour(hour)\">\n <circle [attr.cx]=\"hourPosition(hour).x\" [attr.cy]=\"hourPosition(hour).y\" r=\"18\" />\n\n <text [attr.x]=\"hourPosition(hour).x\" [attr.y]=\"hourPosition(hour).y\">\n {{ hour }}\n </text>\n </g>\n }\n }\n }\n\n <!-- MINUTES -->\n @if (mode() === 'minute') {\n @for (minute of minuteNumbers(); track minute) {\n <g\n class=\"clock-number\"\n [class.selected]=\"displayMinute() == minute\"\n (click)=\"selectMinute(minute)\">\n <circle\n [attr.cx]=\"minutePosition(minute).x\"\n [attr.cy]=\"minutePosition(minute).y\"\n r=\"18\" />\n\n <text [attr.x]=\"minutePosition(minute).x\" [attr.y]=\"minutePosition(minute).y\">\n {{ formatMinute(minute) }}\n </text>\n </g>\n }\n }\n </svg>\n </div>\n <div class=\"ngx-time-picker--footer\">\n <button (click)=\"close()\">\n {{ config.cancelButtonText }}\n </button>\n\n <button (click)=\"ok()\">\n {{ config.confirmButtonText }}\n </button>\n </div>\n</div>\n","import {\n Directive,\n ElementRef,\n EventEmitter,\n forwardRef,\n HostListener,\n inject,\n input,\n model,\n output,\n Output,\n Renderer2,\n signal,\n ViewContainerRef,\n} from '@angular/core';\nimport {\n AbstractControl,\n ControlValueAccessor,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n Validator,\n} from '@angular/forms';\nimport { OverlayRef, OverlayService } from 'ngx-kit/core';\nimport { NgxInputTimePickerComponent } from '../components/time-picker/time-picker';\nimport { NGX_TIME_PICKER_CONFIG } from '../types/config';\nimport { normalizeTime } from '../utils/normalize';\n\n@Directive({\n selector: '[ngxInputTimePicker]',\n exportAs: 'ngxInputTimePicker',\n host: {\n class: 'ngx-datepicker-input',\n '[attr.readOnly]': 'true',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NgxInputTimePicker),\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => NgxInputTimePicker),\n multi: true,\n },\n ],\n})\nexport class NgxInputTimePicker implements ControlValueAccessor, Validator {\n protected readonly config = inject(NGX_TIME_PICKER_CONFIG);\n\n openOnCLick = input<boolean>(true);\n\n readonly change = output<string | null>();\n protected readonly value = signal<string>('');\n\n readonly format = input<'12' | '24'>(this.config.format);\n\n private pickerRef?: OverlayRef<NgxInputTimePickerComponent>;\n\n protected _onChange = (value: string | null | undefined) => {};\n protected _onTouched = () => {};\n protected _validatorOnChange = () => {};\n\n private isDisabled = false;\n\n private readonly overlayService = inject(OverlayService);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly renderer = inject(Renderer2);\n constructor(private el: ElementRef<HTMLInputElement>) {}\n\n ngOnDestroy(): void {\n this.destroy();\n }\n\n @HostListener('click', ['$event'])\n onClick(ev: Event) {\n if (this.openOnCLick() && !this.isDisabled) {\n ev.stopPropagation();\n ev.preventDefault();\n this.toggle();\n }\n }\n\n @HostListener('input', ['$event'])\n onInput(event: Event) {\n const input = event.target as HTMLInputElement;\n this.value.set(input.value ?? '');\n this._formatValue();\n this._onChange(this.value());\n }\n\n @HostListener('blur')\n onBlur() {\n this._onTouched();\n }\n\n writeValue(value: string): void {\n this.value.set(value);\n this._formatValue();\n }\n\n registerOnChange(fn: any): void {\n this._onChange = fn;\n }\n registerOnTouched(fn: any): void {\n this._onTouched = fn;\n }\n registerOnValidatorChange?(fn: () => void): void {\n this._validatorOnChange = fn;\n }\n setDisabledState(disabled: boolean): void {\n this.isDisabled = disabled;\n if (disabled) {\n this.renderer.setProperty(this.el.nativeElement, 'disabled', disabled);\n } else {\n this.renderer.removeAttribute(this.el.nativeElement, 'disabled');\n }\n }\n\n public toggle() {\n if (this.pickerRef || this.isDisabled) {\n this.destroy();\n return;\n }\n\n this.pickerRef = this.overlayService.open({\n anchor: this.el.nativeElement,\n component: NgxInputTimePickerComponent,\n viewContainerRef: this.viewContainerRef,\n alignment: 'center',\n placement: 'bottom',\n margin: 2,\n configure: (instance, ref) => {\n instance.writeValue(this.value());\n\n instance.change.subscribe((c: string | null) => {\n this.value.set(c ?? '');\n this.emitChange();\n this.destroy();\n });\n\n instance.cancel.subscribe(() => ref.close());\n },\n onClosed: () => {\n this.pickerRef = undefined;\n },\n });\n }\n\n private destroy() {\n this.pickerRef?.close();\n this.pickerRef = undefined;\n }\n private async emitChange() {\n this._onChange(this.value());\n this._formatValue();\n this.change.emit(this.value());\n this._onTouched();\n }\n\n validate(control: AbstractControl): ValidationErrors | null {\n const raw = this.value();\n if (!raw) return null; // empty is handled by Validators.required, not us\n return normalizeTime(raw) === null ? { invalid: true } : null;\n }\n\n protected _formatValue() {\n this.renderer.setProperty(this.el.nativeElement, 'value', this.value());\n }\n}\n","import { Provider } from '@angular/core';\nimport {\n DEFAULT_TIME_PICKER_CONFIG,\n NGX_TIME_PICKER_CONFIG,\n type NgxTimePickerConfig,\n} from '../types/config';\n\nexport function provideTimePicker(config: Partial<NgxTimePickerConfig>): Provider[] {\n const configuration = { ...DEFAULT_TIME_PICKER_CONFIG, ...config };\n return [\n {\n provide: NGX_TIME_PICKER_CONFIG,\n useValue: configuration,\n },\n ];\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -370,14 +370,14 @@ class NgxVirtualScrollViewport {
370
370
  }
371
371
  }
372
372
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxVirtualScrollViewport, deps: [], target: i0.ɵɵFactoryTarget.Component });
373
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.0.4", type: NgxVirtualScrollViewport, isStandalone: true, selector: "ngx-virtual-scroll-viewport, ngx-virtual-scroll", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, minBufferPx: { classPropertyName: "minBufferPx", publicName: "minBufferPx", isSignal: true, isRequired: false, transformFunction: null }, maxBufferPx: { classPropertyName: "maxBufferPx", publicName: "maxBufferPx", isSignal: true, isRequired: false, transformFunction: null }, measureFn: { classPropertyName: "measureFn", publicName: "measureFn", isSignal: true, isRequired: false, transformFunction: null }, maxAxisSizePx: { classPropertyName: "maxAxisSizePx", publicName: "maxAxisSizePx", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { scrolledIndexChange: "scrolledIndexChange", rangeChange: "rangeChange" }, host: { properties: { "class.ngx-virtual-scroll-viewport-host--scrolling": "isScrolling()" }, classAttribute: "ngx-virtual-scroll-viewport-host" }, viewQueries: [{ propertyName: "scrollableRef", first: true, predicate: ["scrollable"], descendants: true, isSignal: true }, { propertyName: "wrapperRef", first: true, predicate: ["wrapper"], descendants: true, isSignal: true }], exportAs: ["ngxVirtualScrollViewport"], ngImport: i0, template: "<div #scrollable class=\"ngx-virtual-scroll-viewport__scrollable\">\r\n <div\r\n class=\"ngx-virtual-scroll-viewport__spacer\"\r\n [style.width.px]=\"spacerWidth()\"\r\n [style.height.px]=\"spacerHeight()\"\r\n aria-hidden=\"true\"></div>\r\n <div #wrapper class=\"ngx-virtual-scroll-viewport__wrapper\" [style.transform]=\"wrapperTransform()\">\r\n <ng-content></ng-content>\r\n </div>\r\n</div>\r\n", styles: [":host.ngx-virtual-scroll-viewport-host{display:block;position:relative;overflow:hidden;contain:strict}.ngx-virtual-scroll-viewport__scrollable{position:relative;width:100%;height:100%;overflow:auto;-webkit-overflow-scrolling:touch;contain:strict}.ngx-virtual-scroll-viewport__spacer{position:absolute;top:0;left:0;pointer-events:none;visibility:hidden}.ngx-virtual-scroll-viewport__wrapper{position:absolute;top:0;left:0;min-width:100%;contain:layout style}:host.ngx-virtual-scroll-viewport-host--scrolling .ngx-virtual-scroll-viewport__wrapper{will-change:transform}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
373
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.0.4", type: NgxVirtualScrollViewport, isStandalone: true, selector: "ngx-virtual-scroll-viewport, ngx-virtual-scroll", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, minBufferPx: { classPropertyName: "minBufferPx", publicName: "minBufferPx", isSignal: true, isRequired: false, transformFunction: null }, maxBufferPx: { classPropertyName: "maxBufferPx", publicName: "maxBufferPx", isSignal: true, isRequired: false, transformFunction: null }, measureFn: { classPropertyName: "measureFn", publicName: "measureFn", isSignal: true, isRequired: false, transformFunction: null }, maxAxisSizePx: { classPropertyName: "maxAxisSizePx", publicName: "maxAxisSizePx", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { scrolledIndexChange: "scrolledIndexChange", rangeChange: "rangeChange" }, host: { properties: { "class.ngx-virtual-scroll-viewport-host--scrolling": "isScrolling()" }, classAttribute: "ngx-virtual-scroll-viewport-host" }, viewQueries: [{ propertyName: "scrollableRef", first: true, predicate: ["scrollable"], descendants: true, isSignal: true }, { propertyName: "wrapperRef", first: true, predicate: ["wrapper"], descendants: true, isSignal: true }], exportAs: ["ngxVirtualScrollViewport"], ngImport: i0, template: "<div #scrollable class=\"ngx-virtual-scroll-viewport__scrollable\">\n <div\n class=\"ngx-virtual-scroll-viewport__spacer\"\n [style.width.px]=\"spacerWidth()\"\n [style.height.px]=\"spacerHeight()\"\n aria-hidden=\"true\"></div>\n <div #wrapper class=\"ngx-virtual-scroll-viewport__wrapper\" [style.transform]=\"wrapperTransform()\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [":host.ngx-virtual-scroll-viewport-host{display:block;position:relative;overflow:hidden;contain:strict}.ngx-virtual-scroll-viewport__scrollable{position:relative;width:100%;height:100%;overflow:auto;-webkit-overflow-scrolling:touch;contain:strict}.ngx-virtual-scroll-viewport__spacer{position:absolute;top:0;left:0;pointer-events:none;visibility:hidden}.ngx-virtual-scroll-viewport__wrapper{position:absolute;top:0;left:0;min-width:100%;contain:layout style}:host.ngx-virtual-scroll-viewport-host--scrolling .ngx-virtual-scroll-viewport__wrapper{will-change:transform}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
374
374
  }
375
375
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxVirtualScrollViewport, decorators: [{
376
376
  type: Component,
377
377
  args: [{ selector: 'ngx-virtual-scroll-viewport, ngx-virtual-scroll', standalone: true, exportAs: 'ngxVirtualScrollViewport', changeDetection: ChangeDetectionStrategy.OnPush, host: {
378
378
  class: 'ngx-virtual-scroll-viewport-host',
379
379
  '[class.ngx-virtual-scroll-viewport-host--scrolling]': 'isScrolling()',
380
- }, template: "<div #scrollable class=\"ngx-virtual-scroll-viewport__scrollable\">\r\n <div\r\n class=\"ngx-virtual-scroll-viewport__spacer\"\r\n [style.width.px]=\"spacerWidth()\"\r\n [style.height.px]=\"spacerHeight()\"\r\n aria-hidden=\"true\"></div>\r\n <div #wrapper class=\"ngx-virtual-scroll-viewport__wrapper\" [style.transform]=\"wrapperTransform()\">\r\n <ng-content></ng-content>\r\n </div>\r\n</div>\r\n", styles: [":host.ngx-virtual-scroll-viewport-host{display:block;position:relative;overflow:hidden;contain:strict}.ngx-virtual-scroll-viewport__scrollable{position:relative;width:100%;height:100%;overflow:auto;-webkit-overflow-scrolling:touch;contain:strict}.ngx-virtual-scroll-viewport__spacer{position:absolute;top:0;left:0;pointer-events:none;visibility:hidden}.ngx-virtual-scroll-viewport__wrapper{position:absolute;top:0;left:0;min-width:100%;contain:layout style}:host.ngx-virtual-scroll-viewport-host--scrolling .ngx-virtual-scroll-viewport__wrapper{will-change:transform}\n"] }]
380
+ }, template: "<div #scrollable class=\"ngx-virtual-scroll-viewport__scrollable\">\n <div\n class=\"ngx-virtual-scroll-viewport__spacer\"\n [style.width.px]=\"spacerWidth()\"\n [style.height.px]=\"spacerHeight()\"\n aria-hidden=\"true\"></div>\n <div #wrapper class=\"ngx-virtual-scroll-viewport__wrapper\" [style.transform]=\"wrapperTransform()\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [":host.ngx-virtual-scroll-viewport-host{display:block;position:relative;overflow:hidden;contain:strict}.ngx-virtual-scroll-viewport__scrollable{position:relative;width:100%;height:100%;overflow:auto;-webkit-overflow-scrolling:touch;contain:strict}.ngx-virtual-scroll-viewport__spacer{position:absolute;top:0;left:0;pointer-events:none;visibility:hidden}.ngx-virtual-scroll-viewport__wrapper{position:absolute;top:0;left:0;min-width:100%;contain:layout style}:host.ngx-virtual-scroll-viewport-host--scrolling .ngx-virtual-scroll-viewport__wrapper{will-change:transform}\n"] }]
381
381
  }], ctorParameters: () => [], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], minBufferPx: [{ type: i0.Input, args: [{ isSignal: true, alias: "minBufferPx", required: false }] }], maxBufferPx: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxBufferPx", required: false }] }], measureFn: [{ type: i0.Input, args: [{ isSignal: true, alias: "measureFn", required: false }] }], maxAxisSizePx: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxAxisSizePx", required: false }] }], scrolledIndexChange: [{ type: i0.Output, args: ["scrolledIndexChange"] }], rangeChange: [{ type: i0.Output, args: ["rangeChange"] }], scrollableRef: [{ type: i0.ViewChild, args: ['scrollable', { isSignal: true }] }], wrapperRef: [{ type: i0.ViewChild, args: ['wrapper', { isSignal: true }] }] } });
382
382
 
383
383
  /*
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-kit-virtual-scroll.mjs","sources":["../../../projects/libs/virtual-scroll/types/virtual-scroll-range.interface.ts","../../../projects/libs/virtual-scroll/utils/measure-layout.ts","../../../projects/libs/virtual-scroll/components/virtual-scroll-viewport.component.ts","../../../projects/libs/virtual-scroll/components/virtual-scroll-viewport.component.html","../../../projects/libs/virtual-scroll/public-api.ts","../../../projects/libs/virtual-scroll/ngx-kit-virtual-scroll.ts"],"sourcesContent":["/**\n * A \"line\" index range that is currently rendered.\n * A \"line\" is one item for a plain list, or one row/column of N items\n * for an auto-detected wrapping grid. `end` is exclusive.\n */\nexport interface NgxVirtualScrollRange {\n start: number;\n end: number;\n}\n\nexport function rangesEqual(a: NgxVirtualScrollRange, b: NgxVirtualScrollRange): boolean {\n return a.start === b.start && a.end === b.end;\n}\n","import { NgxVirtualScrollMeasurement } from '../types/virtual-scroll-measurement.interface';\r\n\r\nconst TOP_TOLERANCE_PX = 0.5;\r\n\r\n/**\r\n * Pure, framework-agnostic layout probe.\r\n *\r\n * Reads the real bounding boxes of a small batch of already-rendered\r\n * elements and infers, purely from actual layout:\r\n * - the scroll axis (vertical vs horizontal)\r\n * - how many items share a single line (1 for a plain list, N for a\r\n * wrapping grid)\r\n * - the real size of one line, INCLUDING margins/border/box-shadow,\r\n * because it is derived from the delta between two real sibling\r\n * positions in normal document flow rather than from a hardcoded\r\n * itemSize input.\r\n *\r\n * No orientation/itemSize is ever supplied by the consumer — this is the\r\n * single source of truth for both.\r\n */\r\nexport function measureLayout(\r\n probeElements: readonly Element[],\r\n): NgxVirtualScrollMeasurement | null {\r\n if (probeElements.length === 0) {\r\n return null;\r\n }\r\n\r\n const rects = probeElements.map((el) => el.getBoundingClientRect());\r\n\r\n if (rects.length === 1) {\r\n // Not enough siblings to infer direction yet; assume a vertical list\r\n // (the overwhelmingly common case) using the element's own height.\r\n return { axis: 'vertical', crossCount: 1, lineSize: Math.max(rects[0].height, 1) };\r\n }\r\n\r\n const first = rects[0];\r\n\r\n // Find the first probed item that starts a new line (its top differs\r\n // meaningfully from the first item's top).\r\n let wrapIndex = -1;\r\n for (let i = 1; i < rects.length; i++) {\r\n if (Math.abs(rects[i].top - first.top) > TOP_TOLERANCE_PX) {\r\n wrapIndex = i;\r\n break;\r\n }\r\n }\r\n\r\n if (wrapIndex === -1) {\r\n // Every probed item shares the same line -> a single horizontal line.\r\n const lineSize = rects[1].left - first.left;\r\n return { axis: 'horizontal', crossCount: 1, lineSize: Math.max(lineSize, 1) };\r\n }\r\n\r\n if (wrapIndex === 1) {\r\n // The very next item is already on a new line -> a plain vertical list.\r\n const lineSize = rects[1].top - first.top;\r\n return { axis: 'vertical', crossCount: 1, lineSize: Math.max(lineSize, 1) };\r\n }\r\n\r\n // Several items share the first line before wrapping -> a wrapping grid.\r\n const crossCount = wrapIndex;\r\n const lineSize = rects[wrapIndex].top - first.top;\r\n return { axis: 'vertical', crossCount, lineSize: Math.max(lineSize, 1) };\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n ViewEncapsulation,\r\n afterNextRender,\r\n afterRenderEffect,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\n\r\nimport { NgxVirtualScrollRange, rangesEqual } from '../types/virtual-scroll-range.interface';\r\nimport {\r\n NgxVirtualScrollAxis,\r\n NgxVirtualScrollMeasureFn,\r\n NgxVirtualScrollMeasurement,\r\n} from '../types/virtual-scroll-measurement.interface';\r\nimport { measureLayout } from '../utils/measure-layout';\r\n\r\n/** How many items are rendered \"in the open\" (no transform) purely to probe their real layout. */\r\nconst PROBE_COUNT = 24;\r\n\r\n/**\r\n * Browsers clamp any single element's CSS width/height (and therefore\r\n * `scrollWidth`/`scrollHeight`) to a hard maximum — roughly 33,554,428px in\r\n * Chromium and considerably less in older WebKit (historically ~8,388,608px)\r\n * and Gecko (~17,895,697px). Once the spacer element (used purely to give\r\n * the native scrollbar the right size) exceeds that ceiling, the browser\r\n * silently clamps it, the scrollbar stops early, and everything past that\r\n * point becomes unreachable — exactly the \"stuck around 524k rows\" symptom.\r\n *\r\n * To support arbitrarily large data sets we cap the spacer at this safe\r\n * ceiling and scroll the DOM in a *compressed* coordinate space, while all\r\n * index math still happens against the real, uncompressed pixel space (see\r\n * `scaleFactor`). Kept conservative (well under every known browser cap) so\r\n * it works everywhere without per-browser detection.\r\n */\r\nconst DEFAULT_MAX_AXIS_SIZE_PX = 6_000_000;\r\n\r\n/**\r\n * Headless, signal-based virtual scroll viewport.\r\n *\r\n * There is no `itemSize` and no `orientation` input by design: both are\r\n * derived by measuring the real, rendered bounding boxes of a small probe\r\n * batch (see `measure-layout.ts`), so margins/border/box-shadow on your own\r\n * item styles are always accounted for correctly, and mixed layouts\r\n * (vertical list of wrapping rows, i.e. a card grid) are supported out of\r\n * the box.\r\n *\r\n * The component does not render your items itself — it exposes reactive\r\n * signals (`visibleItems`, `range`, `baseIndex`, `axis`, ...) that you\r\n * consume with a native `@for` block in your own template. This keeps the\r\n * repeat/track logic entirely under your control (custom track expressions,\r\n * `@empty` blocks, etc.) instead of hiding it behind a structural directive.\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-virtual-scroll-viewport #vs=\"ngxVirtualScrollViewport\" [items]=\"rows\" style=\"height: 480px\">\r\n * @for (row of vs.visibleItems(); track row.id; let i = $index) {\r\n * <div class=\"row\">{{ vs.baseIndex() + i }} - {{ row.name }}</div>\r\n * }\r\n * </ngx-virtual-scroll-viewport>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'ngx-virtual-scroll-viewport, ngx-virtual-scroll',\r\n standalone: true,\r\n templateUrl: './virtual-scroll-viewport.component.html',\r\n styleUrl: './virtual-scroll-viewport.component.scss',\r\n exportAs: 'ngxVirtualScrollViewport',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'ngx-virtual-scroll-viewport-host',\r\n '[class.ngx-virtual-scroll-viewport-host--scrolling]': 'isScrolling()',\r\n },\r\n})\r\nexport class NgxVirtualScrollViewport<T = unknown> {\r\n /** The full, unvirtualized data set. */\r\n readonly items = input<readonly T[]>([]);\r\n\r\n /** Minimum buffer (px) left before the render range is recomputed. */\r\n readonly minBufferPx = input(150);\r\n\r\n /** Extra buffer (px) rendered outside the visible area on each side. */\r\n readonly maxBufferPx = input(300);\r\n\r\n /** Advanced escape hatch: replace the built-in layout probe entirely. */\r\n readonly measureFn = input<NgxVirtualScrollMeasureFn | undefined>(undefined);\r\n\r\n /**\r\n * Safe ceiling (px) for the scrollable axis's real DOM size. Only relevant\r\n * for very large data sets — see `DEFAULT_MAX_AXIS_SIZE_PX`. You should\r\n * not need to change this; it's exposed only for advanced cases (e.g. you\r\n * know your app never targets older WebKit and want to raise the ceiling).\r\n */\r\n readonly maxAxisSizePx = input(DEFAULT_MAX_AXIS_SIZE_PX);\r\n\r\n /** Emits the index of the first fully-visible item as the user scrolls. */\r\n readonly scrolledIndexChange = output<number>();\r\n\r\n /** Emits whenever the rendered line range changes. */\r\n readonly rangeChange = output<NgxVirtualScrollRange>();\r\n\r\n private readonly scrollableRef = viewChild.required<ElementRef<HTMLElement>>('scrollable');\r\n private readonly wrapperRef = viewChild.required<ElementRef<HTMLElement>>('wrapper');\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n private readonly measurement = signal<NgxVirtualScrollMeasurement | null>(null);\r\n private readonly scrollOffset = signal(0);\r\n private readonly viewportSize = signal(0);\r\n\r\n /** Whether the user is actively scrolling (used only to toggle `will-change`). */\r\n readonly isScrolling = signal(false);\r\n\r\n /** Currently rendered line range. */\r\n readonly range = signal<NgxVirtualScrollRange>({ start: 0, end: PROBE_COUNT });\r\n\r\n readonly axis = computed<NgxVirtualScrollAxis>(() => this.measurement()?.axis ?? 'vertical');\r\n readonly crossCount = computed(() => this.measurement()?.crossCount ?? 1);\r\n readonly lineSize = computed(() => this.measurement()?.lineSize ?? 0);\r\n readonly isMeasured = computed(() => this.measurement() !== null);\r\n\r\n readonly lineCount = computed(() => Math.ceil(this.items().length / this.crossCount()));\r\n\r\n /** Real, uncompressed total size along the scroll axis — can exceed the browser's element-size cap. */\r\n readonly naturalTotalSize = computed(() => this.lineCount() * this.lineSize());\r\n\r\n /**\r\n * Size actually applied to the spacer element, clamped to `maxAxisSizePx`.\r\n * Equal to `naturalTotalSize()` for any data set small enough to matter in\r\n * practice — the compression only ever engages for extreme list sizes.\r\n */\r\n readonly totalSize = computed(() => Math.min(this.naturalTotalSize(), this.maxAxisSizePx()));\r\n\r\n /**\r\n * Ratio between the (possibly capped) DOM scroll space and the real,\r\n * uncompressed content size. `1` unless `naturalTotalSize()` exceeds\r\n * `maxAxisSizePx()`, in which case it's `< 1` and the DOM scrollbar\r\n * represents the whole data set in a compressed coordinate space.\r\n */\r\n readonly scaleFactor = computed(() => {\r\n const natural = this.naturalTotalSize();\r\n return natural > 0 ? this.totalSize() / natural : 1;\r\n });\r\n\r\n /** Absolute index of the first item in `visibleItems()`, for display purposes. */\r\n readonly baseIndex = computed(() => this.range().start * this.crossCount());\r\n\r\n /** Slice of `items()` that should actually be rendered right now. */\r\n readonly visibleItems = computed<readonly T[]>(() => {\r\n const data = this.items();\r\n const { start, end } = this.range();\r\n const cross = this.crossCount();\r\n return data.slice(start * cross, Math.min(data.length, end * cross));\r\n });\r\n\r\n // Expressed in the same compressed DOM coordinate space as `scrollOffset`/\r\n // `totalSize`, so it always stays within the safe, capped range even for\r\n // enormous data sets — see `scaleFactor`.\r\n //\r\n // The naive `start * lineSize * scaleFactor` value is only an *ideal*\r\n // proportional position. It is clamped so the *real* (unscaled) rendered\r\n // block — `renderedBlockSize()` — can never be pushed past the end of the\r\n // capped spacer. Without this clamp, once `scaleFactor() < 1`, the block\r\n // rendered near the tail (real, unscaled size) no longer fits in the tiny\r\n // sliver of compressed space \"ideally\" left for it, so it gets positioned\r\n // partly (or entirely) past the bottom of the scrollable area — reachable\r\n // in the DOM, but never inside the visible/scrollable viewport. Clamping\r\n // guarantees the tail of the list is always flush with, and fully inside,\r\n // the scrollable area.\r\n private readonly renderedBlockSize = computed(() => {\r\n const { start, end } = this.range();\r\n return (end - start) * this.lineSize();\r\n });\r\n\r\n private readonly contentOffset = computed(() => {\r\n const ideal = this.range().start * this.lineSize() * this.scaleFactor();\r\n const max = Math.max(0, this.totalSize() - this.renderedBlockSize());\r\n return Math.min(ideal, max);\r\n });\r\n\r\n protected readonly wrapperTransform = computed(() =>\r\n this.axis() === 'horizontal'\r\n ? `translateX(${this.contentOffset()}px)`\r\n : `translateY(${this.contentOffset()}px)`,\r\n );\r\n protected readonly spacerWidth = computed(() =>\r\n this.axis() === 'horizontal' ? this.totalSize() : 1,\r\n );\r\n protected readonly spacerHeight = computed(() =>\r\n this.axis() === 'vertical' ? this.totalSize() : 1,\r\n );\r\n\r\n private resizeObserver?: ResizeObserver;\r\n private scrollingIdleTimer?: ReturnType<typeof setTimeout>;\r\n private scrollRaf = 0;\r\n\r\n constructor() {\r\n // Seed / reset the probe range whenever the data set changes and we\r\n // haven't measured a real layout yet.\r\n effect(() => {\r\n const length = this.items().length;\r\n if (!this.measurement()) {\r\n this.range.set({ start: 0, end: Math.min(length, PROBE_COUNT) });\r\n }\r\n });\r\n\r\n // Read the real, rendered layout of the probe batch once it has\r\n // painted. Runs in the `read` phase so it never interleaves with DOM\r\n // writes and never forces a layout thrash.\r\n afterRenderEffect({\r\n read: () => {\r\n if (this.measurement()) {\r\n return;\r\n }\r\n const children = Array.from(this.wrapperRef().nativeElement.children).slice(0, PROBE_COUNT);\r\n const measure = this.measureFn() ?? measureLayout;\r\n const result = measure(children);\r\n if (result) {\r\n this.measurement.set(result);\r\n }\r\n },\r\n });\r\n\r\n // Once measured (or when the buffer inputs change), recompute the\r\n // actual visible range from the real viewport size / scroll offset.\r\n // `untracked` is used because `recomputeRange` itself reads scroll/size\r\n // signals that are already kept in sync by the scroll/resize listeners\r\n // directly — we only want *this* effect to re-run for buffer/measurement\r\n // changes, not for every scroll frame.\r\n effect(() => {\r\n this.minBufferPx();\r\n this.maxBufferPx();\r\n const measured = this.isMeasured();\r\n untracked(() => {\r\n if (measured) {\r\n // The initial viewport-size read (in setupListeners) assumed the\r\n // default 'vertical' axis before layout was known; now that the\r\n // real axis is known, re-read clientWidth/clientHeight against it.\r\n this.measureViewportSize();\r\n this.recomputeRange(true);\r\n }\r\n });\r\n });\r\n\r\n afterNextRender(() => this.setupListeners());\r\n\r\n this.destroyRef.onDestroy(() => {\r\n this.resizeObserver?.disconnect();\r\n cancelAnimationFrame(this.scrollRaf);\r\n clearTimeout(this.scrollingIdleTimer);\r\n });\r\n }\r\n\r\n /** Programmatically scroll to a given item index. */\r\n scrollToIndex(index: number, behavior: ScrollBehavior = 'auto'): void {\r\n const line = Math.floor(index / this.crossCount());\r\n this.scrollToOffset(line * this.lineSize(), behavior);\r\n }\r\n\r\n /**\r\n * Programmatically scroll to a given pixel offset along the scroll axis.\r\n * `offset` is expressed in real, uncompressed content px (i.e. the same\r\n * space as `index * lineSize()`) — internally converted to the\r\n * (possibly compressed) DOM scroll coordinate via `scaleFactor()`.\r\n */\r\n scrollToOffset(offset: number, behavior: ScrollBehavior = 'auto'): void {\r\n const el = this.scrollableRef().nativeElement;\r\n const domOffset = offset * this.scaleFactor();\r\n const options: ScrollToOptions =\r\n this.axis() === 'horizontal' ? { left: domOffset, behavior } : { top: domOffset, behavior };\r\n el.scrollTo(options);\r\n }\r\n\r\n /** Force a re-measure, e.g. after the container was resized by external layout logic. */\r\n checkViewportSize(): void {\r\n this.measureViewportSize();\r\n this.recomputeRange(true);\r\n }\r\n\r\n private setupListeners(): void {\r\n const el = this.scrollableRef().nativeElement;\r\n\r\n el.addEventListener('scroll', this.onScroll, { passive: true });\r\n this.destroyRef.onDestroy(() => el.removeEventListener('scroll', this.onScroll));\r\n\r\n if (typeof ResizeObserver !== 'undefined') {\r\n this.resizeObserver = new ResizeObserver(() => this.checkViewportSize());\r\n this.resizeObserver.observe(el);\r\n }\r\n\r\n this.measureViewportSize();\r\n }\r\n\r\n private readonly onScroll = (): void => {\r\n if (this.scrollRaf) {\r\n return;\r\n }\r\n this.scrollRaf = requestAnimationFrame(() => {\r\n this.scrollRaf = 0;\r\n this.markScrolling();\r\n\r\n const el = this.scrollableRef().nativeElement;\r\n const offset = this.axis() === 'horizontal' ? el.scrollLeft : el.scrollTop;\r\n this.scrollOffset.set(offset);\r\n this.recomputeRange(false);\r\n\r\n const size = this.lineSize();\r\n if (size > 0) {\r\n const realOffset = offset / this.scaleFactor();\r\n this.scrolledIndexChange.emit(Math.floor(realOffset / size) * this.crossCount());\r\n }\r\n });\r\n };\r\n\r\n private markScrolling(): void {\r\n this.isScrolling.set(true);\r\n clearTimeout(this.scrollingIdleTimer);\r\n this.scrollingIdleTimer = setTimeout(() => this.isScrolling.set(false), 150);\r\n }\r\n\r\n private measureViewportSize(): void {\r\n const el = this.scrollableRef().nativeElement;\r\n const size = this.axis() === 'horizontal' ? el.clientWidth : el.clientHeight;\r\n this.viewportSize.set(size);\r\n }\r\n\r\n /**\r\n * Recomputes the rendered line range. Mirrors the CDK \"fixed size\"\r\n * strategy: only recompute once the scroll offset gets within\r\n * `minBufferPx` of the current range's edge, instead of on every pixel.\r\n *\r\n * All math here happens in *real* (uncompressed) content px, obtained by\r\n * dividing the raw DOM scroll offset/viewport size by `scaleFactor()`.\r\n * This is what makes the very last items reachable even when the total\r\n * content size has been compressed into a browser-safe DOM range: as\r\n * `domScrollOffset` sweeps its full (capped) range, `realOffset` still\r\n * sweeps the entire, real `naturalTotalSize()`.\r\n */\r\n private recomputeRange(force: boolean): void {\r\n const lineSize = this.lineSize();\r\n if (lineSize <= 0) {\r\n return;\r\n }\r\n\r\n const scale = this.scaleFactor();\r\n const realOffset = this.scrollOffset() / scale;\r\n const realViewportSize = this.viewportSize() / scale;\r\n\r\n const current = this.range();\r\n const min = this.minBufferPx();\r\n const max = this.maxBufferPx();\r\n\r\n const distanceToStart = realOffset - current.start * lineSize;\r\n const distanceToEnd = current.end * lineSize - (realOffset + realViewportSize);\r\n\r\n if (!force && distanceToStart >= min && distanceToEnd >= min) {\r\n return;\r\n }\r\n\r\n const bufferStart = Math.max(0, realOffset - max);\r\n const bufferEnd = realOffset + realViewportSize + max;\r\n\r\n const start = Math.max(0, Math.floor(bufferStart / lineSize));\r\n const end = Math.min(this.lineCount(), Math.ceil(bufferEnd / lineSize));\r\n const next: NgxVirtualScrollRange = { start, end };\r\n\r\n if (!rangesEqual(next, current)) {\r\n this.range.set(next);\r\n this.rangeChange.emit(next);\r\n }\r\n }\r\n}\r\n","<div #scrollable class=\"ngx-virtual-scroll-viewport__scrollable\">\r\n <div\r\n class=\"ngx-virtual-scroll-viewport__spacer\"\r\n [style.width.px]=\"spacerWidth()\"\r\n [style.height.px]=\"spacerHeight()\"\r\n aria-hidden=\"true\"></div>\r\n <div #wrapper class=\"ngx-virtual-scroll-viewport__wrapper\" [style.transform]=\"wrapperTransform()\">\r\n <ng-content></ng-content>\r\n </div>\r\n</div>\r\n","/*\n * Public API surface of @ngx-kit/virtual-scroll\n */\n\nexport * from './components/virtual-scroll-viewport.component';\nexport * from './utils/measure-layout';\n\nexport * from './types/virtual-scroll-range.interface';\nexport * from './types/virtual-scroll-measurement.interface';\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":"ngx-kit-virtual-scroll.mjs","sources":["../../../projects/libs/virtual-scroll/types/virtual-scroll-range.interface.ts","../../../projects/libs/virtual-scroll/utils/measure-layout.ts","../../../projects/libs/virtual-scroll/components/virtual-scroll-viewport.component.ts","../../../projects/libs/virtual-scroll/components/virtual-scroll-viewport.component.html","../../../projects/libs/virtual-scroll/public-api.ts","../../../projects/libs/virtual-scroll/ngx-kit-virtual-scroll.ts"],"sourcesContent":["/**\n * A \"line\" index range that is currently rendered.\n * A \"line\" is one item for a plain list, or one row/column of N items\n * for an auto-detected wrapping grid. `end` is exclusive.\n */\nexport interface NgxVirtualScrollRange {\n start: number;\n end: number;\n}\n\nexport function rangesEqual(a: NgxVirtualScrollRange, b: NgxVirtualScrollRange): boolean {\n return a.start === b.start && a.end === b.end;\n}\n","import { NgxVirtualScrollMeasurement } from '../types/virtual-scroll-measurement.interface';\n\nconst TOP_TOLERANCE_PX = 0.5;\n\n/**\n * Pure, framework-agnostic layout probe.\n *\n * Reads the real bounding boxes of a small batch of already-rendered\n * elements and infers, purely from actual layout:\n * - the scroll axis (vertical vs horizontal)\n * - how many items share a single line (1 for a plain list, N for a\n * wrapping grid)\n * - the real size of one line, INCLUDING margins/border/box-shadow,\n * because it is derived from the delta between two real sibling\n * positions in normal document flow rather than from a hardcoded\n * itemSize input.\n *\n * No orientation/itemSize is ever supplied by the consumer — this is the\n * single source of truth for both.\n */\nexport function measureLayout(\n probeElements: readonly Element[],\n): NgxVirtualScrollMeasurement | null {\n if (probeElements.length === 0) {\n return null;\n }\n\n const rects = probeElements.map((el) => el.getBoundingClientRect());\n\n if (rects.length === 1) {\n // Not enough siblings to infer direction yet; assume a vertical list\n // (the overwhelmingly common case) using the element's own height.\n return { axis: 'vertical', crossCount: 1, lineSize: Math.max(rects[0].height, 1) };\n }\n\n const first = rects[0];\n\n // Find the first probed item that starts a new line (its top differs\n // meaningfully from the first item's top).\n let wrapIndex = -1;\n for (let i = 1; i < rects.length; i++) {\n if (Math.abs(rects[i].top - first.top) > TOP_TOLERANCE_PX) {\n wrapIndex = i;\n break;\n }\n }\n\n if (wrapIndex === -1) {\n // Every probed item shares the same line -> a single horizontal line.\n const lineSize = rects[1].left - first.left;\n return { axis: 'horizontal', crossCount: 1, lineSize: Math.max(lineSize, 1) };\n }\n\n if (wrapIndex === 1) {\n // The very next item is already on a new line -> a plain vertical list.\n const lineSize = rects[1].top - first.top;\n return { axis: 'vertical', crossCount: 1, lineSize: Math.max(lineSize, 1) };\n }\n\n // Several items share the first line before wrapping -> a wrapping grid.\n const crossCount = wrapIndex;\n const lineSize = rects[wrapIndex].top - first.top;\n return { axis: 'vertical', crossCount, lineSize: Math.max(lineSize, 1) };\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n ViewEncapsulation,\n afterNextRender,\n afterRenderEffect,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\n\nimport { NgxVirtualScrollRange, rangesEqual } from '../types/virtual-scroll-range.interface';\nimport {\n NgxVirtualScrollAxis,\n NgxVirtualScrollMeasureFn,\n NgxVirtualScrollMeasurement,\n} from '../types/virtual-scroll-measurement.interface';\nimport { measureLayout } from '../utils/measure-layout';\n\n/** How many items are rendered \"in the open\" (no transform) purely to probe their real layout. */\nconst PROBE_COUNT = 24;\n\n/**\n * Browsers clamp any single element's CSS width/height (and therefore\n * `scrollWidth`/`scrollHeight`) to a hard maximum — roughly 33,554,428px in\n * Chromium and considerably less in older WebKit (historically ~8,388,608px)\n * and Gecko (~17,895,697px). Once the spacer element (used purely to give\n * the native scrollbar the right size) exceeds that ceiling, the browser\n * silently clamps it, the scrollbar stops early, and everything past that\n * point becomes unreachable — exactly the \"stuck around 524k rows\" symptom.\n *\n * To support arbitrarily large data sets we cap the spacer at this safe\n * ceiling and scroll the DOM in a *compressed* coordinate space, while all\n * index math still happens against the real, uncompressed pixel space (see\n * `scaleFactor`). Kept conservative (well under every known browser cap) so\n * it works everywhere without per-browser detection.\n */\nconst DEFAULT_MAX_AXIS_SIZE_PX = 6_000_000;\n\n/**\n * Headless, signal-based virtual scroll viewport.\n *\n * There is no `itemSize` and no `orientation` input by design: both are\n * derived by measuring the real, rendered bounding boxes of a small probe\n * batch (see `measure-layout.ts`), so margins/border/box-shadow on your own\n * item styles are always accounted for correctly, and mixed layouts\n * (vertical list of wrapping rows, i.e. a card grid) are supported out of\n * the box.\n *\n * The component does not render your items itself — it exposes reactive\n * signals (`visibleItems`, `range`, `baseIndex`, `axis`, ...) that you\n * consume with a native `@for` block in your own template. This keeps the\n * repeat/track logic entirely under your control (custom track expressions,\n * `@empty` blocks, etc.) instead of hiding it behind a structural directive.\n *\n * @example\n * ```html\n * <ngx-virtual-scroll-viewport #vs=\"ngxVirtualScrollViewport\" [items]=\"rows\" style=\"height: 480px\">\n * @for (row of vs.visibleItems(); track row.id; let i = $index) {\n * <div class=\"row\">{{ vs.baseIndex() + i }} - {{ row.name }}</div>\n * }\n * </ngx-virtual-scroll-viewport>\n * ```\n */\n@Component({\n selector: 'ngx-virtual-scroll-viewport, ngx-virtual-scroll',\n standalone: true,\n templateUrl: './virtual-scroll-viewport.component.html',\n styleUrl: './virtual-scroll-viewport.component.scss',\n exportAs: 'ngxVirtualScrollViewport',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ngx-virtual-scroll-viewport-host',\n '[class.ngx-virtual-scroll-viewport-host--scrolling]': 'isScrolling()',\n },\n})\nexport class NgxVirtualScrollViewport<T = unknown> {\n /** The full, unvirtualized data set. */\n readonly items = input<readonly T[]>([]);\n\n /** Minimum buffer (px) left before the render range is recomputed. */\n readonly minBufferPx = input(150);\n\n /** Extra buffer (px) rendered outside the visible area on each side. */\n readonly maxBufferPx = input(300);\n\n /** Advanced escape hatch: replace the built-in layout probe entirely. */\n readonly measureFn = input<NgxVirtualScrollMeasureFn | undefined>(undefined);\n\n /**\n * Safe ceiling (px) for the scrollable axis's real DOM size. Only relevant\n * for very large data sets — see `DEFAULT_MAX_AXIS_SIZE_PX`. You should\n * not need to change this; it's exposed only for advanced cases (e.g. you\n * know your app never targets older WebKit and want to raise the ceiling).\n */\n readonly maxAxisSizePx = input(DEFAULT_MAX_AXIS_SIZE_PX);\n\n /** Emits the index of the first fully-visible item as the user scrolls. */\n readonly scrolledIndexChange = output<number>();\n\n /** Emits whenever the rendered line range changes. */\n readonly rangeChange = output<NgxVirtualScrollRange>();\n\n private readonly scrollableRef = viewChild.required<ElementRef<HTMLElement>>('scrollable');\n private readonly wrapperRef = viewChild.required<ElementRef<HTMLElement>>('wrapper');\n\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly measurement = signal<NgxVirtualScrollMeasurement | null>(null);\n private readonly scrollOffset = signal(0);\n private readonly viewportSize = signal(0);\n\n /** Whether the user is actively scrolling (used only to toggle `will-change`). */\n readonly isScrolling = signal(false);\n\n /** Currently rendered line range. */\n readonly range = signal<NgxVirtualScrollRange>({ start: 0, end: PROBE_COUNT });\n\n readonly axis = computed<NgxVirtualScrollAxis>(() => this.measurement()?.axis ?? 'vertical');\n readonly crossCount = computed(() => this.measurement()?.crossCount ?? 1);\n readonly lineSize = computed(() => this.measurement()?.lineSize ?? 0);\n readonly isMeasured = computed(() => this.measurement() !== null);\n\n readonly lineCount = computed(() => Math.ceil(this.items().length / this.crossCount()));\n\n /** Real, uncompressed total size along the scroll axis — can exceed the browser's element-size cap. */\n readonly naturalTotalSize = computed(() => this.lineCount() * this.lineSize());\n\n /**\n * Size actually applied to the spacer element, clamped to `maxAxisSizePx`.\n * Equal to `naturalTotalSize()` for any data set small enough to matter in\n * practice — the compression only ever engages for extreme list sizes.\n */\n readonly totalSize = computed(() => Math.min(this.naturalTotalSize(), this.maxAxisSizePx()));\n\n /**\n * Ratio between the (possibly capped) DOM scroll space and the real,\n * uncompressed content size. `1` unless `naturalTotalSize()` exceeds\n * `maxAxisSizePx()`, in which case it's `< 1` and the DOM scrollbar\n * represents the whole data set in a compressed coordinate space.\n */\n readonly scaleFactor = computed(() => {\n const natural = this.naturalTotalSize();\n return natural > 0 ? this.totalSize() / natural : 1;\n });\n\n /** Absolute index of the first item in `visibleItems()`, for display purposes. */\n readonly baseIndex = computed(() => this.range().start * this.crossCount());\n\n /** Slice of `items()` that should actually be rendered right now. */\n readonly visibleItems = computed<readonly T[]>(() => {\n const data = this.items();\n const { start, end } = this.range();\n const cross = this.crossCount();\n return data.slice(start * cross, Math.min(data.length, end * cross));\n });\n\n // Expressed in the same compressed DOM coordinate space as `scrollOffset`/\n // `totalSize`, so it always stays within the safe, capped range even for\n // enormous data sets — see `scaleFactor`.\n //\n // The naive `start * lineSize * scaleFactor` value is only an *ideal*\n // proportional position. It is clamped so the *real* (unscaled) rendered\n // block — `renderedBlockSize()` — can never be pushed past the end of the\n // capped spacer. Without this clamp, once `scaleFactor() < 1`, the block\n // rendered near the tail (real, unscaled size) no longer fits in the tiny\n // sliver of compressed space \"ideally\" left for it, so it gets positioned\n // partly (or entirely) past the bottom of the scrollable area — reachable\n // in the DOM, but never inside the visible/scrollable viewport. Clamping\n // guarantees the tail of the list is always flush with, and fully inside,\n // the scrollable area.\n private readonly renderedBlockSize = computed(() => {\n const { start, end } = this.range();\n return (end - start) * this.lineSize();\n });\n\n private readonly contentOffset = computed(() => {\n const ideal = this.range().start * this.lineSize() * this.scaleFactor();\n const max = Math.max(0, this.totalSize() - this.renderedBlockSize());\n return Math.min(ideal, max);\n });\n\n protected readonly wrapperTransform = computed(() =>\n this.axis() === 'horizontal'\n ? `translateX(${this.contentOffset()}px)`\n : `translateY(${this.contentOffset()}px)`,\n );\n protected readonly spacerWidth = computed(() =>\n this.axis() === 'horizontal' ? this.totalSize() : 1,\n );\n protected readonly spacerHeight = computed(() =>\n this.axis() === 'vertical' ? this.totalSize() : 1,\n );\n\n private resizeObserver?: ResizeObserver;\n private scrollingIdleTimer?: ReturnType<typeof setTimeout>;\n private scrollRaf = 0;\n\n constructor() {\n // Seed / reset the probe range whenever the data set changes and we\n // haven't measured a real layout yet.\n effect(() => {\n const length = this.items().length;\n if (!this.measurement()) {\n this.range.set({ start: 0, end: Math.min(length, PROBE_COUNT) });\n }\n });\n\n // Read the real, rendered layout of the probe batch once it has\n // painted. Runs in the `read` phase so it never interleaves with DOM\n // writes and never forces a layout thrash.\n afterRenderEffect({\n read: () => {\n if (this.measurement()) {\n return;\n }\n const children = Array.from(this.wrapperRef().nativeElement.children).slice(0, PROBE_COUNT);\n const measure = this.measureFn() ?? measureLayout;\n const result = measure(children);\n if (result) {\n this.measurement.set(result);\n }\n },\n });\n\n // Once measured (or when the buffer inputs change), recompute the\n // actual visible range from the real viewport size / scroll offset.\n // `untracked` is used because `recomputeRange` itself reads scroll/size\n // signals that are already kept in sync by the scroll/resize listeners\n // directly — we only want *this* effect to re-run for buffer/measurement\n // changes, not for every scroll frame.\n effect(() => {\n this.minBufferPx();\n this.maxBufferPx();\n const measured = this.isMeasured();\n untracked(() => {\n if (measured) {\n // The initial viewport-size read (in setupListeners) assumed the\n // default 'vertical' axis before layout was known; now that the\n // real axis is known, re-read clientWidth/clientHeight against it.\n this.measureViewportSize();\n this.recomputeRange(true);\n }\n });\n });\n\n afterNextRender(() => this.setupListeners());\n\n this.destroyRef.onDestroy(() => {\n this.resizeObserver?.disconnect();\n cancelAnimationFrame(this.scrollRaf);\n clearTimeout(this.scrollingIdleTimer);\n });\n }\n\n /** Programmatically scroll to a given item index. */\n scrollToIndex(index: number, behavior: ScrollBehavior = 'auto'): void {\n const line = Math.floor(index / this.crossCount());\n this.scrollToOffset(line * this.lineSize(), behavior);\n }\n\n /**\n * Programmatically scroll to a given pixel offset along the scroll axis.\n * `offset` is expressed in real, uncompressed content px (i.e. the same\n * space as `index * lineSize()`) — internally converted to the\n * (possibly compressed) DOM scroll coordinate via `scaleFactor()`.\n */\n scrollToOffset(offset: number, behavior: ScrollBehavior = 'auto'): void {\n const el = this.scrollableRef().nativeElement;\n const domOffset = offset * this.scaleFactor();\n const options: ScrollToOptions =\n this.axis() === 'horizontal' ? { left: domOffset, behavior } : { top: domOffset, behavior };\n el.scrollTo(options);\n }\n\n /** Force a re-measure, e.g. after the container was resized by external layout logic. */\n checkViewportSize(): void {\n this.measureViewportSize();\n this.recomputeRange(true);\n }\n\n private setupListeners(): void {\n const el = this.scrollableRef().nativeElement;\n\n el.addEventListener('scroll', this.onScroll, { passive: true });\n this.destroyRef.onDestroy(() => el.removeEventListener('scroll', this.onScroll));\n\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(() => this.checkViewportSize());\n this.resizeObserver.observe(el);\n }\n\n this.measureViewportSize();\n }\n\n private readonly onScroll = (): void => {\n if (this.scrollRaf) {\n return;\n }\n this.scrollRaf = requestAnimationFrame(() => {\n this.scrollRaf = 0;\n this.markScrolling();\n\n const el = this.scrollableRef().nativeElement;\n const offset = this.axis() === 'horizontal' ? el.scrollLeft : el.scrollTop;\n this.scrollOffset.set(offset);\n this.recomputeRange(false);\n\n const size = this.lineSize();\n if (size > 0) {\n const realOffset = offset / this.scaleFactor();\n this.scrolledIndexChange.emit(Math.floor(realOffset / size) * this.crossCount());\n }\n });\n };\n\n private markScrolling(): void {\n this.isScrolling.set(true);\n clearTimeout(this.scrollingIdleTimer);\n this.scrollingIdleTimer = setTimeout(() => this.isScrolling.set(false), 150);\n }\n\n private measureViewportSize(): void {\n const el = this.scrollableRef().nativeElement;\n const size = this.axis() === 'horizontal' ? el.clientWidth : el.clientHeight;\n this.viewportSize.set(size);\n }\n\n /**\n * Recomputes the rendered line range. Mirrors the CDK \"fixed size\"\n * strategy: only recompute once the scroll offset gets within\n * `minBufferPx` of the current range's edge, instead of on every pixel.\n *\n * All math here happens in *real* (uncompressed) content px, obtained by\n * dividing the raw DOM scroll offset/viewport size by `scaleFactor()`.\n * This is what makes the very last items reachable even when the total\n * content size has been compressed into a browser-safe DOM range: as\n * `domScrollOffset` sweeps its full (capped) range, `realOffset` still\n * sweeps the entire, real `naturalTotalSize()`.\n */\n private recomputeRange(force: boolean): void {\n const lineSize = this.lineSize();\n if (lineSize <= 0) {\n return;\n }\n\n const scale = this.scaleFactor();\n const realOffset = this.scrollOffset() / scale;\n const realViewportSize = this.viewportSize() / scale;\n\n const current = this.range();\n const min = this.minBufferPx();\n const max = this.maxBufferPx();\n\n const distanceToStart = realOffset - current.start * lineSize;\n const distanceToEnd = current.end * lineSize - (realOffset + realViewportSize);\n\n if (!force && distanceToStart >= min && distanceToEnd >= min) {\n return;\n }\n\n const bufferStart = Math.max(0, realOffset - max);\n const bufferEnd = realOffset + realViewportSize + max;\n\n const start = Math.max(0, Math.floor(bufferStart / lineSize));\n const end = Math.min(this.lineCount(), Math.ceil(bufferEnd / lineSize));\n const next: NgxVirtualScrollRange = { start, end };\n\n if (!rangesEqual(next, current)) {\n this.range.set(next);\n this.rangeChange.emit(next);\n }\n }\n}\n","<div #scrollable class=\"ngx-virtual-scroll-viewport__scrollable\">\n <div\n class=\"ngx-virtual-scroll-viewport__spacer\"\n [style.width.px]=\"spacerWidth()\"\n [style.height.px]=\"spacerHeight()\"\n aria-hidden=\"true\"></div>\n <div #wrapper class=\"ngx-virtual-scroll-viewport__wrapper\" [style.transform]=\"wrapperTransform()\">\n <ng-content></ng-content>\n </div>\n</div>\n","/*\n * Public API surface of @ngx-kit/virtual-scroll\n */\n\nexport * from './components/virtual-scroll-viewport.component';\nexport * from './utils/measure-layout';\n\nexport * from './types/virtual-scroll-range.interface';\nexport * from './types/virtual-scroll-measurement.interface';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}