@cratis/components 0.1.9 → 0.1.12

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 (258) hide show
  1. package/dist/cjs/CommandForm/CommandFormFields.js +9 -3
  2. package/dist/cjs/CommandForm/CommandFormFields.js.map +1 -1
  3. package/dist/cjs/CommandForm/ValidationMessage.js +24 -0
  4. package/dist/cjs/CommandForm/ValidationMessage.js.map +1 -0
  5. package/dist/cjs/CommandForm/asCommandFormField.js +47 -0
  6. package/dist/cjs/CommandForm/asCommandFormField.js.map +1 -0
  7. package/dist/cjs/CommandForm/fields/CheckboxField.js +13 -0
  8. package/dist/cjs/CommandForm/fields/CheckboxField.js.map +1 -0
  9. package/dist/cjs/CommandForm/fields/DropdownField.js +13 -0
  10. package/dist/cjs/CommandForm/fields/DropdownField.js.map +1 -0
  11. package/dist/cjs/CommandForm/fields/InputTextField.js +13 -0
  12. package/dist/cjs/CommandForm/fields/InputTextField.js.map +1 -0
  13. package/dist/cjs/CommandForm/fields/NumberField.js +13 -0
  14. package/dist/cjs/CommandForm/fields/NumberField.js.map +1 -0
  15. package/dist/cjs/CommandForm/fields/SliderField.js +17 -0
  16. package/dist/cjs/CommandForm/fields/SliderField.js.map +1 -0
  17. package/dist/cjs/CommandForm/fields/TextAreaField.js +13 -0
  18. package/dist/cjs/CommandForm/fields/TextAreaField.js.map +1 -0
  19. package/dist/cjs/CommandForm/index.js +15 -7
  20. package/dist/cjs/CommandForm/index.js.map +1 -1
  21. package/dist/cjs/PivotViewer/PivotViewer.css +1258 -0
  22. package/dist/cjs/PivotViewer/PivotViewer.js +14 -0
  23. package/dist/cjs/PivotViewer/PivotViewer.js.map +1 -1
  24. package/dist/cjs/PivotViewer/components/PivotCanvas.js +33 -10
  25. package/dist/cjs/PivotViewer/components/PivotCanvas.js.map +1 -1
  26. package/dist/cjs/PivotViewer/components/PivotViewerMain.js +1 -1
  27. package/dist/cjs/PivotViewer/components/PivotViewerMain.js.map +1 -1
  28. package/dist/cjs/PivotViewer/components/Spinner.css +77 -0
  29. package/dist/cjs/PivotViewer/components/pivot/sprites.js +79 -15
  30. package/dist/cjs/PivotViewer/components/pivot/sprites.js.map +1 -1
  31. package/dist/cjs/PivotViewer/components/pivot/visibility.js +36 -10
  32. package/dist/cjs/PivotViewer/components/pivot/visibility.js.map +1 -1
  33. package/dist/cjs/PivotViewer/engine/layout.js +2 -1
  34. package/dist/cjs/PivotViewer/engine/layout.js.map +1 -1
  35. package/dist/cjs/PivotViewer/hooks/usePivotEngine.js +37 -2
  36. package/dist/cjs/PivotViewer/hooks/usePivotEngine.js.map +1 -1
  37. package/dist/cjs/PivotViewer/index.js +3 -0
  38. package/dist/cjs/PivotViewer/index.js.map +1 -1
  39. package/dist/cjs/PivotViewer/types.js +22 -0
  40. package/dist/cjs/PivotViewer/types.js.map +1 -0
  41. package/dist/cjs/TimeMachine/EventsView.css +213 -0
  42. package/dist/cjs/TimeMachine/TimeMachine.css +567 -0
  43. package/dist/cjs/TimeMachine/TimeMachine.js +8 -3
  44. package/dist/cjs/TimeMachine/TimeMachine.js.map +1 -1
  45. package/dist/esm/CommandForm/CommandForm.stories.d.ts +1 -0
  46. package/dist/esm/CommandForm/CommandForm.stories.d.ts.map +1 -1
  47. package/dist/esm/CommandForm/CommandForm.stories.js +34 -1
  48. package/dist/esm/CommandForm/CommandForm.stories.js.map +1 -1
  49. package/dist/esm/CommandForm/CommandFormFields.d.ts.map +1 -1
  50. package/dist/esm/CommandForm/CommandFormFields.js +9 -3
  51. package/dist/esm/CommandForm/CommandFormFields.js.map +1 -1
  52. package/dist/esm/CommandForm/UserRegistrationCommand.d.ts +63 -0
  53. package/dist/esm/CommandForm/UserRegistrationCommand.d.ts.map +1 -0
  54. package/dist/esm/CommandForm/UserRegistrationCommand.js +143 -0
  55. package/dist/esm/CommandForm/UserRegistrationCommand.js.map +1 -0
  56. package/dist/esm/CommandForm/ValidationMessage.d.ts +8 -0
  57. package/dist/esm/CommandForm/ValidationMessage.d.ts.map +1 -0
  58. package/dist/esm/CommandForm/ValidationMessage.js +22 -0
  59. package/dist/esm/CommandForm/ValidationMessage.js.map +1 -0
  60. package/dist/esm/CommandForm/asCommandFormField.d.ts +32 -0
  61. package/dist/esm/CommandForm/asCommandFormField.d.ts.map +1 -0
  62. package/dist/esm/CommandForm/asCommandFormField.js +45 -0
  63. package/dist/esm/CommandForm/asCommandFormField.js.map +1 -0
  64. package/dist/esm/CommandForm/fields/CheckboxField.d.ts +10 -0
  65. package/dist/esm/CommandForm/fields/CheckboxField.d.ts.map +1 -0
  66. package/dist/esm/CommandForm/fields/CheckboxField.js +11 -0
  67. package/dist/esm/CommandForm/fields/CheckboxField.js.map +1 -0
  68. package/dist/esm/CommandForm/fields/DropdownField.d.ts +15 -0
  69. package/dist/esm/CommandForm/fields/DropdownField.d.ts.map +1 -0
  70. package/dist/esm/CommandForm/fields/DropdownField.js +11 -0
  71. package/dist/esm/CommandForm/fields/DropdownField.js.map +1 -0
  72. package/dist/esm/CommandForm/fields/InputTextField.d.ts +11 -0
  73. package/dist/esm/CommandForm/fields/InputTextField.d.ts.map +1 -0
  74. package/dist/esm/CommandForm/fields/InputTextField.js +11 -0
  75. package/dist/esm/CommandForm/fields/InputTextField.js.map +1 -0
  76. package/dist/esm/CommandForm/fields/NumberField.d.ts +13 -0
  77. package/dist/esm/CommandForm/fields/NumberField.d.ts.map +1 -0
  78. package/dist/esm/CommandForm/fields/NumberField.js +11 -0
  79. package/dist/esm/CommandForm/fields/NumberField.js.map +1 -0
  80. package/dist/esm/CommandForm/fields/SliderField.d.ts +12 -0
  81. package/dist/esm/CommandForm/fields/SliderField.d.ts.map +1 -0
  82. package/dist/esm/CommandForm/fields/SliderField.js +15 -0
  83. package/dist/esm/CommandForm/fields/SliderField.js.map +1 -0
  84. package/dist/esm/CommandForm/fields/TextAreaField.d.ts +12 -0
  85. package/dist/esm/CommandForm/fields/TextAreaField.d.ts.map +1 -0
  86. package/dist/esm/CommandForm/fields/TextAreaField.js +11 -0
  87. package/dist/esm/CommandForm/fields/TextAreaField.js.map +1 -0
  88. package/dist/esm/CommandForm/fields/index.d.ts +7 -0
  89. package/dist/esm/CommandForm/fields/index.d.ts.map +1 -0
  90. package/dist/esm/CommandForm/fields/index.js +7 -0
  91. package/dist/esm/CommandForm/fields/index.js.map +1 -0
  92. package/dist/esm/CommandForm/index.d.ts +3 -4
  93. package/dist/esm/CommandForm/index.d.ts.map +1 -1
  94. package/dist/esm/CommandForm/index.js +8 -4
  95. package/dist/esm/CommandForm/index.js.map +1 -1
  96. package/dist/esm/PivotViewer/PivotViewer.css +1258 -0
  97. package/dist/esm/PivotViewer/PivotViewer.d.ts.map +1 -1
  98. package/dist/esm/PivotViewer/PivotViewer.js +14 -0
  99. package/dist/esm/PivotViewer/PivotViewer.js.map +1 -1
  100. package/dist/esm/PivotViewer/PivotViewer.stories.d.ts +1 -0
  101. package/dist/esm/PivotViewer/PivotViewer.stories.d.ts.map +1 -1
  102. package/dist/esm/PivotViewer/PivotViewer.stories.js +43 -3
  103. package/dist/esm/PivotViewer/PivotViewer.stories.js.map +1 -1
  104. package/dist/esm/PivotViewer/components/PivotCanvas.d.ts.map +1 -1
  105. package/dist/esm/PivotViewer/components/PivotCanvas.js +33 -10
  106. package/dist/esm/PivotViewer/components/PivotCanvas.js.map +1 -1
  107. package/dist/esm/PivotViewer/components/PivotViewerMain.js +1 -1
  108. package/dist/esm/PivotViewer/components/PivotViewerMain.js.map +1 -1
  109. package/dist/esm/PivotViewer/components/Spinner.css +77 -0
  110. package/dist/esm/PivotViewer/components/pivot/sprites.d.ts.map +1 -1
  111. package/dist/esm/PivotViewer/components/pivot/sprites.js +79 -15
  112. package/dist/esm/PivotViewer/components/pivot/sprites.js.map +1 -1
  113. package/dist/esm/PivotViewer/components/pivot/visibility.d.ts.map +1 -1
  114. package/dist/esm/PivotViewer/components/pivot/visibility.js +36 -10
  115. package/dist/esm/PivotViewer/components/pivot/visibility.js.map +1 -1
  116. package/dist/esm/PivotViewer/engine/layout.js +2 -1
  117. package/dist/esm/PivotViewer/engine/layout.js.map +1 -1
  118. package/dist/esm/PivotViewer/engine/pivot.worker.d.ts.map +1 -1
  119. package/dist/esm/PivotViewer/engine/pivot.worker.js +22 -7
  120. package/dist/esm/PivotViewer/engine/pivot.worker.js.map +1 -1
  121. package/dist/esm/PivotViewer/hooks/useFilteredData.d.ts +2 -2
  122. package/dist/esm/PivotViewer/hooks/useFilteredData.d.ts.map +1 -1
  123. package/dist/esm/PivotViewer/hooks/useFilteredData.js +4 -2
  124. package/dist/esm/PivotViewer/hooks/useFilteredData.js.map +1 -1
  125. package/dist/esm/PivotViewer/hooks/usePivotEngine.d.ts.map +1 -1
  126. package/dist/esm/PivotViewer/hooks/usePivotEngine.js +37 -2
  127. package/dist/esm/PivotViewer/hooks/usePivotEngine.js.map +1 -1
  128. package/dist/esm/PivotViewer/index.d.ts +2 -1
  129. package/dist/esm/PivotViewer/index.d.ts.map +1 -1
  130. package/dist/esm/PivotViewer/index.js +1 -0
  131. package/dist/esm/PivotViewer/index.js.map +1 -1
  132. package/dist/esm/PivotViewer/types.d.ts +4 -1
  133. package/dist/esm/PivotViewer/types.d.ts.map +1 -1
  134. package/dist/esm/PivotViewer/types.js +19 -2
  135. package/dist/esm/PivotViewer/types.js.map +1 -1
  136. package/dist/esm/TimeMachine/EventsView.css +213 -0
  137. package/dist/esm/TimeMachine/TimeMachine.css +567 -0
  138. package/dist/esm/TimeMachine/TimeMachine.d.ts.map +1 -1
  139. package/dist/esm/TimeMachine/TimeMachine.js +8 -3
  140. package/dist/esm/TimeMachine/TimeMachine.js.map +1 -1
  141. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  142. package/package.json +31 -32
  143. package/.storybook/main.ts +0 -24
  144. package/CommandDialog/CommandDialog.stories.tsx +0 -25
  145. package/CommandDialog/CommandDialog.tsx +0 -161
  146. package/CommandDialog/index.ts +0 -4
  147. package/CommandForm/CommandForm.stories.tsx +0 -24
  148. package/CommandForm/CommandForm.tsx +0 -266
  149. package/CommandForm/CommandFormField.tsx +0 -27
  150. package/CommandForm/CommandFormFields.tsx +0 -142
  151. package/CommandForm/DatePickerField.tsx +0 -57
  152. package/CommandForm/DropdownField.tsx +0 -65
  153. package/CommandForm/InputTextField.tsx +0 -62
  154. package/CommandForm/SliderField.tsx +0 -68
  155. package/CommandForm/index.ts +0 -10
  156. package/Common/ErrorBoundary.stories.tsx +0 -10
  157. package/Common/ErrorBoundary.tsx +0 -41
  158. package/Common/FormElement.stories.tsx +0 -10
  159. package/Common/FormElement.tsx +0 -20
  160. package/Common/Page.stories.tsx +0 -10
  161. package/Common/Page.tsx +0 -21
  162. package/Common/index.ts +0 -6
  163. package/DataPage/DataPage.stories.tsx +0 -10
  164. package/DataPage/DataPage.tsx +0 -191
  165. package/DataPage/index.ts +0 -4
  166. package/DataTables/DataTableForObservableQuery.stories.tsx +0 -10
  167. package/DataTables/DataTableForObservableQuery.tsx +0 -97
  168. package/DataTables/DataTableForQuery.stories.tsx +0 -10
  169. package/DataTables/DataTableForQuery.tsx +0 -97
  170. package/DataTables/index.ts +0 -5
  171. package/Dialogs/BusyIndicatorDialog.stories.tsx +0 -26
  172. package/Dialogs/BusyIndicatorDialog.tsx +0 -26
  173. package/Dialogs/ConfirmationDialog.stories.tsx +0 -36
  174. package/Dialogs/ConfirmationDialog.tsx +0 -75
  175. package/Dialogs/index.ts +0 -5
  176. package/Dropdown/Dropdown.tsx +0 -23
  177. package/Dropdown/index.ts +0 -4
  178. package/PivotViewer/PivotViewer.stories.tsx +0 -24
  179. package/PivotViewer/PivotViewer.tsx +0 -791
  180. package/PivotViewer/components/AxisLabels.tsx +0 -69
  181. package/PivotViewer/components/DetailPanel.tsx +0 -108
  182. package/PivotViewer/components/FilterPanel.tsx +0 -189
  183. package/PivotViewer/components/FilterPanelContainer.tsx +0 -10
  184. package/PivotViewer/components/PivotCanvas.tsx +0 -660
  185. package/PivotViewer/components/PivotViewerMain.tsx +0 -229
  186. package/PivotViewer/components/RangeHistogramFilter.tsx +0 -220
  187. package/PivotViewer/components/Spinner.tsx +0 -21
  188. package/PivotViewer/components/Toolbar.tsx +0 -130
  189. package/PivotViewer/components/ToolbarContainer.tsx +0 -10
  190. package/PivotViewer/components/index.ts +0 -12
  191. package/PivotViewer/components/pivot/animation.ts +0 -108
  192. package/PivotViewer/components/pivot/buckets.ts +0 -152
  193. package/PivotViewer/components/pivot/colorResolver.ts +0 -67
  194. package/PivotViewer/components/pivot/constants.ts +0 -46
  195. package/PivotViewer/components/pivot/sprites.ts +0 -265
  196. package/PivotViewer/components/pivot/visibility.ts +0 -319
  197. package/PivotViewer/constants.ts +0 -9
  198. package/PivotViewer/engine/layout.ts +0 -149
  199. package/PivotViewer/engine/pivot.worker.ts +0 -86
  200. package/PivotViewer/engine/store.ts +0 -437
  201. package/PivotViewer/engine/types.ts +0 -255
  202. package/PivotViewer/hooks/index.ts +0 -13
  203. package/PivotViewer/hooks/useContainerDimensions.ts +0 -45
  204. package/PivotViewer/hooks/useDimensionState.ts +0 -53
  205. package/PivotViewer/hooks/useFilterOptions.ts +0 -36
  206. package/PivotViewer/hooks/useFilterPanelDrag.ts +0 -49
  207. package/PivotViewer/hooks/useFilterState.ts +0 -106
  208. package/PivotViewer/hooks/useFilteredData.ts +0 -119
  209. package/PivotViewer/hooks/usePanning.ts +0 -163
  210. package/PivotViewer/hooks/usePivotEngine.ts +0 -252
  211. package/PivotViewer/hooks/useSelectedItem.ts +0 -402
  212. package/PivotViewer/hooks/useWheelZoom.ts +0 -114
  213. package/PivotViewer/hooks/useZoomState.ts +0 -34
  214. package/PivotViewer/index.ts +0 -7
  215. package/PivotViewer/types.ts +0 -59
  216. package/PivotViewer/utils/animations.ts +0 -249
  217. package/PivotViewer/utils/constants.ts +0 -20
  218. package/PivotViewer/utils/index.ts +0 -6
  219. package/PivotViewer/utils/selection.ts +0 -292
  220. package/PivotViewer/utils/utils.ts +0 -259
  221. package/TimeMachine/EventsView.stories.tsx +0 -10
  222. package/TimeMachine/EventsView.tsx +0 -119
  223. package/TimeMachine/Properties.stories.tsx +0 -10
  224. package/TimeMachine/Properties.tsx +0 -98
  225. package/TimeMachine/ReadModelView.stories.tsx +0 -10
  226. package/TimeMachine/ReadModelView.tsx +0 -143
  227. package/TimeMachine/TimeMachine.stories.tsx +0 -10
  228. package/TimeMachine/TimeMachine.tsx +0 -244
  229. package/TimeMachine/index.ts +0 -8
  230. package/TimeMachine/types.ts +0 -23
  231. package/dist/cjs/CommandForm/DatePickerField.js +0 -31
  232. package/dist/cjs/CommandForm/DatePickerField.js.map +0 -1
  233. package/dist/cjs/CommandForm/DropdownField.js +0 -31
  234. package/dist/cjs/CommandForm/DropdownField.js.map +0 -1
  235. package/dist/cjs/CommandForm/InputTextField.js +0 -32
  236. package/dist/cjs/CommandForm/InputTextField.js.map +0 -1
  237. package/dist/cjs/CommandForm/SliderField.js +0 -34
  238. package/dist/cjs/CommandForm/SliderField.js.map +0 -1
  239. package/dist/esm/CommandForm/DatePickerField.d.ts +0 -20
  240. package/dist/esm/CommandForm/DatePickerField.d.ts.map +0 -1
  241. package/dist/esm/CommandForm/DatePickerField.js +0 -29
  242. package/dist/esm/CommandForm/DatePickerField.js.map +0 -1
  243. package/dist/esm/CommandForm/DropdownField.d.ts +0 -24
  244. package/dist/esm/CommandForm/DropdownField.d.ts.map +0 -1
  245. package/dist/esm/CommandForm/DropdownField.js +0 -29
  246. package/dist/esm/CommandForm/DropdownField.js.map +0 -1
  247. package/dist/esm/CommandForm/InputTextField.d.ts +0 -20
  248. package/dist/esm/CommandForm/InputTextField.d.ts.map +0 -1
  249. package/dist/esm/CommandForm/InputTextField.js +0 -30
  250. package/dist/esm/CommandForm/InputTextField.js.map +0 -1
  251. package/dist/esm/CommandForm/SliderField.d.ts +0 -23
  252. package/dist/esm/CommandForm/SliderField.d.ts.map +0 -1
  253. package/dist/esm/CommandForm/SliderField.js +0 -32
  254. package/dist/esm/CommandForm/SliderField.js.map +0 -1
  255. package/global.d.ts +0 -11
  256. package/index.ts +0 -22
  257. package/useOverlayZIndex.ts +0 -32
  258. package/vite.config.ts +0 -80
