@cratis/components 1.5.1 → 1.6.6

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 (380) hide show
  1. package/dist/cjs/CommandDialog/CommandDialog.js +9 -2
  2. package/dist/cjs/CommandDialog/CommandDialog.js.map +1 -1
  3. package/dist/cjs/CommandDialog/StepperCommandDialog.js +21 -2
  4. package/dist/cjs/CommandDialog/StepperCommandDialog.js.map +1 -1
  5. package/dist/cjs/CommandDialog/index.js +2 -1
  6. package/dist/cjs/CommandDialog/index.js.map +1 -1
  7. package/dist/cjs/CommandForm/fields/CalendarField.js.map +1 -1
  8. package/dist/cjs/CommandForm/fields/CheckboxField.js.map +1 -1
  9. package/dist/cjs/CommandForm/fields/ChipsField.js.map +1 -1
  10. package/dist/cjs/CommandForm/fields/ColorPickerField.js.map +1 -1
  11. package/dist/cjs/CommandForm/fields/DropdownField.js.map +1 -1
  12. package/dist/cjs/CommandForm/fields/InputTextField.js.map +1 -1
  13. package/dist/cjs/CommandForm/fields/MultiSelectField.js.map +1 -1
  14. package/dist/cjs/CommandForm/fields/NumberField.js.map +1 -1
  15. package/dist/cjs/CommandForm/fields/SliderField.js.map +1 -1
  16. package/dist/cjs/CommandForm/fields/TextAreaField.js.map +1 -1
  17. package/dist/cjs/CommandForm/index.js +2 -34
  18. package/dist/cjs/CommandForm/index.js.map +1 -1
  19. package/dist/cjs/Common/ErrorBoundary.js.map +1 -1
  20. package/dist/cjs/Common/FormElement.js.map +1 -1
  21. package/dist/cjs/Common/Page.js.map +1 -1
  22. package/dist/cjs/Common/Tooltip.js +4 -0
  23. package/dist/cjs/Common/Tooltip.js.map +1 -1
  24. package/dist/cjs/Common/index.js +2 -1
  25. package/dist/cjs/Common/index.js.map +1 -1
  26. package/dist/cjs/DataPage/DataPage.js +6 -0
  27. package/dist/cjs/DataPage/DataPage.js.map +1 -1
  28. package/dist/cjs/DataPage/index.js +2 -1
  29. package/dist/cjs/DataPage/index.js.map +1 -1
  30. package/dist/cjs/DataTables/DataTableForObservableQuery.js +5 -0
  31. package/dist/cjs/DataTables/DataTableForObservableQuery.js.map +1 -1
  32. package/dist/cjs/DataTables/DataTableForQuery.js +5 -0
  33. package/dist/cjs/DataTables/DataTableForQuery.js.map +1 -1
  34. package/dist/cjs/DataTables/index.js +2 -1
  35. package/dist/cjs/DataTables/index.js.map +1 -1
  36. package/dist/cjs/Dialogs/BusyIndicatorDialog.js.map +1 -1
  37. package/dist/cjs/Dialogs/ConfirmationDialog.js.map +1 -1
  38. package/dist/cjs/Dialogs/Dialog.js +7 -1
  39. package/dist/cjs/Dialogs/Dialog.js.map +1 -1
  40. package/dist/cjs/Dialogs/index.js +2 -1
  41. package/dist/cjs/Dialogs/index.js.map +1 -1
  42. package/dist/cjs/Dropdown/Dropdown.js +1 -0
  43. package/dist/cjs/Dropdown/Dropdown.js.map +1 -1
  44. package/dist/cjs/Dropdown/index.js +2 -1
  45. package/dist/cjs/Dropdown/index.js.map +1 -1
  46. package/dist/cjs/ObjectContentEditor/ObjectContentEditor.js.map +1 -1
  47. package/dist/cjs/ObjectContentEditor/index.js +2 -1
  48. package/dist/cjs/ObjectContentEditor/index.js.map +1 -1
  49. package/dist/cjs/ObjectContentEditor/objectHelpers.js +6 -0
  50. package/dist/cjs/ObjectContentEditor/objectHelpers.js.map +1 -1
  51. package/dist/cjs/ObjectNavigationalBar/ObjectNavigationalBar.js.map +1 -1
  52. package/dist/cjs/ObjectNavigationalBar/breadcrumbHelpers.js +6 -0
  53. package/dist/cjs/ObjectNavigationalBar/breadcrumbHelpers.js.map +1 -1
  54. package/dist/cjs/ObjectNavigationalBar/index.js +2 -1
  55. package/dist/cjs/ObjectNavigationalBar/index.js.map +1 -1
  56. package/dist/cjs/PivotViewer/PivotViewer.js +28 -0
  57. package/dist/cjs/PivotViewer/PivotViewer.js.map +1 -1
  58. package/dist/cjs/PivotViewer/components/AxisLabels.js +4 -0
  59. package/dist/cjs/PivotViewer/components/AxisLabels.js.map +1 -1
  60. package/dist/cjs/PivotViewer/components/DetailPanel.js.map +1 -1
  61. package/dist/cjs/PivotViewer/components/FilterPanel.js +4 -0
  62. package/dist/cjs/PivotViewer/components/FilterPanel.js.map +1 -1
  63. package/dist/cjs/PivotViewer/components/FilterPanelContainer.js.map +1 -1
  64. package/dist/cjs/PivotViewer/components/PivotCanvas.js +138 -2
  65. package/dist/cjs/PivotViewer/components/PivotCanvas.js.map +1 -1
  66. package/dist/cjs/PivotViewer/components/PivotViewerMain.js +4 -0
  67. package/dist/cjs/PivotViewer/components/PivotViewerMain.js.map +1 -1
  68. package/dist/cjs/PivotViewer/components/RangeHistogramFilter.js.map +1 -1
  69. package/dist/cjs/PivotViewer/components/Spinner.js.map +1 -1
  70. package/dist/cjs/PivotViewer/components/Toolbar.js.map +1 -1
  71. package/dist/cjs/PivotViewer/components/ToolbarContainer.js.map +1 -1
  72. package/dist/cjs/PivotViewer/components/pivot/animation.js +8 -1
  73. package/dist/cjs/PivotViewer/components/pivot/animation.js.map +1 -1
  74. package/dist/cjs/PivotViewer/components/pivot/colorResolver.js +3 -1
  75. package/dist/cjs/PivotViewer/components/pivot/colorResolver.js.map +1 -1
  76. package/dist/cjs/PivotViewer/components/pivot/constants.js +8 -5
  77. package/dist/cjs/PivotViewer/components/pivot/constants.js.map +1 -1
  78. package/dist/cjs/PivotViewer/components/pivot/groups.js +15 -0
  79. package/dist/cjs/PivotViewer/components/pivot/groups.js.map +1 -1
  80. package/dist/cjs/PivotViewer/components/pivot/sprites.js +32 -13
  81. package/dist/cjs/PivotViewer/components/pivot/sprites.js.map +1 -1
  82. package/dist/cjs/PivotViewer/components/pivot/visibility.js +102 -3
  83. package/dist/cjs/PivotViewer/components/pivot/visibility.js.map +1 -1
  84. package/dist/cjs/PivotViewer/constants.js +2 -0
  85. package/dist/cjs/PivotViewer/constants.js.map +1 -1
  86. package/dist/cjs/PivotViewer/engine/layout.js +23 -0
  87. package/dist/cjs/PivotViewer/engine/layout.js.map +1 -1
  88. package/dist/cjs/PivotViewer/engine/store.js +29 -0
  89. package/dist/cjs/PivotViewer/engine/store.js.map +1 -1
  90. package/dist/cjs/PivotViewer/hooks/useAnimationModeTracking.js +8 -0
  91. package/dist/cjs/PivotViewer/hooks/useAnimationModeTracking.js.map +1 -1
  92. package/dist/cjs/PivotViewer/hooks/useCardSelection.js +10 -1
  93. package/dist/cjs/PivotViewer/hooks/useCardSelection.js.map +1 -1
  94. package/dist/cjs/PivotViewer/hooks/useContainerDimensions.js +11 -0
  95. package/dist/cjs/PivotViewer/hooks/useContainerDimensions.js.map +1 -1
  96. package/dist/cjs/PivotViewer/hooks/useCurrentFilters.js +6 -0
  97. package/dist/cjs/PivotViewer/hooks/useCurrentFilters.js.map +1 -1
  98. package/dist/cjs/PivotViewer/hooks/useDetailPanelClose.js +11 -1
  99. package/dist/cjs/PivotViewer/hooks/useDetailPanelClose.js.map +1 -1
  100. package/dist/cjs/PivotViewer/hooks/useDimensionState.js +2 -0
  101. package/dist/cjs/PivotViewer/hooks/useDimensionState.js.map +1 -1
  102. package/dist/cjs/PivotViewer/hooks/useFieldExtractors.js +2 -0
  103. package/dist/cjs/PivotViewer/hooks/useFieldExtractors.js.map +1 -1
  104. package/dist/cjs/PivotViewer/hooks/useFilterOptions.js +2 -0
  105. package/dist/cjs/PivotViewer/hooks/useFilterOptions.js.map +1 -1
  106. package/dist/cjs/PivotViewer/hooks/useFilterState.js +5 -0
  107. package/dist/cjs/PivotViewer/hooks/useFilterState.js.map +1 -1
  108. package/dist/cjs/PivotViewer/hooks/usePanning.js +14 -0
  109. package/dist/cjs/PivotViewer/hooks/usePanning.js.map +1 -1
  110. package/dist/cjs/PivotViewer/hooks/usePivotEngine.js +7 -0
  111. package/dist/cjs/PivotViewer/hooks/usePivotEngine.js.map +1 -1
  112. package/dist/cjs/PivotViewer/hooks/useScrollSync.js +6 -0
  113. package/dist/cjs/PivotViewer/hooks/useScrollSync.js.map +1 -1
  114. package/dist/cjs/PivotViewer/hooks/useViewModeScrollHandling.js +9 -0
  115. package/dist/cjs/PivotViewer/hooks/useViewModeScrollHandling.js.map +1 -1
  116. package/dist/cjs/PivotViewer/hooks/useWheelZoom.js +8 -2
  117. package/dist/cjs/PivotViewer/hooks/useWheelZoom.js.map +1 -1
  118. package/dist/cjs/PivotViewer/hooks/useZoomState.js +2 -0
  119. package/dist/cjs/PivotViewer/hooks/useZoomState.js.map +1 -1
  120. package/dist/cjs/PivotViewer/index.js +2 -1
  121. package/dist/cjs/PivotViewer/index.js.map +1 -1
  122. package/dist/cjs/PivotViewer/types.js +11 -0
  123. package/dist/cjs/PivotViewer/types.js.map +1 -1
  124. package/dist/cjs/PivotViewer/utils/animations.js +35 -2
  125. package/dist/cjs/PivotViewer/utils/animations.js.map +1 -1
  126. package/dist/cjs/PivotViewer/utils/cardPosition.js +21 -3
  127. package/dist/cjs/PivotViewer/utils/cardPosition.js.map +1 -1
  128. package/dist/cjs/PivotViewer/utils/constants.js +3 -0
  129. package/dist/cjs/PivotViewer/utils/constants.js.map +1 -1
  130. package/dist/cjs/PivotViewer/utils/idResolution.js +16 -0
  131. package/dist/cjs/PivotViewer/utils/idResolution.js.map +1 -1
  132. package/dist/cjs/PivotViewer/utils/selection.js +25 -0
  133. package/dist/cjs/PivotViewer/utils/selection.js.map +1 -1
  134. package/dist/cjs/PivotViewer/utils/utils.js +5 -0
  135. package/dist/cjs/PivotViewer/utils/utils.js.map +1 -1
  136. package/dist/cjs/SchemaEditor/NameCell.js.map +1 -1
  137. package/dist/cjs/SchemaEditor/SchemaEditor.js.map +1 -1
  138. package/dist/cjs/SchemaEditor/TypeCell.js.map +1 -1
  139. package/dist/cjs/SchemaEditor/index.js +2 -1
  140. package/dist/cjs/SchemaEditor/index.js.map +1 -1
  141. package/dist/cjs/SchemaEditor/schemaHelpers.js +8 -0
  142. package/dist/cjs/SchemaEditor/schemaHelpers.js.map +1 -1
  143. package/dist/cjs/TimeMachine/EventsView.js +2 -0
  144. package/dist/cjs/TimeMachine/EventsView.js.map +1 -1
  145. package/dist/cjs/TimeMachine/Properties.js.map +1 -1
  146. package/dist/cjs/TimeMachine/ReadModelView.js +1 -0
  147. package/dist/cjs/TimeMachine/ReadModelView.js.map +1 -1
  148. package/dist/cjs/TimeMachine/TimeMachine.js +11 -1
  149. package/dist/cjs/TimeMachine/TimeMachine.js.map +1 -1
  150. package/dist/cjs/TimeMachine/index.js +2 -1
  151. package/dist/cjs/TimeMachine/index.js.map +1 -1
  152. package/dist/cjs/TimeMachine/propertiesHelpers.js +5 -0
  153. package/dist/cjs/TimeMachine/propertiesHelpers.js.map +1 -1
  154. package/dist/cjs/Toolbar/Toolbar.css +8 -0
  155. package/dist/cjs/Toolbar/Toolbar.js +7 -1
  156. package/dist/cjs/Toolbar/Toolbar.js.map +1 -1
  157. package/dist/cjs/Toolbar/ToolbarButton.js +16 -2
  158. package/dist/cjs/Toolbar/ToolbarButton.js.map +1 -1
  159. package/dist/cjs/Toolbar/ToolbarContext.js +8 -0
  160. package/dist/cjs/Toolbar/ToolbarContext.js.map +1 -1
  161. package/dist/cjs/Toolbar/ToolbarDragContext.js +24 -0
  162. package/dist/cjs/Toolbar/ToolbarDragContext.js.map +1 -0
  163. package/dist/cjs/Toolbar/ToolbarFanOutItem.js +11 -0
  164. package/dist/cjs/Toolbar/ToolbarFanOutItem.js.map +1 -1
  165. package/dist/cjs/Toolbar/ToolbarSection.js +18 -1
  166. package/dist/cjs/Toolbar/ToolbarSection.js.map +1 -1
  167. package/dist/cjs/Toolbar/ToolbarSeparator.js +6 -0
  168. package/dist/cjs/Toolbar/ToolbarSeparator.js.map +1 -1
  169. package/dist/cjs/Toolbar/index.js +2 -1
  170. package/dist/cjs/Toolbar/index.js.map +1 -1
  171. package/dist/cjs/tailwind-utilities.css +16 -1
  172. package/dist/cjs/types/TypeFormat.js +2 -0
  173. package/dist/cjs/types/TypeFormat.js.map +1 -1
  174. package/dist/cjs/types/index.js +2 -1
  175. package/dist/cjs/types/index.js.map +1 -1
  176. package/dist/cjs/useOverlayZIndex.js +10 -0
  177. package/dist/cjs/useOverlayZIndex.js.map +1 -1
  178. package/dist/esm/CommandDialog/CommandDialog.d.ts +2 -2
  179. package/dist/esm/CommandDialog/CommandDialog.d.ts.map +1 -1
  180. package/dist/esm/CommandDialog/CommandDialog.js +9 -2
  181. package/dist/esm/CommandDialog/CommandDialog.js.map +1 -1
  182. package/dist/esm/CommandDialog/CommandDialog.stories.d.ts +1 -0
  183. package/dist/esm/CommandDialog/CommandDialog.stories.d.ts.map +1 -1
  184. package/dist/esm/CommandDialog/CommandDialog.stories.js +52 -0
  185. package/dist/esm/CommandDialog/CommandDialog.stories.js.map +1 -1
  186. package/dist/esm/CommandDialog/StepperCommandDialog.d.ts +2 -2
  187. package/dist/esm/CommandDialog/StepperCommandDialog.d.ts.map +1 -1
  188. package/dist/esm/CommandDialog/StepperCommandDialog.js +21 -2
  189. package/dist/esm/CommandDialog/StepperCommandDialog.js.map +1 -1
  190. package/dist/esm/CommandDialog/StepperCommandDialog.stories.d.ts +1 -0
  191. package/dist/esm/CommandDialog/StepperCommandDialog.stories.d.ts.map +1 -1
  192. package/dist/esm/CommandDialog/StepperCommandDialog.stories.js +54 -0
  193. package/dist/esm/CommandDialog/StepperCommandDialog.stories.js.map +1 -1
  194. package/dist/esm/CommandDialog/index.js +3 -0
  195. package/dist/esm/CommandDialog/index.js.map +1 -1
  196. package/dist/esm/CommandForm/fields/CalendarField.js.map +1 -1
  197. package/dist/esm/CommandForm/fields/CheckboxField.js.map +1 -1
  198. package/dist/esm/CommandForm/fields/ChipsField.js.map +1 -1
  199. package/dist/esm/CommandForm/fields/ColorPickerField.js.map +1 -1
  200. package/dist/esm/CommandForm/fields/DropdownField.js.map +1 -1
  201. package/dist/esm/CommandForm/fields/InputTextField.js.map +1 -1
  202. package/dist/esm/CommandForm/fields/MultiSelectField.js.map +1 -1
  203. package/dist/esm/CommandForm/fields/NumberField.js.map +1 -1
  204. package/dist/esm/CommandForm/fields/SliderField.js.map +1 -1
  205. package/dist/esm/CommandForm/fields/TextAreaField.js.map +1 -1
  206. package/dist/esm/CommandForm/index.d.ts +0 -1
  207. package/dist/esm/CommandForm/index.d.ts.map +1 -1
  208. package/dist/esm/CommandForm/index.js +3 -1
  209. package/dist/esm/CommandForm/index.js.map +1 -1
  210. package/dist/esm/Common/ErrorBoundary.js.map +1 -1
  211. package/dist/esm/Common/FormElement.js.map +1 -1
  212. package/dist/esm/Common/Page.js.map +1 -1
  213. package/dist/esm/Common/Tooltip.js +4 -0
  214. package/dist/esm/Common/Tooltip.js.map +1 -1
  215. package/dist/esm/Common/index.js +3 -0
  216. package/dist/esm/Common/index.js.map +1 -1
  217. package/dist/esm/DataPage/DataPage.js +6 -0
  218. package/dist/esm/DataPage/DataPage.js.map +1 -1
  219. package/dist/esm/DataPage/index.js +3 -0
  220. package/dist/esm/DataPage/index.js.map +1 -1
  221. package/dist/esm/DataTables/DataTableForObservableQuery.js +5 -0
  222. package/dist/esm/DataTables/DataTableForObservableQuery.js.map +1 -1
  223. package/dist/esm/DataTables/DataTableForQuery.js +5 -0
  224. package/dist/esm/DataTables/DataTableForQuery.js.map +1 -1
  225. package/dist/esm/DataTables/index.js +3 -0
  226. package/dist/esm/DataTables/index.js.map +1 -1
  227. package/dist/esm/Dialogs/BusyIndicatorDialog.js.map +1 -1
  228. package/dist/esm/Dialogs/ConfirmationDialog.js.map +1 -1
  229. package/dist/esm/Dialogs/Dialog.js +7 -1
  230. package/dist/esm/Dialogs/Dialog.js.map +1 -1
  231. package/dist/esm/Dialogs/index.js +3 -0
  232. package/dist/esm/Dialogs/index.js.map +1 -1
  233. package/dist/esm/Dropdown/Dropdown.js +1 -0
  234. package/dist/esm/Dropdown/Dropdown.js.map +1 -1
  235. package/dist/esm/Dropdown/index.js +3 -0
  236. package/dist/esm/Dropdown/index.js.map +1 -1
  237. package/dist/esm/ObjectContentEditor/ObjectContentEditor.js.map +1 -1
  238. package/dist/esm/ObjectContentEditor/index.js +3 -0
  239. package/dist/esm/ObjectContentEditor/index.js.map +1 -1
  240. package/dist/esm/ObjectContentEditor/objectHelpers.js +6 -0
  241. package/dist/esm/ObjectContentEditor/objectHelpers.js.map +1 -1
  242. package/dist/esm/ObjectNavigationalBar/ObjectNavigationalBar.js.map +1 -1
  243. package/dist/esm/ObjectNavigationalBar/breadcrumbHelpers.js +6 -0
  244. package/dist/esm/ObjectNavigationalBar/breadcrumbHelpers.js.map +1 -1
  245. package/dist/esm/ObjectNavigationalBar/index.js +3 -0
  246. package/dist/esm/ObjectNavigationalBar/index.js.map +1 -1
  247. package/dist/esm/PivotViewer/PivotViewer.js +28 -0
  248. package/dist/esm/PivotViewer/PivotViewer.js.map +1 -1
  249. package/dist/esm/PivotViewer/components/AxisLabels.js +4 -0
  250. package/dist/esm/PivotViewer/components/AxisLabels.js.map +1 -1
  251. package/dist/esm/PivotViewer/components/DetailPanel.js.map +1 -1
  252. package/dist/esm/PivotViewer/components/FilterPanel.js +4 -0
  253. package/dist/esm/PivotViewer/components/FilterPanel.js.map +1 -1
  254. package/dist/esm/PivotViewer/components/FilterPanelContainer.js.map +1 -1
  255. package/dist/esm/PivotViewer/components/PivotCanvas.js +138 -2
  256. package/dist/esm/PivotViewer/components/PivotCanvas.js.map +1 -1
  257. package/dist/esm/PivotViewer/components/PivotViewerMain.js +4 -0
  258. package/dist/esm/PivotViewer/components/PivotViewerMain.js.map +1 -1
  259. package/dist/esm/PivotViewer/components/RangeHistogramFilter.js.map +1 -1
  260. package/dist/esm/PivotViewer/components/Spinner.js.map +1 -1
  261. package/dist/esm/PivotViewer/components/Toolbar.js.map +1 -1
  262. package/dist/esm/PivotViewer/components/ToolbarContainer.js.map +1 -1
  263. package/dist/esm/PivotViewer/components/pivot/animation.js +8 -1
  264. package/dist/esm/PivotViewer/components/pivot/animation.js.map +1 -1
  265. package/dist/esm/PivotViewer/components/pivot/colorResolver.js +3 -1
  266. package/dist/esm/PivotViewer/components/pivot/colorResolver.js.map +1 -1
  267. package/dist/esm/PivotViewer/components/pivot/constants.js +8 -5
  268. package/dist/esm/PivotViewer/components/pivot/constants.js.map +1 -1
  269. package/dist/esm/PivotViewer/components/pivot/groups.js +15 -0
  270. package/dist/esm/PivotViewer/components/pivot/groups.js.map +1 -1
  271. package/dist/esm/PivotViewer/components/pivot/sprites.js +19 -0
  272. package/dist/esm/PivotViewer/components/pivot/sprites.js.map +1 -1
  273. package/dist/esm/PivotViewer/components/pivot/visibility.js +102 -3
  274. package/dist/esm/PivotViewer/components/pivot/visibility.js.map +1 -1
  275. package/dist/esm/PivotViewer/constants.js +2 -0
  276. package/dist/esm/PivotViewer/constants.js.map +1 -1
  277. package/dist/esm/PivotViewer/engine/layout.js +23 -0
  278. package/dist/esm/PivotViewer/engine/layout.js.map +1 -1
  279. package/dist/esm/PivotViewer/engine/store.js +29 -0
  280. package/dist/esm/PivotViewer/engine/store.js.map +1 -1
  281. package/dist/esm/PivotViewer/hooks/useAnimationModeTracking.js +8 -0
  282. package/dist/esm/PivotViewer/hooks/useAnimationModeTracking.js.map +1 -1
  283. package/dist/esm/PivotViewer/hooks/useCardSelection.js +10 -1
  284. package/dist/esm/PivotViewer/hooks/useCardSelection.js.map +1 -1
  285. package/dist/esm/PivotViewer/hooks/useContainerDimensions.js +11 -0
  286. package/dist/esm/PivotViewer/hooks/useContainerDimensions.js.map +1 -1
  287. package/dist/esm/PivotViewer/hooks/useCurrentFilters.js +6 -0
  288. package/dist/esm/PivotViewer/hooks/useCurrentFilters.js.map +1 -1
  289. package/dist/esm/PivotViewer/hooks/useDetailPanelClose.js +11 -1
  290. package/dist/esm/PivotViewer/hooks/useDetailPanelClose.js.map +1 -1
  291. package/dist/esm/PivotViewer/hooks/useDimensionState.js +2 -0
  292. package/dist/esm/PivotViewer/hooks/useDimensionState.js.map +1 -1
  293. package/dist/esm/PivotViewer/hooks/useFieldExtractors.js +2 -0
  294. package/dist/esm/PivotViewer/hooks/useFieldExtractors.js.map +1 -1
  295. package/dist/esm/PivotViewer/hooks/useFilterOptions.js +2 -0
  296. package/dist/esm/PivotViewer/hooks/useFilterOptions.js.map +1 -1
  297. package/dist/esm/PivotViewer/hooks/useFilterState.js +5 -0
  298. package/dist/esm/PivotViewer/hooks/useFilterState.js.map +1 -1
  299. package/dist/esm/PivotViewer/hooks/usePanning.js +14 -0
  300. package/dist/esm/PivotViewer/hooks/usePanning.js.map +1 -1
  301. package/dist/esm/PivotViewer/hooks/usePivotEngine.js +7 -0
  302. package/dist/esm/PivotViewer/hooks/usePivotEngine.js.map +1 -1
  303. package/dist/esm/PivotViewer/hooks/useScrollSync.js +6 -0
  304. package/dist/esm/PivotViewer/hooks/useScrollSync.js.map +1 -1
  305. package/dist/esm/PivotViewer/hooks/useViewModeScrollHandling.js +9 -0
  306. package/dist/esm/PivotViewer/hooks/useViewModeScrollHandling.js.map +1 -1
  307. package/dist/esm/PivotViewer/hooks/useWheelZoom.js +8 -2
  308. package/dist/esm/PivotViewer/hooks/useWheelZoom.js.map +1 -1
  309. package/dist/esm/PivotViewer/hooks/useZoomState.js +2 -0
  310. package/dist/esm/PivotViewer/hooks/useZoomState.js.map +1 -1
  311. package/dist/esm/PivotViewer/index.js +3 -0
  312. package/dist/esm/PivotViewer/index.js.map +1 -1
  313. package/dist/esm/PivotViewer/types.js +11 -0
  314. package/dist/esm/PivotViewer/types.js.map +1 -1
  315. package/dist/esm/PivotViewer/utils/animations.js +35 -2
  316. package/dist/esm/PivotViewer/utils/animations.js.map +1 -1
  317. package/dist/esm/PivotViewer/utils/cardPosition.js +21 -3
  318. package/dist/esm/PivotViewer/utils/cardPosition.js.map +1 -1
  319. package/dist/esm/PivotViewer/utils/constants.js +3 -0
  320. package/dist/esm/PivotViewer/utils/constants.js.map +1 -1
  321. package/dist/esm/PivotViewer/utils/idResolution.js +16 -0
  322. package/dist/esm/PivotViewer/utils/idResolution.js.map +1 -1
  323. package/dist/esm/PivotViewer/utils/selection.js +25 -0
  324. package/dist/esm/PivotViewer/utils/selection.js.map +1 -1
  325. package/dist/esm/PivotViewer/utils/utils.js +5 -0
  326. package/dist/esm/PivotViewer/utils/utils.js.map +1 -1
  327. package/dist/esm/SchemaEditor/NameCell.js.map +1 -1
  328. package/dist/esm/SchemaEditor/SchemaEditor.js.map +1 -1
  329. package/dist/esm/SchemaEditor/TypeCell.js.map +1 -1
  330. package/dist/esm/SchemaEditor/index.js +3 -0
  331. package/dist/esm/SchemaEditor/index.js.map +1 -1
  332. package/dist/esm/SchemaEditor/schemaHelpers.js +8 -0
  333. package/dist/esm/SchemaEditor/schemaHelpers.js.map +1 -1
  334. package/dist/esm/TimeMachine/EventsView.js +2 -0
  335. package/dist/esm/TimeMachine/EventsView.js.map +1 -1
  336. package/dist/esm/TimeMachine/Properties.js.map +1 -1
  337. package/dist/esm/TimeMachine/ReadModelView.js +1 -0
  338. package/dist/esm/TimeMachine/ReadModelView.js.map +1 -1
  339. package/dist/esm/TimeMachine/TimeMachine.js +11 -1
  340. package/dist/esm/TimeMachine/TimeMachine.js.map +1 -1
  341. package/dist/esm/TimeMachine/index.js +3 -0
  342. package/dist/esm/TimeMachine/index.js.map +1 -1
  343. package/dist/esm/TimeMachine/propertiesHelpers.js +5 -0
  344. package/dist/esm/TimeMachine/propertiesHelpers.js.map +1 -1
  345. package/dist/esm/Toolbar/Toolbar.css +8 -0
  346. package/dist/esm/Toolbar/Toolbar.d.ts +3 -1
  347. package/dist/esm/Toolbar/Toolbar.d.ts.map +1 -1
  348. package/dist/esm/Toolbar/Toolbar.js +7 -1
  349. package/dist/esm/Toolbar/Toolbar.js.map +1 -1
  350. package/dist/esm/Toolbar/Toolbar.stories.d.ts +1 -0
  351. package/dist/esm/Toolbar/Toolbar.stories.d.ts.map +1 -1
  352. package/dist/esm/Toolbar/Toolbar.stories.js +23 -0
  353. package/dist/esm/Toolbar/Toolbar.stories.js.map +1 -1
  354. package/dist/esm/Toolbar/ToolbarButton.d.ts +4 -1
  355. package/dist/esm/Toolbar/ToolbarButton.d.ts.map +1 -1
  356. package/dist/esm/Toolbar/ToolbarButton.js +16 -2
  357. package/dist/esm/Toolbar/ToolbarButton.js.map +1 -1
  358. package/dist/esm/Toolbar/ToolbarContext.js +8 -0
  359. package/dist/esm/Toolbar/ToolbarContext.js.map +1 -1
  360. package/dist/esm/Toolbar/ToolbarDragContext.d.ts +7 -0
  361. package/dist/esm/Toolbar/ToolbarDragContext.d.ts.map +1 -0
  362. package/dist/esm/Toolbar/ToolbarDragContext.js +21 -0
  363. package/dist/esm/Toolbar/ToolbarDragContext.js.map +1 -0
  364. package/dist/esm/Toolbar/ToolbarFanOutItem.js +11 -0
  365. package/dist/esm/Toolbar/ToolbarFanOutItem.js.map +1 -1
  366. package/dist/esm/Toolbar/ToolbarSection.js +18 -1
  367. package/dist/esm/Toolbar/ToolbarSection.js.map +1 -1
  368. package/dist/esm/Toolbar/ToolbarSeparator.js +6 -0
  369. package/dist/esm/Toolbar/ToolbarSeparator.js.map +1 -1
  370. package/dist/esm/Toolbar/index.js +3 -0
  371. package/dist/esm/Toolbar/index.js.map +1 -1
  372. package/dist/esm/tailwind-utilities.css +16 -1
  373. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  374. package/dist/esm/types/TypeFormat.js +2 -0
  375. package/dist/esm/types/TypeFormat.js.map +1 -1
  376. package/dist/esm/types/index.js +3 -0
  377. package/dist/esm/types/index.js.map +1 -1
  378. package/dist/esm/useOverlayZIndex.js +10 -0
  379. package/dist/esm/useOverlayZIndex.js.map +1 -1
  380. package/package.json +8 -8
