@frame-ui-ng/components 0.5.1-beta.0 → 0.6.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/accordion/src/styles/_vars.css +2 -5
  2. package/accordion/src/styles/accordion.css +44 -30
  3. package/breadcrumb/src/styles/breadcrumb.css +12 -2
  4. package/button/src/styles/button.css +5 -51
  5. package/button-group/src/styles/button-group.css +0 -38
  6. package/calendar/src/styles/_vars.css +4 -0
  7. package/calendar/src/styles/calendar.css +26 -18
  8. package/carousel/src/styles/carousel.css +103 -89
  9. package/checkbox/src/styles/checkbox.css +14 -5
  10. package/collapsible/src/styles/_vars.css +1 -0
  11. package/collapsible/src/styles/collapsible.css +15 -11
  12. package/combobox/src/styles/combobox.css +11 -2
  13. package/confirm-popover/src/styles/confirm-popover.css +0 -1
  14. package/date-picker/src/styles/date-picker.css +15 -10
  15. package/dropdown-menu/src/styles/dropdown-menu-item.css +6 -2
  16. package/fesm2022/frame-ui-ng-components-accordion.mjs +201 -147
  17. package/fesm2022/frame-ui-ng-components-accordion.mjs.map +1 -1
  18. package/fesm2022/frame-ui-ng-components-alert.mjs +2 -2
  19. package/fesm2022/frame-ui-ng-components-alert.mjs.map +1 -1
  20. package/fesm2022/frame-ui-ng-components-breadcrumb.mjs +10 -2
  21. package/fesm2022/frame-ui-ng-components-breadcrumb.mjs.map +1 -1
  22. package/fesm2022/frame-ui-ng-components-button-group.mjs +2 -2
  23. package/fesm2022/frame-ui-ng-components-button-group.mjs.map +1 -1
  24. package/fesm2022/frame-ui-ng-components-button.mjs +2 -2
  25. package/fesm2022/frame-ui-ng-components-button.mjs.map +1 -1
  26. package/fesm2022/frame-ui-ng-components-calendar.mjs +202 -50
  27. package/fesm2022/frame-ui-ng-components-calendar.mjs.map +1 -1
  28. package/fesm2022/frame-ui-ng-components-card.mjs +2 -2
  29. package/fesm2022/frame-ui-ng-components-card.mjs.map +1 -1
  30. package/fesm2022/frame-ui-ng-components-carousel.mjs +2 -2
  31. package/fesm2022/frame-ui-ng-components-carousel.mjs.map +1 -1
  32. package/fesm2022/frame-ui-ng-components-collapsible.mjs +80 -22
  33. package/fesm2022/frame-ui-ng-components-collapsible.mjs.map +1 -1
  34. package/fesm2022/frame-ui-ng-components-combobox.mjs +61 -6
  35. package/fesm2022/frame-ui-ng-components-combobox.mjs.map +1 -1
  36. package/fesm2022/frame-ui-ng-components-command.mjs +2 -2
  37. package/fesm2022/frame-ui-ng-components-command.mjs.map +1 -1
  38. package/fesm2022/frame-ui-ng-components-confirm-popover.mjs +6 -6
  39. package/fesm2022/frame-ui-ng-components-confirm-popover.mjs.map +1 -1
  40. package/fesm2022/frame-ui-ng-components-date-picker.mjs +75 -37
  41. package/fesm2022/frame-ui-ng-components-date-picker.mjs.map +1 -1
  42. package/fesm2022/frame-ui-ng-components-dropdown-menu.mjs +2 -2
  43. package/fesm2022/frame-ui-ng-components-dropdown-menu.mjs.map +1 -1
  44. package/fesm2022/frame-ui-ng-components-empty.mjs +2 -2
  45. package/fesm2022/frame-ui-ng-components-empty.mjs.map +1 -1
  46. package/fesm2022/frame-ui-ng-components-hover-card.mjs +2 -2
  47. package/fesm2022/frame-ui-ng-components-hover-card.mjs.map +1 -1
  48. package/fesm2022/frame-ui-ng-components-input-otp.mjs +2 -2
  49. package/fesm2022/frame-ui-ng-components-input-otp.mjs.map +1 -1
  50. package/fesm2022/frame-ui-ng-components-input.mjs +2 -2
  51. package/fesm2022/frame-ui-ng-components-input.mjs.map +1 -1
  52. package/fesm2022/frame-ui-ng-components-item.mjs +2 -2
  53. package/fesm2022/frame-ui-ng-components-item.mjs.map +1 -1
  54. package/fesm2022/frame-ui-ng-components-menubar.mjs +2 -2
  55. package/fesm2022/frame-ui-ng-components-menubar.mjs.map +1 -1
  56. package/fesm2022/frame-ui-ng-components-modal.mjs +10 -4
  57. package/fesm2022/frame-ui-ng-components-modal.mjs.map +1 -1
  58. package/fesm2022/frame-ui-ng-components-navigation-menu.mjs +4 -4
  59. package/fesm2022/frame-ui-ng-components-navigation-menu.mjs.map +1 -1
  60. package/fesm2022/frame-ui-ng-components-pagination.mjs +20 -4
  61. package/fesm2022/frame-ui-ng-components-pagination.mjs.map +1 -1
  62. package/fesm2022/frame-ui-ng-components-popover.mjs +2 -2
  63. package/fesm2022/frame-ui-ng-components-popover.mjs.map +1 -1
  64. package/fesm2022/frame-ui-ng-components-radio-group.mjs +2 -2
  65. package/fesm2022/frame-ui-ng-components-radio-group.mjs.map +1 -1
  66. package/fesm2022/frame-ui-ng-components-resizable.mjs +2 -2
  67. package/fesm2022/frame-ui-ng-components-resizable.mjs.map +1 -1
  68. package/fesm2022/frame-ui-ng-components-sheet.mjs +90 -65
  69. package/fesm2022/frame-ui-ng-components-sheet.mjs.map +1 -1
  70. package/fesm2022/frame-ui-ng-components-table.mjs +6 -5
  71. package/fesm2022/frame-ui-ng-components-table.mjs.map +1 -1
  72. package/fesm2022/frame-ui-ng-components-tabs.mjs +2 -2
  73. package/fesm2022/frame-ui-ng-components-tabs.mjs.map +1 -1
  74. package/fesm2022/frame-ui-ng-components-toast.mjs +6 -6
  75. package/fesm2022/frame-ui-ng-components-toast.mjs.map +1 -1
  76. package/fesm2022/frame-ui-ng-components-tooltip.mjs +6 -6
  77. package/fesm2022/frame-ui-ng-components-tooltip.mjs.map +1 -1
  78. package/fesm2022/frame-ui-ng-components-virtual-scroll.mjs +4 -4
  79. package/fesm2022/frame-ui-ng-components-virtual-scroll.mjs.map +1 -1
  80. package/fesm2022/frame-ui-ng-components.mjs +850 -420
  81. package/fesm2022/frame-ui-ng-components.mjs.map +1 -1
  82. package/input/src/styles/input-group.css +0 -7
  83. package/input/src/styles/input.css +0 -23
  84. package/modal/src/styles/modal.css +5 -19
  85. package/package.json +6 -6
  86. package/pagination/src/styles/pagination.css +6 -2
  87. package/popover/src/styles/popover.css +3 -3
  88. package/select/src/styles/select-item.css +67 -68
  89. package/sheet/src/styles/sheet.css +32 -19
  90. package/src/styles/components.css +2 -2
  91. package/src/styles/corner-handles.css +217 -0
  92. package/styles/components.css +2 -2
  93. package/styles/corner-handles.css +217 -0
  94. package/styles.css +2 -2
  95. package/toggle/src/styles/toggle.css +6 -1
  96. package/tooltip/src/styles/tooltip.css +0 -1
  97. package/types/frame-ui-ng-components-accordion.d.ts +69 -61
  98. package/types/frame-ui-ng-components-calendar.d.ts +7 -7
  99. package/types/frame-ui-ng-components-collapsible.d.ts +12 -4
  100. package/types/frame-ui-ng-components-combobox.d.ts +8 -0
  101. package/types/frame-ui-ng-components-date-picker.d.ts +2 -4
  102. package/types/frame-ui-ng-components-sheet.d.ts +6 -2
  103. package/types/frame-ui-ng-components.d.ts +172 -135
  104. package/src/styles/blueprint.css +0 -707
  105. package/styles/blueprint.css +0 -707
