@cratis/components 1.5.0 → 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 (382) hide show
  1. package/dist/cjs/CommandDialog/CommandDialog.js +11 -4
  2. package/dist/cjs/CommandDialog/CommandDialog.js.map +1 -1
  3. package/dist/cjs/CommandDialog/StepperCommandDialog.js +23 -4
  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 +8 -2
  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 +11 -4
  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 +5 -4
  187. package/dist/esm/CommandDialog/StepperCommandDialog.d.ts.map +1 -1
  188. package/dist/esm/CommandDialog/StepperCommandDialog.js +23 -4
  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.d.ts +5 -3
  230. package/dist/esm/Dialogs/Dialog.d.ts.map +1 -1
  231. package/dist/esm/Dialogs/Dialog.js +8 -2
  232. package/dist/esm/Dialogs/Dialog.js.map +1 -1
  233. package/dist/esm/Dialogs/index.js +3 -0
  234. package/dist/esm/Dialogs/index.js.map +1 -1
  235. package/dist/esm/Dropdown/Dropdown.js +1 -0
  236. package/dist/esm/Dropdown/Dropdown.js.map +1 -1
  237. package/dist/esm/Dropdown/index.js +3 -0
  238. package/dist/esm/Dropdown/index.js.map +1 -1
  239. package/dist/esm/ObjectContentEditor/ObjectContentEditor.js.map +1 -1
  240. package/dist/esm/ObjectContentEditor/index.js +3 -0
  241. package/dist/esm/ObjectContentEditor/index.js.map +1 -1
  242. package/dist/esm/ObjectContentEditor/objectHelpers.js +6 -0
  243. package/dist/esm/ObjectContentEditor/objectHelpers.js.map +1 -1
  244. package/dist/esm/ObjectNavigationalBar/ObjectNavigationalBar.js.map +1 -1
  245. package/dist/esm/ObjectNavigationalBar/breadcrumbHelpers.js +6 -0
  246. package/dist/esm/ObjectNavigationalBar/breadcrumbHelpers.js.map +1 -1
  247. package/dist/esm/ObjectNavigationalBar/index.js +3 -0
  248. package/dist/esm/ObjectNavigationalBar/index.js.map +1 -1
  249. package/dist/esm/PivotViewer/PivotViewer.js +28 -0
  250. package/dist/esm/PivotViewer/PivotViewer.js.map +1 -1
  251. package/dist/esm/PivotViewer/components/AxisLabels.js +4 -0
  252. package/dist/esm/PivotViewer/components/AxisLabels.js.map +1 -1
  253. package/dist/esm/PivotViewer/components/DetailPanel.js.map +1 -1
  254. package/dist/esm/PivotViewer/components/FilterPanel.js +4 -0
  255. package/dist/esm/PivotViewer/components/FilterPanel.js.map +1 -1
  256. package/dist/esm/PivotViewer/components/FilterPanelContainer.js.map +1 -1
  257. package/dist/esm/PivotViewer/components/PivotCanvas.js +138 -2
  258. package/dist/esm/PivotViewer/components/PivotCanvas.js.map +1 -1
  259. package/dist/esm/PivotViewer/components/PivotViewerMain.js +4 -0
  260. package/dist/esm/PivotViewer/components/PivotViewerMain.js.map +1 -1
  261. package/dist/esm/PivotViewer/components/RangeHistogramFilter.js.map +1 -1
  262. package/dist/esm/PivotViewer/components/Spinner.js.map +1 -1
  263. package/dist/esm/PivotViewer/components/Toolbar.js.map +1 -1
  264. package/dist/esm/PivotViewer/components/ToolbarContainer.js.map +1 -1
  265. package/dist/esm/PivotViewer/components/pivot/animation.js +8 -1
  266. package/dist/esm/PivotViewer/components/pivot/animation.js.map +1 -1
  267. package/dist/esm/PivotViewer/components/pivot/colorResolver.js +3 -1
  268. package/dist/esm/PivotViewer/components/pivot/colorResolver.js.map +1 -1
  269. package/dist/esm/PivotViewer/components/pivot/constants.js +8 -5
  270. package/dist/esm/PivotViewer/components/pivot/constants.js.map +1 -1
  271. package/dist/esm/PivotViewer/components/pivot/groups.js +15 -0
  272. package/dist/esm/PivotViewer/components/pivot/groups.js.map +1 -1
  273. package/dist/esm/PivotViewer/components/pivot/sprites.js +19 -0
  274. package/dist/esm/PivotViewer/components/pivot/sprites.js.map +1 -1
  275. package/dist/esm/PivotViewer/components/pivot/visibility.js +102 -3
  276. package/dist/esm/PivotViewer/components/pivot/visibility.js.map +1 -1
  277. package/dist/esm/PivotViewer/constants.js +2 -0
  278. package/dist/esm/PivotViewer/constants.js.map +1 -1
  279. package/dist/esm/PivotViewer/engine/layout.js +23 -0
  280. package/dist/esm/PivotViewer/engine/layout.js.map +1 -1
  281. package/dist/esm/PivotViewer/engine/store.js +29 -0
  282. package/dist/esm/PivotViewer/engine/store.js.map +1 -1
  283. package/dist/esm/PivotViewer/hooks/useAnimationModeTracking.js +8 -0
  284. package/dist/esm/PivotViewer/hooks/useAnimationModeTracking.js.map +1 -1
  285. package/dist/esm/PivotViewer/hooks/useCardSelection.js +10 -1
  286. package/dist/esm/PivotViewer/hooks/useCardSelection.js.map +1 -1
  287. package/dist/esm/PivotViewer/hooks/useContainerDimensions.js +11 -0
  288. package/dist/esm/PivotViewer/hooks/useContainerDimensions.js.map +1 -1
  289. package/dist/esm/PivotViewer/hooks/useCurrentFilters.js +6 -0
  290. package/dist/esm/PivotViewer/hooks/useCurrentFilters.js.map +1 -1
  291. package/dist/esm/PivotViewer/hooks/useDetailPanelClose.js +11 -1
  292. package/dist/esm/PivotViewer/hooks/useDetailPanelClose.js.map +1 -1
  293. package/dist/esm/PivotViewer/hooks/useDimensionState.js +2 -0
  294. package/dist/esm/PivotViewer/hooks/useDimensionState.js.map +1 -1
  295. package/dist/esm/PivotViewer/hooks/useFieldExtractors.js +2 -0
  296. package/dist/esm/PivotViewer/hooks/useFieldExtractors.js.map +1 -1
  297. package/dist/esm/PivotViewer/hooks/useFilterOptions.js +2 -0
  298. package/dist/esm/PivotViewer/hooks/useFilterOptions.js.map +1 -1
  299. package/dist/esm/PivotViewer/hooks/useFilterState.js +5 -0
  300. package/dist/esm/PivotViewer/hooks/useFilterState.js.map +1 -1
  301. package/dist/esm/PivotViewer/hooks/usePanning.js +14 -0
  302. package/dist/esm/PivotViewer/hooks/usePanning.js.map +1 -1
  303. package/dist/esm/PivotViewer/hooks/usePivotEngine.js +7 -0
  304. package/dist/esm/PivotViewer/hooks/usePivotEngine.js.map +1 -1
  305. package/dist/esm/PivotViewer/hooks/useScrollSync.js +6 -0
  306. package/dist/esm/PivotViewer/hooks/useScrollSync.js.map +1 -1
  307. package/dist/esm/PivotViewer/hooks/useViewModeScrollHandling.js +9 -0
  308. package/dist/esm/PivotViewer/hooks/useViewModeScrollHandling.js.map +1 -1
  309. package/dist/esm/PivotViewer/hooks/useWheelZoom.js +8 -2
  310. package/dist/esm/PivotViewer/hooks/useWheelZoom.js.map +1 -1
  311. package/dist/esm/PivotViewer/hooks/useZoomState.js +2 -0
  312. package/dist/esm/PivotViewer/hooks/useZoomState.js.map +1 -1
  313. package/dist/esm/PivotViewer/index.js +3 -0
  314. package/dist/esm/PivotViewer/index.js.map +1 -1
  315. package/dist/esm/PivotViewer/types.js +11 -0
  316. package/dist/esm/PivotViewer/types.js.map +1 -1
  317. package/dist/esm/PivotViewer/utils/animations.js +35 -2
  318. package/dist/esm/PivotViewer/utils/animations.js.map +1 -1
  319. package/dist/esm/PivotViewer/utils/cardPosition.js +21 -3
  320. package/dist/esm/PivotViewer/utils/cardPosition.js.map +1 -1
  321. package/dist/esm/PivotViewer/utils/constants.js +3 -0
  322. package/dist/esm/PivotViewer/utils/constants.js.map +1 -1
  323. package/dist/esm/PivotViewer/utils/idResolution.js +16 -0
  324. package/dist/esm/PivotViewer/utils/idResolution.js.map +1 -1
  325. package/dist/esm/PivotViewer/utils/selection.js +25 -0
  326. package/dist/esm/PivotViewer/utils/selection.js.map +1 -1
  327. package/dist/esm/PivotViewer/utils/utils.js +5 -0
  328. package/dist/esm/PivotViewer/utils/utils.js.map +1 -1
  329. package/dist/esm/SchemaEditor/NameCell.js.map +1 -1
  330. package/dist/esm/SchemaEditor/SchemaEditor.js.map +1 -1
  331. package/dist/esm/SchemaEditor/TypeCell.js.map +1 -1
  332. package/dist/esm/SchemaEditor/index.js +3 -0
  333. package/dist/esm/SchemaEditor/index.js.map +1 -1
  334. package/dist/esm/SchemaEditor/schemaHelpers.js +8 -0
  335. package/dist/esm/SchemaEditor/schemaHelpers.js.map +1 -1
  336. package/dist/esm/TimeMachine/EventsView.js +2 -0
  337. package/dist/esm/TimeMachine/EventsView.js.map +1 -1
  338. package/dist/esm/TimeMachine/Properties.js.map +1 -1
  339. package/dist/esm/TimeMachine/ReadModelView.js +1 -0
  340. package/dist/esm/TimeMachine/ReadModelView.js.map +1 -1
  341. package/dist/esm/TimeMachine/TimeMachine.js +11 -1
  342. package/dist/esm/TimeMachine/TimeMachine.js.map +1 -1
  343. package/dist/esm/TimeMachine/index.js +3 -0
  344. package/dist/esm/TimeMachine/index.js.map +1 -1
  345. package/dist/esm/TimeMachine/propertiesHelpers.js +5 -0
  346. package/dist/esm/TimeMachine/propertiesHelpers.js.map +1 -1
  347. package/dist/esm/Toolbar/Toolbar.css +8 -0
  348. package/dist/esm/Toolbar/Toolbar.d.ts +3 -1
  349. package/dist/esm/Toolbar/Toolbar.d.ts.map +1 -1
  350. package/dist/esm/Toolbar/Toolbar.js +7 -1
  351. package/dist/esm/Toolbar/Toolbar.js.map +1 -1
  352. package/dist/esm/Toolbar/Toolbar.stories.d.ts +1 -0
  353. package/dist/esm/Toolbar/Toolbar.stories.d.ts.map +1 -1
  354. package/dist/esm/Toolbar/Toolbar.stories.js +23 -0
  355. package/dist/esm/Toolbar/Toolbar.stories.js.map +1 -1
  356. package/dist/esm/Toolbar/ToolbarButton.d.ts +4 -1
  357. package/dist/esm/Toolbar/ToolbarButton.d.ts.map +1 -1
  358. package/dist/esm/Toolbar/ToolbarButton.js +16 -2
  359. package/dist/esm/Toolbar/ToolbarButton.js.map +1 -1
  360. package/dist/esm/Toolbar/ToolbarContext.js +8 -0
  361. package/dist/esm/Toolbar/ToolbarContext.js.map +1 -1
  362. package/dist/esm/Toolbar/ToolbarDragContext.d.ts +7 -0
  363. package/dist/esm/Toolbar/ToolbarDragContext.d.ts.map +1 -0
  364. package/dist/esm/Toolbar/ToolbarDragContext.js +21 -0
  365. package/dist/esm/Toolbar/ToolbarDragContext.js.map +1 -0
  366. package/dist/esm/Toolbar/ToolbarFanOutItem.js +11 -0
  367. package/dist/esm/Toolbar/ToolbarFanOutItem.js.map +1 -1
  368. package/dist/esm/Toolbar/ToolbarSection.js +18 -1
  369. package/dist/esm/Toolbar/ToolbarSection.js.map +1 -1
  370. package/dist/esm/Toolbar/ToolbarSeparator.js +6 -0
  371. package/dist/esm/Toolbar/ToolbarSeparator.js.map +1 -1
  372. package/dist/esm/Toolbar/index.js +3 -0
  373. package/dist/esm/Toolbar/index.js.map +1 -1
  374. package/dist/esm/tailwind-utilities.css +16 -1
  375. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  376. package/dist/esm/types/TypeFormat.js +2 -0
  377. package/dist/esm/types/TypeFormat.js.map +1 -1
  378. package/dist/esm/types/index.js +3 -0
  379. package/dist/esm/types/index.js.map +1 -1
  380. package/dist/esm/useOverlayZIndex.js +10 -0
  381. package/dist/esm/useOverlayZIndex.js.map +1 -1
  382. package/package.json +8 -8
