@frame-ui-ng/components 0.3.0-beta.0 → 0.4.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 (172) hide show
  1. package/button/src/styles/button.css +5 -1
  2. package/button-group/src/styles/button-group.css +6 -0
  3. package/confirm-popover/src/styles/confirm-popover.css +20 -0
  4. package/drag-drop/src/styles/_vars.css +28 -0
  5. package/drag-drop/src/styles/drag-drop.css +132 -0
  6. package/fesm2022/frame-ui-ng-components-accordion.mjs +26 -21
  7. package/fesm2022/frame-ui-ng-components-accordion.mjs.map +1 -1
  8. package/fesm2022/frame-ui-ng-components-alert.mjs +4 -0
  9. package/fesm2022/frame-ui-ng-components-alert.mjs.map +1 -1
  10. package/fesm2022/frame-ui-ng-components-avatar.mjs +7 -0
  11. package/fesm2022/frame-ui-ng-components-avatar.mjs.map +1 -1
  12. package/fesm2022/frame-ui-ng-components-badge.mjs +4 -0
  13. package/fesm2022/frame-ui-ng-components-badge.mjs.map +1 -1
  14. package/fesm2022/frame-ui-ng-components-breadcrumb.mjs +13 -6
  15. package/fesm2022/frame-ui-ng-components-breadcrumb.mjs.map +1 -1
  16. package/fesm2022/frame-ui-ng-components-button-group.mjs +1 -0
  17. package/fesm2022/frame-ui-ng-components-button-group.mjs.map +1 -1
  18. package/fesm2022/frame-ui-ng-components-button.mjs +5 -0
  19. package/fesm2022/frame-ui-ng-components-button.mjs.map +1 -1
  20. package/fesm2022/frame-ui-ng-components-calendar.mjs +4 -0
  21. package/fesm2022/frame-ui-ng-components-calendar.mjs.map +1 -1
  22. package/fesm2022/frame-ui-ng-components-card.mjs +15 -15
  23. package/fesm2022/frame-ui-ng-components-card.mjs.map +1 -1
  24. package/fesm2022/frame-ui-ng-components-carousel.mjs +33 -16
  25. package/fesm2022/frame-ui-ng-components-carousel.mjs.map +1 -1
  26. package/fesm2022/frame-ui-ng-components-checkbox.mjs +7 -9
  27. package/fesm2022/frame-ui-ng-components-checkbox.mjs.map +1 -1
  28. package/fesm2022/frame-ui-ng-components-collapsible.mjs +24 -23
  29. package/fesm2022/frame-ui-ng-components-collapsible.mjs.map +1 -1
  30. package/fesm2022/frame-ui-ng-components-combobox.mjs +113 -68
  31. package/fesm2022/frame-ui-ng-components-combobox.mjs.map +1 -1
  32. package/fesm2022/frame-ui-ng-components-command.mjs +47 -16
  33. package/fesm2022/frame-ui-ng-components-command.mjs.map +1 -1
  34. package/fesm2022/frame-ui-ng-components-confirm-modal.mjs +165 -0
  35. package/fesm2022/frame-ui-ng-components-confirm-modal.mjs.map +1 -0
  36. package/fesm2022/frame-ui-ng-components-confirm-popover.mjs +423 -0
  37. package/fesm2022/frame-ui-ng-components-confirm-popover.mjs.map +1 -0
  38. package/fesm2022/frame-ui-ng-components-context-menu.mjs +71 -45
  39. package/fesm2022/frame-ui-ng-components-context-menu.mjs.map +1 -1
  40. package/fesm2022/frame-ui-ng-components-date-picker.mjs +3 -0
  41. package/fesm2022/frame-ui-ng-components-date-picker.mjs.map +1 -1
  42. package/fesm2022/frame-ui-ng-components-drag-drop.mjs +293 -0
  43. package/fesm2022/frame-ui-ng-components-drag-drop.mjs.map +1 -0
  44. package/fesm2022/frame-ui-ng-components-dropdown-menu.mjs +74 -37
  45. package/fesm2022/frame-ui-ng-components-dropdown-menu.mjs.map +1 -1
  46. package/fesm2022/frame-ui-ng-components-empty.mjs +6 -0
  47. package/fesm2022/frame-ui-ng-components-empty.mjs.map +1 -1
  48. package/fesm2022/frame-ui-ng-components-field.mjs +21 -12
  49. package/fesm2022/frame-ui-ng-components-field.mjs.map +1 -1
  50. package/fesm2022/frame-ui-ng-components-forms.mjs +1 -0
  51. package/fesm2022/frame-ui-ng-components-forms.mjs.map +1 -1
  52. package/fesm2022/frame-ui-ng-components-hover-card.mjs +49 -43
  53. package/fesm2022/frame-ui-ng-components-hover-card.mjs.map +1 -1
  54. package/fesm2022/frame-ui-ng-components-input-otp.mjs +69 -69
  55. package/fesm2022/frame-ui-ng-components-input-otp.mjs.map +1 -1
  56. package/fesm2022/frame-ui-ng-components-input.mjs +13 -0
  57. package/fesm2022/frame-ui-ng-components-input.mjs.map +1 -1
  58. package/fesm2022/frame-ui-ng-components-item.mjs +10 -0
  59. package/fesm2022/frame-ui-ng-components-item.mjs.map +1 -1
  60. package/fesm2022/frame-ui-ng-components-menubar.mjs +15 -0
  61. package/fesm2022/frame-ui-ng-components-menubar.mjs.map +1 -1
  62. package/fesm2022/frame-ui-ng-components-modal.mjs +221 -129
  63. package/fesm2022/frame-ui-ng-components-modal.mjs.map +1 -1
  64. package/fesm2022/frame-ui-ng-components-navigation-menu.mjs +14 -0
  65. package/fesm2022/frame-ui-ng-components-navigation-menu.mjs.map +1 -1
  66. package/fesm2022/frame-ui-ng-components-pagination.mjs +45 -36
  67. package/fesm2022/frame-ui-ng-components-pagination.mjs.map +1 -1
  68. package/fesm2022/frame-ui-ng-components-popover.mjs +63 -51
  69. package/fesm2022/frame-ui-ng-components-popover.mjs.map +1 -1
  70. package/fesm2022/frame-ui-ng-components-progress.mjs +4 -1
  71. package/fesm2022/frame-ui-ng-components-progress.mjs.map +1 -1
  72. package/fesm2022/frame-ui-ng-components-radio-group.mjs +5 -0
  73. package/fesm2022/frame-ui-ng-components-radio-group.mjs.map +1 -1
  74. package/fesm2022/frame-ui-ng-components-resizable.mjs +22 -26
  75. package/fesm2022/frame-ui-ng-components-resizable.mjs.map +1 -1
  76. package/fesm2022/frame-ui-ng-components-select.mjs +62 -14
  77. package/fesm2022/frame-ui-ng-components-select.mjs.map +1 -1
  78. package/fesm2022/frame-ui-ng-components-separator.mjs +1 -0
  79. package/fesm2022/frame-ui-ng-components-separator.mjs.map +1 -1
  80. package/fesm2022/frame-ui-ng-components-sheet.mjs +118 -104
  81. package/fesm2022/frame-ui-ng-components-sheet.mjs.map +1 -1
  82. package/fesm2022/frame-ui-ng-components-sidebar.mjs +45 -24
  83. package/fesm2022/frame-ui-ng-components-sidebar.mjs.map +1 -1
  84. package/fesm2022/frame-ui-ng-components-skeleton.mjs +1 -0
  85. package/fesm2022/frame-ui-ng-components-skeleton.mjs.map +1 -1
  86. package/fesm2022/frame-ui-ng-components-slider.mjs +82 -75
  87. package/fesm2022/frame-ui-ng-components-slider.mjs.map +1 -1
  88. package/fesm2022/frame-ui-ng-components-spinner.mjs +1 -0
  89. package/fesm2022/frame-ui-ng-components-spinner.mjs.map +1 -1
  90. package/fesm2022/frame-ui-ng-components-switch.mjs +6 -0
  91. package/fesm2022/frame-ui-ng-components-switch.mjs.map +1 -1
  92. package/fesm2022/frame-ui-ng-components-table.mjs +76 -50
  93. package/fesm2022/frame-ui-ng-components-table.mjs.map +1 -1
  94. package/fesm2022/frame-ui-ng-components-tabs.mjs +4 -0
  95. package/fesm2022/frame-ui-ng-components-tabs.mjs.map +1 -1
  96. package/fesm2022/frame-ui-ng-components-textarea.mjs +1 -0
  97. package/fesm2022/frame-ui-ng-components-textarea.mjs.map +1 -1
  98. package/fesm2022/frame-ui-ng-components-toast.mjs +2 -0
  99. package/fesm2022/frame-ui-ng-components-toast.mjs.map +1 -1
  100. package/fesm2022/frame-ui-ng-components-toggle.mjs +23 -16
  101. package/fesm2022/frame-ui-ng-components-toggle.mjs.map +1 -1
  102. package/fesm2022/frame-ui-ng-components-tooltip.mjs +74 -25
  103. package/fesm2022/frame-ui-ng-components-tooltip.mjs.map +1 -1
  104. package/fesm2022/frame-ui-ng-components-utils.mjs +20 -0
  105. package/fesm2022/frame-ui-ng-components-utils.mjs.map +1 -0
  106. package/fesm2022/frame-ui-ng-components-virtual-scroll.mjs +36 -20
  107. package/fesm2022/frame-ui-ng-components-virtual-scroll.mjs.map +1 -1
  108. package/fesm2022/frame-ui-ng-components.mjs +1737 -845
  109. package/fesm2022/frame-ui-ng-components.mjs.map +1 -1
  110. package/item/src/styles/item.css +188 -187
  111. package/modal/src/styles/modal.css +10 -1
  112. package/package.json +18 -2
  113. package/popover/src/styles/popover.css +106 -101
  114. package/sidebar/src/styles/sidebar.css +10 -4
  115. package/src/styles/blueprint.css +98 -0
  116. package/src/styles/components.css +2 -0
  117. package/styles/blueprint.css +98 -0
  118. package/styles/components.css +2 -0
  119. package/styles.css +2 -0
  120. package/tooltip/src/styles/tooltip.css +4 -4
  121. package/types/frame-ui-ng-components-accordion.d.ts +11 -4
  122. package/types/frame-ui-ng-components-alert.d.ts +4 -0
  123. package/types/frame-ui-ng-components-avatar.d.ts +7 -0
  124. package/types/frame-ui-ng-components-badge.d.ts +4 -0
  125. package/types/frame-ui-ng-components-breadcrumb.d.ts +7 -0
  126. package/types/frame-ui-ng-components-button-group.d.ts +1 -0
  127. package/types/frame-ui-ng-components-button.d.ts +5 -0
  128. package/types/frame-ui-ng-components-calendar.d.ts +1 -0
  129. package/types/frame-ui-ng-components-card.d.ts +8 -3
  130. package/types/frame-ui-ng-components-carousel.d.ts +11 -2
  131. package/types/frame-ui-ng-components-checkbox.d.ts +3 -2
  132. package/types/frame-ui-ng-components-collapsible.d.ts +9 -4
  133. package/types/frame-ui-ng-components-combobox.d.ts +33 -4
  134. package/types/frame-ui-ng-components-command.d.ts +26 -4
  135. package/types/frame-ui-ng-components-confirm-modal.d.ts +50 -0
  136. package/types/frame-ui-ng-components-confirm-popover.d.ts +87 -0
  137. package/types/frame-ui-ng-components-context-menu.d.ts +29 -10
  138. package/types/frame-ui-ng-components-date-picker.d.ts +1 -0
  139. package/types/frame-ui-ng-components-drag-drop.d.ts +103 -0
  140. package/types/frame-ui-ng-components-dropdown-menu.d.ts +32 -9
  141. package/types/frame-ui-ng-components-empty.d.ts +6 -0
  142. package/types/frame-ui-ng-components-field.d.ts +9 -0
  143. package/types/frame-ui-ng-components-forms.d.ts +1 -0
  144. package/types/frame-ui-ng-components-hover-card.d.ts +8 -2
  145. package/types/frame-ui-ng-components-input-otp.d.ts +5 -1
  146. package/types/frame-ui-ng-components-input.d.ts +13 -0
  147. package/types/frame-ui-ng-components-item.d.ts +10 -0
  148. package/types/frame-ui-ng-components-menubar.d.ts +15 -0
  149. package/types/frame-ui-ng-components-modal.d.ts +30 -7
  150. package/types/frame-ui-ng-components-navigation-menu.d.ts +14 -0
  151. package/types/frame-ui-ng-components-pagination.d.ts +8 -0
  152. package/types/frame-ui-ng-components-popover.d.ts +14 -2
  153. package/types/frame-ui-ng-components-progress.d.ts +2 -0
  154. package/types/frame-ui-ng-components-radio-group.d.ts +5 -0
  155. package/types/frame-ui-ng-components-resizable.d.ts +3 -0
  156. package/types/frame-ui-ng-components-select.d.ts +23 -2
  157. package/types/frame-ui-ng-components-separator.d.ts +1 -0
  158. package/types/frame-ui-ng-components-sheet.d.ts +13 -0
  159. package/types/frame-ui-ng-components-sidebar.d.ts +23 -2
  160. package/types/frame-ui-ng-components-skeleton.d.ts +1 -0
  161. package/types/frame-ui-ng-components-slider.d.ts +5 -2
  162. package/types/frame-ui-ng-components-spinner.d.ts +1 -0
  163. package/types/frame-ui-ng-components-switch.d.ts +6 -0
  164. package/types/frame-ui-ng-components-table.d.ts +26 -0
  165. package/types/frame-ui-ng-components-tabs.d.ts +4 -0
  166. package/types/frame-ui-ng-components-textarea.d.ts +1 -0
  167. package/types/frame-ui-ng-components-toast.d.ts +2 -0
  168. package/types/frame-ui-ng-components-toggle.d.ts +8 -2
  169. package/types/frame-ui-ng-components-tooltip.d.ts +11 -2
  170. package/types/frame-ui-ng-components-utils.d.ts +5 -0
  171. package/types/frame-ui-ng-components-virtual-scroll.d.ts +11 -2
  172. package/types/frame-ui-ng-components.d.ts +525 -96