@@ -1 +1 @@
1
- {"version":3,"file":"PivotViewer.js","sources":["../../../PivotViewer/PivotViewer.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { PivotViewerProps } from './types';\nimport type { GroupingResult } from './engine/types';\nimport { usePivotEngine } from './hooks/usePivotEngine';\nimport { computeLayout } from './engine/layout';\nimport { useFilterState } from './hooks/useFilterState';\nimport { useDimensionState } from './hooks/useDimensionState';\nimport { useZoomState } from './hooks/useZoomState';\nimport { BASE_CARD_WIDTH, BASE_CARD_HEIGHT, CARDS_PER_COLUMN, GROUP_SPACING } from './constants';\nimport './PivotViewer.css';\nimport { PivotViewerMain } from './components/PivotViewerMain';\nimport { FilterPanelContainer } from './components/FilterPanelContainer';\nimport { ToolbarContainer } from './components/ToolbarContainer';\nimport { usePanning, useWheelZoom, useFilterOptions } from './hooks';\nimport { useContainerDimensions } from './hooks/useContainerDimensions';\nimport type { ViewMode } from './components/Toolbar';\nimport { useFieldExtractors } from './hooks/useFieldExtractors';\nimport { useCurrentFilters, useCurrentGroupBy } from './hooks/useCurrentFilters';\nimport { useCardSelection } from './hooks/useCardSelection';\nimport { useDetailPanelClose } from './hooks/useDetailPanelClose';\nimport { useScrollSync } from './hooks/useScrollSync';\nimport { useAnimationModeTracking } from './hooks/useAnimationModeTracking';\nimport { useViewModeScrollHandling } from './hooks/useViewModeScrollHandling';\n\nexport function PivotViewer<TItem extends object>({\n data,\n dimensions,\n filters,\n defaultDimensionKey,\n cardRenderer,\n detailRenderer,\n getItemId,\n searchFields,\n className,\n emptyContent,\n isLoading = false,\n colors,\n}: PivotViewerProps<TItem>) {\n // Refs\n const containerRef = useRef<HTMLDivElement>(null!);\n const filterButtonRef = useRef<HTMLButtonElement>(null!);\n const axisLabelsRef = useRef<HTMLDivElement>(null!);\n const spacerRef = useRef<HTMLDivElement>(null!);\n\n // State\n const [search, setSearch] = useState('');\n const [viewMode, setViewMode] = useState<ViewMode>('collection');\n const [filtersOpen, setFiltersOpen] = useState(false);\n const [selectedItem, setSelectedItem] = useState<TItem | null>(null);\n const [isZooming, setIsZooming] = useState(false);\n const [visibleIds, setVisibleIds] = useState<Uint32Array>(new Uint32Array(0));\n const [grouping, setGrouping] = useState<GroupingResult>({ groups: [] });\n const [hoveredGroupIndex, setHoveredGroupIndex] = useState<number | null>(null);\n const [preSelectionState, setPreSelectionState] = useState<{ zoom: number; scrollLeft: number; scrollTop: number } | null>(null);\n const [, setAnimationMode] = useState<'layout' | 'filter'>('layout');\n const [scrollPosition, setScrollPosition] = useState({ x: 0, y: 0 });\n\n // Filter hooks\n const {\n filterState,\n rangeFilterState,\n expandedFilterKey,\n setExpandedFilterKey,\n handleToggleFilter,\n handleClearFilter,\n handleRangeChange,\n } = useFilterState(filters);\n\n // Dimension hooks\n const {\n activeDimensionKey,\n setActiveDimensionKey,\n activeDimension,\n dimensionFilter,\n handleAxisLabelClick,\n } = useDimensionState(dimensions, defaultDimensionKey);\n\n // Zoom and pan hooks\n const {\n zoomLevel,\n setZoomLevel,\n handleZoomIn,\n handleZoomOut,\n handleZoomSlider,\n handleZoomReset,\n handleZoomChange,\n } = useZoomState(1);\n\n const {\n isPanning,\n handlePanStart,\n handlePanMove,\n handlePanEnd,\n } = usePanning(containerRef, undefined, setScrollPosition);\n\n useWheelZoom(containerRef, zoomLevel, setZoomLevel);\n\n // Track container dimensions for responsive layout\n const containerDimensions = useContainerDimensions(containerRef, isLoading);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const handleScroll = () => {\n setScrollPosition({\n x: container.scrollLeft,\n y: container.scrollTop,\n });\n };\n\n container.addEventListener('scroll', handleScroll);\n return () => container.removeEventListener('scroll', handleScroll);\n }, []);\n\n // Build field extractors for the columnar store\n const { fieldExtractors, indexFields } = useFieldExtractors(dimensions, filters);\n\n // Initialize the Web Worker engine\n const { ready, applyFilters: engineApplyFilters, computeGrouping, sortIds } = usePivotEngine({\n data,\n fieldExtractors,\n indexFields,\n });\n\n // Build filter specs from UI state\n const currentFilters = useCurrentFilters(\n filters,\n filterState,\n rangeFilterState,\n search,\n searchFields,\n dimensionFilter,\n activeDimension,\n );\n\n const currentGroupBy = useCurrentGroupBy(activeDimensionKey, dimensions);\n\n // Apply filters\n useEffect(() => {\n if (!ready) return;\n\n engineApplyFilters(currentFilters).then((result) => {\n // If the engine failed to return any IDs while no filters are active,\n // fall back to showing the full dataset so the canvas never renders empty.\n if (result.visibleIds.length === 0 && currentFilters.length === 0 && data.length > 0) {\n const fallbackIds = new Uint32Array(data.length);\n for (let i = 0; i < data.length; i++) {\n fallbackIds[i] = i;\n }\n setVisibleIds(fallbackIds);\n return;\n }\n\n setVisibleIds(result.visibleIds);\n });\n }, [ready, currentFilters, engineApplyFilters, data.length]);\n\n // Compute grouping\n const lastGroupingRequest = useRef<{ viewMode: ViewMode; groupBy: unknown; visibleIds: Uint32Array } | null>(null);\n \n useEffect(() => {\n if (!ready || visibleIds.length === 0) {\n setGrouping({ groups: [] });\n lastGroupingRequest.current = null;\n return;\n }\n\n if (viewMode === 'collection') {\n // In collection mode, create a single group with all items\n // Sort items if activeDimensionKey is set\n if (activeDimensionKey) {\n sortIds(visibleIds, activeDimensionKey).then((sortedIds) => {\n setGrouping({\n groups: [{\n key: 'all',\n label: 'All Items',\n value: 'all',\n ids: sortedIds,\n count: sortedIds.length\n }]\n });\n });\n } else {\n setGrouping({\n groups: [{\n key: 'all',\n label: 'All Items',\n value: 'all',\n ids: visibleIds,\n count: visibleIds.length\n }]\n });\n }\n lastGroupingRequest.current = null;\n return;\n }\n\n // Check if this is the same request as last time to prevent duplicate computations\n const lastRequest = lastGroupingRequest.current;\n if (\n lastRequest &&\n lastRequest.viewMode === viewMode &&\n (lastRequest.groupBy as unknown as typeof currentGroupBy)?.field === currentGroupBy.field &&\n lastRequest.visibleIds === visibleIds\n ) {\n return;\n }\n\n lastGroupingRequest.current = { viewMode, groupBy: currentGroupBy, visibleIds };\n \n computeGrouping(visibleIds, currentGroupBy).then((result) => {\n setGrouping(result);\n });\n }, [ready, visibleIds, currentGroupBy, viewMode, computeGrouping, sortIds, activeDimensionKey]);\n\n // Compute layout\n const layout = useMemo(() => {\n // Calculate layout at base dimensions (zoom is applied as transform)\n const cardWidth = BASE_CARD_WIDTH;\n const cardHeight = BASE_CARD_HEIGHT;\n const containerWidth = containerDimensions.width / zoomLevel;\n // For grouped mode, use fixed container height to ensure stable layout during zoom\n const containerHeight = viewMode === 'collection'\n ? containerDimensions.height / zoomLevel\n : containerDimensions.height;\n\n const result = computeLayout(grouping, {\n viewMode,\n cardWidth,\n cardHeight,\n cardsPerColumn: CARDS_PER_COLUMN,\n groupSpacing: GROUP_SPACING,\n containerWidth,\n containerHeight,\n });\n\n return result;\n }, [grouping, viewMode, zoomLevel, containerDimensions.width, containerDimensions.height]);\n\n const resolveId = useCallback((item: TItem, index: number) => {\n if (getItemId) {\n const id = getItemId(item, index);\n return typeof id === 'number' ? id : index;\n }\n const id = (item as Record<string, unknown>)['id'];\n return typeof id === 'number' ? id : index;\n }, [getItemId]);\n\n // Track animation mode changes\n useAnimationModeTracking(filterState, rangeFilterState, search, activeDimensionKey, viewMode, setAnimationMode);\n\n // Sync axis labels scroll with container scroll\n useScrollSync(containerRef, axisLabelsRef, viewMode);\n\n // Handle scroll positioning when switching view modes or grouping changes\n useViewModeScrollHandling({\n containerRef,\n viewMode,\n grouping,\n layout,\n selectedItem,\n zoomLevel,\n resolveId,\n data,\n setPreSelectionState,\n });\n\n // Handle card selection (click)\n const handleCardClick = useCardSelection({\n data,\n isPanning,\n selectedItem,\n zoomLevel,\n viewMode,\n layout,\n containerRef,\n spacerRef,\n containerDimensions,\n scrollPosition,\n preSelectionState,\n grouping,\n getItemId,\n resolveId,\n setZoomLevel,\n setIsZooming,\n setSelectedItem,\n setPreSelectionState,\n });\n\n // Handle detail panel close\n const closeDetail = useDetailPanelClose({\n selectedItem,\n preSelectionState,\n zoomLevel,\n viewMode,\n layout,\n containerRef,\n containerDimensions,\n grouping,\n data,\n resolveId,\n setZoomLevel,\n setIsZooming,\n setSelectedItem,\n setPreSelectionState,\n });\n\n // Use base card dimensions - zoom is applied as transform in canvas\n const cardWidth = BASE_CARD_WIDTH;\n const cardHeight = BASE_CARD_HEIGHT;\n\n // Calculate filter options\n const filterOptions = useFilterOptions(data, filters, filterState, rangeFilterState);\n\n const hasFilters = Boolean(filters && filters.length > 0);\n const activeFilterCount = Object.values(filterState).reduce((sum: number, vals) => sum + (vals as Set<string>).size, 0) +\n Object.values(rangeFilterState).filter(r => r !== null).length;\n\n const viewerClassName = [\n 'pivot-viewer',\n className,\n hasFilters ? (filtersOpen ? 'filters-open' : 'filters-closed') : 'no-filters',\n viewMode === 'grouped' ? 'grouped-mode' : 'collection-mode',\n ]\n .filter(Boolean)\n .join(' ');\n\n // Deselect any selected card when switching between view modes\n useEffect(() => {\n setSelectedItem(null);\n }, [viewMode]);\n\n // Map provided color overrides to CSS variables understood by the component.\n const cssVariables = useMemo(() => {\n const vars: Record<string, string> = {};\n if (!colors) return vars;\n if (colors.primaryColor) vars['--primary-color'] = colors.primaryColor;\n if (colors.primaryColorText) vars['--primary-color-text'] = colors.primaryColorText;\n if (colors.primary500) vars['--primary-500'] = colors.primary500;\n if (colors.surfaceGround) vars['--surface-ground'] = colors.surfaceGround;\n if (colors.surfaceCard) vars['--surface-card'] = colors.surfaceCard;\n if (colors.surfaceSection) vars['--surface-section'] = colors.surfaceSection;\n if (colors.surfaceOverlay) vars['--surface-overlay'] = colors.surfaceOverlay;\n if (colors.surfaceBorder) vars['--surface-border'] = colors.surfaceBorder;\n if (colors.textColor) vars['--text-color'] = colors.textColor;\n if (colors.textColorSecondary) vars['--text-color-secondary'] = colors.textColorSecondary;\n if (colors.highlightBg) vars['--highlight-bg'] = colors.highlightBg;\n if (colors.maskbg) vars['--maskbg'] = colors.maskbg;\n if (colors.focusRing) vars['--focus-ring'] = colors.focusRing;\n return vars;\n }, [colors]);\n\n return (\n <div className={viewerClassName} style={cssVariables as React.CSSProperties}>\n <FilterPanelContainer\n isOpen={filtersOpen && hasFilters}\n search={search}\n filterState={filterState}\n rangeFilterState={rangeFilterState}\n expandedFilterKey={expandedFilterKey}\n filterOptions={filterOptions}\n anchorRef={filterButtonRef}\n onClose={() => setFiltersOpen(false)}\n onSearchChange={setSearch}\n onFilterToggle={handleToggleFilter}\n onFilterClear={handleClearFilter}\n onRangeChange={handleRangeChange}\n onExpandedFilterChange={setExpandedFilterKey}\n />\n\n <main className=\"pv-main\">\n <ToolbarContainer\n hasFilters={hasFilters}\n filtersOpen={filtersOpen}\n filteredCount={visibleIds.length}\n viewMode={viewMode}\n zoomLevel={zoomLevel}\n activeDimensionKey={activeDimensionKey}\n dimensions={dimensions}\n activeFilterCount={activeFilterCount}\n onFiltersToggle={() => setFiltersOpen((prev) => !prev)}\n onViewModeChange={setViewMode}\n onZoomIn={handleZoomIn}\n onZoomOut={handleZoomOut}\n onZoomSlider={handleZoomSlider}\n onZoomReset={handleZoomReset}\n onZoomChange={handleZoomChange}\n onDimensionChange={setActiveDimensionKey}\n filterButtonRef={filterButtonRef}\n />\n\n <PivotViewerMain\n data={data}\n ready={ready}\n isLoading={isLoading}\n visibleIds={visibleIds}\n grouping={grouping}\n layout={layout}\n cardWidth={cardWidth}\n cardHeight={cardHeight}\n zoomLevel={zoomLevel}\n scrollPosition={scrollPosition}\n containerDimensions={containerDimensions}\n selectedItem={selectedItem}\n hoveredGroupIndex={hoveredGroupIndex}\n isZooming={isZooming}\n viewMode={viewMode}\n cardRenderer={cardRenderer}\n detailRenderer={detailRenderer}\n resolveId={resolveId}\n emptyContent={emptyContent}\n dimensionFilter={dimensionFilter}\n onCardClick={handleCardClick}\n onPanStart={handlePanStart as (e: React.MouseEvent) => void}\n onPanMove={handlePanMove as (e: React.MouseEvent) => void}\n onPanEnd={handlePanEnd}\n onGroupHover={setHoveredGroupIndex}\n onAxisLabelClick={handleAxisLabelClick}\n onCloseDetail={closeDetail}\n containerRef={containerRef}\n axisLabelsRef={axisLabelsRef}\n spacerRef={spacerRef}\n />\n </main>\n </div>\n );\n}\n"],"names":["useRef","useState","useFilterState","useDimensionState","useZoomState","usePanning","useWheelZoom","useContainerDimensions","useEffect","useFieldExtractors","usePivotEngine","useCurrentFilters","useCurrentGroupBy","layout","useMemo","BASE_CARD_WIDTH","BASE_CARD_HEIGHT","computeLayout","CARDS_PER_COLUMN","useCallback","useAnimationModeTracking","useScrollSync","useViewModeScrollHandling","useCardSelection","useDetailPanelClose","useFilterOptions","_jsxs","_jsx","FilterPanelContainer","ToolbarContainer","PivotViewerMain"],"mappings":"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"}
1
+ {"version":3,"file":"PivotViewer.js","sources":["../../../PivotViewer/PivotViewer.tsx"],"sourcesContent":[null],"names":["useRef","useState","useFilterState","useDimensionState","useZoomState","usePanning","useWheelZoom","useContainerDimensions","useEffect","useFieldExtractors","usePivotEngine","useCurrentFilters","useCurrentGroupBy","layout","useMemo","BASE_CARD_WIDTH","BASE_CARD_HEIGHT","computeLayout","CARDS_PER_COLUMN","useCallback","useAnimationModeTracking","useScrollSync","useViewModeScrollHandling","useCardSelection","useDetailPanelClose","useFilterOptions","_jsxs","_jsx","FilterPanelContainer","ToolbarContainer","PivotViewerMain"],"mappings":"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"}
@@ -5,14 +5,18 @@ var constants = require('../constants.js');
5
5
 
