@cratis/components 1.3.0 → 1.4.1

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 (89) hide show
  1. package/dist/cjs/CommandForm/fields/CalendarField.js +13 -0
  2. package/dist/cjs/CommandForm/fields/CalendarField.js.map +1 -0
  3. package/dist/cjs/CommandForm/fields/ChipsField.js +18 -0
  4. package/dist/cjs/CommandForm/fields/ChipsField.js.map +1 -0
  5. package/dist/cjs/CommandForm/fields/ColorPickerField.js +17 -0
  6. package/dist/cjs/CommandForm/fields/ColorPickerField.js.map +1 -0
  7. package/dist/cjs/CommandForm/fields/MultiSelectField.js +18 -0
  8. package/dist/cjs/CommandForm/fields/MultiSelectField.js.map +1 -0
  9. package/dist/cjs/CommandForm/index.js +8 -0
  10. package/dist/cjs/CommandForm/index.js.map +1 -1
  11. package/dist/cjs/PivotViewer/PivotViewer.css +8 -2
  12. package/dist/cjs/PivotViewer/PivotViewer.js +3 -0
  13. package/dist/cjs/PivotViewer/PivotViewer.js.map +1 -1
  14. package/dist/cjs/PivotViewer/engine/layout.js +2 -2
  15. package/dist/cjs/PivotViewer/engine/layout.js.map +1 -1
  16. package/dist/cjs/PivotViewer/hooks/useCardSelection.js +4 -4
  17. package/dist/cjs/PivotViewer/hooks/useCardSelection.js.map +1 -1
  18. package/dist/cjs/PivotViewer/hooks/useDetailPanelClose.js +3 -3
  19. package/dist/cjs/PivotViewer/hooks/useDetailPanelClose.js.map +1 -1
  20. package/dist/cjs/PivotViewer/hooks/useWheelZoom.js +8 -1
  21. package/dist/cjs/PivotViewer/hooks/useWheelZoom.js.map +1 -1
  22. package/dist/cjs/PivotViewer/utils/selection.js +22 -2
  23. package/dist/cjs/PivotViewer/utils/selection.js.map +1 -1
  24. package/dist/cjs/tailwind-utilities.css +3 -0
  25. package/dist/esm/CommandDialog/CommandDialog.stories.d.ts.map +1 -1
  26. package/dist/esm/CommandDialog/CommandDialog.stories.js +129 -142
  27. package/dist/esm/CommandDialog/CommandDialog.stories.js.map +1 -1
  28. package/dist/esm/CommandForm/fields/CalendarField.d.ts +17 -0
  29. package/dist/esm/CommandForm/fields/CalendarField.d.ts.map +1 -0
  30. package/dist/esm/CommandForm/fields/CalendarField.js +11 -0
  31. package/dist/esm/CommandForm/fields/CalendarField.js.map +1 -0
  32. package/dist/esm/CommandForm/fields/ChipsField.d.ts +15 -0
  33. package/dist/esm/CommandForm/fields/ChipsField.d.ts.map +1 -0
  34. package/dist/esm/CommandForm/fields/ChipsField.js +16 -0
  35. package/dist/esm/CommandForm/fields/ChipsField.js.map +1 -0
  36. package/dist/esm/CommandForm/fields/ColorPickerField.d.ts +12 -0
  37. package/dist/esm/CommandForm/fields/ColorPickerField.d.ts.map +1 -0
  38. package/dist/esm/CommandForm/fields/ColorPickerField.js +15 -0
  39. package/dist/esm/CommandForm/fields/ColorPickerField.js.map +1 -0
  40. package/dist/esm/CommandForm/fields/Fields.stories.d.ts +4 -0
  41. package/dist/esm/CommandForm/fields/Fields.stories.d.ts.map +1 -1
  42. package/dist/esm/CommandForm/fields/Fields.stories.js +45 -3
  43. package/dist/esm/CommandForm/fields/Fields.stories.js.map +1 -1
  44. package/dist/esm/CommandForm/fields/MultiSelectField.d.ts +18 -0
  45. package/dist/esm/CommandForm/fields/MultiSelectField.d.ts.map +1 -0
  46. package/dist/esm/CommandForm/fields/MultiSelectField.js +16 -0
  47. package/dist/esm/CommandForm/fields/MultiSelectField.js.map +1 -0
  48. package/dist/esm/CommandForm/fields/index.d.ts +4 -0
  49. package/dist/esm/CommandForm/fields/index.d.ts.map +1 -1
  50. package/dist/esm/CommandForm/fields/index.js +4 -0
  51. package/dist/esm/CommandForm/fields/index.js.map +1 -1
  52. package/dist/esm/CommandForm/index.js +4 -0
  53. package/dist/esm/CommandForm/index.js.map +1 -1
  54. package/dist/esm/Dialogs/Dialog.stories.d.ts.map +1 -1
  55. package/dist/esm/Dialogs/Dialog.stories.js +15 -16
  56. package/dist/esm/Dialogs/Dialog.stories.js.map +1 -1
  57. package/dist/esm/ObjectNavigationalBar/ObjectNavigationalBar.stories.d.ts.map +1 -1
  58. package/dist/esm/ObjectNavigationalBar/ObjectNavigationalBar.stories.js +12 -13
  59. package/dist/esm/ObjectNavigationalBar/ObjectNavigationalBar.stories.js.map +1 -1
  60. package/dist/esm/PivotViewer/PivotViewer.css +8 -2
  61. package/dist/esm/PivotViewer/PivotViewer.d.ts.map +1 -1
  62. package/dist/esm/PivotViewer/PivotViewer.js +3 -0
  63. package/dist/esm/PivotViewer/PivotViewer.js.map +1 -1
  64. package/dist/esm/PivotViewer/PivotViewer.stories.d.ts +1 -0
  65. package/dist/esm/PivotViewer/PivotViewer.stories.d.ts.map +1 -1
  66. package/dist/esm/PivotViewer/PivotViewer.stories.js +177 -0
  67. package/dist/esm/PivotViewer/PivotViewer.stories.js.map +1 -1
  68. package/dist/esm/PivotViewer/engine/layout.js +2 -2
  69. package/dist/esm/PivotViewer/engine/layout.js.map +1 -1
  70. package/dist/esm/PivotViewer/hooks/useCardSelection.d.ts +4 -1
  71. package/dist/esm/PivotViewer/hooks/useCardSelection.d.ts.map +1 -1
  72. package/dist/esm/PivotViewer/hooks/useCardSelection.js +4 -4
  73. package/dist/esm/PivotViewer/hooks/useCardSelection.js.map +1 -1
  74. package/dist/esm/PivotViewer/hooks/useDetailPanelClose.d.ts +3 -1
  75. package/dist/esm/PivotViewer/hooks/useDetailPanelClose.d.ts.map +1 -1
  76. package/dist/esm/PivotViewer/hooks/useDetailPanelClose.js +3 -3
  77. package/dist/esm/PivotViewer/hooks/useDetailPanelClose.js.map +1 -1
  78. package/dist/esm/PivotViewer/hooks/useWheelZoom.d.ts.map +1 -1
  79. package/dist/esm/PivotViewer/hooks/useWheelZoom.js +8 -1
  80. package/dist/esm/PivotViewer/hooks/useWheelZoom.js.map +1 -1
  81. package/dist/esm/PivotViewer/utils/selection.d.ts.map +1 -1
  82. package/dist/esm/PivotViewer/utils/selection.js +23 -3
  83. package/dist/esm/PivotViewer/utils/selection.js.map +1 -1
  84. package/dist/esm/SchemaEditor/SchemaEditor.stories.d.ts.map +1 -1
  85. package/dist/esm/SchemaEditor/SchemaEditor.stories.js +7 -8
  86. package/dist/esm/SchemaEditor/SchemaEditor.stories.js.map +1 -1
  87. package/dist/esm/tailwind-utilities.css +3 -0
  88. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  89. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"PivotViewer.js","sources":["../../../PivotViewer/PivotViewer.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { PivotViewerProps } from './types';\nimport type { GroupingResult } from './engine/types';\nimport { usePivotEngine } from './hooks/usePivotEngine';\nimport { computeLayout } from './engine/layout';\nimport { useFilterState } from './hooks/useFilterState';\nimport { useDimensionState } from './hooks/useDimensionState';\nimport { useZoomState } from './hooks/useZoomState';\nimport { BASE_CARD_WIDTH, BASE_CARD_HEIGHT, CARDS_PER_COLUMN, GROUP_SPACING } from './constants';\nimport './PivotViewer.css';\nimport { PivotViewerMain } from './components/PivotViewerMain';\nimport { FilterPanelContainer } from './components/FilterPanelContainer';\nimport { ToolbarContainer } from './components/ToolbarContainer';\nimport { usePanning, useWheelZoom, useFilterOptions } from './hooks';\nimport { useContainerDimensions } from './hooks/useContainerDimensions';\nimport type { ViewMode } from './components/Toolbar';\nimport { useFieldExtractors } from './hooks/useFieldExtractors';\nimport { useCurrentFilters, useCurrentGroupBy } from './hooks/useCurrentFilters';\nimport { useCardSelection } from './hooks/useCardSelection';\nimport { useDetailPanelClose } from './hooks/useDetailPanelClose';\nimport { useScrollSync } from './hooks/useScrollSync';\nimport { useAnimationModeTracking } from './hooks/useAnimationModeTracking';\nimport { useViewModeScrollHandling } from './hooks/useViewModeScrollHandling';\n\nexport function PivotViewer<TItem extends object>({\n data,\n dimensions,\n filters,\n defaultDimensionKey,\n cardRenderer,\n detailRenderer,\n getItemId,\n searchFields,\n className,\n emptyContent,\n isLoading = false,\n colors,\n}: PivotViewerProps<TItem>) {\n // Refs\n const containerRef = useRef<HTMLDivElement>(null!);\n const filterButtonRef = useRef<HTMLButtonElement>(null!);\n const axisLabelsRef = useRef<HTMLDivElement>(null!);\n const spacerRef = useRef<HTMLDivElement>(null!);\n\n // State\n const [search, setSearch] = useState('');\n const [viewMode, setViewMode] = useState<ViewMode>('collection');\n const [filtersOpen, setFiltersOpen] = useState(false);\n const [selectedItem, setSelectedItem] = useState<TItem | null>(null);\n const [isZooming, setIsZooming] = useState(false);\n const [visibleIds, setVisibleIds] = useState<Uint32Array>(new Uint32Array(0));\n const [grouping, setGrouping] = useState<GroupingResult>({ groups: [] });\n const [hoveredGroupIndex, setHoveredGroupIndex] = useState<number | null>(null);\n const [preSelectionState, setPreSelectionState] = useState<{ zoom: number; scrollLeft: number; scrollTop: number } | null>(null);\n const [, setAnimationMode] = useState<'layout' | 'filter'>('layout');\n const [scrollPosition, setScrollPosition] = useState({ x: 0, y: 0 });\n\n // Filter hooks\n const {\n filterState,\n rangeFilterState,\n expandedFilterKey,\n setExpandedFilterKey,\n handleToggleFilter,\n handleClearFilter,\n handleRangeChange,\n } = useFilterState(filters);\n\n // Dimension hooks\n const {\n activeDimensionKey,\n setActiveDimensionKey,\n activeDimension,\n dimensionFilter,\n handleAxisLabelClick,\n } = useDimensionState(dimensions, defaultDimensionKey);\n\n // Zoom and pan hooks\n const {\n zoomLevel,\n setZoomLevel,\n handleZoomIn,\n handleZoomOut,\n handleZoomSlider,\n handleZoomReset,\n handleZoomChange,\n } = useZoomState(1);\n\n const {\n isPanning,\n handlePanStart,\n handlePanMove,\n handlePanEnd,\n } = usePanning(containerRef, undefined, setScrollPosition);\n\n useWheelZoom(containerRef, zoomLevel, setZoomLevel);\n\n // Track container dimensions for responsive layout\n const containerDimensions = useContainerDimensions(containerRef, isLoading);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const handleScroll = () => {\n setScrollPosition({\n x: container.scrollLeft,\n y: container.scrollTop,\n });\n };\n\n container.addEventListener('scroll', handleScroll);\n return () => container.removeEventListener('scroll', handleScroll);\n }, []);\n\n // Build field extractors for the columnar store\n const { fieldExtractors, indexFields } = useFieldExtractors(dimensions, filters);\n\n // Initialize the Web Worker engine\n const { ready, applyFilters: engineApplyFilters, computeGrouping, sortIds } = usePivotEngine({\n data,\n fieldExtractors,\n indexFields,\n });\n\n // Build filter specs from UI state\n const currentFilters = useCurrentFilters(\n filters,\n filterState,\n rangeFilterState,\n search,\n searchFields,\n dimensionFilter,\n activeDimension,\n );\n\n const currentGroupBy = useCurrentGroupBy(activeDimensionKey, dimensions);\n\n // Apply filters\n useEffect(() => {\n if (!ready) return;\n\n engineApplyFilters(currentFilters).then((result) => {\n // If the engine failed to return any IDs while no filters are active,\n // fall back to showing the full dataset so the canvas never renders empty.\n if (result.visibleIds.length === 0 && currentFilters.length === 0 && data.length > 0) {\n const fallbackIds = new Uint32Array(data.length);\n for (let i = 0; i < data.length; i++) {\n fallbackIds[i] = i;\n }\n setVisibleIds(fallbackIds);\n return;\n }\n\n setVisibleIds(result.visibleIds);\n });\n }, [ready, currentFilters, engineApplyFilters, data.length]);\n\n // Compute grouping\n const lastGroupingRequest = useRef<{ viewMode: ViewMode; groupBy: unknown; visibleIds: Uint32Array } | null>(null);\n \n useEffect(() => {\n if (!ready || visibleIds.length === 0) {\n setGrouping({ groups: [] });\n lastGroupingRequest.current = null;\n return;\n }\n\n if (viewMode === 'collection') {\n // In collection mode, create a single group with all items\n // Sort items if activeDimensionKey is set\n if (activeDimensionKey) {\n sortIds(visibleIds, activeDimensionKey).then((sortedIds) => {\n setGrouping({\n groups: [{\n key: 'all',\n label: 'All Items',\n value: 'all',\n ids: sortedIds,\n count: sortedIds.length\n }]\n });\n });\n } else {\n setGrouping({\n groups: [{\n key: 'all',\n label: 'All Items',\n value: 'all',\n ids: visibleIds,\n count: visibleIds.length\n }]\n });\n }\n lastGroupingRequest.current = null;\n return;\n }\n\n // Check if this is the same request as last time to prevent duplicate computations\n const lastRequest = lastGroupingRequest.current;\n if (\n lastRequest &&\n lastRequest.viewMode === viewMode &&\n (lastRequest.groupBy as unknown as typeof currentGroupBy)?.field === currentGroupBy.field &&\n lastRequest.visibleIds === visibleIds\n ) {\n return;\n }\n\n lastGroupingRequest.current = { viewMode, groupBy: currentGroupBy, visibleIds };\n \n computeGrouping(visibleIds, currentGroupBy).then((result) => {\n setGrouping(result);\n });\n }, [ready, visibleIds, currentGroupBy, viewMode, computeGrouping, sortIds, activeDimensionKey]);\n\n // Compute layout\n const layout = useMemo(() => {\n // Calculate layout at base dimensions (zoom is applied as transform)\n const cardWidth = BASE_CARD_WIDTH;\n const cardHeight = BASE_CARD_HEIGHT;\n const containerWidth = containerDimensions.width / zoomLevel;\n // For grouped mode, use fixed container height to ensure stable layout during zoom\n const containerHeight = viewMode === 'collection'\n ? containerDimensions.height / zoomLevel\n : containerDimensions.height;\n\n const result = computeLayout(grouping, {\n viewMode,\n cardWidth,\n cardHeight,\n cardsPerColumn: CARDS_PER_COLUMN,\n groupSpacing: GROUP_SPACING,\n containerWidth,\n containerHeight,\n });\n\n return result;\n }, [grouping, viewMode, zoomLevel, containerDimensions.width, containerDimensions.height]);\n\n const resolveId = useCallback((item: TItem, index: number) => {\n if (getItemId) {\n const id = getItemId(item, index);\n return typeof id === 'number' ? id : index;\n }\n const id = (item as Record<string, unknown>)['id'];\n return typeof id === 'number' ? id : index;\n }, [getItemId]);\n\n // Track animation mode changes\n useAnimationModeTracking(filterState, rangeFilterState, search, activeDimensionKey, viewMode, setAnimationMode);\n\n // Sync axis labels scroll with container scroll\n useScrollSync(containerRef, axisLabelsRef, viewMode);\n\n // Handle scroll positioning when switching view modes or grouping changes\n useViewModeScrollHandling({\n containerRef,\n viewMode,\n grouping,\n layout,\n selectedItem,\n zoomLevel,\n resolveId,\n data,\n setPreSelectionState,\n });\n\n // Handle card selection (click)\n const handleCardClick = useCardSelection({\n data,\n isPanning,\n selectedItem,\n zoomLevel,\n viewMode,\n layout,\n containerDimensions,\n scrollPosition,\n preSelectionState,\n grouping,\n getItemId,\n resolveId,\n setZoomLevel,\n setIsZooming,\n setSelectedItem,\n setPreSelectionState,\n });\n\n // Handle detail panel close\n const closeDetail = useDetailPanelClose({\n selectedItem,\n preSelectionState,\n zoomLevel,\n viewMode,\n layout,\n containerDimensions,\n grouping,\n data,\n resolveId,\n setZoomLevel,\n setIsZooming,\n setSelectedItem,\n setPreSelectionState,\n });\n\n // Use base card dimensions - zoom is applied as transform in canvas\n const cardWidth = BASE_CARD_WIDTH;\n const cardHeight = BASE_CARD_HEIGHT;\n\n // Calculate filter options\n const filterOptions = useFilterOptions(data, filters, filterState, rangeFilterState);\n\n const hasFilters = Boolean(filters && filters.length > 0);\n const activeFilterCount = Object.values(filterState).reduce((sum: number, vals) => sum + (vals as Set<string>).size, 0) +\n Object.values(rangeFilterState).filter(r => r !== null).length;\n\n const viewerClassName = [\n 'pivot-viewer',\n className,\n hasFilters ? (filtersOpen ? 'filters-open' : 'filters-closed') : 'no-filters',\n viewMode === 'grouped' ? 'grouped-mode' : 'collection-mode',\n ]\n .filter(Boolean)\n .join(' ');\n\n // Deselect any selected card when switching between view modes\n useEffect(() => {\n setSelectedItem(null);\n }, [viewMode]);\n\n // Map provided color overrides to CSS variables understood by the component.\n const cssVariables = useMemo(() => {\n const vars: Record<string, string> = {};\n if (!colors) return vars;\n if (colors.primaryColor) vars['--primary-color'] = colors.primaryColor;\n if (colors.primaryColorText) vars['--primary-color-text'] = colors.primaryColorText;\n if (colors.primary500) vars['--primary-500'] = colors.primary500;\n if (colors.surfaceGround) vars['--surface-ground'] = colors.surfaceGround;\n if (colors.surfaceCard) vars['--surface-card'] = colors.surfaceCard;\n if (colors.surfaceSection) vars['--surface-section'] = colors.surfaceSection;\n if (colors.surfaceOverlay) vars['--surface-overlay'] = colors.surfaceOverlay;\n if (colors.surfaceBorder) vars['--surface-border'] = colors.surfaceBorder;\n if (colors.textColor) vars['--text-color'] = colors.textColor;\n if (colors.textColorSecondary) vars['--text-color-secondary'] = colors.textColorSecondary;\n if (colors.highlightBg) vars['--highlight-bg'] = colors.highlightBg;\n if (colors.maskbg) vars['--maskbg'] = colors.maskbg;\n if (colors.focusRing) vars['--focus-ring'] = colors.focusRing;\n return vars;\n }, [colors]);\n\n return (\n <div className={viewerClassName} style={cssVariables as React.CSSProperties}>\n <FilterPanelContainer\n isOpen={filtersOpen && hasFilters}\n search={search}\n filterState={filterState}\n rangeFilterState={rangeFilterState}\n expandedFilterKey={expandedFilterKey}\n filterOptions={filterOptions}\n anchorRef={filterButtonRef}\n onClose={() => setFiltersOpen(false)}\n onSearchChange={setSearch}\n onFilterToggle={handleToggleFilter}\n onFilterClear={handleClearFilter}\n onRangeChange={handleRangeChange}\n onExpandedFilterChange={setExpandedFilterKey}\n />\n\n <main className=\"pv-main\">\n <ToolbarContainer\n hasFilters={hasFilters}\n filtersOpen={filtersOpen}\n filteredCount={visibleIds.length}\n viewMode={viewMode}\n zoomLevel={zoomLevel}\n activeDimensionKey={activeDimensionKey}\n dimensions={dimensions}\n activeFilterCount={activeFilterCount}\n onFiltersToggle={() => setFiltersOpen((prev) => !prev)}\n onViewModeChange={setViewMode}\n onZoomIn={handleZoomIn}\n onZoomOut={handleZoomOut}\n onZoomSlider={handleZoomSlider}\n onZoomReset={handleZoomReset}\n onZoomChange={handleZoomChange}\n onDimensionChange={setActiveDimensionKey}\n filterButtonRef={filterButtonRef}\n />\n\n <PivotViewerMain\n data={data}\n ready={ready}\n isLoading={isLoading}\n visibleIds={visibleIds}\n grouping={grouping}\n layout={layout}\n cardWidth={cardWidth}\n cardHeight={cardHeight}\n zoomLevel={zoomLevel}\n scrollPosition={scrollPosition}\n containerDimensions={containerDimensions}\n selectedItem={selectedItem}\n hoveredGroupIndex={hoveredGroupIndex}\n isZooming={isZooming}\n viewMode={viewMode}\n cardRenderer={cardRenderer}\n detailRenderer={detailRenderer}\n resolveId={resolveId}\n emptyContent={emptyContent}\n dimensionFilter={dimensionFilter}\n onCardClick={handleCardClick}\n onPanStart={handlePanStart as (e: React.MouseEvent) => void}\n onPanMove={handlePanMove as (e: React.MouseEvent) => void}\n onPanEnd={handlePanEnd}\n onGroupHover={setHoveredGroupIndex}\n onAxisLabelClick={handleAxisLabelClick}\n onCloseDetail={closeDetail}\n containerRef={containerRef}\n axisLabelsRef={axisLabelsRef}\n spacerRef={spacerRef}\n />\n </main>\n </div>\n );\n}\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"PivotViewer.js","sources":["../../../PivotViewer/PivotViewer.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { PivotViewerProps } from './types';\nimport type { GroupingResult } from './engine/types';\nimport { usePivotEngine } from './hooks/usePivotEngine';\nimport { computeLayout } from './engine/layout';\nimport { useFilterState } from './hooks/useFilterState';\nimport { useDimensionState } from './hooks/useDimensionState';\nimport { useZoomState } from './hooks/useZoomState';\nimport { BASE_CARD_WIDTH, BASE_CARD_HEIGHT, CARDS_PER_COLUMN, GROUP_SPACING } from './constants';\nimport './PivotViewer.css';\nimport { PivotViewerMain } from './components/PivotViewerMain';\nimport { FilterPanelContainer } from './components/FilterPanelContainer';\nimport { ToolbarContainer } from './components/ToolbarContainer';\nimport { usePanning, useWheelZoom, useFilterOptions } from './hooks';\nimport { useContainerDimensions } from './hooks/useContainerDimensions';\nimport type { ViewMode } from './components/Toolbar';\nimport { useFieldExtractors } from './hooks/useFieldExtractors';\nimport { useCurrentFilters, useCurrentGroupBy } from './hooks/useCurrentFilters';\nimport { useCardSelection } from './hooks/useCardSelection';\nimport { useDetailPanelClose } from './hooks/useDetailPanelClose';\nimport { useScrollSync } from './hooks/useScrollSync';\nimport { useAnimationModeTracking } from './hooks/useAnimationModeTracking';\nimport { useViewModeScrollHandling } from './hooks/useViewModeScrollHandling';\n\nexport function PivotViewer<TItem extends object>({\n data,\n dimensions,\n filters,\n defaultDimensionKey,\n cardRenderer,\n detailRenderer,\n getItemId,\n searchFields,\n className,\n emptyContent,\n isLoading = false,\n colors,\n}: PivotViewerProps<TItem>) {\n // Refs\n const containerRef = useRef<HTMLDivElement>(null!);\n const filterButtonRef = useRef<HTMLButtonElement>(null!);\n const axisLabelsRef = useRef<HTMLDivElement>(null!);\n const spacerRef = useRef<HTMLDivElement>(null!);\n\n // State\n const [search, setSearch] = useState('');\n const [viewMode, setViewMode] = useState<ViewMode>('collection');\n const [filtersOpen, setFiltersOpen] = useState(false);\n const [selectedItem, setSelectedItem] = useState<TItem | null>(null);\n const [isZooming, setIsZooming] = useState(false);\n const [visibleIds, setVisibleIds] = useState<Uint32Array>(new Uint32Array(0));\n const [grouping, setGrouping] = useState<GroupingResult>({ groups: [] });\n const [hoveredGroupIndex, setHoveredGroupIndex] = useState<number | null>(null);\n const [preSelectionState, setPreSelectionState] = useState<{ zoom: number; scrollLeft: number; scrollTop: number } | null>(null);\n const [, setAnimationMode] = useState<'layout' | 'filter'>('layout');\n const [scrollPosition, setScrollPosition] = useState({ x: 0, y: 0 });\n\n // Filter hooks\n const {\n filterState,\n rangeFilterState,\n expandedFilterKey,\n setExpandedFilterKey,\n handleToggleFilter,\n handleClearFilter,\n handleRangeChange,\n } = useFilterState(filters);\n\n // Dimension hooks\n const {\n activeDimensionKey,\n setActiveDimensionKey,\n activeDimension,\n dimensionFilter,\n handleAxisLabelClick,\n } = useDimensionState(dimensions, defaultDimensionKey);\n\n // Zoom and pan hooks\n const {\n zoomLevel,\n setZoomLevel,\n handleZoomIn,\n handleZoomOut,\n handleZoomSlider,\n handleZoomReset,\n handleZoomChange,\n } = useZoomState(1);\n\n const {\n isPanning,\n handlePanStart,\n handlePanMove,\n handlePanEnd,\n } = usePanning(containerRef, undefined, setScrollPosition);\n\n useWheelZoom(containerRef, zoomLevel, setZoomLevel);\n\n // Track container dimensions for responsive layout\n const containerDimensions = useContainerDimensions(containerRef, isLoading);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const handleScroll = () => {\n setScrollPosition({\n x: container.scrollLeft,\n y: container.scrollTop,\n });\n };\n\n container.addEventListener('scroll', handleScroll);\n return () => container.removeEventListener('scroll', handleScroll);\n }, []);\n\n // Build field extractors for the columnar store\n const { fieldExtractors, indexFields } = useFieldExtractors(dimensions, filters);\n\n // Initialize the Web Worker engine\n const { ready, applyFilters: engineApplyFilters, computeGrouping, sortIds } = usePivotEngine({\n data,\n fieldExtractors,\n indexFields,\n });\n\n // Build filter specs from UI state\n const currentFilters = useCurrentFilters(\n filters,\n filterState,\n rangeFilterState,\n search,\n searchFields,\n dimensionFilter,\n activeDimension,\n );\n\n const currentGroupBy = useCurrentGroupBy(activeDimensionKey, dimensions);\n\n // Apply filters\n useEffect(() => {\n if (!ready) return;\n\n engineApplyFilters(currentFilters).then((result) => {\n // If the engine failed to return any IDs while no filters are active,\n // fall back to showing the full dataset so the canvas never renders empty.\n if (result.visibleIds.length === 0 && currentFilters.length === 0 && data.length > 0) {\n const fallbackIds = new Uint32Array(data.length);\n for (let i = 0; i < data.length; i++) {\n fallbackIds[i] = i;\n }\n setVisibleIds(fallbackIds);\n return;\n }\n\n setVisibleIds(result.visibleIds);\n });\n }, [ready, currentFilters, engineApplyFilters, data.length]);\n\n // Compute grouping\n const lastGroupingRequest = useRef<{ viewMode: ViewMode; groupBy: unknown; visibleIds: Uint32Array } | null>(null);\n \n useEffect(() => {\n if (!ready || visibleIds.length === 0) {\n setGrouping({ groups: [] });\n lastGroupingRequest.current = null;\n return;\n }\n\n if (viewMode === 'collection') {\n // In collection mode, create a single group with all items\n // Sort items if activeDimensionKey is set\n if (activeDimensionKey) {\n sortIds(visibleIds, activeDimensionKey).then((sortedIds) => {\n setGrouping({\n groups: [{\n key: 'all',\n label: 'All Items',\n value: 'all',\n ids: sortedIds,\n count: sortedIds.length\n }]\n });\n });\n } else {\n setGrouping({\n groups: [{\n key: 'all',\n label: 'All Items',\n value: 'all',\n ids: visibleIds,\n count: visibleIds.length\n }]\n });\n }\n lastGroupingRequest.current = null;\n return;\n }\n\n // Check if this is the same request as last time to prevent duplicate computations\n const lastRequest = lastGroupingRequest.current;\n if (\n lastRequest &&\n lastRequest.viewMode === viewMode &&\n (lastRequest.groupBy as unknown as typeof currentGroupBy)?.field === currentGroupBy.field &&\n lastRequest.visibleIds === visibleIds\n ) {\n return;\n }\n\n lastGroupingRequest.current = { viewMode, groupBy: currentGroupBy, visibleIds };\n \n computeGrouping(visibleIds, currentGroupBy).then((result) => {\n setGrouping(result);\n });\n }, [ready, visibleIds, currentGroupBy, viewMode, computeGrouping, sortIds, activeDimensionKey]);\n\n // Compute layout\n const layout = useMemo(() => {\n // Calculate layout at base dimensions (zoom is applied as transform)\n const cardWidth = BASE_CARD_WIDTH;\n const cardHeight = BASE_CARD_HEIGHT;\n const containerWidth = containerDimensions.width / zoomLevel;\n // For grouped mode, use fixed container height to ensure stable layout during zoom\n const containerHeight = viewMode === 'collection'\n ? containerDimensions.height / zoomLevel\n : containerDimensions.height;\n\n const result = computeLayout(grouping, {\n viewMode,\n cardWidth,\n cardHeight,\n cardsPerColumn: CARDS_PER_COLUMN,\n groupSpacing: GROUP_SPACING,\n containerWidth,\n containerHeight,\n });\n\n return result;\n }, [grouping, viewMode, zoomLevel, containerDimensions.width, containerDimensions.height]);\n\n const resolveId = useCallback((item: TItem, index: number) => {\n if (getItemId) {\n const id = getItemId(item, index);\n return typeof id === 'number' ? id : index;\n }\n const id = (item as Record<string, unknown>)['id'];\n return typeof id === 'number' ? id : index;\n }, [getItemId]);\n\n // Track animation mode changes\n useAnimationModeTracking(filterState, rangeFilterState, search, activeDimensionKey, viewMode, setAnimationMode);\n\n // Sync axis labels scroll with container scroll\n useScrollSync(containerRef, axisLabelsRef, viewMode);\n\n // Handle scroll positioning when switching view modes or grouping changes\n useViewModeScrollHandling({\n containerRef,\n viewMode,\n grouping,\n layout,\n selectedItem,\n zoomLevel,\n resolveId,\n data,\n setPreSelectionState,\n });\n\n // Handle card selection (click)\n const handleCardClick = useCardSelection({\n data,\n isPanning,\n selectedItem,\n zoomLevel,\n viewMode,\n layout,\n containerRef,\n spacerRef,\n containerDimensions,\n scrollPosition,\n preSelectionState,\n grouping,\n getItemId,\n resolveId,\n setZoomLevel,\n setIsZooming,\n setSelectedItem,\n setPreSelectionState,\n });\n\n // Handle detail panel close\n const closeDetail = useDetailPanelClose({\n selectedItem,\n preSelectionState,\n zoomLevel,\n viewMode,\n layout,\n containerRef,\n containerDimensions,\n grouping,\n data,\n resolveId,\n setZoomLevel,\n setIsZooming,\n setSelectedItem,\n setPreSelectionState,\n });\n\n // Use base card dimensions - zoom is applied as transform in canvas\n const cardWidth = BASE_CARD_WIDTH;\n const cardHeight = BASE_CARD_HEIGHT;\n\n // Calculate filter options\n const filterOptions = useFilterOptions(data, filters, filterState, rangeFilterState);\n\n const hasFilters = Boolean(filters && filters.length > 0);\n const activeFilterCount = Object.values(filterState).reduce((sum: number, vals) => sum + (vals as Set<string>).size, 0) +\n Object.values(rangeFilterState).filter(r => r !== null).length;\n\n const viewerClassName = [\n 'pivot-viewer',\n className,\n hasFilters ? (filtersOpen ? 'filters-open' : 'filters-closed') : 'no-filters',\n viewMode === 'grouped' ? 'grouped-mode' : 'collection-mode',\n ]\n .filter(Boolean)\n .join(' ');\n\n // Deselect any selected card when switching between view modes\n useEffect(() => {\n setSelectedItem(null);\n }, [viewMode]);\n\n // Map provided color overrides to CSS variables understood by the component.\n const cssVariables = useMemo(() => {\n const vars: Record<string, string> = {};\n if (!colors) return vars;\n if (colors.primaryColor) vars['--primary-color'] = colors.primaryColor;\n if (colors.primaryColorText) vars['--primary-color-text'] = colors.primaryColorText;\n if (colors.primary500) vars['--primary-500'] = colors.primary500;\n if (colors.surfaceGround) vars['--surface-ground'] = colors.surfaceGround;\n if (colors.surfaceCard) vars['--surface-card'] = colors.surfaceCard;\n if (colors.surfaceSection) vars['--surface-section'] = colors.surfaceSection;\n if (colors.surfaceOverlay) vars['--surface-overlay'] = colors.surfaceOverlay;\n if (colors.surfaceBorder) vars['--surface-border'] = colors.surfaceBorder;\n if (colors.textColor) vars['--text-color'] = colors.textColor;\n if (colors.textColorSecondary) vars['--text-color-secondary'] = colors.textColorSecondary;\n if (colors.highlightBg) vars['--highlight-bg'] = colors.highlightBg;\n if (colors.maskbg) vars['--maskbg'] = colors.maskbg;\n if (colors.focusRing) vars['--focus-ring'] = colors.focusRing;\n return vars;\n }, [colors]);\n\n return (\n <div className={viewerClassName} style={cssVariables as React.CSSProperties}>\n <FilterPanelContainer\n isOpen={filtersOpen && hasFilters}\n search={search}\n filterState={filterState}\n rangeFilterState={rangeFilterState}\n expandedFilterKey={expandedFilterKey}\n filterOptions={filterOptions}\n anchorRef={filterButtonRef}\n onClose={() => setFiltersOpen(false)}\n onSearchChange={setSearch}\n onFilterToggle={handleToggleFilter}\n onFilterClear={handleClearFilter}\n onRangeChange={handleRangeChange}\n onExpandedFilterChange={setExpandedFilterKey}\n />\n\n <main className=\"pv-main\">\n <ToolbarContainer\n hasFilters={hasFilters}\n filtersOpen={filtersOpen}\n filteredCount={visibleIds.length}\n viewMode={viewMode}\n zoomLevel={zoomLevel}\n activeDimensionKey={activeDimensionKey}\n dimensions={dimensions}\n activeFilterCount={activeFilterCount}\n onFiltersToggle={() => setFiltersOpen((prev) => !prev)}\n onViewModeChange={setViewMode}\n onZoomIn={handleZoomIn}\n onZoomOut={handleZoomOut}\n onZoomSlider={handleZoomSlider}\n onZoomReset={handleZoomReset}\n onZoomChange={handleZoomChange}\n onDimensionChange={setActiveDimensionKey}\n filterButtonRef={filterButtonRef}\n />\n\n <PivotViewerMain\n data={data}\n ready={ready}\n isLoading={isLoading}\n visibleIds={visibleIds}\n grouping={grouping}\n layout={layout}\n cardWidth={cardWidth}\n cardHeight={cardHeight}\n zoomLevel={zoomLevel}\n scrollPosition={scrollPosition}\n containerDimensions={containerDimensions}\n selectedItem={selectedItem}\n hoveredGroupIndex={hoveredGroupIndex}\n isZooming={isZooming}\n viewMode={viewMode}\n cardRenderer={cardRenderer}\n detailRenderer={detailRenderer}\n resolveId={resolveId}\n emptyContent={emptyContent}\n dimensionFilter={dimensionFilter}\n onCardClick={handleCardClick}\n onPanStart={handlePanStart as (e: React.MouseEvent) => void}\n onPanMove={handlePanMove as (e: React.MouseEvent) => void}\n onPanEnd={handlePanEnd}\n onGroupHover={setHoveredGroupIndex}\n onAxisLabelClick={handleAxisLabelClick}\n onCloseDetail={closeDetail}\n containerRef={containerRef}\n axisLabelsRef={axisLabelsRef}\n spacerRef={spacerRef}\n />\n </main>\n </div>\n );\n}\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
@@ -4,4 +4,5 @@ declare const meta: Meta<typeof PivotViewer>;
4
4
  export default meta;
5
5
  type Story = StoryObj<typeof PivotViewer>;
6
6
  export declare const Default: Story;
7
+ export declare const LargeDataset: Story;
7
8
  //# sourceMappingURL=PivotViewer.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PivotViewer.stories.d.ts","sourceRoot":"","sources":["../../../PivotViewer/PivotViewer.stories.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAGlC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC;AA6B1C,eAAO,MAAM,OAAO,EAAE,KAgFrB,CAAC"}
1
+ {"version":3,"file":"PivotViewer.stories.d.ts","sourceRoot":"","sources":["../../../PivotViewer/PivotViewer.stories.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAgH5C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAGlC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC;AA6B1C,eAAO,MAAM,OAAO,EAAE,KAgFrB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KA6I1B,CAAC"}
@@ -1,5 +1,79 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { PivotViewer } from './PivotViewer';
3
+ const FIRST_NAMES = [
4
+ 'Alice', 'Bob', 'Charlie', 'Diana', 'Edward', 'Fiona', 'George', 'Hannah',
5
+ 'Isaac', 'Julia', 'Kevin', 'Laura', 'Michael', 'Natalie', 'Oliver', 'Penelope',
6
+ 'Quinn', 'Rachel', 'Samuel', 'Tara', 'Ursula', 'Victor', 'Wendy', 'Xavier',
7
+ 'Yvonne', 'Zachary', 'Amelia', 'Benjamin', 'Clara', 'Daniel', 'Eleanor', 'Frank',
8
+ 'Grace', 'Henry', 'Iris', 'James', 'Katherine', 'Leo', 'Mia', 'Noah',
9
+ ];
10
+ const LAST_NAMES = [
11
+ 'Johnson', 'Smith', 'Brown', 'Prince', 'Norton', 'Lee', 'Miller', 'Davis',
12
+ 'Newton', 'Taylor', 'Anderson', 'Wilson', 'Moore', 'Jackson', 'Martin', 'White',
13
+ 'Thompson', 'Garcia', 'Martinez', 'Robinson', 'Clark', 'Rodriguez', 'Lewis', 'Walker',
14
+ 'Hall', 'Allen', 'Young', 'King', 'Wright', 'Scott', 'Green', 'Baker',
15
+ 'Adams', 'Nelson', 'Carter', 'Mitchell', 'Perez', 'Roberts', 'Turner', 'Phillips',
16
+ ];
17
+ const DEPARTMENTS = [
18
+ 'Engineering', 'Product', 'Design', 'Marketing', 'Sales',
19
+ 'Finance', 'Human Resources', 'Legal', 'Operations', 'Support',
20
+ 'Research', 'Data Science', 'Security', 'Infrastructure', 'Customer Success',
21
+ ];
22
+ const OFFICES = [
23
+ 'Seattle', 'San Francisco', 'Austin', 'New York', 'Boston',
24
+ 'Chicago', 'Denver', 'Los Angeles', 'Atlanta', 'London',
25
+ 'Berlin', 'Amsterdam', 'Singapore', 'Tokyo', 'Sydney',
26
+ ];
27
+ const SENIORITY_LEVELS = ['Intern', 'Junior', 'Mid-level', 'Senior', 'Staff', 'Principal', 'Director', 'VP'];
28
+ const EMPLOYMENT_STATUSES = ['Active', 'On Leave', 'Contractor', 'Part-time'];
29
+ const SKILL_TAGS = [
30
+ 'TypeScript', 'Python', 'Go', 'Rust', 'Java', 'C#', 'React', 'Node.js',
31
+ 'Kubernetes', 'AWS', 'Azure', 'GCP', 'ML/AI', 'Data Engineering', 'Security',
32
+ 'Product Management', 'UX Design', 'DevOps', 'Agile', 'Communication',
33
+ ];
34
+ function seededRng(seed) {
35
+ let s = seed;
36
+ return () => {
37
+ s = (s * 1664525 + 1013904223) & 0xffffffff;
38
+ return (s >>> 0) / 0xffffffff;
39
+ };
40
+ }
41
+ function pick(rng, arr) {
42
+ return arr[Math.floor(rng() * arr.length)];
43
+ }
44
+ function generateEmployees(count) {
45
+ const rng = seededRng(42);
46
+ const employees = [];
47
+ for (let i = 0; i < count; i++) {
48
+ const firstName = pick(rng, FIRST_NAMES);
49
+ const lastName = pick(rng, LAST_NAMES);
50
+ const seniority = pick(rng, SENIORITY_LEVELS);
51
+ const seniorityIndex = SENIORITY_LEVELS.indexOf(seniority);
52
+ const age = 22 + Math.floor(rng() * 40);
53
+ const yearsAtCompany = Math.floor(rng() * Math.min(age - 20, 20));
54
+ const baseSalary = 60_000 + seniorityIndex * 25_000 + Math.floor(rng() * 30_000);
55
+ const numSkills = 1 + Math.floor(rng() * 4);
56
+ const shuffled = [...SKILL_TAGS].sort(() => rng() - 0.5);
57
+ const skills = shuffled.slice(0, numSkills);
58
+ employees.push({
59
+ id: i + 1,
60
+ name: `${firstName} ${lastName}`,
61
+ firstName,
62
+ lastName,
63
+ age,
64
+ department: pick(rng, DEPARTMENTS),
65
+ office: pick(rng, OFFICES),
66
+ seniority,
67
+ status: pick(rng, EMPLOYMENT_STATUSES),
68
+ salary: baseSalary,
69
+ yearsAtCompany,
70
+ skills,
71
+ primarySkill: skills[0],
72
+ });
73
+ }
74
+ return employees;
75
+ }
76
+ const largeDataset = generateEmployees(2_500);
3
77
  const meta = {
4
78
  title: 'PivotViewer/PivotViewer',
5
79
  component: PivotViewer,
@@ -53,4 +127,107 @@ export const Default = {
53
127
  }, detailRenderer: (item, onClose) => (_jsxs("section", { children: [_jsxs("header", { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', gap: '0.5rem' }, children: [_jsxs("div", { children: [_jsx("h3", { style: { margin: 0 }, children: item.name }), _jsxs("p", { style: { margin: 0, opacity: 0.8 }, children: ["Department \u2022 ", item.department] })] }), _jsx("button", { type: "button", onClick: onClose, title: "Close", className: "p-button p-button-text", children: "Close" })] }), _jsxs("dl", { style: { marginTop: '1rem', display: 'grid', gridTemplateColumns: 'auto 1fr', gap: '0.35rem 0.75rem' }, children: [_jsxs("div", { children: [_jsx("dt", { children: "Age" }), _jsx("dd", { children: item.age })] }), _jsxs("div", { children: [_jsx("dt", { children: "City" }), _jsx("dd", { children: item.address.city })] }), _jsxs("div", { children: [_jsx("dt", { children: "Street" }), _jsx("dd", { children: item.address.street })] })] })] })), getItemId: (item) => item.id }) }));
54
128
  },
55
129
  };
130
+ export const LargeDataset = {
131
+ name: 'Large Dataset (2 500 employees)',
132
+ render: () => {
133
+ const dimensions = [
134
+ {
135
+ key: 'department',
136
+ label: 'Department',
137
+ getValue: (item) => item.department,
138
+ },
139
+ {
140
+ key: 'office',
141
+ label: 'Office',
142
+ getValue: (item) => item.office,
143
+ },
144
+ {
145
+ key: 'seniority',
146
+ label: 'Seniority',
147
+ getValue: (item) => item.seniority,
148
+ },
149
+ {
150
+ key: 'status',
151
+ label: 'Status',
152
+ getValue: (item) => item.status,
153
+ },
154
+ {
155
+ key: 'primarySkill',
156
+ label: 'Primary Skill',
157
+ getValue: (item) => item.primarySkill,
158
+ },
159
+ ];
160
+ const filters = [
161
+ {
162
+ key: 'department',
163
+ label: 'Department',
164
+ getValue: (item) => item.department,
165
+ multi: true,
166
+ },
167
+ {
168
+ key: 'office',
169
+ label: 'Office',
170
+ getValue: (item) => item.office,
171
+ multi: true,
172
+ },
173
+ {
174
+ key: 'seniority',
175
+ label: 'Seniority',
176
+ getValue: (item) => item.seniority,
177
+ multi: true,
178
+ },
179
+ {
180
+ key: 'status',
181
+ label: 'Status',
182
+ getValue: (item) => item.status,
183
+ multi: true,
184
+ },
185
+ {
186
+ key: 'salary',
187
+ label: 'Salary',
188
+ getValue: (item) => item.salary,
189
+ type: 'number',
190
+ buckets: 20,
191
+ },
192
+ {
193
+ key: 'age',
194
+ label: 'Age',
195
+ getValue: (item) => item.age,
196
+ type: 'number',
197
+ },
198
+ {
199
+ key: 'yearsAtCompany',
200
+ label: 'Years at Company',
201
+ getValue: (item) => item.yearsAtCompany,
202
+ type: 'number',
203
+ },
204
+ ];
205
+ return (_jsx("div", { className: "storybook-wrapper", style: {
206
+ height: 'calc(100vh - 2rem)',
207
+ minHeight: 0,
208
+ display: 'flex',
209
+ flexDirection: 'column',
210
+ overflow: 'hidden',
211
+ alignItems: 'stretch',
212
+ }, children: _jsx(PivotViewer, { data: largeDataset, dimensions: dimensions, filters: filters, defaultDimensionKey: "department", searchFields: [
213
+ (item) => item.name,
214
+ (item) => item.department,
215
+ (item) => item.office,
216
+ (item) => item.seniority,
217
+ (item) => item.primarySkill,
218
+ ], cardRenderer: (item) => ({
219
+ title: item.name,
220
+ labels: ['Dept', 'Office', 'Seniority', 'Salary'],
221
+ values: [
222
+ item.department,
223
+ item.office,
224
+ item.seniority,
225
+ `$${item.salary.toLocaleString()}`,
226
+ ],
227
+ }), detailRenderer: (item, onClose) => (_jsxs("section", { children: [_jsxs("header", { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start', gap: '0.5rem' }, children: [_jsxs("div", { children: [_jsx("h3", { style: { margin: 0 }, children: item.name }), _jsxs("p", { style: { margin: 0, opacity: 0.7 }, children: [item.seniority, " \u00B7 ", item.department] })] }), _jsx("button", { type: "button", onClick: onClose, title: "Close", className: "p-button p-button-text", children: "Close" })] }), _jsxs("dl", { style: { marginTop: '1rem', display: 'grid', gridTemplateColumns: 'auto 1fr', gap: '0.35rem 0.75rem' }, children: [_jsx("dt", { children: "Office" }), _jsx("dd", { children: item.office }), _jsx("dt", { children: "Age" }), _jsx("dd", { children: item.age }), _jsx("dt", { children: "Status" }), _jsx("dd", { children: item.status }), _jsx("dt", { children: "Salary" }), _jsxs("dd", { children: ["$", item.salary.toLocaleString()] }), _jsx("dt", { children: "Tenure" }), _jsxs("dd", { children: [item.yearsAtCompany, " yr", item.yearsAtCompany !== 1 ? 's' : ''] }), _jsx("dt", { children: "Skills" }), _jsx("dd", { children: item.skills.join(', ') })] })] })), getItemId: (item) => item.id, colors: {
228
+ primaryColor: '#91BDF8',
229
+ primary500: '#2E66BA',
230
+ } }) }));
231
+ },
232
+ };
56
233
  //# sourceMappingURL=PivotViewer.stories.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PivotViewer.stories.js","sourceRoot":"","sources":["../../../PivotViewer/PivotViewer.stories.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PivotViewer.stories.js","sourceRoot":"","sources":["../../../PivotViewer/PivotViewer.stories.tsx"],"names":[],"mappings":"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"}
@@ -49,7 +49,7 @@ function computeGroupedLayout(grouping, spec, positions) {
49
49
  const effectiveGroupSpacing = 0;
50
50
  const slotWidth = cardWidth + CARD_GAP;
51
51
  const slotHeight = cardHeight + CARD_GAP;
52
- const BOTTOM_MARGIN = CANVAS_PADDING;
52
+ const BOTTOM_MARGIN = CANVAS_PADDING - CARD_GAP / 2;
53
53
  const COLUMNS_PER_BUCKET = 2;
54
54
  const bucketWidth = COLUMNS_PER_BUCKET * slotWidth;
55
55
  let groupX = 0;
@@ -88,7 +88,7 @@ function computeGroupedLayout(grouping, spec, positions) {
88
88
  return {
89
89
  positions,
90
90
  totalWidth: groupX + CANVAS_PADDING,
91
- totalHeight: contentHeight + (CANVAS_PADDING * 2),
91
+ totalHeight: contentHeight,
92
92
  bucketWidths,
93
93
  groupXs,
94
94
  };
@@ -1 +1 @@
1
- {"version":3,"file":"layout.js","sources":["../../../../PivotViewer/engine/layout.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type {\n LayoutSpec,\n LayoutResult,\n ItemPosition,\n GroupingResult,\n ItemId,\n} from './types';\nimport { CARD_GAP, CANVAS_PADDING } from '../constants';\n\nexport function computeLayout(\n grouping: GroupingResult,\n spec: LayoutSpec\n): LayoutResult {\n const positions = new Map<ItemId, ItemPosition>();\n\n if (spec.viewMode === 'collection') {\n return computeCollectionLayout(grouping, spec, positions);\n } else {\n return computeGroupedLayout(grouping, spec, positions);\n }\n}\n\nfunction computeCollectionLayout(\n grouping: GroupingResult,\n spec: LayoutSpec,\n positions: Map<ItemId, ItemPosition>\n): LayoutResult {\n const { cardWidth, cardHeight, containerWidth } = spec;\n const slotWidth = cardWidth + CARD_GAP;\n const slotHeight = cardHeight + CARD_GAP;\n\n // Calculate how many cards fit per row based on container width (include gap)\n const cardsPerRow = Math.max(1, Math.floor((containerWidth + CARD_GAP - (CANVAS_PADDING * 2)) / slotWidth));\n\n let x = CANVAS_PADDING;\n let y = CANVAS_PADDING;\n let column = 0;\n let itemCount = 0;\n\n for (const group of grouping.groups) {\n for (let i = 0; i < group.ids.length; i++) {\n const id = group.ids[i];\n\n positions.set(id, {\n x,\n y,\n groupIndex: 0,\n });\n\n // Move to next position horizontally (left to right)\n column++;\n x += slotWidth;\n\n // Wrap to next row when we've filled the width\n if (column >= cardsPerRow) {\n column = 0;\n x = CANVAS_PADDING;\n y += slotHeight;\n }\n\n itemCount++;\n }\n }\n\n const rows = Math.ceil(itemCount / cardsPerRow);\n const contentWidth = Math.min(itemCount, cardsPerRow) * slotWidth;\n\n return {\n positions,\n totalWidth: Math.max(containerWidth, contentWidth + (CANVAS_PADDING * 2)),\n totalHeight: (rows * slotHeight) + (CANVAS_PADDING * 2),\n };\n}\n\nfunction computeGroupedLayout(\n grouping: GroupingResult,\n spec: LayoutSpec,\n positions: Map<ItemId, ItemPosition>\n): LayoutResult {\n const { cardWidth, cardHeight, cardsPerColumn } = spec;\n // Override group spacing to ensure consistent card spacing across groups\n // We want visual gap between groups to match gap between cards (CARD_GAP)\n const effectiveGroupSpacing = 0;\n\n const slotWidth = cardWidth + CARD_GAP;\n const slotHeight = cardHeight + CARD_GAP;\n // Bottom margin matches the canvas padding for visual consistency\n const BOTTOM_MARGIN = CANVAS_PADDING;\n\n // Fixed bucket width: 2 columns of cards per bucket (always)\n const COLUMNS_PER_BUCKET = 2;\n const bucketWidth = COLUMNS_PER_BUCKET * slotWidth;\n\n let groupX = 0;\n // Use container height for layout, or fallback to cardsPerColumn height\n const layoutHeight = spec.containerHeight || (cardsPerColumn * slotHeight);\n const bucketWidths: number[] = [];\n const groupXs: number[] = [];\n let maxRows = 0;\n\n // First pass: calculate max rows to determine total height\n for (const group of grouping.groups) {\n const itemsInGroup = group.ids.length;\n const rowsInGroup = Math.ceil(itemsInGroup / COLUMNS_PER_BUCKET);\n maxRows = Math.max(maxRows, rowsInGroup);\n }\n\n // Calculate actual content height needed (ensure it's at least as tall as the container)\n // We need to fit the tallest column plus the bottom margin\n const contentHeight = Math.max(layoutHeight, (maxRows * slotHeight) + BOTTOM_MARGIN);\n\n for (let groupIndex = 0; groupIndex < grouping.groups.length; groupIndex++) {\n const group = grouping.groups[groupIndex];\n groupXs.push(groupX);\n\n const itemsInGroup = group.ids.length;\n\n for (let i = 0; i < itemsInGroup; i++) {\n const id = group.ids[i];\n\n // Cards fill from left to right, bottom to top\n // For a 2-column bucket: i=0,1 in row 0; i=2,3 in row 1; etc.\n const col = i % COLUMNS_PER_BUCKET;\n const row = Math.floor(i / COLUMNS_PER_BUCKET);\n\n // Center the cards within the bucket\n // The bucket width fits 2 slots (2W + 2G). Cards take 2W + G.\n // So we have G/2 padding on each side to center them.\n const x = groupX + (col * slotWidth) + (CARD_GAP / 2);\n\n // Position cards from bottom of container, stacking upwards, starting at row 0 (bottom)\n const y = CANVAS_PADDING + contentHeight - BOTTOM_MARGIN - ((row + 1) * slotHeight);\n\n positions.set(id, {\n x,\n y,\n groupIndex,\n });\n }\n\n // Always use fixed bucket width\n bucketWidths.push(bucketWidth);\n\n // Advance position by fixed bucket width + spacing\n groupX += bucketWidth;\n if (groupIndex < grouping.groups.length - 1) {\n groupX += effectiveGroupSpacing;\n }\n }\n\n return {\n positions,\n totalWidth: groupX + CANVAS_PADDING,\n totalHeight: contentHeight + (CANVAS_PADDING * 2),\n bucketWidths,\n groupXs,\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"layout.js","sources":["../../../../PivotViewer/engine/layout.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type {\n LayoutSpec,\n LayoutResult,\n ItemPosition,\n GroupingResult,\n ItemId,\n} from './types';\nimport { CARD_GAP, CANVAS_PADDING } from '../constants';\n\nexport function computeLayout(\n grouping: GroupingResult,\n spec: LayoutSpec\n): LayoutResult {\n const positions = new Map<ItemId, ItemPosition>();\n\n if (spec.viewMode === 'collection') {\n return computeCollectionLayout(grouping, spec, positions);\n } else {\n return computeGroupedLayout(grouping, spec, positions);\n }\n}\n\nfunction computeCollectionLayout(\n grouping: GroupingResult,\n spec: LayoutSpec,\n positions: Map<ItemId, ItemPosition>\n): LayoutResult {\n const { cardWidth, cardHeight, containerWidth } = spec;\n const slotWidth = cardWidth + CARD_GAP;\n const slotHeight = cardHeight + CARD_GAP;\n\n // Calculate how many cards fit per row based on container width (include gap)\n const cardsPerRow = Math.max(1, Math.floor((containerWidth + CARD_GAP - (CANVAS_PADDING * 2)) / slotWidth));\n\n let x = CANVAS_PADDING;\n let y = CANVAS_PADDING;\n let column = 0;\n let itemCount = 0;\n\n for (const group of grouping.groups) {\n for (let i = 0; i < group.ids.length; i++) {\n const id = group.ids[i];\n\n positions.set(id, {\n x,\n y,\n groupIndex: 0,\n });\n\n // Move to next position horizontally (left to right)\n column++;\n x += slotWidth;\n\n // Wrap to next row when we've filled the width\n if (column >= cardsPerRow) {\n column = 0;\n x = CANVAS_PADDING;\n y += slotHeight;\n }\n\n itemCount++;\n }\n }\n\n const rows = Math.ceil(itemCount / cardsPerRow);\n const contentWidth = Math.min(itemCount, cardsPerRow) * slotWidth;\n\n return {\n positions,\n totalWidth: Math.max(containerWidth, contentWidth + (CANVAS_PADDING * 2)),\n totalHeight: (rows * slotHeight) + (CANVAS_PADDING * 2),\n };\n}\n\nfunction computeGroupedLayout(\n grouping: GroupingResult,\n spec: LayoutSpec,\n positions: Map<ItemId, ItemPosition>\n): LayoutResult {\n const { cardWidth, cardHeight, cardsPerColumn } = spec;\n // Override group spacing to ensure consistent card spacing across groups\n // We want visual gap between groups to match gap between cards (CARD_GAP)\n const effectiveGroupSpacing = 0;\n\n const slotWidth = cardWidth + CARD_GAP;\n const slotHeight = cardHeight + CARD_GAP;\n // Bottom gap = BOTTOM_MARGIN + CARD_GAP - CANVAS_PADDING.\n // To match the left/right edge padding within each bucket (CARD_GAP / 2 = 5px):\n // BOTTOM_MARGIN = CANVAS_PADDING - CARD_GAP + (CARD_GAP / 2) = CANVAS_PADDING - CARD_GAP / 2\n const BOTTOM_MARGIN = CANVAS_PADDING - CARD_GAP / 2;\n\n // Fixed bucket width: 2 columns of cards per bucket (always)\n const COLUMNS_PER_BUCKET = 2;\n const bucketWidth = COLUMNS_PER_BUCKET * slotWidth;\n\n let groupX = 0;\n // Use container height for layout, or fallback to cardsPerColumn height\n const layoutHeight = spec.containerHeight || (cardsPerColumn * slotHeight);\n const bucketWidths: number[] = [];\n const groupXs: number[] = [];\n let maxRows = 0;\n\n // First pass: calculate max rows to determine total height\n for (const group of grouping.groups) {\n const itemsInGroup = group.ids.length;\n const rowsInGroup = Math.ceil(itemsInGroup / COLUMNS_PER_BUCKET);\n maxRows = Math.max(maxRows, rowsInGroup);\n }\n\n // Calculate actual content height needed (ensure it's at least as tall as the container)\n // We need to fit the tallest column plus the bottom margin\n const contentHeight = Math.max(layoutHeight, (maxRows * slotHeight) + BOTTOM_MARGIN);\n\n for (let groupIndex = 0; groupIndex < grouping.groups.length; groupIndex++) {\n const group = grouping.groups[groupIndex];\n groupXs.push(groupX);\n\n const itemsInGroup = group.ids.length;\n\n for (let i = 0; i < itemsInGroup; i++) {\n const id = group.ids[i];\n\n // Cards fill from left to right, bottom to top\n // For a 2-column bucket: i=0,1 in row 0; i=2,3 in row 1; etc.\n const col = i % COLUMNS_PER_BUCKET;\n const row = Math.floor(i / COLUMNS_PER_BUCKET);\n\n // Center the cards within the bucket\n // The bucket width fits 2 slots (2W + 2G). Cards take 2W + G.\n // So we have G/2 padding on each side to center them.\n const x = groupX + (col * slotWidth) + (CARD_GAP / 2);\n\n // Position cards from bottom of container, stacking upwards, starting at row 0 (bottom)\n const y = CANVAS_PADDING + contentHeight - BOTTOM_MARGIN - ((row + 1) * slotHeight);\n\n positions.set(id, {\n x,\n y,\n groupIndex,\n });\n }\n\n // Always use fixed bucket width\n bucketWidths.push(bucketWidth);\n\n // Advance position by fixed bucket width + spacing\n groupX += bucketWidth;\n if (groupIndex < grouping.groups.length - 1) {\n groupX += effectiveGroupSpacing;\n }\n }\n\n return {\n positions,\n totalWidth: groupX + CANVAS_PADDING,\n totalHeight: contentHeight,\n bucketWidths,\n groupXs,\n };\n}\n"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type React from 'react';
1
2
  import type { Layout } from '../utils/cardPosition';
2
3
  import type { ViewMode } from '../components/Toolbar';
3
4
  interface UseCardSelectionParams<TItem extends object> {
@@ -7,6 +8,8 @@ interface UseCardSelectionParams<TItem extends object> {
7
8
  zoomLevel: number;
8
9
  viewMode: ViewMode;
9
10
  layout: Layout;
11
+ containerRef: React.RefObject<HTMLDivElement | null>;
12
+ spacerRef: React.RefObject<HTMLDivElement | null>;
10
13
  containerDimensions: {
11
14
  width: number;
12
15
  height: number;
@@ -32,6 +35,6 @@ interface UseCardSelectionParams<TItem extends object> {
32
35
  scrollTop: number;
33
36
  } | null) => void;
34
37
  }
35
- export declare function useCardSelection<TItem extends object>({ data, isPanning, selectedItem, zoomLevel, viewMode, layout, containerDimensions, scrollPosition, preSelectionState, grouping, getItemId, resolveId, setZoomLevel, setIsZooming, setSelectedItem, setPreSelectionState, }: UseCardSelectionParams<TItem>): (item: TItem, e: MouseEvent, id?: number | string) => void;
38
+ export declare function useCardSelection<TItem extends object>({ data, isPanning, selectedItem, zoomLevel, viewMode, layout, containerRef, spacerRef, containerDimensions, scrollPosition, preSelectionState, grouping, getItemId, resolveId, setZoomLevel, setIsZooming, setSelectedItem, setPreSelectionState, }: UseCardSelectionParams<TItem>): (item: TItem, e: MouseEvent, id?: number | string) => void;
36
39
  export {};
37
40
  //# sourceMappingURL=useCardSelection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useCardSelection.d.ts","sourceRoot":"","sources":["../../../../PivotViewer/hooks/useCardSelection.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAStD,UAAU,sBAAsB,CAAC,KAAK,SAAS,MAAM;IACjD,IAAI,EAAE,KAAK,EAAE,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,KAAK,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,cAAc,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,iBAAiB,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAClF,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAAC;IAC5D,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAAC;IAC3D,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,YAAY,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,eAAe,EAAE,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC;IAC9C,oBAAoB,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,KAAK,IAAI,CAAC;CACzG;AAED,wBAAgB,gBAAgB,CAAC,KAAK,SAAS,MAAM,EAAE,EACnD,IAAI,EACJ,SAAS,EACT,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,MAAM,EACN,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,SAAS,EACT,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,oBAAoB,GACvB,EAAE,sBAAsB,CAAC,KAAK,CAAC,UACF,KAAK,KAAK,UAAU,OAAO,MAAM,GAAG,MAAM,UAyEvE"}
1
+ {"version":3,"file":"useCardSelection.d.ts","sourceRoot":"","sources":["../../../../PivotViewer/hooks/useCardSelection.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAStD,UAAU,sBAAsB,CAAC,KAAK,SAAS,MAAM;IACjD,IAAI,EAAE,KAAK,EAAE,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,KAAK,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACrD,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAClD,mBAAmB,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,cAAc,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,iBAAiB,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAClF,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAAC;IAC5D,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAAC;IAC3D,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,YAAY,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,eAAe,EAAE,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC;IAC9C,oBAAoB,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,KAAK,IAAI,CAAC;CACzG;AAED,wBAAgB,gBAAgB,CAAC,KAAK,SAAS,MAAM,EAAE,EACnD,IAAI,EACJ,SAAS,EACT,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,SAAS,EACT,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,SAAS,EACT,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,oBAAoB,GACvB,EAAE,sBAAsB,CAAC,KAAK,CAAC,UACF,KAAK,KAAK,UAAU,OAAO,MAAM,GAAG,MAAM,UAyEvE"}
@@ -4,11 +4,11 @@ import { normalizeIdToLayoutKey, getCardPositionFromLayout } from '../utils/idRe
4
4
  import { createCardPositionCallbacks } from '../utils/cardPosition.js';
5
5
  import { BASE_CARD_HEIGHT, BASE_CARD_WIDTH, ZOOM_MAX, MIN_ZOOM_ON_SELECT, ZOOM_MULTIPLIER } from '../utils/constants.js';
6
6
 
7
- function useCardSelection({ data, isPanning, selectedItem, zoomLevel, viewMode, layout, containerDimensions, scrollPosition, preSelectionState, grouping, getItemId, resolveId, setZoomLevel, setIsZooming, setSelectedItem, setPreSelectionState, }) {
7
+ function useCardSelection({ data, isPanning, selectedItem, zoomLevel, viewMode, layout, containerRef, spacerRef, containerDimensions, scrollPosition, preSelectionState, grouping, getItemId, resolveId, setZoomLevel, setIsZooming, setSelectedItem, setPreSelectionState, }) {
8
8
  return useCallback((item, e, id) => {
9
9
  if (isPanning)
10
10
  return;
11
- const container = e.target?.closest('.pv-main')?.parentElement;
11
+ const container = containerRef.current;
12
12
  if (!container)
13
13
  return;
14
14
  let itemId = (id !== undefined && id !== null) ? id : resolveId(item, 0);
@@ -45,7 +45,7 @@ function useCardSelection({ data, isPanning, selectedItem, zoomLevel, viewMode,
45
45
  targetCardPosition,
46
46
  getCardPositionAtZoom: callbacks.getCardPositionAtZoom,
47
47
  getLayoutSizeAtZoom: callbacks.getLayoutSizeAtZoom,
48
- spacer: container.querySelector('.pv-spacer'),
48
+ spacer: spacerRef.current,
49
49
  preSelectionState,
50
50
  startScrollPosition: { x: scrollPosition.x, y: scrollPosition.y },
51
51
  setZoomLevel,
@@ -56,7 +56,7 @@ function useCardSelection({ data, isPanning, selectedItem, zoomLevel, viewMode,
56
56
  zoomLevel,
57
57
  totalHeight: targetTotalHeight,
58
58
  });
59
- }, [isPanning, selectedItem, zoomLevel, preSelectionState, viewMode, resolveId, setZoomLevel, layout, grouping, containerDimensions, scrollPosition, data, getItemId]);
59
+ }, [isPanning, selectedItem, zoomLevel, preSelectionState, viewMode, resolveId, setZoomLevel, layout, grouping, containerRef, spacerRef, containerDimensions, scrollPosition, data, getItemId]);
60
60
  }
61
61
 
62
62
  export { useCardSelection };
@@ -1 +1 @@
1
- {"version":3,"file":"useCardSelection.js","sources":["../../../../PivotViewer/hooks/useCardSelection.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useCallback } from 'react';\nimport { handleCardSelection } from '../utils/selection';\nimport type { Layout } from '../utils/cardPosition';\nimport type { ViewMode } from '../components/Toolbar';\nimport {\n getCardPositionFromLayout,\n normalizeIdToLayoutKey,\n type CardPosition,\n} from '../utils/idResolution';\nimport { createCardPositionCallbacks } from '../utils/cardPosition';\nimport { ZOOM_MAX, MIN_ZOOM_ON_SELECT, ZOOM_MULTIPLIER, BASE_CARD_WIDTH, BASE_CARD_HEIGHT } from '../utils/constants';\n\ninterface UseCardSelectionParams<TItem extends object> {\n data: TItem[];\n isPanning: boolean;\n selectedItem: TItem | null;\n zoomLevel: number;\n viewMode: ViewMode;\n layout: Layout;\n containerDimensions: { width: number; height: number };\n scrollPosition: { x: number; y: number };\n preSelectionState: { zoom: number; scrollLeft: number; scrollTop: number } | null;\n grouping: unknown;\n getItemId?: (item: TItem, index: number) => string | number;\n resolveId: (item: TItem, index: number) => string | number;\n setZoomLevel: (level: number) => void;\n setIsZooming: (zooming: boolean) => void;\n setSelectedItem: (item: TItem | null) => void;\n setPreSelectionState: (state: { zoom: number; scrollLeft: number; scrollTop: number } | null) => void;\n}\n\nexport function useCardSelection<TItem extends object>({\n data,\n isPanning,\n selectedItem,\n zoomLevel,\n viewMode,\n layout,\n containerDimensions,\n scrollPosition,\n preSelectionState,\n grouping,\n getItemId,\n resolveId,\n setZoomLevel,\n setIsZooming,\n setSelectedItem,\n setPreSelectionState,\n}: UseCardSelectionParams<TItem>) {\n return useCallback((item: TItem, e: MouseEvent, id?: number | string) => {\n if (isPanning) return;\n\n // Get container element from event target\n const container = (e.target as Element)?.closest('.pv-main')?.parentElement as HTMLDivElement | null;\n if (!container) return;\n\n // Resolve item ID\n let itemId = (id !== undefined && id !== null) ? id : resolveId(item, 0);\n itemId = normalizeIdToLayoutKey(itemId, layout);\n\n const selectedId = selectedItem\n ? (() => {\n const index = data.indexOf(selectedItem);\n const rawSelectedId = index !== -1 ? resolveId(selectedItem, index) : resolveId(selectedItem, 0);\n return normalizeIdToLayoutKey(rawSelectedId, layout);\n })()\n : null;\n\n // Get card position from layout\n const cardPosition = getCardPositionFromLayout(itemId, layout, BASE_CARD_WIDTH, BASE_CARD_HEIGHT);\n\n // Calculate target position for animation\n let targetCardPosition: CardPosition | null = null;\n let callbacks = { getCardPositionAtZoom: null as unknown as ((zoom: number) => CardPosition | null), getLayoutSizeAtZoom: null as unknown as ((zoom: number) => { width: number; height: number }) };\n let targetTotalHeight = layout.totalHeight;\n\n if (viewMode === 'grouped' && cardPosition) {\n // Calculate target zoom\n const targetZoom = Math.min(ZOOM_MAX, Math.max(MIN_ZOOM_ON_SELECT, zoomLevel * ZOOM_MULTIPLIER));\n\n const targetContainerWidth = containerDimensions.width / targetZoom;\n const targetContainerHeight = containerDimensions.height;\n\n callbacks = createCardPositionCallbacks(\n itemId,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n grouping as unknown as any,\n viewMode,\n targetContainerWidth,\n targetContainerHeight,\n );\n\n const targetPosition = callbacks.getCardPositionAtZoom(targetZoom);\n if (targetPosition) {\n targetCardPosition = targetPosition;\n }\n\n const targetLayout = callbacks.getLayoutSizeAtZoom(targetZoom);\n targetTotalHeight = targetLayout.height;\n }\n\n handleCardSelection({\n item,\n itemId,\n selectedItemId: selectedId,\n container,\n cardPosition,\n targetCardPosition,\n getCardPositionAtZoom: callbacks.getCardPositionAtZoom,\n getLayoutSizeAtZoom: callbacks.getLayoutSizeAtZoom,\n spacer: container.querySelector('.pv-spacer') as HTMLDivElement,\n preSelectionState,\n startScrollPosition: { x: scrollPosition.x, y: scrollPosition.y },\n setZoomLevel,\n setIsZooming,\n setSelectedItem,\n setPreSelectionState,\n viewMode,\n zoomLevel,\n totalHeight: targetTotalHeight,\n });\n }, [isPanning, selectedItem, zoomLevel, preSelectionState, viewMode, resolveId, setZoomLevel, layout, grouping, containerDimensions, scrollPosition, data, getItemId]);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useCardSelection.js","sources":["../../../../PivotViewer/hooks/useCardSelection.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useCallback } from 'react';\nimport type React from 'react';\nimport { handleCardSelection } from '../utils/selection';\nimport type { Layout } from '../utils/cardPosition';\nimport type { ViewMode } from '../components/Toolbar';\nimport {\n getCardPositionFromLayout,\n normalizeIdToLayoutKey,\n type CardPosition,\n} from '../utils/idResolution';\nimport { createCardPositionCallbacks } from '../utils/cardPosition';\nimport { ZOOM_MAX, MIN_ZOOM_ON_SELECT, ZOOM_MULTIPLIER, BASE_CARD_WIDTH, BASE_CARD_HEIGHT } from '../utils/constants';\n\ninterface UseCardSelectionParams<TItem extends object> {\n data: TItem[];\n isPanning: boolean;\n selectedItem: TItem | null;\n zoomLevel: number;\n viewMode: ViewMode;\n layout: Layout;\n containerRef: React.RefObject<HTMLDivElement | null>;\n spacerRef: React.RefObject<HTMLDivElement | null>;\n containerDimensions: { width: number; height: number };\n scrollPosition: { x: number; y: number };\n preSelectionState: { zoom: number; scrollLeft: number; scrollTop: number } | null;\n grouping: unknown;\n getItemId?: (item: TItem, index: number) => string | number;\n resolveId: (item: TItem, index: number) => string | number;\n setZoomLevel: (level: number) => void;\n setIsZooming: (zooming: boolean) => void;\n setSelectedItem: (item: TItem | null) => void;\n setPreSelectionState: (state: { zoom: number; scrollLeft: number; scrollTop: number } | null) => void;\n}\n\nexport function useCardSelection<TItem extends object>({\n data,\n isPanning,\n selectedItem,\n zoomLevel,\n viewMode,\n layout,\n containerRef,\n spacerRef,\n containerDimensions,\n scrollPosition,\n preSelectionState,\n grouping,\n getItemId,\n resolveId,\n setZoomLevel,\n setIsZooming,\n setSelectedItem,\n setPreSelectionState,\n}: UseCardSelectionParams<TItem>) {\n return useCallback((item: TItem, e: MouseEvent, id?: number | string) => {\n if (isPanning) return;\n\n // Use the containerRef directly as the scrollable viewport\n const container = containerRef.current;\n if (!container) return;\n\n // Resolve item ID\n let itemId = (id !== undefined && id !== null) ? id : resolveId(item, 0);\n itemId = normalizeIdToLayoutKey(itemId, layout);\n\n const selectedId = selectedItem\n ? (() => {\n const index = data.indexOf(selectedItem);\n const rawSelectedId = index !== -1 ? resolveId(selectedItem, index) : resolveId(selectedItem, 0);\n return normalizeIdToLayoutKey(rawSelectedId, layout);\n })()\n : null;\n\n // Get card position from layout\n const cardPosition = getCardPositionFromLayout(itemId, layout, BASE_CARD_WIDTH, BASE_CARD_HEIGHT);\n\n // Calculate target position for animation\n let targetCardPosition: CardPosition | null = null;\n let callbacks = { getCardPositionAtZoom: null as unknown as ((zoom: number) => CardPosition | null), getLayoutSizeAtZoom: null as unknown as ((zoom: number) => { width: number; height: number }) };\n let targetTotalHeight = layout.totalHeight;\n\n if (viewMode === 'grouped' && cardPosition) {\n // Calculate target zoom\n const targetZoom = Math.min(ZOOM_MAX, Math.max(MIN_ZOOM_ON_SELECT, zoomLevel * ZOOM_MULTIPLIER));\n\n const targetContainerWidth = containerDimensions.width / targetZoom;\n const targetContainerHeight = containerDimensions.height;\n\n callbacks = createCardPositionCallbacks(\n itemId,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n grouping as unknown as any,\n viewMode,\n targetContainerWidth,\n targetContainerHeight,\n );\n\n const targetPosition = callbacks.getCardPositionAtZoom(targetZoom);\n if (targetPosition) {\n targetCardPosition = targetPosition;\n }\n\n const targetLayout = callbacks.getLayoutSizeAtZoom(targetZoom);\n targetTotalHeight = targetLayout.height;\n }\n\n handleCardSelection({\n item,\n itemId,\n selectedItemId: selectedId,\n container,\n cardPosition,\n targetCardPosition,\n getCardPositionAtZoom: callbacks.getCardPositionAtZoom,\n getLayoutSizeAtZoom: callbacks.getLayoutSizeAtZoom,\n spacer: spacerRef.current,\n preSelectionState,\n startScrollPosition: { x: scrollPosition.x, y: scrollPosition.y },\n setZoomLevel,\n setIsZooming,\n setSelectedItem,\n setPreSelectionState,\n viewMode,\n zoomLevel,\n totalHeight: targetTotalHeight,\n });\n }, [isPanning, selectedItem, zoomLevel, preSelectionState, viewMode, resolveId, setZoomLevel, layout, grouping, containerRef, spacerRef, containerDimensions, scrollPosition, data, getItemId]);\n}\n"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type React from 'react';
1
2
  import type { Layout } from '../utils/cardPosition';
2
3
  import type { ViewMode } from '../components/Toolbar';
3
4
  interface UseDetailPanelCloseParams<TItem extends object> {
@@ -10,6 +11,7 @@ interface UseDetailPanelCloseParams<TItem extends object> {
10
11
  zoomLevel: number;
11
12
  viewMode: ViewMode;
12
13
  layout: Layout;
14
+ containerRef: React.RefObject<HTMLDivElement | null>;
13
15
  containerDimensions: {
14
16
  width: number;
15
17
  height: number;
@@ -22,6 +24,6 @@ interface UseDetailPanelCloseParams<TItem extends object> {
22
24
  setSelectedItem: (item: TItem | null) => void;
23
25
  setPreSelectionState: (state: null) => void;
24
26
  }
25
- export declare function useDetailPanelClose<TItem extends object>({ selectedItem, preSelectionState, zoomLevel, viewMode, layout, containerDimensions, grouping, data, resolveId, setZoomLevel, setIsZooming, setSelectedItem, setPreSelectionState, }: UseDetailPanelCloseParams<TItem>): () => void;
27
+ export declare function useDetailPanelClose<TItem extends object>({ selectedItem, preSelectionState, zoomLevel, viewMode, layout, containerRef, containerDimensions, grouping, data, resolveId, setZoomLevel, setIsZooming, setSelectedItem, setPreSelectionState, }: UseDetailPanelCloseParams<TItem>): () => void;
26
28
  export {};
27
29
  //# sourceMappingURL=useDetailPanelClose.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useDetailPanelClose.d.ts","sourceRoot":"","sources":["../../../../PivotViewer/hooks/useDetailPanelClose.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAQtD,UAAU,yBAAyB,CAAC,KAAK,SAAS,MAAM;IACpD,YAAY,EAAE,KAAK,GAAG,IAAI,CAAC;IAC3B,iBAAiB,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAClF,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,KAAK,EAAE,CAAC;IACd,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAAC;IAC3D,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,YAAY,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,eAAe,EAAE,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC;IAC9C,oBAAoB,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC;CAC/C;AAED,wBAAgB,mBAAmB,CAAC,KAAK,SAAS,MAAM,EAAE,EACtD,YAAY,EACZ,iBAAiB,EACjB,SAAS,EACT,QAAQ,EACR,MAAM,EACN,mBAAmB,EACnB,QAAQ,EACR,IAAI,EACJ,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,oBAAoB,GACvB,EAAE,yBAAyB,CAAC,KAAK,CAAC,cA2ElC"}
1
+ {"version":3,"file":"useDetailPanelClose.d.ts","sourceRoot":"","sources":["../../../../PivotViewer/hooks/useDetailPanelClose.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAQtD,UAAU,yBAAyB,CAAC,KAAK,SAAS,MAAM;IACpD,YAAY,EAAE,KAAK,GAAG,IAAI,CAAC;IAC3B,iBAAiB,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAClF,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACrD,mBAAmB,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,KAAK,EAAE,CAAC;IACd,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAAC;IAC3D,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,YAAY,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,eAAe,EAAE,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC;IAC9C,oBAAoB,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC;CAC/C;AAED,wBAAgB,mBAAmB,CAAC,KAAK,SAAS,MAAM,EAAE,EACtD,YAAY,EACZ,iBAAiB,EACjB,SAAS,EACT,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,mBAAmB,EACnB,QAAQ,EACR,IAAI,EACJ,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,oBAAoB,GACvB,EAAE,yBAAyB,CAAC,KAAK,CAAC,cA2ElC"}
@@ -4,9 +4,9 @@ import { normalizeIdToLayoutKey, getCardPositionFromLayout } from '../utils/idRe
4
4
  import { createCardPositionCallbacks } from '../utils/cardPosition.js';
5
5
  import { BASE_CARD_HEIGHT, BASE_CARD_WIDTH } from '../utils/constants.js';
6
6
 
7
- function useDetailPanelClose({ selectedItem, preSelectionState, zoomLevel, viewMode, layout, containerDimensions, grouping, data, resolveId, setZoomLevel, setIsZooming, setSelectedItem, setPreSelectionState, }) {
7
+ function useDetailPanelClose({ selectedItem, preSelectionState, zoomLevel, viewMode, layout, containerRef, containerDimensions, grouping, data, resolveId, setZoomLevel, setIsZooming, setSelectedItem, setPreSelectionState, }) {
8
8
  return useCallback(() => {
9
- const container = document.querySelector('.pv-main')?.parentElement;
9
+ const container = containerRef.current;
10
10
  if (!container || !selectedItem) {
11
11
  setSelectedItem(null);
12
12
  return;
@@ -54,7 +54,7 @@ function useDetailPanelClose({ selectedItem, preSelectionState, zoomLevel, viewM
54
54
  setPreSelectionState(null);
55
55
  },
56
56
  });
57
- }, [preSelectionState, selectedItem, zoomLevel, viewMode, resolveId, setZoomLevel, layout, grouping, containerDimensions, data, setSelectedItem, setPreSelectionState, setIsZooming]);
57
+ }, [preSelectionState, selectedItem, zoomLevel, viewMode, resolveId, setZoomLevel, layout, grouping, containerRef, containerDimensions, data, setSelectedItem, setPreSelectionState, setIsZooming]);
58
58
  }
59
59
 
60
60
  export { useDetailPanelClose };