@@ -108,7 +108,7 @@ class FrVirtualViewport {
108
108
  this.resizeObserver.observe(element);
109
109
  }
110
110
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrVirtualViewport, deps: [], target: i0.ɵɵFactoryTarget.Directive });
111
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrVirtualViewport, isStandalone: true, selector: "[frVirtualViewport], frame-virtual-viewport", inputs: { itemSize: { classPropertyName: "itemSize", publicName: "itemSize", isSignal: true, isRequired: true, transformFunction: null }, overscan: { classPropertyName: "overscan", publicName: "overscan", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "scroll": "handleScroll()" }, properties: { "style.block-size": "height()" }, classAttribute: "frame-virtual-scroll__viewport" }, exportAs: ["frVirtualViewport"], ngImport: i0 });
111
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrVirtualViewport, isStandalone: true, selector: "[frVirtualViewport], frame-virtual-viewport", inputs: { itemSize: { classPropertyName: "itemSize", publicName: "itemSize", isSignal: true, isRequired: true, transformFunction: null }, overscan: { classPropertyName: "overscan", publicName: "overscan", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "scroll": "handleScroll()" }, properties: { "style.block-size": "height()" }, classAttribute: "frame-virtual-scroll__viewport frame-corner-handles" }, exportAs: ["frVirtualViewport"], ngImport: i0 });
112
112
  }