@@ -1 +1 @@
1
- {"version":3,"file":"frame-ui-ng-components-tooltip.mjs","sources":["../../../projects/components/tooltip/src/tooltip.position.ts","../../../projects/components/tooltip/src/tooltip.tokens.ts","../../../projects/components/tooltip/src/tooltip.directive.ts","../../../projects/components/tooltip/src/tooltip.types.ts","../../../projects/components/tooltip/tooltip.module.ts","../../../projects/components/tooltip/frame-ui-ng-components-tooltip.ts"],"sourcesContent":["import { ConnectedPosition } from '@angular/cdk/overlay';\n\nimport { FrTooltipAlignment, FrTooltipSide } from './tooltip.types';\n\nexport function buildTooltipPositions(options: {\n align: FrTooltipAlignment;\n alignOffset: number;\n side: FrTooltipSide;\n sideOffset: number;\n}): ConnectedPosition[] {\n const primary = buildPosition(options.side, options);\n const opposite = oppositeSide(options.side);\n const fallback = buildPosition(opposite, {\n align: options.align,\n alignOffset: options.alignOffset,\n sideOffset: options.sideOffset,\n });\n\n return [primary, fallback];\n}\n\nfunction buildPosition(\n side: FrTooltipSide,\n options: {\n align: FrTooltipAlignment;\n alignOffset: number;\n sideOffset: number;\n },\n): ConnectedPosition {\n if (side === 'top' || side === 'bottom') {\n const isBottom = side === 'bottom';\n\n return {\n originX: options.align,\n originY: isBottom ? 'bottom' : 'top',\n overlayX: options.align,\n overlayY: isBottom ? 'top' : 'bottom',\n offsetX: options.alignOffset,\n offsetY: isBottom ? options.sideOffset : -options.sideOffset,\n };\n }\n\n const isRight = side === 'right';\n\n return {\n originX: isRight ? 'end' : 'start',\n originY: verticalPosition(options.align),\n overlayX: isRight ? 'start' : 'end',\n overlayY: verticalPosition(options.align),\n offsetX: isRight ? options.sideOffset : -options.sideOffset,\n offsetY: options.alignOffset,\n };\n}\n\nfunction verticalPosition(align: FrTooltipAlignment): 'top' | 'center' | 'bottom' {\n if (align === 'center') {\n return 'center';\n }\n\n return align === 'start' ? 'top' : 'bottom';\n}\n\nfunction oppositeSide(side: FrTooltipSide): FrTooltipSide {\n if (side === 'top') {\n return 'bottom';\n }\n\n if (side === 'bottom') {\n return 'top';\n }\n\n if (side === 'left') {\n return 'right';\n }\n\n return 'left';\n}\n","export const FR_TOOLTIP_TOKEN_NAMES = [\r\n '--frame-tooltip-content-bg',\r\n '--frame-tooltip-content-color',\r\n '--frame-tooltip-content-border',\r\n '--frame-tooltip-content-radius',\r\n '--frame-tooltip-content-shadow',\r\n '--frame-tooltip-content-padding',\r\n '--frame-tooltip-content-max-width',\r\n '--frame-tooltip-content-font-size',\r\n '--frame-tooltip-content-font-weight',\r\n '--frame-tooltip-content-line-height',\r\n '--frame-tooltip-arrow-size',\r\n '--frame-tooltip-motion-duration',\r\n '--frame-tooltip-motion-distance',\r\n '--frame-tooltip-motion-scale',\r\n '--frame-tooltip-motion-easing',\r\n] as const;\r\n","import { ConnectedOverlayPositionChange, Overlay, OverlayRef } from '@angular/cdk/overlay';\r\nimport { ComponentPortal } from '@angular/cdk/portal';\r\nimport { DOCUMENT, NgTemplateOutlet, isPlatformBrowser } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ComponentRef,\r\n DestroyRef,\r\n Directive,\r\n ElementRef,\r\n PLATFORM_ID,\r\n TemplateRef,\r\n booleanAttribute,\r\n effect,\r\n inject,\r\n input,\r\n signal,\r\n numberAttribute,\r\n} from '@angular/core';\r\n\r\nimport { buildTooltipPositions } from './tooltip.position';\r\nimport { FR_TOOLTIP_TOKEN_NAMES } from './tooltip.tokens';\r\nimport { FrTooltipAlignment, FrTooltipSide } from './tooltip.types';\r\n\r\nlet nextInlineTooltipId = 0;\r\n\r\n@Directive({\r\n selector: '[frTooltip]',\r\n host: {\r\n class: 'frame-tooltip__trigger',\r\n '[attr.aria-describedby]': 'isOpen() ? tooltipId : null',\r\n '[attr.data-state]': 'isOpen() ? \"open\" : \"closed\"',\r\n },\r\n})\r\nexport class FrTooltipDirective implements AfterViewInit {\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly document = inject(DOCUMENT);\r\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly overlay = inject(Overlay);\r\n private readonly platformId = inject(PLATFORM_ID);\r\n\r\n readonly content = input<string | TemplateRef<unknown> | null>(null, { alias: 'frTooltip' });\r\n readonly align = input<FrTooltipAlignment>('center', { alias: 'frTooltipAlign' });\r\n readonly alignOffset = input(0, { alias: 'frTooltipAlignOffset' });\r\n readonly arrow = input(false, { alias: 'frTooltipArrow', transform: booleanAttribute });\r\n readonly closeDelay = input(0, { alias: 'frTooltipCloseDelay' });\r\n readonly openDelay = input(0, { alias: 'frTooltipOpenDelay', transform: numberAttribute });\r\n readonly side = input<FrTooltipSide>('top', { alias: 'frTooltipSide' });\r\n readonly sideOffset = input(8, { alias: 'frTooltipSideOffset' });\r\n\r\n protected readonly isOpen = signal(false);\r\n protected readonly tooltipId = `frame-tooltip-inline-${nextInlineTooltipId++}`;\r\n\r\n private closeTimer: ReturnType<typeof setTimeout> | null = null;\r\n private disabledObserver: MutationObserver | null = null;\r\n private openTimer: ReturnType<typeof setTimeout> | null = null;\r\n private overlayRef: OverlayRef | null = null;\r\n private panelRef: ComponentRef<FrTooltipInlinePanel> | null = null;\r\n private triggerElement = this.elementRef.nativeElement;\r\n private wrapped = false;\r\n private wrapper: HTMLElement | null = null;\r\n private teardownListeners: Array<() => void> = [];\r\n\r\n constructor() {\r\n this.destroyRef.onDestroy(() => this.destroy());\r\n\r\n effect(() => {\r\n const content = this.content();\r\n\r\n if (this.panelRef && content) {\r\n this.updatePanelInputs();\r\n }\r\n\r\n if (!content) {\r\n this.close();\r\n }\r\n });\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n if (!isPlatformBrowser(this.platformId)) {\r\n return;\r\n }\r\n\r\n this.ensureDisabledHostWrapper();\r\n this.bindTriggerEvents();\r\n this.observeDisabledState();\r\n }\r\n\r\n private bindTriggerEvents(): void {\r\n const target = this.triggerElement;\r\n\r\n this.teardownListeners.push(this.listen(target, 'mouseenter', () => this.openWithDelay()));\r\n this.teardownListeners.push(this.listen(target, 'mouseleave', () => this.closeWithDelay()));\r\n this.teardownListeners.push(this.listen(target, 'focusin', () => this.openWithDelay()));\r\n this.teardownListeners.push(this.listen(target, 'focusout', () => this.closeWithDelay()));\r\n this.teardownListeners.push(\r\n this.listen(target, 'keydown', (event) => {\r\n const keyboardEvent = event as KeyboardEvent;\r\n\r\n if (keyboardEvent.key === 'Escape') {\r\n keyboardEvent.preventDefault();\r\n this.close();\r\n }\r\n }),\r\n );\r\n }\r\n\r\n private ensureDisabledHostWrapper(): void {\r\n const element = this.elementRef.nativeElement;\r\n\r\n if (!('disabled' in element) || !element.hasAttribute('disabled') || this.wrapped) {\r\n return;\r\n }\r\n\r\n const parent = element.parentNode;\r\n\r\n if (!parent) {\r\n return;\r\n }\r\n\r\n const wrapper = this.document.createElement('span');\r\n wrapper.className = 'frame-tooltip__disabled-trigger';\r\n wrapper.tabIndex = 0;\r\n parent.insertBefore(wrapper, element);\r\n wrapper.appendChild(element);\r\n this.triggerElement = wrapper;\r\n this.wrapper = wrapper;\r\n this.wrapped = true;\r\n }\r\n\r\n private observeDisabledState(): void {\r\n const element = this.elementRef.nativeElement;\r\n\r\n if (!('disabled' in element)) {\r\n return;\r\n }\r\n\r\n this.disabledObserver = new MutationObserver(() => {\r\n if (!element.hasAttribute('disabled') || this.wrapped) {\r\n return;\r\n }\r\n\r\n this.teardownTriggerListeners();\r\n this.ensureDisabledHostWrapper();\r\n this.bindTriggerEvents();\r\n });\r\n this.disabledObserver.observe(element, { attributes: true, attributeFilter: ['disabled'] });\r\n }\r\n\r\n private openWithDelay(): void {\r\n if (!this.content()) {\r\n return;\r\n }\r\n\r\n this.cancelClose();\r\n this.cancelOpen();\r\n\r\n const delay = Math.max(0, this.openDelay());\r\n\r\n if (delay === 0) {\r\n this.open();\r\n return;\r\n }\r\n\r\n this.openTimer = setTimeout(() => this.open(), delay);\r\n }\r\n\r\n private closeWithDelay(): void {\r\n this.cancelOpen();\r\n this.cancelClose();\r\n\r\n const delay = Math.max(0, this.closeDelay());\r\n\r\n if (delay === 0) {\r\n this.close();\r\n return;\r\n }\r\n\r\n this.closeTimer = setTimeout(() => this.close(), delay);\r\n }\r\n\r\n private open(): void {\r\n const content = this.content();\r\n\r\n if (!content) {\r\n return;\r\n }\r\n\r\n if (!this.overlayRef) {\r\n this.overlayRef = this.createOverlay();\r\n }\r\n\r\n if (!this.overlayRef.hasAttached()) {\r\n this.panelRef = this.overlayRef.attach(new ComponentPortal(FrTooltipInlinePanel));\r\n this.updatePanelInputs();\r\n this.syncCustomPropertiesToOverlay();\r\n }\r\n\r\n this.isOpen.set(true);\r\n }\r\n\r\n private close(): void {\r\n this.cancelOpen();\r\n this.cancelClose();\r\n this.overlayRef?.detach();\r\n this.panelRef = null;\r\n this.isOpen.set(false);\r\n }\r\n\r\n private createOverlay(): OverlayRef {\r\n const positionStrategy = this.overlay\r\n .position()\r\n .flexibleConnectedTo(this.triggerElement)\r\n .withPositions(this.positions())\r\n .withPush(true)\r\n .withViewportMargin(8);\r\n\r\n positionStrategy.positionChanges.subscribe((event) => this.handlePositionChange(event));\r\n\r\n const overlayRef = this.overlay.create({\r\n panelClass: ['frame-tooltip-overlay', `frame-tooltip-overlay--${this.side()}`],\r\n positionStrategy,\r\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\r\n });\r\n\r\n overlayRef.keydownEvents().subscribe((event) => {\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n this.close();\r\n }\r\n });\r\n\r\n return overlayRef;\r\n }\r\n\r\n private positions() {\r\n return buildTooltipPositions({\r\n align: this.align(),\r\n alignOffset: this.alignOffset(),\r\n side: this.side(),\r\n sideOffset: this.sideOffset(),\r\n });\r\n }\r\n\r\n private handlePositionChange(event: ConnectedOverlayPositionChange): void {\r\n const pair = event.connectionPair;\r\n const side = pair.overlayY === 'top'\r\n ? 'bottom'\r\n : pair.overlayY === 'bottom'\r\n ? 'top'\r\n : pair.overlayX === 'start'\r\n ? 'right'\r\n : 'left';\r\n\r\n this.panelRef?.setInput('side', side);\r\n this.overlayRef?.removePanelClass(['frame-tooltip-overlay--top', 'frame-tooltip-overlay--right', 'frame-tooltip-overlay--bottom', 'frame-tooltip-overlay--left']);\r\n this.overlayRef?.addPanelClass(`frame-tooltip-overlay--${side}`);\r\n }\r\n\r\n private updatePanelInputs(): void {\r\n const panelRef = this.panelRef;\r\n\r\n if (!panelRef) {\r\n return;\r\n }\r\n\r\n panelRef.setInput('arrow', this.arrow());\r\n panelRef.setInput('content', this.content() ?? '');\r\n panelRef.setInput('id', this.tooltipId);\r\n panelRef.setInput('side', this.side());\r\n }\r\n\r\n private syncCustomPropertiesToOverlay(): void {\r\n const overlayPane = this.overlayRef?.overlayElement;\r\n const panel = overlayPane?.querySelector<HTMLElement>('.frame-tooltip__content');\r\n\r\n if (!overlayPane || !panel) {\r\n return;\r\n }\r\n\r\n this.copyCustomProperties(this.elementRef.nativeElement, overlayPane, panel);\r\n\r\n if (this.wrapper) {\r\n this.copyCustomProperties(this.wrapper, overlayPane, panel);\r\n }\r\n }\r\n\r\n private copyCustomProperties(source: HTMLElement, overlayPane: HTMLElement, panel: HTMLElement): void {\r\n const sourceStyles = getComputedStyle(source);\r\n\r\n for (const propertyName of FR_TOOLTIP_TOKEN_NAMES) {\r\n const propertyValue = sourceStyles.getPropertyValue(propertyName);\r\n\r\n if (propertyValue.trim()) {\r\n overlayPane.style.setProperty(propertyName, propertyValue);\r\n panel.style.setProperty(propertyName, propertyValue);\r\n }\r\n }\r\n\r\n for (let index = 0; index < sourceStyles.length; index += 1) {\r\n const propertyName = sourceStyles.item(index);\r\n\r\n if (!propertyName.startsWith('--frame-tooltip-')) {\r\n continue;\r\n }\r\n\r\n const propertyValue = sourceStyles.getPropertyValue(propertyName);\r\n overlayPane.style.setProperty(propertyName, propertyValue);\r\n panel.style.setProperty(propertyName, propertyValue);\r\n }\r\n }\r\n\r\n private listen(target: HTMLElement, eventName: string, listener: EventListener): () => void {\r\n target.addEventListener(eventName, listener);\r\n return () => target.removeEventListener(eventName, listener);\r\n }\r\n\r\n private cancelOpen(): void {\r\n if (this.openTimer) {\r\n clearTimeout(this.openTimer);\r\n this.openTimer = null;\r\n }\r\n }\r\n\r\n private cancelClose(): void {\r\n if (this.closeTimer) {\r\n clearTimeout(this.closeTimer);\r\n this.closeTimer = null;\r\n }\r\n }\r\n\r\n private destroy(): void {\r\n this.close();\r\n this.overlayRef?.dispose();\r\n this.overlayRef = null;\r\n this.disabledObserver?.disconnect();\r\n this.disabledObserver = null;\r\n\r\n this.teardownTriggerListeners();\r\n }\r\n\r\n private teardownTriggerListeners(): void {\r\n for (const teardown of this.teardownListeners) {\r\n teardown();\r\n }\r\n\r\n this.teardownListeners = [];\r\n }\r\n}\r\n\r\n@Directive({\r\n selector: '[frTooltipShortcut]',\r\n host: {\r\n class: 'frame-tooltip__shortcut',\r\n },\r\n})\r\nexport class FrTooltipShortcut {}\r\n\r\n@Component({\r\n selector: 'frame-tooltip-inline-panel',\r\n imports: [NgTemplateOutlet],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div\r\n class=\"frame-tooltip__content\"\r\n role=\"tooltip\"\r\n [id]=\"id()\"\r\n [attr.data-side]=\"side()\"\r\n [attr.data-arrow]=\"arrow() ? '' : null\"\r\n >\r\n @if (templateContent(); as template) {\r\n <ng-container [ngTemplateOutlet]=\"template\" />\r\n } @else {\r\n {{ textContent() }}\r\n }\r\n </div>\r\n `,\r\n})\r\nclass FrTooltipInlinePanel {\r\n readonly arrow = input(false, { transform: booleanAttribute });\r\n readonly content = input<string | TemplateRef<unknown>>('');\r\n readonly id = input.required<string>();\r\n readonly side = input('top');\r\n\r\n protected readonly templateContent = signal<TemplateRef<unknown> | null>(null);\r\n protected readonly textContent = signal('');\r\n\r\n constructor() {\r\n effect(() => {\r\n const content = this.content();\r\n\r\n if (content instanceof TemplateRef) {\r\n this.templateContent.set(content);\r\n this.textContent.set('');\r\n return;\r\n }\r\n\r\n this.templateContent.set(null);\r\n this.textContent.set(content ?? '');\r\n });\r\n }\r\n}\r\n","export const FR_TOOLTIP_SIDES = ['top', 'right', 'bottom', 'left'] as const;\nexport const FR_TOOLTIP_ALIGNMENTS = ['start', 'center', 'end'] as const;\n\nexport type FrTooltipSide = (typeof FR_TOOLTIP_SIDES)[number];\nexport type FrTooltipAlignment = (typeof FR_TOOLTIP_ALIGNMENTS)[number];\n","import { NgModule } from '@angular/core';\r\n\r\nimport { FrTooltipDirective, FrTooltipShortcut } from './src/tooltip.directive';\r\n\r\n@NgModule({\r\n imports: [FrTooltipDirective, FrTooltipShortcut],\r\n exports: [FrTooltipDirective, FrTooltipShortcut],\r\n})\r\nexport class FrTooltipModule {}\r\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-tooltip.mjs","sources":["../../../projects/components/tooltip/src/tooltip.position.ts","../../../projects/components/tooltip/src/tooltip.tokens.ts","../../../projects/components/tooltip/src/tooltip.directive.ts","../../../projects/components/tooltip/src/tooltip.types.ts","../../../projects/components/tooltip/tooltip.module.ts","../../../projects/components/tooltip/frame-ui-ng-components-tooltip.ts"],"sourcesContent":["import { ConnectedPosition } from '@angular/cdk/overlay';\n\nimport { FrTooltipAlignment, FrTooltipSide } from './tooltip.types';\n\nexport function buildTooltipPositions(options: {\n align: FrTooltipAlignment;\n alignOffset: number;\n side: FrTooltipSide;\n sideOffset: number;\n}): ConnectedPosition[] {\n const primary = buildPosition(options.side, options);\n const opposite = oppositeSide(options.side);\n const fallback = buildPosition(opposite, {\n align: options.align,\n alignOffset: options.alignOffset,\n sideOffset: options.sideOffset,\n });\n\n return [primary, fallback];\n}\n\nfunction buildPosition(\n side: FrTooltipSide,\n options: {\n align: FrTooltipAlignment;\n alignOffset: number;\n sideOffset: number;\n },\n): ConnectedPosition {\n if (side === 'top' || side === 'bottom') {\n const isBottom = side === 'bottom';\n\n return {\n originX: options.align,\n originY: isBottom ? 'bottom' : 'top',\n overlayX: options.align,\n overlayY: isBottom ? 'top' : 'bottom',\n offsetX: options.alignOffset,\n offsetY: isBottom ? options.sideOffset : -options.sideOffset,\n };\n }\n\n const isRight = side === 'right';\n\n return {\n originX: isRight ? 'end' : 'start',\n originY: verticalPosition(options.align),\n overlayX: isRight ? 'start' : 'end',\n overlayY: verticalPosition(options.align),\n offsetX: isRight ? options.sideOffset : -options.sideOffset,\n offsetY: options.alignOffset,\n };\n}\n\nfunction verticalPosition(align: FrTooltipAlignment): 'top' | 'center' | 'bottom' {\n if (align === 'center') {\n return 'center';\n }\n\n return align === 'start' ? 'top' : 'bottom';\n}\n\nfunction oppositeSide(side: FrTooltipSide): FrTooltipSide {\n if (side === 'top') {\n return 'bottom';\n }\n\n if (side === 'bottom') {\n return 'top';\n }\n\n if (side === 'left') {\n return 'right';\n }\n\n return 'left';\n}\n","export const FR_TOOLTIP_TOKEN_NAMES = [\r\n '--frame-tooltip-content-bg',\r\n '--frame-tooltip-content-color',\r\n '--frame-tooltip-content-border',\r\n '--frame-tooltip-content-radius',\r\n '--frame-tooltip-content-shadow',\r\n '--frame-tooltip-content-padding',\r\n '--frame-tooltip-content-max-width',\r\n '--frame-tooltip-content-font-size',\r\n '--frame-tooltip-content-font-weight',\r\n '--frame-tooltip-content-line-height',\r\n '--frame-tooltip-arrow-size',\r\n '--frame-tooltip-motion-duration',\r\n '--frame-tooltip-motion-distance',\r\n '--frame-tooltip-motion-scale',\r\n '--frame-tooltip-motion-easing',\r\n] as const;\r\n","import { ConnectedOverlayPositionChange, Overlay, OverlayRef } from '@angular/cdk/overlay';\r\nimport { ComponentPortal } from '@angular/cdk/portal';\r\nimport { DOCUMENT, NgTemplateOutlet, isPlatformBrowser } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ComponentRef,\r\n DestroyRef,\r\n Directive,\r\n DoCheck,\r\n ElementRef,\r\n PLATFORM_ID,\r\n TemplateRef,\r\n booleanAttribute,\r\n computed,\r\n inject,\r\n input,\r\n signal,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { clampNumber, parseCssPixelValue } from '@frame-ui-ng/components/utils';\r\n\r\nimport { buildTooltipPositions } from './tooltip.position';\r\nimport { FR_TOOLTIP_TOKEN_NAMES } from './tooltip.tokens';\r\nimport { FrTooltipAlignment, FrTooltipSide } from './tooltip.types';\r\n\r\nlet nextInlineTooltipId = 0;\r\n\r\n/** Tooltip trigger directive with delay and placement options. */\r\n@Directive({\r\n selector: '[frTooltip]',\r\n host: {\r\n class: 'frame-tooltip__trigger',\r\n '[attr.aria-describedby]': 'isOpen() ? tooltipId : null',\r\n '[attr.data-state]': 'isOpen() ? \"open\" : \"closed\"',\r\n },\r\n})\r\nexport class FrTooltipDirective implements AfterViewInit, DoCheck {\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly document = inject(DOCUMENT);\r\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly overlay = inject(Overlay);\r\n private readonly platformId = inject(PLATFORM_ID);\r\n\r\n readonly content = input<string | TemplateRef<unknown> | null>(null, { alias: 'frTooltip' });\r\n readonly align = input<FrTooltipAlignment>('center', { alias: 'frTooltipAlign' });\r\n readonly alignOffset = input(0, { alias: 'frTooltipAlignOffset' });\r\n readonly arrow = input(false, { alias: 'frTooltipArrow', transform: booleanAttribute });\r\n readonly closeDelay = input(0, { alias: 'frTooltipCloseDelay' });\r\n readonly openDelay = input(0, { alias: 'frTooltipOpenDelay', transform: numberAttribute });\r\n readonly side = input<FrTooltipSide>('top', { alias: 'frTooltipSide' });\r\n readonly sideOffset = input(8, { alias: 'frTooltipSideOffset' });\r\n\r\n protected readonly isOpen = signal(false);\r\n protected readonly tooltipId = `frame-tooltip-inline-${nextInlineTooltipId++}`;\r\n\r\n private closeTimer: ReturnType<typeof setTimeout> | null = null;\r\n private disabledObserver: MutationObserver | null = null;\r\n private openTimer: ReturnType<typeof setTimeout> | null = null;\r\n private overlayRef: OverlayRef | null = null;\r\n private panelRef: ComponentRef<FrTooltipInlinePanel> | null = null;\r\n private arrowFrameId = -1;\r\n private currentSide: FrTooltipSide = this.side();\r\n private pendingArrowSide: FrTooltipSide = this.side();\r\n private triggerElement = this.elementRef.nativeElement;\r\n private wrapped = false;\r\n private wrapper: HTMLElement | null = null;\r\n private teardownListeners: Array<() => void> = [];\r\n private lastPanelInputKey = '';\r\n\r\n constructor() {\r\n this.destroyRef.onDestroy(() => this.destroy());\r\n }\r\n\r\n ngDoCheck(): void {\r\n const content = this.content();\r\n\r\n if (!content) {\r\n this.close();\r\n this.lastPanelInputKey = '';\r\n return;\r\n }\r\n\r\n const panelInputKey = [content, this.arrow(), this.side(), this.tooltipId].map(String).join('|');\r\n\r\n if (this.panelRef && panelInputKey !== this.lastPanelInputKey) {\r\n this.updatePanelInputs();\r\n }\r\n\r\n this.lastPanelInputKey = panelInputKey;\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n if (!isPlatformBrowser(this.platformId)) {\r\n return;\r\n }\r\n\r\n this.ensureDisabledHostWrapper();\r\n this.bindTriggerEvents();\r\n this.observeDisabledState();\r\n }\r\n\r\n private bindTriggerEvents(): void {\r\n const target = this.triggerElement;\r\n\r\n this.teardownListeners.push(this.listen(target, 'mouseenter', () => this.openWithDelay()));\r\n this.teardownListeners.push(this.listen(target, 'mouseleave', () => this.closeWithDelay()));\r\n this.teardownListeners.push(this.listen(target, 'focusin', () => this.openWithDelay()));\r\n this.teardownListeners.push(this.listen(target, 'focusout', () => this.closeWithDelay()));\r\n this.teardownListeners.push(\r\n this.listen(target, 'keydown', (event) => {\r\n const keyboardEvent = event as KeyboardEvent;\r\n\r\n if (keyboardEvent.key === 'Escape') {\r\n keyboardEvent.preventDefault();\r\n this.close();\r\n }\r\n }),\r\n );\r\n }\r\n\r\n private ensureDisabledHostWrapper(): void {\r\n const element = this.elementRef.nativeElement;\r\n\r\n if (!('disabled' in element) || !element.hasAttribute('disabled') || this.wrapped) {\r\n return;\r\n }\r\n\r\n const parent = element.parentNode;\r\n\r\n if (!parent) {\r\n return;\r\n }\r\n\r\n const wrapper = this.document.createElement('span');\r\n // Disabled form controls do not emit pointer/focus events, so the wrapper becomes the trigger.\r\n wrapper.className = 'frame-tooltip__disabled-trigger';\r\n wrapper.tabIndex = 0;\r\n parent.insertBefore(wrapper, element);\r\n wrapper.appendChild(element);\r\n this.triggerElement = wrapper;\r\n this.wrapper = wrapper;\r\n this.wrapped = true;\r\n }\r\n\r\n private observeDisabledState(): void {\r\n const element = this.elementRef.nativeElement;\r\n\r\n if (!('disabled' in element)) {\r\n return;\r\n }\r\n\r\n this.disabledObserver = new MutationObserver(() => {\r\n if (!element.hasAttribute('disabled') || this.wrapped) {\r\n return;\r\n }\r\n\r\n this.teardownTriggerListeners();\r\n this.ensureDisabledHostWrapper();\r\n this.bindTriggerEvents();\r\n });\r\n this.disabledObserver.observe(element, { attributes: true, attributeFilter: ['disabled'] });\r\n }\r\n\r\n private openWithDelay(): void {\r\n if (!this.content()) {\r\n return;\r\n }\r\n\r\n this.cancelClose();\r\n this.cancelOpen();\r\n\r\n const delay = Math.max(0, this.openDelay());\r\n\r\n if (delay === 0) {\r\n this.open();\r\n return;\r\n }\r\n\r\n this.openTimer = setTimeout(() => this.open(), delay);\r\n }\r\n\r\n private closeWithDelay(): void {\r\n this.cancelOpen();\r\n this.cancelClose();\r\n\r\n const delay = Math.max(0, this.closeDelay());\r\n\r\n if (delay === 0) {\r\n this.close();\r\n return;\r\n }\r\n\r\n this.closeTimer = setTimeout(() => this.close(), delay);\r\n }\r\n\r\n private open(): void {\r\n const content = this.content();\r\n\r\n if (!content) {\r\n return;\r\n }\r\n\r\n if (!this.overlayRef) {\r\n this.overlayRef = this.createOverlay();\r\n }\r\n\r\n if (!this.overlayRef.hasAttached()) {\r\n this.panelRef = this.overlayRef.attach(new ComponentPortal(FrTooltipInlinePanel));\r\n this.updatePanelInputs();\r\n this.syncCustomPropertiesToOverlay();\r\n this.scheduleArrowPosition();\r\n }\r\n\r\n this.isOpen.set(true);\r\n }\r\n\r\n private close(): void {\r\n this.cancelOpen();\r\n this.cancelClose();\r\n this.overlayRef?.detach();\r\n this.panelRef = null;\r\n this.isOpen.set(false);\r\n }\r\n\r\n private createOverlay(): OverlayRef {\r\n const positionStrategy = this.overlay\r\n .position()\r\n .flexibleConnectedTo(this.triggerElement)\r\n .withPositions(this.positions())\r\n .withPush(true)\r\n .withViewportMargin(8);\r\n\r\n positionStrategy.positionChanges.subscribe((event) => this.handlePositionChange(event));\r\n\r\n const overlayRef = this.overlay.create({\r\n panelClass: ['frame-tooltip-overlay', `frame-tooltip-overlay--${this.side()}`],\r\n positionStrategy,\r\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\r\n });\r\n\r\n overlayRef.keydownEvents().subscribe((event) => {\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n this.close();\r\n }\r\n });\r\n\r\n return overlayRef;\r\n }\r\n\r\n private positions() {\r\n return buildTooltipPositions({\r\n align: this.align(),\r\n alignOffset: this.alignOffset(),\r\n side: this.side(),\r\n sideOffset: this.sideOffset(),\r\n });\r\n }\r\n\r\n private handlePositionChange(event: ConnectedOverlayPositionChange): void {\r\n const pair = event.connectionPair;\r\n const side = pair.overlayY === 'top'\r\n ? 'bottom'\r\n : pair.overlayY === 'bottom'\r\n ? 'top'\r\n : pair.overlayX === 'start'\r\n ? 'right'\r\n : 'left';\r\n\r\n this.panelRef?.setInput('side', side);\r\n this.currentSide = side;\r\n this.overlayRef?.removePanelClass(['frame-tooltip-overlay--top', 'frame-tooltip-overlay--right', 'frame-tooltip-overlay--bottom', 'frame-tooltip-overlay--left']);\r\n this.overlayRef?.addPanelClass(`frame-tooltip-overlay--${side}`);\r\n this.scheduleArrowPosition(side);\r\n }\r\n\r\n private updatePanelInputs(): void {\r\n const panelRef = this.panelRef;\r\n\r\n if (!panelRef) {\r\n return;\r\n }\r\n\r\n panelRef.setInput('arrow', this.arrow());\r\n panelRef.setInput('content', this.content() ?? '');\r\n panelRef.setInput('id', this.tooltipId);\r\n panelRef.setInput('side', this.side());\r\n this.currentSide = this.side();\r\n }\r\n\r\n private syncCustomPropertiesToOverlay(): void {\r\n const overlayPane = this.overlayRef?.overlayElement;\r\n const panel = overlayPane?.querySelector<HTMLElement>('.frame-tooltip__content');\r\n\r\n if (!overlayPane || !panel) {\r\n return;\r\n }\r\n\r\n this.copyCustomProperties(this.elementRef.nativeElement, overlayPane, panel);\r\n\r\n if (this.wrapper) {\r\n this.copyCustomProperties(this.wrapper, overlayPane, panel);\r\n }\r\n }\r\n\r\n private copyCustomProperties(source: HTMLElement, overlayPane: HTMLElement, panel: HTMLElement): void {\r\n const sourceStyles = getComputedStyle(source);\r\n\r\n // Overlay content is portaled, so copy theme tokens from the trigger into the pane.\r\n for (const propertyName of FR_TOOLTIP_TOKEN_NAMES) {\r\n const propertyValue = sourceStyles.getPropertyValue(propertyName);\r\n\r\n if (propertyValue.trim()) {\r\n overlayPane.style.setProperty(propertyName, propertyValue);\r\n panel.style.setProperty(propertyName, propertyValue);\r\n }\r\n }\r\n\r\n for (let index = 0; index < sourceStyles.length; index += 1) {\r\n const propertyName = sourceStyles.item(index);\r\n\r\n if (!propertyName.startsWith('--frame-tooltip-')) {\r\n continue;\r\n }\r\n\r\n const propertyValue = sourceStyles.getPropertyValue(propertyName);\r\n overlayPane.style.setProperty(propertyName, propertyValue);\r\n panel.style.setProperty(propertyName, propertyValue);\r\n }\r\n }\r\n\r\n private scheduleArrowPosition(side = this.currentSide): void {\r\n this.pendingArrowSide = side;\r\n\r\n if (!this.arrow() || this.arrowFrameId !== -1) {\r\n return;\r\n }\r\n\r\n // Coalesce position changes until CDK has applied the latest overlay geometry.\r\n this.arrowFrameId = requestAnimationFrame(() => {\r\n this.arrowFrameId = -1;\r\n this.syncArrowPosition(this.pendingArrowSide);\r\n });\r\n }\r\n\r\n private syncArrowPosition(side: FrTooltipSide): void {\r\n const panel = this.overlayRef?.overlayElement.querySelector<HTMLElement>('.frame-tooltip__content');\r\n\r\n if (!panel) {\r\n return;\r\n }\r\n\r\n const panelRect = panel.getBoundingClientRect();\r\n const triggerRect = this.triggerElement.getBoundingClientRect();\r\n\r\n if (!panelRect.width || !panelRect.height || !triggerRect.width || !triggerRect.height) {\r\n return;\r\n }\r\n\r\n const arrowSize = parseCssPixelValue(\r\n getComputedStyle(panel).getPropertyValue('--frame-tooltip-arrow-size'),\r\n 8,\r\n );\r\n const edgeInset = arrowSize / 2;\r\n\r\n if (side === 'top' || side === 'bottom') {\r\n const triggerCenter = triggerRect.left + triggerRect.width / 2 - panelRect.left;\r\n const arrowX = clampNumber(triggerCenter - arrowSize / 2, edgeInset, panelRect.width - arrowSize - edgeInset);\r\n panel.style.setProperty('--frame-tooltip-arrow-x', `${Math.round(arrowX * 100) / 100}px`);\r\n return;\r\n }\r\n\r\n const triggerCenter = triggerRect.top + triggerRect.height / 2 - panelRect.top;\r\n const arrowY = clampNumber(triggerCenter - arrowSize / 2, edgeInset, panelRect.height - arrowSize - edgeInset);\r\n panel.style.setProperty('--frame-tooltip-arrow-y', `${Math.round(arrowY * 100) / 100}px`);\r\n }\r\n\r\n private listen(target: HTMLElement, eventName: string, listener: EventListener): () => void {\r\n target.addEventListener(eventName, listener);\r\n return () => target.removeEventListener(eventName, listener);\r\n }\r\n\r\n private cancelOpen(): void {\r\n if (this.openTimer) {\r\n clearTimeout(this.openTimer);\r\n this.openTimer = null;\r\n }\r\n }\r\n\r\n private cancelClose(): void {\r\n if (this.closeTimer) {\r\n clearTimeout(this.closeTimer);\r\n this.closeTimer = null;\r\n }\r\n }\r\n\r\n private destroy(): void {\r\n this.close();\r\n if (this.arrowFrameId !== -1) {\r\n cancelAnimationFrame(this.arrowFrameId);\r\n this.arrowFrameId = -1;\r\n }\r\n this.overlayRef?.dispose();\r\n this.overlayRef = null;\r\n this.disabledObserver?.disconnect();\r\n this.disabledObserver = null;\r\n\r\n this.teardownTriggerListeners();\r\n }\r\n\r\n private teardownTriggerListeners(): void {\r\n for (const teardown of this.teardownListeners) {\r\n teardown();\r\n }\r\n\r\n this.teardownListeners = [];\r\n }\r\n}\r\n\r\n/** Shortcut slot for tooltip. */\r\n@Directive({\r\n selector: '[frTooltipShortcut]',\r\n host: {\r\n class: 'frame-tooltip__shortcut',\r\n },\r\n})\r\nexport class FrTooltipShortcut {}\r\n\r\n/** Inline overlay panel that renders tooltip text or template content. */\r\n@Component({\r\n selector: 'frame-tooltip-inline-panel',\r\n imports: [NgTemplateOutlet],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div\r\n class=\"frame-tooltip__content\"\r\n role=\"tooltip\"\r\n [id]=\"id()\"\r\n [attr.data-side]=\"side()\"\r\n [attr.data-arrow]=\"arrow() ? '' : null\"\r\n >\r\n @if (templateContent(); as template) {\r\n <ng-container [ngTemplateOutlet]=\"template\" />\r\n } @else {\r\n {{ textContent() }}\r\n }\r\n </div>\r\n `,\r\n})\r\nclass FrTooltipInlinePanel {\r\n readonly arrow = input(false, { transform: booleanAttribute });\r\n readonly content = input<string | TemplateRef<unknown>>('');\r\n readonly id = input.required<string>();\r\n readonly side = input('top');\r\n\r\n protected readonly templateContent = computed(() => {\r\n const content = this.content();\r\n return content instanceof TemplateRef ? content : null;\r\n });\r\n protected readonly textContent = computed(() => {\r\n const content = this.content();\r\n return content instanceof TemplateRef ? '' : content;\r\n });\r\n}\r\n\r\n","export const FR_TOOLTIP_SIDES = ['top', 'right', 'bottom', 'left'] as const;\nexport const FR_TOOLTIP_ALIGNMENTS = ['start', 'center', 'end'] as const;\n\nexport type FrTooltipSide = (typeof FR_TOOLTIP_SIDES)[number];\nexport type FrTooltipAlignment = (typeof FR_TOOLTIP_ALIGNMENTS)[number];\n","import { NgModule } from '@angular/core';\r\n\r\nimport { FrTooltipDirective, FrTooltipShortcut } from './src/tooltip.directive';\r\n\r\n@NgModule({\r\n imports: [FrTooltipDirective, FrTooltipShortcut],\r\n exports: [FrTooltipDirective, FrTooltipShortcut],\r\n})\r\nexport class FrTooltipModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ function clampNumber(value, min, max) {
2
+ const normalizedMin = Math.min(min, max);
3
+ const normalizedMax = Math.max(min, max);
4
+ return Math.min(Math.max(value, normalizedMin), normalizedMax);
5
+ }
6
+ function coerceNumber(value, fallback) {
7
+ const parsed = Number(value);
8
+ return Number.isFinite(parsed) ? parsed : fallback;
9
+ }
10
+ function parseCssPixelValue(value, fallback) {
11
+ const parsed = Number.parseFloat(value);
12
+ return Number.isFinite(parsed) ? parsed : fallback;
13
+ }
14
+
15
+ /**
16
+ * Generated bundle index. Do not edit.
17
+ */
18
+
19
+ export { clampNumber, coerceNumber, parseCssPixelValue };
20
+ //# sourceMappingURL=frame-ui-ng-components-utils.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame-ui-ng-components-utils.mjs","sources":["../../../projects/components/utils/src/number.ts","../../../projects/components/utils/frame-ui-ng-components-utils.ts"],"sourcesContent":["export function clampNumber(value: number, min: number, max: number): number {\r\n const normalizedMin = Math.min(min, max);\r\n const normalizedMax = Math.max(min, max);\r\n\r\n return Math.min(Math.max(value, normalizedMin), normalizedMax);\r\n}\r\n\r\nexport function coerceNumber(value: unknown, fallback: number): number {\r\n const parsed = Number(value);\r\n\r\n return Number.isFinite(parsed) ? parsed : fallback;\r\n}\r\n\r\nexport function parseCssPixelValue(value: string, fallback: number): number {\r\n const parsed = Number.parseFloat(value);\r\n\r\n return Number.isFinite(parsed) ? parsed : fallback;\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"SAAgB,WAAW,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW,EAAA;IACjE,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC;IACxC,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC;AAExC,IAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,aAAa,CAAC,EAAE,aAAa,CAAC;AAChE;AAEM,SAAU,YAAY,CAAC,KAAc,EAAE,QAAgB,EAAA;AAC3D,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC;AAE5B,IAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,QAAQ;AACpD;AAEM,SAAU,kBAAkB,CAAC,KAAa,EAAE,QAAgB,EAAA;IAChE,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC;AAEvC,IAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,QAAQ;AACpD;;ACjBA;;AAEG;;;;"}
@@ -1,5 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, DestroyRef, ElementRef, signal, input, computed, Directive, TemplateRef, ViewContainerRef, effect, NgModule } from '@angular/core';
2
+ import { inject, DestroyRef, ElementRef, signal, input, computed, Directive, TemplateRef, ViewContainerRef, NgModule } from '@angular/core';
3
+ import { clampNumber } from '@frame-ui-ng/components/utils';
3
4
 
4
5
  function calculateVirtualRange(options) {
5
6
  const itemSize = Math.max(options.itemSize, 1);
@@ -8,8 +9,8 @@ function calculateVirtualRange(options) {
8
9
  const overscan = Math.max(Math.trunc(options.overscan), 0);
9
10
  const visibleCount = Math.max(Math.ceil(viewportSize / itemSize), 1);
10
11
  const rawStart = Math.floor(Math.max(options.scrollTop, 0) / itemSize) - overscan;
11
- const start = clamp(rawStart, 0, totalCount);
12
- const end = clamp(start + visibleCount + overscan * 2, start, totalCount);
12
+ const start = clampNumber(rawStart, 0, totalCount);
13
+ const end = clampNumber(start + visibleCount + overscan * 2, start, totalCount);
13
14
  return {
14
15
  start,
15
16
  end,
@@ -21,32 +22,30 @@ function calculateScrollOffsetForIndex(index, alignment, itemSize, viewportSize,
21
22
  const normalizedItemSize = Math.max(itemSize, 1);
22
23
  const normalizedViewportSize = Math.max(viewportSize, 0);
23
24
  const maxScrollTop = Math.max(totalCount * normalizedItemSize - normalizedViewportSize, 0);
24
- const clampedIndex = clamp(index, 0, Math.max(totalCount - 1, 0));
25
+ const clampedIndex = clampNumber(index, 0, Math.max(totalCount - 1, 0));
25
26
  const itemStart = clampedIndex * normalizedItemSize;
26
27
  const itemEnd = itemStart + normalizedItemSize;
27
28
  switch (alignment) {
28
29
  case 'start':
29
- return clamp(itemStart, 0, maxScrollTop);
30
+ return clampNumber(itemStart, 0, maxScrollTop);
30
31
  case 'center':
31
- return clamp(itemStart - (normalizedViewportSize - normalizedItemSize) / 2, 0, maxScrollTop);
32
+ return clampNumber(itemStart - (normalizedViewportSize - normalizedItemSize) / 2, 0, maxScrollTop);
32
33
  case 'end':
33
- return clamp(itemEnd - normalizedViewportSize, 0, maxScrollTop);
34
+ return clampNumber(itemEnd - normalizedViewportSize, 0, maxScrollTop);
34
35
  case 'nearest':
35
36
  case 'auto':
36
37
  default:
37
38
  if (itemStart < currentScrollTop) {
38
- return clamp(itemStart, 0, maxScrollTop);
39
+ return clampNumber(itemStart, 0, maxScrollTop);
39
40
  }
40
41
  if (itemEnd > currentScrollTop + normalizedViewportSize) {
41
- return clamp(itemEnd - normalizedViewportSize, 0, maxScrollTop);
42
+ return clampNumber(itemEnd - normalizedViewportSize, 0, maxScrollTop);
42
43
  }
43
- return clamp(currentScrollTop, 0, maxScrollTop);
44
+ return clampNumber(currentScrollTop, 0, maxScrollTop);
44
45
  }
45
46
  }
46
- function clamp(value, min, max) {
47
- return Math.min(Math.max(value, min), max);
48
- }
49
47
 
48
+ /** Viewport controller for virtual scrolling. */
50
49
  class FrVirtualViewport {
51
50
  destroyRef = inject(DestroyRef);
52
51
  elementRef = inject(ElementRef);
@@ -90,6 +89,7 @@ class FrVirtualViewport {
90
89
  }
91
90
  scrollToIndex(index, alignment = 'auto') {
92
91
  const element = this.elementRef.nativeElement;
92
+ // Virtual scrolling assumes fixed item heights, so index math can stay O(1).
93
93
  const nextScrollTop = calculateScrollOffsetForIndex(index, alignment, this.itemSize(), element.clientHeight, this.totalCount(), element.scrollTop);
94
94
  element.scrollTop = nextScrollTop;
95
95
  this.scrollTop.set(nextScrollTop);
@@ -123,6 +123,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
123
123
  }]
124
124
  }], ctorParameters: () => [], propDecorators: { itemSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemSize", required: true }] }], overscan: [{ type: i0.Input, args: [{ isSignal: true, alias: "overscan", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }] } });
125
125
 
126
+ /** Measured content wrapper for virtual scrolling. */
126
127
  class FrVirtualContent {
127
128
  viewport = inject(FrVirtualViewport);
128
129
  before = computed(() => this.viewport.before(), ...(ngDevMode ? [{ debugName: "before" }] : /* istanbul ignore next */ []));
@@ -142,6 +143,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
142
143
  }]
143
144
  }] });
