@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,144 @@
1
+ 'use strict';
2
+
3
+ const easeOutCubic = (t) => 1 - Math.pow(1 - t, 3);
4
+ function animateZoomAndScroll({ container, cardPosition, targetCardPosition, getCardPositionAtZoom, getLayoutSizeAtZoom, spacer, startZoom, targetZoom, targetScrollLeft, targetScrollTop, duration = 300, easing = easeOutCubic, onUpdate, onComplete, startScrollLeft, startScrollTop, }) {
5
+ container.style.scrollBehavior = 'auto';
6
+ let startTime = null;
7
+ let rafId = null;
8
+ const initialScrollLeft = startScrollLeft ?? container.scrollLeft;
9
+ const initialScrollTop = startScrollTop ?? container.scrollTop;
10
+ const startCardCenterX = cardPosition ? (cardPosition.x * startZoom + (cardPosition.width * startZoom) / 2) : 0;
11
+ const startCardCenterY = cardPosition ? (cardPosition.y * startZoom + (cardPosition.height * startZoom) / 2) : 0;
12
+ const startCardScreenX = startCardCenterX - initialScrollLeft;
13
+ const startCardScreenY = startCardCenterY - initialScrollTop;
14
+ const animate = (timestamp) => {
15
+ if (startTime === null) {
16
+ startTime = timestamp;
17
+ }
18
+ const elapsed = timestamp - startTime;
19
+ const progress = Math.min(1, elapsed / duration);
20
+ const easedProgress = easing(progress);
21
+ const currentZoom = startZoom + (targetZoom - startZoom) * easedProgress;
22
+ if (spacer && getLayoutSizeAtZoom) {
23
+ const size = getLayoutSizeAtZoom(currentZoom);
24
+ if (size) {
25
+ spacer.style.width = `${size.width * currentZoom}px`;
26
+ spacer.style.height = `${size.height * currentZoom}px`;
27
+ }
28
+ }
29
+ onUpdate(currentZoom);
30
+ if (cardPosition) {
31
+ let currentCardX;
32
+ let currentCardY;
33
+ if (getCardPositionAtZoom) {
34
+ const pos = getCardPositionAtZoom(currentZoom);
35
+ if (pos) {
36
+ currentCardX = pos.x;
37
+ currentCardY = pos.y;
38
+ }
39
+ else {
40
+ currentCardX = cardPosition.x;
41
+ currentCardY = cardPosition.y;
42
+ }
43
+ }
44
+ else {
45
+ currentCardX = targetCardPosition
46
+ ? cardPosition.x + (targetCardPosition.x - cardPosition.x) * easedProgress
47
+ : cardPosition.x;
48
+ currentCardY = targetCardPosition
49
+ ? cardPosition.y + (targetCardPosition.y - cardPosition.y) * easedProgress
50
+ : cardPosition.y;
51
+ }
52
+ const currentCardCenterX = currentCardX * currentZoom + (cardPosition.width * currentZoom) / 2;
53
+ const currentCardCenterY = currentCardY * currentZoom + (cardPosition.height * currentZoom) / 2;
54
+ const endCardX = targetCardPosition ? targetCardPosition.x : cardPosition.x;
55
+ const endCardY = targetCardPosition ? targetCardPosition.y : cardPosition.y;
56
+ const endCardCenterX = endCardX * targetZoom + (cardPosition.width * targetZoom) / 2;
57
+ const endCardCenterY = endCardY * targetZoom + (cardPosition.height * targetZoom) / 2;
58
+ const endCardScreenX = endCardCenterX - targetScrollLeft;
59
+ const endCardScreenY = endCardCenterY - targetScrollTop;
60
+ const desiredScreenX = startCardScreenX + (endCardScreenX - startCardScreenX) * easedProgress;
61
+ const desiredScreenY = startCardScreenY + (endCardScreenY - startCardScreenY) * easedProgress;
62
+ const neededScrollLeft = currentCardCenterX - desiredScreenX;
63
+ const neededScrollTop = currentCardCenterY - desiredScreenY;
64
+ let maxScrollLeft = container.scrollWidth - container.clientWidth;
65
+ let maxScrollTop = container.scrollHeight - container.clientHeight;
66
+ if (getLayoutSizeAtZoom) {
67
+ const size = getLayoutSizeAtZoom(currentZoom);
68
+ if (size) {
69
+ maxScrollLeft = Math.max(0, size.width * currentZoom - container.clientWidth);
70
+ maxScrollTop = Math.max(0, size.height * currentZoom - container.clientHeight);
71
+ }
72
+ }
73
+ container.scrollLeft = Math.min(Math.max(0, neededScrollLeft), maxScrollLeft);
74
+ container.scrollTop = Math.min(Math.max(0, neededScrollTop), maxScrollTop);
75
+ }
76
+ else {
77
+ const currentScrollLeft = initialScrollLeft + (targetScrollLeft - initialScrollLeft) * easedProgress;
78
+ const currentScrollTop = initialScrollTop + (targetScrollTop - initialScrollTop) * easedProgress;
79
+ container.scrollLeft = currentScrollLeft;
80
+ container.scrollTop = currentScrollTop;
81
+ }
82
+ if (progress < 1) {
83
+ rafId = requestAnimationFrame(animate);
84
+ }
85
+ else {
86
+ container.style.scrollBehavior = '';
87
+ container.scrollLeft = targetScrollLeft;
88
+ container.scrollTop = targetScrollTop;
89
+ onComplete?.();
90
+ }
91
+ };
92
+ rafId = requestAnimationFrame(animate);
93
+ return () => {
94
+ if (rafId !== null) {
95
+ cancelAnimationFrame(rafId);
96
+ container.style.scrollBehavior = '';
97
+ }
98
+ };
99
+ }
100
+ function calculateCenterScrollPosition(container, cardPosition, zoomLevel, detailPanelWidth = 0, totalHeight) {
101
+ const cardCenterX = cardPosition.x * zoomLevel + (cardPosition.width * zoomLevel) / 2;
102
+ const cardCenterY = cardPosition.y * zoomLevel + (cardPosition.height * zoomLevel) / 2;
103
+ const availableWidth = container.clientWidth - detailPanelWidth;
104
+ const targetX = availableWidth / 2;
105
+ const targetY = container.clientHeight / 2;
106
+ const scrollLeft = Math.max(0, cardCenterX - targetX);
107
+ let scrollTop = Math.max(0, cardCenterY - targetY);
108
+ console.log('[Animation] calculateCenterScrollPosition', {
109
+ cardY: cardPosition.y,
110
+ zoomLevel,
111
+ cardCenterY,
112
+ targetY,
113
+ initialScrollTop: scrollTop,
114
+ totalHeight,
115
+ containerHeight: container.clientHeight
116
+ });
117
+ if (totalHeight) {
118
+ const contentHeight = totalHeight * zoomLevel;
119
+ const viewportHeight = container.clientHeight;
120
+ const maxScrollTop = Math.max(0, contentHeight - viewportHeight);
121
+ console.log('[Animation] Clamping', {
122
+ contentHeight,
123
+ viewportHeight,
124
+ maxScrollTop,
125
+ currentScrollTop: scrollTop,
126
+ clamped: Math.min(scrollTop, maxScrollTop)
127
+ });
128
+ scrollTop = Math.min(scrollTop, maxScrollTop);
129
+ }
130
+ return { scrollLeft, scrollTop };
131
+ }
132
+ function smoothScrollTo(container, scrollLeft, scrollTop, smooth = true) {
133
+ container.scrollTo({
134
+ left: scrollLeft,
135
+ top: scrollTop,
136
+ behavior: smooth ? 'smooth' : 'auto',
137
+ });
138
+ }
139
+
140
+ exports.animateZoomAndScroll = animateZoomAndScroll;
141
+ exports.calculateCenterScrollPosition = calculateCenterScrollPosition;
142
+ exports.easeOutCubic = easeOutCubic;
143
+ exports.smoothScrollTo = smoothScrollTo;
144
+ //# sourceMappingURL=animations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animations.js","sources":["../../../../PivotViewer/utils/animations.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\nexport type EasingFunction = (t: number) => number;\n\nexport const easeOutCubic: EasingFunction = (t: number) => 1 - Math.pow(1 - t, 3);\n\nexport interface ZoomAnimationParams {\n startZoom: number;\n targetZoom: number;\n duration?: number;\n easing?: EasingFunction;\n}\n\nexport interface ScrollAnimationParams {\n targetScrollLeft: number;\n targetScrollTop: number;\n}\n\nexport interface ZoomScrollAnimationParams extends ZoomAnimationParams, ScrollAnimationParams {\n container: HTMLElement;\n cardPosition?: { x: number; y: number; width: number; height: number } | null;\n targetCardPosition?: { x: number; y: number; width: number; height: number } | null;\n getCardPositionAtZoom?: (zoom: number) => { x: number; y: number; width: number; height: number } | null;\n getLayoutSizeAtZoom?: (zoom: number) => { width: number; height: number };\n spacer?: HTMLElement | null;\n onUpdate: (zoom: number) => void;\n onComplete?: () => void;\n startScrollLeft?: number; // Optional explicit start scroll\n startScrollTop?: number; // Optional explicit start scroll\n}\n\n/**\n * Animate zoom and scroll together, keeping a specific element centered\n */\nexport function animateZoomAndScroll({\n container,\n cardPosition,\n targetCardPosition,\n getCardPositionAtZoom,\n getLayoutSizeAtZoom,\n spacer,\n startZoom,\n targetZoom,\n targetScrollLeft,\n targetScrollTop,\n duration = 300,\n easing = easeOutCubic,\n onUpdate,\n onComplete,\n startScrollLeft,\n startScrollTop,\n}: ZoomScrollAnimationParams): () => void {\n container.style.scrollBehavior = 'auto';\n\n let startTime: number | null = null;\n let rafId: number | null = null;\n\n // Capture start scroll if not provided\n const initialScrollLeft = startScrollLeft ?? container.scrollLeft;\n const initialScrollTop = startScrollTop ?? container.scrollTop;\n\n // Calculate initial center point relative to viewport\n const startCardCenterX = cardPosition ? (cardPosition.x * startZoom + (cardPosition.width * startZoom) / 2) : 0;\n const startCardCenterY = cardPosition ? (cardPosition.y * startZoom + (cardPosition.height * startZoom) / 2) : 0;\n\n const startCardScreenX = startCardCenterX - initialScrollLeft;\n const startCardScreenY = startCardCenterY - initialScrollTop;\n\n const animate = (timestamp: number) => {\n if (startTime === null) {\n startTime = timestamp;\n }\n\n const elapsed = timestamp - startTime;\n const progress = Math.min(1, elapsed / duration);\n const easedProgress = easing(progress);\n\n const currentZoom = startZoom + (targetZoom - startZoom) * easedProgress;\n\n // Update spacer size synchronously if possible\n if (spacer && getLayoutSizeAtZoom) {\n const size = getLayoutSizeAtZoom(currentZoom);\n if (size) {\n spacer.style.width = `${size.width * currentZoom}px`;\n spacer.style.height = `${size.height * currentZoom}px`;\n }\n }\n\n onUpdate(currentZoom);\n\n if (cardPosition) {\n let currentCardX: number;\n let currentCardY: number;\n\n if (getCardPositionAtZoom) {\n const pos = getCardPositionAtZoom(currentZoom);\n if (pos) {\n currentCardX = pos.x;\n currentCardY = pos.y;\n } else {\n currentCardX = cardPosition.x;\n currentCardY = cardPosition.y;\n }\n } else {\n // Interpolate card position if target is provided (for layouts that change with zoom)\n currentCardX = targetCardPosition\n ? cardPosition.x + (targetCardPosition.x - cardPosition.x) * easedProgress\n : cardPosition.x;\n currentCardY = targetCardPosition\n ? cardPosition.y + (targetCardPosition.y - cardPosition.y) * easedProgress\n : cardPosition.y;\n }\n\n // Calculate where the card center is at current zoom\n const currentCardCenterX = currentCardX * currentZoom + (cardPosition.width * currentZoom) / 2;\n const currentCardCenterY = currentCardY * currentZoom + (cardPosition.height * currentZoom) / 2;\n\n // Calculate where the card center will be at the end of animation (relative to viewport)\n // Target scroll position is where we want to end up\n const endCardX = targetCardPosition ? targetCardPosition.x : cardPosition.x;\n const endCardY = targetCardPosition ? targetCardPosition.y : cardPosition.y;\n\n const endCardCenterX = endCardX * targetZoom + (cardPosition.width * targetZoom) / 2;\n const endCardCenterY = endCardY * targetZoom + (cardPosition.height * targetZoom) / 2;\n\n const endCardScreenX = endCardCenterX - targetScrollLeft;\n const endCardScreenY = endCardCenterY - targetScrollTop;\n\n // Interpolate the desired screen position\n const desiredScreenX = startCardScreenX + (endCardScreenX - startCardScreenX) * easedProgress;\n const desiredScreenY = startCardScreenY + (endCardScreenY - startCardScreenY) * easedProgress;\n\n // Calculate needed scroll position to put card at desired screen position\n const neededScrollLeft = currentCardCenterX - desiredScreenX;\n const neededScrollTop = currentCardCenterY - desiredScreenY;\n\n let maxScrollLeft = container.scrollWidth - container.clientWidth;\n let maxScrollTop = container.scrollHeight - container.clientHeight;\n\n // If we have explicit layout size, use it for clamping to avoid DOM sync issues\n if (getLayoutSizeAtZoom) {\n const size = getLayoutSizeAtZoom(currentZoom);\n if (size) {\n maxScrollLeft = Math.max(0, size.width * currentZoom - container.clientWidth);\n maxScrollTop = Math.max(0, size.height * currentZoom - container.clientHeight);\n }\n }\n\n // We can't clamp strictly during animation because the scrollWidth/Height might not have updated yet\n // if the spacer hasn't resized. But usually spacer resizes immediately on zoom update.\n // For safety, we just set it.\n container.scrollLeft = Math.min(Math.max(0, neededScrollLeft), maxScrollLeft);\n container.scrollTop = Math.min(Math.max(0, neededScrollTop), maxScrollTop);\n } else {\n // If no card position, just interpolate scroll position\n // Use captured initial scroll positions for linear interpolation\n const currentScrollLeft = initialScrollLeft + (targetScrollLeft - initialScrollLeft) * easedProgress;\n const currentScrollTop = initialScrollTop + (targetScrollTop - initialScrollTop) * easedProgress;\n\n container.scrollLeft = currentScrollLeft;\n container.scrollTop = currentScrollTop;\n }\n\n if (progress < 1) {\n rafId = requestAnimationFrame(animate);\n } else {\n container.style.scrollBehavior = '';\n container.scrollLeft = targetScrollLeft;\n container.scrollTop = targetScrollTop;\n onComplete?.();\n }\n };\n\n rafId = requestAnimationFrame(animate);\n\n return () => {\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n container.style.scrollBehavior = '';\n }\n };\n}\n\n/**\n * Calculate scroll position to center a card in viewport, accounting for detail panel\n */\nexport function calculateCenterScrollPosition(\n container: HTMLElement,\n cardPosition: { x: number; y: number; width: number; height: number },\n zoomLevel: number,\n detailPanelWidth: number = 0,\n totalHeight?: number\n): { scrollLeft: number; scrollTop: number } {\n const cardCenterX = cardPosition.x * zoomLevel + (cardPosition.width * zoomLevel) / 2;\n const cardCenterY = cardPosition.y * zoomLevel + (cardPosition.height * zoomLevel) / 2;\n\n const availableWidth = container.clientWidth - detailPanelWidth;\n const targetX = availableWidth / 2;\n const targetY = container.clientHeight / 2;\n\n const scrollLeft = Math.max(0, cardCenterX - targetX);\n let scrollTop = Math.max(0, cardCenterY - targetY);\n\n console.log('[Animation] calculateCenterScrollPosition', {\n cardY: cardPosition.y,\n zoomLevel,\n cardCenterY,\n targetY,\n initialScrollTop: scrollTop,\n totalHeight,\n containerHeight: container.clientHeight\n });\n\n // If totalHeight is provided, clamp to valid scroll range\n if (totalHeight) {\n const contentHeight = totalHeight * zoomLevel;\n const viewportHeight = container.clientHeight;\n const maxScrollTop = Math.max(0, contentHeight - viewportHeight);\n\n console.log('[Animation] Clamping', {\n contentHeight,\n viewportHeight,\n maxScrollTop,\n currentScrollTop: scrollTop,\n clamped: Math.min(scrollTop, maxScrollTop)\n });\n\n scrollTop = Math.min(scrollTop, maxScrollTop);\n }\n\n return { scrollLeft, scrollTop };\n}\n\n/**\n * Smooth scroll to position\n */\nexport function smoothScrollTo(\n container: HTMLElement,\n scrollLeft: number,\n scrollTop: number,\n smooth: boolean = true\n): void {\n container.scrollTo({\n left: scrollLeft,\n top: scrollTop,\n behavior: smooth ? 'smooth' : 'auto',\n });\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ 'use strict';
2
+
3
+ const ZOOM_MAX = 3;
4
+ const DETAIL_PANEL_WIDTH = 380;
5
+ const ZOOM_MULTIPLIER = 1.15;
6
+ const MIN_ZOOM_ON_SELECT = 1.2;
7
+
8
+ exports.DETAIL_PANEL_WIDTH = DETAIL_PANEL_WIDTH;
9
+ exports.MIN_ZOOM_ON_SELECT = MIN_ZOOM_ON_SELECT;
10
+ exports.ZOOM_MAX = ZOOM_MAX;
11
+ exports.ZOOM_MULTIPLIER = ZOOM_MULTIPLIER;
12
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sources":["../../../../PivotViewer/utils/constants.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\n// Zoom constants\nexport const ZOOM_MIN = 0.1;\nexport const ZOOM_MAX = 3;\nexport const ZOOM_STEP = 0.05;\n\n// Layout constants\nexport const GROUP_SPACING = 40;\nexport const CARD_GAP = 8;\nexport const CARDS_PER_COLUMN = 5;\nexport const BASE_CARD_WIDTH = 180;\nexport const BASE_CARD_HEIGHT = 140;\nexport const DETAIL_PANEL_WIDTH = 380;\n\n// Animation constants\nexport const ZOOM_ANIMATION_DURATION = 300;\nexport const ZOOM_MULTIPLIER = 1.15;\nexport const MIN_ZOOM_ON_SELECT = 1.2;\n"],"names":[],"mappings":";;AAKO,MAAM,QAAQ,GAAG;AASjB,MAAM,kBAAkB,GAAG;AAI3B,MAAM,eAAe,GAAG;AACxB,MAAM,kBAAkB,GAAG;;;;;;;"}
@@ -0,0 +1,136 @@
1
+ 'use strict';
2
+
3
+ var animations = require('./animations.js');
4
+ var constants = require('./constants.js');
5
+
6
+ function handleCardSelection({ itemId, selectedItemId, container, cardPosition, targetCardPosition, getCardPositionAtZoom, getLayoutSizeAtZoom, spacer, viewMode, zoomLevel, totalHeight, preSelectionState, startScrollPosition, setZoomLevel, setIsZooming, setSelectedItem, setPreSelectionState, item, }) {
7
+ if (selectedItemId === itemId) {
8
+ deselectCard({
9
+ container,
10
+ cardPosition,
11
+ targetCardPosition,
12
+ getCardPositionAtZoom,
13
+ getLayoutSizeAtZoom,
14
+ spacer,
15
+ viewMode,
16
+ zoomLevel,
17
+ preSelectionState,
18
+ setZoomLevel,
19
+ setIsZooming,
20
+ setSelectedItem,
21
+ setPreSelectionState,
22
+ });
23
+ return;
24
+ }
25
+ const isFirstSelection = selectedItemId === null;
26
+ if (isFirstSelection) {
27
+ setPreSelectionState({
28
+ zoom: zoomLevel,
29
+ scrollLeft: container.scrollLeft,
30
+ scrollTop: container.scrollTop,
31
+ });
32
+ }
33
+ setSelectedItem(item);
34
+ if (isFirstSelection) {
35
+ if (viewMode === 'collection') {
36
+ if (cardPosition) {
37
+ const { scrollLeft, scrollTop } = animations.calculateCenterScrollPosition(container, cardPosition, zoomLevel, 0, totalHeight);
38
+ animations.smoothScrollTo(container, scrollLeft, scrollTop, true);
39
+ }
40
+ }
41
+ else {
42
+ zoomAndCenterCard({
43
+ container,
44
+ cardPosition,
45
+ targetCardPosition,
46
+ getCardPositionAtZoom,
47
+ getLayoutSizeAtZoom,
48
+ spacer,
49
+ zoomLevel,
50
+ totalHeight,
51
+ startScrollPosition,
52
+ setZoomLevel,
53
+ setIsZooming,
54
+ });
55
+ }
56
+ }
57
+ else {
58
+ if (cardPosition) {
59
+ const detailWidth = viewMode === 'collection' ? 0 : constants.DETAIL_PANEL_WIDTH;
60
+ const { scrollLeft, scrollTop } = animations.calculateCenterScrollPosition(container, cardPosition, zoomLevel, detailWidth, totalHeight);
61
+ animations.smoothScrollTo(container, scrollLeft, scrollTop, true);
62
+ }
63
+ }
64
+ }
65
+ function deselectCard({ container, cardPosition, targetCardPosition, getCardPositionAtZoom, getLayoutSizeAtZoom, spacer, viewMode, zoomLevel, preSelectionState, setZoomLevel, setIsZooming, setSelectedItem, setPreSelectionState, }) {
66
+ if (!preSelectionState) {
67
+ setSelectedItem(null);
68
+ return;
69
+ }
70
+ if (viewMode === 'collection') {
71
+ setSelectedItem(null);
72
+ animations.smoothScrollTo(container, preSelectionState.scrollLeft, preSelectionState.scrollTop, true);
73
+ setPreSelectionState(null);
74
+ return;
75
+ }
76
+ const zoomChanged = Math.abs(preSelectionState.zoom - zoomLevel) > 0.001;
77
+ if (!zoomChanged || !cardPosition) {
78
+ setSelectedItem(null);
79
+ animations.smoothScrollTo(container, preSelectionState.scrollLeft, preSelectionState.scrollTop, true);
80
+ setPreSelectionState(null);
81
+ return;
82
+ }
83
+ setIsZooming(true);
84
+ animations.animateZoomAndScroll({
85
+ container,
86
+ cardPosition,
87
+ targetCardPosition,
88
+ getCardPositionAtZoom,
89
+ getLayoutSizeAtZoom,
90
+ spacer,
91
+ startZoom: zoomLevel,
92
+ targetZoom: preSelectionState.zoom,
93
+ targetScrollLeft: preSelectionState.scrollLeft,
94
+ targetScrollTop: preSelectionState.scrollTop,
95
+ onUpdate: setZoomLevel,
96
+ onComplete: () => {
97
+ setIsZooming(false);
98
+ setSelectedItem(null);
99
+ setPreSelectionState(null);
100
+ },
101
+ });
102
+ }
103
+ function zoomAndCenterCard({ container, cardPosition, targetCardPosition, getCardPositionAtZoom, getLayoutSizeAtZoom, spacer, zoomLevel, totalHeight, startScrollPosition, setZoomLevel, setIsZooming, }) {
104
+ const targetZoom = Math.min(constants.ZOOM_MAX, Math.max(constants.MIN_ZOOM_ON_SELECT, zoomLevel * constants.ZOOM_MULTIPLIER));
105
+ const shouldZoom = Math.abs(targetZoom - zoomLevel) > 0.001;
106
+ if (!shouldZoom || !cardPosition) {
107
+ if (cardPosition) {
108
+ const { scrollLeft, scrollTop } = animations.calculateCenterScrollPosition(container, cardPosition, zoomLevel, constants.DETAIL_PANEL_WIDTH, totalHeight);
109
+ animations.smoothScrollTo(container, scrollLeft, scrollTop, true);
110
+ }
111
+ return;
112
+ }
113
+ setIsZooming(true);
114
+ const { scrollLeft: targetScrollLeft, scrollTop: targetScrollTop } = animations.calculateCenterScrollPosition(container, targetCardPosition || cardPosition, targetZoom, constants.DETAIL_PANEL_WIDTH, totalHeight);
115
+ animations.animateZoomAndScroll({
116
+ container,
117
+ cardPosition,
118
+ targetCardPosition,
119
+ getCardPositionAtZoom,
120
+ getLayoutSizeAtZoom,
121
+ spacer,
122
+ startZoom: zoomLevel,
123
+ targetZoom,
124
+ targetScrollLeft,
125
+ targetScrollTop,
126
+ startScrollLeft: startScrollPosition?.x,
127
+ startScrollTop: startScrollPosition?.y,
128
+ onUpdate: setZoomLevel,
129
+ onComplete: () => {
130
+ setIsZooming(false);
131
+ },
132
+ });
133
+ }
134
+
135
+ exports.handleCardSelection = handleCardSelection;
136
+ //# sourceMappingURL=selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection.js","sources":["../../../../PivotViewer/utils/selection.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 { animateZoomAndScroll, calculateCenterScrollPosition, smoothScrollTo } from './animations';\nimport { ZOOM_MAX, MIN_ZOOM_ON_SELECT, ZOOM_MULTIPLIER, DETAIL_PANEL_WIDTH } from './constants';\nimport type { ViewMode } from '../components/Toolbar';\n\nexport interface SelectionState {\n zoom: number;\n scrollLeft: number;\n scrollTop: number;\n}\n\nexport interface CardClickHandlerParams<TItem> {\n item: TItem;\n itemId: string | number;\n selectedItemId: string | number | null;\n container: HTMLElement;\n cardPosition: { x: number; y: number; width: number; height: number } | null;\n targetCardPosition?: { x: number; y: number; width: number; height: number } | null;\n getCardPositionAtZoom?: (zoom: number) => { x: number; y: number; width: number; height: number } | null;\n getLayoutSizeAtZoom?: (zoom: number) => { width: number; height: number };\n spacer?: HTMLElement | null;\n viewMode: ViewMode;\n zoomLevel: number;\n totalHeight?: number;\n preSelectionState: SelectionState | null;\n startScrollPosition?: { x: number; y: number };\n setZoomLevel: (zoom: number) => void;\n setIsZooming: (isZooming: boolean) => void;\n setSelectedItem: (item: TItem | null) => void;\n setPreSelectionState: (state: SelectionState | null) => void;\n}\n\n/**\n * Handle card click for selection with zoom and scroll animation\n */\nexport function handleCardSelection<TItem>({\n itemId,\n selectedItemId,\n container,\n cardPosition,\n targetCardPosition,\n getCardPositionAtZoom,\n getLayoutSizeAtZoom,\n spacer,\n viewMode,\n zoomLevel,\n totalHeight,\n preSelectionState,\n startScrollPosition,\n setZoomLevel,\n setIsZooming,\n setSelectedItem,\n setPreSelectionState,\n item,\n}: CardClickHandlerParams<TItem>): void {\n // Clicking the same card - deselect\n if (selectedItemId === itemId) {\n deselectCard({\n container,\n cardPosition,\n targetCardPosition,\n getCardPositionAtZoom,\n getLayoutSizeAtZoom,\n spacer,\n viewMode,\n zoomLevel,\n preSelectionState,\n setZoomLevel,\n setIsZooming,\n setSelectedItem,\n setPreSelectionState,\n });\n return;\n }\n\n // First selection - save state and zoom in\n const isFirstSelection = selectedItemId === null;\n\n if (isFirstSelection) {\n setPreSelectionState({\n zoom: zoomLevel,\n scrollLeft: container.scrollLeft,\n scrollTop: container.scrollTop,\n });\n }\n\n setSelectedItem(item);\n\n if (isFirstSelection) {\n if (viewMode === 'collection') {\n // Collection mode: just smooth scroll to center, no zoom\n if (cardPosition) {\n // In collection mode, we don't have a detail panel width offset because the panel is an overlay or separate\n // But if we want to center it, we should consider if the detail panel pushes content\n // For now, assume 0 offset as per original code\n const { scrollLeft, scrollTop } = calculateCenterScrollPosition(container, cardPosition, zoomLevel, 0, totalHeight);\n smoothScrollTo(container, scrollLeft, scrollTop, true);\n }\n } else {\n // Grouped mode: animate zoom and scroll\n zoomAndCenterCard({\n container,\n cardPosition,\n targetCardPosition,\n getCardPositionAtZoom,\n getLayoutSizeAtZoom,\n spacer,\n itemId,\n zoomLevel,\n totalHeight,\n startScrollPosition,\n setZoomLevel,\n setIsZooming,\n });\n }\n } else {\n // Subsequent selections: just center the new card\n if (cardPosition) {\n // In collection mode, we don't zoom, so we just center.\n // In grouped mode, we might be zoomed in, so we center with offset.\n const detailWidth = viewMode === 'collection' ? 0 : DETAIL_PANEL_WIDTH;\n const { scrollLeft, scrollTop } = calculateCenterScrollPosition(container, cardPosition, zoomLevel, detailWidth, totalHeight);\n smoothScrollTo(container, scrollLeft, scrollTop, true);\n }\n }\n}\n\ninterface DeselectParams {\n container: HTMLElement;\n cardPosition: { x: number; y: number; width: number; height: number } | null;\n targetCardPosition?: { x: number; y: number; width: number; height: number } | null;\n getCardPositionAtZoom?: (zoom: number) => { x: number; y: number; width: number; height: number } | null;\n getLayoutSizeAtZoom?: (zoom: number) => { width: number; height: number };\n spacer?: HTMLElement | null;\n viewMode: ViewMode;\n zoomLevel: number;\n preSelectionState: SelectionState | null;\n setZoomLevel: (zoom: number) => void;\n setIsZooming: (isZooming: boolean) => void;\n setSelectedItem: (item: null) => void;\n setPreSelectionState: (state: SelectionState | null) => void;\n}\n\n/**\n * Deselect card with zoom-out animation if needed\n */\nfunction deselectCard({\n container,\n cardPosition,\n targetCardPosition,\n getCardPositionAtZoom,\n getLayoutSizeAtZoom,\n spacer,\n viewMode,\n zoomLevel,\n preSelectionState,\n setZoomLevel,\n setIsZooming,\n setSelectedItem,\n setPreSelectionState,\n}: DeselectParams): void {\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: check 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 // Animate zoom out\n setIsZooming(true);\n\n animateZoomAndScroll({\n container,\n cardPosition,\n targetCardPosition,\n getCardPositionAtZoom,\n getLayoutSizeAtZoom,\n spacer,\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}\n\ninterface ZoomAndCenterParams {\n container: HTMLElement;\n cardPosition: { x: number; y: number; width: number; height: number } | null;\n targetCardPosition?: { x: number; y: number; width: number; height: number } | null;\n getCardPositionAtZoom?: (zoom: number) => { x: number; y: number; width: number; height: number } | null;\n getLayoutSizeAtZoom?: (zoom: number) => { width: number; height: number };\n spacer?: HTMLElement | null;\n itemId: string | number;\n zoomLevel: number;\n totalHeight?: number;\n startScrollPosition?: { x: number; y: number };\n setZoomLevel: (zoom: number) => void;\n setIsZooming: (isZooming: boolean) => void;\n}\n\n/**\n * Zoom in and center a card\n */\nfunction zoomAndCenterCard({\n container,\n cardPosition,\n targetCardPosition,\n getCardPositionAtZoom,\n getLayoutSizeAtZoom,\n spacer,\n zoomLevel,\n totalHeight,\n startScrollPosition,\n setZoomLevel,\n setIsZooming,\n}: ZoomAndCenterParams): void {\n const targetZoom = Math.min(ZOOM_MAX, Math.max(MIN_ZOOM_ON_SELECT, zoomLevel * ZOOM_MULTIPLIER));\n const shouldZoom = Math.abs(targetZoom - zoomLevel) > 0.001;\n\n if (!shouldZoom || !cardPosition) {\n if (cardPosition) {\n const { scrollLeft, scrollTop } = calculateCenterScrollPosition(container, cardPosition, zoomLevel, DETAIL_PANEL_WIDTH, totalHeight);\n smoothScrollTo(container, scrollLeft, scrollTop, true);\n }\n return;\n }\n\n setIsZooming(true);\n\n // Use targetCardPosition if available, otherwise fallback to cardPosition\n const { scrollLeft: targetScrollLeft, scrollTop: targetScrollTop } = calculateCenterScrollPosition(\n container,\n targetCardPosition || cardPosition,\n targetZoom,\n DETAIL_PANEL_WIDTH,\n totalHeight\n );\n\n animateZoomAndScroll({\n container,\n cardPosition,\n targetCardPosition,\n getCardPositionAtZoom,\n getLayoutSizeAtZoom,\n spacer,\n startZoom: zoomLevel,\n targetZoom,\n targetScrollLeft,\n targetScrollTop,\n startScrollLeft: startScrollPosition?.x,\n startScrollTop: startScrollPosition?.y,\n onUpdate: setZoomLevel,\n onComplete: () => {\n setIsZooming(false);\n },\n });\n}\n\n/**\n * Get card element by ID from container\n */\nexport function getCardElementById(_container: HTMLElement, _itemId: string | number): HTMLElement | null {\n // Deprecated: Pixi renderer doesn't use DOM elements for cards\n // Keep parameter names prefixed to indicate intentional non-use.\n void _container;\n void _itemId;\n return null;\n}\n"],"names":["calculateCenterScrollPosition","smoothScrollTo","DETAIL_PANEL_WIDTH","animateZoomAndScroll","ZOOM_MAX","MIN_ZOOM_ON_SELECT","ZOOM_MULTIPLIER"],"mappings":"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"}
@@ -0,0 +1,150 @@
1
+ 'use strict';
2
+
3
+ const ZOOM_MIN = 0.1;
4
+ const ZOOM_MAX = 3;
5
+ const ZOOM_STEP = 0.05;
6
+ const toKey = (value) => {
7
+ if (value === undefined)
8
+ return 'undefined';
9
+ if (value === null)
10
+ return 'null';
11
+ if (value instanceof Date)
12
+ return value.toISOString();
13
+ if (typeof value === 'number' && Number.isNaN(value))
14
+ return 'nan';
15
+ return String(value);
16
+ };
17
+ const defaultFormat = (value) => {
18
+ if (value === undefined)
19
+ return 'Unknown';
20
+ if (value === null)
21
+ return 'None';
22
+ if (value instanceof Date)
23
+ return value.toLocaleString();
24
+ if (typeof value === 'boolean')
25
+ return value ? 'Yes' : 'No';
26
+ return String(value);
27
+ };
28
+ const buildFilterState = (filters) => {
29
+ const state = {};
30
+ filters?.forEach((filter) => {
31
+ state[filter.key] = new Set();
32
+ });
33
+ return state;
34
+ };
35
+ const buildRangeFilterState = (filters) => {
36
+ const state = {};
37
+ filters?.forEach((filter) => {
38
+ if (filter.type === 'number') {
39
+ state[filter.key] = null;
40
+ }
41
+ });
42
+ return state;
43
+ };
44
+ const applyFilters = (data, filters, state, rangeState, skipKey) => {
45
+ if (!filters?.length) {
46
+ return data;
47
+ }
48
+ const activeFilters = [];
49
+ for (const filter of filters) {
50
+ if (filter.key === skipKey) {
51
+ continue;
52
+ }
53
+ if (filter.type === 'number') {
54
+ const range = rangeState[filter.key];
55
+ if (range) {
56
+ activeFilters.push({ filter, range });
57
+ }
58
+ }
59
+ else {
60
+ const selections = state[filter.key];
61
+ if (selections && selections.size > 0) {
62
+ activeFilters.push({ filter, selections });
63
+ }
64
+ }
65
+ }
66
+ if (activeFilters.length === 0) {
67
+ return data;
68
+ }
69
+ return data.filter((item) => {
70
+ for (const { filter, selections, range } of activeFilters) {
71
+ if (range) {
72
+ const value = filter.getValue(item);
73
+ const numValue = typeof value === 'number' ? value : Number(value);
74
+ if (!Number.isNaN(numValue) && (numValue < range[0] || numValue > range[1])) {
75
+ return false;
76
+ }
77
+ }
78
+ else if (selections) {
79
+ const valueKey = toKey(filter.getValue(item));
80
+ if (!selections.has(valueKey)) {
81
+ return false;
82
+ }
83
+ }
84
+ }
85
+ return true;
86
+ });
87
+ };
88
+ const computeFilterOptions = (data, filter) => {
89
+ if (filter.options?.length) {
90
+ return filter.options;
91
+ }
92
+ const counts = new Map();
93
+ data.forEach((item) => {
94
+ const value = filter.getValue(item);
95
+ const key = toKey(value);
96
+ const existing = counts.get(key);
97
+ if (existing) {
98
+ existing.count += 1;
99
+ }
100
+ else {
101
+ counts.set(key, {
102
+ option: {
103
+ key,
104
+ label: defaultFormat(value),
105
+ value,
106
+ count: 1,
107
+ },
108
+ count: 1,
109
+ });
110
+ }
111
+ });
112
+ const options = Array.from(counts.values()).map(({ option, count }) => ({
113
+ ...option,
114
+ count,
115
+ }));
116
+ return filter.sort ? options.sort(filter.sort) : options.sort((a, b) => b.count - a.count);
117
+ };
118
+ const renderOptionCount = (count) => typeof count === 'number' ? count : '';
119
+ const computeNumericRange = (data, filter) => {
120
+ const values = [];
121
+ let min = Infinity;
122
+ let max = -Infinity;
123
+ data.forEach((item) => {
124
+ const value = filter.getValue(item);
125
+ values.push(value);
126
+ const numValue = typeof value === 'number' ? value : Number(value);
127
+ if (!Number.isNaN(numValue)) {
128
+ min = Math.min(min, numValue);
129
+ max = Math.max(max, numValue);
130
+ }
131
+ });
132
+ return {
133
+ min: min === Infinity ? 0 : min,
134
+ max: max === -Infinity ? 100 : max,
135
+ values,
136
+ };
137
+ };
138
+
139
+ exports.ZOOM_MAX = ZOOM_MAX;
140
+ exports.ZOOM_MIN = ZOOM_MIN;
141
+ exports.ZOOM_STEP = ZOOM_STEP;
142
+ exports.applyFilters = applyFilters;
143
+ exports.buildFilterState = buildFilterState;
144
+ exports.buildRangeFilterState = buildRangeFilterState;
145
+ exports.computeFilterOptions = computeFilterOptions;
146
+ exports.computeNumericRange = computeNumericRange;
147
+ exports.defaultFormat = defaultFormat;
148
+ exports.renderOptionCount = renderOptionCount;
149
+ exports.toKey = toKey;
150
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sources":["../../../../PivotViewer/utils/utils.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 {\n PivotDimension,\n PivotFilter,\n PivotFilterOption,\n PivotGroup,\n PivotPrimitive,\n} from '../types';\n\nexport type FilterState = Record<string, Set<string>>;\nexport type RangeFilterState = Record<string, [number, number] | null>;\n\n// Zoom configuration\nexport const ZOOM_MIN = 0.1;\nexport const ZOOM_MAX = 3;\nexport const ZOOM_STEP = 0.05;\nexport const CARDS_PER_COLUMN = 5;\nexport const BASE_CARD_WIDTH = 180;\nexport const BASE_CARD_HEIGHT = 140;\n\nexport const toKey = (value: PivotPrimitive): string => {\n if (value === undefined) return 'undefined';\n if (value === null) return 'null';\n if (value instanceof Date) return value.toISOString();\n if (typeof value === 'number' && Number.isNaN(value)) return 'nan';\n return String(value);\n};\n\nexport const defaultFormat = (value: PivotPrimitive): string => {\n if (value === undefined) return 'Unknown';\n if (value === null) return 'None';\n if (value instanceof Date) return value.toLocaleString();\n if (typeof value === 'boolean') return value ? 'Yes' : 'No';\n return String(value);\n};\n\nexport const buildFilterState = <TItem extends object>(\n filters: PivotFilter<TItem>[] | undefined,\n): FilterState => {\n const state: FilterState = {};\n filters?.forEach((filter) => {\n state[filter.key] = new Set<string>();\n });\n return state;\n};\n\nexport const buildRangeFilterState = <TItem extends object>(\n filters: PivotFilter<TItem>[] | undefined,\n): RangeFilterState => {\n const state: RangeFilterState = {};\n filters?.forEach((filter) => {\n if (filter.type === 'number') {\n state[filter.key] = null;\n }\n });\n return state;\n};\n\nexport const applyFilters = <TItem extends object>(\n data: TItem[],\n filters: PivotFilter<TItem>[] | undefined,\n state: FilterState,\n rangeState: RangeFilterState,\n skipKey?: string,\n): TItem[] => {\n if (!filters?.length) {\n return data;\n }\n\n // Pre-compute active filters to avoid checking empty Sets repeatedly\n const activeFilters: Array<{\n filter: PivotFilter<TItem>;\n selections?: Set<string>;\n range?: [number, number];\n }> = [];\n\n for (const filter of filters) {\n if (filter.key === skipKey) {\n continue;\n }\n\n if (filter.type === 'number') {\n const range = rangeState[filter.key];\n if (range) {\n activeFilters.push({ filter, range });\n }\n } else {\n const selections = state[filter.key];\n if (selections && selections.size > 0) {\n activeFilters.push({ filter, selections });\n }\n }\n }\n\n // Early exit if no active filters\n if (activeFilters.length === 0) {\n return data;\n }\n\n return data.filter((item) => {\n for (const { filter, selections, range } of activeFilters) {\n if (range) {\n const value = filter.getValue(item);\n const numValue = typeof value === 'number' ? value : Number(value);\n if (!Number.isNaN(numValue) && (numValue < range[0] || numValue > range[1])) {\n return false;\n }\n } else if (selections) {\n const valueKey = toKey(filter.getValue(item));\n if (!selections.has(valueKey)) {\n return false;\n }\n }\n }\n return true;\n });\n};\n\nexport const computeFilterOptions = <TItem extends object>(\n data: TItem[],\n filter: PivotFilter<TItem>,\n): PivotFilterOption[] => {\n if (filter.options?.length) {\n return filter.options;\n }\n\n const counts = new Map<string, { option: PivotFilterOption; count: number }>();\n\n data.forEach((item) => {\n const value = filter.getValue(item);\n const key = toKey(value);\n const existing = counts.get(key);\n if (existing) {\n existing.count += 1;\n } else {\n counts.set(key, {\n option: {\n key,\n label: defaultFormat(value),\n value,\n count: 1,\n },\n count: 1,\n });\n }\n });\n\n const options = Array.from(counts.values()).map(({ option, count }) => ({\n ...option,\n count,\n }));\n\n return filter.sort ? options.sort(filter.sort) : options.sort((a, b) => b.count - a.count);\n};\n\nexport const renderOptionCount = (count: number | undefined): string | number =>\n typeof count === 'number' ? count : '';\n\nexport const computeNumericRange = <TItem extends object>(\n data: TItem[],\n filter: PivotFilter<TItem>,\n): { min: number; max: number; values: PivotPrimitive[] } => {\n const values: PivotPrimitive[] = [];\n let min = Infinity;\n let max = -Infinity;\n\n data.forEach((item) => {\n const value = filter.getValue(item);\n values.push(value);\n const numValue = typeof value === 'number' ? value : Number(value);\n if (!Number.isNaN(numValue)) {\n min = Math.min(min, numValue);\n max = Math.max(max, numValue);\n }\n });\n\n return {\n min: min === Infinity ? 0 : min,\n max: max === -Infinity ? 100 : max,\n values,\n };\n};\n\nexport const groupData = <TItem extends object>(\n data: TItem[],\n dimension: PivotDimension<TItem>,\n): PivotGroup<TItem>[] => {\n const groups = new Map<string, PivotGroup<TItem>>();\n\n // Cache the formatValue function if it exists\n const formatValue = dimension.formatValue;\n\n data.forEach((item) => {\n const rawValue = dimension.getValue(item);\n const key = toKey(rawValue) || 'default';\n const group = groups.get(key);\n\n if (group) {\n group.items.push(item);\n } else {\n const label = formatValue ? formatValue(rawValue) : defaultFormat(rawValue);\n groups.set(key, {\n key,\n label,\n value: rawValue,\n items: [item],\n });\n }\n });\n\n const result = Array.from(groups.values());\n return dimension.sort ? result.sort(dimension.sort) : result.sort((a, b) => a.label.localeCompare(b.label));\n};\n\n/**\n * Reorder items for a CSS Grid that displays bottom-up, left-to-right.\n * CSS Grid fills top-to-bottom, left-to-right by default.\n *\n * Visual goal (items fill bottom row first, then row above, etc.):\n * Grid Row 0 (top): [4] [5] [6] [ ] [ ] <- partial top row, empties on RIGHT\n * Grid Row 1 (bottom): [0] [1] [2] [3] [4] <- full bottom row\n *\n * Returns array with nulls for empty cells that need placeholder rendering.\n */\nexport const reorderForBottomUpGrid = <TItem,>(items: TItem[], columns: number): (TItem | null)[] => {\n if (items.length === 0) return [];\n\n const totalRows = Math.ceil(items.length / columns);\n const itemsInTopRow = items.length % columns || columns;\n\n const result: (TItem | null)[] = [];\n\n // Top row: items from the \"overflow\" portion, plus empty cells on the right\n const topRowStartIndex = items.length - itemsInTopRow;\n for (let col = 0; col < columns; col++) {\n if (col < itemsInTopRow) {\n result.push(items[topRowStartIndex + col]);\n } else {\n result.push(null); // Empty cell on right side of top row\n }\n }\n\n // Remaining rows (from second-to-top down to bottom)\n // These are full rows, containing items 0 to (items.length - itemsInTopRow - 1)\n for (let row = 1; row < totalRows; row++) {\n // This grid row corresponds to visual row (totalRows - 1 - row) from bottom\n // Visual row 0 = bottom, visual row (totalRows-1) = top\n const visualRowFromBottom = totalRows - 1 - row;\n const rowStartIndex = visualRowFromBottom * columns;\n\n for (let col = 0; col < columns; col++) {\n result.push(items[rowStartIndex + col]);\n }\n }\n\n return result;\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
5
+ var timeline = require('primereact/timeline');
6
+ var Properties = require('./Properties.js');
7
+ require('./EventsView.css');
8
+
9
+ const EventsView = ({ events }) => {
10
+ const displayEvents = events.length > 0 ? events : [];
11
+ const containerRef = React.useRef(null);
12
+ const [canScrollUp, setCanScrollUp] = React.useState(false);
13
+ const [canScrollDown, setCanScrollDown] = React.useState(false);
14
+ const updateScrollState = () => {
15
+ const container = containerRef.current;
16
+ if (!container) {
17
+ setCanScrollUp(false);
18
+ setCanScrollDown(false);
19
+ return;
20
+ }
21
+ const { scrollTop, scrollHeight, clientHeight } = container;
22
+ const epsilon = 1;
23
+ setCanScrollUp(scrollTop > epsilon);
24
+ setCanScrollDown(scrollTop + clientHeight < scrollHeight - epsilon);
25
+ };
26
+ React.useEffect(() => {
27
+ updateScrollState();
28
+ const container = containerRef.current;
29
+ if (!container)
30
+ return;
31
+ const handleScroll = () => updateScrollState();
32
+ container.addEventListener('scroll', handleScroll);
33
+ return () => container.removeEventListener('scroll', handleScroll);
34
+ }, [displayEvents.length]);
35
+ const renderEventCard = (event, position) => {
36
+ const isLeft = position === 'left';
37
+ return (jsxRuntime.jsxs("div", { className: `events-view-event-card events-view-event-card--${position}`, children: [jsxRuntime.jsxs("div", { className: `events-view-event-header ${isLeft ? 'events-view-event-header--right' : ''}`, children: [jsxRuntime.jsx("h3", { className: `events-view-event-name ${isLeft ? 'events-view-event-name--right' : ''}`, children: event.type }), jsxRuntime.jsx("div", { className: `events-view-event-timestamp ${isLeft ? 'events-view-event-timestamp--right' : ''}`, children: event.occurred.toLocaleString() })] }), jsxRuntime.jsx("div", { className: "events-view-event-properties", children: jsxRuntime.jsx(Properties.Properties, { data: event.content || {}, align: "left" }) })] }));
38
+ };
39
+ const customContent = (event, index) => {
40
+ const position = index % 2 === 0 ? 'right' : 'left';
41
+ return renderEventCard(event, position);
42
+ };
43
+ const customMarker = () => {
44
+ return (jsxRuntime.jsx("div", { className: "events-view-marker", children: jsxRuntime.jsx("div", { className: "events-view-marker-dot" }) }));
45
+ };
46
+ const scrollToTop = () => containerRef.current?.scrollTo({ top: 0, behavior: 'smooth' });
47
+ const scrollToBottom = () => {
48
+ const container = containerRef.current;
49
+ if (!container)
50
+ return;
51
+ container.scrollTo({ top: container.scrollHeight, behavior: 'smooth' });
52
+ };
53
+ return (jsxRuntime.jsxs("div", { className: "events-view-container", ref: containerRef, children: [canScrollUp && (jsxRuntime.jsx("div", { className: "events-view-scroll-button-wrapper events-view-scroll-button-wrapper--top", children: jsxRuntime.jsx("button", { type: "button", className: "events-view-scroll-button events-view-scroll-button--top", onClick: scrollToTop, "aria-label": "Scroll to top", children: jsxRuntime.jsx("i", { className: "pi pi-arrow-up" }) }) })), jsxRuntime.jsx(timeline.Timeline, { value: displayEvents, align: "alternate", content: customContent, marker: customMarker, className: "events-view-timeline" }), canScrollDown && (jsxRuntime.jsx("div", { className: "events-view-scroll-button-wrapper events-view-scroll-button-wrapper--bottom", children: jsxRuntime.jsx("button", { type: "button", className: "events-view-scroll-button events-view-scroll-button--bottom", onClick: scrollToBottom, "aria-label": "Scroll to bottom", children: jsxRuntime.jsx("i", { className: "pi pi-arrow-down" }) }) }))] }));
54
+ };
55
+
56
+ exports.EventsView = EventsView;
57
+ //# sourceMappingURL=EventsView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventsView.js","sources":["../../../TimeMachine/EventsView.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 React, { useEffect, useRef, useState } from 'react';\nimport { Timeline } from 'primereact/timeline';\nimport type { Event } from './types';\nimport { Properties } from './Properties';\nimport './EventsView.css';\n\ninterface EventsViewProps {\n events: Event[];\n}\n\nexport const EventsView: React.FC<EventsViewProps> = ({ events }) => {\n // Use test data if no events provided\n const displayEvents = events.length > 0 ? events : [];\n const containerRef = useRef<HTMLDivElement>(null);\n const [canScrollUp, setCanScrollUp] = useState(false);\n const [canScrollDown, setCanScrollDown] = useState(false);\n\n const updateScrollState = () => {\n const container = containerRef.current;\n if (!container) {\n setCanScrollUp(false);\n setCanScrollDown(false);\n return;\n }\n\n const { scrollTop, scrollHeight, clientHeight } = container;\n const epsilon = 1;\n setCanScrollUp(scrollTop > epsilon);\n setCanScrollDown(scrollTop + clientHeight < scrollHeight - epsilon);\n };\n\n useEffect(() => {\n updateScrollState();\n const container = containerRef.current;\n if (!container) return;\n\n const handleScroll = () => updateScrollState();\n container.addEventListener('scroll', handleScroll);\n return () => container.removeEventListener('scroll', handleScroll);\n }, [displayEvents.length]);\n\n const renderEventCard = (event: Event, position: 'left' | 'right') => {\n const isLeft = position === 'left';\n\n return (\n <div className={`events-view-event-card events-view-event-card--${position}`}>\n <div className={`events-view-event-header ${isLeft ? 'events-view-event-header--right' : ''}`}>\n <h3 className={`events-view-event-name ${isLeft ? 'events-view-event-name--right' : ''}`}>{event.type}</h3>\n <div className={`events-view-event-timestamp ${isLeft ? 'events-view-event-timestamp--right' : ''}`}>\n {event.occurred.toLocaleString()}\n </div>\n </div>\n <div className=\"events-view-event-properties\">\n <Properties data={event.content || {}} align=\"left\" />\n </div>\n </div>\n );\n };\n\n const customContent = (event: Event, index: number) => {\n // PrimeReact places even indices (0,2,4,...) on the right, odd on the left\n const position = index % 2 === 0 ? 'right' : 'left';\n return renderEventCard(event, position);\n };\n\n const customMarker = () => {\n return (\n <div className=\"events-view-marker\">\n <div className=\"events-view-marker-dot\"></div>\n </div>\n );\n };\n\n const scrollToTop = () => containerRef.current?.scrollTo({ top: 0, behavior: 'smooth' });\n const scrollToBottom = () => {\n const container = containerRef.current;\n if (!container) return;\n container.scrollTo({ top: container.scrollHeight, behavior: 'smooth' });\n };\n\n return (\n <div className=\"events-view-container\" ref={containerRef}>\n {canScrollUp && (\n <div className=\"events-view-scroll-button-wrapper events-view-scroll-button-wrapper--top\">\n <button\n type=\"button\"\n className=\"events-view-scroll-button events-view-scroll-button--top\"\n onClick={scrollToTop}\n aria-label=\"Scroll to top\"\n >\n <i className=\"pi pi-arrow-up\" />\n </button>\n </div>\n )}\n <Timeline\n value={displayEvents}\n align=\"alternate\"\n content={customContent}\n marker={customMarker}\n className=\"events-view-timeline\"\n />\n {canScrollDown && (\n <div className=\"events-view-scroll-button-wrapper events-view-scroll-button-wrapper--bottom\">\n <button\n type=\"button\"\n className=\"events-view-scroll-button events-view-scroll-button--bottom\"\n onClick={scrollToBottom}\n aria-label=\"Scroll to bottom\"\n >\n <i className=\"pi pi-arrow-down\" />\n </button>\n </div>\n )}\n </div>\n );\n};\n"],"names":["useRef","useState","useEffect","_jsxs","_jsx","Properties","Timeline"],"mappings":"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"}