@cratis/components 0.1.9

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 (577) hide show
  1. package/.storybook/main.ts +24 -0
  2. package/CommandDialog/CommandDialog.stories.tsx +25 -0
  3. package/CommandDialog/CommandDialog.tsx +161 -0
  4. package/CommandDialog/index.ts +4 -0
  5. package/CommandForm/CommandForm.stories.tsx +24 -0
  6. package/CommandForm/CommandForm.tsx +266 -0
  7. package/CommandForm/CommandFormField.tsx +27 -0
  8. package/CommandForm/CommandFormFields.tsx +142 -0
  9. package/CommandForm/DatePickerField.tsx +57 -0
  10. package/CommandForm/DropdownField.tsx +65 -0
  11. package/CommandForm/InputTextField.tsx +62 -0
  12. package/CommandForm/SliderField.tsx +68 -0
  13. package/CommandForm/index.ts +10 -0
  14. package/Common/ErrorBoundary.stories.tsx +10 -0
  15. package/Common/ErrorBoundary.tsx +41 -0
  16. package/Common/FormElement.stories.tsx +10 -0
  17. package/Common/FormElement.tsx +20 -0
  18. package/Common/Page.stories.tsx +10 -0
  19. package/Common/Page.tsx +21 -0
  20. package/Common/index.ts +6 -0
  21. package/DataPage/DataPage.stories.tsx +10 -0
  22. package/DataPage/DataPage.tsx +191 -0
  23. package/DataPage/index.ts +4 -0
  24. package/DataTables/DataTableForObservableQuery.stories.tsx +10 -0
  25. package/DataTables/DataTableForObservableQuery.tsx +97 -0
  26. package/DataTables/DataTableForQuery.stories.tsx +10 -0
  27. package/DataTables/DataTableForQuery.tsx +97 -0
  28. package/DataTables/index.ts +5 -0
  29. package/Dialogs/BusyIndicatorDialog.stories.tsx +26 -0
  30. package/Dialogs/BusyIndicatorDialog.tsx +26 -0
  31. package/Dialogs/ConfirmationDialog.stories.tsx +36 -0
  32. package/Dialogs/ConfirmationDialog.tsx +75 -0
  33. package/Dialogs/index.ts +5 -0
  34. package/Dropdown/Dropdown.tsx +23 -0
  35. package/Dropdown/index.ts +4 -0
  36. package/PivotViewer/PivotViewer.stories.tsx +24 -0
  37. package/PivotViewer/PivotViewer.tsx +791 -0
  38. package/PivotViewer/components/AxisLabels.tsx +69 -0
  39. package/PivotViewer/components/DetailPanel.tsx +108 -0
  40. package/PivotViewer/components/FilterPanel.tsx +189 -0
  41. package/PivotViewer/components/FilterPanelContainer.tsx +10 -0
  42. package/PivotViewer/components/PivotCanvas.tsx +660 -0
  43. package/PivotViewer/components/PivotViewerMain.tsx +229 -0
  44. package/PivotViewer/components/RangeHistogramFilter.tsx +220 -0
  45. package/PivotViewer/components/Spinner.tsx +21 -0
  46. package/PivotViewer/components/Toolbar.tsx +130 -0
  47. package/PivotViewer/components/ToolbarContainer.tsx +10 -0
  48. package/PivotViewer/components/index.ts +12 -0
  49. package/PivotViewer/components/pivot/animation.ts +108 -0
  50. package/PivotViewer/components/pivot/buckets.ts +152 -0
  51. package/PivotViewer/components/pivot/colorResolver.ts +67 -0
  52. package/PivotViewer/components/pivot/constants.ts +46 -0
  53. package/PivotViewer/components/pivot/sprites.ts +265 -0
  54. package/PivotViewer/components/pivot/visibility.ts +319 -0
  55. package/PivotViewer/constants.ts +9 -0
  56. package/PivotViewer/engine/layout.ts +149 -0
  57. package/PivotViewer/engine/pivot.worker.ts +86 -0
  58. package/PivotViewer/engine/store.ts +437 -0
  59. package/PivotViewer/engine/types.ts +255 -0
  60. package/PivotViewer/hooks/index.ts +13 -0
  61. package/PivotViewer/hooks/useContainerDimensions.ts +45 -0
  62. package/PivotViewer/hooks/useDimensionState.ts +53 -0
  63. package/PivotViewer/hooks/useFilterOptions.ts +36 -0
  64. package/PivotViewer/hooks/useFilterPanelDrag.ts +49 -0
  65. package/PivotViewer/hooks/useFilterState.ts +106 -0
  66. package/PivotViewer/hooks/useFilteredData.ts +119 -0
  67. package/PivotViewer/hooks/usePanning.ts +163 -0
  68. package/PivotViewer/hooks/usePivotEngine.ts +252 -0
  69. package/PivotViewer/hooks/useSelectedItem.ts +402 -0
  70. package/PivotViewer/hooks/useWheelZoom.ts +114 -0
  71. package/PivotViewer/hooks/useZoomState.ts +34 -0
  72. package/PivotViewer/index.ts +7 -0
  73. package/PivotViewer/types.ts +59 -0
  74. package/PivotViewer/utils/animations.ts +249 -0
  75. package/PivotViewer/utils/constants.ts +20 -0
  76. package/PivotViewer/utils/index.ts +6 -0
  77. package/PivotViewer/utils/selection.ts +292 -0
  78. package/PivotViewer/utils/utils.ts +259 -0
  79. package/README.md +1 -0
  80. package/TimeMachine/EventsView.stories.tsx +10 -0
  81. package/TimeMachine/EventsView.tsx +119 -0
  82. package/TimeMachine/Properties.stories.tsx +10 -0
  83. package/TimeMachine/Properties.tsx +98 -0
  84. package/TimeMachine/ReadModelView.stories.tsx +10 -0
  85. package/TimeMachine/ReadModelView.tsx +143 -0
  86. package/TimeMachine/TimeMachine.stories.tsx +10 -0
  87. package/TimeMachine/TimeMachine.tsx +244 -0
  88. package/TimeMachine/index.ts +8 -0
  89. package/TimeMachine/types.ts +23 -0
  90. package/dist/cjs/CommandDialog/CommandDialog.js +71 -0
  91. package/dist/cjs/CommandDialog/CommandDialog.js.map +1 -0
  92. package/dist/cjs/CommandDialog/index.js +9 -0
  93. package/dist/cjs/CommandDialog/index.js.map +1 -0
  94. package/dist/cjs/CommandForm/CommandForm.js +179 -0
  95. package/dist/cjs/CommandForm/CommandForm.js.map +1 -0
  96. package/dist/cjs/CommandForm/CommandFormField.js +11 -0
  97. package/dist/cjs/CommandForm/CommandFormField.js.map +1 -0
  98. package/dist/cjs/CommandForm/CommandFormFields.js +67 -0
  99. package/dist/cjs/CommandForm/CommandFormFields.js.map +1 -0
  100. package/dist/cjs/CommandForm/DatePickerField.js +31 -0
  101. package/dist/cjs/CommandForm/DatePickerField.js.map +1 -0
  102. package/dist/cjs/CommandForm/DropdownField.js +31 -0
  103. package/dist/cjs/CommandForm/DropdownField.js.map +1 -0
  104. package/dist/cjs/CommandForm/InputTextField.js +32 -0
  105. package/dist/cjs/CommandForm/InputTextField.js.map +1 -0
  106. package/dist/cjs/CommandForm/SliderField.js +34 -0
  107. package/dist/cjs/CommandForm/SliderField.js.map +1 -0
  108. package/dist/cjs/CommandForm/index.js +23 -0
  109. package/dist/cjs/CommandForm/index.js.map +1 -0
  110. package/dist/cjs/Common/Page.js +10 -0
  111. package/dist/cjs/Common/Page.js.map +1 -0
  112. package/dist/cjs/DataPage/DataPage.js +64 -0
  113. package/dist/cjs/DataPage/DataPage.js.map +1 -0
  114. package/dist/cjs/DataPage/index.js +11 -0
  115. package/dist/cjs/DataPage/index.js.map +1 -0
  116. package/dist/cjs/DataTables/DataTableForObservableQuery.js +17 -0
  117. package/dist/cjs/DataTables/DataTableForObservableQuery.js.map +1 -0
  118. package/dist/cjs/DataTables/DataTableForQuery.js +17 -0
  119. package/dist/cjs/DataTables/DataTableForQuery.js.map +1 -0
  120. package/dist/cjs/DataTables/index.js +10 -0
  121. package/dist/cjs/DataTables/index.js.map +1 -0
  122. package/dist/cjs/Dialogs/BusyIndicatorDialog.js +13 -0
  123. package/dist/cjs/Dialogs/BusyIndicatorDialog.js.map +1 -0
  124. package/dist/cjs/Dialogs/ConfirmationDialog.js +33 -0
  125. package/dist/cjs/Dialogs/ConfirmationDialog.js.map +1 -0
  126. package/dist/cjs/Dialogs/index.js +10 -0
  127. package/dist/cjs/Dialogs/index.js.map +1 -0
  128. package/dist/cjs/Dropdown/Dropdown.js +15 -0
  129. package/dist/cjs/Dropdown/Dropdown.js.map +1 -0
  130. package/dist/cjs/Dropdown/index.js +8 -0
  131. package/dist/cjs/Dropdown/index.js.map +1 -0
  132. package/dist/cjs/PivotViewer/PivotViewer.js +525 -0
  133. package/dist/cjs/PivotViewer/PivotViewer.js.map +1 -0
  134. package/dist/cjs/PivotViewer/components/AxisLabels.js +27 -0
  135. package/dist/cjs/PivotViewer/components/AxisLabels.js.map +1 -0
  136. package/dist/cjs/PivotViewer/components/DetailPanel.js +35 -0
  137. package/dist/cjs/PivotViewer/components/DetailPanel.js.map +1 -0
  138. package/dist/cjs/PivotViewer/components/FilterPanel.js +59 -0
  139. package/dist/cjs/PivotViewer/components/FilterPanel.js.map +1 -0
  140. package/dist/cjs/PivotViewer/components/FilterPanelContainer.js +11 -0
  141. package/dist/cjs/PivotViewer/components/FilterPanelContainer.js.map +1 -0
  142. package/dist/cjs/PivotViewer/components/PivotCanvas.js +394 -0
  143. package/dist/cjs/PivotViewer/components/PivotCanvas.js.map +1 -0
  144. package/dist/cjs/PivotViewer/components/PivotViewerMain.js +81 -0
  145. package/dist/cjs/PivotViewer/components/PivotViewerMain.js.map +1 -0
  146. package/dist/cjs/PivotViewer/components/RangeHistogramFilter.js +124 -0
  147. package/dist/cjs/PivotViewer/components/RangeHistogramFilter.js.map +1 -0
  148. package/dist/cjs/PivotViewer/components/Spinner.js +11 -0
  149. package/dist/cjs/PivotViewer/components/Spinner.js.map +1 -0
  150. package/dist/cjs/PivotViewer/components/Toolbar.js +12 -0
  151. package/dist/cjs/PivotViewer/components/Toolbar.js.map +1 -0
  152. package/dist/cjs/PivotViewer/components/ToolbarContainer.js +11 -0
  153. package/dist/cjs/PivotViewer/components/ToolbarContainer.js.map +1 -0
  154. package/dist/cjs/PivotViewer/components/pivot/animation.js +82 -0
  155. package/dist/cjs/PivotViewer/components/pivot/animation.js.map +1 -0
  156. package/dist/cjs/PivotViewer/components/pivot/buckets.js +124 -0
  157. package/dist/cjs/PivotViewer/components/pivot/buckets.js.map +1 -0
  158. package/dist/cjs/PivotViewer/components/pivot/colorResolver.js +64 -0
  159. package/dist/cjs/PivotViewer/components/pivot/colorResolver.js.map +1 -0
  160. package/dist/cjs/PivotViewer/components/pivot/constants.js +19 -0
  161. package/dist/cjs/PivotViewer/components/pivot/constants.js.map +1 -0
  162. package/dist/cjs/PivotViewer/components/pivot/sprites.js +227 -0
  163. package/dist/cjs/PivotViewer/components/pivot/sprites.js.map +1 -0
  164. package/dist/cjs/PivotViewer/components/pivot/visibility.js +223 -0
  165. package/dist/cjs/PivotViewer/components/pivot/visibility.js.map +1 -0
  166. package/dist/cjs/PivotViewer/constants.js +16 -0
  167. package/dist/cjs/PivotViewer/constants.js.map +1 -0
  168. package/dist/cjs/PivotViewer/engine/layout.js +95 -0
  169. package/dist/cjs/PivotViewer/engine/layout.js.map +1 -0
  170. package/dist/cjs/PivotViewer/engine/store.js +336 -0
  171. package/dist/cjs/PivotViewer/engine/store.js.map +1 -0
  172. package/dist/cjs/PivotViewer/hooks/useContainerDimensions.js +30 -0
  173. package/dist/cjs/PivotViewer/hooks/useContainerDimensions.js.map +1 -0
  174. package/dist/cjs/PivotViewer/hooks/useDimensionState.js +43 -0
  175. package/dist/cjs/PivotViewer/hooks/useDimensionState.js.map +1 -0
  176. package/dist/cjs/PivotViewer/hooks/useFilterOptions.js +24 -0
  177. package/dist/cjs/PivotViewer/hooks/useFilterOptions.js.map +1 -0
  178. package/dist/cjs/PivotViewer/hooks/useFilterState.js +96 -0
  179. package/dist/cjs/PivotViewer/hooks/useFilterState.js.map +1 -0
  180. package/dist/cjs/PivotViewer/hooks/usePanning.js +120 -0
  181. package/dist/cjs/PivotViewer/hooks/usePanning.js.map +1 -0
  182. package/dist/cjs/PivotViewer/hooks/usePivotEngine.js +183 -0
  183. package/dist/cjs/PivotViewer/hooks/usePivotEngine.js.map +1 -0
  184. package/dist/cjs/PivotViewer/hooks/useWheelZoom.js +93 -0
  185. package/dist/cjs/PivotViewer/hooks/useWheelZoom.js.map +1 -0
  186. package/dist/cjs/PivotViewer/hooks/useZoomState.js +31 -0
  187. package/dist/cjs/PivotViewer/hooks/useZoomState.js.map +1 -0
  188. package/dist/cjs/PivotViewer/index.js +9 -0
  189. package/dist/cjs/PivotViewer/index.js.map +1 -0
  190. package/dist/cjs/PivotViewer/utils/animations.js +144 -0
  191. package/dist/cjs/PivotViewer/utils/animations.js.map +1 -0
  192. package/dist/cjs/PivotViewer/utils/constants.js +12 -0
  193. package/dist/cjs/PivotViewer/utils/constants.js.map +1 -0
  194. package/dist/cjs/PivotViewer/utils/selection.js +136 -0
  195. package/dist/cjs/PivotViewer/utils/selection.js.map +1 -0
  196. package/dist/cjs/PivotViewer/utils/utils.js +150 -0
  197. package/dist/cjs/PivotViewer/utils/utils.js.map +1 -0
  198. package/dist/cjs/TimeMachine/EventsView.js +57 -0
  199. package/dist/cjs/TimeMachine/EventsView.js.map +1 -0
  200. package/dist/cjs/TimeMachine/Properties.js +58 -0
  201. package/dist/cjs/TimeMachine/Properties.js.map +1 -0
  202. package/dist/cjs/TimeMachine/ReadModelView.js +40 -0
  203. package/dist/cjs/TimeMachine/ReadModelView.js.map +1 -0
  204. package/dist/cjs/TimeMachine/TimeMachine.js +98 -0
  205. package/dist/cjs/TimeMachine/TimeMachine.js.map +1 -0
  206. package/dist/cjs/TimeMachine/index.js +14 -0
  207. package/dist/cjs/TimeMachine/index.js.map +1 -0
  208. package/dist/cjs/index.js +22 -0
  209. package/dist/cjs/index.js.map +1 -0
  210. package/dist/cjs/useOverlayZIndex.js +24 -0
  211. package/dist/cjs/useOverlayZIndex.js.map +1 -0
  212. package/dist/esm/CommandDialog/CommandDialog.d.ts +45 -0
  213. package/dist/esm/CommandDialog/CommandDialog.d.ts.map +1 -0
  214. package/dist/esm/CommandDialog/CommandDialog.js +68 -0
  215. package/dist/esm/CommandDialog/CommandDialog.js.map +1 -0
  216. package/dist/esm/CommandDialog/CommandDialog.stories.d.ts +7 -0
  217. package/dist/esm/CommandDialog/CommandDialog.stories.d.ts.map +1 -0
  218. package/dist/esm/CommandDialog/CommandDialog.stories.js +12 -0
  219. package/dist/esm/CommandDialog/CommandDialog.stories.js.map +1 -0
  220. package/dist/esm/CommandDialog/index.d.ts +2 -0
  221. package/dist/esm/CommandDialog/index.d.ts.map +1 -0
  222. package/dist/esm/CommandDialog/index.js +2 -0
  223. package/dist/esm/CommandDialog/index.js.map +1 -0
  224. package/dist/esm/CommandForm/CommandForm.d.ts +49 -0
  225. package/dist/esm/CommandForm/CommandForm.d.ts.map +1 -0
  226. package/dist/esm/CommandForm/CommandForm.js +174 -0
  227. package/dist/esm/CommandForm/CommandForm.js.map +1 -0
  228. package/dist/esm/CommandForm/CommandForm.stories.d.ts +7 -0
  229. package/dist/esm/CommandForm/CommandForm.stories.d.ts.map +1 -0
  230. package/dist/esm/CommandForm/CommandForm.stories.js +12 -0
  231. package/dist/esm/CommandForm/CommandForm.stories.js.map +1 -0
  232. package/dist/esm/CommandForm/CommandFormField.d.ts +18 -0
  233. package/dist/esm/CommandForm/CommandFormField.d.ts.map +1 -0
  234. package/dist/esm/CommandForm/CommandFormField.js +9 -0
  235. package/dist/esm/CommandForm/CommandFormField.js.map +1 -0
  236. package/dist/esm/CommandForm/CommandFormFields.d.ts +11 -0
  237. package/dist/esm/CommandForm/CommandFormFields.d.ts.map +1 -0
  238. package/dist/esm/CommandForm/CommandFormFields.js +65 -0
  239. package/dist/esm/CommandForm/CommandFormFields.js.map +1 -0
  240. package/dist/esm/CommandForm/DatePickerField.d.ts +20 -0
  241. package/dist/esm/CommandForm/DatePickerField.d.ts.map +1 -0
  242. package/dist/esm/CommandForm/DatePickerField.js +29 -0
  243. package/dist/esm/CommandForm/DatePickerField.js.map +1 -0
  244. package/dist/esm/CommandForm/DropdownField.d.ts +24 -0
  245. package/dist/esm/CommandForm/DropdownField.d.ts.map +1 -0
  246. package/dist/esm/CommandForm/DropdownField.js +29 -0
  247. package/dist/esm/CommandForm/DropdownField.js.map +1 -0
  248. package/dist/esm/CommandForm/InputTextField.d.ts +20 -0
  249. package/dist/esm/CommandForm/InputTextField.d.ts.map +1 -0
  250. package/dist/esm/CommandForm/InputTextField.js +30 -0
  251. package/dist/esm/CommandForm/InputTextField.js.map +1 -0
  252. package/dist/esm/CommandForm/SliderField.d.ts +23 -0
  253. package/dist/esm/CommandForm/SliderField.d.ts.map +1 -0
  254. package/dist/esm/CommandForm/SliderField.js +32 -0
  255. package/dist/esm/CommandForm/SliderField.js.map +1 -0
  256. package/dist/esm/CommandForm/index.d.ts +8 -0
  257. package/dist/esm/CommandForm/index.d.ts.map +1 -0
  258. package/dist/esm/CommandForm/index.js +8 -0
  259. package/dist/esm/CommandForm/index.js.map +1 -0
  260. package/dist/esm/Common/ErrorBoundary.d.ts +16 -0
  261. package/dist/esm/Common/ErrorBoundary.d.ts.map +1 -0
  262. package/dist/esm/Common/ErrorBoundary.js +21 -0
  263. package/dist/esm/Common/ErrorBoundary.js.map +1 -0
  264. package/dist/esm/Common/ErrorBoundary.stories.d.ts +8 -0
  265. package/dist/esm/Common/ErrorBoundary.stories.d.ts.map +1 -0
  266. package/dist/esm/Common/ErrorBoundary.stories.js +6 -0
  267. package/dist/esm/Common/ErrorBoundary.stories.js.map +1 -0
  268. package/dist/esm/Common/FormElement.d.ts +6 -0
  269. package/dist/esm/Common/FormElement.d.ts.map +1 -0
  270. package/dist/esm/Common/FormElement.js +5 -0
  271. package/dist/esm/Common/FormElement.js.map +1 -0
  272. package/dist/esm/Common/FormElement.stories.d.ts +8 -0
  273. package/dist/esm/Common/FormElement.stories.d.ts.map +1 -0
  274. package/dist/esm/Common/FormElement.stories.js +6 -0
  275. package/dist/esm/Common/FormElement.stories.js.map +1 -0
  276. package/dist/esm/Common/Page.d.ts +8 -0
  277. package/dist/esm/Common/Page.d.ts.map +1 -0
  278. package/dist/esm/Common/Page.js +8 -0
  279. package/dist/esm/Common/Page.js.map +1 -0
  280. package/dist/esm/Common/Page.stories.d.ts +8 -0
  281. package/dist/esm/Common/Page.stories.d.ts.map +1 -0
  282. package/dist/esm/Common/Page.stories.js +6 -0
  283. package/dist/esm/Common/Page.stories.js.map +1 -0
  284. package/dist/esm/Common/index.d.ts +4 -0
  285. package/dist/esm/Common/index.d.ts.map +1 -0
  286. package/dist/esm/Common/index.js +4 -0
  287. package/dist/esm/Common/index.js.map +1 -0
  288. package/dist/esm/DataPage/DataPage.d.ts +41 -0
  289. package/dist/esm/DataPage/DataPage.d.ts.map +1 -0
  290. package/dist/esm/DataPage/DataPage.js +59 -0
  291. package/dist/esm/DataPage/DataPage.js.map +1 -0
  292. package/dist/esm/DataPage/DataPage.stories.d.ts +8 -0
  293. package/dist/esm/DataPage/DataPage.stories.d.ts.map +1 -0
  294. package/dist/esm/DataPage/DataPage.stories.js +6 -0
  295. package/dist/esm/DataPage/DataPage.stories.js.map +1 -0
  296. package/dist/esm/DataPage/index.d.ts +2 -0
  297. package/dist/esm/DataPage/index.d.ts.map +1 -0
  298. package/dist/esm/DataPage/index.js +2 -0
  299. package/dist/esm/DataPage/index.js.map +1 -0
  300. package/dist/esm/DataTables/DataTableForObservableQuery.d.ts +17 -0
  301. package/dist/esm/DataTables/DataTableForObservableQuery.d.ts.map +1 -0
  302. package/dist/esm/DataTables/DataTableForObservableQuery.js +15 -0
  303. package/dist/esm/DataTables/DataTableForObservableQuery.js.map +1 -0
  304. package/dist/esm/DataTables/DataTableForObservableQuery.stories.d.ts +8 -0
  305. package/dist/esm/DataTables/DataTableForObservableQuery.stories.d.ts.map +1 -0
  306. package/dist/esm/DataTables/DataTableForObservableQuery.stories.js +6 -0
  307. package/dist/esm/DataTables/DataTableForObservableQuery.stories.js.map +1 -0
  308. package/dist/esm/DataTables/DataTableForQuery.d.ts +17 -0
  309. package/dist/esm/DataTables/DataTableForQuery.d.ts.map +1 -0
  310. package/dist/esm/DataTables/DataTableForQuery.js +15 -0
  311. package/dist/esm/DataTables/DataTableForQuery.js.map +1 -0
  312. package/dist/esm/DataTables/DataTableForQuery.stories.d.ts +8 -0
  313. package/dist/esm/DataTables/DataTableForQuery.stories.d.ts.map +1 -0
  314. package/dist/esm/DataTables/DataTableForQuery.stories.js +6 -0
  315. package/dist/esm/DataTables/DataTableForQuery.stories.js.map +1 -0
  316. package/dist/esm/DataTables/index.d.ts +3 -0
  317. package/dist/esm/DataTables/index.d.ts.map +1 -0
  318. package/dist/esm/DataTables/index.js +3 -0
  319. package/dist/esm/DataTables/index.js.map +1 -0
  320. package/dist/esm/Dialogs/BusyIndicatorDialog.d.ts +3 -0
  321. package/dist/esm/Dialogs/BusyIndicatorDialog.d.ts.map +1 -0
  322. package/dist/esm/Dialogs/BusyIndicatorDialog.js +11 -0
  323. package/dist/esm/Dialogs/BusyIndicatorDialog.js.map +1 -0
  324. package/dist/esm/Dialogs/BusyIndicatorDialog.stories.d.ts +7 -0
  325. package/dist/esm/Dialogs/BusyIndicatorDialog.stories.d.ts.map +1 -0
  326. package/dist/esm/Dialogs/BusyIndicatorDialog.stories.js +15 -0
  327. package/dist/esm/Dialogs/BusyIndicatorDialog.stories.js.map +1 -0
  328. package/dist/esm/Dialogs/ConfirmationDialog.d.ts +2 -0
  329. package/dist/esm/Dialogs/ConfirmationDialog.d.ts.map +1 -0
  330. package/dist/esm/Dialogs/ConfirmationDialog.js +31 -0
  331. package/dist/esm/Dialogs/ConfirmationDialog.js.map +1 -0
  332. package/dist/esm/Dialogs/ConfirmationDialog.stories.d.ts +7 -0
  333. package/dist/esm/Dialogs/ConfirmationDialog.stories.d.ts.map +1 -0
  334. package/dist/esm/Dialogs/ConfirmationDialog.stories.js +20 -0
  335. package/dist/esm/Dialogs/ConfirmationDialog.stories.js.map +1 -0
  336. package/dist/esm/Dialogs/index.d.ts +3 -0
  337. package/dist/esm/Dialogs/index.d.ts.map +1 -0
  338. package/dist/esm/Dialogs/index.js +3 -0
  339. package/dist/esm/Dialogs/index.js.map +1 -0
  340. package/dist/esm/Dropdown/Dropdown.d.ts +5 -0
  341. package/dist/esm/Dropdown/Dropdown.d.ts.map +1 -0
  342. package/dist/esm/Dropdown/Dropdown.js +13 -0
  343. package/dist/esm/Dropdown/Dropdown.js.map +1 -0
  344. package/dist/esm/Dropdown/index.d.ts +2 -0
  345. package/dist/esm/Dropdown/index.d.ts.map +1 -0
  346. package/dist/esm/Dropdown/index.js +2 -0
  347. package/dist/esm/Dropdown/index.js.map +1 -0
  348. package/dist/esm/PivotViewer/PivotViewer.d.ts +4 -0
  349. package/dist/esm/PivotViewer/PivotViewer.d.ts.map +1 -0
  350. package/dist/esm/PivotViewer/PivotViewer.js +523 -0
  351. package/dist/esm/PivotViewer/PivotViewer.js.map +1 -0
  352. package/dist/esm/PivotViewer/PivotViewer.stories.d.ts +7 -0
  353. package/dist/esm/PivotViewer/PivotViewer.stories.d.ts.map +1 -0
  354. package/dist/esm/PivotViewer/PivotViewer.stories.js +12 -0
  355. package/dist/esm/PivotViewer/PivotViewer.stories.js.map +1 -0
  356. package/dist/esm/PivotViewer/components/AxisLabels.d.ts +13 -0
  357. package/dist/esm/PivotViewer/components/AxisLabels.d.ts.map +1 -0
  358. package/dist/esm/PivotViewer/components/AxisLabels.js +25 -0
  359. package/dist/esm/PivotViewer/components/AxisLabels.js.map +1 -0
  360. package/dist/esm/PivotViewer/components/DetailPanel.d.ts +6 -0
  361. package/dist/esm/PivotViewer/components/DetailPanel.d.ts.map +1 -0
  362. package/dist/esm/PivotViewer/components/DetailPanel.js +33 -0
  363. package/dist/esm/PivotViewer/components/DetailPanel.js.map +1 -0
  364. package/dist/esm/PivotViewer/components/FilterPanel.d.ts +27 -0
  365. package/dist/esm/PivotViewer/components/FilterPanel.d.ts.map +1 -0
  366. package/dist/esm/PivotViewer/components/FilterPanel.js +57 -0
  367. package/dist/esm/PivotViewer/components/FilterPanel.js.map +1 -0
  368. package/dist/esm/PivotViewer/components/FilterPanelContainer.d.ts +4 -0
  369. package/dist/esm/PivotViewer/components/FilterPanelContainer.d.ts.map +1 -0
  370. package/dist/esm/PivotViewer/components/FilterPanelContainer.js +9 -0
  371. package/dist/esm/PivotViewer/components/FilterPanelContainer.js.map +1 -0
  372. package/dist/esm/PivotViewer/components/PivotCanvas.d.ts +29 -0
  373. package/dist/esm/PivotViewer/components/PivotCanvas.d.ts.map +1 -0
  374. package/dist/esm/PivotViewer/components/PivotCanvas.js +373 -0
  375. package/dist/esm/PivotViewer/components/PivotCanvas.js.map +1 -0
  376. package/dist/esm/PivotViewer/components/PivotViewerMain.d.ts +43 -0
  377. package/dist/esm/PivotViewer/components/PivotViewerMain.d.ts.map +1 -0
  378. package/dist/esm/PivotViewer/components/PivotViewerMain.js +79 -0
  379. package/dist/esm/PivotViewer/components/PivotViewerMain.js.map +1 -0
  380. package/dist/esm/PivotViewer/components/RangeHistogramFilter.d.ts +11 -0
  381. package/dist/esm/PivotViewer/components/RangeHistogramFilter.d.ts.map +1 -0
  382. package/dist/esm/PivotViewer/components/RangeHistogramFilter.js +122 -0
  383. package/dist/esm/PivotViewer/components/RangeHistogramFilter.js.map +1 -0
  384. package/dist/esm/PivotViewer/components/Spinner.d.ts +3 -0
  385. package/dist/esm/PivotViewer/components/Spinner.d.ts.map +1 -0
  386. package/dist/esm/PivotViewer/components/Spinner.js +9 -0
  387. package/dist/esm/PivotViewer/components/Spinner.js.map +1 -0
  388. package/dist/esm/PivotViewer/components/Toolbar.d.ts +21 -0
  389. package/dist/esm/PivotViewer/components/Toolbar.d.ts.map +1 -0
  390. package/dist/esm/PivotViewer/components/Toolbar.js +10 -0
  391. package/dist/esm/PivotViewer/components/Toolbar.js.map +1 -0
  392. package/dist/esm/PivotViewer/components/ToolbarContainer.d.ts +4 -0
  393. package/dist/esm/PivotViewer/components/ToolbarContainer.d.ts.map +1 -0
  394. package/dist/esm/PivotViewer/components/ToolbarContainer.js +9 -0
  395. package/dist/esm/PivotViewer/components/ToolbarContainer.js.map +1 -0
  396. package/dist/esm/PivotViewer/components/index.d.ts +9 -0
  397. package/dist/esm/PivotViewer/components/index.d.ts.map +1 -0
  398. package/dist/esm/PivotViewer/components/index.js +8 -0
  399. package/dist/esm/PivotViewer/components/index.js.map +1 -0
  400. package/dist/esm/PivotViewer/components/pivot/animation.d.ts +29 -0
  401. package/dist/esm/PivotViewer/components/pivot/animation.d.ts.map +1 -0
  402. package/dist/esm/PivotViewer/components/pivot/animation.js +79 -0
  403. package/dist/esm/PivotViewer/components/pivot/animation.js.map +1 -0
  404. package/dist/esm/PivotViewer/components/pivot/buckets.d.ts +6 -0
  405. package/dist/esm/PivotViewer/components/pivot/buckets.d.ts.map +1 -0
  406. package/dist/esm/PivotViewer/components/pivot/buckets.js +102 -0
  407. package/dist/esm/PivotViewer/components/pivot/buckets.js.map +1 -0
  408. package/dist/esm/PivotViewer/components/pivot/colorResolver.d.ts +4 -0
  409. package/dist/esm/PivotViewer/components/pivot/colorResolver.d.ts.map +1 -0
  410. package/dist/esm/PivotViewer/components/pivot/colorResolver.js +61 -0
  411. package/dist/esm/PivotViewer/components/pivot/colorResolver.js.map +1 -0
  412. package/dist/esm/PivotViewer/components/pivot/constants.d.ts +38 -0
  413. package/dist/esm/PivotViewer/components/pivot/constants.d.ts.map +1 -0
  414. package/dist/esm/PivotViewer/components/pivot/constants.js +14 -0
  415. package/dist/esm/PivotViewer/components/pivot/constants.js.map +1 -0
  416. package/dist/esm/PivotViewer/components/pivot/sprites.d.ts +6 -0
  417. package/dist/esm/PivotViewer/components/pivot/sprites.d.ts.map +1 -0
  418. package/dist/esm/PivotViewer/components/pivot/sprites.js +203 -0
  419. package/dist/esm/PivotViewer/components/pivot/sprites.js.map +1 -0
  420. package/dist/esm/PivotViewer/components/pivot/visibility.d.ts +26 -0
  421. package/dist/esm/PivotViewer/components/pivot/visibility.d.ts.map +1 -0
  422. package/dist/esm/PivotViewer/components/pivot/visibility.js +221 -0
  423. package/dist/esm/PivotViewer/components/pivot/visibility.js.map +1 -0
  424. package/dist/esm/PivotViewer/constants.d.ts +7 -0
  425. package/dist/esm/PivotViewer/constants.d.ts.map +1 -0
  426. package/dist/esm/PivotViewer/constants.js +9 -0
  427. package/dist/esm/PivotViewer/constants.js.map +1 -0
  428. package/dist/esm/PivotViewer/engine/layout.d.ts +3 -0
  429. package/dist/esm/PivotViewer/engine/layout.d.ts.map +1 -0
  430. package/dist/esm/PivotViewer/engine/layout.js +93 -0
  431. package/dist/esm/PivotViewer/engine/layout.js.map +1 -0
  432. package/dist/esm/PivotViewer/engine/pivot.worker.d.ts +2 -0
  433. package/dist/esm/PivotViewer/engine/pivot.worker.d.ts.map +1 -0
  434. package/dist/esm/PivotViewer/engine/pivot.worker.js +58 -0
  435. package/dist/esm/PivotViewer/engine/pivot.worker.js.map +1 -0
  436. package/dist/esm/PivotViewer/engine/store.d.ts +9 -0
  437. package/dist/esm/PivotViewer/engine/store.d.ts.map +1 -0
  438. package/dist/esm/PivotViewer/engine/store.js +328 -0
  439. package/dist/esm/PivotViewer/engine/store.js.map +1 -0
  440. package/dist/esm/PivotViewer/engine/types.d.ts +125 -0
  441. package/dist/esm/PivotViewer/engine/types.d.ts.map +1 -0
  442. package/dist/esm/PivotViewer/engine/types.js +2 -0
  443. package/dist/esm/PivotViewer/engine/types.js.map +1 -0
  444. package/dist/esm/PivotViewer/hooks/index.d.ts +11 -0
  445. package/dist/esm/PivotViewer/hooks/index.d.ts.map +1 -0
  446. package/dist/esm/PivotViewer/hooks/index.js +11 -0
  447. package/dist/esm/PivotViewer/hooks/index.js.map +1 -0
  448. package/dist/esm/PivotViewer/hooks/useContainerDimensions.d.ts +5 -0
  449. package/dist/esm/PivotViewer/hooks/useContainerDimensions.d.ts.map +1 -0
  450. package/dist/esm/PivotViewer/hooks/useContainerDimensions.js +28 -0
  451. package/dist/esm/PivotViewer/hooks/useContainerDimensions.js.map +1 -0
  452. package/dist/esm/PivotViewer/hooks/useDimensionState.d.ts +11 -0
  453. package/dist/esm/PivotViewer/hooks/useDimensionState.d.ts.map +1 -0
  454. package/dist/esm/PivotViewer/hooks/useDimensionState.js +41 -0
  455. package/dist/esm/PivotViewer/hooks/useDimensionState.js.map +1 -0
  456. package/dist/esm/PivotViewer/hooks/useFilterOptions.d.ts +12 -0
  457. package/dist/esm/PivotViewer/hooks/useFilterOptions.d.ts.map +1 -0
  458. package/dist/esm/PivotViewer/hooks/useFilterOptions.js +22 -0
  459. package/dist/esm/PivotViewer/hooks/useFilterOptions.js.map +1 -0
  460. package/dist/esm/PivotViewer/hooks/useFilterPanelDrag.d.ts +9 -0
  461. package/dist/esm/PivotViewer/hooks/useFilterPanelDrag.d.ts.map +1 -0
  462. package/dist/esm/PivotViewer/hooks/useFilterPanelDrag.js +42 -0
  463. package/dist/esm/PivotViewer/hooks/useFilterPanelDrag.js.map +1 -0
  464. package/dist/esm/PivotViewer/hooks/useFilterState.d.ts +11 -0
  465. package/dist/esm/PivotViewer/hooks/useFilterState.d.ts.map +1 -0
  466. package/dist/esm/PivotViewer/hooks/useFilterState.js +94 -0
  467. package/dist/esm/PivotViewer/hooks/useFilterState.js.map +1 -0
  468. package/dist/esm/PivotViewer/hooks/useFilteredData.d.ts +9 -0
  469. package/dist/esm/PivotViewer/hooks/useFilteredData.d.ts.map +1 -0
  470. package/dist/esm/PivotViewer/hooks/useFilteredData.js +85 -0
  471. package/dist/esm/PivotViewer/hooks/useFilteredData.js.map +1 -0
  472. package/dist/esm/PivotViewer/hooks/usePanning.d.ts +10 -0
  473. package/dist/esm/PivotViewer/hooks/usePanning.d.ts.map +1 -0
  474. package/dist/esm/PivotViewer/hooks/usePanning.js +118 -0
  475. package/dist/esm/PivotViewer/hooks/usePanning.js.map +1 -0
  476. package/dist/esm/PivotViewer/hooks/usePivotEngine.d.ts +14 -0
  477. package/dist/esm/PivotViewer/hooks/usePivotEngine.d.ts.map +1 -0
  478. package/dist/esm/PivotViewer/hooks/usePivotEngine.js +180 -0
  479. package/dist/esm/PivotViewer/hooks/usePivotEngine.js.map +1 -0
  480. package/dist/esm/PivotViewer/hooks/useSelectedItem.d.ts +8 -0
  481. package/dist/esm/PivotViewer/hooks/useSelectedItem.d.ts.map +1 -0
  482. package/dist/esm/PivotViewer/hooks/useSelectedItem.js +322 -0
  483. package/dist/esm/PivotViewer/hooks/useSelectedItem.js.map +1 -0
  484. package/dist/esm/PivotViewer/hooks/useWheelZoom.d.ts +2 -0
  485. package/dist/esm/PivotViewer/hooks/useWheelZoom.d.ts.map +1 -0
  486. package/dist/esm/PivotViewer/hooks/useWheelZoom.js +91 -0
  487. package/dist/esm/PivotViewer/hooks/useWheelZoom.js.map +1 -0
  488. package/dist/esm/PivotViewer/hooks/useZoomState.d.ts +9 -0
  489. package/dist/esm/PivotViewer/hooks/useZoomState.d.ts.map +1 -0
  490. package/dist/esm/PivotViewer/hooks/useZoomState.js +29 -0
  491. package/dist/esm/PivotViewer/hooks/useZoomState.js.map +1 -0
  492. package/dist/esm/PivotViewer/index.d.ts +4 -0
  493. package/dist/esm/PivotViewer/index.d.ts.map +1 -0
  494. package/dist/esm/PivotViewer/index.js +2 -0
  495. package/dist/esm/PivotViewer/index.js.map +1 -0
  496. package/dist/esm/PivotViewer/types.d.ts +47 -0
  497. package/dist/esm/PivotViewer/types.d.ts.map +1 -0
  498. package/dist/esm/PivotViewer/types.js +2 -0
  499. package/dist/esm/PivotViewer/types.js.map +1 -0
  500. package/dist/esm/PivotViewer/utils/animations.d.ts +54 -0
  501. package/dist/esm/PivotViewer/utils/animations.d.ts.map +1 -0
  502. package/dist/esm/PivotViewer/utils/animations.js +139 -0
  503. package/dist/esm/PivotViewer/utils/animations.js.map +1 -0
  504. package/dist/esm/PivotViewer/utils/constants.d.ts +13 -0
  505. package/dist/esm/PivotViewer/utils/constants.d.ts.map +1 -0
  506. package/dist/esm/PivotViewer/utils/constants.js +7 -0
  507. package/dist/esm/PivotViewer/utils/constants.js.map +1 -0
  508. package/dist/esm/PivotViewer/utils/index.d.ts +4 -0
  509. package/dist/esm/PivotViewer/utils/index.d.ts.map +1 -0
  510. package/dist/esm/PivotViewer/utils/index.js +4 -0
  511. package/dist/esm/PivotViewer/utils/index.js.map +1 -0
  512. package/dist/esm/PivotViewer/utils/selection.d.ts +50 -0
  513. package/dist/esm/PivotViewer/utils/selection.d.ts.map +1 -0
  514. package/dist/esm/PivotViewer/utils/selection.js +134 -0
  515. package/dist/esm/PivotViewer/utils/selection.js.map +1 -0
  516. package/dist/esm/PivotViewer/utils/utils.d.ts +24 -0
  517. package/dist/esm/PivotViewer/utils/utils.d.ts.map +1 -0
  518. package/dist/esm/PivotViewer/utils/utils.js +138 -0
  519. package/dist/esm/PivotViewer/utils/utils.js.map +1 -0
  520. package/dist/esm/TimeMachine/EventsView.d.ts +9 -0
  521. package/dist/esm/TimeMachine/EventsView.d.ts.map +1 -0
  522. package/dist/esm/TimeMachine/EventsView.js +55 -0
  523. package/dist/esm/TimeMachine/EventsView.js.map +1 -0
  524. package/dist/esm/TimeMachine/EventsView.stories.d.ts +8 -0
  525. package/dist/esm/TimeMachine/EventsView.stories.d.ts.map +1 -0
  526. package/dist/esm/TimeMachine/EventsView.stories.js +6 -0
  527. package/dist/esm/TimeMachine/EventsView.stories.js.map +1 -0
  528. package/dist/esm/TimeMachine/Properties.d.ts +9 -0
  529. package/dist/esm/TimeMachine/Properties.d.ts.map +1 -0
  530. package/dist/esm/TimeMachine/Properties.js +56 -0
  531. package/dist/esm/TimeMachine/Properties.js.map +1 -0
  532. package/dist/esm/TimeMachine/Properties.stories.d.ts +8 -0
  533. package/dist/esm/TimeMachine/Properties.stories.d.ts.map +1 -0
  534. package/dist/esm/TimeMachine/Properties.stories.js +6 -0
  535. package/dist/esm/TimeMachine/Properties.stories.js.map +1 -0
  536. package/dist/esm/TimeMachine/ReadModelView.d.ts +12 -0
  537. package/dist/esm/TimeMachine/ReadModelView.d.ts.map +1 -0
  538. package/dist/esm/TimeMachine/ReadModelView.js +38 -0
  539. package/dist/esm/TimeMachine/ReadModelView.js.map +1 -0
  540. package/dist/esm/TimeMachine/ReadModelView.stories.d.ts +8 -0
  541. package/dist/esm/TimeMachine/ReadModelView.stories.d.ts.map +1 -0
  542. package/dist/esm/TimeMachine/ReadModelView.stories.js +6 -0
  543. package/dist/esm/TimeMachine/ReadModelView.stories.js.map +1 -0
  544. package/dist/esm/TimeMachine/TimeMachine.d.ts +12 -0
  545. package/dist/esm/TimeMachine/TimeMachine.d.ts.map +1 -0
  546. package/dist/esm/TimeMachine/TimeMachine.js +93 -0
  547. package/dist/esm/TimeMachine/TimeMachine.js.map +1 -0
  548. package/dist/esm/TimeMachine/TimeMachine.stories.d.ts +8 -0
  549. package/dist/esm/TimeMachine/TimeMachine.stories.d.ts.map +1 -0
  550. package/dist/esm/TimeMachine/TimeMachine.stories.js +6 -0
  551. package/dist/esm/TimeMachine/TimeMachine.stories.js.map +1 -0
  552. package/dist/esm/TimeMachine/index.d.ts +6 -0
  553. package/dist/esm/TimeMachine/index.d.ts.map +1 -0
  554. package/dist/esm/TimeMachine/index.js +5 -0
  555. package/dist/esm/TimeMachine/index.js.map +1 -0
  556. package/dist/esm/TimeMachine/types.d.ts +19 -0
  557. package/dist/esm/TimeMachine/types.d.ts.map +1 -0
  558. package/dist/esm/TimeMachine/types.js +2 -0
  559. package/dist/esm/TimeMachine/types.js.map +1 -0
  560. package/dist/esm/index.d.ts +10 -0
  561. package/dist/esm/index.d.ts.map +1 -0
  562. package/dist/esm/index.js +17 -0
  563. package/dist/esm/index.js.map +1 -0
  564. package/dist/esm/tsconfig.tsbuildinfo +1 -0
  565. package/dist/esm/useOverlayZIndex.d.ts +2 -0
  566. package/dist/esm/useOverlayZIndex.d.ts.map +1 -0
  567. package/dist/esm/useOverlayZIndex.js +22 -0
  568. package/dist/esm/useOverlayZIndex.js.map +1 -0
  569. package/dist/esm/vite.config.d.ts +3 -0
  570. package/dist/esm/vite.config.d.ts.map +1 -0
  571. package/dist/esm/vite.config.js +76 -0
  572. package/dist/esm/vite.config.js.map +1 -0
  573. package/global.d.ts +11 -0
  574. package/index.ts +22 -0
  575. package/package.json +160 -0
  576. package/useOverlayZIndex.ts +32 -0
  577. package/vite.config.ts +80 -0