144
145
 
146
+ /** Structural directive for rendering virtualized ranges. */
145
147
  class FrVirtualFor {
146
148
  templateRef = inject(TemplateRef);
147
149
  viewContainerRef = inject(ViewContainerRef);
@@ -149,6 +151,7 @@ class FrVirtualFor {
149
151
  views = [];
150
152
  frVirtualForOf = input.required(...(ngDevMode ? [{ debugName: "frVirtualForOf" }] : /* istanbul ignore next */ []));
151
153
  frVirtualForTrackBy = input(null, ...(ngDevMode ? [{ debugName: "frVirtualForTrackBy" }] : /* istanbul ignore next */ []));
154
+ lastRenderKey = '';
152
155
  slice = computed(() => {
153
156
  const items = this.frVirtualForOf();
154
157
  const start = this.viewport.startIndex();
@@ -159,12 +162,21 @@ class FrVirtualFor {
159
162
  visible: items.slice(start, end),
160
163
  };
161
164
  }, ...(ngDevMode ? [{ debugName: "slice" }] : /* istanbul ignore next */ []));
162
- constructor() {
163
- effect(() => {
164
- const items = this.frVirtualForOf();
165
- this.viewport.setTotalCount(items.length);
166
- this.render();
167
- });
165
+ ngDoCheck() {
166
+ const items = this.frVirtualForOf();
167
+ const renderKey = [
168
+ items,
169
+ items.length,
170
+ this.viewport.startIndex(),
171
+ this.viewport.endIndex(),
172
+ this.frVirtualForTrackBy(),
173
+ ].map(String).join('|');
174
+ this.viewport.setTotalCount(items.length);
175
+ if (renderKey === this.lastRenderKey) {
176
+ return;
177
+ }
178
+ this.lastRenderKey = renderKey;
179
+ this.render();
168
180
  }
169
181
  static ngTemplateContextGuard(_directive, _context) {
170
182
  return true;
@@ -217,8 +229,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
217
229
  args: [{
218
230
  selector: '[frVirtualFor][frVirtualForOf]',
219
231
  }]
220
- }], ctorParameters: () => [], propDecorators: { frVirtualForOf: [{ type: i0.Input, args: [{ isSignal: true, alias: "frVirtualForOf", required: true }] }], frVirtualForTrackBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "frVirtualForTrackBy", required: false }] }] } });
232
+ }], propDecorators: { frVirtualForOf: [{ type: i0.Input, args: [{ isSignal: true, alias: "frVirtualForOf", required: true }] }], frVirtualForTrackBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "frVirtualForTrackBy", required: false }] }] } });
221
233
 