@@ -1 +1 @@
1
- {"version":3,"file":"PivotCanvas.js","sources":["../../../../PivotViewer/components/PivotCanvas.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\nimport * as PIXI from 'pixi.js';\nimport type { ItemId, LayoutResult, GroupingResult } from '../engine/types';\nimport type { ViewMode } from './Toolbar';\nimport { createCssColorResolver, resolveCardColors } from './pivot/colorResolver';\nimport { createCardSprite as createCardSpriteExternal, updateCardContent as updateCardContentExternal, clearSpritePool } from './pivot/sprites';\nimport { syncSpritesToViewport } from './pivot/visibility';\nimport { updateBucketBackgrounds as updateBucketBackgroundsExternal, updateHighlight as updateHighlightExternal } from './pivot/buckets';\nimport { startAnimationLoop as startAnimationLoopExternal, updatePositions as updatePositionsExternal } from './pivot/animation';\nimport { ANIMATION_SPEED, DEFAULT_COLORS, type CardSprite, type CardColors } from './pivot/constants';\n\nexport interface PivotCanvasProps<TItem extends object> {\n /** Original items array */\n items: TItem[];\n\n /** Layout positions */\n layout: LayoutResult;\n\n /** Grouping information */\n grouping: GroupingResult;\n\n /** Visible item IDs */\n visibleIds: Uint32Array;\n\n /** Card dimensions */\n cardWidth: number;\n cardHeight: number;\n\n /** Zoom level */\n zoomLevel: number;\n\n /** Pan offset */\n panX: number;\n panY: number;\n\n /** Viewport dimensions (visible area) */\n viewportWidth: number;\n viewportHeight: number;\n\n /** Selected item ID */\n selectedId: ItemId | null;\n\n /** Hovered group index */\n hoveredGroupIndex: number | null;\n\n /** Current view mode */\n viewMode: ViewMode;\n\n /** Is zooming animation in progress */\n isZooming?: boolean;\n\n /** Card renderer function */\n cardRenderer?: (item: TItem) => ReactNode;\n\n /** ID resolver */\n resolveId: (item: TItem, index: number) => string | number;\n\n /** Click handler */\n onCardClick: (item: TItem, e: MouseEvent, id: number | string) => void;\n\n /** Pan handlers */\n onPanStart: (e: MouseEvent) => void;\n onPanMove: (e: MouseEvent) => void;\n onPanEnd: () => void;\n containerRef: React.RefObject<HTMLDivElement | null>;\n}\n\n// `CardSprite` type moved to ./pivot/constants and imported above\n\n// constants and CardColors type moved to ./pivot/constants\n\nexport function PivotCanvas<TItem extends object>({\n items,\n layout,\n grouping,\n visibleIds,\n cardWidth,\n cardHeight,\n zoomLevel,\n panX,\n panY,\n viewportWidth,\n viewportHeight,\n selectedId,\n hoveredGroupIndex,\n isZooming: _isZooming = false,\n resolveId: _resolveId,\n onCardClick,\n onPanStart,\n onPanMove,\n onPanEnd,\n viewMode,\n cardRenderer,\n containerRef,\n}: PivotCanvasProps<TItem>) {\n console.log('[PivotCanvas] Render', { viewMode });\n // Use the containerRef passed from the parent viewport so we append the Pixi\n // canvas and spacer into the actual scrollable element.\n const parentContainerRef = containerRef;\n // Mark intentionally-unused destructured props as used to satisfy lint\n void _isZooming;\n void _resolveId;\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const spacerRef = useRef<HTMLDivElement | null>(null);\n const appRef = useRef<PIXI.Application | null>(null);\n const rootRef = useRef<PIXI.Container | null>(null);\n const bucketsContainerRef = useRef<PIXI.Container | null>(null);\n const spritesRef = useRef<Map<ItemId, CardSprite>>(new Map());\n const animationFrameRef = useRef<number>(0);\n const mountedRef = useRef(true);\n const [pixiReady, setPixiReady] = useState(false);\n const isAnimatingRef = useRef(false);\n const needsRenderRef = useRef(false);\n const initializingRef = useRef(false);\n const isViewTransitionRef = useRef(false);\n const lastViewChangeTimeRef = useRef(0);\n const previousViewModeRef = useRef<ViewMode>(viewMode);\n const prevLayoutRef = useRef<LayoutResult | null>(null);\n const prevGroupingRef = useRef<GroupingResult | null>(null);\n const cardColorsRef = useRef<CardColors>(DEFAULT_COLORS);\n void cardRenderer; // unused in Pixi renderer but keep prop compatibility\n\n const cssColorResolver = useMemo(() => createCssColorResolver(), []);\n\n const onPanStartRef = useRef(onPanStart);\n const onPanMoveRef = useRef(onPanMove);\n const onPanEndRef = useRef(onPanEnd);\n const onCardClickRef = useRef(onCardClick);\n const prevPanRef = useRef({ x: panX, y: panY });\n\n // Initialize Pixi Application\n useEffect(() => {\n // ... existing code ...\n onPanMoveRef.current = onPanMove;\n onPanEndRef.current = onPanEnd;\n onCardClickRef.current = onCardClick;\n }, [onPanStart, onPanMove, onPanEnd, onCardClick]);\n\n useEffect(() => {\n cardColorsRef.current = resolveCardColors(cssColorResolver);\n }, [cssColorResolver]);\n\n useEffect(() => {\n // Reset mounted flag\n mountedRef.current = true;\n\n if (!parentContainerRef || !parentContainerRef.current) {\n return;\n }\n\n // Prevent multiple simultaneous initializations\n if (initializingRef.current || appRef.current) {\n return;\n }\n\n initializingRef.current = true;\n let app: PIXI.Application | null = null;\n // Handler references declared here so cleanup can remove them later.\n\n (async () => {\n try {\n // Prefer the new init API (v8+) to avoid deprecation issues. Fall back\n // to the constructor options when `init` is not available.\n const options = {\n backgroundAlpha: 0,\n antialias: false,\n autoStart: false,\n autoDensity: true,\n resolution: window.devicePixelRatio || 1,\n width: viewportWidth > 0 ? viewportWidth : 800,\n height: viewportHeight > 0 ? viewportHeight : 600,\n } as PIXI.ApplicationOptions;\n\n app = new PIXI.Application();\n if ((app as any).init && typeof (app as any).init === 'function') {\n // init may return a promise in some builds\n \n // @ts-ignore\n await app.init(options);\n } else {\n // Fall back to constructor that accepts options\n app.destroy?.();\n app = new PIXI.Application(options);\n }\n\n if (!mountedRef.current || !parentContainerRef.current) {\n // Component unmounted during initialization\n if (app && typeof app.destroy === 'function') app.destroy(true, { children: true });\n initializingRef.current = false;\n return;\n }\n\n appRef.current = app;\n\n // Create containers in correct z-order\n // 1. Bucket backgrounds (zebra striping) - bottom\n const bucketsContainer = new PIXI.Container();\n bucketsContainerRef.current = bucketsContainer;\n app.stage.addChild(bucketsContainer);\n\n // 2. Cards container - on top of buckets\n const root = new PIXI.Container();\n rootRef.current = root;\n app.stage.addChild(root);\n\n // Resolve canvas element (different Pixi builds expose it as `view` or\n // `canvas`).\n const canvasEl = (app.view ?? (app as any).canvas ?? app.renderer?.view) as HTMLCanvasElement | undefined;\n\n // Place canvas outside the scrollable content so native scrolling\n // doesn't move the canvas DOM element itself. We overlay the canvas\n // on top of the scroll area by inserting it into the parent element\n // (or the container itself if parent is not available). This ensures\n // the Pixi canvas remains stable while we move the Pixi world inside\n // it to represent camera pan.\n const overlayParent = parentContainerRef.current.parentElement ?? parentContainerRef.current;\n if (canvasEl) {\n if (canvasEl.parentElement) {\n canvasEl.parentElement.removeChild(canvasEl);\n }\n overlayParent.appendChild(canvasEl);\n canvasRef.current = canvasEl;\n } else if ((app as any).canvas) {\n const c = (app as any).canvas;\n if (c.parentElement) {\n c.parentElement.removeChild(c);\n }\n overlayParent.appendChild(c);\n canvasRef.current = c;\n }\n\n // Position the canvas to overlay the scrollable container area.\n if (canvasRef.current && parentContainerRef.current) {\n const parentBounds = parentContainerRef.current.getBoundingClientRect();\n void parentBounds;\n canvasRef.current.style.position = 'absolute';\n // Place canvas relative to the overlayParent's coordinate space.\n // If overlayParent is the immediate parent, top/left 0 aligns it.\n const offsetLeft = parentContainerRef.current.offsetLeft;\n const offsetTop = parentContainerRef.current.offsetTop;\n canvasRef.current.style.left = `${offsetLeft}px`;\n canvasRef.current.style.top = `${offsetTop}px`;\n canvasRef.current.style.width = `${parentContainerRef.current.clientWidth}px`;\n canvasRef.current.style.height = `${parentContainerRef.current.clientHeight}px`;\n // Place canvas behind the scrollable container (which has z-index 1)\n // so scrollbars appear on top.\n canvasRef.current.style.zIndex = '0';\n // Disable pointer events on canvas so they pass through to the viewport if needed,\n // though viewport is on top anyway.\n canvasRef.current.style.pointerEvents = 'none';\n }\n\n // We handle clicks and interactions manually in PivotViewerMain now,\n // so we don't need to configure Pixi events on the container.\n // This avoids z-index conflicts and event propagation issues.\n\n // Make canvas fill container with absolute positioning\n if (canvasRef.current) {\n canvasRef.current.style.display = 'block';\n // Ensure canvas does not capture events so they pass through to the viewport\n canvasRef.current.style.pointerEvents = 'none';\n }\n\n // Setup stage events for background panning\n app.stage.eventMode = 'static';\n app.stage.hitArea = new PIXI.Rectangle(0, 0, viewportWidth, viewportHeight);\n\n app.stage.on('pointerdown', (e) => {\n // Only handle if it reached the stage (background)\n // Sprites stop propagation, so this is safe\n onPanStartRef.current(e.nativeEvent as unknown as MouseEvent);\n });\n\n app.stage.on('globalpointermove', (e) => {\n onPanMoveRef.current(e.nativeEvent as unknown as MouseEvent);\n });\n\n app.stage.on('globalpointerup', () => {\n onPanEndRef.current();\n });\n\n // We no longer need manual event listeners on parentEl because Pixi\n // is now listening to events on parentEl directly via setTargetElement.\n // This allows Pixi to handle hit testing through the transparent container.\n const parentEl = parentContainerRef.current;\n if (parentEl) {\n // handleMouseDown = (e: Event) => onPanStartRef.current(e as unknown);\n // handleMouseMove = (e: Event) => onPanMoveRef.current(e as unknown);\n // handleMouseUp = () => onPanEndRef.current();\n // parentEl.addEventListener('mousedown', handleMouseDown);\n // parentEl.addEventListener('mousemove', handleMouseMove);\n // parentEl.addEventListener('mouseup', handleMouseUp);\n // parentEl.addEventListener('mouseleave', handleMouseUp);\n // window.addEventListener('mouseup', handleMouseUp);\n // window.addEventListener('pointerup', handleMouseUp);\n }\n\n // Immediately size to container to avoid delay\n if (viewportWidth > 0 && viewportHeight > 0) {\n app.renderer?.resize(viewportWidth, viewportHeight);\n }\n\n setPixiReady(true);\n initializingRef.current = false;\n\n // Trigger initial render\n needsRenderRef.current = true;\n app.renderer?.render(app.stage);\n } catch (error) {\n console.error('Failed to initialize Pixi.js:', error);\n initializingRef.current = false;\n }\n })();\n\n return () => {\n mountedRef.current = false;\n setPixiReady(false);\n cancelAnimationFrame(animationFrameRef.current);\n\n if (appRef.current && typeof appRef.current.destroy === 'function') {\n appRef.current.destroy(true, { children: true });\n appRef.current = null;\n rootRef.current = null;\n }\n\n // Clear sprite pool to avoid holding onto destroyed textures\n clearSpritePool();\n\n // Remove any event listeners we attached to the parent container\n try {\n const parentEl = parentContainerRef.current;\n if (parentEl) {\n // if (handleMouseDown) parentEl.removeEventListener('mousedown', handleMouseDown);\n // if (handleMouseMove) parentEl.removeEventListener('mousemove', handleMouseMove);\n // if (handleMouseUp) parentEl.removeEventListener('mouseup', handleMouseUp);\n // if (handleMouseUp) parentEl.removeEventListener('mouseleave', handleMouseUp);\n // if (handleMouseUp) {\n // window.removeEventListener('mouseup', handleMouseUp);\n // window.removeEventListener('pointerup', handleMouseUp);\n // }\n }\n } catch (e) {\n void e;\n }\n // Remove DOM nodes we appended\n try {\n if (canvasRef.current && canvasRef.current.parentElement) {\n canvasRef.current.parentElement.removeChild(canvasRef.current);\n }\n } catch (e) {\n void e;\n }\n };\n }, [viewportWidth, viewportHeight]);\n\n // Handle canvas resize\n useEffect(() => {\n if (!parentContainerRef || !parentContainerRef.current || !appRef.current || !pixiReady) return;\n\n const container = parentContainerRef.current;\n const app = appRef.current;\n\n let resizeTimeout: ReturnType<typeof setTimeout>;\n\n const handleResize = () => {\n // Size canvas to viewport dimensions from props\n if (viewportWidth > 0 && viewportHeight > 0) {\n app.renderer?.resize(viewportWidth, viewportHeight);\n app.stage.hitArea = new PIXI.Rectangle(0, 0, viewportWidth, viewportHeight);\n\n // Keep canvas DOM size in sync with container\n if (canvasRef.current && parentContainerRef.current) {\n canvasRef.current.style.width = `${parentContainerRef.current.clientWidth}px`;\n canvasRef.current.style.height = `${parentContainerRef.current.clientHeight}px`;\n // Also update left/top in case the container moved\n canvasRef.current.style.left = `${parentContainerRef.current.offsetLeft}px`;\n canvasRef.current.style.top = `${parentContainerRef.current.offsetTop}px`;\n }\n }\n };\n\n const debouncedResize = () => {\n clearTimeout(resizeTimeout);\n resizeTimeout = setTimeout(handleResize, 150);\n };\n\n // Initial resize (immediate)\n handleResize();\n\n // Watch for size changes (debounced)\n const resizeObserver = new ResizeObserver(debouncedResize);\n resizeObserver.observe(container);\n\n return () => {\n clearTimeout(resizeTimeout);\n resizeObserver.disconnect();\n };\n }, [pixiReady, viewportWidth, viewportHeight]);\n\n // Update bucket backgrounds only when layout/grouping changes\n useEffect(() => {\n if (!bucketsContainerRef.current || !pixiReady) return;\n updateBucketBackgroundsExternal(bucketsContainerRef.current, parentContainerRef.current, grouping, layout, zoomLevel, cardColorsRef.current, viewMode);\n needsRenderRef.current = true;\n appRef.current?.renderer?.render(appRef.current.stage);\n }, [grouping, layout, zoomLevel, viewMode, pixiReady]);\n\n useEffect(() => {\n if (!rootRef.current || !pixiReady) {\n return;\n }\n\n // Check if this is a view mode change (not just pan/scroll)\n const viewModeChanged = previousViewModeRef.current !== viewMode;\n const groupingChanged = prevGroupingRef.current !== grouping;\n\n if (viewModeChanged || groupingChanged) {\n isViewTransitionRef.current = true;\n lastViewChangeTimeRef.current = Date.now();\n previousViewModeRef.current = viewMode;\n prevGroupingRef.current = grouping;\n }\n\n // Update spacer dimensions to match scaled world size\n if (spacerRef.current) {\n const spacer = spacerRef.current;\n const worldWidth = (layout.totalWidth || viewportWidth) * zoomLevel;\n const worldHeight = (layout.totalHeight || viewportHeight) * zoomLevel;\n spacer.style.width = `${Math.max(worldWidth, viewportWidth)}px`;\n spacer.style.height = `${Math.max(worldHeight, viewportHeight)}px`;\n }\n\n // Ensure scroll spacer matches layout so the container becomes scrollable and\n // native scrollLeft/scrollTop reflect the camera position.\n if (parentContainerRef.current) {\n const spacer = spacerRef.current;\n if (spacer) {\n // Debug: log spacer and layout values to detect mismatches\n }\n }\n\n const panDeltaX = panX - prevPanRef.current.x;\n const panDeltaY = panY - prevPanRef.current.y;\n prevPanRef.current = { x: panX, y: panY };\n\n // Sync sprites into viewport and create/remove as needed\n // Provide wrappers for sprite creation and content update so helpers have required context\n syncSpritesToViewport({\n root: rootRef.current,\n container: parentContainerRef.current,\n sprites: spritesRef.current,\n layout,\n visibleIds,\n items,\n cardWidth,\n cardHeight,\n panX,\n panY,\n panDeltaX,\n panDeltaY,\n zoomLevel,\n viewportWidth,\n viewportHeight,\n createCardSprite: (id: string | number, x: number, y: number) => createCardSpriteExternal(\n id,\n x,\n y,\n items as any,\n (item: TItem, e: any, id: string | number) => (onCardClickRef.current as any)(item, e, id),\n (onPanStart as any),\n cardWidth,\n cardHeight,\n cardColorsRef.current\n ),\n updateCardContent: (sprite: CardSprite | any, item: any) => updateCardContentExternal(sprite, item, selectedId, cardWidth, cardHeight, cardColorsRef.current),\n isViewTransition: isViewTransitionRef.current || (Date.now() - lastViewChangeTimeRef.current < 1000),\n prevLayout: prevLayoutRef.current,\n });\n needsRenderRef.current = true;\n startAnimationLoopExternal({\n mountedRef,\n appRef,\n animationFrameRef,\n isAnimatingRef,\n needsRenderRef,\n spritesRef,\n isViewTransitionRef,\n });\n }, [layout, visibleIds, items, cardWidth, cardHeight, pixiReady, zoomLevel, panX, panY, grouping, viewMode]);\n\n // Update prevLayoutRef after processing layout changes\n useEffect(() => {\n prevLayoutRef.current = layout;\n }, [layout]);\n\n useEffect(() => {\n if (!rootRef.current || !bucketsContainerRef.current) return;\n\n // Camera transform: move world opposite to camera position. Prefer the\n // native container scroll positions where available (they are authoritative\n // during user scrolls) and fall back to the passed pan props.\n const effectivePanX = parentContainerRef.current ? parentContainerRef.current.scrollLeft : panX;\n const effectivePanY = parentContainerRef.current ? parentContainerRef.current.scrollTop : panY;\n\n // Apply zoom and position to root and buckets.\n rootRef.current.scale.set(zoomLevel);\n bucketsContainerRef.current.scale.set(zoomLevel);\n rootRef.current.position.set(-effectivePanX, -effectivePanY);\n bucketsContainerRef.current.position.set(-effectivePanX, -effectivePanY);\n appRef.current?.renderer?.render(appRef.current.stage);\n }, [zoomLevel, panX, panY]);\n\n useEffect(() => {\n if (!rootRef.current) return;\n updateSelection();\n needsRenderRef.current = true;\n appRef.current?.renderer.render(appRef.current.stage);\n }, [selectedId, items]);\n\n useEffect(() => {\n if (!rootRef.current) return;\n updateHighlight();\n needsRenderRef.current = true;\n appRef.current?.renderer.render(appRef.current.stage);\n }, [hoveredGroupIndex, layout, grouping]);\n\n // Note: animation loop and bucket background updates are delegated to\n // external helpers (`startAnimationLoopExternal` and\n // `updateBucketBackgroundsExternal`) and invoked where needed. We don't\n // expose local wrappers to avoid unused-function lint warnings.\n\n // Listen to native scroll events on the parent container so we update the\n // Pixi world immediately when the user scrolls (native scrollbar or\n // programmatic). This ensures `syncSpritesToViewport` runs on scroll and\n // creates/destroys sprites as the viewport moves.\n useEffect(() => {\n if (!pixiReady || !parentContainerRef || !parentContainerRef.current || !appRef.current || !rootRef.current) return;\n\n const container = parentContainerRef.current;\n const app = appRef.current;\n\n // rAF-batched scroll handling: store the latest scroll values and process\n // them once per animation frame to avoid heavy synchronous work inside\n // the scroll event which causes jank and de-synchronisation between the\n // compositor and Pixi render updates.\n const lastScroll = { x: container.scrollLeft, y: container.scrollTop };\n const pendingRef = { scheduled: false } as { scheduled: boolean };\n\n const processScroll = () => {\n pendingRef.scheduled = false;\n try {\n // Read directly from container to ensure consistency with visibility logic\n // and to handle cases where scroll changes without event (e.g. resize clamping)\n const effectivePanX = container.scrollLeft;\n const effectivePanY = container.scrollTop;\n\n // Update lastScroll to keep it in sync\n lastScroll.x = effectivePanX;\n lastScroll.y = effectivePanY;\n\n if (rootRef.current && bucketsContainerRef.current) {\n rootRef.current.scale.set(zoomLevel);\n bucketsContainerRef.current.scale.set(zoomLevel);\n const invScale = zoomLevel && zoomLevel !== 0 ? 1 / zoomLevel : 1;\n void invScale;\n rootRef.current.position.set(-effectivePanX, -effectivePanY);\n bucketsContainerRef.current.position.set(-effectivePanX, -effectivePanY);\n }\n\n syncSpritesToViewport({\n root: rootRef.current,\n container: parentContainerRef.current,\n sprites: spritesRef.current,\n layout,\n visibleIds,\n items,\n cardWidth,\n cardHeight,\n panX,\n panY,\n zoomLevel,\n viewportWidth,\n viewportHeight,\n createCardSprite: (id: string | number, x: number, y: number) => createCardSpriteExternal(\n id, x, y, items as any,\n (item, e, id) => (onCardClickRef.current as any)(item, e, id),\n (e) => (onPanStartRef.current as any)(e, true), // Explicitly mark as on-card for Pixi events\n cardWidth, cardHeight, cardColorsRef.current\n ),\n updateCardContent: (sprite: CardSprite | any, item: any) => updateCardContentExternal(sprite, item, selectedId, cardWidth, cardHeight, cardColorsRef.current),\n isViewTransition: isViewTransitionRef.current || (Date.now() - lastViewChangeTimeRef.current < 1000),\n });\n needsRenderRef.current = true;\n app.renderer?.render(app.stage);\n } catch (e) {\n console.error('[PivotCanvas] processScroll error', e);\n }\n };\n\n const onScroll = () => {\n // capture latest scroll positions quickly and schedule work\n lastScroll.x = container.scrollLeft;\n lastScroll.y = container.scrollTop;\n if (!pendingRef.scheduled) {\n pendingRef.scheduled = true;\n requestAnimationFrame(processScroll);\n }\n };\n\n container.addEventListener('scroll', onScroll, { passive: true });\n\n return () => {\n container.removeEventListener('scroll', onScroll);\n };\n }, [pixiReady, layout, visibleIds, items, cardWidth, cardHeight, zoomLevel, viewportWidth, viewportHeight, panX, panY, grouping, viewMode, selectedId, onCardClick, onPanStart]);\n\n function createCardSprite(id: ItemId, x: number, y: number): CardSprite {\n return createCardSpriteExternal(\n id, x, y, items as any,\n (item, e, id) => (onCardClickRef.current as any)(item, e, id),\n (e) => (onPanStartRef.current as any)(e, true),\n cardWidth, cardHeight, cardColorsRef.current\n );\n }\n // Mark these helpers as used (they may be referenced externally or via callbacks)\n void createCardSprite;\n\n function updateCardContent(sprite: CardSprite, item: TItem) {\n return updateCardContentExternal(sprite as any, item as any, selectedId, cardWidth, cardHeight, cardColorsRef.current) as any;\n }\n\n function updatePositions(): boolean {\n return updatePositionsExternal(spritesRef.current, isViewTransitionRef, ANIMATION_SPEED);\n }\n\n void updatePositions;\n\n function updateSelection() {\n const sprites = spritesRef.current;\n\n for (const sprite of sprites.values()) {\n const val = (items as any)[String(sprite.itemId)];\n updateCardContent(sprite, val);\n }\n }\n\n function updateHighlight() {\n updateHighlightExternal(bucketsContainerRef.current, parentContainerRef.current, grouping, layout, hoveredGroupIndex, cardWidth, zoomLevel);\n }\n\n void updateHighlight;\n\n // This component renders into the parent `containerRef` (we append Pixi canvas\n // and spacer directly into that DOM node). Return null so we don't replace or\n // reassign the parent's ref which must remain the scrollable viewport element.\n return null;\n}\n"],"names":["updateBucketBackgroundsExternal","createCardSpriteExternal","updateCardContentExternal","startAnimationLoopExternal","updateHighlight","updateCardContent","updateHighlightExternal"],"mappings":";;;;;;;;;AA0EM,SAAU,WAAW,CAAuB,EAChD,KAAK,EACL,MAAM,EACN,QAAQ,EACR,UAAU,EACV,SAAS,EACT,UAAU,EACV,SAAS,EACT,IAAI,EACJ,IAAI,EACJ,aAAa,EACb,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,SAAS,EAAE,UAAU,GAAG,KAAK,EAC7B,SAAS,EAAE,UAAU,EACrB,WAAW,EACX,UAAU,EACV,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,YAAY,GACY,EAAA;IACxB,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,CAAC;IAGjD,MAAM,kBAAkB,GAAG,YAAY;AAIvC,IAAA,MAAM,SAAS,GAAG,MAAM,CAA2B,IAAI,CAAC;AACxD,IAAA,MAAM,SAAS,GAAG,MAAM,CAAwB,IAAI,CAAC;AACrD,IAAA,MAAM,MAAM,GAAG,MAAM,CAA0B,IAAI,CAAC;AACpD,IAAA,MAAM,OAAO,GAAG,MAAM,CAAwB,IAAI,CAAC;AACnD,IAAA,MAAM,mBAAmB,GAAG,MAAM,CAAwB,IAAI,CAAC;IAC/D,MAAM,UAAU,GAAG,MAAM,CAA0B,IAAI,GAAG,EAAE,CAAC;AAC7D,IAAA,MAAM,iBAAiB,GAAG,MAAM,CAAS,CAAC,CAAC;AAC3C,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;IAC/B,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;AACjD,IAAA,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC;AACpC,IAAA,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC;AACpC,IAAA,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC;AACrC,IAAA,MAAM,mBAAmB,GAAG,MAAM,CAAC,KAAK,CAAC;AACzC,IAAA,MAAM,qBAAqB,GAAG,MAAM,CAAC,CAAC,CAAC;AACvC,IAAA,MAAM,mBAAmB,GAAG,MAAM,CAAW,QAAQ,CAAC;AACtD,IAAA,MAAM,aAAa,GAAG,MAAM,CAAsB,IAAI,CAAC;AACvD,IAAA,MAAM,eAAe,GAAG,MAAM,CAAwB,IAAI,CAAC;AAC3D,IAAA,MAAM,aAAa,GAAG,MAAM,CAAa,cAAc,CAAC;AAGxD,IAAA,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,sBAAsB,EAAE,EAAE,EAAE,CAAC;AAEpE,IAAA,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC;AACxC,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC;AACtC,IAAA,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC;AACpC,IAAA,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW,CAAC;AAC1C,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;IAG/C,SAAS,CAAC,MAAK;AAEb,QAAA,YAAY,CAAC,OAAO,GAAG,SAAS;AAChC,QAAA,WAAW,CAAC,OAAO,GAAG,QAAQ;AAC9B,QAAA,cAAc,CAAC,OAAO,GAAG,WAAW;IACtC,CAAC,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAElD,SAAS,CAAC,MAAK;AACb,QAAA,aAAa,CAAC,OAAO,GAAG,iBAAiB,CAAC,gBAAgB,CAAC;AAC7D,IAAA,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC;IAEtB,SAAS,CAAC,MAAK;AAEb,QAAA,UAAU,CAAC,OAAO,GAAG,IAAI;QAEzB,IAAI,CAAC,kBAAkB,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE;YACtD;QACF;QAGA,IAAI,eAAe,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE;YAC7C;QACF;AAEA,QAAA,eAAe,CAAC,OAAO,GAAG,IAAI;QAC9B,IAAI,GAAG,GAA4B,IAAI;QAGvC,CAAC,YAAW;AACV,YAAA,IAAI;AAGF,gBAAA,MAAM,OAAO,GAAG;AACd,oBAAA,eAAe,EAAE,CAAC;AAClB,oBAAA,SAAS,EAAE,KAAK;AAChB,oBAAA,SAAS,EAAE,KAAK;AAChB,oBAAA,WAAW,EAAE,IAAI;AACjB,oBAAA,UAAU,EAAE,MAAM,CAAC,gBAAgB,IAAI,CAAC;oBACxC,KAAK,EAAE,aAAa,GAAG,CAAC,GAAG,aAAa,GAAG,GAAG;oBAC9C,MAAM,EAAE,cAAc,GAAG,CAAC,GAAG,cAAc,GAAG,GAAG;iBACvB;AAE1B,gBAAA,GAAG,GAAG,IAAI,IAAI,CAAC,WAAW,EAAE;gBAC9B,IAAK,GAAW,CAAC,IAAI,IAAI,OAAQ,GAAW,CAAC,IAAI,KAAK,UAAU,EAAE;AAIhE,oBAAA,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;gBACzB;qBAAO;AAEL,oBAAA,GAAG,CAAC,OAAO,IAAI;oBACf,GAAG,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;gBACrC;gBAEA,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE;AAEtD,oBAAA,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,UAAU;wBAAE,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACnF,oBAAA,eAAe,CAAC,OAAO,GAAG,KAAK;oBAC/B;gBACF;AAEA,gBAAA,MAAM,CAAC,OAAO,GAAG,GAAG;AAIpB,gBAAA,MAAM,gBAAgB,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE;AAC7C,gBAAA,mBAAmB,CAAC,OAAO,GAAG,gBAAgB;AAC9C,gBAAA,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC;AAGpC,gBAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE;AACjC,gBAAA,OAAO,CAAC,OAAO,GAAG,IAAI;AACtB,gBAAA,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;AAIxB,gBAAA,MAAM,QAAQ,IAAI,GAAG,CAAC,IAAI,IAAK,GAAW,CAAC,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAkC;gBAQzG,MAAM,aAAa,GAAG,kBAAkB,CAAC,OAAO,CAAC,aAAa,IAAI,kBAAkB,CAAC,OAAO;gBAC5F,IAAI,QAAQ,EAAE;AACZ,oBAAA,IAAI,QAAQ,CAAC,aAAa,EAAE;AAC1B,wBAAA,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC,QAAQ,CAAC;oBAC9C;AACA,oBAAA,aAAa,CAAC,WAAW,CAAC,QAAQ,CAAC;AACnC,oBAAA,SAAS,CAAC,OAAO,GAAG,QAAQ;gBAC9B;AAAO,qBAAA,IAAK,GAAW,CAAC,MAAM,EAAE;AAC9B,oBAAA,MAAM,CAAC,GAAI,GAAW,CAAC,MAAM;AAC7B,oBAAA,IAAI,CAAC,CAAC,aAAa,EAAE;AACnB,wBAAA,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC;oBAChC;AACA,oBAAA,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC;AAC5B,oBAAA,SAAS,CAAC,OAAO,GAAG,CAAC;gBACvB;gBAGA,IAAI,SAAS,CAAC,OAAO,IAAI,kBAAkB,CAAC,OAAO,EAAE;oBACnD,MAAM,YAAY,GAAG,kBAAkB,CAAC,OAAO,CAAC,qBAAqB,EAAE;AACvE,oBAAA,KAAK,YAAY;oBACjB,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;AAG7C,oBAAA,MAAM,UAAU,GAAG,kBAAkB,CAAC,OAAO,CAAC,UAAU;AACxD,oBAAA,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,SAAS;oBACtD,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,CAAA,EAAG,UAAU,CAAA,EAAA,CAAI;oBAChD,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA,EAAG,SAAS,CAAA,EAAA,CAAI;AAC9C,oBAAA,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAA,EAAG,kBAAkB,CAAC,OAAO,CAAC,WAAW,IAAI;AAC7E,oBAAA,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAA,EAAG,kBAAkB,CAAC,OAAO,CAAC,YAAY,IAAI;oBAG/E,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG;oBAGpC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM;gBAChD;AAOA,gBAAA,IAAI,SAAS,CAAC,OAAO,EAAE;oBACrB,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO;oBAEzC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM;gBAChD;AAGA,gBAAA,GAAG,CAAC,KAAK,CAAC,SAAS,GAAG,QAAQ;AAC9B,gBAAA,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE,cAAc,CAAC;gBAE3E,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC,KAAI;AAGhC,oBAAA,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,WAAoC,CAAC;AAC/D,gBAAA,CAAC,CAAC;gBAEF,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,CAAC,KAAI;AACtC,oBAAA,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,WAAoC,CAAC;AAC9D,gBAAA,CAAC,CAAC;gBAEF,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,iBAAiB,EAAE,MAAK;oBACnC,WAAW,CAAC,OAAO,EAAE;AACvB,gBAAA,CAAC,CAAC;AAKF,gBAAA,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO;gBAC3C,IAAI,QAAQ,EAAE;gBAUd;gBAGA,IAAI,aAAa,GAAG,CAAC,IAAI,cAAc,GAAG,CAAC,EAAE;oBAC3C,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC;gBACrD;gBAEA,YAAY,CAAC,IAAI,CAAC;AAClB,gBAAA,eAAe,CAAC,OAAO,GAAG,KAAK;AAG/B,gBAAA,cAAc,CAAC,OAAO,GAAG,IAAI;gBAC7B,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;YACjC;YAAE,OAAO,KAAK,EAAE;AACd,gBAAA,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC;AACrD,gBAAA,eAAe,CAAC,OAAO,GAAG,KAAK;YACjC;QACF,CAAC,GAAG;AAEJ,QAAA,OAAO,MAAK;AACV,YAAA,UAAU,CAAC,OAAO,GAAG,KAAK;YAC1B,YAAY,CAAC,KAAK,CAAC;AACnB,YAAA,oBAAoB,CAAC,iBAAiB,CAAC,OAAO,CAAC;AAE/C,YAAA,IAAI,MAAM,CAAC,OAAO,IAAI,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,KAAK,UAAU,EAAE;AAClE,gBAAA,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAChD,gBAAA,MAAM,CAAC,OAAO,GAAG,IAAI;AACrB,gBAAA,OAAO,CAAC,OAAO,GAAG,IAAI;YACxB;AAGA,YAAA,eAAe,EAAE;AAGjB,YAAA,IAAI;AACF,gBAAA,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO;gBAC3C,IAAI,QAAQ,EAAE;gBASd;YACF;YAAE,OAAO,CAAC,EAAE;YAEZ;AAEA,YAAA,IAAI;gBACF,IAAI,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,aAAa,EAAE;oBACxD,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC;gBAChE;YACF;YAAE,OAAO,CAAC,EAAE;YAEZ;AACF,QAAA,CAAC;AACH,IAAA,CAAC,EAAE,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IAGnC,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,kBAAkB,IAAI,CAAC,kBAAkB,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,SAAS;YAAE;AAEzF,QAAA,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO;AAC5C,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO;AAE1B,QAAA,IAAI,aAA4C;QAEhD,MAAM,YAAY,GAAG,MAAK;YAExB,IAAI,aAAa,GAAG,CAAC,IAAI,cAAc,GAAG,CAAC,EAAE;gBAC3C,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC;AACnD,gBAAA,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE,cAAc,CAAC;gBAG3E,IAAI,SAAS,CAAC,OAAO,IAAI,kBAAkB,CAAC,OAAO,EAAE;AACnD,oBAAA,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAA,EAAG,kBAAkB,CAAC,OAAO,CAAC,WAAW,IAAI;AAC7E,oBAAA,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAA,EAAG,kBAAkB,CAAC,OAAO,CAAC,YAAY,IAAI;AAE/E,oBAAA,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,CAAA,EAAG,kBAAkB,CAAC,OAAO,CAAC,UAAU,IAAI;AAC3E,oBAAA,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA,EAAG,kBAAkB,CAAC,OAAO,CAAC,SAAS,IAAI;gBAC3E;YACF;AACF,QAAA,CAAC;QAED,MAAM,eAAe,GAAG,MAAK;YAC3B,YAAY,CAAC,aAAa,CAAC;AAC3B,YAAA,aAAa,GAAG,UAAU,CAAC,YAAY,EAAE,GAAG,CAAC;AAC/C,QAAA,CAAC;AAGD,QAAA,YAAY,EAAE;AAGd,QAAA,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,eAAe,CAAC;AAC1D,QAAA,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC;AAEjC,QAAA,OAAO,MAAK;YACV,YAAY,CAAC,aAAa,CAAC;YAC3B,cAAc,CAAC,UAAU,EAAE;AAC7B,QAAA,CAAC;IACH,CAAC,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;IAG9C,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,IAAI,CAAC,SAAS;YAAE;QAChDA,uBAA+B,CAAC,mBAAmB,CAAC,OAAO,EAAE,kBAAkB,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC;AACtJ,QAAA,cAAc,CAAC,OAAO,GAAG,IAAI;AAC7B,QAAA,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;AACxD,IAAA,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAEtD,SAAS,CAAC,MAAK;QACb,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,SAAS,EAAE;YAClC;QACF;AAGA,QAAA,MAAM,eAAe,GAAG,mBAAmB,CAAC,OAAO,KAAK,QAAQ;AAChE,QAAA,MAAM,eAAe,GAAG,eAAe,CAAC,OAAO,KAAK,QAAQ;AAE5D,QAAA,IAAI,eAAe,IAAI,eAAe,EAAE;AACtC,YAAA,mBAAmB,CAAC,OAAO,GAAG,IAAI;AAClC,YAAA,qBAAqB,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE;AAC1C,YAAA,mBAAmB,CAAC,OAAO,GAAG,QAAQ;AACtC,YAAA,eAAe,CAAC,OAAO,GAAG,QAAQ;QACpC;AAGA,QAAA,IAAI,SAAS,CAAC,OAAO,EAAE;AACrB,YAAA,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO;YAChC,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,aAAa,IAAI,SAAS;YACnE,MAAM,WAAW,GAAG,CAAC,MAAM,CAAC,WAAW,IAAI,cAAc,IAAI,SAAS;AACtE,YAAA,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAA,EAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,aAAa,CAAC,IAAI;AAC/D,YAAA,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAA,EAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,cAAc,CAAC,IAAI;QACpE;AAIA,QAAA,IAAI,kBAAkB,CAAC,OAAO,EAAE;AAC9B,YAAe,SAAS,CAAC;QAI3B;QAEA,MAAM,SAAS,GAAG,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,SAAS,GAAG,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;AAC7C,QAAA,UAAU,CAAC,OAAO,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE;AAIzC,QAAA,qBAAqB,CAAC;YACpB,IAAI,EAAE,OAAO,CAAC,OAAO;YACrB,SAAS,EAAE,kBAAkB,CAAC,OAAO;YACrC,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,MAAM;YACN,UAAU;YACV,KAAK;YACL,SAAS;YACT,UAAU;YACV,IAAI;YACJ,IAAI;YACJ,SAAS;YACT,SAAS;YACT,SAAS;YACT,aAAa;YACb,cAAc;YACd,gBAAgB,EAAE,CAAC,EAAmB,EAAE,CAAS,EAAE,CAAS,KAAKC,gBAAwB,CACvF,EAAE,EACF,CAAC,EACD,CAAC,EACD,KAAY,EACZ,CAAC,IAAW,EAAE,CAAM,EAAE,EAAmB,KAAM,cAAc,CAAC,OAAe,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EACzF,UAAkB,EACnB,SAAS,EACT,UAAU,EACV,aAAa,CAAC,OAAO,CACtB;YACD,iBAAiB,EAAE,CAAC,MAAwB,EAAE,IAAS,KAAKC,iBAAyB,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,CAAC,OAAO,CAAC;AAC7J,YAAA,gBAAgB,EAAE,mBAAmB,CAAC,OAAO,KAAK,IAAI,CAAC,GAAG,EAAE,GAAG,qBAAqB,CAAC,OAAO,GAAG,IAAI,CAAC;YACpG,UAAU,EAAE,aAAa,CAAC,OAAO;AAClC,SAAA,CAAC;AACF,QAAA,cAAc,CAAC,OAAO,GAAG,IAAI;AAC7B,QAAAC,kBAA0B,CAAC;YACzB,UAAU;YACV,MAAM;YACN,iBAAiB;YACjB,cAAc;YACd,cAAc;YACd,UAAU;YACV,mBAAmB;AACpB,SAAA,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAG5G,SAAS,CAAC,MAAK;AACb,QAAA,aAAa,CAAC,OAAO,GAAG,MAAM;AAChC,IAAA,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;IAEZ,SAAS,CAAC,MAAK;QACb,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,mBAAmB,CAAC,OAAO;YAAE;AAKtD,QAAA,MAAM,aAAa,GAAG,kBAAkB,CAAC,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,UAAU,GAAG,IAAI;AAC/F,QAAA,MAAM,aAAa,GAAG,kBAAkB,CAAC,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI;QAG9F,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;QACpC,mBAAmB,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;AAChD,QAAA,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC,aAAa,CAAC;AAC5D,QAAA,mBAAmB,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC,aAAa,CAAC;AACxE,QAAA,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;IACxD,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAE3B,SAAS,CAAC,MAAK;QACb,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE;AACtB,QAAA,eAAe,EAAE;AACjB,QAAA,cAAc,CAAC,OAAO,GAAG,IAAI;AAC7B,QAAA,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;AACvD,IAAA,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAEvB,SAAS,CAAC,MAAK;QACb,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE;AACtB,QAAAC,iBAAe,EAAE;AACjB,QAAA,cAAc,CAAC,OAAO,GAAG,IAAI;AAC7B,QAAA,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;IACvD,CAAC,EAAE,CAAC,iBAAiB,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAWzC,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,SAAS,IAAI,CAAC,kBAAkB,IAAI,CAAC,kBAAkB,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE;AAE7G,QAAA,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO;AAC5C,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO;AAM1B,QAAA,MAAM,UAAU,GAAG,EAAE,CAAC,EAAE,SAAS,CAAC,UAAU,EAAE,CAAC,EAAE,SAAS,CAAC,SAAS,EAAE;AACtE,QAAA,MAAM,UAAU,GAAG,EAAE,SAAS,EAAE,KAAK,EAA4B;QAEjE,MAAM,aAAa,GAAG,MAAK;AACzB,YAAA,UAAU,CAAC,SAAS,GAAG,KAAK;AAC5B,YAAA,IAAI;AAGF,gBAAA,MAAM,aAAa,GAAG,SAAS,CAAC,UAAU;AAC1C,gBAAA,MAAM,aAAa,GAAG,SAAS,CAAC,SAAS;AAGzC,gBAAA,UAAU,CAAC,CAAC,GAAG,aAAa;AAC5B,gBAAA,UAAU,CAAC,CAAC,GAAG,aAAa;gBAE5B,IAAI,OAAO,CAAC,OAAO,IAAI,mBAAmB,CAAC,OAAO,EAAE;oBAClD,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;oBACpC,mBAAmB,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;AAChD,oBAAA,MAAM,QAAQ,GAAG,SAAS,IAAI,SAAS,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC;AACjE,oBAAA,KAAK,QAAQ;AACb,oBAAA,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC,aAAa,CAAC;AAC5D,oBAAA,mBAAmB,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC,aAAa,CAAC;gBAC1E;AAEA,gBAAA,qBAAqB,CAAC;oBACpB,IAAI,EAAE,OAAO,CAAC,OAAO;oBACrB,SAAS,EAAE,kBAAkB,CAAC,OAAO;oBACrC,OAAO,EAAE,UAAU,CAAC,OAAO;oBAC3B,MAAM;oBACN,UAAU;oBACV,KAAK;oBACL,SAAS;oBACT,UAAU;oBACV,IAAI;oBACJ,IAAI;oBACJ,SAAS;oBACT,aAAa;oBACb,cAAc;AACd,oBAAA,gBAAgB,EAAE,CAAC,EAAmB,EAAE,CAAS,EAAE,CAAS,KAAKH,gBAAwB,CACvF,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAY,EACtB,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,KAAM,cAAc,CAAC,OAAe,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAC7D,CAAC,CAAC,KAAM,aAAa,CAAC,OAAe,CAAC,CAAC,EAAE,IAAI,CAAC,EAC9C,SAAS,EAAE,UAAU,EAAE,aAAa,CAAC,OAAO,CAC7C;oBACD,iBAAiB,EAAE,CAAC,MAAwB,EAAE,IAAS,KAAKC,iBAAyB,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,CAAC,OAAO,CAAC;AAC7J,oBAAA,gBAAgB,EAAE,mBAAmB,CAAC,OAAO,KAAK,IAAI,CAAC,GAAG,EAAE,GAAG,qBAAqB,CAAC,OAAO,GAAG,IAAI,CAAC;AACrG,iBAAA,CAAC;AACF,gBAAA,cAAc,CAAC,OAAO,GAAG,IAAI;gBAC7B,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;YACjC;YAAE,OAAO,CAAC,EAAE;AACV,gBAAA,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,CAAC,CAAC;YACvD;AACF,QAAA,CAAC;QAED,MAAM,QAAQ,GAAG,MAAK;AAEpB,YAAA,UAAU,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU;AACnC,YAAA,UAAU,CAAC,CAAC,GAAG,SAAS,CAAC,SAAS;AAClC,YAAA,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE;AACzB,gBAAA,UAAU,CAAC,SAAS,GAAG,IAAI;gBAC3B,qBAAqB,CAAC,aAAa,CAAC;YACtC;AACF,QAAA,CAAC;AAED,QAAA,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAEjE,QAAA,OAAO,MAAK;AACV,YAAA,SAAS,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC;AACnD,QAAA,CAAC;AACH,IAAA,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;AAahL,IAAA,SAASG,mBAAiB,CAAC,MAAkB,EAAE,IAAW,EAAA;AACxD,QAAA,OAAOH,iBAAyB,CAAC,MAAa,EAAE,IAAW,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,CAAC,OAAO,CAAQ;IAC/H;AAQA,IAAA,SAAS,eAAe,GAAA;AACtB,QAAA,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO;QAElC,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE;YACrC,MAAM,GAAG,GAAI,KAAa,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACjD,YAAAG,mBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC;QAChC;IACF;AAEA,IAAA,SAASD,iBAAe,GAAA;AACtB,QAAAE,eAAuB,CAAC,mBAAmB,CAAC,OAAO,EAAE,kBAAkB,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,iBAAiB,EAAE,SAAoB,CAAC;IAC7I;AAOA,IAAA,OAAO,IAAI;AACb;;;;"}
1
+ {"version":3,"file":"PivotCanvas.js","sources":["../../../../PivotViewer/components/PivotCanvas.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\nimport * as PIXI from 'pixi.js';\nimport type { ItemId, LayoutResult, GroupingResult } from '../engine/types';\nimport type { ViewMode } from './Toolbar';\nimport { createCssColorResolver, resolveCardColors } from './pivot/colorResolver';\nimport { createCardSprite as createCardSpriteExternal, updateCardContent as updateCardContentExternal, clearSpritePool } from './pivot/sprites';\nimport { syncSpritesToViewport } from './pivot/visibility';\nimport { updateBucketBackgrounds as updateBucketBackgroundsExternal, updateHighlight as updateHighlightExternal } from './pivot/buckets';\nimport { startAnimationLoop as startAnimationLoopExternal, updatePositions as updatePositionsExternal } from './pivot/animation';\nimport { ANIMATION_SPEED, DEFAULT_COLORS, type CardSprite, type CardColors } from './pivot/constants';\n\nexport interface PivotCanvasProps<TItem extends object> {\n /** Original items array */\n items: TItem[];\n\n /** Layout positions */\n layout: LayoutResult;\n\n /** Grouping information */\n grouping: GroupingResult;\n\n /** Visible item IDs */\n visibleIds: Uint32Array;\n\n /** Card dimensions */\n cardWidth: number;\n cardHeight: number;\n\n /** Zoom level */\n zoomLevel: number;\n\n /** Pan offset */\n panX: number;\n panY: number;\n\n /** Viewport dimensions (visible area) */\n viewportWidth: number;\n viewportHeight: number;\n\n /** Selected item ID */\n selectedId: ItemId | null;\n\n /** Hovered group index */\n hoveredGroupIndex: number | null;\n\n /** Current view mode */\n viewMode: ViewMode;\n\n /** Is zooming animation in progress */\n isZooming?: boolean;\n\n /** Card renderer function */\n cardRenderer?: (item: TItem) => ReactNode;\n\n /** ID resolver */\n resolveId: (item: TItem, index: number) => string | number;\n\n /** Click handler */\n onCardClick: (item: TItem, e: MouseEvent, id: number | string) => void;\n\n /** Pan handlers */\n onPanStart: (e: MouseEvent) => void;\n onPanMove: (e: MouseEvent) => void;\n onPanEnd: () => void;\n containerRef: React.RefObject<HTMLDivElement | null>;\n}\n\n// `CardSprite` type moved to ./pivot/constants and imported above\n\n// constants and CardColors type moved to ./pivot/constants\n\nexport function PivotCanvas<TItem extends object>({\n items,\n layout,\n grouping,\n visibleIds,\n cardWidth,\n cardHeight,\n zoomLevel,\n panX,\n panY,\n viewportWidth,\n viewportHeight,\n selectedId,\n hoveredGroupIndex,\n isZooming: _isZooming = false,\n resolveId: _resolveId,\n onCardClick,\n onPanStart,\n onPanMove,\n onPanEnd,\n viewMode,\n cardRenderer,\n containerRef,\n}: PivotCanvasProps<TItem>) {\n console.log('[PivotCanvas] Render', { viewMode });\n // Use the containerRef passed from the parent viewport so we append the Pixi\n // canvas and spacer into the actual scrollable element.\n const parentContainerRef = containerRef;\n // Mark intentionally-unused destructured props as used to satisfy lint\n void _isZooming;\n void _resolveId;\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const spacerRef = useRef<HTMLDivElement | null>(null);\n const appRef = useRef<PIXI.Application | null>(null);\n const rootRef = useRef<PIXI.Container | null>(null);\n const bucketsContainerRef = useRef<PIXI.Container | null>(null);\n const spritesRef = useRef<Map<ItemId, CardSprite>>(new Map());\n const animationFrameRef = useRef<number>(0);\n const mountedRef = useRef(true);\n const [pixiReady, setPixiReady] = useState(false);\n const isAnimatingRef = useRef(false);\n const needsRenderRef = useRef(false);\n const initializingRef = useRef(false);\n const isViewTransitionRef = useRef(false);\n const lastViewChangeTimeRef = useRef(0);\n const previousViewModeRef = useRef<ViewMode>(viewMode);\n const prevLayoutRef = useRef<LayoutResult | null>(null);\n const prevGroupingRef = useRef<GroupingResult | null>(null);\n const cardColorsRef = useRef<CardColors>(DEFAULT_COLORS);\n void cardRenderer; // unused in Pixi renderer but keep prop compatibility\n\n const cssColorResolver = useMemo(() => createCssColorResolver(), []);\n\n const onPanStartRef = useRef(onPanStart);\n const onPanMoveRef = useRef(onPanMove);\n const onPanEndRef = useRef(onPanEnd);\n const onCardClickRef = useRef(onCardClick);\n const prevPanRef = useRef({ x: panX, y: panY });\n\n // Initialize Pixi Application\n useEffect(() => {\n // ... existing code ...\n onPanMoveRef.current = onPanMove;\n onPanEndRef.current = onPanEnd;\n onCardClickRef.current = onCardClick;\n }, [onPanStart, onPanMove, onPanEnd, onCardClick]);\n\n useEffect(() => {\n cardColorsRef.current = resolveCardColors(cssColorResolver);\n }, [cssColorResolver]);\n\n useEffect(() => {\n // Reset mounted flag\n mountedRef.current = true;\n\n if (!parentContainerRef || !parentContainerRef.current) {\n return;\n }\n\n // Prevent multiple simultaneous initializations\n if (initializingRef.current || appRef.current) {\n return;\n }\n\n initializingRef.current = true;\n let app: PIXI.Application | null = null;\n // Handler references declared here so cleanup can remove them later.\n\n (async () => {\n try {\n // Prefer the new init API (v8+) to avoid deprecation issues. Fall back\n // to the constructor options when `init` is not available.\n const options = {\n backgroundAlpha: 0,\n antialias: false,\n autoStart: false,\n autoDensity: true,\n resolution: window.devicePixelRatio || 1,\n width: viewportWidth > 0 ? viewportWidth : 800,\n height: viewportHeight > 0 ? viewportHeight : 600,\n } as PIXI.ApplicationOptions;\n\n app = new PIXI.Application();\n if ((app as any).init && typeof (app as any).init === 'function') {\n // init may return a promise in some builds\n \n // @ts-ignore\n await app.init(options);\n } else {\n // Fall back to constructor that accepts options\n app.destroy?.();\n app = new PIXI.Application(options);\n }\n\n if (!mountedRef.current || !parentContainerRef.current) {\n // Component unmounted during initialization\n if (app && typeof app.destroy === 'function') app.destroy(true, { children: true });\n initializingRef.current = false;\n return;\n }\n\n appRef.current = app;\n\n const bucketsContainer = new PIXI.Container();\n bucketsContainerRef.current = bucketsContainer;\n app.stage.addChild(bucketsContainer);\n\n const root = new PIXI.Container();\n rootRef.current = root;\n app.stage.addChild(root);\n\n // Resolve canvas element (different Pixi builds expose it as `view` or\n // `canvas`).\n const canvasEl = (app.view ?? (app as any).canvas ?? app.renderer?.view) as HTMLCanvasElement | undefined;\n\n // Place canvas outside the scrollable content so native scrolling\n // doesn't move the canvas DOM element itself. We overlay the canvas\n // on top of the scroll area by inserting it into the parent element\n // (or the container itself if parent is not available). This ensures\n // the Pixi canvas remains stable while we move the Pixi world inside\n // it to represent camera pan.\n const overlayParent = parentContainerRef.current.parentElement ?? parentContainerRef.current;\n if (canvasEl) {\n if (canvasEl.parentElement) {\n canvasEl.parentElement.removeChild(canvasEl);\n }\n overlayParent.appendChild(canvasEl);\n canvasRef.current = canvasEl;\n } else if ((app as any).canvas) {\n const c = (app as any).canvas;\n if (c.parentElement) {\n c.parentElement.removeChild(c);\n }\n overlayParent.appendChild(c);\n canvasRef.current = c;\n }\n\n // Position the canvas to overlay the scrollable container area.\n if (canvasRef.current && parentContainerRef.current) {\n const parentBounds = parentContainerRef.current.getBoundingClientRect();\n void parentBounds;\n canvasRef.current.style.position = 'absolute';\n // Place canvas relative to the overlayParent's coordinate space.\n // If overlayParent is the immediate parent, top/left 0 aligns it.\n const offsetLeft = parentContainerRef.current.offsetLeft;\n const offsetTop = parentContainerRef.current.offsetTop;\n canvasRef.current.style.left = `${offsetLeft}px`;\n canvasRef.current.style.top = `${offsetTop}px`;\n canvasRef.current.style.width = `${parentContainerRef.current.clientWidth}px`;\n canvasRef.current.style.height = `${parentContainerRef.current.clientHeight}px`;\n // Place canvas behind the scrollable container (which has z-index 1)\n // so scrollbars appear on top.\n canvasRef.current.style.zIndex = '0';\n // Disable pointer events on canvas so they pass through to the viewport if needed,\n // though viewport is on top anyway.\n canvasRef.current.style.pointerEvents = 'none';\n }\n\n // We handle clicks and interactions manually in PivotViewerMain now,\n // so we don't need to configure Pixi events on the container.\n // This avoids z-index conflicts and event propagation issues.\n\n // Make canvas fill container with absolute positioning\n if (canvasRef.current) {\n canvasRef.current.style.display = 'block';\n // Ensure canvas does not capture events so they pass through to the viewport\n canvasRef.current.style.pointerEvents = 'none';\n }\n\n // Setup stage events for background panning\n app.stage.eventMode = 'static';\n app.stage.hitArea = new PIXI.Rectangle(0, 0, viewportWidth, viewportHeight);\n\n app.stage.on('pointerdown', (e) => {\n // Only handle if it reached the stage (background)\n // Sprites stop propagation, so this is safe\n onPanStartRef.current(e.nativeEvent as unknown as MouseEvent);\n });\n\n app.stage.on('globalpointermove', (e) => {\n onPanMoveRef.current(e.nativeEvent as unknown as MouseEvent);\n });\n\n app.stage.on('globalpointerup', () => {\n onPanEndRef.current();\n });\n\n // We no longer need manual event listeners on parentEl because Pixi\n // is now listening to events on parentEl directly via setTargetElement.\n // This allows Pixi to handle hit testing through the transparent container.\n const parentEl = parentContainerRef.current;\n if (parentEl) {\n // handleMouseDown = (e: Event) => onPanStartRef.current(e as unknown);\n // handleMouseMove = (e: Event) => onPanMoveRef.current(e as unknown);\n // handleMouseUp = () => onPanEndRef.current();\n // parentEl.addEventListener('mousedown', handleMouseDown);\n // parentEl.addEventListener('mousemove', handleMouseMove);\n // parentEl.addEventListener('mouseup', handleMouseUp);\n // parentEl.addEventListener('mouseleave', handleMouseUp);\n // window.addEventListener('mouseup', handleMouseUp);\n // window.addEventListener('pointerup', handleMouseUp);\n }\n\n // Immediately size to container to avoid delay\n if (viewportWidth > 0 && viewportHeight > 0) {\n app.renderer?.resize(viewportWidth, viewportHeight);\n }\n\n setPixiReady(true);\n initializingRef.current = false;\n\n // Trigger initial render\n needsRenderRef.current = true;\n app.renderer?.render(app.stage);\n } catch (error) {\n console.error('Failed to initialize Pixi.js:', error);\n initializingRef.current = false;\n }\n })();\n\n return () => {\n mountedRef.current = false;\n setPixiReady(false);\n cancelAnimationFrame(animationFrameRef.current);\n\n if (appRef.current && typeof appRef.current.destroy === 'function') {\n appRef.current.destroy(true, { children: true });\n appRef.current = null;\n rootRef.current = null;\n }\n\n // Clear sprite pool to avoid holding onto destroyed textures\n clearSpritePool();\n\n // Remove any event listeners we attached to the parent container\n try {\n const parentEl = parentContainerRef.current;\n if (parentEl) {\n // if (handleMouseDown) parentEl.removeEventListener('mousedown', handleMouseDown);\n // if (handleMouseMove) parentEl.removeEventListener('mousemove', handleMouseMove);\n // if (handleMouseUp) parentEl.removeEventListener('mouseup', handleMouseUp);\n // if (handleMouseUp) parentEl.removeEventListener('mouseleave', handleMouseUp);\n // if (handleMouseUp) {\n // window.removeEventListener('mouseup', handleMouseUp);\n // window.removeEventListener('pointerup', handleMouseUp);\n // }\n }\n } catch (e) {\n void e;\n }\n // Remove DOM nodes we appended\n try {\n if (canvasRef.current && canvasRef.current.parentElement) {\n canvasRef.current.parentElement.removeChild(canvasRef.current);\n }\n } catch (e) {\n void e;\n }\n };\n }, [viewportWidth, viewportHeight]);\n\n // Handle canvas resize\n useEffect(() => {\n if (!parentContainerRef || !parentContainerRef.current || !appRef.current || !pixiReady) return;\n\n const container = parentContainerRef.current;\n const app = appRef.current;\n\n let resizeTimeout: ReturnType<typeof setTimeout>;\n\n const handleResize = () => {\n // Size canvas to viewport dimensions from props\n if (viewportWidth > 0 && viewportHeight > 0) {\n app.renderer?.resize(viewportWidth, viewportHeight);\n app.stage.hitArea = new PIXI.Rectangle(0, 0, viewportWidth, viewportHeight);\n\n // Keep canvas DOM size in sync with container\n if (canvasRef.current && parentContainerRef.current) {\n canvasRef.current.style.width = `${parentContainerRef.current.clientWidth}px`;\n canvasRef.current.style.height = `${parentContainerRef.current.clientHeight}px`;\n // Also update left/top in case the container moved\n canvasRef.current.style.left = `${parentContainerRef.current.offsetLeft}px`;\n canvasRef.current.style.top = `${parentContainerRef.current.offsetTop}px`;\n }\n }\n };\n\n const debouncedResize = () => {\n clearTimeout(resizeTimeout);\n resizeTimeout = setTimeout(handleResize, 150);\n };\n\n // Initial resize (immediate)\n handleResize();\n\n // Watch for size changes (debounced)\n const resizeObserver = new ResizeObserver(debouncedResize);\n resizeObserver.observe(container);\n\n return () => {\n clearTimeout(resizeTimeout);\n resizeObserver.disconnect();\n };\n }, [pixiReady, viewportWidth, viewportHeight]);\n\n // Update bucket backgrounds only when layout/grouping changes\n useEffect(() => {\n if (!bucketsContainerRef.current || !parentContainerRef.current || !pixiReady) return;\n updateBucketBackgroundsExternal(bucketsContainerRef.current, parentContainerRef.current, grouping, layout, zoomLevel, cardColorsRef.current, viewMode);\n needsRenderRef.current = true;\n appRef.current?.renderer?.render(appRef.current.stage);\n }, [grouping, layout, zoomLevel, viewMode, pixiReady]);\n\n useEffect(() => {\n if (!rootRef.current || !parentContainerRef.current || !pixiReady) {\n return;\n }\n\n // Check if this is a view mode change (not just pan/scroll)\n const viewModeChanged = previousViewModeRef.current !== viewMode;\n const groupingChanged = prevGroupingRef.current !== grouping;\n\n if (viewModeChanged || groupingChanged) {\n isViewTransitionRef.current = true;\n lastViewChangeTimeRef.current = Date.now();\n previousViewModeRef.current = viewMode;\n prevGroupingRef.current = grouping;\n \n // When switching modes, mark all sprites for cleanup by hiding them\n // The normal sweep logic will remove them after SWEEP_MS delay\n console.log('[PivotCanvas] View mode or grouping changed - marking sprites for cleanup');\n for (const sprite of spritesRef.current.values()) {\n try {\n if (sprite.container) {\n sprite.container.visible = false;\n }\n (sprite as any).__lastHiddenAt = Date.now();\n } catch (e) {\n void e;\n }\n }\n }\n\n // Update spacer dimensions to match scaled world size\n if (spacerRef.current) {\n const spacer = spacerRef.current;\n const worldWidth = (layout.totalWidth || viewportWidth) * zoomLevel;\n const worldHeight = (layout.totalHeight || viewportHeight) * zoomLevel;\n spacer.style.width = `${Math.max(worldWidth, viewportWidth)}px`;\n spacer.style.height = `${Math.max(worldHeight, viewportHeight)}px`;\n }\n\n // Ensure scroll spacer matches layout so the container becomes scrollable and\n // native scrollLeft/scrollTop reflect the camera position.\n if (parentContainerRef.current) {\n const spacer = spacerRef.current;\n if (spacer) {\n // Debug: log spacer and layout values to detect mismatches\n }\n }\n\n const panDeltaX = panX - prevPanRef.current.x;\n const panDeltaY = panY - prevPanRef.current.y;\n prevPanRef.current = { x: panX, y: panY };\n\n // Sync sprites into viewport and create/remove as needed\n // Provide wrappers for sprite creation and content update so helpers have required context\n syncSpritesToViewport({\n root: rootRef.current,\n container: parentContainerRef.current,\n sprites: spritesRef.current,\n layout,\n visibleIds,\n items,\n cardWidth,\n cardHeight,\n panX,\n panY,\n panDeltaX,\n panDeltaY,\n zoomLevel,\n viewportWidth,\n viewportHeight,\n createCardSprite: (id: string | number, x: number, y: number) => createCardSpriteExternal(\n id,\n x,\n y,\n items as any,\n (item: TItem, e: any, id: string | number) => (onCardClickRef.current as any)(item, e, id),\n (onPanStart as any),\n cardWidth,\n cardHeight,\n cardColorsRef.current\n ),\n updateCardContent: (sprite: CardSprite | any, item: any) => updateCardContentExternal(sprite, item, selectedId, cardWidth, cardHeight, cardColorsRef.current),\n isViewTransition: isViewTransitionRef.current || (Date.now() - lastViewChangeTimeRef.current < 1000),\n prevLayout: prevLayoutRef.current,\n });\n needsRenderRef.current = true;\n \n // Force an immediate render after syncing sprites to ensure cards appear\n if (appRef.current?.renderer && rootRef.current) {\n appRef.current.renderer.render(appRef.current.stage);\n needsRenderRef.current = false;\n }\n \n startAnimationLoopExternal({\n mountedRef,\n appRef,\n animationFrameRef,\n isAnimatingRef,\n needsRenderRef,\n spritesRef,\n isViewTransitionRef,\n });\n }, [layout, visibleIds, items, cardWidth, cardHeight, pixiReady, zoomLevel, panX, panY, grouping, viewMode]);\n\n // Update prevLayoutRef after processing layout changes\n useEffect(() => {\n prevLayoutRef.current = layout;\n }, [layout]);\n\n useEffect(() => {\n if (!rootRef.current || !bucketsContainerRef.current) return;\n\n // Camera transform: move world opposite to camera position. Prefer the\n // native container scroll positions where available (they are authoritative\n // during user scrolls) and fall back to the passed pan props.\n const effectivePanX = parentContainerRef.current ? parentContainerRef.current.scrollLeft : panX;\n const effectivePanY = parentContainerRef.current ? parentContainerRef.current.scrollTop : panY;\n\n // Apply zoom and position to root and buckets.\n if (rootRef.current.scale && bucketsContainerRef.current.scale) {\n rootRef.current.scale.set(zoomLevel);\n bucketsContainerRef.current.scale.set(zoomLevel);\n }\n if (rootRef.current.position && bucketsContainerRef.current.position) {\n rootRef.current.position.set(-effectivePanX, -effectivePanY);\n bucketsContainerRef.current.position.set(-effectivePanX, -effectivePanY);\n }\n appRef.current?.renderer?.render(appRef.current.stage);\n }, [zoomLevel, panX, panY]);\n\n useEffect(() => {\n if (!rootRef.current) return;\n updateSelection();\n needsRenderRef.current = true;\n appRef.current?.renderer.render(appRef.current.stage);\n }, [selectedId, items]);\n\n useEffect(() => {\n if (!rootRef.current) return;\n updateHighlight();\n needsRenderRef.current = true;\n appRef.current?.renderer.render(appRef.current.stage);\n }, [hoveredGroupIndex, layout, grouping]);\n\n // Note: animation loop and bucket background updates are delegated to\n // external helpers (`startAnimationLoopExternal` and\n // `updateBucketBackgroundsExternal`) and invoked where needed. We don't\n // expose local wrappers to avoid unused-function lint warnings.\n\n // Listen to native scroll events on the parent container so we update the\n // Pixi world immediately when the user scrolls (native scrollbar or\n // programmatic). This ensures `syncSpritesToViewport` runs on scroll and\n // creates/destroys sprites as the viewport moves.\n useEffect(() => {\n if (!pixiReady || !parentContainerRef || !parentContainerRef.current || !appRef.current || !rootRef.current) return;\n\n const container = parentContainerRef.current;\n const app = appRef.current;\n\n // rAF-batched scroll handling: store the latest scroll values and process\n // them once per animation frame to avoid heavy synchronous work inside\n // the scroll event which causes jank and de-synchronisation between the\n // compositor and Pixi render updates.\n const lastScroll = { x: container.scrollLeft, y: container.scrollTop };\n const pendingRef = { scheduled: false } as { scheduled: boolean };\n\n const processScroll = () => {\n pendingRef.scheduled = false;\n try {\n // Read directly from container to ensure consistency with visibility logic\n // and to handle cases where scroll changes without event (e.g. resize clamping)\n const effectivePanX = container.scrollLeft;\n const effectivePanY = container.scrollTop;\n\n // Update lastScroll to keep it in sync\n lastScroll.x = effectivePanX;\n lastScroll.y = effectivePanY;\n\n if (rootRef.current && bucketsContainerRef.current) {\n if (rootRef.current.scale && bucketsContainerRef.current.scale) {\n rootRef.current.scale.set(zoomLevel);\n bucketsContainerRef.current.scale.set(zoomLevel);\n }\n const invScale = zoomLevel && zoomLevel !== 0 ? 1 / zoomLevel : 1;\n void invScale;\n if (rootRef.current.position && bucketsContainerRef.current.position) {\n rootRef.current.position.set(-effectivePanX, -effectivePanY);\n bucketsContainerRef.current.position.set(-effectivePanX, -effectivePanY);\n }\n }\n\n syncSpritesToViewport({\n root: rootRef.current,\n container: parentContainerRef.current,\n sprites: spritesRef.current,\n layout,\n visibleIds,\n items,\n cardWidth,\n cardHeight,\n panX,\n panY,\n zoomLevel,\n viewportWidth,\n viewportHeight,\n createCardSprite: (id: string | number, x: number, y: number) => createCardSpriteExternal(\n id, x, y, items as any,\n (item, e, id) => (onCardClickRef.current as any)(item, e, id),\n (e) => (onPanStartRef.current as any)(e, true), // Explicitly mark as on-card for Pixi events\n cardWidth, cardHeight, cardColorsRef.current\n ),\n updateCardContent: (sprite: CardSprite | any, item: any) => updateCardContentExternal(sprite, item, selectedId, cardWidth, cardHeight, cardColorsRef.current),\n isViewTransition: isViewTransitionRef.current || (Date.now() - lastViewChangeTimeRef.current < 1000),\n });\n needsRenderRef.current = true;\n app.renderer?.render(app.stage);\n } catch (e) {\n console.error('[PivotCanvas] processScroll error', e);\n }\n };\n\n const onScroll = () => {\n // capture latest scroll positions quickly and schedule work\n lastScroll.x = container.scrollLeft;\n lastScroll.y = container.scrollTop;\n if (!pendingRef.scheduled) {\n pendingRef.scheduled = true;\n requestAnimationFrame(processScroll);\n }\n };\n\n container.addEventListener('scroll', onScroll, { passive: true });\n\n return () => {\n container.removeEventListener('scroll', onScroll);\n };\n }, [pixiReady, layout, visibleIds, items, cardWidth, cardHeight, zoomLevel, viewportWidth, viewportHeight, panX, panY, grouping, viewMode, selectedId, onCardClick, onPanStart]);\n\n function createCardSprite(id: ItemId, x: number, y: number): CardSprite {\n return createCardSpriteExternal(\n id, x, y, items as any,\n (item, e, id) => (onCardClickRef.current as any)(item, e, id),\n (e) => (onPanStartRef.current as any)(e, true),\n cardWidth, cardHeight, cardColorsRef.current\n );\n }\n // Mark these helpers as used (they may be referenced externally or via callbacks)\n void createCardSprite;\n\n function updateCardContent(sprite: CardSprite, item: TItem) {\n return updateCardContentExternal(sprite as any, item as any, selectedId, cardWidth, cardHeight, cardColorsRef.current) as any;\n }\n\n function updatePositions(): boolean {\n return updatePositionsExternal(spritesRef.current, isViewTransitionRef, ANIMATION_SPEED);\n }\n\n void updatePositions;\n\n function updateSelection() {\n const sprites = spritesRef.current;\n\n for (const sprite of sprites.values()) {\n const val = (items as any)[String(sprite.itemId)];\n updateCardContent(sprite, val);\n }\n }\n\n function updateHighlight() {\n updateHighlightExternal(bucketsContainerRef.current, parentContainerRef.current, grouping, layout, hoveredGroupIndex, cardWidth, zoomLevel);\n }\n\n void updateHighlight;\n\n // This component renders into the parent `containerRef` (we append Pixi canvas\n // and spacer directly into that DOM node). Return null so we don't replace or\n // reassign the parent's ref which must remain the scrollable viewport element.\n return null;\n}\n"],"names":["updateBucketBackgroundsExternal","createCardSpriteExternal","updateCardContentExternal","startAnimationLoopExternal","updateHighlight","updateCardContent","updateHighlightExternal"],"mappings":"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"}
@@ -56,7 +56,7 @@ function PivotViewerMain({ data, ready, isLoading, visibleIds, grouping, layout,
56
56
  }
57
57
  container.style.cursor = isOverCard ? 'pointer' : 'default';
58
58
  };