@@ -3,6 +3,8 @@
3
3
  var React = require('react');
4
4
  var utils = require('../utils/utils.js');
5
5
 
6
+ // Copyright (c) Cratis. All rights reserved.
7
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
6
8
  function useFilterOptions(data, filters, filterState, rangeFilterState) {
7
9
  return React.useMemo(() => {
8
10
  if (!filters?.length) {
@@ -1 +1 @@
1
- {"version":3,"file":"useFilterOptions.js","sources":["../../../../PivotViewer/hooks/useFilterOptions.ts"],"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 { useMemo } from 'react';\nimport type { PivotFilter, PivotFilterOption, PivotPrimitive } from '../types';\nimport { applyFilters, computeFilterOptions, computeNumericRange } from '../utils/utils';\nimport type { FilterState, RangeFilterState } from '../types';\n\nexport function useFilterOptions<TItem extends object>(\n data: TItem[],\n filters: PivotFilter<TItem>[] | undefined,\n filterState: FilterState,\n rangeFilterState: RangeFilterState\n) {\n return useMemo(() => {\n if (!filters?.length) {\n return [] as {\n filter: PivotFilter<TItem>;\n options: PivotFilterOption[];\n numericRange?: { min: number; max: number; values: PivotPrimitive[] };\n }[];\n }\n\n return filters.map((filter) => {\n const baseData = applyFilters(data, filters, filterState, rangeFilterState, filter.key);\n\n if (filter.type === 'number') {\n const numericRange = computeNumericRange(baseData, filter);\n return { filter, options: [], numericRange };\n }\n\n const options = computeFilterOptions(baseData, filter);\n return { filter, options };\n });\n }, [data, filters, filterState, rangeFilterState]);\n}\n"],"names":["useMemo","applyFilters","computeNumericRange","computeFilterOptions"],"mappings":";;;;;AAQM,SAAU,gBAAgB,CAC9B,IAAa,EACb,OAAyC,EACzC,WAAwB,EACxB,gBAAkC,EAAA;IAElC,OAAOA,aAAO,CAAC,MAAK;AAClB,QAAA,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE;AACpB,YAAA,OAAO,EAIJ;QACL;AAEA,QAAA,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,KAAI;AAC5B,YAAA,MAAM,QAAQ,GAAGC,kBAAY,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,CAAC,GAAG,CAAC;AAEvF,YAAA,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE;gBAC5B,MAAM,YAAY,GAAGC,yBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAC1D,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE;YAC9C;YAEA,MAAM,OAAO,GAAGC,0BAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC;AACtD,YAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;AAC5B,QAAA,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC;AACpD;;;;"}
1
+ {"version":3,"file":"useFilterOptions.js","sources":["../../../../PivotViewer/hooks/useFilterOptions.ts"],"sourcesContent":[null],"names":["useMemo","applyFilters","computeNumericRange","computeFilterOptions"],"mappings":";;;;;AAAA;AACA;AAOM,SAAU,gBAAgB,CAC9B,IAAa,EACb,OAAyC,EACzC,WAAwB,EACxB,gBAAkC,EAAA;IAElC,OAAOA,aAAO,CAAC,MAAK;AAClB,QAAA,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE;AACpB,YAAA,OAAO,EAIJ;QACL;AAEA,QAAA,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,KAAI;AAC5B,YAAA,MAAM,QAAQ,GAAGC,kBAAY,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,CAAC,GAAG,CAAC;AAEvF,YAAA,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE;gBAC5B,MAAM,YAAY,GAAGC,yBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAC1D,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE;YAC9C;YAEA,MAAM,OAAO,GAAGC,0BAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC;AACtD,YAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;AAC5B,QAAA,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC;AACpD;;;;"}
@@ -3,6 +3,11 @@
3
3
  var React = require('react');
4
4
  var utils = require('../utils/utils.js');
5
5
 
6
+ // Copyright (c) Cratis. All rights reserved.
7
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
8
+ /**
9
+ * Hook to manage filter state.
10
+ */
6
11
  function useFilterState(filters) {
7
12
  const [filterState, setFilterState] = React.useState(() => utils.buildFilterState(filters));
8
13
  const [rangeFilterState, setRangeFilterState] = React.useState(() => utils.buildRangeFilterState(filters));
@@ -1 +1 @@
1
- {"version":3,"file":"useFilterState.js","sources":["../../../../PivotViewer/hooks/useFilterState.ts"],"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 { useState, useEffect, useCallback } from 'react';\nimport { buildFilterState, buildRangeFilterState } from '../utils/utils';\nimport { FilterState, RangeFilterState, PivotFilter } from '../types';\n\n/**\n * Hook to manage filter state.\n */\nexport function useFilterState<TItem extends object>(\n filters: PivotFilter<TItem>[] | undefined\n) {\n const [filterState, setFilterState] = useState<FilterState>(() => buildFilterState(filters));\n const [rangeFilterState, setRangeFilterState] = useState<RangeFilterState>(() => buildRangeFilterState(filters));\n const [expandedFilterKey, setExpandedFilterKey] = useState<string | null>(filters?.[0]?.key ?? null);\n\n useEffect(() => {\n setFilterState((prev) => {\n const next = buildFilterState(filters);\n if (!filters) return next;\n\n filters.forEach((filter) => {\n if (prev[filter.key]) {\n next[filter.key] = new Set(prev[filter.key]);\n }\n });\n\n return next;\n });\n setRangeFilterState((prev) => {\n const next = buildRangeFilterState(filters);\n if (!filters) return next;\n filters.forEach((filter) => {\n if (filter.type === 'number' && filter.key in prev) {\n next[filter.key] = prev[filter.key];\n }\n });\n return next;\n });\n }, [filters]);\n\n useEffect(() => {\n if (!filters?.length) {\n setExpandedFilterKey(null);\n return;\n }\n\n setExpandedFilterKey((current) => {\n if (current && filters.some((filter) => filter.key === current)) {\n return current;\n }\n return filters[0]?.key ?? null;\n });\n }, [filters]);\n\n const handleToggleFilter = useCallback((filterKey: string, optionKey: string, multi: boolean | undefined) => {\n setFilterState((prev) => {\n const next: FilterState = { ...prev };\n const current = new Set(prev[filterKey] ?? []);\n\n if (multi) {\n if (current.has(optionKey)) {\n current.delete(optionKey);\n } else {\n current.add(optionKey);\n }\n } else {\n if (current.has(optionKey)) {\n current.clear();\n } else {\n current.clear();\n current.add(optionKey);\n }\n }\n\n next[filterKey] = current;\n return next;\n });\n }, []);\n\n const handleClearFilter = useCallback((filterKey: string) => {\n setFilterState((prev) => {\n const next: FilterState = { ...prev };\n next[filterKey] = new Set();\n return next;\n });\n }, []);\n\n const handleRangeChange = useCallback((filterKey: string, range: [number, number] | null) => {\n setRangeFilterState((prev) => ({\n ...prev,\n [filterKey]: range,\n }));\n }, []);\n\n return {\n filterState,\n rangeFilterState,\n expandedFilterKey,\n setExpandedFilterKey,\n handleToggleFilter,\n handleClearFilter,\n handleRangeChange,\n };\n}\n"],"names":["useState","buildFilterState","buildRangeFilterState","useEffect","useCallback"],"mappings":"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"}
1
+ {"version":3,"file":"useFilterState.js","sources":["../../../../PivotViewer/hooks/useFilterState.ts"],"sourcesContent":[null],"names":["useState","buildFilterState","buildRangeFilterState","useEffect","useCallback"],"mappings":"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"}
@@ -2,6 +2,8 @@
2
2
 
3
3
  var React = require('react');
4
4
 
5
+ // Copyright (c) Cratis. All rights reserved.
6
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
5
7
  function usePanning(containerRef, onBackgroundClick, onScrollChange) {
6
8
  const [isPanning, setIsPanning] = React.useState(false);
7
9
  const panStartRef = React.useRef(null);
@@ -22,6 +24,7 @@ function usePanning(containerRef, onBackgroundClick, onScrollChange) {
22
24
  return;
23
25
  stopInertia();
24
26
  const target = e.target;
27
+ // Check if explicitly on card (from Pixi) or via DOM (fallback)
25
28
  const isOnCard = isExplicitlyOnCard ?? !!target.closest('.pv-card');
26
29
  clickedOnBackgroundRef.current = !isOnCard;
27
30
  didDragRef.current = false;
@@ -46,21 +49,28 @@ function usePanning(containerRef, onBackgroundClick, onScrollChange) {
46
49
  return;
47
50
  const dx = e.clientX - panStart.x;
48
51
  const dy = e.clientY - panStart.y;
52
+ // Mark as dragged if moved more than 3 pixels
49
53
  if (Math.abs(dx) > 3 || Math.abs(dy) > 3) {
50
54
  didDragRef.current = true;
51
55
  }
56
+ // Camera moves opposite to drag direction
52
57
  const newCameraX = panStart.scrollLeft - dx;
53
58
  const newCameraY = panStart.scrollTop - dy;
59
+ // Update camera position
60
+ // Update container scroll directly so the visual camera follows the drag
54
61
  const container = containerRef.current;
55
62
  if (container) {
63
+ // Constrain scroll position to prevent viewing beyond content bounds
56
64
  const maxScrollLeft = Math.max(0, container.scrollWidth - container.clientWidth);
57
65
  const maxScrollTop = Math.max(0, container.scrollHeight - container.clientHeight);
58
66
  container.scrollLeft = Math.max(0, Math.min(maxScrollLeft, Math.round(newCameraX)));
59
67
  container.scrollTop = Math.max(0, Math.min(maxScrollTop, Math.round(newCameraY)));
60
68
  }
69
+ // Also notify parent about scroll change (keeps external state in sync)
61
70
  if (onScrollChange) {
62
71
  onScrollChange({ x: container ? container.scrollLeft : newCameraX, y: container ? container.scrollTop : newCameraY });
63
72
  }
73
+ // Track velocity for inertia
64
74
  const now = performance.now();
65
75
  const last = lastMouseRef.current;
66
76
  if (last) {
@@ -81,6 +91,7 @@ function usePanning(containerRef, onBackgroundClick, onScrollChange) {
81
91
  const velocity = { ...velocityRef.current };
82
92
  setIsPanning(false);
83
93
  panStartRef.current = null;
94
+ // If clicked on background and didn't drag, trigger deselect
84
95
  if (clickedOnBackgroundRef.current && !didDragRef.current && onBackgroundClick) ;
85
96
  if (!wasPanning) {
86
97
  return;
@@ -91,6 +102,7 @@ function usePanning(containerRef, onBackgroundClick, onScrollChange) {
91
102
  return;
92
103
  }
93
104
  const speed = Math.sqrt(velocity.x * velocity.x + velocity.y * velocity.y);
105
+ // Start inertia if moving fast enough
94
106
  if (speed > 0.3) {
95
107
  let vx = velocity.x * 16;
96
108
  let vy = velocity.y * 16;
@@ -100,10 +112,12 @@ function usePanning(containerRef, onBackgroundClick, onScrollChange) {
100
112
  inertiaAnimationRef.current = null;
101
113
  return;
102
114
  }
115
+ // Constrain scroll position to prevent viewing beyond content bounds
103
116
  const maxScrollLeft = Math.max(0, container.scrollWidth - container.clientWidth);
104
117
  const maxScrollTop = Math.max(0, container.scrollHeight - container.clientHeight);
105
118
  container.scrollLeft = Math.max(0, Math.min(maxScrollLeft, container.scrollLeft + vx));
106
119
  container.scrollTop = Math.max(0, Math.min(maxScrollTop, container.scrollTop + vy));
120
+ // Decay
107
121
  vx *= 0.95;
108
122
  vy *= 0.95;
109
123
  inertiaAnimationRef.current = requestAnimationFrame(animate);
@@ -1 +1 @@
1
- {"version":3,"file":"usePanning.js","sources":["../../../../PivotViewer/hooks/usePanning.ts"],"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 { useState, useRef, useCallback } from 'react';\n\nexport function usePanning(\n containerRef: React.RefObject<HTMLDivElement | null>,\n onBackgroundClick?: () => void,\n onScrollChange?: (scroll: { x: number; y: number }) => void\n) {\n const [isPanning, setIsPanning] = useState(false);\n const panStartRef = useRef<{ x: number; y: number; scrollLeft: number; scrollTop: number } | null>(null);\n const velocityRef = useRef({ x: 0, y: 0 });\n const lastMouseRef = useRef<{ x: number; y: number; time: number } | null>(null);\n const inertiaAnimationRef = useRef<number | null>(null);\n const didDragRef = useRef(false);\n const clickedOnBackgroundRef = useRef(false);\n\n const stopInertia = useCallback(() => {\n if (inertiaAnimationRef.current) {\n cancelAnimationFrame(inertiaAnimationRef.current);\n inertiaAnimationRef.current = null;\n }\n }, []);\n\n const handlePanStart = useCallback((e: React.MouseEvent | MouseEvent, isExplicitlyOnCard?: boolean) => {\n const container = containerRef.current;\n if (!container) return;\n\n stopInertia();\n\n const target = e.target as HTMLElement;\n // Check if explicitly on card (from Pixi) or via DOM (fallback)\n const isOnCard = isExplicitlyOnCard ?? !!target.closest('.pv-card');\n\n clickedOnBackgroundRef.current = !isOnCard;\n didDragRef.current = false;\n velocityRef.current = { x: 0, y: 0 };\n\n if (e.button === 1 || (e.button === 0 && (e.altKey || !isOnCard))) {\n if (!isOnCard) {\n e.preventDefault?.();\n }\n setIsPanning(true);\n panStartRef.current = {\n x: e.clientX,\n y: e.clientY,\n scrollLeft: container.scrollLeft,\n scrollTop: container.scrollTop,\n };\n lastMouseRef.current = { x: e.clientX, y: e.clientY, time: performance.now() };\n }\n }, [containerRef, stopInertia]);\n\n const handlePanMove = useCallback((e: React.MouseEvent | MouseEvent) => {\n const panStart = panStartRef.current;\n if (!isPanning || !panStart) return;\n\n const dx = e.clientX - panStart.x;\n const dy = e.clientY - panStart.y;\n\n // Mark as dragged if moved more than 3 pixels\n if (Math.abs(dx) > 3 || Math.abs(dy) > 3) {\n didDragRef.current = true;\n }\n\n // Camera moves opposite to drag direction\n const newCameraX = panStart.scrollLeft - dx;\n const newCameraY = panStart.scrollTop - dy;\n\n // Update camera position\n // Update container scroll directly so the visual camera follows the drag\n const container = containerRef.current;\n if (container) {\n // Constrain scroll position to prevent viewing beyond content bounds\n const maxScrollLeft = Math.max(0, container.scrollWidth - container.clientWidth);\n const maxScrollTop = Math.max(0, container.scrollHeight - container.clientHeight);\n \n container.scrollLeft = Math.max(0, Math.min(maxScrollLeft, Math.round(newCameraX)));\n container.scrollTop = Math.max(0, Math.min(maxScrollTop, Math.round(newCameraY)));\n }\n\n // Also notify parent about scroll change (keeps external state in sync)\n if (onScrollChange) {\n onScrollChange({ x: container ? container.scrollLeft : newCameraX, y: container ? container.scrollTop : newCameraY });\n }\n\n // Track velocity for inertia\n const now = performance.now();\n const last = lastMouseRef.current;\n if (last) {\n const dt = now - last.time;\n if (dt > 0 && dt < 50) {\n const instantVx = (last.x - e.clientX) / dt;\n const instantVy = (last.y - e.clientY) / dt;\n velocityRef.current = {\n x: velocityRef.current.x * 0.5 + instantVx * 0.5,\n y: velocityRef.current.y * 0.5 + instantVy * 0.5,\n };\n }\n }\n lastMouseRef.current = { x: e.clientX, y: e.clientY, time: now };\n }, [isPanning, containerRef, onScrollChange]);\n\n const handlePanEnd = useCallback(() => {\n const wasPanning = isPanning;\n const velocity = { ...velocityRef.current };\n\n setIsPanning(false);\n panStartRef.current = null;\n\n // If clicked on background and didn't drag, trigger deselect\n if (clickedOnBackgroundRef.current && !didDragRef.current && onBackgroundClick) {\n onBackgroundClick();\n }\n\n if (!wasPanning) {\n return;\n }\n\n const container = containerRef.current;\n if (!container) {\n lastMouseRef.current = null;\n return;\n }\n\n const speed = Math.sqrt(velocity.x * velocity.x + velocity.y * velocity.y);\n\n // Start inertia if moving fast enough\n if (speed > 0.3) {\n let vx = velocity.x * 16;\n let vy = velocity.y * 16;\n\n const animate = () => {\n const currentSpeed = Math.sqrt(vx * vx + vy * vy);\n\n if (currentSpeed < 0.5) {\n inertiaAnimationRef.current = null;\n return;\n }\n\n // Constrain scroll position to prevent viewing beyond content bounds\n const maxScrollLeft = Math.max(0, container.scrollWidth - container.clientWidth);\n const maxScrollTop = Math.max(0, container.scrollHeight - container.clientHeight);\n \n container.scrollLeft = Math.max(0, Math.min(maxScrollLeft, container.scrollLeft + vx));\n container.scrollTop = Math.max(0, Math.min(maxScrollTop, container.scrollTop + vy));\n\n // Decay\n vx *= 0.95;\n vy *= 0.95;\n\n inertiaAnimationRef.current = requestAnimationFrame(animate);\n };\n\n inertiaAnimationRef.current = requestAnimationFrame(animate);\n }\n\n lastMouseRef.current = null;\n }, [isPanning, containerRef, onBackgroundClick]);\n\n return {\n isPanning,\n handlePanStart,\n handlePanMove,\n handlePanEnd,\n };\n}\n\n\n\n"],"names":["useState","useRef","useCallback"],"mappings":"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"}
1
+ {"version":3,"file":"usePanning.js","sources":["../../../../PivotViewer/hooks/usePanning.ts"],"sourcesContent":[null],"names":["useState","useRef","useCallback"],"mappings":"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"}
@@ -4,6 +4,8 @@ var React = require('react');
4
4
  var store = require('../engine/store.js');
5
5
 
6
6
  var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
7
+ // Copyright (c) Cratis. All rights reserved.
8
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
7
9
  function usePivotEngine({ data, fieldExtractors, indexFields, }) {
8
10
  const [ready, setReady] = React.useState(false);
9
11
  const [workerAvailable, setWorkerAvailable] = React.useState(false);
@@ -130,6 +132,7 @@ function usePivotEngine({ data, fieldExtractors, indexFields, }) {
130
132
  }, [data, fieldExtractors, indexFields, workerAvailable]);
131
133
  const applyFiltersCallback = React.useCallback((filters) => {
132
134
  return new Promise((resolve) => {
135
+ // If worker is not available, use synchronous fallback using local indexes
133
136
  if (!workerRef.current || fallbackRef.current) {
134
137
  try {
135
138
  const store$1 = storeRef.current;
@@ -143,6 +146,7 @@ function usePivotEngine({ data, fieldExtractors, indexFields, }) {
143
146
  catch (e) {
144
147
  console.error('[PivotEngine] fallback applyFilters error:', e);
145
148
  }
149
+ // if fallback not possible, return empty result
146
150
  resolve({ visibleIds: new Uint32Array(0), count: 0 });
147
151
  return;
148
152
  }
@@ -155,10 +159,12 @@ function usePivotEngine({ data, fieldExtractors, indexFields, }) {
155
159
  });
156
160
  }, [ready]);
157
161
  const computeGroupingCallback = React.useCallback((visibleIds, groupBy) => {
162
+ // Check if there's already a pending grouping request
158
163
  if (pendingCallbacksRef.current.has('grouping')) {
159
164
  return Promise.resolve({ groups: [] });
160
165
  }
161
166
  return new Promise((resolve) => {
167
+ // synchronous fallback if worker unavailable
162
168
  if (!workerRef.current || fallbackRef.current) {
163
169
  try {
164
170
  const store$1 = storeRef.current;
@@ -186,6 +192,7 @@ function usePivotEngine({ data, fieldExtractors, indexFields, }) {
186
192
  }, [ready]);
187
193
  const sortIdsCallback = React.useCallback((visibleIds, sortBy) => {
188
194
  return new Promise((resolve) => {
195
+ // synchronous fallback if worker unavailable
189
196
  if (!workerRef.current || fallbackRef.current) {
190
197
  try {
191
198
  const store$1 = storeRef.current;
@@ -1 +1 @@
1
- {"version":3,"file":"usePivotEngine.js","sources":["../../../../PivotViewer/hooks/usePivotEngine.ts"],"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, useCallback } from 'react';\nimport type {\n PivotStore,\n PivotIndexes,\n FilterSpec,\n FilterResult,\n GroupSpec,\n GroupingResult,\n WorkerInMessage,\n WorkerOutMessage,\n FieldValue,\n} from '../engine/types';\nimport { buildStore, buildIndexes, applyFilters, computeGrouping, sortIds } from '../engine/store';\n\nexport interface UsePivotEngineOptions<TItem extends object> {\n data: TItem[];\n fieldExtractors: Map<string, (item: TItem) => FieldValue>;\n indexFields: string[];\n}\n\nexport interface UsePivotEngineResult {\n ready: boolean;\n applyFilters: (filters: FilterSpec[]) => Promise<FilterResult>;\n computeGrouping: (visibleIds: Uint32Array, groupBy: GroupSpec) => Promise<GroupingResult>;\n sortIds: (visibleIds: Uint32Array, sortBy: string) => Promise<Uint32Array>;\n}\n\nexport function usePivotEngine<TItem extends object>({\n data,\n fieldExtractors,\n indexFields,\n}: UsePivotEngineOptions<TItem>): UsePivotEngineResult {\n const [ready, setReady] = useState(false);\n const [workerAvailable, setWorkerAvailable] = useState(false);\n const workerRef = useRef<Worker | null>(null);\n const indexesRef = useRef<PivotIndexes | null>(null);\n const fallbackRef = useRef(false);\n const storeRef = useRef<PivotStore | null>(null);\n const pendingCallbacksRef = useRef<Map<string, (result: unknown) => void>>(new Map());\n\n useEffect(() => {\n if (typeof window === 'undefined' || typeof Worker === 'undefined') {\n fallbackRef.current = true;\n setWorkerAvailable(false);\n return;\n }\n\n const workerUrl = new URL('../engine/pivot.worker.js', import.meta.url);\n let disposed = false;\n\n const enableFallback = () => {\n fallbackRef.current = true;\n workerRef.current = null;\n setWorkerAvailable(false);\n };\n\n const setupWorker = async () => {\n try {\n if (typeof fetch === 'function') {\n const response = await fetch(workerUrl, { method: 'HEAD' });\n const contentType = response.headers.get('content-type') ?? '';\n\n if (!response.ok || !contentType.includes('javascript')) {\n enableFallback();\n return;\n }\n }\n } catch {\n enableFallback();\n return;\n }\n\n if (disposed) {\n return;\n }\n\n const worker = new Worker(workerUrl, { type: 'module' });\n\n workerRef.current = worker;\n setWorkerAvailable(true);\n\n worker.onmessage = (e: MessageEvent<WorkerOutMessage>) => {\n const message = e.data;\n\n switch (message.type) {\n case 'indexesReady':\n setReady(true);\n break;\n\n case 'filterResult': {\n const callback = pendingCallbacksRef.current.get('filter');\n if (callback) {\n callback(message.result);\n pendingCallbacksRef.current.delete('filter');\n }\n break;\n }\n\n case 'groupingResult': {\n const callback = pendingCallbacksRef.current.get('grouping');\n if (callback) {\n callback(message.result);\n pendingCallbacksRef.current.delete('grouping');\n }\n break;\n }\n\n case 'sortResult': {\n const callback = pendingCallbacksRef.current.get('sort');\n if (callback) {\n callback(message.result);\n pendingCallbacksRef.current.delete('sort');\n }\n break;\n }\n }\n };\n\n worker.onerror = (error) => {\n console.error('[PivotEngine] Worker error:', error);\n enableFallback();\n if (storeRef.current) {\n try {\n indexesRef.current = buildIndexes(storeRef.current, indexFields);\n } catch (e) {\n console.error('[PivotEngine] Failed to build indexes in fallback:', e);\n indexesRef.current = null;\n }\n setReady(true);\n }\n };\n };\n\n void setupWorker();\n\n return () => {\n disposed = true;\n workerRef.current?.terminate();\n workerRef.current = null;\n };\n }, [indexFields]);\n\n useEffect(() => {\n setReady(false);\n\n const store = buildStore(data, fieldExtractors);\n storeRef.current = store;\n\n try {\n indexesRef.current = buildIndexes(store, indexFields);\n } catch (e) {\n console.error('[PivotEngine] buildIndexes failed:', e);\n indexesRef.current = null;\n }\n\n if (workerRef.current && !fallbackRef.current) {\n const fieldsArray = Array.from(store.fields.entries());\n const serializableStore = {\n ...store,\n fields: fieldsArray,\n };\n\n const message: WorkerInMessage = {\n type: 'buildIndexes',\n store: serializableStore as unknown as PivotStore,\n fields: indexFields,\n };\n workerRef.current.postMessage(message);\n } else {\n setReady(true);\n }\n }, [data, fieldExtractors, indexFields, workerAvailable]);\n\n const applyFiltersCallback = useCallback(\n (filters: FilterSpec[]): Promise<FilterResult> => {\n return new Promise((resolve) => {\n // If worker is not available, use synchronous fallback using local indexes\n if (!workerRef.current || fallbackRef.current) {\n try {\n const store = storeRef.current;\n const indexes = indexesRef.current;\n if (store && indexes) {\n const result = applyFilters(store, indexes, filters);\n resolve(result);\n return;\n }\n } catch (e) {\n console.error('[PivotEngine] fallback applyFilters error:', e);\n }\n\n // if fallback not possible, return empty result\n resolve({ visibleIds: new Uint32Array(0), count: 0 });\n return;\n }\n\n pendingCallbacksRef.current.set('filter', resolve as (result: unknown) => void);\n\n const message: WorkerInMessage = {\n type: 'applyFilters',\n filters,\n };\n\n workerRef.current.postMessage(message);\n });\n },\n [ready]\n );\n\n const computeGroupingCallback = useCallback(\n (visibleIds: Uint32Array, groupBy: GroupSpec): Promise<GroupingResult> => {\n // Check if there's already a pending grouping request\n if (pendingCallbacksRef.current.has('grouping')) {\n return Promise.resolve({ groups: [] });\n }\n\n return new Promise((resolve) => {\n // synchronous fallback if worker unavailable\n if (!workerRef.current || fallbackRef.current) {\n try {\n const store = storeRef.current;\n const indexes = indexesRef.current;\n if (store && indexes) {\n const result = computeGrouping(store, indexes, visibleIds, groupBy);\n resolve(result);\n return;\n }\n } catch (e) {\n console.error('[PivotEngine] fallback computeGrouping error:', e);\n }\n\n resolve({ groups: [] });\n return;\n }\n\n pendingCallbacksRef.current.set('grouping', resolve as (result: unknown) => void);\n\n const message: WorkerInMessage = {\n type: 'computeGrouping',\n visibleIds,\n groupBy,\n };\n\n workerRef.current.postMessage(message);\n });\n },\n [ready]\n );\n\n const sortIdsCallback = useCallback(\n (visibleIds: Uint32Array, sortBy: string): Promise<Uint32Array> => {\n return new Promise((resolve) => {\n // synchronous fallback if worker unavailable\n if (!workerRef.current || fallbackRef.current) {\n try {\n const store = storeRef.current;\n if (store) {\n const result = sortIds(store, visibleIds, sortBy);\n resolve(result);\n return;\n }\n } catch (e) {\n console.error('[PivotEngine] fallback sortIds error:', e);\n }\n\n resolve(visibleIds);\n return;\n }\n\n pendingCallbacksRef.current.set('sort', resolve as (result: unknown) => void);\n\n const message: WorkerInMessage = {\n type: 'sort',\n ids: visibleIds,\n sortBy,\n };\n\n workerRef.current.postMessage(message);\n });\n },\n [ready]\n );\n\n return {\n ready,\n applyFilters: applyFiltersCallback,\n computeGrouping: computeGroupingCallback,\n sortIds: sortIdsCallback,\n };\n}\n"],"names":["useState","useRef","useEffect","buildIndexes","store","buildStore","useCallback","applyFilters","computeGrouping","sortIds"],"mappings":"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"}
1
+ {"version":3,"file":"usePivotEngine.js","sources":["../../../../PivotViewer/hooks/usePivotEngine.ts"],"sourcesContent":[null],"names":["useState","useRef","useEffect","buildIndexes","store","buildStore","useCallback","applyFilters","computeGrouping","sortIds"],"mappings":"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"}
@@ -2,6 +2,11 @@
2
2
 
3
3
  var React = require('react');
4
4
 
5
+ // Copyright (c) Cratis. All rights reserved.
6
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
7
+ /**
8
+ * Synchronizes axis labels scroll with container scroll
9
+ */
5
10
  function useScrollSync(containerRef, axisLabelsRef, viewMode) {
6
11
  React.useEffect(() => {
7
12
  const container = containerRef.current;
@@ -11,6 +16,7 @@ function useScrollSync(containerRef, axisLabelsRef, viewMode) {
11
16
  const handleScroll = () => {
12
17
  axisLabels.scrollLeft = container.scrollLeft;
13
18
  };
19
+ // Sync immediately
14
20
  handleScroll();
15
21
  container.addEventListener('scroll', handleScroll);
16
22
  return () => container.removeEventListener('scroll', handleScroll);
@@ -1 +1 @@
1
- {"version":3,"file":"useScrollSync.js","sources":["../../../../PivotViewer/hooks/useScrollSync.ts"],"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 } from 'react';\nimport type { ViewMode } from '../components/Toolbar';\n\n/**\n * Synchronizes axis labels scroll with container scroll\n */\nexport function useScrollSync(\n containerRef: React.RefObject<HTMLDivElement>,\n axisLabelsRef: React.RefObject<HTMLDivElement>,\n viewMode: ViewMode,\n) {\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, containerRef, axisLabelsRef]);\n}\n"],"names":["useEffect"],"mappings":";;;;SASgB,aAAa,CACzB,YAA6C,EAC7C,aAA8C,EAC9C,QAAkB,EAAA;IAElBA,eAAS,CAAC,MAAK;AACX,QAAA,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO;AACtC,QAAA,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO;QAExC,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,IAAI,QAAQ,KAAK,SAAS;YAAE;QAEzD,MAAM,YAAY,GAAG,MAAK;AACtB,YAAA,UAAU,CAAC,UAAU,GAAG,SAAS,CAAC,UAAU;AAChD,QAAA,CAAC;AAGD,QAAA,YAAY,EAAE;AAEd,QAAA,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC;QAClD,OAAO,MAAM,SAAS,CAAC,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC;IACtE,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;AAC/C;;;;"}
1
+ {"version":3,"file":"useScrollSync.js","sources":["../../../../PivotViewer/hooks/useScrollSync.ts"],"sourcesContent":[null],"names":["useEffect"],"mappings":";;;;AAAA;AACA;AAKA;;AAEG;SACa,aAAa,CACzB,YAA6C,EAC7C,aAA8C,EAC9C,QAAkB,EAAA;IAElBA,eAAS,CAAC,MAAK;AACX,QAAA,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO;AACtC,QAAA,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO;QAExC,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,IAAI,QAAQ,KAAK,SAAS;YAAE;QAEzD,MAAM,YAAY,GAAG,MAAK;AACtB,YAAA,UAAU,CAAC,UAAU,GAAG,SAAS,CAAC,UAAU;AAChD,QAAA,CAAC;;AAGD,QAAA,YAAY,EAAE;AAEd,QAAA,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC;QAClD,OAAO,MAAM,SAAS,CAAC,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC;IACtE,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;AAC/C;;;;"}
@@ -5,6 +5,11 @@ var animations = require('../utils/animations.js');
5
5
  var constants = require('../utils/constants.js');
6
6
  var idResolution = require('../utils/idResolution.js');
7
7
 
8
+ // Copyright (c) Cratis. All rights reserved.
9
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
10
+ /**
11
+ * Handles scroll positioning when switching view modes or grouping changes
12
+ */
8
13
  function useViewModeScrollHandling({ containerRef, viewMode, grouping, layout, selectedItem, zoomLevel, resolveId, data, setPreSelectionState, }) {
9
14
  const lastProcessedViewMode = React.useRef(viewMode);
10
15
  const lastProcessedGrouping = React.useRef(grouping);
@@ -18,6 +23,7 @@ function useViewModeScrollHandling({ containerRef, viewMode, grouping, layout, s
18
23
  const container = containerRef.current;
19
24
  if (!container)
20
25
  return;
26
+ // If we have a selected item, keep it centered in the new layout
21
27
  if (selectedItem) {
22
28
  const index = data.indexOf(selectedItem);
23
29
  let itemId = index !== -1 ? index : resolveId(selectedItem, 0);
@@ -31,6 +37,9 @@ function useViewModeScrollHandling({ containerRef, viewMode, grouping, layout, s
31
37
  }
32
38
  }
33
39
  else if (viewMode === 'grouped') {
40
+ // Default behavior for grouped view: scroll to bottom to see the cards
41
+ // which are laid out from bottom-to-top. Use layout.totalHeight which is
42
+ // the authoritative height in world units, converted back to pixels.
34
43
  const scrollToHeight = layout.totalHeight * zoomLevel - container.clientHeight;
35
44
  const targetScrollTop = Math.max(0, scrollToHeight);
36
45
  container.scrollTop = targetScrollTop;
@@ -1 +1 @@
1
- {"version":3,"file":"useViewModeScrollHandling.js","sources":["../../../../PivotViewer/hooks/useViewModeScrollHandling.ts"],"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 } from 'react';\nimport { calculateCenterScrollPosition } from '../utils/animations';\nimport type { Layout } from '../utils/cardPosition';\nimport type { ViewMode } from '../components/Toolbar';\nimport { BASE_CARD_WIDTH, BASE_CARD_HEIGHT, DETAIL_PANEL_WIDTH } from '../utils/constants';\nimport {\n getCardPositionFromLayout,\n normalizeIdToLayoutKey,\n} from '../utils/idResolution';\n\ninterface UseViewModeScrollHandlingParams<TItem extends object> {\n containerRef: React.RefObject<HTMLDivElement>;\n viewMode: ViewMode;\n grouping: unknown;\n layout: Layout;\n selectedItem: TItem | null;\n zoomLevel: number;\n resolveId: (item: TItem, index: number) => string | number;\n data: TItem[];\n setPreSelectionState: (state: null) => void;\n}\n\n/**\n * Handles scroll positioning when switching view modes or grouping changes\n */\nexport function useViewModeScrollHandling<TItem extends object>({\n containerRef,\n viewMode,\n grouping,\n layout,\n selectedItem,\n zoomLevel,\n resolveId,\n data,\n setPreSelectionState,\n}: UseViewModeScrollHandlingParams<TItem>) {\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, keep it centered in the new layout\n if (selectedItem) {\n const index = data.indexOf(selectedItem);\n let itemId: string | number = index !== -1 ? index : resolveId(selectedItem, 0);\n itemId = normalizeIdToLayoutKey(itemId, layout);\n\n const cardPosition = getCardPositionFromLayout(itemId, layout, BASE_CARD_WIDTH, BASE_CARD_HEIGHT);\n\n if (cardPosition) {\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 setPreSelectionState(null);\n }\n } else if (viewMode === 'grouped') {\n // Default behavior for grouped view: scroll to bottom to see the cards\n // which are laid out from bottom-to-top. Use layout.totalHeight which is\n // the authoritative height in world units, converted back to pixels.\n const scrollToHeight = layout.totalHeight * zoomLevel - container.clientHeight;\n const targetScrollTop = Math.max(0, scrollToHeight);\n container.scrollTop = targetScrollTop;\n container.scrollLeft = 0;\n }\n }, [viewMode, grouping, layout, selectedItem, resolveId, zoomLevel, containerRef, data, setPreSelectionState]);\n}\n"],"names":["useRef","useEffect","normalizeIdToLayoutKey","getCardPositionFromLayout","BASE_CARD_WIDTH","BASE_CARD_HEIGHT","DETAIL_PANEL_WIDTH","calculateCenterScrollPosition"],"mappings":";;;;;;;AA4BM,SAAU,yBAAyB,CAAuB,EAC5D,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,SAAS,EACT,SAAS,EACT,IAAI,EACJ,oBAAoB,GACiB,EAAA;AACrC,IAAA,MAAM,qBAAqB,GAAGA,YAAM,CAAC,QAAQ,CAAC;AAC9C,IAAA,MAAM,qBAAqB,GAAGA,YAAM,CAAC,QAAQ,CAAC;IAE9CC,eAAS,CAAC,MAAK;AACX,QAAA,MAAM,eAAe,GAAG,qBAAqB,CAAC,OAAO,KAAK,QAAQ;AAClE,QAAA,MAAM,eAAe,GAAG,qBAAqB,CAAC,OAAO,KAAK,QAAQ;AAElE,QAAA,IAAI,CAAC,eAAe,IAAI,CAAC,eAAe;YAAE;AAE1C,QAAA,qBAAqB,CAAC,OAAO,GAAG,QAAQ;AACxC,QAAA,qBAAqB,CAAC,OAAO,GAAG,QAAQ;AAExC,QAAA,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO;AACtC,QAAA,IAAI,CAAC,SAAS;YAAE;QAGhB,IAAI,YAAY,EAAE;YACd,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;AACxC,YAAA,IAAI,MAAM,GAAoB,KAAK,KAAK,EAAE,GAAG,KAAK,GAAG,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC;AAC/E,YAAA,MAAM,GAAGC,mCAAsB,CAAC,MAAM,EAAE,MAAM,CAAC;AAE/C,YAAA,MAAM,YAAY,GAAGC,sCAAyB,CAAC,MAAM,EAAE,MAAM,EAAEC,yBAAe,EAAEC,0BAAgB,CAAC;YAEjG,IAAI,YAAY,EAAE;AACd,gBAAA,MAAM,WAAW,GAAG,QAAQ,KAAK,YAAY,GAAG,CAAC,GAAGC,4BAAkB;gBAEtE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAGC,wCAA6B,CAC3D,SAAS,EACT,YAAY,EACZ,SAAS,EACT,WAAW,EACX,MAAM,CAAC,WAAW,CACrB;AAED,gBAAA,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;gBACxD,oBAAoB,CAAC,IAAI,CAAC;YAC9B;QACA;AAAO,aAAA,IAAI,QAAQ,KAAK,SAAS,EAAE;YAI/B,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC,YAAY;YAC9E,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC;AACnD,YAAA,SAAS,CAAC,SAAS,GAAG,eAAe;AACrC,YAAA,SAAS,CAAC,UAAU,GAAG,CAAC;QAChC;IACJ,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,oBAAoB,CAAC,CAAC;AAClH;;;;"}
1
+ {"version":3,"file":"useViewModeScrollHandling.js","sources":["../../../../PivotViewer/hooks/useViewModeScrollHandling.ts"],"sourcesContent":[null],"names":["useRef","useEffect","normalizeIdToLayoutKey","getCardPositionFromLayout","BASE_CARD_WIDTH","BASE_CARD_HEIGHT","DETAIL_PANEL_WIDTH","calculateCenterScrollPosition"],"mappings":";;;;;;;AAAA;AACA;AAwBA;;AAEG;AACG,SAAU,yBAAyB,CAAuB,EAC5D,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,SAAS,EACT,SAAS,EACT,IAAI,EACJ,oBAAoB,GACiB,EAAA;AACrC,IAAA,MAAM,qBAAqB,GAAGA,YAAM,CAAC,QAAQ,CAAC;AAC9C,IAAA,MAAM,qBAAqB,GAAGA,YAAM,CAAC,QAAQ,CAAC;IAE9CC,eAAS,CAAC,MAAK;AACX,QAAA,MAAM,eAAe,GAAG,qBAAqB,CAAC,OAAO,KAAK,QAAQ;AAClE,QAAA,MAAM,eAAe,GAAG,qBAAqB,CAAC,OAAO,KAAK,QAAQ;AAElE,QAAA,IAAI,CAAC,eAAe,IAAI,CAAC,eAAe;YAAE;AAE1C,QAAA,qBAAqB,CAAC,OAAO,GAAG,QAAQ;AACxC,QAAA,qBAAqB,CAAC,OAAO,GAAG,QAAQ;AAExC,QAAA,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO;AACtC,QAAA,IAAI,CAAC,SAAS;YAAE;;QAGhB,IAAI,YAAY,EAAE;YACd,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;AACxC,YAAA,IAAI,MAAM,GAAoB,KAAK,KAAK,EAAE,GAAG,KAAK,GAAG,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC;AAC/E,YAAA,MAAM,GAAGC,mCAAsB,CAAC,MAAM,EAAE,MAAM,CAAC;AAE/C,YAAA,MAAM,YAAY,GAAGC,sCAAyB,CAAC,MAAM,EAAE,MAAM,EAAEC,yBAAe,EAAEC,0BAAgB,CAAC;YAEjG,IAAI,YAAY,EAAE;AACd,gBAAA,MAAM,WAAW,GAAG,QAAQ,KAAK,YAAY,GAAG,CAAC,GAAGC,4BAAkB;gBAEtE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAGC,wCAA6B,CAC3D,SAAS,EACT,YAAY,EACZ,SAAS,EACT,WAAW,EACX,MAAM,CAAC,WAAW,CACrB;AAED,gBAAA,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;gBACxD,oBAAoB,CAAC,IAAI,CAAC;YAC9B;QACA;AAAO,aAAA,IAAI,QAAQ,KAAK,SAAS,EAAE;;;;YAI/B,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC,YAAY;YAC9E,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC;AACnD,YAAA,SAAS,CAAC,SAAS,GAAG,eAAe;AACrC,YAAA,SAAS,CAAC,UAAU,GAAG,CAAC;QAChC;IACJ,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,oBAAoB,CAAC,CAAC;AAClH;;;;"}
@@ -3,6 +3,8 @@
3
3
  var React = require('react');
4
4
  var utils = require('../utils/utils.js');
5
5
 
6
+ // Copyright (c) Cratis. All rights reserved.
7
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
6
8
  function useWheelZoom(containerRef, zoomLevel, setZoomLevel) {
7
9
  const handleWheel = React.useCallback((e) => {
8
10
  if (e.ctrlKey || e.metaKey) {
@@ -16,12 +18,16 @@ function useWheelZoom(containerRef, zoomLevel, setZoomLevel) {
16
18
  const cursorY = e.clientY - rect.top;
17
19
  const scrollX = container.scrollLeft;
18
20
  const scrollY = container.scrollTop;
21
+ // Normalize delta based on deltaMode:
22
+ // 0 = DOM_DELTA_PIXEL (trackpad pinch — deltaY is in pixels, small values)
23
+ // 1 = DOM_DELTA_LINE (mouse wheel — deltaY is in lines, typically 3)
24
+ // 2 = DOM_DELTA_PAGE (rare, treated same as pixel for safety)
19
25
  let factor;
20
26
  if (e.deltaMode === 1) {
21
- factor = 0.12;
27
+ factor = 0.12; // line-mode: each "line" gives a noticeable zoom step
22
28
  }
23
29
  else {
24
- factor = 0.01;
30
+ factor = 0.01; // pixel-mode (trackpad pinch) and page-mode: fast zoom step
25
31
  }
26
32
  const delta = -e.deltaY * factor;
27
33
  const newZoom = Math.max(utils.ZOOM_MIN, Math.min(utils.ZOOM_MAX, zoomLevel + delta));
@@ -1 +1 @@
1
- {"version":3,"file":"useWheelZoom.js","sources":["../../../../PivotViewer/hooks/useWheelZoom.ts"],"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 } from 'react';\nimport { ZOOM_MIN, ZOOM_MAX } from '../utils/utils';\n\nexport function useWheelZoom(\n containerRef: React.RefObject<HTMLDivElement | null>,\n zoomLevel: number,\n setZoomLevel: (zoom: number) => void\n) {\n const handleWheel = useCallback((e: WheelEvent) => {\n if (e.ctrlKey || e.metaKey) {\n e.preventDefault();\n\n const container = containerRef.current;\n if (!container) return;\n\n container.style.scrollBehavior = 'auto';\n\n const rect = container.getBoundingClientRect();\n const cursorX = e.clientX - rect.left;\n const cursorY = e.clientY - rect.top;\n const scrollX = container.scrollLeft;\n const scrollY = container.scrollTop;\n\n // Normalize delta based on deltaMode:\n // 0 = DOM_DELTA_PIXEL (trackpad pinch — deltaY is in pixels, small values)\n // 1 = DOM_DELTA_LINE (mouse wheel — deltaY is in lines, typically 3)\n // 2 = DOM_DELTA_PAGE (rare, treated same as pixel for safety)\n let factor: number;\n if (e.deltaMode === 1) {\n factor = 0.12; // line-mode: each \"line\" gives a noticeable zoom step\n } else {\n factor = 0.01; // pixel-mode (trackpad pinch) and page-mode: fast zoom step\n }\n const delta = -e.deltaY * factor;\n const newZoom = Math.max(ZOOM_MIN, Math.min(ZOOM_MAX, zoomLevel + delta));\n const zoomRatio = newZoom / zoomLevel;\n\n const newScrollLeft = (scrollX + cursorX) * zoomRatio - cursorX;\n const newScrollTop = (scrollY + cursorY) * zoomRatio - cursorY;\n\n setZoomLevel(newZoom);\n\n setTimeout(() => {\n container.scrollLeft = Math.max(0, newScrollLeft);\n container.scrollTop = Math.max(0, newScrollTop);\n setTimeout(() => {\n container.style.scrollBehavior = '';\n }, 50);\n }, 0);\n }\n }, [zoomLevel, setZoomLevel, containerRef]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n container.addEventListener('wheel', handleWheel, { passive: false });\n\n let lastTouchDistance = 0;\n let currentZoom = zoomLevel;\n\n const handleTouchStart = (e: TouchEvent) => {\n if (e.touches.length === 2) {\n const dx = e.touches[0].clientX - e.touches[1].clientX;\n const dy = e.touches[0].clientY - e.touches[1].clientY;\n lastTouchDistance = Math.sqrt(dx * dx + dy * dy);\n currentZoom = zoomLevel;\n }\n };\n\n const handleTouchMove = (e: TouchEvent) => {\n if (e.touches.length === 2) {\n e.preventDefault();\n const dx = e.touches[0].clientX - e.touches[1].clientX;\n const dy = e.touches[0].clientY - e.touches[1].clientY;\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n const centerX = (e.touches[0].clientX + e.touches[1].clientX) / 2;\n const centerY = (e.touches[0].clientY + e.touches[1].clientY) / 2;\n const rect = container.getBoundingClientRect();\n const cursorX = centerX - rect.left;\n const cursorY = centerY - rect.top;\n\n if (lastTouchDistance > 0) {\n const scale = distance / lastTouchDistance;\n const newZoom = Math.max(ZOOM_MIN, Math.min(ZOOM_MAX, currentZoom * scale));\n const zoomRatio = newZoom / zoomLevel;\n\n const contentX = container.scrollLeft + cursorX;\n const contentY = container.scrollTop + cursorY;\n\n const newScrollLeft = contentX * zoomRatio - cursorX;\n const newScrollTop = contentY * zoomRatio - cursorY;\n\n setZoomLevel(newZoom);\n\n requestAnimationFrame(() => {\n container.scrollLeft = Math.max(0, newScrollLeft);\n container.scrollTop = Math.max(0, newScrollTop);\n });\n }\n lastTouchDistance = distance;\n }\n };\n\n const handleTouchEnd = () => {\n lastTouchDistance = 0;\n };\n\n container.addEventListener('touchstart', handleTouchStart, { passive: true });\n container.addEventListener('touchmove', handleTouchMove, { passive: false });\n container.addEventListener('touchend', handleTouchEnd, { passive: true });\n\n return () => {\n container.removeEventListener('wheel', handleWheel);\n container.removeEventListener('touchstart', handleTouchStart);\n container.removeEventListener('touchmove', handleTouchMove);\n container.removeEventListener('touchend', handleTouchEnd);\n };\n }, [handleWheel, zoomLevel, setZoomLevel, containerRef]);\n}\n"],"names":["useCallback","ZOOM_MIN","ZOOM_MAX","useEffect"],"mappings":"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"}
1
+ {"version":3,"file":"useWheelZoom.js","sources":["../../../../PivotViewer/hooks/useWheelZoom.ts"],"sourcesContent":[null],"names":["useCallback","ZOOM_MIN","ZOOM_MAX","useEffect"],"mappings":"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"}
@@ -3,6 +3,8 @@
3
3
  var React = require('react');
4
4
  var utils = require('../utils/utils.js');
5
5
 
6
+ // Copyright (c) Cratis. All rights reserved.
7
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
6
8
  function useZoomState(initialZoom = 1) {
7
9
  const [zoomLevel, setZoomLevel] = React.useState(initialZoom);
8
10
  const handleZoomChange = React.useCallback((newZoom) => {
@@ -1 +1 @@
1
- {"version":3,"file":"useZoomState.js","sources":["../../../../PivotViewer/hooks/useZoomState.ts"],"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 { useState, useCallback } from 'react';\nimport { ZOOM_MIN, ZOOM_MAX } from '../utils/utils';\n\nexport function useZoomState(initialZoom = 1) {\n const [zoomLevel, setZoomLevel] = useState(initialZoom);\n\n const handleZoomChange = useCallback((newZoom: number) => {\n setZoomLevel(Math.max(ZOOM_MIN, Math.min(ZOOM_MAX, newZoom)));\n }, []);\n\n const handleZoomIn = useCallback(() => {\n handleZoomChange(zoomLevel + 0.2);\n }, [zoomLevel, handleZoomChange]);\n\n const handleZoomOut = useCallback(() => {\n handleZoomChange(zoomLevel - 0.2);\n }, [zoomLevel, handleZoomChange]);\n\n const handleZoomSlider = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n handleZoomChange(parseFloat(e.target.value));\n }, [handleZoomChange]);\n\n const handleZoomReset = useCallback(() => {\n handleZoomChange(1);\n }, [handleZoomChange]);\n\n return {\n zoomLevel,\n setZoomLevel,\n handleZoomChange,\n handleZoomIn,\n handleZoomOut,\n handleZoomSlider,\n handleZoomReset,\n };\n}\n"],"names":["useState","useCallback","ZOOM_MIN","ZOOM_MAX"],"mappings":";;;;;AAMM,SAAU,YAAY,CAAC,WAAW,GAAG,CAAC,EAAA;IAC1C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAGA,cAAQ,CAAC,WAAW,CAAC;AAEvD,IAAA,MAAM,gBAAgB,GAAGC,iBAAW,CAAC,CAAC,OAAe,KAAI;AACvD,QAAA,YAAY,CAAC,IAAI,CAAC,GAAG,CAACC,cAAQ,EAAE,IAAI,CAAC,GAAG,CAACC,cAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/D,CAAC,EAAE,EAAE,CAAC;AAEN,IAAA,MAAM,YAAY,GAAGF,iBAAW,CAAC,MAAK;AACpC,QAAA,gBAAgB,CAAC,SAAS,GAAG,GAAG,CAAC;AACnC,IAAA,CAAC,EAAE,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;AAEjC,IAAA,MAAM,aAAa,GAAGA,iBAAW,CAAC,MAAK;AACrC,QAAA,gBAAgB,CAAC,SAAS,GAAG,GAAG,CAAC;AACnC,IAAA,CAAC,EAAE,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;AAEjC,IAAA,MAAM,gBAAgB,GAAGA,iBAAW,CAAC,CAAC,CAAsC,KAAI;QAC9E,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9C,IAAA,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC;AAEtB,IAAA,MAAM,eAAe,GAAGA,iBAAW,CAAC,MAAK;QACvC,gBAAgB,CAAC,CAAC,CAAC;AACrB,IAAA,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC;IAEtB,OAAO;QACL,SAAS;QACT,YAAY;QACZ,gBAAgB;QAChB,YAAY;QACZ,aAAa;QACb,gBAAgB;QAChB,eAAe;KAChB;AACH;;;;"}
1
+ {"version":3,"file":"useZoomState.js","sources":["../../../../PivotViewer/hooks/useZoomState.ts"],"sourcesContent":[null],"names":["useState","useCallback","ZOOM_MIN","ZOOM_MAX"],"mappings":";;;;;AAAA;AACA;AAKM,SAAU,YAAY,CAAC,WAAW,GAAG,CAAC,EAAA;IAC1C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAGA,cAAQ,CAAC,WAAW,CAAC;AAEvD,IAAA,MAAM,gBAAgB,GAAGC,iBAAW,CAAC,CAAC,OAAe,KAAI;AACvD,QAAA,YAAY,CAAC,IAAI,CAAC,GAAG,CAACC,cAAQ,EAAE,IAAI,CAAC,GAAG,CAACC,cAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/D,CAAC,EAAE,EAAE,CAAC;AAEN,IAAA,MAAM,YAAY,GAAGF,iBAAW,CAAC,MAAK;AACpC,QAAA,gBAAgB,CAAC,SAAS,GAAG,GAAG,CAAC;AACnC,IAAA,CAAC,EAAE,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;AAEjC,IAAA,MAAM,aAAa,GAAGA,iBAAW,CAAC,MAAK;AACrC,QAAA,gBAAgB,CAAC,SAAS,GAAG,GAAG,CAAC;AACnC,IAAA,CAAC,EAAE,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;AAEjC,IAAA,MAAM,gBAAgB,GAAGA,iBAAW,CAAC,CAAC,CAAsC,KAAI;QAC9E,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9C,IAAA,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC;AAEtB,IAAA,MAAM,eAAe,GAAGA,iBAAW,CAAC,MAAK;QACvC,gBAAgB,CAAC,CAAC,CAAC;AACrB,IAAA,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC;IAEtB,OAAO;QACL,SAAS;QACT,YAAY;QACZ,gBAAgB;QAChB,YAAY;QACZ,aAAa;QACb,gBAAgB;QAChB,eAAe;KAChB;AACH;;;;"}
@@ -3,7 +3,8 @@
3
3
  var PivotViewer = require('./PivotViewer.js');
4
4
  var types = require('./types.js');
5
5
 
6
-
6
+ // Copyright (c) Cratis. All rights reserved.
7
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
7
8
 
8
9
  exports.PivotViewer = PivotViewer.PivotViewer;
9
10
  exports.PivotViewerOptimized = PivotViewer.PivotViewer;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../PivotViewer/index.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAAA;AACA;;;;;;;"}
@@ -1,10 +1,21 @@
1
1
  'use strict';
2
2
 
3
+ // Copyright (c) Cratis. All rights reserved.
4
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
5
+ /**
6
+ * Extract property path from a property accessor function
7
+ * Supports nested properties like item => item.address.city
8
+ */
3
9
  function getPropertyPath(accessor) {
4
10
  const fnStr = accessor.toString();
11
+ // Match patterns like: item => item.prop or item => item.prop.nested or (item) => item.prop
5
12
  const match = fnStr.match(/(?:=>|return)\s*[a-zA-Z_$][a-zA-Z0-9_$]*\.([a-zA-Z_$][a-zA-Z0-9_$.]*)/);
6
13
  return match ? match[1] : '';
7
14
  }
15
+ /**
16
+ * Get the value from an item using a property path string
17
+ * Supports nested properties like "address.city"
18
+ */
8
19
  function getValueByPath(item, path) {
9
20
  const parts = path.split('.');
10
21
  let value = item;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sources":["../../../PivotViewer/types.ts"],"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 { ReactNode } from 'react';\n\nexport type PivotPrimitive = string | number | boolean | Date | null | undefined;\n\n/**\n * Type-safe property accessor for accessing properties, including nested ones\n */\nexport type PropertyAccessor<TItem> = (item: TItem) => unknown;\n\n/**\n * Extract property path from a property accessor function\n * Supports nested properties like item => item.address.city\n */\nexport function getPropertyPath<TItem>(accessor: PropertyAccessor<TItem>): string {\n const fnStr = accessor.toString();\n // Match patterns like: item => item.prop or item => item.prop.nested or (item) => item.prop\n const match = fnStr.match(/(?:=>|return)\\s*[a-zA-Z_$][a-zA-Z0-9_$]*\\.([a-zA-Z_$][a-zA-Z0-9_$.]*)/);\n return match ? match[1] : '';\n}\n\n/**\n * Get the value from an item using a property path string\n * Supports nested properties like \"address.city\"\n */\nexport function getValueByPath<TItem>(item: TItem, path: string): unknown {\n const parts = path.split('.');\n let value: unknown = item;\n for (const part of parts) {\n if (value === null || value === undefined) {\n return undefined;\n }\n value = value[part];\n }\n return value;\n}\n\nexport interface PivotGroup<TItem extends object> {\n key: string;\n label: string;\n value: PivotPrimitive;\n items: TItem[];\n count?: number;\n}\n\nexport interface PivotDimension<TItem extends object> {\n key: string;\n label: string;\n getValue: (item: TItem) => PivotPrimitive;\n formatValue?: (value: PivotPrimitive) => string;\n sort?: (a: PivotGroup<TItem>, b: PivotGroup<TItem>) => number;\n}\n\nexport interface PivotFilterOption {\n key: string;\n label: string;\n value: PivotPrimitive;\n count: number;\n}\n\nexport interface PivotFilter<TItem extends object> {\n key: string;\n label: string;\n getValue: (item: TItem) => PivotPrimitive;\n multi?: boolean;\n options?: PivotFilterOption[];\n sort?: (a: PivotFilterOption, b: PivotFilterOption) => number;\n /** For numeric filters, enables range picker with histogram */\n type?: 'string' | 'number' | 'date';\n /** Number of buckets for the histogram in range filters */\n buckets?: number;\n}\n\nexport interface PivotViewerProps<TItem extends object> {\n data: TItem[];\n dimensions: PivotDimension<TItem>[];\n filters?: PivotFilter<TItem>[];\n defaultDimensionKey?: string;\n /** Renderer for card content; returns structured text data for display */\n cardRenderer: (item: TItem) => { title: string; labels?: string[]; values?: string[] };\n /** Optional renderer for the detail content area; the drawer shell (header/close/layout) stays component-owned */\n detailRenderer?: (item: TItem, onClose: () => void) => ReactNode;\n getItemId?: (item: TItem, index: number) => string | number;\n searchFields?: PropertyAccessor<TItem>[];\n className?: string;\n emptyContent?: ReactNode;\n isLoading?: boolean;\n /**\n * Optional color overrides mapped to PrimeReact-like CSS variables.\n * If omitted, values are taken from the global theme (PrimeReact defaults).\n */\n colors?: Partial<{\n primaryColor: string;\n primaryColorText: string;\n primary500: string;\n surfaceGround: string;\n surfaceCard: string;\n surfaceSection: string;\n surfaceOverlay: string;\n surfaceBorder: string;\n textColor: string;\n textColorSecondary: string;\n highlightBg: string;\n maskbg: string;\n focusRing: string;\n }>;\n}\n\nexport type FilterState = Record<string, Set<string>>;\n\nexport type RangeFilterState = Record<string, [number, number] | null>;\n"],"names":[],"mappings":";;AAgBM,SAAU,eAAe,CAAQ,QAAiC,EAAA;AACpE,IAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE;IAEjC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,uEAAuE,CAAC;AAClG,IAAA,OAAO,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE;AAChC;AAMM,SAAU,cAAc,CAAQ,IAAW,EAAE,IAAY,EAAA;IAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;IAC7B,IAAI,KAAK,GAAY,IAAI;AACzB,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACtB,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;AACvC,YAAA,OAAO,SAAS;QACpB;AACA,QAAA,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;IACvB;AACA,IAAA,OAAO,KAAK;AAChB;;;;;"}
1
+ {"version":3,"file":"types.js","sources":["../../../PivotViewer/types.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAAA;AACA;AAWA;;;AAGG;AACG,SAAU,eAAe,CAAQ,QAAiC,EAAA;AACpE,IAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE;;IAEjC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,uEAAuE,CAAC;AAClG,IAAA,OAAO,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE;AAChC;AAEA;;;AAGG;AACG,SAAU,cAAc,CAAQ,IAAW,EAAE,IAAY,EAAA;IAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;IAC7B,IAAI,KAAK,GAAY,IAAI;AACzB,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACtB,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;AACvC,YAAA,OAAO,SAAS;QACpB;AACA,QAAA,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;IACvB;AACA,IAAA,OAAO,KAAK;AAChB;;;;;"}