@cratis/components 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.storybook/main.ts +24 -0
- package/CommandDialog/CommandDialog.stories.tsx +25 -0
- package/CommandDialog/CommandDialog.tsx +161 -0
- package/CommandDialog/index.ts +4 -0
- package/CommandForm/CommandForm.stories.tsx +24 -0
- package/CommandForm/CommandForm.tsx +266 -0
- package/CommandForm/CommandFormField.tsx +27 -0
- package/CommandForm/CommandFormFields.tsx +142 -0
- package/CommandForm/DatePickerField.tsx +57 -0
- package/CommandForm/DropdownField.tsx +65 -0
- package/CommandForm/InputTextField.tsx +62 -0
- package/CommandForm/SliderField.tsx +68 -0
- package/CommandForm/index.ts +10 -0
- package/Common/ErrorBoundary.stories.tsx +10 -0
- package/Common/ErrorBoundary.tsx +41 -0
- package/Common/FormElement.stories.tsx +10 -0
- package/Common/FormElement.tsx +20 -0
- package/Common/Page.stories.tsx +10 -0
- package/Common/Page.tsx +21 -0
- package/Common/index.ts +6 -0
- package/DataPage/DataPage.stories.tsx +10 -0
- package/DataPage/DataPage.tsx +191 -0
- package/DataPage/index.ts +4 -0
- package/DataTables/DataTableForObservableQuery.stories.tsx +10 -0
- package/DataTables/DataTableForObservableQuery.tsx +97 -0
- package/DataTables/DataTableForQuery.stories.tsx +10 -0
- package/DataTables/DataTableForQuery.tsx +97 -0
- package/DataTables/index.ts +5 -0
- package/Dialogs/BusyIndicatorDialog.stories.tsx +26 -0
- package/Dialogs/BusyIndicatorDialog.tsx +26 -0
- package/Dialogs/ConfirmationDialog.stories.tsx +36 -0
- package/Dialogs/ConfirmationDialog.tsx +75 -0
- package/Dialogs/index.ts +5 -0
- package/Dropdown/Dropdown.tsx +23 -0
- package/Dropdown/index.ts +4 -0
- package/PivotViewer/PivotViewer.stories.tsx +24 -0
- package/PivotViewer/PivotViewer.tsx +791 -0
- package/PivotViewer/components/AxisLabels.tsx +69 -0
- package/PivotViewer/components/DetailPanel.tsx +108 -0
- package/PivotViewer/components/FilterPanel.tsx +189 -0
- package/PivotViewer/components/FilterPanelContainer.tsx +10 -0
- package/PivotViewer/components/PivotCanvas.tsx +660 -0
- package/PivotViewer/components/PivotViewerMain.tsx +229 -0
- package/PivotViewer/components/RangeHistogramFilter.tsx +220 -0
- package/PivotViewer/components/Spinner.tsx +21 -0
- package/PivotViewer/components/Toolbar.tsx +130 -0
- package/PivotViewer/components/ToolbarContainer.tsx +10 -0
- package/PivotViewer/components/index.ts +12 -0
- package/PivotViewer/components/pivot/animation.ts +108 -0
- package/PivotViewer/components/pivot/buckets.ts +152 -0
- package/PivotViewer/components/pivot/colorResolver.ts +67 -0
- package/PivotViewer/components/pivot/constants.ts +46 -0
- package/PivotViewer/components/pivot/sprites.ts +265 -0
- package/PivotViewer/components/pivot/visibility.ts +319 -0
- package/PivotViewer/constants.ts +9 -0
- package/PivotViewer/engine/layout.ts +149 -0
- package/PivotViewer/engine/pivot.worker.ts +86 -0
- package/PivotViewer/engine/store.ts +437 -0
- package/PivotViewer/engine/types.ts +255 -0
- package/PivotViewer/hooks/index.ts +13 -0
- package/PivotViewer/hooks/useContainerDimensions.ts +45 -0
- package/PivotViewer/hooks/useDimensionState.ts +53 -0
- package/PivotViewer/hooks/useFilterOptions.ts +36 -0
- package/PivotViewer/hooks/useFilterPanelDrag.ts +49 -0
- package/PivotViewer/hooks/useFilterState.ts +106 -0
- package/PivotViewer/hooks/useFilteredData.ts +119 -0
- package/PivotViewer/hooks/usePanning.ts +163 -0
- package/PivotViewer/hooks/usePivotEngine.ts +252 -0
- package/PivotViewer/hooks/useSelectedItem.ts +402 -0
- package/PivotViewer/hooks/useWheelZoom.ts +114 -0
- package/PivotViewer/hooks/useZoomState.ts +34 -0
- package/PivotViewer/index.ts +7 -0
- package/PivotViewer/types.ts +59 -0
- package/PivotViewer/utils/animations.ts +249 -0
- package/PivotViewer/utils/constants.ts +20 -0
- package/PivotViewer/utils/index.ts +6 -0
- package/PivotViewer/utils/selection.ts +292 -0
- package/PivotViewer/utils/utils.ts +259 -0
- package/README.md +1 -0
- package/TimeMachine/EventsView.stories.tsx +10 -0
- package/TimeMachine/EventsView.tsx +119 -0
- package/TimeMachine/Properties.stories.tsx +10 -0
- package/TimeMachine/Properties.tsx +98 -0
- package/TimeMachine/ReadModelView.stories.tsx +10 -0
- package/TimeMachine/ReadModelView.tsx +143 -0
- package/TimeMachine/TimeMachine.stories.tsx +10 -0
- package/TimeMachine/TimeMachine.tsx +244 -0
- package/TimeMachine/index.ts +8 -0
- package/TimeMachine/types.ts +23 -0
- package/dist/cjs/CommandDialog/CommandDialog.js +71 -0
- package/dist/cjs/CommandDialog/CommandDialog.js.map +1 -0
- package/dist/cjs/CommandDialog/index.js +9 -0
- package/dist/cjs/CommandDialog/index.js.map +1 -0
- package/dist/cjs/CommandForm/CommandForm.js +179 -0
- package/dist/cjs/CommandForm/CommandForm.js.map +1 -0
- package/dist/cjs/CommandForm/CommandFormField.js +11 -0
- package/dist/cjs/CommandForm/CommandFormField.js.map +1 -0
- package/dist/cjs/CommandForm/CommandFormFields.js +67 -0
- package/dist/cjs/CommandForm/CommandFormFields.js.map +1 -0
- package/dist/cjs/CommandForm/DatePickerField.js +31 -0
- package/dist/cjs/CommandForm/DatePickerField.js.map +1 -0
- package/dist/cjs/CommandForm/DropdownField.js +31 -0
- package/dist/cjs/CommandForm/DropdownField.js.map +1 -0
- package/dist/cjs/CommandForm/InputTextField.js +32 -0
- package/dist/cjs/CommandForm/InputTextField.js.map +1 -0
- package/dist/cjs/CommandForm/SliderField.js +34 -0
- package/dist/cjs/CommandForm/SliderField.js.map +1 -0
- package/dist/cjs/CommandForm/index.js +23 -0
- package/dist/cjs/CommandForm/index.js.map +1 -0
- package/dist/cjs/Common/Page.js +10 -0
- package/dist/cjs/Common/Page.js.map +1 -0
- package/dist/cjs/DataPage/DataPage.js +64 -0
- package/dist/cjs/DataPage/DataPage.js.map +1 -0
- package/dist/cjs/DataPage/index.js +11 -0
- package/dist/cjs/DataPage/index.js.map +1 -0
- package/dist/cjs/DataTables/DataTableForObservableQuery.js +17 -0
- package/dist/cjs/DataTables/DataTableForObservableQuery.js.map +1 -0
- package/dist/cjs/DataTables/DataTableForQuery.js +17 -0
- package/dist/cjs/DataTables/DataTableForQuery.js.map +1 -0
- package/dist/cjs/DataTables/index.js +10 -0
- package/dist/cjs/DataTables/index.js.map +1 -0
- package/dist/cjs/Dialogs/BusyIndicatorDialog.js +13 -0
- package/dist/cjs/Dialogs/BusyIndicatorDialog.js.map +1 -0
- package/dist/cjs/Dialogs/ConfirmationDialog.js +33 -0
- package/dist/cjs/Dialogs/ConfirmationDialog.js.map +1 -0
- package/dist/cjs/Dialogs/index.js +10 -0
- package/dist/cjs/Dialogs/index.js.map +1 -0
- package/dist/cjs/Dropdown/Dropdown.js +15 -0
- package/dist/cjs/Dropdown/Dropdown.js.map +1 -0
- package/dist/cjs/Dropdown/index.js +8 -0
- package/dist/cjs/Dropdown/index.js.map +1 -0
- package/dist/cjs/PivotViewer/PivotViewer.js +525 -0
- package/dist/cjs/PivotViewer/PivotViewer.js.map +1 -0
- package/dist/cjs/PivotViewer/components/AxisLabels.js +27 -0
- package/dist/cjs/PivotViewer/components/AxisLabels.js.map +1 -0
- package/dist/cjs/PivotViewer/components/DetailPanel.js +35 -0
- package/dist/cjs/PivotViewer/components/DetailPanel.js.map +1 -0
- package/dist/cjs/PivotViewer/components/FilterPanel.js +59 -0
- package/dist/cjs/PivotViewer/components/FilterPanel.js.map +1 -0
- package/dist/cjs/PivotViewer/components/FilterPanelContainer.js +11 -0
- package/dist/cjs/PivotViewer/components/FilterPanelContainer.js.map +1 -0
- package/dist/cjs/PivotViewer/components/PivotCanvas.js +394 -0
- package/dist/cjs/PivotViewer/components/PivotCanvas.js.map +1 -0
- package/dist/cjs/PivotViewer/components/PivotViewerMain.js +81 -0
- package/dist/cjs/PivotViewer/components/PivotViewerMain.js.map +1 -0
- package/dist/cjs/PivotViewer/components/RangeHistogramFilter.js +124 -0
- package/dist/cjs/PivotViewer/components/RangeHistogramFilter.js.map +1 -0
- package/dist/cjs/PivotViewer/components/Spinner.js +11 -0
- package/dist/cjs/PivotViewer/components/Spinner.js.map +1 -0
- package/dist/cjs/PivotViewer/components/Toolbar.js +12 -0
- package/dist/cjs/PivotViewer/components/Toolbar.js.map +1 -0
- package/dist/cjs/PivotViewer/components/ToolbarContainer.js +11 -0
- package/dist/cjs/PivotViewer/components/ToolbarContainer.js.map +1 -0
- package/dist/cjs/PivotViewer/components/pivot/animation.js +82 -0
- package/dist/cjs/PivotViewer/components/pivot/animation.js.map +1 -0
- package/dist/cjs/PivotViewer/components/pivot/buckets.js +124 -0
- package/dist/cjs/PivotViewer/components/pivot/buckets.js.map +1 -0
- package/dist/cjs/PivotViewer/components/pivot/colorResolver.js +64 -0
- package/dist/cjs/PivotViewer/components/pivot/colorResolver.js.map +1 -0
- package/dist/cjs/PivotViewer/components/pivot/constants.js +19 -0
- package/dist/cjs/PivotViewer/components/pivot/constants.js.map +1 -0
- package/dist/cjs/PivotViewer/components/pivot/sprites.js +227 -0
- package/dist/cjs/PivotViewer/components/pivot/sprites.js.map +1 -0
- package/dist/cjs/PivotViewer/components/pivot/visibility.js +223 -0
- package/dist/cjs/PivotViewer/components/pivot/visibility.js.map +1 -0
- package/dist/cjs/PivotViewer/constants.js +16 -0
- package/dist/cjs/PivotViewer/constants.js.map +1 -0
- package/dist/cjs/PivotViewer/engine/layout.js +95 -0
- package/dist/cjs/PivotViewer/engine/layout.js.map +1 -0
- package/dist/cjs/PivotViewer/engine/store.js +336 -0
- package/dist/cjs/PivotViewer/engine/store.js.map +1 -0
- package/dist/cjs/PivotViewer/hooks/useContainerDimensions.js +30 -0
- package/dist/cjs/PivotViewer/hooks/useContainerDimensions.js.map +1 -0
- package/dist/cjs/PivotViewer/hooks/useDimensionState.js +43 -0
- package/dist/cjs/PivotViewer/hooks/useDimensionState.js.map +1 -0
- package/dist/cjs/PivotViewer/hooks/useFilterOptions.js +24 -0
- package/dist/cjs/PivotViewer/hooks/useFilterOptions.js.map +1 -0
- package/dist/cjs/PivotViewer/hooks/useFilterState.js +96 -0
- package/dist/cjs/PivotViewer/hooks/useFilterState.js.map +1 -0
- package/dist/cjs/PivotViewer/hooks/usePanning.js +120 -0
- package/dist/cjs/PivotViewer/hooks/usePanning.js.map +1 -0
- package/dist/cjs/PivotViewer/hooks/usePivotEngine.js +183 -0
- package/dist/cjs/PivotViewer/hooks/usePivotEngine.js.map +1 -0
- package/dist/cjs/PivotViewer/hooks/useWheelZoom.js +93 -0
- package/dist/cjs/PivotViewer/hooks/useWheelZoom.js.map +1 -0
- package/dist/cjs/PivotViewer/hooks/useZoomState.js +31 -0
- package/dist/cjs/PivotViewer/hooks/useZoomState.js.map +1 -0
- package/dist/cjs/PivotViewer/index.js +9 -0
- package/dist/cjs/PivotViewer/index.js.map +1 -0
- package/dist/cjs/PivotViewer/utils/animations.js +144 -0
- package/dist/cjs/PivotViewer/utils/animations.js.map +1 -0
- package/dist/cjs/PivotViewer/utils/constants.js +12 -0
- package/dist/cjs/PivotViewer/utils/constants.js.map +1 -0
- package/dist/cjs/PivotViewer/utils/selection.js +136 -0
- package/dist/cjs/PivotViewer/utils/selection.js.map +1 -0
- package/dist/cjs/PivotViewer/utils/utils.js +150 -0
- package/dist/cjs/PivotViewer/utils/utils.js.map +1 -0
- package/dist/cjs/TimeMachine/EventsView.js +57 -0
- package/dist/cjs/TimeMachine/EventsView.js.map +1 -0
- package/dist/cjs/TimeMachine/Properties.js +58 -0
- package/dist/cjs/TimeMachine/Properties.js.map +1 -0
- package/dist/cjs/TimeMachine/ReadModelView.js +40 -0
- package/dist/cjs/TimeMachine/ReadModelView.js.map +1 -0
- package/dist/cjs/TimeMachine/TimeMachine.js +98 -0
- package/dist/cjs/TimeMachine/TimeMachine.js.map +1 -0
- package/dist/cjs/TimeMachine/index.js +14 -0
- package/dist/cjs/TimeMachine/index.js.map +1 -0
- package/dist/cjs/index.js +22 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/useOverlayZIndex.js +24 -0
- package/dist/cjs/useOverlayZIndex.js.map +1 -0
- package/dist/esm/CommandDialog/CommandDialog.d.ts +45 -0
- package/dist/esm/CommandDialog/CommandDialog.d.ts.map +1 -0
- package/dist/esm/CommandDialog/CommandDialog.js +68 -0
- package/dist/esm/CommandDialog/CommandDialog.js.map +1 -0
- package/dist/esm/CommandDialog/CommandDialog.stories.d.ts +7 -0
- package/dist/esm/CommandDialog/CommandDialog.stories.d.ts.map +1 -0
- package/dist/esm/CommandDialog/CommandDialog.stories.js +12 -0
- package/dist/esm/CommandDialog/CommandDialog.stories.js.map +1 -0
- package/dist/esm/CommandDialog/index.d.ts +2 -0
- package/dist/esm/CommandDialog/index.d.ts.map +1 -0
- package/dist/esm/CommandDialog/index.js +2 -0
- package/dist/esm/CommandDialog/index.js.map +1 -0
- package/dist/esm/CommandForm/CommandForm.d.ts +49 -0
- package/dist/esm/CommandForm/CommandForm.d.ts.map +1 -0
- package/dist/esm/CommandForm/CommandForm.js +174 -0
- package/dist/esm/CommandForm/CommandForm.js.map +1 -0
- package/dist/esm/CommandForm/CommandForm.stories.d.ts +7 -0
- package/dist/esm/CommandForm/CommandForm.stories.d.ts.map +1 -0
- package/dist/esm/CommandForm/CommandForm.stories.js +12 -0
- package/dist/esm/CommandForm/CommandForm.stories.js.map +1 -0
- package/dist/esm/CommandForm/CommandFormField.d.ts +18 -0
- package/dist/esm/CommandForm/CommandFormField.d.ts.map +1 -0
- package/dist/esm/CommandForm/CommandFormField.js +9 -0
- package/dist/esm/CommandForm/CommandFormField.js.map +1 -0
- package/dist/esm/CommandForm/CommandFormFields.d.ts +11 -0
- package/dist/esm/CommandForm/CommandFormFields.d.ts.map +1 -0
- package/dist/esm/CommandForm/CommandFormFields.js +65 -0
- package/dist/esm/CommandForm/CommandFormFields.js.map +1 -0
- package/dist/esm/CommandForm/DatePickerField.d.ts +20 -0
- package/dist/esm/CommandForm/DatePickerField.d.ts.map +1 -0
- package/dist/esm/CommandForm/DatePickerField.js +29 -0
- package/dist/esm/CommandForm/DatePickerField.js.map +1 -0
- package/dist/esm/CommandForm/DropdownField.d.ts +24 -0
- package/dist/esm/CommandForm/DropdownField.d.ts.map +1 -0
- package/dist/esm/CommandForm/DropdownField.js +29 -0
- package/dist/esm/CommandForm/DropdownField.js.map +1 -0
- package/dist/esm/CommandForm/InputTextField.d.ts +20 -0
- package/dist/esm/CommandForm/InputTextField.d.ts.map +1 -0
- package/dist/esm/CommandForm/InputTextField.js +30 -0
- package/dist/esm/CommandForm/InputTextField.js.map +1 -0
- package/dist/esm/CommandForm/SliderField.d.ts +23 -0
- package/dist/esm/CommandForm/SliderField.d.ts.map +1 -0
- package/dist/esm/CommandForm/SliderField.js +32 -0
- package/dist/esm/CommandForm/SliderField.js.map +1 -0
- package/dist/esm/CommandForm/index.d.ts +8 -0
- package/dist/esm/CommandForm/index.d.ts.map +1 -0
- package/dist/esm/CommandForm/index.js +8 -0
- package/dist/esm/CommandForm/index.js.map +1 -0
- package/dist/esm/Common/ErrorBoundary.d.ts +16 -0
- package/dist/esm/Common/ErrorBoundary.d.ts.map +1 -0
- package/dist/esm/Common/ErrorBoundary.js +21 -0
- package/dist/esm/Common/ErrorBoundary.js.map +1 -0
- package/dist/esm/Common/ErrorBoundary.stories.d.ts +8 -0
- package/dist/esm/Common/ErrorBoundary.stories.d.ts.map +1 -0
- package/dist/esm/Common/ErrorBoundary.stories.js +6 -0
- package/dist/esm/Common/ErrorBoundary.stories.js.map +1 -0
- package/dist/esm/Common/FormElement.d.ts +6 -0
- package/dist/esm/Common/FormElement.d.ts.map +1 -0
- package/dist/esm/Common/FormElement.js +5 -0
- package/dist/esm/Common/FormElement.js.map +1 -0
- package/dist/esm/Common/FormElement.stories.d.ts +8 -0
- package/dist/esm/Common/FormElement.stories.d.ts.map +1 -0
- package/dist/esm/Common/FormElement.stories.js +6 -0
- package/dist/esm/Common/FormElement.stories.js.map +1 -0
- package/dist/esm/Common/Page.d.ts +8 -0
- package/dist/esm/Common/Page.d.ts.map +1 -0
- package/dist/esm/Common/Page.js +8 -0
- package/dist/esm/Common/Page.js.map +1 -0
- package/dist/esm/Common/Page.stories.d.ts +8 -0
- package/dist/esm/Common/Page.stories.d.ts.map +1 -0
- package/dist/esm/Common/Page.stories.js +6 -0
- package/dist/esm/Common/Page.stories.js.map +1 -0
- package/dist/esm/Common/index.d.ts +4 -0
- package/dist/esm/Common/index.d.ts.map +1 -0
- package/dist/esm/Common/index.js +4 -0
- package/dist/esm/Common/index.js.map +1 -0
- package/dist/esm/DataPage/DataPage.d.ts +41 -0
- package/dist/esm/DataPage/DataPage.d.ts.map +1 -0
- package/dist/esm/DataPage/DataPage.js +59 -0
- package/dist/esm/DataPage/DataPage.js.map +1 -0
- package/dist/esm/DataPage/DataPage.stories.d.ts +8 -0
- package/dist/esm/DataPage/DataPage.stories.d.ts.map +1 -0
- package/dist/esm/DataPage/DataPage.stories.js +6 -0
- package/dist/esm/DataPage/DataPage.stories.js.map +1 -0
- package/dist/esm/DataPage/index.d.ts +2 -0
- package/dist/esm/DataPage/index.d.ts.map +1 -0
- package/dist/esm/DataPage/index.js +2 -0
- package/dist/esm/DataPage/index.js.map +1 -0
- package/dist/esm/DataTables/DataTableForObservableQuery.d.ts +17 -0
- package/dist/esm/DataTables/DataTableForObservableQuery.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableForObservableQuery.js +15 -0
- package/dist/esm/DataTables/DataTableForObservableQuery.js.map +1 -0
- package/dist/esm/DataTables/DataTableForObservableQuery.stories.d.ts +8 -0
- package/dist/esm/DataTables/DataTableForObservableQuery.stories.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableForObservableQuery.stories.js +6 -0
- package/dist/esm/DataTables/DataTableForObservableQuery.stories.js.map +1 -0
- package/dist/esm/DataTables/DataTableForQuery.d.ts +17 -0
- package/dist/esm/DataTables/DataTableForQuery.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableForQuery.js +15 -0
- package/dist/esm/DataTables/DataTableForQuery.js.map +1 -0
- package/dist/esm/DataTables/DataTableForQuery.stories.d.ts +8 -0
- package/dist/esm/DataTables/DataTableForQuery.stories.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableForQuery.stories.js +6 -0
- package/dist/esm/DataTables/DataTableForQuery.stories.js.map +1 -0
- package/dist/esm/DataTables/index.d.ts +3 -0
- package/dist/esm/DataTables/index.d.ts.map +1 -0
- package/dist/esm/DataTables/index.js +3 -0
- package/dist/esm/DataTables/index.js.map +1 -0
- package/dist/esm/Dialogs/BusyIndicatorDialog.d.ts +3 -0
- package/dist/esm/Dialogs/BusyIndicatorDialog.d.ts.map +1 -0
- package/dist/esm/Dialogs/BusyIndicatorDialog.js +11 -0
- package/dist/esm/Dialogs/BusyIndicatorDialog.js.map +1 -0
- package/dist/esm/Dialogs/BusyIndicatorDialog.stories.d.ts +7 -0
- package/dist/esm/Dialogs/BusyIndicatorDialog.stories.d.ts.map +1 -0
- package/dist/esm/Dialogs/BusyIndicatorDialog.stories.js +15 -0
- package/dist/esm/Dialogs/BusyIndicatorDialog.stories.js.map +1 -0
- package/dist/esm/Dialogs/ConfirmationDialog.d.ts +2 -0
- package/dist/esm/Dialogs/ConfirmationDialog.d.ts.map +1 -0
- package/dist/esm/Dialogs/ConfirmationDialog.js +31 -0
- package/dist/esm/Dialogs/ConfirmationDialog.js.map +1 -0
- package/dist/esm/Dialogs/ConfirmationDialog.stories.d.ts +7 -0
- package/dist/esm/Dialogs/ConfirmationDialog.stories.d.ts.map +1 -0
- package/dist/esm/Dialogs/ConfirmationDialog.stories.js +20 -0
- package/dist/esm/Dialogs/ConfirmationDialog.stories.js.map +1 -0
- package/dist/esm/Dialogs/index.d.ts +3 -0
- package/dist/esm/Dialogs/index.d.ts.map +1 -0
- package/dist/esm/Dialogs/index.js +3 -0
- package/dist/esm/Dialogs/index.js.map +1 -0
- package/dist/esm/Dropdown/Dropdown.d.ts +5 -0
- package/dist/esm/Dropdown/Dropdown.d.ts.map +1 -0
- package/dist/esm/Dropdown/Dropdown.js +13 -0
- package/dist/esm/Dropdown/Dropdown.js.map +1 -0
- package/dist/esm/Dropdown/index.d.ts +2 -0
- package/dist/esm/Dropdown/index.d.ts.map +1 -0
- package/dist/esm/Dropdown/index.js +2 -0
- package/dist/esm/Dropdown/index.js.map +1 -0
- package/dist/esm/PivotViewer/PivotViewer.d.ts +4 -0
- package/dist/esm/PivotViewer/PivotViewer.d.ts.map +1 -0
- package/dist/esm/PivotViewer/PivotViewer.js +523 -0
- package/dist/esm/PivotViewer/PivotViewer.js.map +1 -0
- package/dist/esm/PivotViewer/PivotViewer.stories.d.ts +7 -0
- package/dist/esm/PivotViewer/PivotViewer.stories.d.ts.map +1 -0
- package/dist/esm/PivotViewer/PivotViewer.stories.js +12 -0
- package/dist/esm/PivotViewer/PivotViewer.stories.js.map +1 -0
- package/dist/esm/PivotViewer/components/AxisLabels.d.ts +13 -0
- package/dist/esm/PivotViewer/components/AxisLabels.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/AxisLabels.js +25 -0
- package/dist/esm/PivotViewer/components/AxisLabels.js.map +1 -0
- package/dist/esm/PivotViewer/components/DetailPanel.d.ts +6 -0
- package/dist/esm/PivotViewer/components/DetailPanel.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/DetailPanel.js +33 -0
- package/dist/esm/PivotViewer/components/DetailPanel.js.map +1 -0
- package/dist/esm/PivotViewer/components/FilterPanel.d.ts +27 -0
- package/dist/esm/PivotViewer/components/FilterPanel.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/FilterPanel.js +57 -0
- package/dist/esm/PivotViewer/components/FilterPanel.js.map +1 -0
- package/dist/esm/PivotViewer/components/FilterPanelContainer.d.ts +4 -0
- package/dist/esm/PivotViewer/components/FilterPanelContainer.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/FilterPanelContainer.js +9 -0
- package/dist/esm/PivotViewer/components/FilterPanelContainer.js.map +1 -0
- package/dist/esm/PivotViewer/components/PivotCanvas.d.ts +29 -0
- package/dist/esm/PivotViewer/components/PivotCanvas.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/PivotCanvas.js +373 -0
- package/dist/esm/PivotViewer/components/PivotCanvas.js.map +1 -0
- package/dist/esm/PivotViewer/components/PivotViewerMain.d.ts +43 -0
- package/dist/esm/PivotViewer/components/PivotViewerMain.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/PivotViewerMain.js +79 -0
- package/dist/esm/PivotViewer/components/PivotViewerMain.js.map +1 -0
- package/dist/esm/PivotViewer/components/RangeHistogramFilter.d.ts +11 -0
- package/dist/esm/PivotViewer/components/RangeHistogramFilter.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/RangeHistogramFilter.js +122 -0
- package/dist/esm/PivotViewer/components/RangeHistogramFilter.js.map +1 -0
- package/dist/esm/PivotViewer/components/Spinner.d.ts +3 -0
- package/dist/esm/PivotViewer/components/Spinner.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/Spinner.js +9 -0
- package/dist/esm/PivotViewer/components/Spinner.js.map +1 -0
- package/dist/esm/PivotViewer/components/Toolbar.d.ts +21 -0
- package/dist/esm/PivotViewer/components/Toolbar.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/Toolbar.js +10 -0
- package/dist/esm/PivotViewer/components/Toolbar.js.map +1 -0
- package/dist/esm/PivotViewer/components/ToolbarContainer.d.ts +4 -0
- package/dist/esm/PivotViewer/components/ToolbarContainer.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/ToolbarContainer.js +9 -0
- package/dist/esm/PivotViewer/components/ToolbarContainer.js.map +1 -0
- package/dist/esm/PivotViewer/components/index.d.ts +9 -0
- package/dist/esm/PivotViewer/components/index.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/index.js +8 -0
- package/dist/esm/PivotViewer/components/index.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/animation.d.ts +29 -0
- package/dist/esm/PivotViewer/components/pivot/animation.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/animation.js +79 -0
- package/dist/esm/PivotViewer/components/pivot/animation.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/buckets.d.ts +6 -0
- package/dist/esm/PivotViewer/components/pivot/buckets.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/buckets.js +102 -0
- package/dist/esm/PivotViewer/components/pivot/buckets.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/colorResolver.d.ts +4 -0
- package/dist/esm/PivotViewer/components/pivot/colorResolver.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/colorResolver.js +61 -0
- package/dist/esm/PivotViewer/components/pivot/colorResolver.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/constants.d.ts +38 -0
- package/dist/esm/PivotViewer/components/pivot/constants.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/constants.js +14 -0
- package/dist/esm/PivotViewer/components/pivot/constants.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/sprites.d.ts +6 -0
- package/dist/esm/PivotViewer/components/pivot/sprites.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/sprites.js +203 -0
- package/dist/esm/PivotViewer/components/pivot/sprites.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/visibility.d.ts +26 -0
- package/dist/esm/PivotViewer/components/pivot/visibility.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/visibility.js +221 -0
- package/dist/esm/PivotViewer/components/pivot/visibility.js.map +1 -0
- package/dist/esm/PivotViewer/constants.d.ts +7 -0
- package/dist/esm/PivotViewer/constants.d.ts.map +1 -0
- package/dist/esm/PivotViewer/constants.js +9 -0
- package/dist/esm/PivotViewer/constants.js.map +1 -0
- package/dist/esm/PivotViewer/engine/layout.d.ts +3 -0
- package/dist/esm/PivotViewer/engine/layout.d.ts.map +1 -0
- package/dist/esm/PivotViewer/engine/layout.js +93 -0
- package/dist/esm/PivotViewer/engine/layout.js.map +1 -0
- package/dist/esm/PivotViewer/engine/pivot.worker.d.ts +2 -0
- package/dist/esm/PivotViewer/engine/pivot.worker.d.ts.map +1 -0
- package/dist/esm/PivotViewer/engine/pivot.worker.js +58 -0
- package/dist/esm/PivotViewer/engine/pivot.worker.js.map +1 -0
- package/dist/esm/PivotViewer/engine/store.d.ts +9 -0
- package/dist/esm/PivotViewer/engine/store.d.ts.map +1 -0
- package/dist/esm/PivotViewer/engine/store.js +328 -0
- package/dist/esm/PivotViewer/engine/store.js.map +1 -0
- package/dist/esm/PivotViewer/engine/types.d.ts +125 -0
- package/dist/esm/PivotViewer/engine/types.d.ts.map +1 -0
- package/dist/esm/PivotViewer/engine/types.js +2 -0
- package/dist/esm/PivotViewer/engine/types.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/index.d.ts +11 -0
- package/dist/esm/PivotViewer/hooks/index.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/index.js +11 -0
- package/dist/esm/PivotViewer/hooks/index.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/useContainerDimensions.d.ts +5 -0
- package/dist/esm/PivotViewer/hooks/useContainerDimensions.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/useContainerDimensions.js +28 -0
- package/dist/esm/PivotViewer/hooks/useContainerDimensions.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/useDimensionState.d.ts +11 -0
- package/dist/esm/PivotViewer/hooks/useDimensionState.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/useDimensionState.js +41 -0
- package/dist/esm/PivotViewer/hooks/useDimensionState.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/useFilterOptions.d.ts +12 -0
- package/dist/esm/PivotViewer/hooks/useFilterOptions.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/useFilterOptions.js +22 -0
- package/dist/esm/PivotViewer/hooks/useFilterOptions.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/useFilterPanelDrag.d.ts +9 -0
- package/dist/esm/PivotViewer/hooks/useFilterPanelDrag.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/useFilterPanelDrag.js +42 -0
- package/dist/esm/PivotViewer/hooks/useFilterPanelDrag.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/useFilterState.d.ts +11 -0
- package/dist/esm/PivotViewer/hooks/useFilterState.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/useFilterState.js +94 -0
- package/dist/esm/PivotViewer/hooks/useFilterState.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/useFilteredData.d.ts +9 -0
- package/dist/esm/PivotViewer/hooks/useFilteredData.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/useFilteredData.js +85 -0
- package/dist/esm/PivotViewer/hooks/useFilteredData.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/usePanning.d.ts +10 -0
- package/dist/esm/PivotViewer/hooks/usePanning.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/usePanning.js +118 -0
- package/dist/esm/PivotViewer/hooks/usePanning.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/usePivotEngine.d.ts +14 -0
- package/dist/esm/PivotViewer/hooks/usePivotEngine.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/usePivotEngine.js +180 -0
- package/dist/esm/PivotViewer/hooks/usePivotEngine.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/useSelectedItem.d.ts +8 -0
- package/dist/esm/PivotViewer/hooks/useSelectedItem.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/useSelectedItem.js +322 -0
- package/dist/esm/PivotViewer/hooks/useSelectedItem.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/useWheelZoom.d.ts +2 -0
- package/dist/esm/PivotViewer/hooks/useWheelZoom.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/useWheelZoom.js +91 -0
- package/dist/esm/PivotViewer/hooks/useWheelZoom.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/useZoomState.d.ts +9 -0
- package/dist/esm/PivotViewer/hooks/useZoomState.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/useZoomState.js +29 -0
- package/dist/esm/PivotViewer/hooks/useZoomState.js.map +1 -0
- package/dist/esm/PivotViewer/index.d.ts +4 -0
- package/dist/esm/PivotViewer/index.d.ts.map +1 -0
- package/dist/esm/PivotViewer/index.js +2 -0
- package/dist/esm/PivotViewer/index.js.map +1 -0
- package/dist/esm/PivotViewer/types.d.ts +47 -0
- package/dist/esm/PivotViewer/types.d.ts.map +1 -0
- package/dist/esm/PivotViewer/types.js +2 -0
- package/dist/esm/PivotViewer/types.js.map +1 -0
- package/dist/esm/PivotViewer/utils/animations.d.ts +54 -0
- package/dist/esm/PivotViewer/utils/animations.d.ts.map +1 -0
- package/dist/esm/PivotViewer/utils/animations.js +139 -0
- package/dist/esm/PivotViewer/utils/animations.js.map +1 -0
- package/dist/esm/PivotViewer/utils/constants.d.ts +13 -0
- package/dist/esm/PivotViewer/utils/constants.d.ts.map +1 -0
- package/dist/esm/PivotViewer/utils/constants.js +7 -0
- package/dist/esm/PivotViewer/utils/constants.js.map +1 -0
- package/dist/esm/PivotViewer/utils/index.d.ts +4 -0
- package/dist/esm/PivotViewer/utils/index.d.ts.map +1 -0
- package/dist/esm/PivotViewer/utils/index.js +4 -0
- package/dist/esm/PivotViewer/utils/index.js.map +1 -0
- package/dist/esm/PivotViewer/utils/selection.d.ts +50 -0
- package/dist/esm/PivotViewer/utils/selection.d.ts.map +1 -0
- package/dist/esm/PivotViewer/utils/selection.js +134 -0
- package/dist/esm/PivotViewer/utils/selection.js.map +1 -0
- package/dist/esm/PivotViewer/utils/utils.d.ts +24 -0
- package/dist/esm/PivotViewer/utils/utils.d.ts.map +1 -0
- package/dist/esm/PivotViewer/utils/utils.js +138 -0
- package/dist/esm/PivotViewer/utils/utils.js.map +1 -0
- package/dist/esm/TimeMachine/EventsView.d.ts +9 -0
- package/dist/esm/TimeMachine/EventsView.d.ts.map +1 -0
- package/dist/esm/TimeMachine/EventsView.js +55 -0
- package/dist/esm/TimeMachine/EventsView.js.map +1 -0
- package/dist/esm/TimeMachine/EventsView.stories.d.ts +8 -0
- package/dist/esm/TimeMachine/EventsView.stories.d.ts.map +1 -0
- package/dist/esm/TimeMachine/EventsView.stories.js +6 -0
- package/dist/esm/TimeMachine/EventsView.stories.js.map +1 -0
- package/dist/esm/TimeMachine/Properties.d.ts +9 -0
- package/dist/esm/TimeMachine/Properties.d.ts.map +1 -0
- package/dist/esm/TimeMachine/Properties.js +56 -0
- package/dist/esm/TimeMachine/Properties.js.map +1 -0
- package/dist/esm/TimeMachine/Properties.stories.d.ts +8 -0
- package/dist/esm/TimeMachine/Properties.stories.d.ts.map +1 -0
- package/dist/esm/TimeMachine/Properties.stories.js +6 -0
- package/dist/esm/TimeMachine/Properties.stories.js.map +1 -0
- package/dist/esm/TimeMachine/ReadModelView.d.ts +12 -0
- package/dist/esm/TimeMachine/ReadModelView.d.ts.map +1 -0
- package/dist/esm/TimeMachine/ReadModelView.js +38 -0
- package/dist/esm/TimeMachine/ReadModelView.js.map +1 -0
- package/dist/esm/TimeMachine/ReadModelView.stories.d.ts +8 -0
- package/dist/esm/TimeMachine/ReadModelView.stories.d.ts.map +1 -0
- package/dist/esm/TimeMachine/ReadModelView.stories.js +6 -0
- package/dist/esm/TimeMachine/ReadModelView.stories.js.map +1 -0
- package/dist/esm/TimeMachine/TimeMachine.d.ts +12 -0
- package/dist/esm/TimeMachine/TimeMachine.d.ts.map +1 -0
- package/dist/esm/TimeMachine/TimeMachine.js +93 -0
- package/dist/esm/TimeMachine/TimeMachine.js.map +1 -0
- package/dist/esm/TimeMachine/TimeMachine.stories.d.ts +8 -0
- package/dist/esm/TimeMachine/TimeMachine.stories.d.ts.map +1 -0
- package/dist/esm/TimeMachine/TimeMachine.stories.js +6 -0
- package/dist/esm/TimeMachine/TimeMachine.stories.js.map +1 -0
- package/dist/esm/TimeMachine/index.d.ts +6 -0
- package/dist/esm/TimeMachine/index.d.ts.map +1 -0
- package/dist/esm/TimeMachine/index.js +5 -0
- package/dist/esm/TimeMachine/index.js.map +1 -0
- package/dist/esm/TimeMachine/types.d.ts +19 -0
- package/dist/esm/TimeMachine/types.d.ts.map +1 -0
- package/dist/esm/TimeMachine/types.js +2 -0
- package/dist/esm/TimeMachine/types.js.map +1 -0
- package/dist/esm/index.d.ts +10 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +17 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/tsconfig.tsbuildinfo +1 -0
- package/dist/esm/useOverlayZIndex.d.ts +2 -0
- package/dist/esm/useOverlayZIndex.d.ts.map +1 -0
- package/dist/esm/useOverlayZIndex.js +22 -0
- package/dist/esm/useOverlayZIndex.js.map +1 -0
- package/dist/esm/vite.config.d.ts +3 -0
- package/dist/esm/vite.config.d.ts.map +1 -0
- package/dist/esm/vite.config.js +76 -0
- package/dist/esm/vite.config.js.map +1 -0
- package/global.d.ts +11 -0
- package/index.ts +22 -0
- package/package.json +160 -0
- package/useOverlayZIndex.ts +32 -0
- package/vite.config.ts +80 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var constants = require('../constants.js');
|
|
5
|
+
|
|
6
|
+
function AxisLabels({ groups, bucketWidths, dimensionFilter, hoveredGroup, zoomLevel, onHover, onClick, containerRef, }) {
|
|
7
|
+
return (jsxRuntime.jsx("div", { className: "pv-axis-labels", ref: containerRef, style: {
|
|
8
|
+
pointerEvents: 'none',
|
|
9
|
+
gap: `${constants.GROUP_SPACING * zoomLevel}px`,
|
|
10
|
+
paddingLeft: 0,
|
|
11
|
+
paddingRight: 0,
|
|
12
|
+
overflowX: 'hidden',
|
|
13
|
+
whiteSpace: 'nowrap',
|
|
14
|
+
}, children: groups.map((group, index) => {
|
|
15
|
+
const isSelected = dimensionFilter === group.key;
|
|
16
|
+
const baseBucketWidth = bucketWidths[index] || 0;
|
|
17
|
+
const bucketWidth = baseBucketWidth * zoomLevel;
|
|
18
|
+
const width = bucketWidth;
|
|
19
|
+
return (jsxRuntime.jsxs("button", { type: "button", className: `pv-axis-label ${hoveredGroup === group.key ? 'highlighted' : ''} ${isSelected ? 'selected' : ''}`, style: {
|
|
20
|
+
width,
|
|
21
|
+
pointerEvents: 'auto'
|
|
22
|
+
}, onMouseEnter: () => onHover(group.key), onMouseLeave: () => onHover(null), onClick: () => onClick(group.key), children: [jsxRuntime.jsx("span", { className: "pv-axis-label-text", children: group.label }), jsxRuntime.jsx("span", { className: "pv-axis-label-count", children: group.count ?? group.items.length })] }, group.key));
|
|
23
|
+
}) }));
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
exports.AxisLabels = AxisLabels;
|
|
27
|
+
//# sourceMappingURL=AxisLabels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AxisLabels.js","sources":["../../../../PivotViewer/components/AxisLabels.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 { PivotGroup } from '../types';\nimport { GROUP_SPACING } from '../constants';\n\nexport interface AxisLabelsProps<TItem extends object> {\n groups: PivotGroup<TItem>[];\n bucketWidths: number[];\n dimensionFilter: string | null;\n hoveredGroup: string | null;\n zoomLevel: number;\n onHover: (key: string | null) => void;\n onClick: (key: string) => void;\n containerRef: React.RefObject<HTMLDivElement | null>;\n}\n\nexport function AxisLabels<TItem extends object>({\n groups,\n bucketWidths,\n dimensionFilter,\n hoveredGroup,\n zoomLevel,\n onHover,\n onClick,\n containerRef,\n}: AxisLabelsProps<TItem>) {\n return (\n <div\n className=\"pv-axis-labels\"\n ref={containerRef}\n style={{\n pointerEvents: 'none',\n gap: `${GROUP_SPACING * zoomLevel}px`,\n paddingLeft: 0,\n paddingRight: 0,\n overflowX: 'hidden',\n whiteSpace: 'nowrap',\n }}\n >\n {groups.map((group, index) => {\n const isSelected = dimensionFilter === group.key;\n const baseBucketWidth = bucketWidths[index] || 0;\n // Apply zoom to bucket width\n const bucketWidth = baseBucketWidth * zoomLevel;\n // Width is just the bucket width - spacing is handled by CSS gap\n const width = bucketWidth;\n\n return (\n <button\n key={group.key}\n type=\"button\"\n className={`pv-axis-label ${hoveredGroup === group.key ? 'highlighted' : ''} ${isSelected ? 'selected' : ''}`}\n style={{\n width,\n pointerEvents: 'auto'\n }}\n onMouseEnter={() => onHover(group.key)}\n onMouseLeave={() => onHover(null)}\n onClick={() => onClick(group.key)}\n >\n <span className=\"pv-axis-label-text\">{group.label}</span>\n <span className=\"pv-axis-label-count\">{group.count ?? group.items.length}</span>\n </button>\n );\n })}\n </div>\n );\n}\n"],"names":["_jsx","GROUP_SPACING","_jsxs"],"mappings":";;;;;SAiBgB,UAAU,CAAuB,EAC/C,MAAM,EACN,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,SAAS,EACT,OAAO,EACP,OAAO,EACP,YAAY,GACW,EAAA;IACvB,QACEA,cAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAC,gBAAgB,EAC1B,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE;AACL,YAAA,aAAa,EAAE,MAAM;AACrB,YAAA,GAAG,EAAE,CAAA,EAAGC,uBAAa,GAAG,SAAS,CAAA,EAAA,CAAI;AACrC,YAAA,WAAW,EAAE,CAAC;AACd,YAAA,YAAY,EAAE,CAAC;AACf,YAAA,SAAS,EAAE,QAAQ;AACnB,YAAA,UAAU,EAAE,QAAQ;SACrB,EAAA,QAAA,EAEA,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,KAAI;AAC3B,YAAA,MAAM,UAAU,GAAG,eAAe,KAAK,KAAK,CAAC,GAAG;YAChD,MAAM,eAAe,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC;AAEhD,YAAA,MAAM,WAAW,GAAG,eAAe,GAAG,SAAS;YAE/C,MAAM,KAAK,GAAG,WAAW;AAEzB,YAAA,QACEC,eAAA,CAAA,QAAA,EAAA,EAEE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,CAAA,cAAA,EAAiB,YAAY,KAAK,KAAK,CAAC,GAAG,GAAG,aAAa,GAAG,EAAE,CAAA,CAAA,EAAI,UAAU,GAAG,UAAU,GAAG,EAAE,CAAA,CAAE,EAC7G,KAAK,EAAE;oBACL,KAAK;AACL,oBAAA,aAAa,EAAE;AAChB,iBAAA,EACD,YAAY,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EACtC,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EACjC,OAAO,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAA,QAAA,EAAA,CAEjCF,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,oBAAoB,EAAA,QAAA,EAAE,KAAK,CAAC,KAAK,EAAA,CAAQ,EACzDA,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,qBAAqB,EAAA,QAAA,EAAE,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,EAAA,CAAQ,CAAA,EAAA,EAZ3E,KAAK,CAAC,GAAG,CAaP;QAEb,CAAC,CAAC,EAAA,CACE;AAEV;;;;"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var framerMotion = require('framer-motion');
|
|
5
|
+
|
|
6
|
+
function DetailPanel({ selectedItem, onClose, }) {
|
|
7
|
+
const selectedRecord = selectedItem;
|
|
8
|
+
const selectedContent = selectedRecord
|
|
9
|
+
? (selectedRecord['content'] ?? {})
|
|
10
|
+
: {};
|
|
11
|
+
const metadataEntries = selectedRecord
|
|
12
|
+
? [
|
|
13
|
+
['Type', selectedRecord['type']],
|
|
14
|
+
[
|
|
15
|
+
'Occurred',
|
|
16
|
+
selectedRecord['occurred'] instanceof Date
|
|
17
|
+
? selectedRecord['occurred'].toLocaleString()
|
|
18
|
+
: selectedRecord['occurred']
|
|
19
|
+
? new Date(String(selectedRecord['occurred'])).toLocaleString()
|
|
20
|
+
: undefined,
|
|
21
|
+
],
|
|
22
|
+
['Service', selectedRecord['service']],
|
|
23
|
+
['Environment', selectedRecord['environment']],
|
|
24
|
+
['Tenant', selectedRecord['tenant']],
|
|
25
|
+
['Correlation Id', selectedRecord['correlationId']],
|
|
26
|
+
].filter(([, value]) => value !== undefined && value !== null)
|
|
27
|
+
: [];
|
|
28
|
+
const causation = Array.isArray(selectedRecord?.['causation'])
|
|
29
|
+
? selectedRecord?.['causation']
|
|
30
|
+
: [];
|
|
31
|
+
return (jsxRuntime.jsx(framerMotion.AnimatePresence, { children: selectedRecord && (jsxRuntime.jsxs(framerMotion.motion.aside, { className: "pv-detail-panel", initial: { x: '100%' }, animate: { x: 0 }, exit: { x: '100%' }, transition: { type: 'spring', stiffness: 400, damping: 35 }, children: [jsxRuntime.jsxs("header", { children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("h2", { children: String(selectedRecord['name'] ?? selectedRecord['type'] ?? 'Event') }), selectedRecord['type'] ? jsxRuntime.jsx("p", { children: String(selectedRecord['type']) }) : null] }), jsxRuntime.jsx("button", { type: "button", onClick: onClose, title: "Close", children: "\u00D7" })] }), jsxRuntime.jsxs("div", { className: "pv-detail-panel-content", children: [metadataEntries.length > 0 && (jsxRuntime.jsxs("section", { className: "pv-detail-meta", children: [jsxRuntime.jsx("h3", { children: "Metadata" }), jsxRuntime.jsx("dl", { children: metadataEntries.map(([key, value]) => (jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("dt", { children: key }), jsxRuntime.jsx("dd", { children: String(value) })] }, key))) })] })), causation.length > 0 && (jsxRuntime.jsxs("section", { className: "pv-detail-causation", children: [jsxRuntime.jsx("h3", { children: "Causation" }), jsxRuntime.jsx("div", { className: "pv-pill-row", children: causation.map((value, index) => (jsxRuntime.jsx("span", { className: "pv-pill", children: String(value) }, `${value}-${index}`))) })] })), jsxRuntime.jsxs("section", { className: "pv-detail-content", children: [jsxRuntime.jsx("h3", { children: "Content" }), jsxRuntime.jsx("dl", { children: Object.entries(selectedContent).map(([key, value]) => (jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("dt", { children: key }), jsxRuntime.jsx("dd", { children: typeof value === 'object' ? JSON.stringify(value, null, 2) : String(value) })] }, key))) })] })] })] })) }));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
exports.DetailPanel = DetailPanel;
|
|
35
|
+
//# sourceMappingURL=DetailPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DetailPanel.js","sources":["../../../../PivotViewer/components/DetailPanel.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 { AnimatePresence, motion } from 'framer-motion';\n\ntype WithRecord<TItem> = TItem extends Record<string, unknown> ? TItem : never;\n\nexport interface DetailPanelProps<TItem extends object> {\n selectedItem: TItem | null;\n onClose: () => void;\n}\n\nexport function DetailPanel<TItem extends object>({\n selectedItem,\n onClose,\n}: DetailPanelProps<TItem>) {\n const selectedRecord = selectedItem as WithRecord<TItem> | null;\n\n const selectedContent = selectedRecord\n ? ((selectedRecord['content'] as Record<string, unknown> | undefined) ?? {})\n : {};\n\n const metadataEntries = selectedRecord\n ? (\n [\n ['Type', selectedRecord['type']],\n [\n 'Occurred',\n selectedRecord['occurred'] instanceof Date\n ? (selectedRecord['occurred'] as Date).toLocaleString()\n : selectedRecord['occurred']\n ? new Date(String(selectedRecord['occurred'])).toLocaleString()\n : undefined,\n ],\n ['Service', selectedRecord['service']],\n ['Environment', selectedRecord['environment']],\n ['Tenant', selectedRecord['tenant']],\n ['Correlation Id', selectedRecord['correlationId']],\n ] as Array<[string, unknown]>\n ).filter(([, value]) => value !== undefined && value !== null)\n : [];\n\n const causation = Array.isArray(selectedRecord?.['causation'])\n ? (selectedRecord?.['causation'] as unknown[])\n : [];\n\n return (\n <AnimatePresence>\n {selectedRecord && (\n <motion.aside\n className=\"pv-detail-panel\"\n initial={{ x: '100%' }}\n animate={{ x: 0 }}\n exit={{ x: '100%' }}\n transition={{ type: 'spring', stiffness: 400, damping: 35 }}\n >\n <header>\n <div>\n <h2>{String(selectedRecord['name'] ?? selectedRecord['type'] ?? 'Event')}</h2>\n {selectedRecord['type'] ? <p>{String(selectedRecord['type'])}</p> : null}\n </div>\n <button type=\"button\" onClick={onClose} title=\"Close\">\n ×\n </button>\n </header>\n <div className=\"pv-detail-panel-content\">\n {metadataEntries.length > 0 && (\n <section className=\"pv-detail-meta\">\n <h3>Metadata</h3>\n <dl>\n {metadataEntries.map(([key, value]) => (\n <div key={key}>\n <dt>{key}</dt>\n <dd>{String(value)}</dd>\n </div>\n ))}\n </dl>\n </section>\n )}\n {causation.length > 0 && (\n <section className=\"pv-detail-causation\">\n <h3>Causation</h3>\n <div className=\"pv-pill-row\">\n {causation.map((value, index) => (\n <span key={`${value}-${index}`} className=\"pv-pill\">\n {String(value)}\n </span>\n ))}\n </div>\n </section>\n )}\n <section className=\"pv-detail-content\">\n <h3>Content</h3>\n <dl>\n {Object.entries(selectedContent).map(([key, value]) => (\n <div key={key}>\n <dt>{key}</dt>\n <dd>{typeof value === 'object' ? JSON.stringify(value, null, 2) : String(value)}</dd>\n </div>\n ))}\n </dl>\n </section>\n </div>\n </motion.aside>\n )}\n </AnimatePresence>\n );\n}\n"],"names":["_jsx","AnimatePresence","_jsxs","motion"],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var reactDom = require('react-dom');
|
|
6
|
+
var framerMotion = require('framer-motion');
|
|
7
|
+
var utils = require('../utils/utils.js');
|
|
8
|
+
var RangeHistogramFilter = require('./RangeHistogramFilter.js');
|
|
9
|
+
|
|
10
|
+
function FilterPanel({ isOpen, search, filterState, rangeFilterState, expandedFilterKey, filterOptions, anchorRef, onClose, onSearchChange, onFilterToggle, onFilterClear, onRangeChange, onExpandedFilterChange, }) {
|
|
11
|
+
const panelRef = React.useRef(null);
|
|
12
|
+
const [position, setPosition] = React.useState({ top: 0, left: 0 });
|
|
13
|
+
React.useEffect(() => {
|
|
14
|
+
if (isOpen && anchorRef.current) {
|
|
15
|
+
const rect = anchorRef.current.getBoundingClientRect();
|
|
16
|
+
setPosition({
|
|
17
|
+
top: rect.bottom + 8,
|
|
18
|
+
left: rect.left,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
}, [isOpen, anchorRef]);
|
|
22
|
+
React.useEffect(() => {
|
|
23
|
+
if (!isOpen)
|
|
24
|
+
return;
|
|
25
|
+
const handleClickOutside = (event) => {
|
|
26
|
+
const target = event.target;
|
|
27
|
+
const panel = panelRef.current;
|
|
28
|
+
const anchor = anchorRef.current;
|
|
29
|
+
if (panel && !panel.contains(target) && anchor && !anchor.contains(target)) {
|
|
30
|
+
onClose();
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
const timeoutId = setTimeout(() => {
|
|
34
|
+
document.addEventListener('mousedown', handleClickOutside, true);
|
|
35
|
+
}, 0);
|
|
36
|
+
return () => {
|
|
37
|
+
clearTimeout(timeoutId);
|
|
38
|
+
document.removeEventListener('mousedown', handleClickOutside, true);
|
|
39
|
+
};
|
|
40
|
+
}, [isOpen, anchorRef, onClose]);
|
|
41
|
+
return reactDom.createPortal(jsxRuntime.jsx(framerMotion.AnimatePresence, { initial: false, children: isOpen && (jsxRuntime.jsx(framerMotion.motion.aside, { ref: panelRef, className: "pv-filter-dropdown", style: {
|
|
42
|
+
position: 'fixed',
|
|
43
|
+
left: position.left,
|
|
44
|
+
top: position.top,
|
|
45
|
+
}, initial: { opacity: 0, y: -8 }, animate: { opacity: 1, y: 0 }, exit: { opacity: 0, y: -8 }, transition: { duration: 0.15 }, children: jsxRuntime.jsxs("div", { className: "pv-filter-dropdown-content", children: [jsxRuntime.jsx("div", { className: "pv-search", children: jsxRuntime.jsx("input", { type: "search", placeholder: "Search events", value: search, onChange: (event) => onSearchChange(event.target.value) }) }), jsxRuntime.jsx("div", { className: "pv-filter-groups", children: filterOptions.map(({ filter, options, numericRange }) => {
|
|
46
|
+
const selections = filterState[filter.key] ?? new Set();
|
|
47
|
+
const rangeSelection = rangeFilterState[filter.key];
|
|
48
|
+
const isExpanded = expandedFilterKey === filter.key;
|
|
49
|
+
const isNumeric = filter.type === 'number';
|
|
50
|
+
return (jsxRuntime.jsxs("div", { className: `pv-filter ${isExpanded ? 'expanded' : ''}`, children: [jsxRuntime.jsxs("button", { type: "button", className: "pv-filter-trigger", onClick: () => onExpandedFilterChange(isExpanded ? null : filter.key), children: [jsxRuntime.jsx("span", { className: "pv-filter-label", children: filter.label }), jsxRuntime.jsxs("span", { className: "pv-filter-trigger-meta", children: [!isNumeric && selections.size > 0 && jsxRuntime.jsx("span", { className: "pv-filter-count", children: selections.size }), isNumeric && rangeSelection && jsxRuntime.jsx("span", { className: "pv-filter-count", children: "Range" }), jsxRuntime.jsx("span", { className: "pv-filter-chevron" })] })] }), jsxRuntime.jsx("div", { className: `pv-filter-content ${isExpanded ? 'expanded' : ''}`, children: isNumeric && numericRange ? (jsxRuntime.jsx(RangeHistogramFilter.RangeHistogramFilter, { values: numericRange.values, min: numericRange.min, max: numericRange.max, buckets: filter.buckets ?? 20, selectedRange: rangeSelection ?? null, onChange: (range) => onRangeChange(filter.key, range) })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("ul", { children: options.map((option) => {
|
|
51
|
+
const optionKey = option.key;
|
|
52
|
+
const checked = selections.has(optionKey);
|
|
53
|
+
return (jsxRuntime.jsx("li", { children: jsxRuntime.jsxs("label", { children: [jsxRuntime.jsx("input", { type: filter.multi ? 'checkbox' : 'radio', name: `filter-${filter.key}`, checked: checked, onChange: () => onFilterToggle(filter.key, optionKey, filter.multi ?? false) }), jsxRuntime.jsx("span", { children: option.label }), jsxRuntime.jsx("span", { className: "pv-option-count", children: utils.renderOptionCount(option.count) })] }) }, option.key));
|
|
54
|
+
}) }), selections.size > 0 && (jsxRuntime.jsx("button", { type: "button", className: "pv-filter-clear", onClick: () => onFilterClear(filter.key), children: "Clear" }))] })) })] }, filter.key));
|
|
55
|
+
}) })] }) })) }), document.body);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
exports.FilterPanel = FilterPanel;
|
|
59
|
+
//# sourceMappingURL=FilterPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilterPanel.js","sources":["../../../../PivotViewer/components/FilterPanel.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, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport type { PivotFilter, PivotFilterOption, PivotPrimitive } from '../types';\nimport type { FilterState, RangeFilterState } from '../utils/utils';\nimport { renderOptionCount } from '../utils/utils';\nimport { RangeHistogramFilter } from './RangeHistogramFilter';\n\nexport interface FilterPanelProps<TItem extends object> {\n isOpen: boolean;\n search: string;\n filterState: FilterState;\n rangeFilterState: RangeFilterState;\n expandedFilterKey: string | null;\n filterOptions: {\n filter: PivotFilter<TItem>;\n options: PivotFilterOption[];\n numericRange?: { min: number; max: number; values: PivotPrimitive[] };\n }[];\n anchorRef: React.RefObject<HTMLButtonElement | null>;\n onClose: () => void;\n onSearchChange: (value: string) => void;\n onFilterToggle: (filterKey: string, optionKey: string, multi: boolean | undefined) => void;\n onFilterClear: (filterKey: string) => void;\n onRangeChange: (filterKey: string, range: [number, number] | null) => void;\n onExpandedFilterChange: (key: string | null) => void;\n}\n\nexport function FilterPanel<TItem extends object>({\n isOpen,\n search,\n filterState,\n rangeFilterState,\n expandedFilterKey,\n filterOptions,\n anchorRef,\n onClose,\n onSearchChange,\n onFilterToggle,\n onFilterClear,\n onRangeChange,\n onExpandedFilterChange,\n}: FilterPanelProps<TItem>) {\n const panelRef = useRef<HTMLDivElement>(null);\n const [position, setPosition] = useState({ top: 0, left: 0 });\n\n // Calculate position when opening\n useEffect(() => {\n if (isOpen && anchorRef.current) {\n const rect = anchorRef.current.getBoundingClientRect();\n setPosition({\n top: rect.bottom + 8,\n left: rect.left,\n });\n }\n }, [isOpen, anchorRef]);\n\n // Handle click outside to close\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n const panel = panelRef.current;\n const anchor = anchorRef.current;\n\n if (panel && !panel.contains(target) && anchor && !anchor.contains(target)) {\n onClose();\n }\n };\n\n // Use capture phase to ensure we catch the event before any other handlers\n // Use timeout to avoid closing immediately when clicking the button to open\n const timeoutId = setTimeout(() => {\n document.addEventListener('mousedown', handleClickOutside, true);\n }, 0);\n\n return () => {\n clearTimeout(timeoutId);\n document.removeEventListener('mousedown', handleClickOutside, true);\n };\n }, [isOpen, anchorRef, onClose]);\n\n return createPortal(\n <AnimatePresence initial={false}>\n {isOpen && (\n <motion.aside\n ref={panelRef}\n className=\"pv-filter-dropdown\"\n style={{\n position: 'fixed',\n left: position.left,\n top: position.top,\n }}\n initial={{ opacity: 0, y: -8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -8 }}\n transition={{ duration: 0.15 }}\n >\n <div className=\"pv-filter-dropdown-content\">\n <div className=\"pv-search\">\n <input\n type=\"search\"\n placeholder=\"Search events\"\n value={search}\n onChange={(event) => onSearchChange(event.target.value)}\n />\n </div>\n <div className=\"pv-filter-groups\">\n {filterOptions.map(({ filter, options, numericRange }) => {\n const selections = filterState[filter.key] ?? new Set<string>();\n const rangeSelection = rangeFilterState[filter.key];\n const isExpanded = expandedFilterKey === filter.key;\n const isNumeric = filter.type === 'number';\n\n return (\n <div key={filter.key} className={`pv-filter ${isExpanded ? 'expanded' : ''}`}>\n <button\n type=\"button\"\n className=\"pv-filter-trigger\"\n onClick={() => onExpandedFilterChange(isExpanded ? null : filter.key)}\n >\n <span className=\"pv-filter-label\">{filter.label}</span>\n <span className=\"pv-filter-trigger-meta\">\n {!isNumeric && selections.size > 0 && <span className=\"pv-filter-count\">{selections.size}</span>}\n {isNumeric && rangeSelection && <span className=\"pv-filter-count\">Range</span>}\n <span className=\"pv-filter-chevron\" />\n </span>\n </button>\n <div className={`pv-filter-content ${isExpanded ? 'expanded' : ''}`}>\n {isNumeric && numericRange ? (\n <RangeHistogramFilter\n values={numericRange.values}\n min={numericRange.min}\n max={numericRange.max}\n buckets={filter.buckets ?? 20}\n selectedRange={rangeSelection ?? null}\n onChange={(range) => onRangeChange(filter.key, range)}\n />\n ) : (\n <>\n <ul>\n {options.map((option) => {\n const optionKey = option.key;\n const checked = selections.has(optionKey);\n return (\n <li key={option.key}>\n <label>\n <input\n type={filter.multi ? 'checkbox' : 'radio'}\n name={`filter-${filter.key}`}\n checked={checked}\n onChange={() =>\n onFilterToggle(filter.key, optionKey, filter.multi ?? false)\n }\n />\n <span>{option.label}</span>\n <span className=\"pv-option-count\">{renderOptionCount(option.count)}</span>\n </label>\n </li>\n );\n })}\n </ul>\n {selections.size > 0 && (\n <button\n type=\"button\"\n className=\"pv-filter-clear\"\n onClick={() => onFilterClear(filter.key)}\n >\n Clear\n </button>\n )}\n </>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </motion.aside>\n )}\n </AnimatePresence>,\n document.body\n );\n}\n"],"names":["useRef","useState","useEffect","createPortal","_jsx","AnimatePresence","motion","_jsxs","RangeHistogramFilter","_Fragment","renderOptionCount"],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var FilterPanel = require('./FilterPanel.js');
|
|
5
|
+
|
|
6
|
+
function FilterPanelContainer(props) {
|
|
7
|
+
return jsxRuntime.jsx(FilterPanel.FilterPanel, { ...props });
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
exports.FilterPanelContainer = FilterPanelContainer;
|
|
11
|
+
//# sourceMappingURL=FilterPanelContainer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilterPanelContainer.js","sources":["../../../../PivotViewer/components/FilterPanelContainer.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 { FilterPanel, type FilterPanelProps } from './FilterPanel';\n\nexport type FilterPanelContainerProps<TItem extends object> = FilterPanelProps<TItem>;\n\nexport function FilterPanelContainer<TItem extends object>(props: FilterPanelContainerProps<TItem>) {\n return <FilterPanel {...props} />;\n}\n"],"names":["_jsx","FilterPanel"],"mappings":";;;;;AAOM,SAAU,oBAAoB,CAAuB,KAAuC,EAAA;AAChG,IAAA,OAAOA,cAAA,CAACC,uBAAW,EAAA,EAAA,GAAK,KAAK,GAAI;AACnC;;;;"}
|
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
var PIXI = require('pixi.js');
|
|
5
|
+
var colorResolver = require('./pivot/colorResolver.js');
|
|
6
|
+
var sprites = require('./pivot/sprites.js');
|
|
7
|
+
var visibility = require('./pivot/visibility.js');
|
|
8
|
+
var buckets = require('./pivot/buckets.js');
|
|
9
|
+
var animation = require('./pivot/animation.js');
|
|
10
|
+
var constants = require('./pivot/constants.js');
|
|
11
|
+
|
|
12
|
+
function _interopNamespaceDefault(e) {
|
|
13
|
+
var n = Object.create(null);
|
|
14
|
+
if (e) {
|
|
15
|
+
Object.keys(e).forEach(function (k) {
|
|
16
|
+
if (k !== 'default') {
|
|
17
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
18
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: function () { return e[k]; }
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
n.default = e;
|
|
26
|
+
return Object.freeze(n);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
var PIXI__namespace = /*#__PURE__*/_interopNamespaceDefault(PIXI);
|
|
30
|
+
|
|
31
|
+
function PivotCanvas({ items, layout, grouping, visibleIds, cardWidth, cardHeight, zoomLevel, panX, panY, viewportWidth, viewportHeight, selectedId, hoveredGroupIndex, isZooming: _isZooming = false, resolveId: _resolveId, onCardClick, onPanStart, onPanMove, onPanEnd, viewMode, cardRenderer, containerRef, }) {
|
|
32
|
+
console.log('[PivotCanvas] Render', { viewMode });
|
|
33
|
+
const parentContainerRef = containerRef;
|
|
34
|
+
const canvasRef = React.useRef(null);
|
|
35
|
+
const spacerRef = React.useRef(null);
|
|
36
|
+
const appRef = React.useRef(null);
|
|
37
|
+
const rootRef = React.useRef(null);
|
|
38
|
+
const bucketsContainerRef = React.useRef(null);
|
|
39
|
+
const spritesRef = React.useRef(new Map());
|
|
40
|
+
const animationFrameRef = React.useRef(0);
|
|
41
|
+
const mountedRef = React.useRef(true);
|
|
42
|
+
const [pixiReady, setPixiReady] = React.useState(false);
|
|
43
|
+
const isAnimatingRef = React.useRef(false);
|
|
44
|
+
const needsRenderRef = React.useRef(false);
|
|
45
|
+
const initializingRef = React.useRef(false);
|
|
46
|
+
const isViewTransitionRef = React.useRef(false);
|
|
47
|
+
const lastViewChangeTimeRef = React.useRef(0);
|
|
48
|
+
const previousViewModeRef = React.useRef(viewMode);
|
|
49
|
+
const prevLayoutRef = React.useRef(null);
|
|
50
|
+
const prevGroupingRef = React.useRef(null);
|
|
51
|
+
const cardColorsRef = React.useRef(constants.DEFAULT_COLORS);
|
|
52
|
+
const cssColorResolver = React.useMemo(() => colorResolver.createCssColorResolver(), []);
|
|
53
|
+
const onPanStartRef = React.useRef(onPanStart);
|
|
54
|
+
const onPanMoveRef = React.useRef(onPanMove);
|
|
55
|
+
const onPanEndRef = React.useRef(onPanEnd);
|
|
56
|
+
const onCardClickRef = React.useRef(onCardClick);
|
|
57
|
+
const prevPanRef = React.useRef({ x: panX, y: panY });
|
|
58
|
+
React.useEffect(() => {
|
|
59
|
+
onPanMoveRef.current = onPanMove;
|
|
60
|
+
onPanEndRef.current = onPanEnd;
|
|
61
|
+
onCardClickRef.current = onCardClick;
|
|
62
|
+
}, [onPanStart, onPanMove, onPanEnd, onCardClick]);
|
|
63
|
+
React.useEffect(() => {
|
|
64
|
+
cardColorsRef.current = colorResolver.resolveCardColors(cssColorResolver);
|
|
65
|
+
}, [cssColorResolver]);
|
|
66
|
+
React.useEffect(() => {
|
|
67
|
+
mountedRef.current = true;
|
|
68
|
+
if (!parentContainerRef || !parentContainerRef.current) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (initializingRef.current || appRef.current) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
initializingRef.current = true;
|
|
75
|
+
let app = null;
|
|
76
|
+
(async () => {
|
|
77
|
+
try {
|
|
78
|
+
const options = {
|
|
79
|
+
backgroundAlpha: 0,
|
|
80
|
+
antialias: false,
|
|
81
|
+
autoStart: false,
|
|
82
|
+
autoDensity: true,
|
|
83
|
+
resolution: window.devicePixelRatio || 1,
|
|
84
|
+
width: viewportWidth > 0 ? viewportWidth : 800,
|
|
85
|
+
height: viewportHeight > 0 ? viewportHeight : 600,
|
|
86
|
+
};
|
|
87
|
+
app = new PIXI__namespace.Application();
|
|
88
|
+
if (app.init && typeof app.init === 'function') {
|
|
89
|
+
await app.init(options);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
app.destroy?.();
|
|
93
|
+
app = new PIXI__namespace.Application(options);
|
|
94
|
+
}
|
|
95
|
+
if (!mountedRef.current || !parentContainerRef.current) {
|
|
96
|
+
if (app && typeof app.destroy === 'function')
|
|
97
|
+
app.destroy(true, { children: true });
|
|
98
|
+
initializingRef.current = false;
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
appRef.current = app;
|
|
102
|
+
const bucketsContainer = new PIXI__namespace.Container();
|
|
103
|
+
bucketsContainerRef.current = bucketsContainer;
|
|
104
|
+
app.stage.addChild(bucketsContainer);
|
|
105
|
+
const root = new PIXI__namespace.Container();
|
|
106
|
+
rootRef.current = root;
|
|
107
|
+
app.stage.addChild(root);
|
|
108
|
+
const canvasEl = (app.view ?? app.canvas ?? app.renderer?.view);
|
|
109
|
+
const overlayParent = parentContainerRef.current.parentElement ?? parentContainerRef.current;
|
|
110
|
+
if (canvasEl) {
|
|
111
|
+
if (canvasEl.parentElement) {
|
|
112
|
+
canvasEl.parentElement.removeChild(canvasEl);
|
|
113
|
+
}
|
|
114
|
+
overlayParent.appendChild(canvasEl);
|
|
115
|
+
canvasRef.current = canvasEl;
|
|
116
|
+
}
|
|
117
|
+
else if (app.canvas) {
|
|
118
|
+
const c = app.canvas;
|
|
119
|
+
if (c.parentElement) {
|
|
120
|
+
c.parentElement.removeChild(c);
|
|
121
|
+
}
|
|
122
|
+
overlayParent.appendChild(c);
|
|
123
|
+
canvasRef.current = c;
|
|
124
|
+
}
|
|
125
|
+
if (canvasRef.current && parentContainerRef.current) {
|
|
126
|
+
const parentBounds = parentContainerRef.current.getBoundingClientRect();
|
|
127
|
+
void parentBounds;
|
|
128
|
+
canvasRef.current.style.position = 'absolute';
|
|
129
|
+
const offsetLeft = parentContainerRef.current.offsetLeft;
|
|
130
|
+
const offsetTop = parentContainerRef.current.offsetTop;
|
|
131
|
+
canvasRef.current.style.left = `${offsetLeft}px`;
|
|
132
|
+
canvasRef.current.style.top = `${offsetTop}px`;
|
|
133
|
+
canvasRef.current.style.width = `${parentContainerRef.current.clientWidth}px`;
|
|
134
|
+
canvasRef.current.style.height = `${parentContainerRef.current.clientHeight}px`;
|
|
135
|
+
canvasRef.current.style.zIndex = '0';
|
|
136
|
+
canvasRef.current.style.pointerEvents = 'none';
|
|
137
|
+
}
|
|
138
|
+
if (canvasRef.current) {
|
|
139
|
+
canvasRef.current.style.display = 'block';
|
|
140
|
+
canvasRef.current.style.pointerEvents = 'none';
|
|
141
|
+
}
|
|
142
|
+
app.stage.eventMode = 'static';
|
|
143
|
+
app.stage.hitArea = new PIXI__namespace.Rectangle(0, 0, viewportWidth, viewportHeight);
|
|
144
|
+
app.stage.on('pointerdown', (e) => {
|
|
145
|
+
onPanStartRef.current(e.nativeEvent);
|
|
146
|
+
});
|
|
147
|
+
app.stage.on('globalpointermove', (e) => {
|
|
148
|
+
onPanMoveRef.current(e.nativeEvent);
|
|
149
|
+
});
|
|
150
|
+
app.stage.on('globalpointerup', () => {
|
|
151
|
+
onPanEndRef.current();
|
|
152
|
+
});
|
|
153
|
+
const parentEl = parentContainerRef.current;
|
|
154
|
+
if (parentEl) {
|
|
155
|
+
}
|
|
156
|
+
if (viewportWidth > 0 && viewportHeight > 0) {
|
|
157
|
+
app.renderer?.resize(viewportWidth, viewportHeight);
|
|
158
|
+
}
|
|
159
|
+
setPixiReady(true);
|
|
160
|
+
initializingRef.current = false;
|
|
161
|
+
needsRenderRef.current = true;
|
|
162
|
+
app.renderer?.render(app.stage);
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
console.error('Failed to initialize Pixi.js:', error);
|
|
166
|
+
initializingRef.current = false;
|
|
167
|
+
}
|
|
168
|
+
})();
|
|
169
|
+
return () => {
|
|
170
|
+
mountedRef.current = false;
|
|
171
|
+
setPixiReady(false);
|
|
172
|
+
cancelAnimationFrame(animationFrameRef.current);
|
|
173
|
+
if (appRef.current && typeof appRef.current.destroy === 'function') {
|
|
174
|
+
appRef.current.destroy(true, { children: true });
|
|
175
|
+
appRef.current = null;
|
|
176
|
+
rootRef.current = null;
|
|
177
|
+
}
|
|
178
|
+
sprites.clearSpritePool();
|
|
179
|
+
try {
|
|
180
|
+
const parentEl = parentContainerRef.current;
|
|
181
|
+
if (parentEl) {
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
catch (e) {
|
|
185
|
+
}
|
|
186
|
+
try {
|
|
187
|
+
if (canvasRef.current && canvasRef.current.parentElement) {
|
|
188
|
+
canvasRef.current.parentElement.removeChild(canvasRef.current);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
catch (e) {
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
}, [viewportWidth, viewportHeight]);
|
|
195
|
+
React.useEffect(() => {
|
|
196
|
+
if (!parentContainerRef || !parentContainerRef.current || !appRef.current || !pixiReady)
|
|
197
|
+
return;
|
|
198
|
+
const container = parentContainerRef.current;
|
|
199
|
+
const app = appRef.current;
|
|
200
|
+
let resizeTimeout;
|
|
201
|
+
const handleResize = () => {
|
|
202
|
+
if (viewportWidth > 0 && viewportHeight > 0) {
|
|
203
|
+
app.renderer?.resize(viewportWidth, viewportHeight);
|
|
204
|
+
app.stage.hitArea = new PIXI__namespace.Rectangle(0, 0, viewportWidth, viewportHeight);
|
|
205
|
+
if (canvasRef.current && parentContainerRef.current) {
|
|
206
|
+
canvasRef.current.style.width = `${parentContainerRef.current.clientWidth}px`;
|
|
207
|
+
canvasRef.current.style.height = `${parentContainerRef.current.clientHeight}px`;
|
|
208
|
+
canvasRef.current.style.left = `${parentContainerRef.current.offsetLeft}px`;
|
|
209
|
+
canvasRef.current.style.top = `${parentContainerRef.current.offsetTop}px`;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
};
|
|
213
|
+
const debouncedResize = () => {
|
|
214
|
+
clearTimeout(resizeTimeout);
|
|
215
|
+
resizeTimeout = setTimeout(handleResize, 150);
|
|
216
|
+
};
|
|
217
|
+
handleResize();
|
|
218
|
+
const resizeObserver = new ResizeObserver(debouncedResize);
|
|
219
|
+
resizeObserver.observe(container);
|
|
220
|
+
return () => {
|
|
221
|
+
clearTimeout(resizeTimeout);
|
|
222
|
+
resizeObserver.disconnect();
|
|
223
|
+
};
|
|
224
|
+
}, [pixiReady, viewportWidth, viewportHeight]);
|
|
225
|
+
React.useEffect(() => {
|
|
226
|
+
if (!bucketsContainerRef.current || !pixiReady)
|
|
227
|
+
return;
|
|
228
|
+
buckets.updateBucketBackgrounds(bucketsContainerRef.current, parentContainerRef.current, grouping, layout, zoomLevel, cardColorsRef.current, viewMode);
|
|
229
|
+
needsRenderRef.current = true;
|
|
230
|
+
appRef.current?.renderer?.render(appRef.current.stage);
|
|
231
|
+
}, [grouping, layout, zoomLevel, viewMode, pixiReady]);
|
|
232
|
+
React.useEffect(() => {
|
|
233
|
+
if (!rootRef.current || !pixiReady) {
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
const viewModeChanged = previousViewModeRef.current !== viewMode;
|
|
237
|
+
const groupingChanged = prevGroupingRef.current !== grouping;
|
|
238
|
+
if (viewModeChanged || groupingChanged) {
|
|
239
|
+
isViewTransitionRef.current = true;
|
|
240
|
+
lastViewChangeTimeRef.current = Date.now();
|
|
241
|
+
previousViewModeRef.current = viewMode;
|
|
242
|
+
prevGroupingRef.current = grouping;
|
|
243
|
+
}
|
|
244
|
+
if (spacerRef.current) {
|
|
245
|
+
const spacer = spacerRef.current;
|
|
246
|
+
const worldWidth = (layout.totalWidth || viewportWidth) * zoomLevel;
|
|
247
|
+
const worldHeight = (layout.totalHeight || viewportHeight) * zoomLevel;
|
|
248
|
+
spacer.style.width = `${Math.max(worldWidth, viewportWidth)}px`;
|
|
249
|
+
spacer.style.height = `${Math.max(worldHeight, viewportHeight)}px`;
|
|
250
|
+
}
|
|
251
|
+
if (parentContainerRef.current) {
|
|
252
|
+
spacerRef.current;
|
|
253
|
+
}
|
|
254
|
+
const panDeltaX = panX - prevPanRef.current.x;
|
|
255
|
+
const panDeltaY = panY - prevPanRef.current.y;
|
|
256
|
+
prevPanRef.current = { x: panX, y: panY };
|
|
257
|
+
visibility.syncSpritesToViewport({
|
|
258
|
+
root: rootRef.current,
|
|
259
|
+
container: parentContainerRef.current,
|
|
260
|
+
sprites: spritesRef.current,
|
|
261
|
+
layout,
|
|
262
|
+
visibleIds,
|
|
263
|
+
items,
|
|
264
|
+
cardWidth,
|
|
265
|
+
cardHeight,
|
|
266
|
+
panX,
|
|
267
|
+
panY,
|
|
268
|
+
panDeltaX,
|
|
269
|
+
panDeltaY,
|
|
270
|
+
zoomLevel,
|
|
271
|
+
viewportWidth,
|
|
272
|
+
viewportHeight,
|
|
273
|
+
createCardSprite: (id, x, y) => sprites.createCardSprite(id, x, y, items, (item, e, id) => onCardClickRef.current(item, e, id), onPanStart, cardWidth, cardHeight, cardColorsRef.current),
|
|
274
|
+
updateCardContent: (sprite, item) => sprites.updateCardContent(sprite, item, selectedId, cardWidth, cardHeight, cardColorsRef.current),
|
|
275
|
+
isViewTransition: isViewTransitionRef.current || (Date.now() - lastViewChangeTimeRef.current < 1000),
|
|
276
|
+
prevLayout: prevLayoutRef.current,
|
|
277
|
+
});
|
|
278
|
+
needsRenderRef.current = true;
|
|
279
|
+
animation.startAnimationLoop({
|
|
280
|
+
mountedRef,
|
|
281
|
+
appRef,
|
|
282
|
+
animationFrameRef,
|
|
283
|
+
isAnimatingRef,
|
|
284
|
+
needsRenderRef,
|
|
285
|
+
spritesRef,
|
|
286
|
+
isViewTransitionRef,
|
|
287
|
+
});
|
|
288
|
+
}, [layout, visibleIds, items, cardWidth, cardHeight, pixiReady, zoomLevel, panX, panY, grouping, viewMode]);
|
|
289
|
+
React.useEffect(() => {
|
|
290
|
+
prevLayoutRef.current = layout;
|
|
291
|
+
}, [layout]);
|
|
292
|
+
React.useEffect(() => {
|
|
293
|
+
if (!rootRef.current || !bucketsContainerRef.current)
|
|
294
|
+
return;
|
|
295
|
+
const effectivePanX = parentContainerRef.current ? parentContainerRef.current.scrollLeft : panX;
|
|
296
|
+
const effectivePanY = parentContainerRef.current ? parentContainerRef.current.scrollTop : panY;
|
|
297
|
+
rootRef.current.scale.set(zoomLevel);
|
|
298
|
+
bucketsContainerRef.current.scale.set(zoomLevel);
|
|
299
|
+
rootRef.current.position.set(-effectivePanX, -effectivePanY);
|
|
300
|
+
bucketsContainerRef.current.position.set(-effectivePanX, -effectivePanY);
|
|
301
|
+
appRef.current?.renderer?.render(appRef.current.stage);
|
|
302
|
+
}, [zoomLevel, panX, panY]);
|
|
303
|
+
React.useEffect(() => {
|
|
304
|
+
if (!rootRef.current)
|
|
305
|
+
return;
|
|
306
|
+
updateSelection();
|
|
307
|
+
needsRenderRef.current = true;
|
|
308
|
+
appRef.current?.renderer.render(appRef.current.stage);
|
|
309
|
+
}, [selectedId, items]);
|
|
310
|
+
React.useEffect(() => {
|
|
311
|
+
if (!rootRef.current)
|
|
312
|
+
return;
|
|
313
|
+
updateHighlight();
|
|
314
|
+
needsRenderRef.current = true;
|
|
315
|
+
appRef.current?.renderer.render(appRef.current.stage);
|
|
316
|
+
}, [hoveredGroupIndex, layout, grouping]);
|
|
317
|
+
React.useEffect(() => {
|
|
318
|
+
if (!pixiReady || !parentContainerRef || !parentContainerRef.current || !appRef.current || !rootRef.current)
|
|
319
|
+
return;
|
|
320
|
+
const container = parentContainerRef.current;
|
|
321
|
+
const app = appRef.current;
|
|
322
|
+
const lastScroll = { x: container.scrollLeft, y: container.scrollTop };
|
|
323
|
+
const pendingRef = { scheduled: false };
|
|
324
|
+
const processScroll = () => {
|
|
325
|
+
pendingRef.scheduled = false;
|
|
326
|
+
try {
|
|
327
|
+
const effectivePanX = container.scrollLeft;
|
|
328
|
+
const effectivePanY = container.scrollTop;
|
|
329
|
+
lastScroll.x = effectivePanX;
|
|
330
|
+
lastScroll.y = effectivePanY;
|
|
331
|
+
if (rootRef.current && bucketsContainerRef.current) {
|
|
332
|
+
rootRef.current.scale.set(zoomLevel);
|
|
333
|
+
bucketsContainerRef.current.scale.set(zoomLevel);
|
|
334
|
+
const invScale = zoomLevel && zoomLevel !== 0 ? 1 / zoomLevel : 1;
|
|
335
|
+
void invScale;
|
|
336
|
+
rootRef.current.position.set(-effectivePanX, -effectivePanY);
|
|
337
|
+
bucketsContainerRef.current.position.set(-effectivePanX, -effectivePanY);
|
|
338
|
+
}
|
|
339
|
+
visibility.syncSpritesToViewport({
|
|
340
|
+
root: rootRef.current,
|
|
341
|
+
container: parentContainerRef.current,
|
|
342
|
+
sprites: spritesRef.current,
|
|
343
|
+
layout,
|
|
344
|
+
visibleIds,
|
|
345
|
+
items,
|
|
346
|
+
cardWidth,
|
|
347
|
+
cardHeight,
|
|
348
|
+
panX,
|
|
349
|
+
panY,
|
|
350
|
+
zoomLevel,
|
|
351
|
+
viewportWidth,
|
|
352
|
+
viewportHeight,
|
|
353
|
+
createCardSprite: (id, x, y) => sprites.createCardSprite(id, x, y, items, (item, e, id) => onCardClickRef.current(item, e, id), (e) => onPanStartRef.current(e, true), cardWidth, cardHeight, cardColorsRef.current),
|
|
354
|
+
updateCardContent: (sprite, item) => sprites.updateCardContent(sprite, item, selectedId, cardWidth, cardHeight, cardColorsRef.current),
|
|
355
|
+
isViewTransition: isViewTransitionRef.current || (Date.now() - lastViewChangeTimeRef.current < 1000),
|
|
356
|
+
});
|
|
357
|
+
needsRenderRef.current = true;
|
|
358
|
+
app.renderer?.render(app.stage);
|
|
359
|
+
}
|
|
360
|
+
catch (e) {
|
|
361
|
+
console.error('[PivotCanvas] processScroll error', e);
|
|
362
|
+
}
|
|
363
|
+
};
|
|
364
|
+
const onScroll = () => {
|
|
365
|
+
lastScroll.x = container.scrollLeft;
|
|
366
|
+
lastScroll.y = container.scrollTop;
|
|
367
|
+
if (!pendingRef.scheduled) {
|
|
368
|
+
pendingRef.scheduled = true;
|
|
369
|
+
requestAnimationFrame(processScroll);
|
|
370
|
+
}
|
|
371
|
+
};
|
|
372
|
+
container.addEventListener('scroll', onScroll, { passive: true });
|
|
373
|
+
return () => {
|
|
374
|
+
container.removeEventListener('scroll', onScroll);
|
|
375
|
+
};
|
|
376
|
+
}, [pixiReady, layout, visibleIds, items, cardWidth, cardHeight, zoomLevel, viewportWidth, viewportHeight, panX, panY, grouping, viewMode, selectedId, onCardClick, onPanStart]);
|
|
377
|
+
function updateCardContent(sprite, item) {
|
|
378
|
+
return sprites.updateCardContent(sprite, item, selectedId, cardWidth, cardHeight, cardColorsRef.current);
|
|
379
|
+
}
|
|
380
|
+
function updateSelection() {
|
|
381
|
+
const sprites = spritesRef.current;
|
|
382
|
+
for (const sprite of sprites.values()) {
|
|
383
|
+
const val = items[String(sprite.itemId)];
|
|
384
|
+
updateCardContent(sprite, val);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
function updateHighlight() {
|
|
388
|
+
buckets.updateHighlight(bucketsContainerRef.current, parentContainerRef.current, grouping, layout, hoveredGroupIndex, cardWidth);
|
|
389
|
+
}
|
|
390
|
+
return null;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
exports.PivotCanvas = PivotCanvas;
|
|
394
|
+
//# sourceMappingURL=PivotCanvas.js.map
|