59
- return isLoading ? (jsx(Spinner, {})) : (jsxs("div", { className: "pv-groups-wrapper", children: [jsxs("div", { style: { position: 'relative', flex: 1, display: 'flex', flexDirection: 'column', minHeight: 0 }, children: [jsxs("div", { className: `pv-viewport ${isZooming ? 'pv-zooming' : ''}`, ref: containerRef, style: { overflow: 'auto', position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, zIndex: 1 }, onClick: handleViewportClick, onMouseMove: handleViewportMouseMove, children: [jsx("div", { ref: spacerRef, style: {
59
+ return isLoading ? (jsx(Spinner, {})) : (jsxs("div", { className: "pv-groups-wrapper", children: [jsxs("div", { style: { position: 'relative', flex: 1, display: 'flex', flexDirection: 'column', minHeight: 0 }, children: [jsxs("div", { className: `pv-viewport ${isZooming ? 'pv-zooming' : ''}`, ref: containerRef, style: { overflow: 'auto', position: 'absolute', top: 0, left: 0, right: 0, bottom: 0 }, onClick: handleViewportClick, onMouseMove: handleViewportMouseMove, children: [jsx("div", { ref: spacerRef, style: {
60
60
  position: 'absolute',
61
61
  top: 0,
62
62
  left: 0,
@@ -1 +1 @@
1
- {"version":3,"file":"PivotViewerMain.js","sources":["../../../../PivotViewer/components/PivotViewerMain.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { ReactNode } from 'react';\nimport type { ItemId, LayoutResult, GroupingResult } from '../engine/types';\nimport type { ViewMode } from './Toolbar';\nimport type { PivotDimensionFilter } from '../hooks/useDimensionState';\nimport { Spinner } from './Spinner';\nimport { PivotCanvas } from './PivotCanvas';\nimport { AxisLabels } from './AxisLabels';\nimport { DetailPanel } from './DetailPanel';\n\nexport interface PivotViewerMainProps<TItem extends object> {\n data: TItem[];\n ready: boolean;\n isLoading: boolean;\n visibleIds: Uint32Array;\n grouping: GroupingResult;\n layout: LayoutResult;\n cardWidth: number;\n cardHeight: number;\n zoomLevel: number;\n scrollPosition: { x: number; y: number };\n containerDimensions: { width: number; height: number };\n selectedItem: TItem | null;\n hoveredGroupIndex: number | null;\n isZooming: boolean;\n viewMode: ViewMode;\n cardRenderer?: (item: TItem) => ReactNode;\n resolveId: (item: TItem, index: number) => ItemId;\n emptyContent?: ReactNode;\n dimensionFilter: PivotDimensionFilter;\n onCardClick: (item: TItem, e: MouseEvent, id: number | string) => void;\n onPanStart: (e: React.MouseEvent) => void;\n onPanMove: (e: React.MouseEvent) => void;\n onPanEnd: () => void;\n onGroupHover: (index: number | null) => void;\n onAxisLabelClick: (value: string) => void;\n onCloseDetail: () => void;\n containerRef: React.RefObject<HTMLDivElement | null>;\n axisLabelsRef: React.RefObject<HTMLDivElement | null>;\n spacerRef: React.RefObject<HTMLDivElement | null>;\n}\n\nexport function PivotViewerMain<TItem extends object>({\n data,\n ready,\n isLoading,\n visibleIds,\n grouping,\n layout,\n cardWidth,\n cardHeight,\n zoomLevel,\n scrollPosition,\n containerDimensions,\n selectedItem,\n hoveredGroupIndex,\n isZooming,\n viewMode,\n cardRenderer,\n resolveId,\n emptyContent,\n dimensionFilter,\n onCardClick,\n onPanStart,\n onPanMove,\n onPanEnd,\n onGroupHover,\n onAxisLabelClick,\n onCloseDetail,\n containerRef,\n axisLabelsRef,\n spacerRef,\n}: PivotViewerMainProps<TItem>) {\n const handleViewportClick = (e: React.MouseEvent) => {\n if (isZooming || !containerRef.current) return;\n\n const container = containerRef.current;\n const rect = container.getBoundingClientRect();\n // Use live DOM scroll position for accurate hit testing\n const scrollLeft = container.scrollLeft;\n const scrollTop = container.scrollTop;\n\n const clickX = e.clientX - rect.left + scrollLeft;\n const clickY = e.clientY - rect.top + scrollTop;\n\n const worldX = clickX / zoomLevel;\n const worldY = clickY / zoomLevel;\n\n // Check visible items\n for (let i = 0; i < visibleIds.length; i++) {\n const id = visibleIds[i];\n const pos = layout.positions.get(id);\n if (pos) {\n if (worldX >= pos.x && worldX <= pos.x + cardWidth &&\n worldY >= pos.y && worldY <= pos.y + cardHeight) {\n const item = data[id];\n if (item) {\n onCardClick(item, e.nativeEvent as unknown as MouseEvent, id);\n }\n return;\n }\n }\n }\n };\n\n const handleViewportMouseMove = (e: React.MouseEvent) => {\n if (isZooming || !containerRef.current) return;\n\n const container = containerRef.current;\n const rect = container.getBoundingClientRect();\n const scrollLeft = container.scrollLeft;\n const scrollTop = container.scrollTop;\n\n const mouseX = e.clientX - rect.left + scrollLeft;\n const mouseY = e.clientY - rect.top + scrollTop;\n\n const worldX = mouseX / zoomLevel;\n const worldY = mouseY / zoomLevel;\n\n let isOverCard = false;\n for (let i = 0; i < visibleIds.length; i++) {\n const id = visibleIds[i];\n const pos = layout.positions.get(id);\n if (pos) {\n if (worldX >= pos.x && worldX <= pos.x + cardWidth &&\n worldY >= pos.y && worldY <= pos.y + cardHeight) {\n isOverCard = true;\n break;\n }\n }\n }\n\n container.style.cursor = isOverCard ? 'pointer' : 'default';\n };\n\n return isLoading ? (\n <Spinner />\n ) : (\n <div className=\"pv-groups-wrapper\">\n <div style={{ position: 'relative', flex: 1, display: 'flex', flexDirection: 'column', minHeight: 0 }}>\n <div\n className={`pv-viewport ${isZooming ? 'pv-zooming' : ''}`}\n ref={containerRef}\n style={{ overflow: 'auto', position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, zIndex: 1 }}\n onClick={handleViewportClick}\n onMouseMove={handleViewportMouseMove}\n >\n {/* Spacer for scrolling - explicitly rendered to allow synchronous updates during animation */}\n <div\n ref={spacerRef}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: layout.totalWidth * zoomLevel,\n height: layout.totalHeight * zoomLevel,\n pointerEvents: 'none'\n }}\n />\n\n {!ready && (\n <div className=\"pv-loading\">Building indexes...</div>\n )}\n\n {ready && visibleIds.length === 0 && (\n <div className=\"pv-empty\">\n {emptyContent ?? 'No items to display.'}\n </div>\n )}\n\n {ready && visibleIds.length > 0 && (\n <PivotCanvas\n items={data}\n layout={layout}\n grouping={grouping}\n visibleIds={visibleIds}\n cardWidth={cardWidth}\n cardHeight={cardHeight}\n zoomLevel={zoomLevel}\n panX={scrollPosition.x}\n panY={scrollPosition.y}\n viewportWidth={containerDimensions.width}\n viewportHeight={containerDimensions.height}\n selectedId={selectedItem ? resolveId(selectedItem, 0) : null}\n hoveredGroupIndex={hoveredGroupIndex}\n isZooming={isZooming}\n cardRenderer={cardRenderer}\n resolveId={resolveId}\n onCardClick={onCardClick}\n onPanStart={onPanStart as any}\n onPanMove={onPanMove as any}\n onPanEnd={onPanEnd}\n containerRef={containerRef}\n viewMode={viewMode}\n />\n )}\n </div>\n <DetailPanel\n selectedItem={selectedItem}\n onClose={onCloseDetail}\n />\n </div>\n\n {viewMode === 'grouped' && grouping.groups.length > 0 && (\n <AxisLabels\n groups={grouping.groups.map((g) => ({\n key: g.key,\n value: g.value,\n label: String(g.value),\n items: [],\n count: g.ids.length,\n }))}\n bucketWidths={layout.bucketWidths || []}\n zoomLevel={zoomLevel}\n dimensionFilter={dimensionFilter}\n hoveredGroup={hoveredGroupIndex !== null ? String(grouping.groups[hoveredGroupIndex]?.value) : null}\n onHover={(label) => {\n const index = grouping.groups.findIndex(g => String(g.value) === label);\n onGroupHover(index >= 0 ? index : null);\n }}\n onClick={onAxisLabelClick}\n containerRef={axisLabelsRef}\n />\n )}\n </div>\n );\n}\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"PivotViewerMain.js","sources":["../../../../PivotViewer/components/PivotViewerMain.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { ReactNode } from 'react';\nimport type { ItemId, LayoutResult, GroupingResult } from '../engine/types';\nimport type { ViewMode } from './Toolbar';\nimport type { PivotDimensionFilter } from '../hooks/useDimensionState';\nimport { Spinner } from './Spinner';\nimport { PivotCanvas } from './PivotCanvas';\nimport { AxisLabels } from './AxisLabels';\nimport { DetailPanel } from './DetailPanel';\n\nexport interface PivotViewerMainProps<TItem extends object> {\n data: TItem[];\n ready: boolean;\n isLoading: boolean;\n visibleIds: Uint32Array;\n grouping: GroupingResult;\n layout: LayoutResult;\n cardWidth: number;\n cardHeight: number;\n zoomLevel: number;\n scrollPosition: { x: number; y: number };\n containerDimensions: { width: number; height: number };\n selectedItem: TItem | null;\n hoveredGroupIndex: number | null;\n isZooming: boolean;\n viewMode: ViewMode;\n cardRenderer?: (item: TItem) => ReactNode;\n resolveId: (item: TItem, index: number) => ItemId;\n emptyContent?: ReactNode;\n dimensionFilter: PivotDimensionFilter;\n onCardClick: (item: TItem, e: MouseEvent, id: number | string) => void;\n onPanStart: (e: React.MouseEvent) => void;\n onPanMove: (e: React.MouseEvent) => void;\n onPanEnd: () => void;\n onGroupHover: (index: number | null) => void;\n onAxisLabelClick: (value: string) => void;\n onCloseDetail: () => void;\n containerRef: React.RefObject<HTMLDivElement | null>;\n axisLabelsRef: React.RefObject<HTMLDivElement | null>;\n spacerRef: React.RefObject<HTMLDivElement | null>;\n}\n\nexport function PivotViewerMain<TItem extends object>({\n data,\n ready,\n isLoading,\n visibleIds,\n grouping,\n layout,\n cardWidth,\n cardHeight,\n zoomLevel,\n scrollPosition,\n containerDimensions,\n selectedItem,\n hoveredGroupIndex,\n isZooming,\n viewMode,\n cardRenderer,\n resolveId,\n emptyContent,\n dimensionFilter,\n onCardClick,\n onPanStart,\n onPanMove,\n onPanEnd,\n onGroupHover,\n onAxisLabelClick,\n onCloseDetail,\n containerRef,\n axisLabelsRef,\n spacerRef,\n}: PivotViewerMainProps<TItem>) {\n const handleViewportClick = (e: React.MouseEvent) => {\n if (isZooming || !containerRef.current) return;\n\n const container = containerRef.current;\n const rect = container.getBoundingClientRect();\n // Use live DOM scroll position for accurate hit testing\n const scrollLeft = container.scrollLeft;\n const scrollTop = container.scrollTop;\n\n const clickX = e.clientX - rect.left + scrollLeft;\n const clickY = e.clientY - rect.top + scrollTop;\n\n const worldX = clickX / zoomLevel;\n const worldY = clickY / zoomLevel;\n\n // Check visible items\n for (let i = 0; i < visibleIds.length; i++) {\n const id = visibleIds[i];\n const pos = layout.positions.get(id);\n if (pos) {\n if (worldX >= pos.x && worldX <= pos.x + cardWidth &&\n worldY >= pos.y && worldY <= pos.y + cardHeight) {\n const item = data[id];\n if (item) {\n onCardClick(item, e.nativeEvent as unknown as MouseEvent, id);\n }\n return;\n }\n }\n }\n };\n\n const handleViewportMouseMove = (e: React.MouseEvent) => {\n if (isZooming || !containerRef.current) return;\n\n const container = containerRef.current;\n const rect = container.getBoundingClientRect();\n const scrollLeft = container.scrollLeft;\n const scrollTop = container.scrollTop;\n\n const mouseX = e.clientX - rect.left + scrollLeft;\n const mouseY = e.clientY - rect.top + scrollTop;\n\n const worldX = mouseX / zoomLevel;\n const worldY = mouseY / zoomLevel;\n\n let isOverCard = false;\n for (let i = 0; i < visibleIds.length; i++) {\n const id = visibleIds[i];\n const pos = layout.positions.get(id);\n if (pos) {\n if (worldX >= pos.x && worldX <= pos.x + cardWidth &&\n worldY >= pos.y && worldY <= pos.y + cardHeight) {\n isOverCard = true;\n break;\n }\n }\n }\n\n container.style.cursor = isOverCard ? 'pointer' : 'default';\n };\n\n return isLoading ? (\n <Spinner />\n ) : (\n <div className=\"pv-groups-wrapper\">\n <div style={{ position: 'relative', flex: 1, display: 'flex', flexDirection: 'column', minHeight: 0 }}>\n <div\n className={`pv-viewport ${isZooming ? 'pv-zooming' : ''}`}\n ref={containerRef}\n style={{ overflow: 'auto', position: 'absolute', top: 0, left: 0, right: 0, bottom: 0 }}\n onClick={handleViewportClick}\n onMouseMove={handleViewportMouseMove}\n >\n {/* Spacer for scrolling - explicitly rendered to allow synchronous updates during animation */}\n <div\n ref={spacerRef}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: layout.totalWidth * zoomLevel,\n height: layout.totalHeight * zoomLevel,\n pointerEvents: 'none'\n }}\n />\n\n {!ready && (\n <div className=\"pv-loading\">Building indexes...</div>\n )}\n\n {ready && visibleIds.length === 0 && (\n <div className=\"pv-empty\">\n {emptyContent ?? 'No items to display.'}\n </div>\n )}\n\n {ready && visibleIds.length > 0 && (\n <PivotCanvas\n items={data}\n layout={layout}\n grouping={grouping}\n visibleIds={visibleIds}\n cardWidth={cardWidth}\n cardHeight={cardHeight}\n zoomLevel={zoomLevel}\n panX={scrollPosition.x}\n panY={scrollPosition.y}\n viewportWidth={containerDimensions.width}\n viewportHeight={containerDimensions.height}\n selectedId={selectedItem ? resolveId(selectedItem, 0) : null}\n hoveredGroupIndex={hoveredGroupIndex}\n isZooming={isZooming}\n cardRenderer={cardRenderer}\n resolveId={resolveId}\n onCardClick={onCardClick}\n onPanStart={onPanStart as any}\n onPanMove={onPanMove as any}\n onPanEnd={onPanEnd}\n containerRef={containerRef}\n viewMode={viewMode}\n />\n )}\n </div>\n <DetailPanel\n selectedItem={selectedItem}\n onClose={onCloseDetail}\n />\n </div>\n\n {viewMode === 'grouped' && grouping.groups.length > 0 && (\n <AxisLabels\n groups={grouping.groups.map((g) => ({\n key: g.key,\n value: g.value,\n label: String(g.value),\n items: [],\n count: g.ids.length,\n }))}\n bucketWidths={layout.bucketWidths || []}\n zoomLevel={zoomLevel}\n dimensionFilter={dimensionFilter}\n hoveredGroup={hoveredGroupIndex !== null ? String(grouping.groups[hoveredGroupIndex]?.value) : null}\n onHover={(label) => {\n const index = grouping.groups.findIndex(g => String(g.value) === label);\n onGroupHover(index >= 0 ? index : null);\n }}\n onClick={onAxisLabelClick}\n containerRef={axisLabelsRef}\n />\n )}\n </div>\n );\n}\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /* Loading Spinner */
2
+ .pv-loading {
3
+ display: flex;
4
+ align-items: center;
5
+ justify-content: center;
6
+ flex: 1;
7
+ min-height: 400px;
8
+ }
9
+
10
+ .pv-spinner {
11
+ width: 80px;
12
+ height: 80px;
13
+ position: relative;
14
+ }
15
+
16
+ .pv-spinner-ring {
17
+ position: absolute;
18
+ inset: 0;
19
+ border-radius: 50%;
20
+ border: 4px solid transparent;
21
+ }
22
+
23
+ .pv-spinner-ring:nth-child(1) {
24
+ border-top-color: var(--primary-300);
25
+ animation: spinner-rotate 1.5s linear infinite;
26
+ }
27
+
28
+ .pv-spinner-ring:nth-child(2) {
29
+ border-right-color: var(--primary-400);
30
+ animation: spinner-rotate 1.5s linear infinite;
31
+ animation-delay: -0.1875s;
32
+ }
33
+
34
+ .pv-spinner-ring:nth-child(3) {
35
+ border-bottom-color: var(--primary-500);
36
+ animation: spinner-rotate 1.5s linear infinite;
37
+ animation-delay: -0.375s;
38
+ }
39
+
40
+ .pv-spinner-ring:nth-child(4) {
41
+ border-left-color: var(--primary-600);
42
+ animation: spinner-rotate 1.5s linear infinite;
43
+ animation-delay: -0.5625s;
44
+ }
45
+
46
+ .pv-spinner-ring:nth-child(5) {
47
+ border-top-color: var(--primary-400);
48
+ animation: spinner-rotate 1.5s linear infinite reverse;
49
+ animation-delay: -0.75s;
50
+ }
51
+
52
+ .pv-spinner-ring:nth-child(6) {
53
+ border-right-color: var(--primary-500);
54
+ animation: spinner-rotate 1.5s linear infinite reverse;
55
+ animation-delay: -0.9375s;
56
+ }
57
+
58
+ .pv-spinner-ring:nth-child(7) {
59
+ border-bottom-color: var(--primary-300);
60
+ animation: spinner-rotate 1.5s linear infinite reverse;
61
+ animation-delay: -1.125s;
62
+ }
63
+
64
+ .pv-spinner-ring:nth-child(8) {
65
+ border-left-color: var(--primary-600);
66
+ animation: spinner-rotate 1.5s linear infinite reverse;
67
+ animation-delay: -1.3125s;
68
+ }
69
+
70
+ @keyframes spinner-rotate {
71
+ 0% {
72
+ transform: rotate(0deg);
73
+ }
74
+ 100% {
75
+ transform: rotate(360deg);
76
+ }
77
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"sprites.d.ts","sourceRoot":"","sources":["../../../../../PivotViewer/components/pivot/sprites.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI1D,wBAAgB,gBAAgB,CAAC,KAAK,SAAS,MAAM,EACnD,EAAE,EAAE,MAAM,GAAG,MAAM,EACnB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,KAAK,EAAE,KAAK,EAAE,EACd,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,EACtE,UAAU,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,EACnC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,UAAU,GACrB,UAAU,CA+GZ;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,QAS/C;AAED,wBAAgB,eAAe,SAa9B;AAED,wBAAgB,iBAAiB,CAAC,KAAK,SAAS,MAAM,EACpD,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,KAAK,EACX,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,EAClC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,UAAU,QAoGvB"}
1
+ {"version":3,"file":"sprites.d.ts","sourceRoot":"","sources":["../../../../../PivotViewer/components/pivot/sprites.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI1D,wBAAgB,gBAAgB,CAAC,KAAK,SAAS,MAAM,EACnD,EAAE,EAAE,MAAM,GAAG,MAAM,EACnB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,KAAK,EAAE,KAAK,EAAE,EACd,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,EACtE,UAAU,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,EACnC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,UAAU,GACrB,UAAU,CAwKZ;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,QAS/C;AAED,wBAAgB,eAAe,SAa9B;AAGD,wBAAgB,iBAAiB,CAAC,KAAK,SAAS,MAAM,EACpD,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,KAAK,EACX,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,EAClC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,UAAU,QAoHvB"}
@@ -5,9 +5,11 @@ const spritePool = [];
5
5
  function createCardSprite(id, x, y, items, onCardClick, onPanStart, cardWidth, cardHeight, cardColors) {
6
6
  if (spritePool.length > 0) {
7
7
  const sprite = spritePool.pop();
8
- sprite.container.visible = true;
9
- sprite.container.alpha = 1;
10
- sprite.container.position.set(x, y);
8
+ if (sprite.container) {
9
+ sprite.container.visible = true;
10
+ sprite.container.alpha = 1;
11
+ sprite.container.position.set(x, y);
12
+ }
11
13
  sprite.itemId = id;
12
14
  sprite.targetX = x;
13
15
  sprite.targetY = y;
@@ -22,7 +24,55 @@ function createCardSprite(id, x, y, items, onCardClick, onPanStart, cardWidth, c
22
24
  sprite.lastTitle = undefined;
23
25
  sprite.lastLabels = undefined;
24
26
  sprite.lastValues = undefined;
25
- sprite.container._eventContext = { items, onCardClick, id };
27
+ if (!sprite.graphics || sprite.graphics.destroyed) {
28
+ sprite.graphics = new PIXI.Graphics();
29
+ if (sprite.container) {
30
+ sprite.container.addChildAt(sprite.graphics, 0);
31
+ }
32
+ }
33
+ const offsetX = CARD_GAP / 2;
34
+ const offsetY = CARD_GAP / 2;
35
+ if (!sprite.titleText || sprite.titleText.destroyed) {
36
+ sprite.titleText = new PIXI.Text('', {
37
+ fontSize: 13,
38
+ fill: cardColors.text,
39
+ fontWeight: '600',
40
+ lineHeight: 18,
41
+ wordWrap: false,
42
+ });
43
+ sprite.titleText.position.set(offsetX + CARD_PADDING, offsetY + CARD_PADDING);
44
+ if (sprite.container) {
45
+ sprite.container.addChild(sprite.titleText);
46
+ }
47
+ }
48
+ if (!sprite.labelsText || sprite.labelsText.destroyed) {
49
+ sprite.labelsText = new PIXI.Text('', {
50
+ fontSize: 11,
51
+ fill: cardColors.textSecondary,
52
+ fontWeight: '400',
53
+ lineHeight: 18,
54
+ });
55
+ sprite.labelsText.position.set(offsetX + CARD_PADDING, offsetY + CARD_PADDING + 40);
56
+ if (sprite.container) {
57
+ sprite.container.addChild(sprite.labelsText);
58
+ }
59
+ }
60
+ if (!sprite.valuesText || sprite.valuesText.destroyed) {
61
+ sprite.valuesText = new PIXI.Text('', {
62
+ fontSize: 11,
63
+ fill: cardColors.text,
64
+ fontWeight: '500',
65
+ lineHeight: 18,
66
+ wordWrap: false,
67
+ });
68
+ sprite.valuesText.position.set(offsetX + CARD_PADDING + 65, offsetY + CARD_PADDING + 40);
69
+ if (sprite.container) {
70
+ sprite.container.addChild(sprite.valuesText);
71
+ }
72
+ }
73
+ if (sprite.container) {
74
+ sprite.container._eventContext = { items, onCardClick, id };
75
+ }
26
76
  return sprite;
27
77
  }
28
78
  const container = new PIXI.Container();
@@ -70,8 +120,8 @@ function createCardSprite(id, x, y, items, onCardClick, onPanStart, cardWidth, c
70
120
  container.on('click', (e) => {
71
121
  e.stopPropagation();
72
122
  const ctx = container._eventContext;
73
- const itemsMap = ctx.items;
74
- const item = itemsMap[String(ctx.id)];
123
+ const itemsArray = ctx.items;
124
+ const item = itemsArray[Number(ctx.id)];
75
125
  if (item) {
76
126
  ctx.onCardClick(item, e.nativeEvent, ctx.id);
77
127
  }
@@ -142,6 +192,12 @@ function updateCardContent(sprite, item, selectedId, cardWidth, cardHeight, card
142
192
  const labelsText = 'Type\nOccurred\nCorrelation';
143
193
  const valuesText = `${typeDisplay}\n${timeStr}\n${correlationShort}`;
144
194
  const colorsChanged = sprite.lastCardColors !== colors;
195
+ if (!sprite.titleText || sprite.titleText.destroyed)
196
+ return;
197
+ if (!sprite.labelsText || sprite.labelsText.destroyed)
198
+ return;
199
+ if (!sprite.valuesText || sprite.valuesText.destroyed)
200
+ return;
145
201
  if (sprite.lastTitle !== titleDisplay) {
146
202
  sprite.titleText.text = titleDisplay;
147
203
  sprite.lastTitle = titleDisplay;
@@ -150,14 +206,14 @@ function updateCardContent(sprite, item, selectedId, cardWidth, cardHeight, card
150
206
  sprite.labelsText.text = labelsText;
151
207
  sprite.lastLabels = labelsText;
152
208
  }
153
- if (colorsChanged) {
209
+ if (colorsChanged && sprite.labelsText.style) {
154
210
  sprite.labelsText.style.fill = colors.textSecondary;
155
211
  }
156
212
  if (sprite.lastValues !== valuesText) {
157
213
  sprite.valuesText.text = valuesText;
158
214
  sprite.lastValues = valuesText;
159
215
  }
160
- if (colorsChanged) {
216
+ if (colorsChanged && sprite.valuesText.style) {
161
217
  sprite.valuesText.style.fill = colors.text;
162
218
  }
163
219
  sprite.titleText.visible = true;
@@ -169,12 +225,14 @@ function updateCardContent(sprite, item, selectedId, cardWidth, cardHeight, card
169
225
  }
170
226
  sprite.lastSelectedId = selectedId;
171
227
  sprite.lastCardColors = cardColors;
172
- if (sprite.graphics) {
173
- sprite.graphics.clear();
228
+ if (!sprite.graphics || sprite.graphics.destroyed) {
229
+ sprite.graphics = new PIXI.Graphics();
230
+ if (sprite.container) {
231
+ sprite.container.addChildAt(sprite.graphics, 0);
232
+ }
174
233
  }
175
234
  else {
176
- sprite.graphics = new PIXI.Graphics();
177
- sprite.container.addChildAt(sprite.graphics, 0);
235
+ sprite.graphics.clear();
178
236
  }
179
237
  const actualWidth = cardWidth - CARD_GAP;
180
238
  const actualHeight = cardHeight - CARD_GAP;
@@ -190,12 +248,18 @@ function updateCardContent(sprite, item, selectedId, cardWidth, cardHeight, card
190
248
  gradient.addColorStop(1, colors.base);
191
249
  }
192
250
  sprite.graphics.roundRect(offsetX, offsetY, actualWidth, actualHeight, CARD_RADIUS);
193
- sprite.graphics.fill(gradient);
251
+ if (sprite.graphics && !sprite.graphics.destroyed) {
252
+ sprite.graphics.fill(gradient);
253
+ }
194
254
  if (isSelected) {
195
- sprite.graphics.stroke({ width: 2, color: colors.border });
255
+ if (sprite.graphics && !sprite.graphics.destroyed) {
256
+ sprite.graphics.stroke({ width: 2, color: colors.border });
257
+ }
196
258
  }
197
259
  else {
198
- sprite.graphics.stroke({ width: 1, color: colors.border, alpha: 0.35 });
260
+ if (sprite.graphics && !sprite.graphics.destroyed) {
261
+ sprite.graphics.stroke({ width: 1, color: colors.border, alpha: 0.35 });
262
+ }
199
263
  }
200
264
  }
201
265
 
@@ -1 +1 @@
1
- {"version":3,"file":"sprites.js","sources":["../../../../../PivotViewer/components/pivot/sprites.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 * as PIXI from 'pixi.js';\nimport { CARD_GAP, CARD_PADDING, CARD_RADIUS } from './constants';\nimport type { CardSprite, CardColors } from './constants';\n\nconst spritePool: CardSprite[] = [];\n\nexport function createCardSprite<TItem extends object>(\n id: number | string,\n x: number,\n y: number,\n items: TItem[],\n onCardClick: (item: TItem, e: MouseEvent, id: number | string) => void,\n onPanStart: (e: MouseEvent) => void,\n cardWidth: number,\n cardHeight: number,\n cardColors: CardColors,\n): CardSprite {\n if (spritePool.length > 0) {\n const sprite = spritePool.pop()!;\n sprite.container.visible = true;\n sprite.container.alpha = 1;\n sprite.container.position.set(x, y);\n sprite.itemId = id;\n sprite.targetX = x;\n sprite.targetY = y;\n sprite.currentX = x;\n sprite.currentY = y;\n\n // Reset animation state\n delete sprite.animationStartTime;\n delete sprite.animationDelay;\n delete sprite.startX;\n delete sprite.startY;\n\n // Reset cache\n sprite.lastSelectedId = null;\n sprite.lastCardColors = undefined;\n sprite.lastTitle = undefined;\n sprite.lastLabels = undefined;\n sprite.lastValues = undefined;\n\n // Update event context\n (sprite.container as any)._eventContext = { items, onCardClick, id };\n\n return sprite;\n }\n\n const container = new PIXI.Container();\n container.eventMode = 'static';\n container.cursor = 'pointer';\n container.position.set(x, y);\n\n // Store context for event handlers\n (container as any)._eventContext = { items, onCardClick, id };\n\n const graphics = new PIXI.Graphics();\n\n const actualWidth = cardWidth - CARD_GAP;\n const actualHeight = cardHeight - CARD_GAP;\n const offsetX = CARD_GAP / 2;\n const offsetY = CARD_GAP / 2;\n\n const gradient = new PIXI.FillGradient(0, offsetY, 0, offsetY + actualHeight);\n gradient.addColorStop(0, cardColors.mid);\n gradient.addColorStop(1, cardColors.base);\n\n graphics.roundRect(offsetX, offsetY, actualWidth, actualHeight, CARD_RADIUS);\n graphics.fill(gradient);\n\n container.addChild(graphics);\n\n const titleText = new PIXI.Text('', {\n fontSize: 13,\n fill: cardColors.text as any,\n fontWeight: '600',\n lineHeight: 18,\n wordWrap: false,\n } as any);\n titleText.position.set(offsetX + CARD_PADDING, offsetY + CARD_PADDING);\n container.addChild(titleText);\n\n const labelsText = new PIXI.Text('', {\n fontSize: 11,\n fill: cardColors.textSecondary as any,\n fontWeight: '400',\n lineHeight: 18,\n } as any);\n labelsText.position.set(offsetX + CARD_PADDING, offsetY + CARD_PADDING + 40);\n container.addChild(labelsText);\n\n const valuesText = new PIXI.Text('', {\n fontSize: 11,\n fill: cardColors.text as any,\n fontWeight: '500',\n lineHeight: 18,\n wordWrap: false,\n } as any);\n valuesText.position.set(offsetX + CARD_PADDING + 65, offsetY + CARD_PADDING + 40);\n container.addChild(valuesText);\n\n container.on('click', (e: PIXI.FederatedPointerEvent) => {\n e.stopPropagation();\n const ctx = (container as any)._eventContext as { items: any; onCardClick: (item: any, e: MouseEvent, id: number | string) => void; id: number | string };\n const itemsMap = ctx.items as Record<string, any>;\n const item = itemsMap[String(ctx.id)];\n if (item) {\n ctx.onCardClick(item, e.nativeEvent as MouseEvent, ctx.id);\n }\n });\n\n container.on('pointerdown', (e: PIXI.FederatedPointerEvent) => {\n e.stopPropagation();\n // onPanStart(e.nativeEvent as MouseEvent);\n });\n\n return {\n container,\n graphics,\n titleText,\n labelsText,\n valuesText,\n itemId: id,\n targetX: x,\n targetY: y,\n currentX: x,\n currentY: y,\n };\n}\n\nexport function destroySprite(sprite: CardSprite) {\n if (sprite.container && sprite.container.parent) {\n sprite.container.parent.removeChild(sprite.container);\n }\n // Reset visibility to ensure it doesn't ghost if something goes wrong\n if (sprite.container) {\n sprite.container.visible = false;\n }\n spritePool.push(sprite);\n}\n\nexport function clearSpritePool() {\n for (const sprite of spritePool) {\n try {\n sprite.graphics?.destroy();\n sprite.titleText?.destroy();\n sprite.labelsText?.destroy();\n sprite.valuesText?.destroy();\n sprite.container?.destroy();\n } catch (e) {\n void e;\n }\n }\n spritePool.length = 0;\n}\n\nexport function updateCardContent<TItem extends object>(\n sprite: CardSprite,\n item: TItem,\n selectedId: string | number | null,\n cardWidth: number,\n cardHeight: number,\n cardColors: CardColors,\n) {\n if (!item) return;\n\n const event = item as any;\n const eventType = event.type || event.name || event.title || 'Event';\n\n const timeStr = event.occurred ? new Date(event.occurred).toLocaleString('en-US', {\n month: '2-digit',\n day: '2-digit',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n hour12: false\n }).replace(',', '') : '';\n\n const correlation = event.correlationId || event.correlation || '';\n const correlationShort = correlation ? String(correlation).substring(0, 12) + '...' : '';\n\n const maxTitleLength = 20;\n const titleDisplay = eventType.length > maxTitleLength\n ? eventType.substring(0, maxTitleLength) + '...'\n : eventType;\n\n const maxTypeLength = 16;\n const typeDisplay = eventType.length > maxTypeLength\n ? eventType.substring(0, maxTypeLength) + '...'\n : eventType;\n\n const colors = cardColors;\n const labelsText = 'Type\\nOccurred\\nCorrelation';\n const valuesText = `${typeDisplay}\\n${timeStr}\\n${correlationShort}`;\n const colorsChanged = sprite.lastCardColors !== colors;\n\n if (sprite.lastTitle !== titleDisplay) {\n sprite.titleText.text = titleDisplay;\n sprite.lastTitle = titleDisplay;\n }\n\n if (sprite.lastLabels !== labelsText) {\n sprite.labelsText.text = labelsText;\n sprite.lastLabels = labelsText;\n }\n\n if (colorsChanged) {\n (sprite.labelsText.style as any).fill = colors.textSecondary as any;\n }\n\n if (sprite.lastValues !== valuesText) {\n sprite.valuesText.text = valuesText;\n sprite.lastValues = valuesText;\n }\n\n if (colorsChanged) {\n (sprite.valuesText.style as any).fill = colors.text as any;\n }\n\n sprite.titleText.visible = true;\n sprite.labelsText.visible = true;\n sprite.valuesText.visible = true;\n\n const isSelected = sprite.itemId === selectedId;\n\n // Only redraw graphics if selection state or colors changed\n if (sprite.lastSelectedId === selectedId && !colorsChanged && sprite.graphics) {\n return;\n }\n\n sprite.lastSelectedId = selectedId;\n sprite.lastCardColors = cardColors;\n\n if (sprite.graphics) {\n sprite.graphics.clear();\n } else {\n sprite.graphics = new PIXI.Graphics();\n sprite.container.addChildAt(sprite.graphics, 0);\n }\n\n const actualWidth = cardWidth - CARD_GAP;\n const actualHeight = cardHeight - CARD_GAP;\n const offsetX = CARD_GAP / 2;\n const offsetY = CARD_GAP / 2;\n\n const gradient = new PIXI.FillGradient(0, offsetY, 0, offsetY + actualHeight);\n if (isSelected) {\n gradient.addColorStop(0, colors.gradient);\n gradient.addColorStop(1, colors.mid);\n } else {\n gradient.addColorStop(0, colors.mid);\n gradient.addColorStop(1, colors.base);\n }\n\n sprite.graphics.roundRect(offsetX, offsetY, actualWidth, actualHeight, CARD_RADIUS);\n sprite.graphics.fill(gradient);\n\n if (isSelected) {\n sprite.graphics.stroke({ width: 2, color: colors.border });\n } else {\n sprite.graphics.stroke({ width: 1, color: colors.border, alpha: 0.35 });\n }\n}\n"],"names":[],"mappings":";;;AAOA,MAAM,UAAU,GAAiB,EAAE;SAEnB,gBAAgB,CAC9B,EAAmB,EACnB,CAAS,EACT,CAAS,EACT,KAAc,EACd,WAAsE,EACtE,UAAmC,EACnC,SAAiB,EACjB,UAAkB,EAClB,UAAsB,EAAA;AAEtB,IAAA,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;AACzB,QAAA,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAG;AAChC,QAAA,MAAM,CAAC,SAAS,CAAC,OAAO,GAAG,IAAI;AAC/B,QAAA,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC;QAC1B,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;AACnC,QAAA,MAAM,CAAC,MAAM,GAAG,EAAE;AAClB,QAAA,MAAM,CAAC,OAAO,GAAG,CAAC;AAClB,QAAA,MAAM,CAAC,OAAO,GAAG,CAAC;AAClB,QAAA,MAAM,CAAC,QAAQ,GAAG,CAAC;AACnB,QAAA,MAAM,CAAC,QAAQ,GAAG,CAAC;QAGnB,OAAO,MAAM,CAAC,kBAAkB;QAChC,OAAO,MAAM,CAAC,cAAc;QAC5B,OAAO,MAAM,CAAC,MAAM;QACpB,OAAO,MAAM,CAAC,MAAM;AAGpB,QAAA,MAAM,CAAC,cAAc,GAAG,IAAI;AAC5B,QAAA,MAAM,CAAC,cAAc,GAAG,SAAS;AACjC,QAAA,MAAM,CAAC,SAAS,GAAG,SAAS;AAC5B,QAAA,MAAM,CAAC,UAAU,GAAG,SAAS;AAC7B,QAAA,MAAM,CAAC,UAAU,GAAG,SAAS;AAG5B,QAAA,MAAM,CAAC,SAAiB,CAAC,aAAa,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE;AAEpE,QAAA,OAAO,MAAM;IACf;AAEA,IAAA,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE;AACtC,IAAA,SAAS,CAAC,SAAS,GAAG,QAAQ;AAC9B,IAAA,SAAS,CAAC,MAAM,GAAG,SAAS;IAC5B,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IAG3B,SAAiB,CAAC,aAAa,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE;AAE7D,IAAA,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE;AAEpC,IAAA,MAAM,WAAW,GAAG,SAAS,GAAG,QAAQ;AACxC,IAAA,MAAM,YAAY,GAAG,UAAU,GAAG,QAAQ;AAC1C,IAAA,MAAM,OAAO,GAAG,QAAQ,GAAG,CAAC;AAC5B,IAAA,MAAM,OAAO,GAAG,QAAQ,GAAG,CAAC;AAE5B,IAAA,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,YAAY,CAAC;IAC7E,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC;IACxC,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC;AAEzC,IAAA,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,CAAC;AAC5E,IAAA,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;AAEvB,IAAA,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAE5B,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;AAClC,QAAA,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,UAAU,CAAC,IAAW;AAC5B,QAAA,UAAU,EAAE,KAAK;AACjB,QAAA,UAAU,EAAE,EAAE;AACd,QAAA,QAAQ,EAAE,KAAK;AACT,KAAA,CAAC;AACT,IAAA,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,GAAG,YAAY,EAAE,OAAO,GAAG,YAAY,CAAC;AACtE,IAAA,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;IAE7B,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;AACnC,QAAA,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,UAAU,CAAC,aAAoB;AACrC,QAAA,UAAU,EAAE,KAAK;AACjB,QAAA,UAAU,EAAE,EAAE;AACR,KAAA,CAAC;AACT,IAAA,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,GAAG,YAAY,EAAE,OAAO,GAAG,YAAY,GAAG,EAAE,CAAC;AAC5E,IAAA,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC;IAE9B,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;AACnC,QAAA,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,UAAU,CAAC,IAAW;AAC5B,QAAA,UAAU,EAAE,KAAK;AACjB,QAAA,UAAU,EAAE,EAAE;AACd,QAAA,QAAQ,EAAE,KAAK;AACT,KAAA,CAAC;AACT,IAAA,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,GAAG,YAAY,GAAG,EAAE,EAAE,OAAO,GAAG,YAAY,GAAG,EAAE,CAAC;AACjF,IAAA,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC;IAE9B,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAA6B,KAAI;QACtD,CAAC,CAAC,eAAe,EAAE;AACnB,QAAA,MAAM,GAAG,GAAI,SAAiB,CAAC,aAA0H;AACzJ,QAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,KAA4B;QACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,IAAI,EAAE;AACR,YAAA,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,WAAyB,EAAE,GAAG,CAAC,EAAE,CAAC;QAC5D;AACF,IAAA,CAAC,CAAC;IAEF,SAAS,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,CAA6B,KAAI;QAC5D,CAAC,CAAC,eAAe,EAAE;AAErB,IAAA,CAAC,CAAC;IAEF,OAAO;QACL,SAAS;QACT,QAAQ;QACR,SAAS;QACT,UAAU;QACV,UAAU;AACV,QAAA,MAAM,EAAE,EAAE;AACV,QAAA,OAAO,EAAE,CAAC;AACV,QAAA,OAAO,EAAE,CAAC;AACV,QAAA,QAAQ,EAAE,CAAC;AACX,QAAA,QAAQ,EAAE,CAAC;KACZ;AACH;AAEM,SAAU,aAAa,CAAC,MAAkB,EAAA;IAC9C,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE;QAC/C,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC;IACvD;AAEA,IAAA,IAAI,MAAM,CAAC,SAAS,EAAE;AACpB,QAAA,MAAM,CAAC,SAAS,CAAC,OAAO,GAAG,KAAK;IAClC;AACA,IAAA,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;AACzB;SAEgB,eAAe,GAAA;AAC7B,IAAA,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE;AAC/B,QAAA,IAAI;AACF,YAAA,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE;AAC1B,YAAA,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE;AAC3B,YAAA,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE;AAC5B,YAAA,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE;AAC5B,YAAA,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE;QAC7B;QAAE,OAAO,CAAC,EAAE;QAEZ;IACF;AACA,IAAA,UAAU,CAAC,MAAM,GAAG,CAAC;AACvB;AAEM,SAAU,iBAAiB,CAC/B,MAAkB,EAClB,IAAW,EACX,UAAkC,EAClC,SAAiB,EACjB,UAAkB,EAClB,UAAsB,EAAA;AAEtB,IAAA,IAAI,CAAC,IAAI;QAAE;IAEX,MAAM,KAAK,GAAG,IAAW;AACzB,IAAA,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,OAAO;AAEpE,IAAA,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE;AAChF,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,GAAG,EAAE,SAAS;AACd,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,MAAM,EAAE,SAAS;AACjB,QAAA,MAAM,EAAE;KACT,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE;IAExB,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,WAAW,IAAI,EAAE;IAClE,MAAM,gBAAgB,GAAG,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,EAAE;IAExF,MAAM,cAAc,GAAG,EAAE;AACzB,IAAA,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,GAAG;UACpC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,cAAc,CAAC,GAAG;UACzC,SAAS;IAEb,MAAM,aAAa,GAAG,EAAE;AACxB,IAAA,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,GAAG;UACnC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,aAAa,CAAC,GAAG;UACxC,SAAS;IAEb,MAAM,MAAM,GAAG,UAAU;IACzB,MAAM,UAAU,GAAG,6BAA6B;IAChD,MAAM,UAAU,GAAG,CAAA,EAAG,WAAW,KAAK,OAAO,CAAA,EAAA,EAAK,gBAAgB,CAAA,CAAE;AACpE,IAAA,MAAM,aAAa,GAAG,MAAM,CAAC,cAAc,KAAK,MAAM;AAEtD,IAAA,IAAI,MAAM,CAAC,SAAS,KAAK,YAAY,EAAE;AACrC,QAAA,MAAM,CAAC,SAAS,CAAC,IAAI,GAAG,YAAY;AACpC,QAAA,MAAM,CAAC,SAAS,GAAG,YAAY;IACjC;AAEE,IAAA,IAAI,MAAM,CAAC,UAAU,KAAK,UAAU,EAAE;AACtC,QAAA,MAAM,CAAC,UAAU,CAAC,IAAI,GAAG,UAAU;AACnC,QAAA,MAAM,CAAC,UAAU,GAAG,UAAU;IAChC;IAEA,IAAI,aAAa,EAAE;QAChB,MAAM,CAAC,UAAU,CAAC,KAAa,CAAC,IAAI,GAAG,MAAM,CAAC,aAAoB;IACrE;AAEA,IAAA,IAAI,MAAM,CAAC,UAAU,KAAK,UAAU,EAAE;AACpC,QAAA,MAAM,CAAC,UAAU,CAAC,IAAI,GAAG,UAAU;AACnC,QAAA,MAAM,CAAC,UAAU,GAAG,UAAU;IAChC;IAEA,IAAI,aAAa,EAAE;QAChB,MAAM,CAAC,UAAU,CAAC,KAAa,CAAC,IAAI,GAAG,MAAM,CAAC,IAAW;IAC5D;AAEA,IAAA,MAAM,CAAC,SAAS,CAAC,OAAO,GAAG,IAAI;AAC/B,IAAA,MAAM,CAAC,UAAU,CAAC,OAAO,GAAG,IAAI;AAChC,IAAA,MAAM,CAAC,UAAU,CAAC,OAAO,GAAG,IAAI;AAEhC,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,KAAK,UAAU;AAG/C,IAAA,IAAI,MAAM,CAAC,cAAc,KAAK,UAAU,IAAI,CAAC,aAAa,IAAI,MAAM,CAAC,QAAQ,EAAE;QAC7E;IACF;AAEA,IAAA,MAAM,CAAC,cAAc,GAAG,UAAU;AAClC,IAAA,MAAM,CAAC,cAAc,GAAG,UAAU;AAElC,IAAA,IAAI,MAAM,CAAC,QAAQ,EAAE;AACnB,QAAA,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE;IACzB;SAAO;QACL,MAAM,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE;QACrC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjD;AAEA,IAAA,MAAM,WAAW,GAAG,SAAS,GAAG,QAAQ;AACxC,IAAA,MAAM,YAAY,GAAG,UAAU,GAAG,QAAQ;AAC1C,IAAA,MAAM,OAAO,GAAG,QAAQ,GAAG,CAAC;AAC5B,IAAA,MAAM,OAAO,GAAG,QAAQ,GAAG,CAAC;AAE5B,IAAA,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,YAAY,CAAC;IAC7E,IAAI,UAAU,EAAE;QACd,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;QACzC,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC;IACtC;SAAO;QACL,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC;QACpC,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC;IACvC;AAEA,IAAA,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,CAAC;AACnF,IAAA,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;IAE9B,IAAI,UAAU,EAAE;AACd,QAAA,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC5D;SAAO;QACL,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzE;AACF;;;;"}
1
+ {"version":3,"file":"sprites.js","sources":["../../../../../PivotViewer/components/pivot/sprites.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 * as PIXI from 'pixi.js';\nimport { CARD_GAP, CARD_PADDING, CARD_RADIUS } from './constants';\nimport type { CardSprite, CardColors } from './constants';\n\nconst spritePool: CardSprite[] = [];\n\nexport function createCardSprite<TItem extends object>(\n id: number | string,\n x: number,\n y: number,\n items: TItem[],\n onCardClick: (item: TItem, e: MouseEvent, id: number | string) => void,\n onPanStart: (e: MouseEvent) => void,\n cardWidth: number,\n cardHeight: number,\n cardColors: CardColors,\n): CardSprite {\n if (spritePool.length > 0) {\n const sprite = spritePool.pop()!;\n if (sprite.container) {\n sprite.container.visible = true;\n sprite.container.alpha = 1;\n sprite.container.position.set(x, y);\n }\n sprite.itemId = id;\n sprite.targetX = x;\n sprite.targetY = y;\n sprite.currentX = x;\n sprite.currentY = y;\n\n // Reset animation state\n delete sprite.animationStartTime;\n delete sprite.animationDelay;\n delete sprite.startX;\n delete sprite.startY;\n\n // Reset cache\n sprite.lastSelectedId = null;\n sprite.lastCardColors = undefined;\n sprite.lastTitle = undefined;\n sprite.lastLabels = undefined;\n sprite.lastValues = undefined;\n\n // Recreate graphics if it was destroyed\n if (!sprite.graphics || sprite.graphics.destroyed) {\n sprite.graphics = new PIXI.Graphics();\n if (sprite.container) {\n sprite.container.addChildAt(sprite.graphics, 0);\n }\n }\n\n // Recreate text objects if they were destroyed\n const offsetX = CARD_GAP / 2;\n const offsetY = CARD_GAP / 2;\n \n if (!sprite.titleText || sprite.titleText.destroyed) {\n sprite.titleText = new PIXI.Text('', {\n fontSize: 13,\n fill: cardColors.text as any,\n fontWeight: '600',\n lineHeight: 18,\n wordWrap: false,\n } as any);\n sprite.titleText.position.set(offsetX + CARD_PADDING, offsetY + CARD_PADDING);\n if (sprite.container) {\n sprite.container.addChild(sprite.titleText);\n }\n }\n\n if (!sprite.labelsText || sprite.labelsText.destroyed) {\n sprite.labelsText = new PIXI.Text('', {\n fontSize: 11,\n fill: cardColors.textSecondary as any,\n fontWeight: '400',\n lineHeight: 18,\n } as any);\n sprite.labelsText.position.set(offsetX + CARD_PADDING, offsetY + CARD_PADDING + 40);\n if (sprite.container) {\n sprite.container.addChild(sprite.labelsText);\n }\n }\n\n if (!sprite.valuesText || sprite.valuesText.destroyed) {\n sprite.valuesText = new PIXI.Text('', {\n fontSize: 11,\n fill: cardColors.text as any,\n fontWeight: '500',\n lineHeight: 18,\n wordWrap: false,\n } as any);\n sprite.valuesText.position.set(offsetX + CARD_PADDING + 65, offsetY + CARD_PADDING + 40);\n if (sprite.container) {\n sprite.container.addChild(sprite.valuesText);\n }\n }\n\n // Update event context\n if (sprite.container) {\n (sprite.container as any)._eventContext = { items, onCardClick, id };\n }\n\n return sprite;\n }\n\n const container = new PIXI.Container();\n container.eventMode = 'static';\n container.cursor = 'pointer';\n container.position.set(x, y);\n\n // Store context for event handlers\n (container as any)._eventContext = { items, onCardClick, id };\n\n const graphics = new PIXI.Graphics();\n\n const actualWidth = cardWidth - CARD_GAP;\n const actualHeight = cardHeight - CARD_GAP;\n const offsetX = CARD_GAP / 2;\n const offsetY = CARD_GAP / 2;\n\n const gradient = new PIXI.FillGradient(0, offsetY, 0, offsetY + actualHeight);\n gradient.addColorStop(0, cardColors.mid);\n gradient.addColorStop(1, cardColors.base);\n\n graphics.roundRect(offsetX, offsetY, actualWidth, actualHeight, CARD_RADIUS);\n graphics.fill(gradient);\n\n container.addChild(graphics);\n\n const titleText = new PIXI.Text('', {\n fontSize: 13,\n fill: cardColors.text as any,\n fontWeight: '600',\n lineHeight: 18,\n wordWrap: false,\n } as any);\n titleText.position.set(offsetX + CARD_PADDING, offsetY + CARD_PADDING);\n container.addChild(titleText);\n\n const labelsText = new PIXI.Text('', {\n fontSize: 11,\n fill: cardColors.textSecondary as any,\n fontWeight: '400',\n lineHeight: 18,\n } as any);\n labelsText.position.set(offsetX + CARD_PADDING, offsetY + CARD_PADDING + 40);\n container.addChild(labelsText);\n\n const valuesText = new PIXI.Text('', {\n fontSize: 11,\n fill: cardColors.text as any,\n fontWeight: '500',\n lineHeight: 18,\n wordWrap: false,\n } as any);\n valuesText.position.set(offsetX + CARD_PADDING + 65, offsetY + CARD_PADDING + 40);\n container.addChild(valuesText);\n\n container.on('click', (e: PIXI.FederatedPointerEvent) => {\n e.stopPropagation();\n const ctx = (container as any)._eventContext as { items: any; onCardClick: (item: any, e: MouseEvent, id: number | string) => void; id: number | string };\n const itemsArray = ctx.items as any[];\n const item = itemsArray[Number(ctx.id)];\n if (item) {\n ctx.onCardClick(item, e.nativeEvent as MouseEvent, ctx.id);\n }\n });\n\n container.on('pointerdown', (e: PIXI.FederatedPointerEvent) => {\n e.stopPropagation();\n // onPanStart(e.nativeEvent as MouseEvent);\n });\n\n return {\n container,\n graphics,\n titleText,\n labelsText,\n valuesText,\n itemId: id,\n targetX: x,\n targetY: y,\n currentX: x,\n currentY: y,\n };\n}\n\nexport function destroySprite(sprite: CardSprite) {\n if (sprite.container && sprite.container.parent) {\n sprite.container.parent.removeChild(sprite.container);\n }\n // Reset visibility to ensure it doesn't ghost if something goes wrong\n if (sprite.container) {\n sprite.container.visible = false;\n }\n spritePool.push(sprite);\n}\n\nexport function clearSpritePool() {\n for (const sprite of spritePool) {\n try {\n sprite.graphics?.destroy();\n sprite.titleText?.destroy();\n sprite.labelsText?.destroy();\n sprite.valuesText?.destroy();\n sprite.container?.destroy();\n } catch (e) {\n void e;\n }\n }\n spritePool.length = 0;\n}\n\n// Updated: Text objects now recreated when recycling pooled sprites\nexport function updateCardContent<TItem extends object>(\n sprite: CardSprite,\n item: TItem,\n selectedId: string | number | null,\n cardWidth: number,\n cardHeight: number,\n cardColors: CardColors,\n) {\n if (!item) return;\n\n const event = item as any;\n const eventType = event.type || event.name || event.title || 'Event';\n\n const timeStr = event.occurred ? new Date(event.occurred).toLocaleString('en-US', {\n month: '2-digit',\n day: '2-digit',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n hour12: false\n }).replace(',', '') : '';\n\n const correlation = event.correlationId || event.correlation || '';\n const correlationShort = correlation ? String(correlation).substring(0, 12) + '...' : '';\n\n const maxTitleLength = 20;\n const titleDisplay = eventType.length > maxTitleLength\n ? eventType.substring(0, maxTitleLength) + '...'\n : eventType;\n\n const maxTypeLength = 16;\n const typeDisplay = eventType.length > maxTypeLength\n ? eventType.substring(0, maxTypeLength) + '...'\n : eventType;\n\n const colors = cardColors;\n const labelsText = 'Type\\nOccurred\\nCorrelation';\n const valuesText = `${typeDisplay}\\n${timeStr}\\n${correlationShort}`;\n const colorsChanged = sprite.lastCardColors !== colors;\n\n // Ensure text objects exist before using them\n if (!sprite.titleText || sprite.titleText.destroyed) return;\n if (!sprite.labelsText || sprite.labelsText.destroyed) return;\n if (!sprite.valuesText || sprite.valuesText.destroyed) return;\n\n if (sprite.lastTitle !== titleDisplay) {\n sprite.titleText.text = titleDisplay;\n sprite.lastTitle = titleDisplay;\n }\n\n if (sprite.lastLabels !== labelsText) {\n sprite.labelsText.text = labelsText;\n sprite.lastLabels = labelsText;\n }\n\n if (colorsChanged && sprite.labelsText.style) {\n (sprite.labelsText.style as any).fill = colors.textSecondary as any;\n }\n\n if (sprite.lastValues !== valuesText) {\n sprite.valuesText.text = valuesText;\n sprite.lastValues = valuesText;\n }\n\n if (colorsChanged && sprite.valuesText.style) {\n (sprite.valuesText.style as any).fill = colors.text as any;\n }\n\n sprite.titleText.visible = true;\n sprite.labelsText.visible = true;\n sprite.valuesText.visible = true;\n\n const isSelected = sprite.itemId === selectedId;\n\n // Only redraw graphics if selection state or colors changed\n if (sprite.lastSelectedId === selectedId && !colorsChanged && sprite.graphics) {\n return;\n }\n\n sprite.lastSelectedId = selectedId;\n sprite.lastCardColors = cardColors;\n\n // Ensure graphics exists before attempting to use it\n if (!sprite.graphics || sprite.graphics.destroyed) {\n sprite.graphics = new PIXI.Graphics();\n if (sprite.container) {\n sprite.container.addChildAt(sprite.graphics, 0);\n }\n } else {\n sprite.graphics.clear();\n }\n\n const actualWidth = cardWidth - CARD_GAP;\n const actualHeight = cardHeight - CARD_GAP;\n const offsetX = CARD_GAP / 2;\n const offsetY = CARD_GAP / 2;\n\n const gradient = new PIXI.FillGradient(0, offsetY, 0, offsetY + actualHeight);\n if (isSelected) {\n gradient.addColorStop(0, colors.gradient);\n gradient.addColorStop(1, colors.mid);\n } else {\n gradient.addColorStop(0, colors.mid);\n gradient.addColorStop(1, colors.base);\n }\n\n sprite.graphics.roundRect(offsetX, offsetY, actualWidth, actualHeight, CARD_RADIUS);\n \n // Ensure graphics is still valid before filling\n if (sprite.graphics && !sprite.graphics.destroyed) {\n sprite.graphics.fill(gradient);\n }\n\n if (isSelected) {\n if (sprite.graphics && !sprite.graphics.destroyed) {\n sprite.graphics.stroke({ width: 2, color: colors.border });\n }\n } else {\n if (sprite.graphics && !sprite.graphics.destroyed) {\n sprite.graphics.stroke({ width: 1, color: colors.border, alpha: 0.35 });\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"visibility.d.ts","sourceRoot":"","sources":["../../../../../PivotViewer/components/pivot/visibility.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAChC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,MAAM,WAAW,UAAU,CAAC,KAAK;IAC/B,IAAI,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,cAAc,GAAG,IAAI,CAAC;IACjC,OAAO,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,UAAU,CAAC,CAAC;IAC1C,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,WAAW,CAAC;IACxB,KAAK,EAAE,KAAK,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,UAAU,CAAC;IAC5E,iBAAiB,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,KAAK,IAAI,CAAC;IAC7D,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,UAAU,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CAClC;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,QA+RrE"}
1
+ {"version":3,"file":"visibility.d.ts","sourceRoot":"","sources":["../../../../../PivotViewer/components/pivot/visibility.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAChC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,MAAM,WAAW,UAAU,CAAC,KAAK;IAC7B,IAAI,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,cAAc,GAAG,IAAI,CAAC;IACjC,OAAO,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,UAAU,CAAC,CAAC;IAC1C,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,WAAW,CAAC;IACxB,KAAK,EAAE,KAAK,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,UAAU,CAAC;IAC5E,iBAAiB,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,KAAK,IAAI,CAAC;IAC7D,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,UAAU,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CACpC;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,QA+TrE"}