@@ -0,0 +1,525 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
5
+ var usePivotEngine = require('./hooks/usePivotEngine.js');
6
+ var layout = require('./engine/layout.js');
7
+ var useFilterState = require('./hooks/useFilterState.js');
8
+ var useDimensionState = require('./hooks/useDimensionState.js');
9
+ var useZoomState = require('./hooks/useZoomState.js');
10
+ var selection = require('./utils/selection.js');
11
+ var animations = require('./utils/animations.js');
12
+ var constants = require('./constants.js');
13
+ var constants$1 = require('./utils/constants.js');
14
+ require('./PivotViewer.css');
15
+ var PivotViewerMain = require('./components/PivotViewerMain.js');
16
+ var FilterPanelContainer = require('./components/FilterPanelContainer.js');
17
+ var ToolbarContainer = require('./components/ToolbarContainer.js');
18
+ var useFilterOptions = require('./hooks/useFilterOptions.js');
19
+ var usePanning = require('./hooks/usePanning.js');
20
+ var useWheelZoom = require('./hooks/useWheelZoom.js');
21
+ require('react-dom');
22
+ var useContainerDimensions = require('./hooks/useContainerDimensions.js');
23
+
24
+ function PivotViewer({ data, dimensions, filters, defaultDimensionKey, cardRenderer, getItemId, searchFields, className, emptyContent, isLoading = false, }) {
25
+ const containerRef = React.useRef(null);
26
+ const filterButtonRef = React.useRef(null);
27
+ const axisLabelsRef = React.useRef(null);
28
+ const spacerRef = React.useRef(null);
29
+ const [search, setSearch] = React.useState('');
30
+ const [viewMode, setViewMode] = React.useState('collection');
31
+ const [filtersOpen, setFiltersOpen] = React.useState(false);
32
+ const [selectedItem, setSelectedItem] = React.useState(null);
33
+ const [isZooming, setIsZooming] = React.useState(false);
34
+ const [visibleIds, setVisibleIds] = React.useState(new Uint32Array(0));
35
+ const [grouping, setGrouping] = React.useState({ groups: [] });
36
+ const [hoveredGroupIndex, setHoveredGroupIndex] = React.useState(null);
37
+ const [preSelectionState, setPreSelectionState] = React.useState(null);
38
+ const [, setAnimationMode] = React.useState('layout');
39
+ const [scrollPosition, setScrollPosition] = React.useState({ x: 0, y: 0 });
40
+ const { filterState, rangeFilterState, expandedFilterKey, setExpandedFilterKey, handleToggleFilter, handleClearFilter, handleRangeChange, } = useFilterState.useFilterState(filters);
41
+ const { activeDimensionKey, setActiveDimensionKey, activeDimension, dimensionFilter, handleAxisLabelClick, } = useDimensionState.useDimensionState(dimensions, defaultDimensionKey);
42
+ const prevFilterStateRef = React.useRef(filterState);
43
+ const prevRangeFilterStateRef = React.useRef(rangeFilterState);
44
+ const prevSearchRef = React.useRef(search);
45
+ const prevDimensionRef = React.useRef(activeDimensionKey);
46
+ const prevViewModeRef = React.useRef(viewMode);
47
+ const isFirstRenderRef = React.useRef(true);
48
+ const { zoomLevel, setZoomLevel, handleZoomIn, handleZoomOut, handleZoomSlider, } = useZoomState.useZoomState(1);
49
+ const { isPanning, handlePanStart, handlePanMove, handlePanEnd, } = usePanning.usePanning(containerRef, undefined, setScrollPosition);
50
+ useWheelZoom.useWheelZoom(containerRef, zoomLevel, setZoomLevel);
51
+ const containerDimensions = useContainerDimensions.useContainerDimensions(containerRef, isLoading);
52
+ React.useEffect(() => {
53
+ const container = containerRef.current;
54
+ if (!container)
55
+ return;
56
+ const handleScroll = () => {
57
+ setScrollPosition({
58
+ x: container.scrollLeft,
59
+ y: container.scrollTop,
60
+ });
61
+ };
62
+ container.addEventListener('scroll', handleScroll);
63
+ return () => container.removeEventListener('scroll', handleScroll);
64
+ }, []);
65
+ React.useEffect(() => {
66
+ if (isFirstRenderRef.current) {
67
+ isFirstRenderRef.current = false;
68
+ return;
69
+ }
70
+ const filterChanged = prevFilterStateRef.current !== filterState;
71
+ const rangeChanged = prevRangeFilterStateRef.current !== rangeFilterState;
72
+ const searchChanged = prevSearchRef.current !== search;
73
+ const dimensionChanged = prevDimensionRef.current !== activeDimensionKey;
74
+ const viewModeChanged = prevViewModeRef.current !== viewMode;
75
+ if (filterChanged || rangeChanged || searchChanged) {
76
+ setAnimationMode('filter');
77
+ }
78
+ else if (dimensionChanged || viewModeChanged) {
79
+ setAnimationMode('layout');
80
+ }
81
+ prevFilterStateRef.current = filterState;
82
+ prevRangeFilterStateRef.current = rangeFilterState;
83
+ prevSearchRef.current = search;
84
+ prevDimensionRef.current = activeDimensionKey;
85
+ prevViewModeRef.current = viewMode;
86
+ }, [filterState, rangeFilterState, search, activeDimensionKey, viewMode]);
87
+ React.useEffect(() => {
88
+ const container = containerRef.current;
89
+ const axisLabels = axisLabelsRef.current;
90
+ if (!container || !axisLabels || viewMode !== 'grouped')
91
+ return;
92
+ const handleScroll = () => {
93
+ axisLabels.scrollLeft = container.scrollLeft;
94
+ };
95
+ handleScroll();
96
+ container.addEventListener('scroll', handleScroll);
97
+ return () => container.removeEventListener('scroll', handleScroll);
98
+ }, [viewMode]);
99
+ const fieldExtractors = React.useMemo(() => {
100
+ const extractors = new Map();
101
+ for (const dim of dimensions) {
102
+ extractors.set(dim.key, (item) => {
103
+ const val = dim.getValue(item);
104
+ if (val instanceof Date)
105
+ return val.getTime();
106
+ if (typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean' || val === null) {
107
+ return val;
108
+ }
109
+ return String(val);
110
+ });
111
+ }
112
+ if (filters) {
113
+ for (const filter of filters) {
114
+ extractors.set(filter.key, (item) => {
115
+ const val = filter.getValue(item);
116
+ if (val instanceof Date)
117
+ return val.getTime();
118
+ if (typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean' || val === null) {
119
+ return val;
120
+ }
121
+ return String(val);
122
+ });
123
+ }
124
+ }
125
+ return extractors;
126
+ }, [dimensions, filters]);
127
+ const indexFields = React.useMemo(() => {
128
+ const fields = new Set();
129
+ for (const dim of dimensions) {
130
+ fields.add(dim.key);
131
+ }
132
+ if (filters) {
133
+ for (const filter of filters) {
134
+ fields.add(filter.key);
135
+ }
136
+ }
137
+ return Array.from(fields);
138
+ }, [dimensions, filters]);
139
+ const { ready, applyFilters: engineApplyFilters, computeGrouping, sortIds } = usePivotEngine.usePivotEngine({
140
+ data,
141
+ fieldExtractors,
142
+ indexFields,
143
+ });
144
+ const currentFilters = React.useMemo(() => {
145
+ const specs = [];
146
+ const searchTerm = search.trim().toLowerCase();
147
+ if (searchTerm && searchFields && searchFields.length > 0) ;
148
+ for (const [key, values] of Object.entries(filterState)) {
149
+ const valueSet = values;
150
+ if (valueSet.size > 0) {
151
+ specs.push({
152
+ field: key,
153
+ type: 'categorical',
154
+ values: valueSet,
155
+ });
156
+ }
157
+ }
158
+ for (const [key, range] of Object.entries(rangeFilterState)) {
159
+ if (range && (range[0] !== null || range[1] !== null)) {
160
+ const min = range[0] ?? -Infinity;
161
+ const max = range[1] ?? Infinity;
162
+ specs.push({
163
+ field: key,
164
+ type: 'numeric',
165
+ range: { min, max },
166
+ });
167
+ }
168
+ }
169
+ if (dimensionFilter && activeDimension) {
170
+ specs.push({
171
+ field: activeDimension.key,
172
+ type: 'categorical',
173
+ values: new Set([dimensionFilter]),
174
+ });
175
+ }
176
+ return specs;
177
+ }, [filterState, rangeFilterState, search, searchFields, dimensionFilter, activeDimension]);
178
+ const currentGroupBy = React.useMemo(() => {
179
+ return {
180
+ field: activeDimensionKey || dimensions[0]?.key || '',
181
+ buckets: 10,
182
+ };
183
+ }, [activeDimensionKey, dimensions]);
184
+ React.useEffect(() => {
185
+ if (!ready)
186
+ return;
187
+ engineApplyFilters(currentFilters).then((result) => {
188
+ setVisibleIds(result.visibleIds);
189
+ });
190
+ }, [ready, currentFilters, engineApplyFilters]);
191
+ React.useEffect(() => {
192
+ if (!ready || visibleIds.length === 0) {
193
+ setGrouping({ groups: [] });
194
+ return;
195
+ }
196
+ if (viewMode === 'collection') {
197
+ if (activeDimensionKey) {
198
+ sortIds(visibleIds, activeDimensionKey).then((sortedIds) => {
199
+ setGrouping({
200
+ groups: [{
201
+ key: 'all',
202
+ label: 'All Items',
203
+ value: 'all',
204
+ ids: sortedIds,
205
+ count: sortedIds.length
206
+ }]
207
+ });
208
+ });
209
+ }
210
+ else {
211
+ setGrouping({
212
+ groups: [{
213
+ key: 'all',
214
+ label: 'All Items',
215
+ value: 'all',
216
+ ids: visibleIds,
217
+ count: visibleIds.length
218
+ }]
219
+ });
220
+ }
221
+ return;
222
+ }
223
+ computeGrouping(visibleIds, currentGroupBy).then((result) => {
224
+ setGrouping(result);
225
+ });
226
+ }, [ready, visibleIds, currentGroupBy, viewMode, computeGrouping, sortIds, activeDimensionKey]);
227
+ const layout$1 = React.useMemo(() => {
228
+ const cardWidth = constants.BASE_CARD_WIDTH;
229
+ const cardHeight = constants.BASE_CARD_HEIGHT;
230
+ const containerWidth = containerDimensions.width / zoomLevel;
231
+ const containerHeight = viewMode === 'collection'
232
+ ? containerDimensions.height / zoomLevel
233
+ : containerDimensions.height;
234
+ const result = layout.computeLayout(grouping, {
235
+ viewMode,
236
+ cardWidth,
237
+ cardHeight,
238
+ cardsPerColumn: constants.CARDS_PER_COLUMN,
239
+ groupSpacing: constants.GROUP_SPACING,
240
+ containerWidth,
241
+ containerHeight,
242
+ });
243
+ return result;
244
+ }, [grouping, viewMode, zoomLevel, containerDimensions.width, containerDimensions.height]);
245
+ const resolveId = React.useCallback((item, index) => {
246
+ if (getItemId) {
247
+ const id = getItemId(item, index);
248
+ return typeof id === 'number' ? id : index;
249
+ }
250
+ const id = item['id'];
251
+ return typeof id === 'number' ? id : index;
252
+ }, [getItemId]);
253
+ const lastProcessedViewMode = React.useRef(viewMode);
254
+ const lastProcessedGrouping = React.useRef(grouping);
255
+ React.useEffect(() => {
256
+ const viewModeChanged = lastProcessedViewMode.current !== viewMode;
257
+ const groupingChanged = lastProcessedGrouping.current !== grouping;
258
+ if (!viewModeChanged && !groupingChanged)
259
+ return;
260
+ lastProcessedViewMode.current = viewMode;
261
+ lastProcessedGrouping.current = grouping;
262
+ const container = containerRef.current;
263
+ if (!container)
264
+ return;
265
+ if (selectedItem) {
266
+ let itemId = resolveId(selectedItem, 0);
267
+ if (typeof itemId === 'string' && !layout$1.positions.has(itemId)) {
268
+ const numId = Number(itemId);
269
+ if (!isNaN(numId) && layout$1.positions.has(numId))
270
+ itemId = numId;
271
+ }
272
+ else if (typeof itemId === 'number' && !layout$1.positions.has(itemId)) {
273
+ const strId = String(itemId);
274
+ if (layout$1.positions.has(strId))
275
+ itemId = strId;
276
+ }
277
+ const position = layout$1.positions.get(itemId);
278
+ if (position) {
279
+ const cardPosition = {
280
+ x: position.x,
281
+ y: position.y,
282
+ width: constants.BASE_CARD_WIDTH,
283
+ height: constants.BASE_CARD_HEIGHT
284
+ };
285
+ const detailWidth = viewMode === 'collection' ? 0 : constants$1.DETAIL_PANEL_WIDTH;
286
+ const { scrollLeft, scrollTop } = animations.calculateCenterScrollPosition(container, cardPosition, zoomLevel, detailWidth, layout$1.totalHeight);
287
+ container.scrollTo({ left: scrollLeft, top: scrollTop });
288
+ setPreSelectionState(null);
289
+ }
290
+ }
291
+ else if (viewMode === 'grouped') {
292
+ setTimeout(() => {
293
+ container.scrollTop = container.scrollHeight;
294
+ setScrollPosition({ x: container.scrollLeft, y: container.scrollTop });
295
+ }, 0);
296
+ }
297
+ }, [viewMode, grouping, layout$1, selectedItem, resolveId, zoomLevel]);
298
+ const handleCardClick = React.useCallback((item, e, id) => {
299
+ if (isPanning)
300
+ return;
301
+ const container = containerRef.current;
302
+ if (!container)
303
+ return;
304
+ let itemId = (id !== undefined && id !== null) ? id : resolveId(item, 0);
305
+ if (typeof itemId === 'string' && !layout$1.positions.has(itemId)) {
306
+ const numId = Number(itemId);
307
+ if (!isNaN(numId) && layout$1.positions.has(numId)) {
308
+ itemId = numId;
309
+ }
310
+ }
311
+ else if (typeof itemId === 'number' && !layout$1.positions.has(itemId)) {
312
+ const strId = String(itemId);
313
+ if (layout$1.positions.has(strId)) {
314
+ itemId = strId;
315
+ }
316
+ }
317
+ const selectedId = selectedItem ? (data.indexOf(selectedItem) !== -1 ? data.indexOf(selectedItem) : resolveId(selectedItem, 0)) : null;
318
+ const position = layout$1.positions.get(itemId);
319
+ const cardPosition = position ? {
320
+ x: position.x,
321
+ y: position.y,
322
+ width: constants.BASE_CARD_WIDTH,
323
+ height: constants.BASE_CARD_HEIGHT
324
+ } : null;
325
+ let targetCardPosition = null;
326
+ let getCardPositionAtZoom = undefined;
327
+ let targetTotalHeight = layout$1.totalHeight;
328
+ if (viewMode === 'grouped' && cardPosition) {
329
+ const targetZoom = Math.min(constants$1.ZOOM_MAX, Math.max(constants$1.MIN_ZOOM_ON_SELECT, zoomLevel * constants$1.ZOOM_MULTIPLIER));
330
+ const targetContainerWidth = containerDimensions.width / targetZoom;
331
+ const targetContainerHeight = containerDimensions.height;
332
+ const targetLayout = layout.computeLayout(grouping, {
333
+ viewMode,
334
+ cardWidth: constants.BASE_CARD_WIDTH,
335
+ cardHeight: constants.BASE_CARD_HEIGHT,
336
+ cardsPerColumn: constants.CARDS_PER_COLUMN,
337
+ groupSpacing: constants.GROUP_SPACING,
338
+ containerWidth: targetContainerWidth,
339
+ containerHeight: targetContainerHeight,
340
+ });
341
+ targetTotalHeight = targetLayout.totalHeight;
342
+ const targetPos = targetLayout.positions.get(itemId);
343
+ if (targetPos) {
344
+ targetCardPosition = {
345
+ x: targetPos.x,
346
+ y: targetPos.y,
347
+ width: constants.BASE_CARD_WIDTH,
348
+ height: constants.BASE_CARD_HEIGHT
349
+ };
350
+ }
351
+ getCardPositionAtZoom = (zoom) => {
352
+ const currentContainerWidth = containerDimensions.width / zoom;
353
+ const currentContainerHeight = containerDimensions.height;
354
+ const currentLayout = layout.computeLayout(grouping, {
355
+ viewMode,
356
+ cardWidth: constants.BASE_CARD_WIDTH,
357
+ cardHeight: constants.BASE_CARD_HEIGHT,
358
+ cardsPerColumn: constants.CARDS_PER_COLUMN,
359
+ groupSpacing: constants.GROUP_SPACING,
360
+ containerWidth: currentContainerWidth,
361
+ containerHeight: currentContainerHeight,
362
+ });
363
+ const pos = currentLayout.positions.get(itemId);
364
+ return pos ? { x: pos.x, y: pos.y, width: constants.BASE_CARD_WIDTH, height: constants.BASE_CARD_HEIGHT } : null;
365
+ };
366
+ }
367
+ const getLayoutSizeAtZoom = (zoom) => {
368
+ if (viewMode === 'collection') {
369
+ return { width: layout$1.totalWidth, height: layout$1.totalHeight };
370
+ }
371
+ const currentContainerWidth = containerDimensions.width / zoom;
372
+ const currentContainerHeight = containerDimensions.height;
373
+ const currentLayout = layout.computeLayout(grouping, {
374
+ viewMode,
375
+ cardWidth: constants.BASE_CARD_WIDTH,
376
+ cardHeight: constants.BASE_CARD_HEIGHT,
377
+ cardsPerColumn: constants.CARDS_PER_COLUMN,
378
+ groupSpacing: constants.GROUP_SPACING,
379
+ containerWidth: currentContainerWidth,
380
+ containerHeight: currentContainerHeight,
381
+ });
382
+ return { width: currentLayout.totalWidth, height: currentLayout.totalHeight };
383
+ };
384
+ selection.handleCardSelection({
385
+ item,
386
+ itemId,
387
+ selectedItemId: selectedId,
388
+ container,
389
+ cardPosition,
390
+ targetCardPosition,
391
+ getCardPositionAtZoom,
392
+ getLayoutSizeAtZoom,
393
+ spacer: spacerRef.current,
394
+ preSelectionState,
395
+ startScrollPosition: { x: scrollPosition.x, y: scrollPosition.y },
396
+ setZoomLevel,
397
+ setIsZooming,
398
+ setSelectedItem,
399
+ setPreSelectionState,
400
+ viewMode,
401
+ zoomLevel,
402
+ totalHeight: targetTotalHeight,
403
+ });
404
+ }, [isPanning, selectedItem, zoomLevel, preSelectionState, viewMode, resolveId, setZoomLevel, layout$1, grouping, containerDimensions, scrollPosition]);
405
+ const closeDetail = React.useCallback(() => {
406
+ const container = containerRef.current;
407
+ if (!container || !selectedItem) {
408
+ setSelectedItem(null);
409
+ return;
410
+ }
411
+ const index = data.indexOf(selectedItem);
412
+ let itemId = index !== -1 ? index : resolveId(selectedItem, 0);
413
+ if (typeof itemId === 'string' && !layout$1.positions.has(itemId)) {
414
+ const numId = Number(itemId);
415
+ if (!isNaN(numId) && layout$1.positions.has(numId)) {
416
+ itemId = numId;
417
+ }
418
+ }
419
+ else if (typeof itemId === 'number' && !layout$1.positions.has(itemId)) {
420
+ const strId = String(itemId);
421
+ if (layout$1.positions.has(strId)) {
422
+ itemId = strId;
423
+ }
424
+ }
425
+ const position = layout$1.positions.get(itemId);
426
+ const cardPosition = position ? {
427
+ x: position.x,
428
+ y: position.y,
429
+ width: constants.BASE_CARD_WIDTH,
430
+ height: constants.BASE_CARD_HEIGHT
431
+ } : null;
432
+ if (!preSelectionState) {
433
+ setSelectedItem(null);
434
+ return;
435
+ }
436
+ if (viewMode === 'collection') {
437
+ setSelectedItem(null);
438
+ animations.smoothScrollTo(container, preSelectionState.scrollLeft, preSelectionState.scrollTop, true);
439
+ setPreSelectionState(null);
440
+ return;
441
+ }
442
+ const zoomChanged = Math.abs(preSelectionState.zoom - zoomLevel) > 0.001;
443
+ if (!zoomChanged || !cardPosition) {
444
+ setSelectedItem(null);
445
+ animations.smoothScrollTo(container, preSelectionState.scrollLeft, preSelectionState.scrollTop, true);
446
+ setPreSelectionState(null);
447
+ return;
448
+ }
449
+ let targetCardPosition = null;
450
+ let getCardPositionAtZoom = undefined;
451
+ if (viewMode === 'grouped') {
452
+ const targetZoom = preSelectionState.zoom;
453
+ const targetContainerWidth = containerDimensions.width / targetZoom;
454
+ const targetContainerHeight = containerDimensions.height;
455
+ const targetLayout = layout.computeLayout(grouping, {
456
+ viewMode,
457
+ cardWidth: constants.BASE_CARD_WIDTH,
458
+ cardHeight: constants.BASE_CARD_HEIGHT,
459
+ cardsPerColumn: constants.CARDS_PER_COLUMN,
460
+ groupSpacing: constants.GROUP_SPACING,
461
+ containerWidth: targetContainerWidth,
462
+ containerHeight: targetContainerHeight,
463
+ });
464
+ const targetPos = targetLayout.positions.get(itemId);
465
+ if (targetPos) {
466
+ targetCardPosition = {
467
+ x: targetPos.x,
468
+ y: targetPos.y,
469
+ width: constants.BASE_CARD_WIDTH,
470
+ height: constants.BASE_CARD_HEIGHT
471
+ };
472
+ }
473
+ getCardPositionAtZoom = (zoom) => {
474
+ const currentContainerWidth = containerDimensions.width / zoom;
475
+ const currentContainerHeight = containerDimensions.height;
476
+ const currentLayout = layout.computeLayout(grouping, {
477
+ viewMode,
478
+ cardWidth: constants.BASE_CARD_WIDTH,
479
+ cardHeight: constants.BASE_CARD_HEIGHT,
480
+ cardsPerColumn: constants.CARDS_PER_COLUMN,
481
+ groupSpacing: constants.GROUP_SPACING,
482
+ containerWidth: currentContainerWidth,
483
+ containerHeight: currentContainerHeight,
484
+ });
485
+ const pos = currentLayout.positions.get(itemId);
486
+ return pos ? { x: pos.x, y: pos.y, width: constants.BASE_CARD_WIDTH, height: constants.BASE_CARD_HEIGHT } : null;
487
+ };
488
+ }
489
+ setIsZooming(true);
490
+ animations.animateZoomAndScroll({
491
+ container,
492
+ cardPosition,
493
+ targetCardPosition,
494
+ getCardPositionAtZoom,
495
+ startZoom: zoomLevel,
496
+ targetZoom: preSelectionState.zoom,
497
+ targetScrollLeft: preSelectionState.scrollLeft,
498
+ targetScrollTop: preSelectionState.scrollTop,
499
+ onUpdate: setZoomLevel,
500
+ onComplete: () => {
501
+ setIsZooming(false);
502
+ setSelectedItem(null);
503
+ setPreSelectionState(null);
504
+ },
505
+ });
506
+ }, [preSelectionState, selectedItem, zoomLevel, viewMode, resolveId, setZoomLevel, layout$1, grouping, containerDimensions]);
507
+ const cardWidth = constants.BASE_CARD_WIDTH;
508
+ const cardHeight = constants.BASE_CARD_HEIGHT;
509
+ const filterOptions = useFilterOptions.useFilterOptions(data, filters, filterState, rangeFilterState);
510
+ const hasFilters = Boolean(filters && filters.length > 0);
511
+ const activeFilterCount = Object.values(filterState).reduce((sum, vals) => sum + vals.size, 0) +
512
+ Object.values(rangeFilterState).filter(r => r !== null).length;
513
+ const viewerClassName = [
514
+ 'pivot-viewer',
515
+ className,
516
+ hasFilters ? (filtersOpen ? 'filters-open' : 'filters-closed') : 'no-filters',
517
+ viewMode === 'grouped' ? 'bucket-mode' : 'collection-mode',
518
+ ]
519
+ .filter(Boolean)
520
+ .join(' ');
521
+ return (jsxRuntime.jsxs("div", { className: viewerClassName, children: [jsxRuntime.jsx(FilterPanelContainer.FilterPanelContainer, { isOpen: filtersOpen && hasFilters, search: search, filterState: filterState, rangeFilterState: rangeFilterState, expandedFilterKey: expandedFilterKey, filterOptions: filterOptions, anchorRef: filterButtonRef, onClose: () => setFiltersOpen(false), onSearchChange: setSearch, onFilterToggle: handleToggleFilter, onFilterClear: handleClearFilter, onRangeChange: handleRangeChange, onExpandedFilterChange: setExpandedFilterKey }), jsxRuntime.jsxs("main", { className: "pv-main", children: [jsxRuntime.jsx(ToolbarContainer.ToolbarContainer, { hasFilters: hasFilters, filtersOpen: filtersOpen, filteredCount: visibleIds.length, viewMode: viewMode, zoomLevel: zoomLevel, activeDimensionKey: activeDimensionKey, dimensions: dimensions, activeFilterCount: activeFilterCount, onFiltersToggle: () => setFiltersOpen((prev) => !prev), onViewModeChange: setViewMode, onZoomIn: handleZoomIn, onZoomOut: handleZoomOut, onZoomSlider: handleZoomSlider, onDimensionChange: setActiveDimensionKey, filterButtonRef: filterButtonRef }), jsxRuntime.jsx(PivotViewerMain.PivotViewerMain, { data: data, ready: ready, isLoading: isLoading, visibleIds: visibleIds, grouping: grouping, layout: layout$1, cardWidth: cardWidth, cardHeight: cardHeight, zoomLevel: zoomLevel, scrollPosition: scrollPosition, containerDimensions: containerDimensions, selectedItem: selectedItem, hoveredGroupIndex: hoveredGroupIndex, isZooming: isZooming, viewMode: viewMode, cardRenderer: cardRenderer, resolveId: resolveId, emptyContent: emptyContent, dimensionFilter: dimensionFilter, onCardClick: handleCardClick, onPanStart: handlePanStart, onPanMove: handlePanMove, onPanEnd: handlePanEnd, onGroupHover: setHoveredGroupIndex, onAxisLabelClick: handleAxisLabelClick, onCloseDetail: closeDetail, containerRef: containerRef, axisLabelsRef: axisLabelsRef, spacerRef: spacerRef })] })] }));
522
+ }
523
+
524
+ exports.PivotViewer = PivotViewer;
525
+ //# sourceMappingURL=PivotViewer.js.map
@@ -0,0 +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 { FilterSpec, GroupSpec, FieldValue, GroupingResult, ItemId } 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 { handleCardSelection } from './utils/selection';\nimport { animateZoomAndScroll, smoothScrollTo } from './utils/animations';\nimport {\n BASE_CARD_WIDTH,\n BASE_CARD_HEIGHT,\n CARDS_PER_COLUMN,\n GROUP_SPACING,\n} from './constants';\nimport { ZOOM_MAX, MIN_ZOOM_ON_SELECT, ZOOM_MULTIPLIER, DETAIL_PANEL_WIDTH } from './utils/constants';\nimport { calculateCenterScrollPosition } from './utils/animations';\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';\n\nexport function PivotViewer<TItem extends object>({\n data,\n dimensions,\n filters,\n defaultDimensionKey,\n cardRenderer,\n getItemId,\n searchFields,\n className,\n emptyContent,\n isLoading = false,\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\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 // Track what type of change triggered the update (for animation mode)\n const prevFilterStateRef = useRef(filterState);\n const prevRangeFilterStateRef = useRef(rangeFilterState);\n const prevSearchRef = useRef(search);\n const prevDimensionRef = useRef(activeDimensionKey);\n const prevViewModeRef = useRef(viewMode);\n const isFirstRenderRef = useRef(true);\n\n // Zoom and pan hooks\n const {\n zoomLevel,\n setZoomLevel,\n handleZoomIn,\n handleZoomOut,\n handleZoomSlider,\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 // Zoom reset removed to persist zoom level across view changes\n\n\n // Track what type of change triggered the update for animation mode\n useEffect(() => {\n // Skip the first render\n if (isFirstRenderRef.current) {\n isFirstRenderRef.current = false;\n return;\n }\n\n const filterChanged = prevFilterStateRef.current !== filterState;\n const rangeChanged = prevRangeFilterStateRef.current !== rangeFilterState;\n const searchChanged = prevSearchRef.current !== search;\n const dimensionChanged = prevDimensionRef.current !== activeDimensionKey;\n const viewModeChanged = prevViewModeRef.current !== viewMode;\n\n // If filters or search changed, use filter animation (fade/scale)\n // If dimension or view mode changed, use layout animation (fly)\n if (filterChanged || rangeChanged || searchChanged) {\n setAnimationMode('filter');\n } else if (dimensionChanged || viewModeChanged) {\n setAnimationMode('layout');\n }\n\n prevFilterStateRef.current = filterState;\n prevRangeFilterStateRef.current = rangeFilterState;\n prevSearchRef.current = search;\n prevDimensionRef.current = activeDimensionKey;\n prevViewModeRef.current = viewMode;\n }, [filterState, rangeFilterState, search, activeDimensionKey, viewMode]);\n\n // Sync axis labels scroll with container scroll\n useEffect(() => {\n const container = containerRef.current;\n const axisLabels = axisLabelsRef.current;\n\n if (!container || !axisLabels || viewMode !== 'grouped') return;\n\n const handleScroll = () => {\n axisLabels.scrollLeft = container.scrollLeft;\n };\n\n // Sync immediately\n handleScroll();\n\n container.addEventListener('scroll', handleScroll);\n return () => container.removeEventListener('scroll', handleScroll);\n }, [viewMode]);\n\n // Build field extractors for the columnar store\n const fieldExtractors = useMemo(() => {\n const extractors = new Map<string, (item: TItem) => FieldValue>();\n\n for (const dim of dimensions) {\n extractors.set(dim.key, (item) => {\n const val = dim.getValue(item);\n if (val instanceof Date) return val.getTime();\n if (typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean' || val === null) {\n return val;\n }\n return String(val);\n });\n }\n\n if (filters) {\n for (const filter of filters) {\n extractors.set(filter.key, (item) => {\n const val = filter.getValue(item);\n if (val instanceof Date) return val.getTime();\n if (typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean' || val === null) {\n return val;\n }\n return String(val);\n });\n }\n }\n\n return extractors;\n }, [dimensions, filters]);\n\n const indexFields = useMemo(() => {\n const fields = new Set<string>();\n\n for (const dim of dimensions) {\n fields.add(dim.key);\n }\n\n if (filters) {\n for (const filter of filters) {\n fields.add(filter.key);\n }\n }\n\n return Array.from(fields);\n }, [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 = useMemo((): FilterSpec[] => {\n const specs: FilterSpec[] = [];\n\n // Search filter\n const searchTerm = search.trim().toLowerCase();\n if (searchTerm && searchFields && searchFields.length > 0) {\n // TODO: Implement search in worker\n // For now, search will be handled client-side after worker filtering\n }\n\n // Categorical filters\n for (const [key, values] of Object.entries(filterState)) {\n const valueSet = values as Set<string>;\n if (valueSet.size > 0) {\n specs.push({\n field: key,\n type: 'categorical',\n values: valueSet,\n });\n }\n }\n\n // Range filters\n for (const [key, range] of Object.entries(rangeFilterState)) {\n if (range && (range[0] !== null || range[1] !== null)) {\n const min = range[0] ?? -Infinity;\n const max = range[1] ?? Infinity;\n specs.push({\n field: key,\n type: 'numeric',\n range: { min, max },\n });\n }\n }\n\n // Dimension filter (bucket filter)\n if (dimensionFilter && activeDimension) {\n specs.push({\n field: activeDimension.key,\n type: 'categorical',\n values: new Set([dimensionFilter]),\n });\n }\n\n return specs;\n }, [filterState, rangeFilterState, search, searchFields, dimensionFilter, activeDimension]);\n\n const currentGroupBy = useMemo((): GroupSpec => {\n return {\n field: activeDimensionKey || dimensions[0]?.key || '',\n buckets: 10,\n };\n }, [activeDimensionKey, dimensions]);\n\n // Apply filters\n useEffect(() => {\n if (!ready) return;\n\n engineApplyFilters(currentFilters).then((result) => {\n setVisibleIds(result.visibleIds);\n });\n }, [ready, currentFilters, engineApplyFilters]);\n\n // Compute grouping\n useEffect(() => {\n if (!ready || visibleIds.length === 0) {\n setGrouping({ groups: [] });\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 return;\n }\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): ItemId => {\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 // Scroll positioning when switching view modes or grouping changes\n const lastProcessedViewMode = useRef(viewMode);\n const lastProcessedGrouping = useRef(grouping);\n\n useEffect(() => {\n const viewModeChanged = lastProcessedViewMode.current !== viewMode;\n const groupingChanged = lastProcessedGrouping.current !== grouping;\n\n if (!viewModeChanged && !groupingChanged) return;\n\n lastProcessedViewMode.current = viewMode;\n lastProcessedGrouping.current = grouping;\n\n const container = containerRef.current;\n if (!container) return;\n\n // If we have a selected item, we want to keep it centered in the new layout\n if (selectedItem) {\n // Resolve ID\n let itemId = resolveId(selectedItem, 0);\n\n // Ensure ID type matches layout\n if (typeof itemId === 'string' && !layout.positions.has(itemId)) {\n const numId = Number(itemId);\n if (!isNaN(numId) && layout.positions.has(numId)) itemId = numId;\n } else if (typeof itemId === 'number' && !layout.positions.has(itemId)) {\n const strId = String(itemId);\n if (layout.positions.has(strId)) itemId = strId;\n }\n\n const position = layout.positions.get(itemId);\n if (position) {\n const cardPosition = {\n x: position.x,\n y: position.y,\n width: BASE_CARD_WIDTH,\n height: BASE_CARD_HEIGHT\n };\n\n const detailWidth = viewMode === 'collection' ? 0 : DETAIL_PANEL_WIDTH;\n\n const { scrollLeft, scrollTop } = calculateCenterScrollPosition(\n container,\n cardPosition,\n zoomLevel,\n detailWidth,\n layout.totalHeight\n );\n\n container.scrollTo({ left: scrollLeft, top: scrollTop });\n\n // Clear pre-selection state as we've moved to a new context\n setPreSelectionState(null);\n }\n } else if (viewMode === 'grouped') {\n // Default behavior for grouped view: scroll to bottom\n // Use a small timeout to ensure the spacer has been resized\n setTimeout(() => {\n container.scrollTop = container.scrollHeight;\n // Sync scroll position state immediately to avoid stale values on first click\n setScrollPosition({ x: container.scrollLeft, y: container.scrollTop });\n }, 0);\n }\n }, [viewMode, grouping, layout, selectedItem, resolveId, zoomLevel]);\n\n const handleCardClick = useCallback((item: TItem, e: MouseEvent, id?: number | string) => {\n if (isPanning) return;\n\n const container = containerRef.current;\n if (!container) return;\n\n // Use the passed ID (index) if available, otherwise fallback to resolveId\n // Note: resolveId might be unreliable for looking up layout positions if IDs are strings\n let itemId = (id !== undefined && id !== null) ? id : resolveId(item, 0);\n\n // Ensure itemId matches layout keys type (number vs string)\n // If layout has number keys and itemId is string, try converting\n if (typeof itemId === 'string' && !layout.positions.has(itemId)) {\n const numId = Number(itemId);\n if (!isNaN(numId) && layout.positions.has(numId)) {\n itemId = numId;\n }\n } else if (typeof itemId === 'number' && !layout.positions.has(itemId)) {\n const strId = String(itemId);\n if (layout.positions.has(strId)) {\n itemId = strId;\n }\n }\n\n const selectedId = selectedItem ? (data.indexOf(selectedItem) !== -1 ? data.indexOf(selectedItem) : resolveId(selectedItem, 0)) : null;\n\n // Get card position from layout\n const position = layout.positions.get(itemId);\n\n const cardPosition = position ? {\n x: position.x,\n y: position.y,\n width: BASE_CARD_WIDTH,\n height: BASE_CARD_HEIGHT\n } : null;\n\n // Calculate target position for animation\n let targetCardPosition: { x: number; y: number; width: number; height: number } | null = null;\n let getCardPositionAtZoom: ((zoom: number) => { x: number; y: number; width: number; height: number } | null) | undefined = undefined;\n let targetTotalHeight = layout.totalHeight;\n\n if (viewMode === 'grouped' && cardPosition) {\n // Calculate target zoom (logic duplicated from zoomAndCenterCard)\n const targetZoom = Math.min(ZOOM_MAX, Math.max(MIN_ZOOM_ON_SELECT, zoomLevel * ZOOM_MULTIPLIER));\n\n // Calculate target layout\n const targetContainerWidth = containerDimensions.width / targetZoom;\n // For grouped mode, use fixed container height to ensure stable layout during zoom\n const targetContainerHeight = containerDimensions.height;\n\n const targetLayout = computeLayout(grouping, {\n viewMode,\n cardWidth: BASE_CARD_WIDTH,\n cardHeight: BASE_CARD_HEIGHT,\n cardsPerColumn: CARDS_PER_COLUMN,\n groupSpacing: GROUP_SPACING,\n containerWidth: targetContainerWidth,\n containerHeight: targetContainerHeight,\n });\n\n targetTotalHeight = targetLayout.totalHeight;\n\n const targetPos = targetLayout.positions.get(itemId);\n if (targetPos) {\n targetCardPosition = {\n x: targetPos.x,\n y: targetPos.y,\n width: BASE_CARD_WIDTH,\n height: BASE_CARD_HEIGHT\n };\n }\n\n // Provide callback for accurate position during animation\n getCardPositionAtZoom = (zoom: number) => {\n const currentContainerWidth = containerDimensions.width / zoom;\n // For grouped mode, use fixed container height to ensure stable layout during zoom\n const currentContainerHeight = containerDimensions.height;\n\n const currentLayout = computeLayout(grouping, {\n viewMode,\n cardWidth: BASE_CARD_WIDTH,\n cardHeight: BASE_CARD_HEIGHT,\n cardsPerColumn: CARDS_PER_COLUMN,\n groupSpacing: GROUP_SPACING,\n containerWidth: currentContainerWidth,\n containerHeight: currentContainerHeight,\n });\n\n const pos = currentLayout.positions.get(itemId);\n return pos ? { x: pos.x, y: pos.y, width: BASE_CARD_WIDTH, height: BASE_CARD_HEIGHT } : null;\n };\n }\n\n // Callback to get layout size at a specific zoom level (for spacer updates)\n const getLayoutSizeAtZoom = (zoom: number) => {\n if (viewMode === 'collection') {\n return { width: layout.totalWidth, height: layout.totalHeight };\n }\n\n const currentContainerWidth = containerDimensions.width / zoom;\n // For grouped mode, use fixed container height to ensure stable layout during zoom\n const currentContainerHeight = containerDimensions.height;\n\n const currentLayout = computeLayout(grouping, {\n viewMode,\n cardWidth: BASE_CARD_WIDTH,\n cardHeight: BASE_CARD_HEIGHT,\n cardsPerColumn: CARDS_PER_COLUMN,\n groupSpacing: GROUP_SPACING,\n containerWidth: currentContainerWidth,\n containerHeight: currentContainerHeight,\n });\n\n return { width: currentLayout.totalWidth, height: currentLayout.totalHeight };\n };\n\n handleCardSelection({\n item,\n itemId,\n selectedItemId: selectedId,\n container,\n cardPosition,\n targetCardPosition,\n getCardPositionAtZoom,\n getLayoutSizeAtZoom,\n spacer: spacerRef.current,\n preSelectionState,\n startScrollPosition: { x: scrollPosition.x, y: scrollPosition.y },\n setZoomLevel,\n setIsZooming,\n setSelectedItem,\n setPreSelectionState,\n viewMode,\n zoomLevel,\n totalHeight: targetTotalHeight,\n });\n }, [isPanning, selectedItem, zoomLevel, preSelectionState, viewMode, resolveId, setZoomLevel, layout, grouping, containerDimensions, scrollPosition]);\n\n const closeDetail = useCallback(() => {\n const container = containerRef.current;\n if (!container || !selectedItem) {\n setSelectedItem(null);\n return;\n }\n\n // Try to find the index of the selected item in the data array\n // This is more reliable than resolveId for layout lookup\n const index = data.indexOf(selectedItem);\n let itemId: string | number = index !== -1 ? index : resolveId(selectedItem, 0);\n\n // Ensure itemId matches layout keys type (number vs string)\n if (typeof itemId === 'string' && !layout.positions.has(itemId)) {\n const numId = Number(itemId);\n if (!isNaN(numId) && layout.positions.has(numId)) {\n itemId = numId;\n }\n } else if (typeof itemId === 'number' && !layout.positions.has(itemId)) {\n const strId = String(itemId);\n if (layout.positions.has(strId)) {\n itemId = strId;\n }\n }\n\n // Get card position from layout\n const position = layout.positions.get(itemId);\n const cardPosition = position ? {\n x: position.x,\n y: position.y,\n width: BASE_CARD_WIDTH,\n height: BASE_CARD_HEIGHT\n } : null;\n\n if (!preSelectionState) {\n setSelectedItem(null);\n return;\n }\n\n // Collection mode: just scroll back\n if (viewMode === 'collection') {\n setSelectedItem(null);\n smoothScrollTo(container, preSelectionState.scrollLeft, preSelectionState.scrollTop, true);\n setPreSelectionState(null);\n return;\n }\n\n // Grouped mode: animate zoom out if zoom changed\n const zoomChanged = Math.abs(preSelectionState.zoom - zoomLevel) > 0.001;\n\n if (!zoomChanged || !cardPosition) {\n setSelectedItem(null);\n smoothScrollTo(container, preSelectionState.scrollLeft, preSelectionState.scrollTop, true);\n setPreSelectionState(null);\n return;\n }\n\n // Calculate target position for animation (zooming out)\n let targetCardPosition: { x: number; y: number; width: number; height: number } | null = null;\n let getCardPositionAtZoom: ((zoom: number) => { x: number; y: number; width: number; height: number } | null) | undefined = undefined;\n\n if (viewMode === 'grouped') {\n const targetZoom = preSelectionState.zoom;\n\n const targetContainerWidth = containerDimensions.width / targetZoom;\n // For grouped mode, use fixed container height to ensure stable layout during zoom\n const targetContainerHeight = containerDimensions.height;\n\n const targetLayout = computeLayout(grouping, {\n viewMode,\n cardWidth: BASE_CARD_WIDTH,\n cardHeight: BASE_CARD_HEIGHT,\n cardsPerColumn: CARDS_PER_COLUMN,\n groupSpacing: GROUP_SPACING,\n containerWidth: targetContainerWidth,\n containerHeight: targetContainerHeight,\n });\n\n const targetPos = targetLayout.positions.get(itemId);\n if (targetPos) {\n targetCardPosition = {\n x: targetPos.x,\n y: targetPos.y,\n width: BASE_CARD_WIDTH,\n height: BASE_CARD_HEIGHT\n };\n }\n\n // Provide callback for accurate position during animation\n getCardPositionAtZoom = (zoom: number) => {\n const currentContainerWidth = containerDimensions.width / zoom;\n // For grouped mode, use fixed container height to ensure stable layout during zoom\n const currentContainerHeight = containerDimensions.height;\n\n const currentLayout = computeLayout(grouping, {\n viewMode,\n cardWidth: BASE_CARD_WIDTH,\n cardHeight: BASE_CARD_HEIGHT,\n cardsPerColumn: CARDS_PER_COLUMN,\n groupSpacing: GROUP_SPACING,\n containerWidth: currentContainerWidth,\n containerHeight: currentContainerHeight,\n });\n\n const pos = currentLayout.positions.get(itemId);\n return pos ? { x: pos.x, y: pos.y, width: BASE_CARD_WIDTH, height: BASE_CARD_HEIGHT } : null;\n };\n }\n\n setIsZooming(true);\n\n animateZoomAndScroll({\n container,\n cardPosition,\n targetCardPosition,\n getCardPositionAtZoom,\n startZoom: zoomLevel,\n targetZoom: preSelectionState.zoom,\n targetScrollLeft: preSelectionState.scrollLeft,\n targetScrollTop: preSelectionState.scrollTop,\n onUpdate: setZoomLevel,\n onComplete: () => {\n setIsZooming(false);\n setSelectedItem(null);\n setPreSelectionState(null);\n },\n });\n }, [preSelectionState, selectedItem, zoomLevel, viewMode, resolveId, setZoomLevel, layout, grouping, containerDimensions]);\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' ? 'bucket-mode' : 'collection-mode',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={viewerClassName}>\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 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 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","useMemo","usePivotEngine","layout","BASE_CARD_WIDTH","BASE_CARD_HEIGHT","computeLayout","CARDS_PER_COLUMN","GROUP_SPACING","useCallback","DETAIL_PANEL_WIDTH","calculateCenterScrollPosition","ZOOM_MAX","MIN_ZOOM_ON_SELECT","ZOOM_MULTIPLIER","handleCardSelection","smoothScrollTo","animateZoomAndScroll","useFilterOptions","_jsxs","_jsx","FilterPanelContainer","ToolbarContainer","PivotViewerMain"],"mappings":"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"}