6
6
  function AxisLabels({ groups, bucketWidths, dimensionFilter, hoveredGroup, zoomLevel, visible, onHover, onClick, containerRef, }) {
7
7
  return (jsxRuntime.jsx("div", { className: `pv-axis-labels ${visible ? 'visible' : 'hidden'}`, ref: containerRef, style: {
8
+ // Align labels start with grouped buckets using canvas padding scaled by zoom
8
9
  paddingLeft: `${(constants.CANVAS_PADDING * zoomLevel) - (20 * zoomLevel)}px`,
9
10
  overflowX: 'hidden',
10
11
  whiteSpace: 'nowrap',
11
12
  }, children: groups.map((group, index) => {
12
13
  const isSelected = dimensionFilter === group.key;
13
14
  const baseBucketWidth = bucketWidths[index] || 0;
15
+ // Apply zoom to bucket width
14
16
  const bucketWidth = baseBucketWidth * zoomLevel;
17
+ // Width is just the bucket width - spacing is handled by CSS gap
15
18
  const width = bucketWidth;
19
+ // When a dimension filter is active, mark non-selected groups as filtered-out
16
20
  const isFilteredOut = dimensionFilter !== null && !isSelected;
17
21
  return (jsxRuntime.jsxs("button", { type: "button", className: `pv-axis-label ${hoveredGroup === group.key ? 'highlighted' : ''} ${isSelected ? 'selected' : ''} ${isFilteredOut ? 'filtered-out' : ''}`, style: {
18
22
  width,
@@ -1 +1 @@
1
- {"version":3,"file":"AxisLabels.js","sources":["../../../../PivotViewer/components/AxisLabels.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { PivotGroup } from '../types';\nimport { CANVAS_PADDING } from '../constants';\n\nexport interface AxisLabelsProps<TItem extends object> {\n groups: PivotGroup<TItem>[];\n bucketWidths: number[];\n dimensionFilter: string | null;\n hoveredGroup: string | null;\n zoomLevel: number;\n visible: boolean;\n onHover: (key: string | null) => void;\n onClick: (key: string) => void;\n containerRef: React.RefObject<HTMLDivElement | null>;\n}\n\nexport function AxisLabels<TItem extends object>({\n groups,\n bucketWidths,\n dimensionFilter,\n hoveredGroup,\n zoomLevel,\n visible,\n onHover,\n onClick,\n containerRef,\n}: AxisLabelsProps<TItem>) {\n return (\n <div\n className={`pv-axis-labels ${visible ? 'visible' : 'hidden'}`}\n ref={containerRef}\n style={{\n // Align labels start with grouped buckets using canvas padding scaled by zoom\n paddingLeft: `${(CANVAS_PADDING * zoomLevel)-(20*zoomLevel)}px`,\n overflowX: 'hidden',\n whiteSpace: 'nowrap',\n }}\n >\n {groups.map((group, index) => {\n const isSelected = dimensionFilter === group.key;\n const baseBucketWidth = bucketWidths[index] || 0;\n // Apply zoom to bucket width\n const bucketWidth = baseBucketWidth * zoomLevel;\n // Width is just the bucket width - spacing is handled by CSS gap\n const width = bucketWidth;\n\n // When a dimension filter is active, mark non-selected groups as filtered-out\n const isFilteredOut = dimensionFilter !== null && !isSelected;\n\n return (\n <button\n key={group.key}\n type=\"button\"\n className={`pv-axis-label ${hoveredGroup === group.key ? 'highlighted' : ''} ${isSelected ? 'selected' : ''} ${isFilteredOut ? 'filtered-out' : ''}`}\n style={{\n width,\n }}\n onMouseEnter={() => onHover(group.key)}\n onMouseLeave={() => onHover(null)}\n onClick={() => onClick(group.key)}\n >\n <span className=\"pv-axis-label-text\">{group.label}</span>\n <span className=\"pv-axis-label-count\">{group.count ?? group.items.length}</span>\n </button>\n );\n })}\n </div>\n );\n}\n"],"names":["_jsx","CANVAS_PADDING","_jsxs"],"mappings":";;;;;AAkBM,SAAU,UAAU,CAAuB,EAC/C,MAAM,EACN,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,SAAS,EACT,OAAO,EACP,OAAO,EACP,OAAO,EACP,YAAY,GACW,EAAA;IACvB,QACEA,wBACE,SAAS,EAAE,kBAAkB,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAA,CAAE,EAC7D,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE;AAEL,YAAA,WAAW,EAAE,CAAA,EAAG,CAACC,wBAAc,GAAG,SAAS,KAAG,EAAE,GAAC,SAAS,CAAC,CAAA,EAAA,CAAI;AAC/D,YAAA,SAAS,EAAE,QAAQ;AACnB,YAAA,UAAU,EAAE,QAAQ;SACrB,EAAA,QAAA,EAEA,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,KAAI;AAC3B,YAAA,MAAM,UAAU,GAAG,eAAe,KAAK,KAAK,CAAC,GAAG;YAChD,MAAM,eAAe,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC;AAEhD,YAAA,MAAM,WAAW,GAAG,eAAe,GAAG,SAAS;YAE/C,MAAM,KAAK,GAAG,WAAW;YAGzB,MAAM,aAAa,GAAG,eAAe,KAAK,IAAI,IAAI,CAAC,UAAU;YAE7D,QACEC,4BAEE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,CAAA,cAAA,EAAiB,YAAY,KAAK,KAAK,CAAC,GAAG,GAAG,aAAa,GAAG,EAAE,IAAI,UAAU,GAAG,UAAU,GAAG,EAAE,CAAA,CAAA,EAAI,aAAa,GAAG,cAAc,GAAG,EAAE,CAAA,CAAE,EACpJ,KAAK,EAAE;oBACL,KAAK;AACN,iBAAA,EACD,YAAY,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EACtC,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EACjC,OAAO,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAA,QAAA,EAAA,CAEjCF,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,oBAAoB,EAAA,QAAA,EAAE,KAAK,CAAC,KAAK,EAAA,CAAQ,EACzDA,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,qBAAqB,EAAA,QAAA,EAAE,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,EAAA,CAAQ,CAAA,EAAA,EAX3E,KAAK,CAAC,GAAG,CAYP;QAEb,CAAC,CAAC,EAAA,CACE;AAEV;;;;"}
1
+ {"version":3,"file":"AxisLabels.js","sources":["../../../../PivotViewer/components/AxisLabels.tsx"],"sourcesContent":[null],"names":["_jsx","CANVAS_PADDING","_jsxs"],"mappings":";;;;;AAkBM,SAAU,UAAU,CAAuB,EAC/C,MAAM,EACN,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,SAAS,EACT,OAAO,EACP,OAAO,EACP,OAAO,EACP,YAAY,GACW,EAAA;IACvB,QACEA,wBACE,SAAS,EAAE,kBAAkB,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAA,CAAE,EAC7D,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE;;AAEL,YAAA,WAAW,EAAE,CAAA,EAAG,CAACC,wBAAc,GAAG,SAAS,KAAG,EAAE,GAAC,SAAS,CAAC,CAAA,EAAA,CAAI;AAC/D,YAAA,SAAS,EAAE,QAAQ;AACnB,YAAA,UAAU,EAAE,QAAQ;SACrB,EAAA,QAAA,EAEA,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,KAAI;AAC3B,YAAA,MAAM,UAAU,GAAG,eAAe,KAAK,KAAK,CAAC,GAAG;YAChD,MAAM,eAAe,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC;;AAEhD,YAAA,MAAM,WAAW,GAAG,eAAe,GAAG,SAAS;;YAE/C,MAAM,KAAK,GAAG,WAAW;;YAGzB,MAAM,aAAa,GAAG,eAAe,KAAK,IAAI,IAAI,CAAC,UAAU;YAE7D,QACEC,4BAEE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,CAAA,cAAA,EAAiB,YAAY,KAAK,KAAK,CAAC,GAAG,GAAG,aAAa,GAAG,EAAE,IAAI,UAAU,GAAG,UAAU,GAAG,EAAE,CAAA,CAAA,EAAI,aAAa,GAAG,cAAc,GAAG,EAAE,CAAA,CAAE,EACpJ,KAAK,EAAE;oBACL,KAAK;AACN,iBAAA,EACD,YAAY,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EACtC,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EACjC,OAAO,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAA,QAAA,EAAA,CAEjCF,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,oBAAoB,EAAA,QAAA,EAAE,KAAK,CAAC,KAAK,EAAA,CAAQ,EACzDA,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,qBAAqB,EAAA,QAAA,EAAE,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,EAAA,CAAQ,CAAA,EAAA,EAX3E,KAAK,CAAC,GAAG,CAYP;QAEb,CAAC,CAAC,EAAA,CACE;AAEV;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"DetailPanel.js","sources":["../../../../PivotViewer/components/DetailPanel.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { AnimatePresence, motion } from 'framer-motion';\nimport type { ReactNode } from 'react';\n\ntype WithRecord<TItem> = TItem extends Record<string, unknown> ? TItem : never;\n\nexport interface DetailPanelProps<TItem extends object> {\n selectedItem: TItem | null;\n onClose: () => void;\n /** Custom renderer for the detail content area. The drawer shell (header, close button, layout) remains owned by the component. */\n contentRenderer?: (item: TItem, onClose: () => void) => ReactNode;\n}\n\nexport function DetailPanel<TItem extends object>({\n selectedItem,\n onClose,\n contentRenderer,\n}: DetailPanelProps<TItem>) {\n const selectedRecord = selectedItem as WithRecord<TItem> | null;\n\n const selectedContent = selectedRecord\n ? ((selectedRecord['content'] as Record<string, unknown> | undefined) ?? {})\n : {};\n\n const metadataEntries = selectedRecord\n ? (\n [\n ['Type', selectedRecord['type']],\n [\n 'Occurred',\n selectedRecord['occurred'] instanceof Date\n ? (selectedRecord['occurred'] as Date).toLocaleString()\n : selectedRecord['occurred']\n ? new Date(String(selectedRecord['occurred'])).toLocaleString()\n : undefined,\n ],\n ['Service', selectedRecord['service']],\n ['Environment', selectedRecord['environment']],\n ['Tenant', selectedRecord['tenant']],\n ['Correlation Id', selectedRecord['correlationId']],\n ] as Array<[string, unknown]>\n ).filter(([, value]) => value !== undefined && value !== null)\n : [];\n\n const causation = Array.isArray(selectedRecord?.['causation'])\n ? (selectedRecord?.['causation'] as unknown[])\n : [];\n\n const defaultContent = (\n <>\n {metadataEntries.length > 0 && (\n <section className=\"pv-detail-meta\">\n <h3>Metadata</h3>\n <dl>\n {metadataEntries.map(([key, value]) => (\n <div key={key}>\n <dt>{key}</dt>\n <dd>{String(value)}</dd>\n </div>\n ))}\n </dl>\n </section>\n )}\n {causation.length > 0 && (\n <section className=\"pv-detail-causation\">\n <h3>Causation</h3>\n <div className=\"pv-pill-row\">\n {causation.map((value, index) => (\n <span key={`${value}-${index}`} className=\"pv-pill\">\n {String(value)}\n </span>\n ))}\n </div>\n </section>\n )}\n <section className=\"pv-detail-content\">\n <h3>Content</h3>\n <dl>\n {Object.entries(selectedContent).map(([key, value]) => (\n <div key={key}>\n <dt>{key}</dt>\n <dd>{typeof value === 'object' ? JSON.stringify(value, null, 2) : String(value)}</dd>\n </div>\n ))}\n </dl>\n </section>\n </>\n );\n\n const customContent = contentRenderer && selectedRecord ? contentRenderer(selectedRecord, onClose) : null;\n\n return (\n <AnimatePresence mode=\"wait\">\n {selectedRecord && (\n <motion.aside\n className=\"pv-detail-panel\"\n initial={{ x: '100%' }}\n animate={{ x: 0 }}\n exit={{ x: '100%' }}\n transition={{\n type: 'spring',\n stiffness: 120,\n damping: 20,\n mass: 1,\n }}\n >\n <header>\n <div>\n <h2>{String(selectedRecord['name'] ?? selectedRecord['type'] ?? 'Event')}</h2>\n {selectedRecord['type'] ? <p>{String(selectedRecord['type'])}</p> : null}\n </div>\n <button type=\"button\" onClick={onClose} title=\"Close\">\n ×\n </button>\n </header>\n <div className=\"pv-detail-panel-content\">\n {customContent ?? defaultContent}\n </div>\n </motion.aside>\n )}\n </AnimatePresence>\n );\n}\n"],"names":["_jsxs","_jsx","AnimatePresence","motion"],"mappings":";;;;;AAeM,SAAU,WAAW,CAAuB,EAChD,YAAY,EACZ,OAAO,EACP,eAAe,GACS,EAAA;IACxB,MAAM,cAAc,GAAG,YAAwC;IAE/D,MAAM,eAAe,GAAG;WAClB,cAAc,CAAC,SAAS,CAAyC,IAAI,EAAE;UACzE,EAAE;IAEN,MAAM,eAAe,GAAG;AACtB,UACI;AACE,YAAA,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;AAChC,YAAA;gBACE,UAAU;AACV,gBAAA,cAAc,CAAC,UAAU,CAAC,YAAY;AACpC,sBAAG,cAAc,CAAC,UAAU,CAAU,CAAC,cAAc;AACrD,sBAAE,cAAc,CAAC,UAAU;AAC3B,0BAAE,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,cAAc;AAC7D,0BAAE,SAAS;AACd,aAAA;AACD,YAAA,CAAC,SAAS,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;AACtC,YAAA,CAAC,aAAa,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC;AAC9C,YAAA,CAAC,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;AACpC,YAAA,CAAC,gBAAgB,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC;AAEtD,SAAA,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;UAC7D,EAAE;IAEN,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,GAAG,WAAW,CAAC;AAC3D,UAAG,cAAc,GAAG,WAAW;UAC7B,EAAE;AAEN,IAAA,MAAM,cAAc,IAClBA,kDACG,eAAe,CAAC,MAAM,GAAG,CAAC,KACzBA,6BAAS,SAAS,EAAC,gBAAgB,EAAA,QAAA,EAAA,CACjCC,cAAA,CAAA,IAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,CAAiB,EACjBA,cAAA,CAAA,IAAA,EAAA,EAAA,QAAA,EACG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,MAChCD,oCACEC,cAAA,CAAA,IAAA,EAAA,EAAA,QAAA,EAAK,GAAG,GAAM,EACdA,cAAA,CAAA,IAAA,EAAA,EAAA,QAAA,EAAK,MAAM,CAAC,KAAK,CAAC,EAAA,CAAM,KAFhB,GAAG,CAGP,CACP,CAAC,EAAA,CACC,IACG,CACX,EACA,SAAS,CAAC,MAAM,GAAG,CAAC,KACnBD,eAAA,CAAA,SAAA,EAAA,EAAS,SAAS,EAAC,qBAAqB,EAAA,QAAA,EAAA,CACtCC,cAAA,CAAA,IAAA,EAAA,EAAA,QAAA,EAAA,WAAA,EAAA,CAAkB,EAClBA,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,aAAa,EAAA,QAAA,EACzB,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,MAC1BA,cAAA,CAAA,MAAA,EAAA,EAAgC,SAAS,EAAC,SAAS,YAChD,MAAM,CAAC,KAAK,CAAC,EAAA,EADL,GAAG,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAEvB,CACR,CAAC,GACE,CAAA,EAAA,CACE,CACX,EACDD,eAAA,CAAA,SAAA,EAAA,EAAS,SAAS,EAAC,mBAAmB,aACpCC,cAAA,CAAA,IAAA,EAAA,EAAA,QAAA,EAAA,SAAA,EAAA,CAAgB,EAChBA,iCACG,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,MAChDD,eAAA,CAAA,KAAA,EAAA,EAAA,QAAA,EAAA,CACEC,cAAA,CAAA,IAAA,EAAA,EAAA,QAAA,EAAK,GAAG,EAAA,CAAM,EACdA,iCAAK,OAAO,KAAK,KAAK,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAM,CAAA,EAAA,EAF7E,GAAG,CAGP,CACP,CAAC,GACC,CAAA,EAAA,CACG,CAAA,EAAA,CACT,CACJ;AAED,IAAA,MAAM,aAAa,GAAG,eAAe,IAAI,cAAc,GAAG,eAAe,CAAC,cAAc,EAAE,OAAO,CAAC,GAAG,IAAI;IAEzG,QACEA,eAACC,4BAAe,EAAA,EAAC,IAAI,EAAC,MAAM,YACzB,cAAc,KACbF,eAAA,CAACG,mBAAM,CAAC,KAAK,EAAA,EACX,SAAS,EAAC,iBAAiB,EAC3B,OAAO,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,EACtB,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EACjB,IAAI,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,EACnB,UAAU,EAAE;AACV,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,SAAS,EAAE,GAAG;AACd,gBAAA,OAAO,EAAE,EAAE;AACX,gBAAA,IAAI,EAAE,CAAC;AACR,aAAA,EAAA,QAAA,EAAA,CAEDH,eAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA,CACEA,eAAA,CAAA,KAAA,EAAA,EAAA,QAAA,EAAA,CACEC,cAAA,CAAA,IAAA,EAAA,EAAA,QAAA,EAAK,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,EAAA,CAAM,EAC7E,cAAc,CAAC,MAAM,CAAC,GAAGA,cAAA,CAAA,GAAA,EAAA,EAAA,QAAA,EAAI,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,EAAA,CAAK,GAAG,IAAI,CAAA,EAAA,CACpE,EACNA,cAAA,CAAA,QAAA,EAAA,EAAQ,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAC,OAAO,EAAA,QAAA,EAAA,QAAA,EAAA,CAE5C,CAAA,EAAA,CACF,EACTA,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,yBAAyB,EAAA,QAAA,EACrC,aAAa,IAAI,cAAc,EAAA,CAC5B,CAAA,EAAA,CACO,CAChB,EAAA,CACe;AAEtB;;;;"}
1
+ {"version":3,"file":"DetailPanel.js","sources":["../../../../PivotViewer/components/DetailPanel.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx","AnimatePresence","motion"],"mappings":"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"}
@@ -10,6 +10,7 @@ var RangeHistogramFilter = require('./RangeHistogramFilter.js');
10
10
  function FilterPanel({ isOpen, search, filterState, rangeFilterState, expandedFilterKey, filterOptions, anchorRef, onClose, onSearchChange, onFilterToggle, onFilterClear, onRangeChange, onExpandedFilterChange, }) {
11
11
  const panelRef = React.useRef(null);
12
12
  const [position, setPosition] = React.useState({ top: 0, left: 0 });
13
+ // Calculate position when opening
13
14
  React.useEffect(() => {
14
15
  if (isOpen && anchorRef.current) {
15
16
  const rect = anchorRef.current.getBoundingClientRect();
@@ -19,6 +20,7 @@ function FilterPanel({ isOpen, search, filterState, rangeFilterState, expandedFi
19
20
  });
20
21
  }
21
22
  }, [isOpen, anchorRef]);
23
+ // Handle click outside to close
22
24
  React.useEffect(() => {
23
25
  if (!isOpen)
24
26
  return;
@@ -30,6 +32,8 @@ function FilterPanel({ isOpen, search, filterState, rangeFilterState, expandedFi
30
32
  onClose();
31
33
  }
32
34
  };
35
+ // Use capture phase to ensure we catch the event before any other handlers
36
+ // Use timeout to avoid closing immediately when clicking the button to open
33
37
  const timeoutId = setTimeout(() => {
34
38
  document.addEventListener('mousedown', handleClickOutside, true);
35
39
  }, 0);
@@ -1 +1 @@
1
- {"version":3,"file":"FilterPanel.js","sources":["../../../../PivotViewer/components/FilterPanel.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport type { PivotFilter, PivotFilterOption, PivotPrimitive } from '../types';\nimport type { FilterState, RangeFilterState } from '../utils/utils';\nimport { renderOptionCount } from '../utils/utils';\nimport { RangeHistogramFilter } from './RangeHistogramFilter';\n\nexport interface FilterPanelProps<TItem extends object> {\n isOpen: boolean;\n search: string;\n filterState: FilterState;\n rangeFilterState: RangeFilterState;\n expandedFilterKey: string | null;\n filterOptions: {\n filter: PivotFilter<TItem>;\n options: PivotFilterOption[];\n numericRange?: { min: number; max: number; values: PivotPrimitive[] };\n }[];\n anchorRef: React.RefObject<HTMLButtonElement | null>;\n onClose: () => void;\n onSearchChange: (value: string) => void;\n onFilterToggle: (filterKey: string, optionKey: string, multi: boolean | undefined) => void;\n onFilterClear: (filterKey: string) => void;\n onRangeChange: (filterKey: string, range: [number, number] | null) => void;\n onExpandedFilterChange: (key: string | null) => void;\n}\n\nexport function FilterPanel<TItem extends object>({\n isOpen,\n search,\n filterState,\n rangeFilterState,\n expandedFilterKey,\n filterOptions,\n anchorRef,\n onClose,\n onSearchChange,\n onFilterToggle,\n onFilterClear,\n onRangeChange,\n onExpandedFilterChange,\n}: FilterPanelProps<TItem>) {\n const panelRef = useRef<HTMLDivElement>(null);\n const [position, setPosition] = useState({ top: 0, left: 0 });\n\n // Calculate position when opening\n useEffect(() => {\n if (isOpen && anchorRef.current) {\n const rect = anchorRef.current.getBoundingClientRect();\n setPosition({\n top: rect.bottom + 8,\n left: rect.left,\n });\n }\n }, [isOpen, anchorRef]);\n\n // Handle click outside to close\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n const panel = panelRef.current;\n const anchor = anchorRef.current;\n\n if (panel && !panel.contains(target) && anchor && !anchor.contains(target)) {\n onClose();\n }\n };\n\n // Use capture phase to ensure we catch the event before any other handlers\n // Use timeout to avoid closing immediately when clicking the button to open\n const timeoutId = setTimeout(() => {\n document.addEventListener('mousedown', handleClickOutside, true);\n }, 0);\n\n return () => {\n clearTimeout(timeoutId);\n document.removeEventListener('mousedown', handleClickOutside, true);\n };\n }, [isOpen, anchorRef, onClose]);\n\n return createPortal(\n <AnimatePresence initial={false}>\n {isOpen && (\n <motion.aside\n ref={panelRef}\n className=\"pv-filter-dropdown\"\n style={{\n position: 'fixed',\n left: position.left,\n top: position.top,\n }}\n initial={{ opacity: 0, y: -8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -8 }}\n transition={{ duration: 0.15 }}\n >\n <div className=\"pv-filter-dropdown-content\">\n <div className=\"pv-search\">\n <input\n type=\"search\"\n placeholder=\"Search events\"\n value={search}\n onChange={(event) => onSearchChange(event.target.value)}\n />\n </div>\n <div className=\"pv-filter-groups\">\n {filterOptions.map(({ filter, options, numericRange }) => {\n const selections = filterState[filter.key] ?? new Set<string>();\n const rangeSelection = rangeFilterState[filter.key];\n const isExpanded = expandedFilterKey === filter.key;\n const isNumeric = filter.type === 'number';\n\n return (\n <div key={filter.key} className={`pv-filter ${isExpanded ? 'expanded' : ''}`}>\n <button\n type=\"button\"\n className=\"pv-filter-trigger\"\n onClick={() => onExpandedFilterChange(isExpanded ? null : filter.key)}\n >\n <span className=\"pv-filter-label\">{filter.label}</span>\n <span className=\"pv-filter-trigger-meta\">\n {!isNumeric && selections.size > 0 && <span className=\"pv-filter-count\">{selections.size}</span>}\n {isNumeric && rangeSelection && <span className=\"pv-filter-count\">Range</span>}\n <span className=\"pv-filter-chevron\" />\n </span>\n </button>\n <div className={`pv-filter-content ${isExpanded ? 'expanded' : ''}`}>\n {isNumeric && numericRange ? (\n <RangeHistogramFilter\n values={numericRange.values}\n min={numericRange.min}\n max={numericRange.max}\n buckets={filter.buckets ?? 20}\n selectedRange={rangeSelection ?? null}\n onChange={(range) => onRangeChange(filter.key, range)}\n />\n ) : (\n <>\n <ul>\n {options.map((option) => {\n const optionKey = option.key;\n const checked = selections.has(optionKey);\n return (\n <li key={option.key}>\n <label>\n <input\n type={filter.multi ? 'checkbox' : 'radio'}\n name={`filter-${filter.key}`}\n checked={checked}\n onChange={() =>\n onFilterToggle(filter.key, optionKey, filter.multi ?? false)\n }\n />\n <span>{option.label}</span>\n <span className=\"pv-option-count\">{renderOptionCount(option.count)}</span>\n </label>\n </li>\n );\n })}\n </ul>\n {selections.size > 0 && (\n <button\n type=\"button\"\n className=\"pv-filter-clear\"\n onClick={() => onFilterClear(filter.key)}\n >\n Clear\n </button>\n )}\n </>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </motion.aside>\n )}\n </AnimatePresence>,\n document.body\n );\n}\n"],"names":["useRef","useState","useEffect","createPortal","_jsx","AnimatePresence","motion","_jsxs","RangeHistogramFilter","_Fragment","renderOptionCount"],"mappings":"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"}
1
+ {"version":3,"file":"FilterPanel.js","sources":["../../../../PivotViewer/components/FilterPanel.tsx"],"sourcesContent":[null],"names":["useRef","useState","useEffect","createPortal","_jsx","AnimatePresence","motion","_jsxs","RangeHistogramFilter","_Fragment","renderOptionCount"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"FilterPanelContainer.js","sources":["../../../../PivotViewer/components/FilterPanelContainer.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { FilterPanel, type FilterPanelProps } from './FilterPanel';\n\nexport type FilterPanelContainerProps<TItem extends object> = FilterPanelProps<TItem>;\n\nexport function FilterPanelContainer<TItem extends object>(props: FilterPanelContainerProps<TItem>) {\n return <FilterPanel {...props} />;\n}\n"],"names":["_jsx","FilterPanel"],"mappings":";;;;;AAOM,SAAU,oBAAoB,CAAuB,KAAuC,EAAA;AAChG,IAAA,OAAOA,cAAA,CAACC,uBAAW,EAAA,EAAA,GAAK,KAAK,GAAI;AACnC;;;;"}
1
+ {"version":3,"file":"FilterPanelContainer.js","sources":["../../../../PivotViewer/components/FilterPanelContainer.tsx"],"sourcesContent":[null],"names":["_jsx","FilterPanel"],"mappings":";;;;;AAOM,SAAU,oBAAoB,CAAuB,KAAuC,EAAA;AAChG,IAAA,OAAOA,cAAA,CAACC,uBAAW,EAAA,EAAA,GAAK,KAAK,GAAI;AACnC;;;;"}
@@ -28,7 +28,13 @@ function _interopNamespaceDefault(e) {
28
28
 
29
29
  var PIXI__namespace = /*#__PURE__*/_interopNamespaceDefault(PIXI);
30
30
 
31
+ // Copyright (c) Cratis. All rights reserved.
32
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
33
+ // `CardSprite` type moved to ./pivot/constants and imported above
34
+ // constants and CardColors type moved to ./pivot/constants
31
35
  function PivotCanvas({ items, layout, grouping, visibleIds, cardWidth, cardHeight, zoomLevel, panX, panY, viewportWidth, viewportHeight, selectedId, hoveredGroupIndex, isZooming: _isZooming = false, resolveId: _resolveId, onCardClick, onPanStart, onPanMove, onPanEnd, viewMode, cardRenderer, containerRef, }) {
36
+ // Use the containerRef passed from the parent viewport so we append the Pixi
37
+ // canvas and spacer into the actual scrollable element.
32
38
  const parentContainerRef = containerRef;
33
39
  const resolveId = _resolveId;
34
40
  const canvasRef = React.useRef(null);
@@ -57,7 +63,9 @@ function PivotCanvas({ items, layout, grouping, visibleIds, cardWidth, cardHeigh
57
63
  const onPanEndRef = React.useRef(onPanEnd);
58
64
  const onCardClickRef = React.useRef(onCardClick);
59
65
  const prevPanRef = React.useRef({ x: panX, y: panY });
66
+ // Initialize Pixi Application
60
67
  React.useEffect(() => {
68
+ // ... existing code ...
61
69
  onPanMoveRef.current = onPanMove;
62
70
  onPanEndRef.current = onPanEnd;
63
71
  onCardClickRef.current = onCardClick;
@@ -66,17 +74,22 @@ function PivotCanvas({ items, layout, grouping, visibleIds, cardWidth, cardHeigh
66
74
  cardColorsRef.current = colorResolver.resolveCardColors(cssColorResolver);
67
75
  }, [cssColorResolver]);
68
76
  React.useEffect(() => {
77
+ // Reset mounted flag
69
78
  mountedRef.current = true;
70
79
  if (!parentContainerRef || !parentContainerRef.current) {
71
80
  return;
72
81
  }
82
+ // Prevent multiple simultaneous initializations
73
83
  if (initializingRef.current || appRef.current) {
74
84
  return;
75
85
  }
76
86
  initializingRef.current = true;
77
87
  let app = null;
88
+ // Handler references declared here so cleanup can remove them later.
78
89
  (async () => {
79
90
  try {
91
+ // Prefer the new init API (v8+) to avoid deprecation issues. Fall back
92
+ // to the constructor options when `init` is not available.
80
93
  const options = {
81
94
  backgroundAlpha: 0,
82
95
  antialias: false,
@@ -88,13 +101,17 @@ function PivotCanvas({ items, layout, grouping, visibleIds, cardWidth, cardHeigh
88
101
  };
89
102
  app = new PIXI__namespace.Application();
90
103
  if (app.init && typeof app.init === 'function') {
104
+ // init may return a promise in some builds
105
+ // @ts-ignore
91
106
  await app.init(options);
92
107
  }
93
108
  else {
109
+ // Fall back to constructor that accepts options
94
110
  app.destroy?.();
95
111
  app = new PIXI__namespace.Application(options);
96
112
  }
97
113
  if (!mountedRef.current || !parentContainerRef.current) {
114
+ // Component unmounted during initialization
98
115
  if (app && typeof app.destroy === 'function')
99
116
  app.destroy(true, { children: true });
100
117
  initializingRef.current = false;
@@ -107,7 +124,15 @@ function PivotCanvas({ items, layout, grouping, visibleIds, cardWidth, cardHeigh
107
124
  const root = new PIXI__namespace.Container();
108
125
  rootRef.current = root;
109
126
  app.stage.addChild(root);
127
+ // Resolve canvas element (different Pixi builds expose it as `view` or
128
+ // `canvas`).
110
129
  const canvasEl = (app.view ?? app.canvas ?? app.renderer?.view);
130
+ // Place canvas outside the scrollable content so native scrolling
131
+ // doesn't move the canvas DOM element itself. We overlay the canvas
132
+ // on top of the scroll area by inserting it into the parent element
133
+ // (or the container itself if parent is not available). This ensures
134
+ // the Pixi canvas remains stable while we move the Pixi world inside
135
+ // it to represent camera pan.
111
136
  const overlayParent = parentContainerRef.current.parentElement ?? parentContainerRef.current;
112
137
  if (canvasEl) {
113
138
  if (canvasEl.parentElement) {
@@ -127,26 +152,41 @@ function PivotCanvas({ items, layout, grouping, visibleIds, cardWidth, cardHeigh
127
152
  else {
128
153
  console.error('PivotCanvas: Could not find canvas element from Pixi application');
129
154
  }
155
+ // Position the canvas to overlay the scrollable container area.
130
156
  if (canvasRef.current && parentContainerRef.current) {
131
157
  const parentBounds = parentContainerRef.current.getBoundingClientRect();
132
158
  void parentBounds;
133
159
  canvasRef.current.style.position = 'absolute';
160
+ // Place canvas relative to the overlayParent's coordinate space.
161
+ // If overlayParent is the immediate parent, top/left 0 aligns it.
134
162
  const offsetLeft = parentContainerRef.current.offsetLeft;
135
163
  const offsetTop = parentContainerRef.current.offsetTop;
136
164
  canvasRef.current.style.left = `${offsetLeft}px`;
137
165
  canvasRef.current.style.top = `${offsetTop}px`;
138
166
  canvasRef.current.style.width = `${parentContainerRef.current.clientWidth}px`;
139
167
  canvasRef.current.style.height = `${parentContainerRef.current.clientHeight}px`;
168
+ // Place canvas behind the scrollable container (which has z-index 1)
169
+ // so scrollbars appear on top.
140
170
  canvasRef.current.style.zIndex = '0';
171
+ // Disable pointer events on canvas so they pass through to the viewport if needed,
172
+ // though viewport is on top anyway.
141
173
  canvasRef.current.style.pointerEvents = 'none';
142
174
  }
175
+ // We handle clicks and interactions manually in PivotViewerMain now,
176
+ // so we don't need to configure Pixi events on the container.
177
+ // This avoids z-index conflicts and event propagation issues.
178
+ // Make canvas fill container with absolute positioning
143
179
  if (canvasRef.current) {
144
180
  canvasRef.current.style.display = 'block';
181
+ // Ensure canvas does not capture events so they pass through to the viewport
145
182
  canvasRef.current.style.pointerEvents = 'none';
146
183
  }
184
+ // Setup stage events for background panning
147
185
  app.stage.eventMode = 'static';
148
186
  app.stage.hitArea = new PIXI__namespace.Rectangle(0, 0, viewportWidth, viewportHeight);
149
187
  app.stage.on('pointerdown', (e) => {
188
+ // Only handle if it reached the stage (background)
189
+ // Sprites stop propagation, so this is safe
150
190
  onPanStartRef.current(e.nativeEvent);
151
191
  });
152
192
  app.stage.on('globalpointermove', (e) => {
@@ -155,14 +195,28 @@ function PivotCanvas({ items, layout, grouping, visibleIds, cardWidth, cardHeigh
155
195
  app.stage.on('globalpointerup', () => {
156
196
  onPanEndRef.current();
157
197
  });
198
+ // We no longer need manual event listeners on parentEl because Pixi
199
+ // is now listening to events on parentEl directly via setTargetElement.
200
+ // This allows Pixi to handle hit testing through the transparent container.
158
201
  const parentEl = parentContainerRef.current;
159
202
  if (parentEl) {
203
+ // handleMouseDown = (e: Event) => onPanStartRef.current(e as unknown);
204
+ // handleMouseMove = (e: Event) => onPanMoveRef.current(e as unknown);
205
+ // handleMouseUp = () => onPanEndRef.current();
206
+ // parentEl.addEventListener('mousedown', handleMouseDown);
207
+ // parentEl.addEventListener('mousemove', handleMouseMove);
208
+ // parentEl.addEventListener('mouseup', handleMouseUp);
209
+ // parentEl.addEventListener('mouseleave', handleMouseUp);
210
+ // window.addEventListener('mouseup', handleMouseUp);
211
+ // window.addEventListener('pointerup', handleMouseUp);
160
212
  }
213
+ // Immediately size to container to avoid delay
161
214
  if (viewportWidth > 0 && viewportHeight > 0) {
162
215
  app.renderer?.resize(viewportWidth, viewportHeight);
163
216
  }
164
217
  setPixiReady(true);
165
218
  initializingRef.current = false;
219
+ // Trigger initial render
166
220
  needsRenderRef.current = true;
167
221
  app.renderer?.render(app.stage);
168
222
  }
@@ -180,14 +234,27 @@ function PivotCanvas({ items, layout, grouping, visibleIds, cardWidth, cardHeigh
180
234
  appRef.current = null;
181
235
  rootRef.current = null;
182
236
  }
237
+ // Clear local sprite references to prevent re-use of destroyed sprites
183
238
  spritesRef.current.clear();
239
+ // Clear sprite pool to avoid holding onto destroyed textures
240
+ // clearSpritePool();
241
+ // Remove any event listeners we attached to the parent container
184
242
  try {
185
243
  const parentEl = parentContainerRef.current;
186
244
  if (parentEl) {
245
+ // if (handleMouseDown) parentEl.removeEventListener('mousedown', handleMouseDown);
246
+ // if (handleMouseMove) parentEl.removeEventListener('mousemove', handleMouseMove);
247
+ // if (handleMouseUp) parentEl.removeEventListener('mouseup', handleMouseUp);
248
+ // if (handleMouseUp) parentEl.removeEventListener('mouseleave', handleMouseUp);
249
+ // if (handleMouseUp) {
250
+ // window.removeEventListener('mouseup', handleMouseUp);
251
+ // window.removeEventListener('pointerup', handleMouseUp);
252
+ // }
187
253
  }
188
254
  }
189
255
  catch (e) {
190
256
  }
257
+ // Remove DOM nodes we appended
191
258
  try {
192
259
  if (canvasRef.current && canvasRef.current.parentElement) {
193
260
  canvasRef.current.parentElement.removeChild(canvasRef.current);
@@ -196,7 +263,8 @@ function PivotCanvas({ items, layout, grouping, visibleIds, cardWidth, cardHeigh
196
263
  catch (e) {
197
264
  }
198
265
  };
199
- }, []);
266
+ }, []); // Only initialize once - resizing handled by separate useEffect
267
+ // Handle canvas resize
200
268
  React.useEffect(() => {
201
269
  if (!parentContainerRef || !parentContainerRef.current || !appRef.current || !pixiReady)
202
270
  return;
@@ -204,12 +272,15 @@ function PivotCanvas({ items, layout, grouping, visibleIds, cardWidth, cardHeigh
204
272
  const app = appRef.current;
205
273
  let resizeTimeout;
206
274
  const handleResize = () => {
275
+ // Size canvas to viewport dimensions from props
207
276
  if (viewportWidth > 0 && viewportHeight > 0) {
208
277
  app.renderer?.resize(viewportWidth, viewportHeight);
209
278
  app.stage.hitArea = new PIXI__namespace.Rectangle(0, 0, viewportWidth, viewportHeight);
279
+ // Keep canvas DOM size in sync with container
210
280
  if (canvasRef.current && parentContainerRef.current) {
211
281
  canvasRef.current.style.width = `${parentContainerRef.current.clientWidth}px`;
212
282
  canvasRef.current.style.height = `${parentContainerRef.current.clientHeight}px`;
283
+ // Also update left/top in case the container moved
213
284
  canvasRef.current.style.left = `${parentContainerRef.current.offsetLeft}px`;
214
285
  canvasRef.current.style.top = `${parentContainerRef.current.offsetTop}px`;
215
286
  }
@@ -219,7 +290,9 @@ function PivotCanvas({ items, layout, grouping, visibleIds, cardWidth, cardHeigh
219
290
  clearTimeout(resizeTimeout);
220
291
  resizeTimeout = setTimeout(handleResize, 150);
221
292
  };
293
+ // Initial resize (immediate)
222
294
  handleResize();
295
+ // Watch for size changes (debounced)
223
296
  const resizeObserver = new ResizeObserver(debouncedResize);
224
297
  resizeObserver.observe(container);
225
298
  return () => {
@@ -227,6 +300,7 @@ function PivotCanvas({ items, layout, grouping, visibleIds, cardWidth, cardHeigh
227
300
  resizeObserver.disconnect();
228
301
  };
229
302
  }, [pixiReady, viewportWidth, viewportHeight]);
303
+ // Update group backgrounds only when layout/grouping changes
230
304
  React.useEffect(() => {
231
305
  if (!groupsContainerRef.current || !parentContainerRef.current || !pixiReady)
232
306
  return;
@@ -234,6 +308,7 @@ function PivotCanvas({ items, layout, grouping, visibleIds, cardWidth, cardHeigh
234
308
  needsRenderRef.current = true;
235
309
  appRef.current?.renderer?.render(appRef.current.stage);
236
310
  }, [grouping, layout, zoomLevel, viewMode, pixiReady]);
311
+ // Fade buckets background when switching view modes
237
312
  React.useEffect(() => {
238
313
  const gc = groupsContainerRef.current;
239
314
  const app = appRef.current;
@@ -241,7 +316,7 @@ function PivotCanvas({ items, layout, grouping, visibleIds, cardWidth, cardHeigh
241
316
  return;
242
317
  const target = viewMode === 'grouped' ? 1 : 0;
243
318
  const start = typeof gc.alpha === 'number' ? gc.alpha : 1;
244
- const duration = 200;
319
+ const duration = 200; // ms
245
320
  if (Math.abs(start - target) < 0.01) {
246
321
  gc.alpha = target;
247
322
  return;
@@ -261,6 +336,7 @@ function PivotCanvas({ items, layout, grouping, visibleIds, cardWidth, cardHeigh
261
336
  if (!rootRef.current || !parentContainerRef.current || !pixiReady) {
262
337
  return;
263
338
  }
339
+ // Check if this is a view mode change (not just pan/scroll)
264
340
  const viewModeChanged = previousViewModeRef.current !== viewMode;
265
341
  const groupingChanged = prevGroupingRef.current !== grouping;
266
342
  const layoutChanged = prevLayoutRef.current !== layout;
@@ -269,7 +345,14 @@ function PivotCanvas({ items, layout, grouping, visibleIds, cardWidth, cardHeigh
269
345
  lastViewChangeTimeRef.current = Date.now();
270
346
  previousViewModeRef.current = viewMode;
271
347
  prevGroupingRef.current = grouping;
348
+ // Don't hide sprites here - let visibility.ts handle the transition
349
+ // The syncSpritesToViewport function will properly animate sprites to new positions
350
+ // during view transitions (isViewTransitionRef.current = true), and visibility.ts
351
+ // will handle cleanup of sprites that no longer have positions in the layout.
352
+ // Previously, hiding sprites here caused sorting/transitions to not work because
353
+ // sprites were destroyed before they could animate.
272
354
  }
355
+ // Update spacer dimensions to match scaled world size
273
356
  if (spacerRef.current) {
274
357
  const spacer = spacerRef.current;
275
358
  const worldWidth = (layout.totalWidth || viewportWidth) * zoomLevel;
@@ -277,12 +360,16 @@ function PivotCanvas({ items, layout, grouping, visibleIds, cardWidth, cardHeigh
277
360
  spacer.style.width = `${Math.max(worldWidth, viewportWidth)}px`;
278
361
  spacer.style.height = `${Math.max(worldHeight, viewportHeight)}px`;
279
362
  }
363
+ // Ensure scroll spacer matches layout so the container becomes scrollable and
364
+ // native scrollLeft/scrollTop reflect the camera position.
280
365
  if (parentContainerRef.current) {
281
366
  spacerRef.current;
282
367
  }
283
368
  const panDeltaX = panX - prevPanRef.current.x;
284
369
  const panDeltaY = panY - prevPanRef.current.y;
285
370
  prevPanRef.current = { x: panX, y: panY };
371
+ // Sync sprites into viewport and create/remove as needed
372
+ // Provide wrappers for sprite creation and content update so helpers have required context
286
373
  const currentScrollTop = parentContainerRef.current?.scrollTop || 0;
287
374
  const currentScrollLeft = parentContainerRef.current?.scrollLeft || 0;
288
375
  visibility.syncSpritesToViewport({
@@ -310,9 +397,11 @@ function PivotCanvas({ items, layout, grouping, visibleIds, cardWidth, cardHeigh
310
397
  prevScrollTop: prevScrollTopRef.current,
311
398
  prevScrollLeft: prevScrollLeftRef.current,
312
399
  });
400
+ // Update previous scroll position for next frame
313
401
  prevScrollTopRef.current = currentScrollTop;
314
402
  prevScrollLeftRef.current = currentScrollLeft;
315
403
  needsRenderRef.current = true;
404
+ // Force an immediate render after syncing sprites to ensure cards appear
316
405
  if (appRef.current?.renderer && rootRef.current) {
317
406
  appRef.current.renderer.render(appRef.current.stage);
318
407
  needsRenderRef.current = false;
@@ -327,9 +416,33 @@ function PivotCanvas({ items, layout, grouping, visibleIds, cardWidth, cardHeigh
327
416
  isViewTransitionRef,
328
417
  });
329
418
  }, [layout, visibleIds, items, cardWidth, cardHeight, pixiReady, zoomLevel, panX, panY, grouping, viewMode]);
419
+ // Update prevLayoutRef after processing layout changes
330
420
  React.useEffect(() => {
331
421
  prevLayoutRef.current = layout;
332
422
  }, [layout]);
423
+ // Duplicate camera position effect removed -- syncSpritesToViewport handles this with correct offsetY logic logic
424
+ /*
425
+ useEffect(() => {
426
+ if (!rootRef.current || !groupsContainerRef.current) return;
427
+
428
+ // Camera transform: move world opposite to camera position. Prefer the
429
+ // native container scroll positions where available (they are authoritative
430
+ // during user scrolls) and fall back to the passed pan props.
431
+ const effectivePanX = parentContainerRef.current ? parentContainerRef.current.scrollLeft : panX;
432
+ const effectivePanY = parentContainerRef.current ? parentContainerRef.current.scrollTop : panY;
433
+
434
+ // Apply zoom and position to root and groups.
435
+ if (rootRef.current.scale && groupsContainerRef.current.scale) {
436
+ rootRef.current.scale.set(zoomLevel);
437
+ groupsContainerRef.current.scale.set(zoomLevel);
438
+ }
439
+ if (rootRef.current.position && groupsContainerRef.current.position) {
440
+ rootRef.current.position.set(-effectivePanX, -effectivePanY);
441
+ groupsContainerRef.current.position.set(-effectivePanX, -effectivePanY);
442
+ }
443
+ appRef.current?.renderer?.render(appRef.current.stage);
444
+ }, [zoomLevel, panX, panY]);
445
+ */
333
446
  React.useEffect(() => {
334
447
  if (!rootRef.current)
335
448
  return;
@@ -344,20 +457,38 @@ function PivotCanvas({ items, layout, grouping, visibleIds, cardWidth, cardHeigh
344
457
  needsRenderRef.current = true;
345
458
  appRef.current?.renderer.render(appRef.current.stage);
346
459
  }, [hoveredGroupIndex, layout, grouping]);
460
+ // Note: animation loop and group background updates are delegated to
461
+ // external helpers (`startAnimationLoopExternal` and
462
+ // `updateGroupBackgroundsExternal`) and invoked where needed. We don't
463
+ // expose local wrappers to avoid unused-function lint warnings.
464
+ // Listen to native scroll events on the parent container so we update the
465
+ // Pixi world immediately when the user scrolls (native scrollbar or
466
+ // programmatic). This ensures `syncSpritesToViewport` runs on scroll and
467
+ // creates/destroys sprites as the viewport moves.
347
468
  React.useEffect(() => {
348
469
  if (!pixiReady || !parentContainerRef || !parentContainerRef.current || !appRef.current || !rootRef.current)
349
470
  return;
350
471
  const container = parentContainerRef.current;
351
472
  const app = appRef.current;
473
+ // rAF-batched scroll handling: store the latest scroll values and process
474
+ // them once per animation frame to avoid heavy synchronous work inside
475
+ // the scroll event which causes jank and de-synchronisation between the
476
+ // compositor and Pixi render updates.
352
477
  const lastScroll = { x: container.scrollLeft, y: container.scrollTop };
353
478
  const pendingRef = { scheduled: false };
354
479
  const processScroll = () => {
355
480
  pendingRef.scheduled = false;
356
481
  try {
482
+ // Read directly from container to ensure consistency with visibility logic
483
+ // and to handle cases where scroll changes without event (e.g. resize clamping)
357
484
  const effectivePanX = container.scrollLeft;
358
485
  const effectivePanY = container.scrollTop;
486
+ // Update lastScroll to keep it in sync
359
487
  lastScroll.x = effectivePanX;
360
488
  lastScroll.y = effectivePanY;
489
+ // Note: We delegate root/groups container positioning to syncSpritesToViewport
490
+ // because it encapsulates the logic for conditional vertical alignment (offsetY)
491
+ // in different view modes. Manually setting position here would overwrite that logic.
361
492
  visibility.syncSpritesToViewport({
362
493
  root: rootRef.current,
363
494
  groupsContainer: groupsContainerRef.current,
@@ -380,6 +511,7 @@ function PivotCanvas({ items, layout, grouping, visibleIds, cardWidth, cardHeigh
380
511
  prevScrollTop: prevScrollTopRef.current,
381
512
  prevScrollLeft: prevScrollLeftRef.current,
382
513
  });
514
+ // Update previous scroll position for next frame
383
515
  prevScrollTopRef.current = container.scrollTop || 0;
384
516
  prevScrollLeftRef.current = container.scrollLeft || 0;
385
517
  needsRenderRef.current = true;
@@ -390,6 +522,7 @@ function PivotCanvas({ items, layout, grouping, visibleIds, cardWidth, cardHeigh
390
522
  }
391
523
  };
392
524
  const onScroll = () => {
525
+ // capture latest scroll positions quickly and schedule work
393
526
  lastScroll.x = container.scrollLeft;
394
527
  lastScroll.y = container.scrollTop;
395
528
  if (!pendingRef.scheduled) {
@@ -415,6 +548,9 @@ function PivotCanvas({ items, layout, grouping, visibleIds, cardWidth, cardHeigh
415
548
  function updateHighlight() {
416
549
  groups.updateHighlight(groupsContainerRef.current, parentContainerRef.current, grouping, layout, hoveredGroupIndex, cardWidth, zoomLevel);
417
550
  }
551
+ // This component renders into the parent `containerRef` (we append Pixi canvas
552
+ // and spacer directly into that DOM node). Return null so we don't replace or
553
+ // reassign the parent's ref which must remain the scrollable viewport element.
418
554
  return null;
419
555
  }
420
556