234
+ /** List wrapper for virtualized items. */
222
235
  class FrVirtualList {
223
236
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrVirtualList, deps: [], target: i0.ɵɵFactoryTarget.Directive });
224
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 });
@@ -232,6 +245,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
232
245
  },
233
246
  }]
234
247
  }] });
248
+ /** Panel wrapper for virtualized content. */
235
249
  class FrVirtualPanel {
236
250
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrVirtualPanel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
237
251
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrVirtualPanel, isStandalone: true, selector: "[frVirtualPanel], frame-virtual-panel", host: { classAttribute: "frame-virtual-scroll__panel" }, ngImport: i0 });
@@ -245,6 +259,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
245
259
  },
246
260
  }]
247
261
  }] });
262
+ /** Item wrapper for virtualized rows. */
248
263
  class FrVirtualItem {
249
264
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrVirtualItem, deps: [], target: i0.ɵɵFactoryTarget.Directive });
250
265
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrVirtualItem, isStandalone: true, selector: "[frVirtualItem], frame-virtual-item", host: { classAttribute: "frame-virtual-scroll__item" }, ngImport: i0 });
@@ -258,6 +273,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
258
273
  },
259
274
  }]
260
275
  }] });
276
+ /** Meta slot for virtual item. */
261
277
  class FrVirtualItemMeta {
262
278
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrVirtualItemMeta, deps: [], target: i0.ɵɵFactoryTarget.Directive });
263
279
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrVirtualItemMeta, isStandalone: true, selector: "[frVirtualItemMeta], frame-virtual-item-meta", host: { classAttribute: "frame-virtual-scroll__item-meta" }, ngImport: i0 });
@@ -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":["export interface FrVirtualRange {\n start: number;\n end: number;\n before: number;\n after: number;\n}\n\nexport interface FrVirtualRangeOptions {\n itemSize: number;\n overscan: number;\n scrollTop: number;\n totalCount: number;\n viewportSize: number;\n}\n\nexport type FrVirtualScrollAlignment = 'auto' | 'start' | 'center' | 'end' | 'nearest';\n\nexport function calculateVirtualRange(options: FrVirtualRangeOptions): FrVirtualRange {\n const itemSize = Math.max(options.itemSize, 1);\n const totalCount = Math.max(options.totalCount, 0);\n const viewportSize = Math.max(options.viewportSize, 0);\n const overscan = Math.max(Math.trunc(options.overscan), 0);\n const visibleCount = Math.max(Math.ceil(viewportSize / itemSize), 1);\n const rawStart = Math.floor(Math.max(options.scrollTop, 0) / itemSize) - overscan;\n const start = clamp(rawStart, 0, totalCount);\n const end = clamp(start + visibleCount + overscan * 2, start, totalCount);\n\n return {\n start,\n end,\n before: start * itemSize,\n after: Math.max(totalCount - end, 0) * itemSize,\n };\n}\n\nexport function calculateScrollOffsetForIndex(\n index: number,\n alignment: FrVirtualScrollAlignment,\n itemSize: number,\n viewportSize: number,\n totalCount: number,\n currentScrollTop: number,\n): number {\n const normalizedItemSize = Math.max(itemSize, 1);\n const normalizedViewportSize = Math.max(viewportSize, 0);\n const maxScrollTop = Math.max(totalCount * normalizedItemSize - normalizedViewportSize, 0);\n const clampedIndex = clamp(index, 0, Math.max(totalCount - 1, 0));\n const itemStart = clampedIndex * normalizedItemSize;\n const itemEnd = itemStart + normalizedItemSize;\n\n switch (alignment) {\n case 'start':\n return clamp(itemStart, 0, maxScrollTop);\n case 'center':\n return clamp(itemStart - (normalizedViewportSize - normalizedItemSize) / 2, 0, maxScrollTop);\n case 'end':\n return clamp(itemEnd - normalizedViewportSize, 0, maxScrollTop);\n case 'nearest':\n case 'auto':\n default:\n if (itemStart < currentScrollTop) {\n return clamp(itemStart, 0, maxScrollTop);\n }\n\n if (itemEnd > currentScrollTop + normalizedViewportSize) {\n return clamp(itemEnd - normalizedViewportSize, 0, maxScrollTop);\n }\n\n return clamp(currentScrollTop, 0, maxScrollTop);\n }\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n","import {\n Directive,\n DestroyRef,\n ElementRef,\n computed,\n inject,\n input,\n signal,\n} from '@angular/core';\n\nimport {\n FrVirtualScrollAlignment,\n calculateScrollOffsetForIndex,\n calculateVirtualRange,\n} from './virtual-scroll.engine';\n\n@Directive({\n selector: '[frVirtualViewport], frame-virtual-viewport',\n exportAs: 'frVirtualViewport',\n host: {\n class: 'frame-virtual-scroll__viewport',\n '(scroll)': 'handleScroll()',\n '[style.block-size]': 'height()',\n },\n})\nexport class FrVirtualViewport {\n private readonly destroyRef = inject(DestroyRef);\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly scrollTop = signal(0);\n private readonly totalCount = signal(0);\n private readonly viewportSize = signal(0);\n private resizeObserver: ResizeObserver | null = null;\n\n readonly itemSize = input.required<number>();\n readonly overscan = input(4);\n readonly height = input<string | null>(null);\n\n readonly range = computed(() =>\n calculateVirtualRange({\n itemSize: this.itemSize(),\n overscan: this.overscan(),\n scrollTop: this.scrollTop(),\n totalCount: this.totalCount(),\n viewportSize: this.viewportSize(),\n }),\n );\n\n readonly before = computed(() => this.range().before);\n readonly after = computed(() => this.range().after);\n readonly startIndex = computed(() => this.range().start);\n readonly endIndex = computed(() => this.range().end);\n readonly renderedCount = computed(() => this.range().end - this.range().start);\n readonly totalSize = computed(() => this.totalCount() * Math.max(this.itemSize(), 1));\n\n constructor() {\n queueMicrotask(() => {\n this.measure();\n this.attachResizeObserver();\n });\n\n this.destroyRef.onDestroy(() => {\n this.resizeObserver?.disconnect();\n });\n }\n\n setTotalCount(count: number): void {\n this.totalCount.set(Math.max(Math.trunc(count), 0));\n this.measure();\n }\n\n measure(): void {\n const element = this.elementRef.nativeElement;\n this.viewportSize.set(element.clientHeight);\n this.scrollTop.set(element.scrollTop);\n }\n\n scrollToIndex(index: number, alignment: FrVirtualScrollAlignment = 'auto'): void {\n const element = this.elementRef.nativeElement;\n const nextScrollTop = calculateScrollOffsetForIndex(\n index,\n alignment,\n this.itemSize(),\n element.clientHeight,\n this.totalCount(),\n element.scrollTop,\n );\n\n element.scrollTop = nextScrollTop;\n this.scrollTop.set(nextScrollTop);\n }\n\n protected handleScroll(): void {\n this.scrollTop.set(this.elementRef.nativeElement.scrollTop);\n }\n\n private attachResizeObserver(): void {\n const element = this.elementRef.nativeElement;\n\n if (typeof ResizeObserver === 'undefined') {\n return;\n }\n\n this.resizeObserver = new ResizeObserver(() => {\n this.measure();\n });\n this.resizeObserver.observe(element);\n }\n}\n","import { Directive, computed, inject } from '@angular/core';\n\nimport { FrVirtualViewport } from './virtual-scroll.viewport';\n\n@Directive({\n selector: '[frVirtualContent], frame-virtual-content',\n host: {\n class: 'frame-virtual-scroll__content',\n '[style.padding-top.px]': 'before()',\n '[style.padding-bottom.px]': 'after()',\n },\n})\nexport class FrVirtualContent {\n private readonly viewport = inject(FrVirtualViewport);\n\n protected readonly before = computed(() => this.viewport.before());\n protected readonly after = computed(() => this.viewport.after());\n}\n","import {\n Directive,\n EmbeddedViewRef,\n TemplateRef,\n ViewContainerRef,\n computed,\n effect,\n inject,\n input,\n} from '@angular/core';\n\nimport { FrVirtualViewport } from './virtual-scroll.viewport';\n\nexport interface FrVirtualForContext<T> {\n $implicit: T;\n count: number;\n even: boolean;\n first: boolean;\n index: number;\n last: boolean;\n odd: boolean;\n}\n\nexport type FrVirtualTrackBy<T> = (index: number, item: T) => unknown;\n\n@Directive({\n selector: '[frVirtualFor][frVirtualForOf]',\n})\nexport class FrVirtualFor<T> {\n private readonly templateRef = inject<TemplateRef<FrVirtualForContext<T>>>(TemplateRef);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly viewport = inject(FrVirtualViewport);\n private readonly views: EmbeddedViewRef<FrVirtualForContext<T>>[] = [];\n\n readonly frVirtualForOf = input.required<readonly T[]>();\n readonly frVirtualForTrackBy = input<FrVirtualTrackBy<T> | null>(null);\n\n private readonly slice = computed(() => {\n const items = this.frVirtualForOf();\n const start = this.viewport.startIndex();\n const end = this.viewport.endIndex();\n\n return {\n items,\n start,\n visible: items.slice(start, end),\n };\n });\n\n constructor() {\n effect(() => {\n const items = this.frVirtualForOf();\n this.viewport.setTotalCount(items.length);\n this.render();\n });\n }\n\n static ngTemplateContextGuard<T>(\n _directive: FrVirtualFor<T>,\n _context: unknown,\n ): _context is FrVirtualForContext<T> {\n return true;\n }\n\n private render(): void {\n const { items, start, visible } = this.slice();\n const trackBy = this.frVirtualForTrackBy();\n\n while (this.views.length > visible.length) {\n this.viewContainerRef.remove(this.views.length - 1);\n this.views.pop();\n }\n\n for (let offset = 0; offset < visible.length; offset += 1) {\n const item = visible[offset]!;\n const index = start + offset;\n const view = this.views[offset] ?? this.createView(offset, item, index, items.length);\n const context = view.context;\n const identity = trackBy?.(index, item) ?? item;\n\n if ((view as EmbeddedViewRef<FrVirtualForContext<T>> & { __frameVirtualIdentity?: unknown }).__frameVirtualIdentity !== identity) {\n (view as EmbeddedViewRef<FrVirtualForContext<T>> & { __frameVirtualIdentity?: unknown }).__frameVirtualIdentity =\n identity;\n }\n\n context.$implicit = item;\n context.count = items.length;\n context.index = index;\n context.first = index === 0;\n context.last = index === items.length - 1;\n context.even = index % 2 === 0;\n context.odd = !context.even;\n view.detectChanges();\n }\n }\n\n private createView(\n offset: number,\n item: T,\n index: number,\n count: number,\n ): EmbeddedViewRef<FrVirtualForContext<T>> {\n const view = this.viewContainerRef.createEmbeddedView(\n this.templateRef,\n {\n $implicit: item,\n count,\n even: index % 2 === 0,\n first: index === 0,\n index,\n last: index === count - 1,\n odd: index % 2 !== 0,\n },\n offset,\n );\n\n this.views[offset] = view;\n return view;\n }\n}\n","import { Directive } from '@angular/core';\n\n@Directive({\n selector: '[frVirtualList], frame-virtual-list',\n host: {\n class: 'frame-virtual-scroll__list',\n },\n})\nexport class FrVirtualList {}\n\n@Directive({\n selector: '[frVirtualPanel], frame-virtual-panel',\n host: {\n class: 'frame-virtual-scroll__panel',\n },\n})\nexport class FrVirtualPanel {}\n\n@Directive({\n selector: '[frVirtualItem], frame-virtual-item',\n host: {\n class: 'frame-virtual-scroll__item',\n },\n})\nexport class FrVirtualItem {}\n\n@Directive({\n selector: '[frVirtualItemMeta], frame-virtual-item-meta',\n host: {\n class: 'frame-virtual-scroll__item-meta',\n },\n})\nexport class FrVirtualItemMeta {}\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',\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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"}