113
113
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrVirtualViewport, decorators: [{
114
114
  type: Directive,
@@ -116,7 +116,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
116
116
  selector: '[frVirtualViewport], frame-virtual-viewport',
117
117
  exportAs: 'frVirtualViewport',
118
118
  host: {
119
- class: 'frame-virtual-scroll__viewport',
119
+ class: 'frame-virtual-scroll__viewport frame-corner-handles',
120
120
  '(scroll)': 'handleScroll()',
121
121
  '[style.block-size]': 'height()',
122
122
  },
@@ -234,14 +234,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
234
234
  /** List wrapper for virtualized items. */
235
235
  class FrVirtualList {
236
236
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrVirtualList, deps: [], target: i0.ɵɵFactoryTarget.Directive });
237
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrVirtualList, isStandalone: true, selector: "[frVirtualList], frame-virtual-list", host: { classAttribute: "frame-virtual-scroll__list" }, ngImport: i0 });
237
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrVirtualList, isStandalone: true, selector: "[frVirtualList], frame-virtual-list", host: { classAttribute: "frame-virtual-scroll__list frame-corner-handles" }, ngImport: i0 });
238
238
  }
239
239
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrVirtualList, decorators: [{
240
240
  type: Directive,
241
241
  args: [{
242
242
  selector: '[frVirtualList], frame-virtual-list',
243
243
  host: {
244
- class: 'frame-virtual-scroll__list',
244
+ class: 'frame-virtual-scroll__list frame-corner-handles',
245
245
  },
246
246
  }]
247
247
  }] });
@@ -1 +1 @@
1
- {"version":3,"file":"frame-ui-ng-components-virtual-scroll.mjs","sources":["../../../projects/components/virtual-scroll/src/virtual-scroll.engine.ts","../../../projects/components/virtual-scroll/src/virtual-scroll.viewport.ts","../../../projects/components/virtual-scroll/src/virtual-scroll.content.ts","../../../projects/components/virtual-scroll/src/virtual-scroll.for.ts","../../../projects/components/virtual-scroll/src/virtual-scroll.primitives.ts","../../../projects/components/virtual-scroll/virtual-scroll.module.ts","../../../projects/components/virtual-scroll/frame-ui-ng-components-virtual-scroll.ts"],"sourcesContent":["import { clampNumber } from '@frame-ui-ng/components/utils';\r\n\r\nexport interface FrVirtualRange {\r\n start: number;\r\n end: number;\r\n before: number;\r\n after: number;\r\n}\r\n\r\nexport interface FrVirtualRangeOptions {\r\n itemSize: number;\r\n overscan: number;\r\n scrollTop: number;\r\n totalCount: number;\r\n viewportSize: number;\r\n}\r\n\r\nexport type FrVirtualScrollAlignment = 'auto' | 'start' | 'center' | 'end' | 'nearest';\r\n\r\nexport function calculateVirtualRange(options: FrVirtualRangeOptions): FrVirtualRange {\r\n const itemSize = Math.max(options.itemSize, 1);\r\n const totalCount = Math.max(options.totalCount, 0);\r\n const viewportSize = Math.max(options.viewportSize, 0);\r\n const overscan = Math.max(Math.trunc(options.overscan), 0);\r\n const visibleCount = Math.max(Math.ceil(viewportSize / itemSize), 1);\r\n const rawStart = Math.floor(Math.max(options.scrollTop, 0) / itemSize) - overscan;\r\n const start = clampNumber(rawStart, 0, totalCount);\r\n const end = clampNumber(start + visibleCount + overscan * 2, start, totalCount);\r\n\r\n return {\r\n start,\r\n end,\r\n before: start * itemSize,\r\n after: Math.max(totalCount - end, 0) * itemSize,\r\n };\r\n}\r\n\r\nexport function calculateScrollOffsetForIndex(\r\n index: number,\r\n alignment: FrVirtualScrollAlignment,\r\n itemSize: number,\r\n viewportSize: number,\r\n totalCount: number,\r\n currentScrollTop: number,\r\n): number {\r\n const normalizedItemSize = Math.max(itemSize, 1);\r\n const normalizedViewportSize = Math.max(viewportSize, 0);\r\n const maxScrollTop = Math.max(totalCount * normalizedItemSize - normalizedViewportSize, 0);\r\n const clampedIndex = clampNumber(index, 0, Math.max(totalCount - 1, 0));\r\n const itemStart = clampedIndex * normalizedItemSize;\r\n const itemEnd = itemStart + normalizedItemSize;\r\n\r\n switch (alignment) {\r\n case 'start':\r\n return clampNumber(itemStart, 0, maxScrollTop);\r\n case 'center':\r\n return clampNumber(itemStart - (normalizedViewportSize - normalizedItemSize) / 2, 0, maxScrollTop);\r\n case 'end':\r\n return clampNumber(itemEnd - normalizedViewportSize, 0, maxScrollTop);\r\n case 'nearest':\r\n case 'auto':\r\n default:\r\n if (itemStart < currentScrollTop) {\r\n return clampNumber(itemStart, 0, maxScrollTop);\r\n }\r\n\r\n if (itemEnd > currentScrollTop + normalizedViewportSize) {\r\n return clampNumber(itemEnd - normalizedViewportSize, 0, maxScrollTop);\r\n }\r\n\r\n return clampNumber(currentScrollTop, 0, maxScrollTop);\r\n }\r\n}\r\n","import {\r\n Directive,\r\n DestroyRef,\r\n ElementRef,\r\n computed,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\n\r\nimport {\r\n FrVirtualScrollAlignment,\r\n calculateScrollOffsetForIndex,\r\n calculateVirtualRange,\r\n} from './virtual-scroll.engine';\r\n\r\n/** Viewport controller for virtual scrolling. */\r\n@Directive({\r\n selector: '[frVirtualViewport], frame-virtual-viewport',\r\n exportAs: 'frVirtualViewport',\r\n host: {\r\n class: 'frame-virtual-scroll__viewport',\r\n '(scroll)': 'handleScroll()',\r\n '[style.block-size]': 'height()',\r\n },\r\n})\r\nexport class FrVirtualViewport {\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly scrollTop = signal(0);\r\n private readonly totalCount = signal(0);\r\n private readonly viewportSize = signal(0);\r\n private resizeObserver: ResizeObserver | null = null;\r\n\r\n readonly itemSize = input.required<number>();\r\n readonly overscan = input(4);\r\n readonly height = input<string | null>(null);\r\n\r\n readonly range = computed(() =>\r\n calculateVirtualRange({\r\n itemSize: this.itemSize(),\r\n overscan: this.overscan(),\r\n scrollTop: this.scrollTop(),\r\n totalCount: this.totalCount(),\r\n viewportSize: this.viewportSize(),\r\n }),\r\n );\r\n\r\n readonly before = computed(() => this.range().before);\r\n readonly after = computed(() => this.range().after);\r\n readonly startIndex = computed(() => this.range().start);\r\n readonly endIndex = computed(() => this.range().end);\r\n readonly renderedCount = computed(() => this.range().end - this.range().start);\r\n readonly totalSize = computed(() => this.totalCount() * Math.max(this.itemSize(), 1));\r\n\r\n constructor() {\r\n queueMicrotask(() => {\r\n this.measure();\r\n this.attachResizeObserver();\r\n });\r\n\r\n this.destroyRef.onDestroy(() => {\r\n this.resizeObserver?.disconnect();\r\n });\r\n }\r\n\r\n setTotalCount(count: number): void {\r\n this.totalCount.set(Math.max(Math.trunc(count), 0));\r\n this.measure();\r\n }\r\n\r\n measure(): void {\r\n const element = this.elementRef.nativeElement;\r\n this.viewportSize.set(element.clientHeight);\r\n this.scrollTop.set(element.scrollTop);\r\n }\r\n\r\n scrollToIndex(index: number, alignment: FrVirtualScrollAlignment = 'auto'): void {\r\n const element = this.elementRef.nativeElement;\r\n // Virtual scrolling assumes fixed item heights, so index math can stay O(1).\r\n const nextScrollTop = calculateScrollOffsetForIndex(\r\n index,\r\n alignment,\r\n this.itemSize(),\r\n element.clientHeight,\r\n this.totalCount(),\r\n element.scrollTop,\r\n );\r\n\r\n element.scrollTop = nextScrollTop;\r\n this.scrollTop.set(nextScrollTop);\r\n }\r\n\r\n protected handleScroll(): void {\r\n this.scrollTop.set(this.elementRef.nativeElement.scrollTop);\r\n }\r\n\r\n private attachResizeObserver(): void {\r\n const element = this.elementRef.nativeElement;\r\n\r\n if (typeof ResizeObserver === 'undefined') {\r\n return;\r\n }\r\n\r\n this.resizeObserver = new ResizeObserver(() => {\r\n this.measure();\r\n });\r\n this.resizeObserver.observe(element);\r\n }\r\n}\r\n\r\n","import { Directive, computed, inject } from '@angular/core';\r\n\r\nimport { FrVirtualViewport } from './virtual-scroll.viewport';\r\n\r\n/** Measured content wrapper for virtual scrolling. */\r\n@Directive({\r\n selector: '[frVirtualContent], frame-virtual-content',\r\n host: {\r\n class: 'frame-virtual-scroll__content',\r\n '[style.padding-top.px]': 'before()',\r\n '[style.padding-bottom.px]': 'after()',\r\n },\r\n})\r\nexport class FrVirtualContent {\r\n private readonly viewport = inject(FrVirtualViewport);\r\n\r\n protected readonly before = computed(() => this.viewport.before());\r\n protected readonly after = computed(() => this.viewport.after());\r\n}\r\n\r\n","import {\r\n Directive,\r\n DoCheck,\r\n EmbeddedViewRef,\r\n TemplateRef,\r\n ViewContainerRef,\r\n computed,\r\n inject,\r\n input,\r\n} from '@angular/core';\r\n\r\nimport { FrVirtualViewport } from './virtual-scroll.viewport';\r\n\r\nexport interface FrVirtualForContext<T> {\r\n $implicit: T;\r\n count: number;\r\n even: boolean;\r\n first: boolean;\r\n index: number;\r\n last: boolean;\r\n odd: boolean;\r\n}\r\n\r\nexport type FrVirtualTrackBy<T> = (index: number, item: T) => unknown;\r\n\r\n/** Structural directive for rendering virtualized ranges. */\r\n@Directive({\r\n selector: '[frVirtualFor][frVirtualForOf]',\r\n})\r\nexport class FrVirtualFor<T> implements DoCheck {\r\n private readonly templateRef = inject<TemplateRef<FrVirtualForContext<T>>>(TemplateRef);\r\n private readonly viewContainerRef = inject(ViewContainerRef);\r\n private readonly viewport = inject(FrVirtualViewport);\r\n private readonly views: EmbeddedViewRef<FrVirtualForContext<T>>[] = [];\r\n\r\n readonly frVirtualForOf = input.required<readonly T[]>();\r\n readonly frVirtualForTrackBy = input<FrVirtualTrackBy<T> | null>(null);\r\n private lastRenderKey = '';\r\n\r\n private readonly slice = computed(() => {\r\n const items = this.frVirtualForOf();\r\n const start = this.viewport.startIndex();\r\n const end = this.viewport.endIndex();\r\n\r\n return {\r\n items,\r\n start,\r\n visible: items.slice(start, end),\r\n };\r\n });\r\n\r\n ngDoCheck(): void {\r\n const items = this.frVirtualForOf();\r\n const renderKey = [\r\n items,\r\n items.length,\r\n this.viewport.startIndex(),\r\n this.viewport.endIndex(),\r\n this.frVirtualForTrackBy(),\r\n ].map(String).join('|');\r\n\r\n this.viewport.setTotalCount(items.length);\r\n\r\n if (renderKey === this.lastRenderKey) {\r\n return;\r\n }\r\n\r\n this.lastRenderKey = renderKey;\r\n this.render();\r\n }\r\n\r\n static ngTemplateContextGuard<T>(\r\n _directive: FrVirtualFor<T>,\r\n _context: unknown,\r\n ): _context is FrVirtualForContext<T> {\r\n return true;\r\n }\r\n\r\n private render(): void {\r\n const { items, start, visible } = this.slice();\r\n const trackBy = this.frVirtualForTrackBy();\r\n\r\n while (this.views.length > visible.length) {\r\n this.viewContainerRef.remove(this.views.length - 1);\r\n this.views.pop();\r\n }\r\n\r\n for (let offset = 0; offset < visible.length; offset += 1) {\r\n const item = visible[offset]!;\r\n const index = start + offset;\r\n const view = this.views[offset] ?? this.createView(offset, item, index, items.length);\r\n const context = view.context;\r\n const identity = trackBy?.(index, item) ?? item;\r\n\r\n if ((view as EmbeddedViewRef<FrVirtualForContext<T>> & { __frameVirtualIdentity?: unknown }).__frameVirtualIdentity !== identity) {\r\n (view as EmbeddedViewRef<FrVirtualForContext<T>> & { __frameVirtualIdentity?: unknown }).__frameVirtualIdentity =\r\n identity;\r\n }\r\n\r\n context.$implicit = item;\r\n context.count = items.length;\r\n context.index = index;\r\n context.first = index === 0;\r\n context.last = index === items.length - 1;\r\n context.even = index % 2 === 0;\r\n context.odd = !context.even;\r\n view.detectChanges();\r\n }\r\n }\r\n\r\n private createView(\r\n offset: number,\r\n item: T,\r\n index: number,\r\n count: number,\r\n ): EmbeddedViewRef<FrVirtualForContext<T>> {\r\n const view = this.viewContainerRef.createEmbeddedView(\r\n this.templateRef,\r\n {\r\n $implicit: item,\r\n count,\r\n even: index % 2 === 0,\r\n first: index === 0,\r\n index,\r\n last: index === count - 1,\r\n odd: index % 2 !== 0,\r\n },\r\n offset,\r\n );\r\n\r\n this.views[offset] = view;\r\n return view;\r\n }\r\n}\r\n\r\n","import { Directive } from '@angular/core';\r\n\r\n/** List wrapper for virtualized items. */\r\n@Directive({\r\n selector: '[frVirtualList], frame-virtual-list',\r\n host: {\r\n class: 'frame-virtual-scroll__list',\r\n },\r\n})\r\nexport class FrVirtualList {}\r\n\r\n/** Panel wrapper for virtualized content. */\r\n@Directive({\r\n selector: '[frVirtualPanel], frame-virtual-panel',\r\n host: {\r\n class: 'frame-virtual-scroll__panel',\r\n },\r\n})\r\nexport class FrVirtualPanel {}\r\n\r\n/** Item wrapper for virtualized rows. */\r\n@Directive({\r\n selector: '[frVirtualItem], frame-virtual-item',\r\n host: {\r\n class: 'frame-virtual-scroll__item',\r\n },\r\n})\r\nexport class FrVirtualItem {}\r\n\r\n/** Meta slot for virtual item. */\r\n@Directive({\r\n selector: '[frVirtualItemMeta], frame-virtual-item-meta',\r\n host: {\r\n class: 'frame-virtual-scroll__item-meta',\r\n },\r\n})\r\nexport class FrVirtualItemMeta {}\r\n\r\n","import { NgModule } from '@angular/core';\nimport {\n FrVirtualContent,\n FrVirtualFor,\n FrVirtualItem,\n FrVirtualItemMeta,\n FrVirtualList,\n FrVirtualPanel,\n FrVirtualViewport,\n} from './src/virtual-scroll';\n\n@NgModule({\n imports: [\n FrVirtualContent,\n FrVirtualFor,\n FrVirtualItem,\n FrVirtualItemMeta,\n FrVirtualList,\n FrVirtualPanel,\n FrVirtualViewport,\n ],\n exports: [\n FrVirtualContent,\n FrVirtualFor,\n FrVirtualItem,\n FrVirtualItemMeta,\n FrVirtualList,\n FrVirtualPanel,\n FrVirtualViewport,\n ],\n})\nexport class FrVirtualScrollModule {}\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":"frame-ui-ng-components-virtual-scroll.mjs","sources":["../../../projects/components/virtual-scroll/src/virtual-scroll.engine.ts","../../../projects/components/virtual-scroll/src/virtual-scroll.viewport.ts","../../../projects/components/virtual-scroll/src/virtual-scroll.content.ts","../../../projects/components/virtual-scroll/src/virtual-scroll.for.ts","../../../projects/components/virtual-scroll/src/virtual-scroll.primitives.ts","../../../projects/components/virtual-scroll/virtual-scroll.module.ts","../../../projects/components/virtual-scroll/frame-ui-ng-components-virtual-scroll.ts"],"sourcesContent":["import { clampNumber } from '@frame-ui-ng/components/utils';\r\n\r\nexport interface FrVirtualRange {\r\n start: number;\r\n end: number;\r\n before: number;\r\n after: number;\r\n}\r\n\r\nexport interface FrVirtualRangeOptions {\r\n itemSize: number;\r\n overscan: number;\r\n scrollTop: number;\r\n totalCount: number;\r\n viewportSize: number;\r\n}\r\n\r\nexport type FrVirtualScrollAlignment = 'auto' | 'start' | 'center' | 'end' | 'nearest';\r\n\r\nexport function calculateVirtualRange(options: FrVirtualRangeOptions): FrVirtualRange {\r\n const itemSize = Math.max(options.itemSize, 1);\r\n const totalCount = Math.max(options.totalCount, 0);\r\n const viewportSize = Math.max(options.viewportSize, 0);\r\n const overscan = Math.max(Math.trunc(options.overscan), 0);\r\n const visibleCount = Math.max(Math.ceil(viewportSize / itemSize), 1);\r\n const rawStart = Math.floor(Math.max(options.scrollTop, 0) / itemSize) - overscan;\r\n const start = clampNumber(rawStart, 0, totalCount);\r\n const end = clampNumber(start + visibleCount + overscan * 2, start, totalCount);\r\n\r\n return {\r\n start,\r\n end,\r\n before: start * itemSize,\r\n after: Math.max(totalCount - end, 0) * itemSize,\r\n };\r\n}\r\n\r\nexport function calculateScrollOffsetForIndex(\r\n index: number,\r\n alignment: FrVirtualScrollAlignment,\r\n itemSize: number,\r\n viewportSize: number,\r\n totalCount: number,\r\n currentScrollTop: number,\r\n): number {\r\n const normalizedItemSize = Math.max(itemSize, 1);\r\n const normalizedViewportSize = Math.max(viewportSize, 0);\r\n const maxScrollTop = Math.max(totalCount * normalizedItemSize - normalizedViewportSize, 0);\r\n const clampedIndex = clampNumber(index, 0, Math.max(totalCount - 1, 0));\r\n const itemStart = clampedIndex * normalizedItemSize;\r\n const itemEnd = itemStart + normalizedItemSize;\r\n\r\n switch (alignment) {\r\n case 'start':\r\n return clampNumber(itemStart, 0, maxScrollTop);\r\n case 'center':\r\n return clampNumber(itemStart - (normalizedViewportSize - normalizedItemSize) / 2, 0, maxScrollTop);\r\n case 'end':\r\n return clampNumber(itemEnd - normalizedViewportSize, 0, maxScrollTop);\r\n case 'nearest':\r\n case 'auto':\r\n default:\r\n if (itemStart < currentScrollTop) {\r\n return clampNumber(itemStart, 0, maxScrollTop);\r\n }\r\n\r\n if (itemEnd > currentScrollTop + normalizedViewportSize) {\r\n return clampNumber(itemEnd - normalizedViewportSize, 0, maxScrollTop);\r\n }\r\n\r\n return clampNumber(currentScrollTop, 0, maxScrollTop);\r\n }\r\n}\r\n","import {\r\n Directive,\r\n DestroyRef,\r\n ElementRef,\r\n computed,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\n\r\nimport {\r\n FrVirtualScrollAlignment,\r\n calculateScrollOffsetForIndex,\r\n calculateVirtualRange,\r\n} from './virtual-scroll.engine';\r\n\r\n/** Viewport controller for virtual scrolling. */\r\n@Directive({\r\n selector: '[frVirtualViewport], frame-virtual-viewport',\r\n exportAs: 'frVirtualViewport',\r\n host: {\r\n class: 'frame-virtual-scroll__viewport frame-corner-handles',\r\n '(scroll)': 'handleScroll()',\r\n '[style.block-size]': 'height()',\r\n },\r\n})\r\nexport class FrVirtualViewport {\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly scrollTop = signal(0);\r\n private readonly totalCount = signal(0);\r\n private readonly viewportSize = signal(0);\r\n private resizeObserver: ResizeObserver | null = null;\r\n\r\n readonly itemSize = input.required<number>();\r\n readonly overscan = input(4);\r\n readonly height = input<string | null>(null);\r\n\r\n readonly range = computed(() =>\r\n calculateVirtualRange({\r\n itemSize: this.itemSize(),\r\n overscan: this.overscan(),\r\n scrollTop: this.scrollTop(),\r\n totalCount: this.totalCount(),\r\n viewportSize: this.viewportSize(),\r\n }),\r\n );\r\n\r\n readonly before = computed(() => this.range().before);\r\n readonly after = computed(() => this.range().after);\r\n readonly startIndex = computed(() => this.range().start);\r\n readonly endIndex = computed(() => this.range().end);\r\n readonly renderedCount = computed(() => this.range().end - this.range().start);\r\n readonly totalSize = computed(() => this.totalCount() * Math.max(this.itemSize(), 1));\r\n\r\n constructor() {\r\n queueMicrotask(() => {\r\n this.measure();\r\n this.attachResizeObserver();\r\n });\r\n\r\n this.destroyRef.onDestroy(() => {\r\n this.resizeObserver?.disconnect();\r\n });\r\n }\r\n\r\n setTotalCount(count: number): void {\r\n this.totalCount.set(Math.max(Math.trunc(count), 0));\r\n this.measure();\r\n }\r\n\r\n measure(): void {\r\n const element = this.elementRef.nativeElement;\r\n this.viewportSize.set(element.clientHeight);\r\n this.scrollTop.set(element.scrollTop);\r\n }\r\n\r\n scrollToIndex(index: number, alignment: FrVirtualScrollAlignment = 'auto'): void {\r\n const element = this.elementRef.nativeElement;\r\n // Virtual scrolling assumes fixed item heights, so index math can stay O(1).\r\n const nextScrollTop = calculateScrollOffsetForIndex(\r\n index,\r\n alignment,\r\n this.itemSize(),\r\n element.clientHeight,\r\n this.totalCount(),\r\n element.scrollTop,\r\n );\r\n\r\n element.scrollTop = nextScrollTop;\r\n this.scrollTop.set(nextScrollTop);\r\n }\r\n\r\n protected handleScroll(): void {\r\n this.scrollTop.set(this.elementRef.nativeElement.scrollTop);\r\n }\r\n\r\n private attachResizeObserver(): void {\r\n const element = this.elementRef.nativeElement;\r\n\r\n if (typeof ResizeObserver === 'undefined') {\r\n return;\r\n }\r\n\r\n this.resizeObserver = new ResizeObserver(() => {\r\n this.measure();\r\n });\r\n this.resizeObserver.observe(element);\r\n }\r\n}\r\n\r\n","import { Directive, computed, inject } from '@angular/core';\r\n\r\nimport { FrVirtualViewport } from './virtual-scroll.viewport';\r\n\r\n/** Measured content wrapper for virtual scrolling. */\r\n@Directive({\r\n selector: '[frVirtualContent], frame-virtual-content',\r\n host: {\r\n class: 'frame-virtual-scroll__content',\r\n '[style.padding-top.px]': 'before()',\r\n '[style.padding-bottom.px]': 'after()',\r\n },\r\n})\r\nexport class FrVirtualContent {\r\n private readonly viewport = inject(FrVirtualViewport);\r\n\r\n protected readonly before = computed(() => this.viewport.before());\r\n protected readonly after = computed(() => this.viewport.after());\r\n}\r\n\r\n","import {\r\n Directive,\r\n DoCheck,\r\n EmbeddedViewRef,\r\n TemplateRef,\r\n ViewContainerRef,\r\n computed,\r\n inject,\r\n input,\r\n} from '@angular/core';\r\n\r\nimport { FrVirtualViewport } from './virtual-scroll.viewport';\r\n\r\nexport interface FrVirtualForContext<T> {\r\n $implicit: T;\r\n count: number;\r\n even: boolean;\r\n first: boolean;\r\n index: number;\r\n last: boolean;\r\n odd: boolean;\r\n}\r\n\r\nexport type FrVirtualTrackBy<T> = (index: number, item: T) => unknown;\r\n\r\n/** Structural directive for rendering virtualized ranges. */\r\n@Directive({\r\n selector: '[frVirtualFor][frVirtualForOf]',\r\n})\r\nexport class FrVirtualFor<T> implements DoCheck {\r\n private readonly templateRef = inject<TemplateRef<FrVirtualForContext<T>>>(TemplateRef);\r\n private readonly viewContainerRef = inject(ViewContainerRef);\r\n private readonly viewport = inject(FrVirtualViewport);\r\n private readonly views: EmbeddedViewRef<FrVirtualForContext<T>>[] = [];\r\n\r\n readonly frVirtualForOf = input.required<readonly T[]>();\r\n readonly frVirtualForTrackBy = input<FrVirtualTrackBy<T> | null>(null);\r\n private lastRenderKey = '';\r\n\r\n private readonly slice = computed(() => {\r\n const items = this.frVirtualForOf();\r\n const start = this.viewport.startIndex();\r\n const end = this.viewport.endIndex();\r\n\r\n return {\r\n items,\r\n start,\r\n visible: items.slice(start, end),\r\n };\r\n });\r\n\r\n ngDoCheck(): void {\r\n const items = this.frVirtualForOf();\r\n const renderKey = [\r\n items,\r\n items.length,\r\n this.viewport.startIndex(),\r\n this.viewport.endIndex(),\r\n this.frVirtualForTrackBy(),\r\n ].map(String).join('|');\r\n\r\n this.viewport.setTotalCount(items.length);\r\n\r\n if (renderKey === this.lastRenderKey) {\r\n return;\r\n }\r\n\r\n this.lastRenderKey = renderKey;\r\n this.render();\r\n }\r\n\r\n static ngTemplateContextGuard<T>(\r\n _directive: FrVirtualFor<T>,\r\n _context: unknown,\r\n ): _context is FrVirtualForContext<T> {\r\n return true;\r\n }\r\n\r\n private render(): void {\r\n const { items, start, visible } = this.slice();\r\n const trackBy = this.frVirtualForTrackBy();\r\n\r\n while (this.views.length > visible.length) {\r\n this.viewContainerRef.remove(this.views.length - 1);\r\n this.views.pop();\r\n }\r\n\r\n for (let offset = 0; offset < visible.length; offset += 1) {\r\n const item = visible[offset]!;\r\n const index = start + offset;\r\n const view = this.views[offset] ?? this.createView(offset, item, index, items.length);\r\n const context = view.context;\r\n const identity = trackBy?.(index, item) ?? item;\r\n\r\n if ((view as EmbeddedViewRef<FrVirtualForContext<T>> & { __frameVirtualIdentity?: unknown }).__frameVirtualIdentity !== identity) {\r\n (view as EmbeddedViewRef<FrVirtualForContext<T>> & { __frameVirtualIdentity?: unknown }).__frameVirtualIdentity =\r\n identity;\r\n }\r\n\r\n context.$implicit = item;\r\n context.count = items.length;\r\n context.index = index;\r\n context.first = index === 0;\r\n context.last = index === items.length - 1;\r\n context.even = index % 2 === 0;\r\n context.odd = !context.even;\r\n view.detectChanges();\r\n }\r\n }\r\n\r\n private createView(\r\n offset: number,\r\n item: T,\r\n index: number,\r\n count: number,\r\n ): EmbeddedViewRef<FrVirtualForContext<T>> {\r\n const view = this.viewContainerRef.createEmbeddedView(\r\n this.templateRef,\r\n {\r\n $implicit: item,\r\n count,\r\n even: index % 2 === 0,\r\n first: index === 0,\r\n index,\r\n last: index === count - 1,\r\n odd: index % 2 !== 0,\r\n },\r\n offset,\r\n );\r\n\r\n this.views[offset] = view;\r\n return view;\r\n }\r\n}\r\n\r\n","import { Directive } from '@angular/core';\r\n\r\n/** List wrapper for virtualized items. */\r\n@Directive({\r\n selector: '[frVirtualList], frame-virtual-list',\r\n host: {\r\n class: 'frame-virtual-scroll__list frame-corner-handles',\r\n },\r\n})\r\nexport class FrVirtualList {}\r\n\r\n/** Panel wrapper for virtualized content. */\r\n@Directive({\r\n selector: '[frVirtualPanel], frame-virtual-panel',\r\n host: {\r\n class: 'frame-virtual-scroll__panel',\r\n },\r\n})\r\nexport class FrVirtualPanel {}\r\n\r\n/** Item wrapper for virtualized rows. */\r\n@Directive({\r\n selector: '[frVirtualItem], frame-virtual-item',\r\n host: {\r\n class: 'frame-virtual-scroll__item',\r\n },\r\n})\r\nexport class FrVirtualItem {}\r\n\r\n/** Meta slot for virtual item. */\r\n@Directive({\r\n selector: '[frVirtualItemMeta], frame-virtual-item-meta',\r\n host: {\r\n class: 'frame-virtual-scroll__item-meta',\r\n },\r\n})\r\nexport class FrVirtualItemMeta {}\r\n\r\n","import { NgModule } from '@angular/core';\nimport {\n FrVirtualContent,\n FrVirtualFor,\n FrVirtualItem,\n FrVirtualItemMeta,\n FrVirtualList,\n FrVirtualPanel,\n FrVirtualViewport,\n} from './src/virtual-scroll';\n\n@NgModule({\n imports: [\n FrVirtualContent,\n FrVirtualFor,\n FrVirtualItem,\n FrVirtualItemMeta,\n FrVirtualList,\n FrVirtualPanel,\n FrVirtualViewport,\n ],\n exports: [\n FrVirtualContent,\n FrVirtualFor,\n FrVirtualItem,\n FrVirtualItemMeta,\n FrVirtualList,\n FrVirtualPanel,\n FrVirtualViewport,\n ],\n})\nexport class FrVirtualScrollModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}