@umodeapporg/ui 0.1.0
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/dist/assets/images/common-pngs/sparkles.png.js +5 -0
- package/dist/assets/images/common-pngs/sparkles.png.js.map +1 -0
- package/dist/assets/umode-ui.css +182 -0
- package/dist/components/DateTime/DatePicker.d.ts +19 -0
- package/dist/components/DateTime/DatePicker.js +121 -0
- package/dist/components/DateTime/DatePicker.js.map +1 -0
- package/dist/components/DateTime/DateRangePicker.d.ts +19 -0
- package/dist/components/DateTime/DateRangePicker.js +205 -0
- package/dist/components/DateTime/DateRangePicker.js.map +1 -0
- package/dist/components/Form/ControlledButton.d.ts +13 -0
- package/dist/components/Form/ControlledButton.js +68 -0
- package/dist/components/Form/ControlledButton.js.map +1 -0
- package/dist/components/Form/ControlledCheckbox.d.ts +12 -0
- package/dist/components/Form/ControlledCheckbox.js +101 -0
- package/dist/components/Form/ControlledCheckbox.js.map +1 -0
- package/dist/components/Form/ControlledDialog.d.ts +44 -0
- package/dist/components/Form/ControlledDialog.js +185 -0
- package/dist/components/Form/ControlledDialog.js.map +1 -0
- package/dist/components/Form/ControlledDialogPrimitives.d.ts +30 -0
- package/dist/components/Form/ControlledDialogPrimitives.js +121 -0
- package/dist/components/Form/ControlledDialogPrimitives.js.map +1 -0
- package/dist/components/Form/ControlledDrawer.d.ts +37 -0
- package/dist/components/Form/ControlledDrawer.js +237 -0
- package/dist/components/Form/ControlledDrawer.js.map +1 -0
- package/dist/components/Form/ControlledForm/InputField.d.ts +11 -0
- package/dist/components/Form/ControlledForm/InputField.js +75 -0
- package/dist/components/Form/ControlledForm/InputField.js.map +1 -0
- package/dist/components/Form/ControlledForm/index.d.ts +27 -0
- package/dist/components/Form/ControlledForm/index.js +113 -0
- package/dist/components/Form/ControlledForm/index.js.map +1 -0
- package/dist/components/Form/ControlledImage/Img.d.ts +11 -0
- package/dist/components/Form/ControlledImage/Img.js +29 -0
- package/dist/components/Form/ControlledImage/Img.js.map +1 -0
- package/dist/components/Form/ControlledImage/index.d.ts +30 -0
- package/dist/components/Form/ControlledImage/index.js +107 -0
- package/dist/components/Form/ControlledImage/index.js.map +1 -0
- package/dist/components/Form/ControlledImage/useImage.d.ts +9 -0
- package/dist/components/Form/ControlledImage/useImage.js +110 -0
- package/dist/components/Form/ControlledImage/useImage.js.map +1 -0
- package/dist/components/Form/ControlledInput.d.ts +23 -0
- package/dist/components/Form/ControlledInput.js +52 -0
- package/dist/components/Form/ControlledInput.js.map +1 -0
- package/dist/components/Form/ControlledRadio.d.ts +15 -0
- package/dist/components/Form/ControlledRadio.js +91 -0
- package/dist/components/Form/ControlledRadio.js.map +1 -0
- package/dist/components/Form/ControlledSelect.d.ts +44 -0
- package/dist/components/Form/ControlledSelect.js +545 -0
- package/dist/components/Form/ControlledSelect.js.map +1 -0
- package/dist/components/Form/ControlledSwitch.d.ts +14 -0
- package/dist/components/Form/ControlledSwitch.js +88 -0
- package/dist/components/Form/ControlledSwitch.js.map +1 -0
- package/dist/components/Form/ControlledTabs.d.ts +70 -0
- package/dist/components/Form/ControlledTabs.js +470 -0
- package/dist/components/Form/ControlledTabs.js.map +1 -0
- package/dist/components/Form/ControlledTabsPrimitives.d.ts +43 -0
- package/dist/components/Form/ControlledTabsPrimitives.js +47 -0
- package/dist/components/Form/ControlledTabsPrimitives.js.map +1 -0
- package/dist/components/Form/ControlledTextarea.d.ts +22 -0
- package/dist/components/Form/ControlledTextarea.js +46 -0
- package/dist/components/Form/ControlledTextarea.js.map +1 -0
- package/dist/components/Form/ControlledTimeline.d.ts +26 -0
- package/dist/components/Form/ControlledTimeline.js +57 -0
- package/dist/components/Form/ControlledTimeline.js.map +1 -0
- package/dist/components/Form/ControlledViewToggle.d.ts +74 -0
- package/dist/components/Form/ControlledViewToggle.js +157 -0
- package/dist/components/Form/ControlledViewToggle.js.map +1 -0
- package/dist/components/Form/ControlledVoiceTextarea.d.ts +11 -0
- package/dist/components/Form/ControlledVoiceTextarea.js +88 -0
- package/dist/components/Form/ControlledVoiceTextarea.js.map +1 -0
- package/dist/components/Form/CurrencyInput.d.ts +8 -0
- package/dist/components/Form/CurrencyInput.js +17 -0
- package/dist/components/Form/CurrencyInput.js.map +1 -0
- package/dist/components/Form/RichTextEditor.d.ts +80 -0
- package/dist/components/Form/RichTextEditor.js +546 -0
- package/dist/components/Form/RichTextEditor.js.map +1 -0
- package/dist/components/Form/attachments/AttachmentPreviewList.d.ts +8 -0
- package/dist/components/Form/attachments/AttachmentPreviewList.js +71 -0
- package/dist/components/Form/attachments/AttachmentPreviewList.js.map +1 -0
- package/dist/components/Form/attachments/FileDropzone.d.ts +12 -0
- package/dist/components/Form/attachments/FileDropzone.js +84 -0
- package/dist/components/Form/attachments/FileDropzone.js.map +1 -0
- package/dist/components/Navigation/ControlledBreadcrumb.d.ts +13 -0
- package/dist/components/Navigation/ControlledBreadcrumb.js +23 -0
- package/dist/components/Navigation/ControlledBreadcrumb.js.map +1 -0
- package/dist/components/Navigation/ErrorPage.d.ts +2 -0
- package/dist/components/Navigation/ErrorPage.js +27 -0
- package/dist/components/Navigation/ErrorPage.js.map +1 -0
- package/dist/components/Navigation/PageTitle.d.ts +41 -0
- package/dist/components/Navigation/PageTitle.js +147 -0
- package/dist/components/Navigation/PageTitle.js.map +1 -0
- package/dist/components/Navigation/PageTitleNavigationContext.d.ts +21 -0
- package/dist/components/Navigation/PageTitleNavigationContext.js +17 -0
- package/dist/components/Navigation/PageTitleNavigationContext.js.map +1 -0
- package/dist/components/Search/UnifiedSearchBar.d.ts +31 -0
- package/dist/components/Search/UnifiedSearchBar.js +167 -0
- package/dist/components/Search/UnifiedSearchBar.js.map +1 -0
- package/dist/components/Search/filters/ActiveFiltersBar.d.ts +15 -0
- package/dist/components/Search/filters/ActiveFiltersBar.js +48 -0
- package/dist/components/Search/filters/ActiveFiltersBar.js.map +1 -0
- package/dist/components/Search/filters/FilterChipsRow.d.ts +17 -0
- package/dist/components/Search/filters/FilterChipsRow.js +113 -0
- package/dist/components/Search/filters/FilterChipsRow.js.map +1 -0
- package/dist/components/Search/filters/FilterFieldControl.d.ts +19 -0
- package/dist/components/Search/filters/FilterFieldControl.js +387 -0
- package/dist/components/Search/filters/FilterFieldControl.js.map +1 -0
- package/dist/components/Search/filters/FiltersButton.d.ts +24 -0
- package/dist/components/Search/filters/FiltersButton.js +52 -0
- package/dist/components/Search/filters/FiltersButton.js.map +1 -0
- package/dist/components/Search/filters/FiltersForm.d.ts +18 -0
- package/dist/components/Search/filters/FiltersForm.js +112 -0
- package/dist/components/Search/filters/FiltersForm.js.map +1 -0
- package/dist/components/Search/filters/FiltersPanel.d.ts +32 -0
- package/dist/components/Search/filters/FiltersPanel.js +264 -0
- package/dist/components/Search/filters/FiltersPanel.js.map +1 -0
- package/dist/components/Search/filters/FiltersSummaryTooltip.d.ts +20 -0
- package/dist/components/Search/filters/FiltersSummaryTooltip.js +26 -0
- package/dist/components/Search/filters/FiltersSummaryTooltip.js.map +1 -0
- package/dist/components/Search/filters/filterTypes.d.ts +162 -0
- package/dist/components/Search/filters/filterTypes.js +2 -0
- package/dist/components/Search/filters/filterTypes.js.map +1 -0
- package/dist/components/Search/filters/filterValues.d.ts +22 -0
- package/dist/components/Search/filters/filterValues.js +91 -0
- package/dist/components/Search/filters/filterValues.js.map +1 -0
- package/dist/components/Search/filters/filtersLayout.d.ts +4 -0
- package/dist/components/Search/filters/filtersLayout.js +18 -0
- package/dist/components/Search/filters/filtersLayout.js.map +1 -0
- package/dist/components/Search/filters/index.d.ts +11 -0
- package/dist/components/Search/filters/index.js +32 -0
- package/dist/components/Search/filters/index.js.map +1 -0
- package/dist/components/Search/filters/useFilters.d.ts +33 -0
- package/dist/components/Search/filters/useFilters.js +162 -0
- package/dist/components/Search/filters/useFilters.js.map +1 -0
- package/dist/components/Search/index.d.ts +2 -0
- package/dist/components/Search/index.js +34 -0
- package/dist/components/Search/index.js.map +1 -0
- package/dist/components/UI/AccordionIcon.d.ts +10 -0
- package/dist/components/UI/AccordionIcon.js +22 -0
- package/dist/components/UI/AccordionIcon.js.map +1 -0
- package/dist/components/UI/AlertInfo/dismissedAlertsStore.d.ts +2 -0
- package/dist/components/UI/AlertInfo/dismissedAlertsStore.js +22 -0
- package/dist/components/UI/AlertInfo/dismissedAlertsStore.js.map +1 -0
- package/dist/components/UI/AlertInfo/index.d.ts +30 -0
- package/dist/components/UI/AlertInfo/index.js +78 -0
- package/dist/components/UI/AlertInfo/index.js.map +1 -0
- package/dist/components/UI/BaseDataCard.d.ts +25 -0
- package/dist/components/UI/BaseDataCard.js +163 -0
- package/dist/components/UI/BaseDataCard.js.map +1 -0
- package/dist/components/UI/BulkActionBar.d.ts +35 -0
- package/dist/components/UI/BulkActionBar.js +125 -0
- package/dist/components/UI/BulkActionBar.js.map +1 -0
- package/dist/components/UI/Chips/OutlinedChip.d.ts +42 -0
- package/dist/components/UI/Chips/OutlinedChip.js +183 -0
- package/dist/components/UI/Chips/OutlinedChip.js.map +1 -0
- package/dist/components/UI/Chips/StatusChip.d.ts +8 -0
- package/dist/components/UI/Chips/StatusChip.js +33 -0
- package/dist/components/UI/Chips/StatusChip.js.map +1 -0
- package/dist/components/UI/Chips/chipTones.d.ts +6 -0
- package/dist/components/UI/Chips/chipTones.js +53 -0
- package/dist/components/UI/Chips/chipTones.js.map +1 -0
- package/dist/components/UI/ColorSwatch.d.ts +30 -0
- package/dist/components/UI/ColorSwatch.js +53 -0
- package/dist/components/UI/ColorSwatch.js.map +1 -0
- package/dist/components/UI/Colors.d.ts +10 -0
- package/dist/components/UI/Colors.js +41 -0
- package/dist/components/UI/Colors.js.map +1 -0
- package/dist/components/UI/ControlledAccordion.d.ts +38 -0
- package/dist/components/UI/ControlledAccordion.js +89 -0
- package/dist/components/UI/ControlledAccordion.js.map +1 -0
- package/dist/components/UI/ControlledCollapse.d.ts +13 -0
- package/dist/components/UI/ControlledCollapse.js +32 -0
- package/dist/components/UI/ControlledCollapse.js.map +1 -0
- package/dist/components/UI/ControlledMenu.d.ts +73 -0
- package/dist/components/UI/ControlledMenu.js +231 -0
- package/dist/components/UI/ControlledMenu.js.map +1 -0
- package/dist/components/UI/ControlledPopover.d.ts +44 -0
- package/dist/components/UI/ControlledPopover.js +144 -0
- package/dist/components/UI/ControlledPopover.js.map +1 -0
- package/dist/components/UI/ControlledProgress.d.ts +13 -0
- package/dist/components/UI/ControlledProgress.js +46 -0
- package/dist/components/UI/ControlledProgress.js.map +1 -0
- package/dist/components/UI/ControlledSlider.d.ts +13 -0
- package/dist/components/UI/ControlledSlider.js +29 -0
- package/dist/components/UI/ControlledSlider.js.map +1 -0
- package/dist/components/UI/ControlledTooltip.d.ts +21 -0
- package/dist/components/UI/ControlledTooltip.js +140 -0
- package/dist/components/UI/ControlledTooltip.js.map +1 -0
- package/dist/components/UI/CustomBadge.d.ts +15 -0
- package/dist/components/UI/CustomBadge.js +34 -0
- package/dist/components/UI/CustomBadge.js.map +1 -0
- package/dist/components/UI/CustomCard.d.ts +13 -0
- package/dist/components/UI/CustomCard.js +36 -0
- package/dist/components/UI/CustomCard.js.map +1 -0
- package/dist/components/UI/CustomChart.d.ts +21 -0
- package/dist/components/UI/CustomChart.js +108 -0
- package/dist/components/UI/CustomChart.js.map +1 -0
- package/dist/components/UI/DataTable/DataTable.d.ts +100 -0
- package/dist/components/UI/DataTable/DataTable.js +546 -0
- package/dist/components/UI/DataTable/DataTable.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableAutoCard.d.ts +20 -0
- package/dist/components/UI/DataTable/DataTableAutoCard.js +39 -0
- package/dist/components/UI/DataTable/DataTableAutoCard.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableBody.d.ts +29 -0
- package/dist/components/UI/DataTable/DataTableBody.js +243 -0
- package/dist/components/UI/DataTable/DataTableBody.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableBodyCell.d.ts +21 -0
- package/dist/components/UI/DataTable/DataTableBodyCell.js +77 -0
- package/dist/components/UI/DataTable/DataTableBodyCell.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableBulkEditButton.d.ts +11 -0
- package/dist/components/UI/DataTable/DataTableBulkEditButton.js +24 -0
- package/dist/components/UI/DataTable/DataTableBulkEditButton.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableBulkEditDialog.d.ts +25 -0
- package/dist/components/UI/DataTable/DataTableBulkEditDialog.js +251 -0
- package/dist/components/UI/DataTable/DataTableBulkEditDialog.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableColumnToggle.d.ts +34 -0
- package/dist/components/UI/DataTable/DataTableColumnToggle.js +168 -0
- package/dist/components/UI/DataTable/DataTableColumnToggle.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableDetailModal.d.ts +17 -0
- package/dist/components/UI/DataTable/DataTableDetailModal.js +109 -0
- package/dist/components/UI/DataTable/DataTableDetailModal.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableDetailPanel.d.ts +21 -0
- package/dist/components/UI/DataTable/DataTableDetailPanel.js +51 -0
- package/dist/components/UI/DataTable/DataTableDetailPanel.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableDetailTable.d.ts +35 -0
- package/dist/components/UI/DataTable/DataTableDetailTable.js +129 -0
- package/dist/components/UI/DataTable/DataTableDetailTable.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableEditModeButton.d.ts +12 -0
- package/dist/components/UI/DataTable/DataTableEditModeButton.js +29 -0
- package/dist/components/UI/DataTable/DataTableEditModeButton.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableFilters.d.ts +20 -0
- package/dist/components/UI/DataTable/DataTableFilters.js +64 -0
- package/dist/components/UI/DataTable/DataTableFilters.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableHead.d.ts +27 -0
- package/dist/components/UI/DataTable/DataTableHead.js +198 -0
- package/dist/components/UI/DataTable/DataTableHead.js.map +1 -0
- package/dist/components/UI/DataTable/DataTablePagination.d.ts +15 -0
- package/dist/components/UI/DataTable/DataTablePagination.js +145 -0
- package/dist/components/UI/DataTable/DataTablePagination.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableSaveButton.d.ts +13 -0
- package/dist/components/UI/DataTable/DataTableSaveButton.js +21 -0
- package/dist/components/UI/DataTable/DataTableSaveButton.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableSegmentedTabs.d.ts +8 -0
- package/dist/components/UI/DataTable/DataTableSegmentedTabs.js +35 -0
- package/dist/components/UI/DataTable/DataTableSegmentedTabs.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableStates.d.ts +17 -0
- package/dist/components/UI/DataTable/DataTableStates.js +59 -0
- package/dist/components/UI/DataTable/DataTableStates.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableToolbar.d.ts +28 -0
- package/dist/components/UI/DataTable/DataTableToolbar.js +109 -0
- package/dist/components/UI/DataTable/DataTableToolbar.js.map +1 -0
- package/dist/components/UI/DataTable/applyDataTableFilters.d.ts +16 -0
- package/dist/components/UI/DataTable/applyDataTableFilters.js +53 -0
- package/dist/components/UI/DataTable/applyDataTableFilters.js.map +1 -0
- package/dist/components/UI/DataTable/cells/DataTableActionsCell.d.ts +7 -0
- package/dist/components/UI/DataTable/cells/DataTableActionsCell.js +55 -0
- package/dist/components/UI/DataTable/cells/DataTableActionsCell.js.map +1 -0
- package/dist/components/UI/DataTable/cells/DataTableCell.d.ts +15 -0
- package/dist/components/UI/DataTable/cells/DataTableCell.js +63 -0
- package/dist/components/UI/DataTable/cells/DataTableCell.js.map +1 -0
- package/dist/components/UI/DataTable/cells/DataTableCodeCell.d.ts +6 -0
- package/dist/components/UI/DataTable/cells/DataTableCodeCell.js +7 -0
- package/dist/components/UI/DataTable/cells/DataTableCodeCell.js.map +1 -0
- package/dist/components/UI/DataTable/cells/DataTableColorCell.d.ts +7 -0
- package/dist/components/UI/DataTable/cells/DataTableColorCell.js +10 -0
- package/dist/components/UI/DataTable/cells/DataTableColorCell.js.map +1 -0
- package/dist/components/UI/DataTable/cells/DataTableCountCell.d.ts +5 -0
- package/dist/components/UI/DataTable/cells/DataTableCountCell.js +7 -0
- package/dist/components/UI/DataTable/cells/DataTableCountCell.js.map +1 -0
- package/dist/components/UI/DataTable/cells/DataTableDateCell.d.ts +5 -0
- package/dist/components/UI/DataTable/cells/DataTableDateCell.js +12 -0
- package/dist/components/UI/DataTable/cells/DataTableDateCell.js.map +1 -0
- package/dist/components/UI/DataTable/cells/DataTableEditableCell.d.ts +23 -0
- package/dist/components/UI/DataTable/cells/DataTableEditableCell.js +242 -0
- package/dist/components/UI/DataTable/cells/DataTableEditableCell.js.map +1 -0
- package/dist/components/UI/DataTable/cells/DataTableEmpenhoCell.d.ts +10 -0
- package/dist/components/UI/DataTable/cells/DataTableEmpenhoCell.js +7 -0
- package/dist/components/UI/DataTable/cells/DataTableEmpenhoCell.js.map +1 -0
- package/dist/components/UI/DataTable/cells/DataTableOriginCell.d.ts +6 -0
- package/dist/components/UI/DataTable/cells/DataTableOriginCell.js +25 -0
- package/dist/components/UI/DataTable/cells/DataTableOriginCell.js.map +1 -0
- package/dist/components/UI/DataTable/cells/DataTableStatusCell.d.ts +6 -0
- package/dist/components/UI/DataTable/cells/DataTableStatusCell.js +24 -0
- package/dist/components/UI/DataTable/cells/DataTableStatusCell.js.map +1 -0
- package/dist/components/UI/DataTable/cells/DataTableTagCell.d.ts +6 -0
- package/dist/components/UI/DataTable/cells/DataTableTagCell.js +25 -0
- package/dist/components/UI/DataTable/cells/DataTableTagCell.js.map +1 -0
- package/dist/components/UI/DataTable/cells/DataTableTextCell.d.ts +6 -0
- package/dist/components/UI/DataTable/cells/DataTableTextCell.js +7 -0
- package/dist/components/UI/DataTable/cells/DataTableTextCell.js.map +1 -0
- package/dist/components/UI/DataTable/cells/DataTableThumbnailCell.d.ts +6 -0
- package/dist/components/UI/DataTable/cells/DataTableThumbnailCell.js +10 -0
- package/dist/components/UI/DataTable/cells/DataTableThumbnailCell.js.map +1 -0
- package/dist/components/UI/DataTable/dataTableClasses.d.ts +12 -0
- package/dist/components/UI/DataTable/dataTableClasses.js +29 -0
- package/dist/components/UI/DataTable/dataTableClasses.js.map +1 -0
- package/dist/components/UI/DataTable/dataTableColumnWidths.d.ts +15 -0
- package/dist/components/UI/DataTable/dataTableColumnWidths.js +153 -0
- package/dist/components/UI/DataTable/dataTableColumnWidths.js.map +1 -0
- package/dist/components/UI/DataTable/dataTableColumnsStore.d.ts +12 -0
- package/dist/components/UI/DataTable/dataTableColumnsStore.js +68 -0
- package/dist/components/UI/DataTable/dataTableColumnsStore.js.map +1 -0
- package/dist/components/UI/DataTable/dataTableMotion.d.ts +6 -0
- package/dist/components/UI/DataTable/dataTableMotion.js +15 -0
- package/dist/components/UI/DataTable/dataTableMotion.js.map +1 -0
- package/dist/components/UI/DataTable/grid/GridFillHandle.d.ts +8 -0
- package/dist/components/UI/DataTable/grid/GridFillHandle.js +70 -0
- package/dist/components/UI/DataTable/grid/GridFillHandle.js.map +1 -0
- package/dist/components/UI/DataTable/grid/GridProvider.d.ts +31 -0
- package/dist/components/UI/DataTable/grid/GridProvider.js +85 -0
- package/dist/components/UI/DataTable/grid/GridProvider.js.map +1 -0
- package/dist/components/UI/DataTable/grid/fill/fillStrategies.d.ts +19 -0
- package/dist/components/UI/DataTable/grid/fill/fillStrategies.js +73 -0
- package/dist/components/UI/DataTable/grid/fill/fillStrategies.js.map +1 -0
- package/dist/components/UI/DataTable/grid/gridStore.d.ts +69 -0
- package/dist/components/UI/DataTable/grid/gridStore.js +219 -0
- package/dist/components/UI/DataTable/grid/gridStore.js.map +1 -0
- package/dist/components/UI/DataTable/grid/gridTypes.d.ts +47 -0
- package/dist/components/UI/DataTable/grid/gridTypes.js +27 -0
- package/dist/components/UI/DataTable/grid/gridTypes.js.map +1 -0
- package/dist/components/UI/DataTable/grid/useGridFillApply.d.ts +18 -0
- package/dist/components/UI/DataTable/grid/useGridFillApply.js +74 -0
- package/dist/components/UI/DataTable/grid/useGridFillApply.js.map +1 -0
- package/dist/components/UI/DataTable/grid/useGridInstance.d.ts +27 -0
- package/dist/components/UI/DataTable/grid/useGridInstance.js +41 -0
- package/dist/components/UI/DataTable/grid/useGridInstance.js.map +1 -0
- package/dist/components/UI/DataTable/grid/useGridKeyboard.d.ts +17 -0
- package/dist/components/UI/DataTable/grid/useGridKeyboard.js +114 -0
- package/dist/components/UI/DataTable/grid/useGridKeyboard.js.map +1 -0
- package/dist/components/UI/DataTable/index.d.ts +19 -0
- package/dist/components/UI/DataTable/index.js +34 -0
- package/dist/components/UI/DataTable/index.js.map +1 -0
- package/dist/components/UI/DataTable/types.d.ts +513 -0
- package/dist/components/UI/DataTable/types.js +13 -0
- package/dist/components/UI/DataTable/types.js.map +1 -0
- package/dist/components/UI/DataTable/useCellEditingState.d.ts +20 -0
- package/dist/components/UI/DataTable/useCellEditingState.js +33 -0
- package/dist/components/UI/DataTable/useCellEditingState.js.map +1 -0
- package/dist/components/UI/DataTable/useColumnOrder.d.ts +25 -0
- package/dist/components/UI/DataTable/useColumnOrder.js +94 -0
- package/dist/components/UI/DataTable/useColumnOrder.js.map +1 -0
- package/dist/components/UI/DataTable/useColumnSizing.d.ts +9 -0
- package/dist/components/UI/DataTable/useColumnSizing.js +21 -0
- package/dist/components/UI/DataTable/useColumnSizing.js.map +1 -0
- package/dist/components/UI/DataTable/useColumnVisibility.d.ts +19 -0
- package/dist/components/UI/DataTable/useColumnVisibility.js +47 -0
- package/dist/components/UI/DataTable/useColumnVisibility.js.map +1 -0
- package/dist/components/UI/DataTable/useDataTableCommitQueue.d.ts +69 -0
- package/dist/components/UI/DataTable/useDataTableCommitQueue.js +220 -0
- package/dist/components/UI/DataTable/useDataTableCommitQueue.js.map +1 -0
- package/dist/components/UI/DataTable/useDataTableEditBuffer.d.ts +36 -0
- package/dist/components/UI/DataTable/useDataTableEditBuffer.js +29 -0
- package/dist/components/UI/DataTable/useDataTableEditBuffer.js.map +1 -0
- package/dist/components/UI/DataTable/useDataTableInstance.d.ts +65 -0
- package/dist/components/UI/DataTable/useDataTableInstance.js +306 -0
- package/dist/components/UI/DataTable/useDataTableInstance.js.map +1 -0
- package/dist/components/UI/DataTable/useDataTableSource.d.ts +85 -0
- package/dist/components/UI/DataTable/useDataTableSource.js +199 -0
- package/dist/components/UI/DataTable/useDataTableSource.js.map +1 -0
- package/dist/components/UI/DataTable/useFlipRows.d.ts +22 -0
- package/dist/components/UI/DataTable/useFlipRows.js +90 -0
- package/dist/components/UI/DataTable/useFlipRows.js.map +1 -0
- package/dist/components/UI/ErrorBoundary.d.ts +20 -0
- package/dist/components/UI/ErrorBoundary.js +36 -0
- package/dist/components/UI/ErrorBoundary.js.map +1 -0
- package/dist/components/UI/GeneratedByAI.d.ts +2 -0
- package/dist/components/UI/GeneratedByAI.js +12 -0
- package/dist/components/UI/GeneratedByAI.js.map +1 -0
- package/dist/components/UI/HorizontalScrollArea.d.ts +22 -0
- package/dist/components/UI/HorizontalScrollArea.js +73 -0
- package/dist/components/UI/HorizontalScrollArea.js.map +1 -0
- package/dist/components/UI/ImageAiAdjust/ImageAiAdjustDialog.d.ts +15 -0
- package/dist/components/UI/ImageAiAdjust/ImageAiAdjustDialog.js +144 -0
- package/dist/components/UI/ImageAiAdjust/ImageAiAdjustDialog.js.map +1 -0
- package/dist/components/UI/ImageAiAdjust/useImageAiAdjust.d.ts +29 -0
- package/dist/components/UI/ImageAiAdjust/useImageAiAdjust.js +84 -0
- package/dist/components/UI/ImageAiAdjust/useImageAiAdjust.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/AnnotationEditor.d.ts +12 -0
- package/dist/components/UI/ImageAnnotator/AnnotationEditor.js +267 -0
- package/dist/components/UI/ImageAnnotator/AnnotationEditor.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/ImageAnnotationDialog.d.ts +13 -0
- package/dist/components/UI/ImageAnnotator/ImageAnnotationDialog.js +58 -0
- package/dist/components/UI/ImageAnnotator/ImageAnnotationDialog.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/annotationStyle.d.ts +28 -0
- package/dist/components/UI/ImageAnnotator/annotationStyle.js +56 -0
- package/dist/components/UI/ImageAnnotator/annotationStyle.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/canvas/AnnotationElementNode.d.ts +17 -0
- package/dist/components/UI/ImageAnnotator/canvas/AnnotationElementNode.js +329 -0
- package/dist/components/UI/ImageAnnotator/canvas/AnnotationElementNode.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/canvas/AnnotationSelection.d.ts +10 -0
- package/dist/components/UI/ImageAnnotator/canvas/AnnotationSelection.js +125 -0
- package/dist/components/UI/ImageAnnotator/canvas/AnnotationSelection.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/canvas/AnnotationStage.d.ts +19 -0
- package/dist/components/UI/ImageAnnotator/canvas/AnnotationStage.js +216 -0
- package/dist/components/UI/ImageAnnotator/canvas/AnnotationStage.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationActionBar.d.ts +15 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationActionBar.js +77 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationActionBar.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationColorPopover.d.ts +11 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationColorPopover.js +69 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationColorPopover.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationElementActions.d.ts +8 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationElementActions.js +58 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationElementActions.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationStyleBar.d.ts +13 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationStyleBar.js +183 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationStyleBar.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationTextOverlay.d.ts +15 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationTextOverlay.js +78 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationTextOverlay.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationToolButton.d.ts +15 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationToolButton.js +46 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationToolButton.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationToolbar.d.ts +10 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationToolbar.js +80 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationToolbar.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/helpers/annotationCanvas.d.ts +21 -0
- package/dist/components/UI/ImageAnnotator/helpers/annotationCanvas.js +45 -0
- package/dist/components/UI/ImageAnnotator/helpers/annotationCanvas.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/helpers/annotationElements.d.ts +15 -0
- package/dist/components/UI/ImageAnnotator/helpers/annotationElements.js +165 -0
- package/dist/components/UI/ImageAnnotator/helpers/annotationElements.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/helpers/annotationExport.d.ts +15 -0
- package/dist/components/UI/ImageAnnotator/helpers/annotationExport.js +23 -0
- package/dist/components/UI/ImageAnnotator/helpers/annotationExport.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/helpers/konvaFullBuild.d.ts +8 -0
- package/dist/components/UI/ImageAnnotator/helpers/konvaFullBuild.js +10 -0
- package/dist/components/UI/ImageAnnotator/helpers/konvaFullBuild.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/hooks/useAnnotationBaseImage.d.ts +9 -0
- package/dist/components/UI/ImageAnnotator/hooks/useAnnotationBaseImage.js +56 -0
- package/dist/components/UI/ImageAnnotator/hooks/useAnnotationBaseImage.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/hooks/useAnnotationDocument.d.ts +27 -0
- package/dist/components/UI/ImageAnnotator/hooks/useAnnotationDocument.js +149 -0
- package/dist/components/UI/ImageAnnotator/hooks/useAnnotationDocument.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/hooks/useAnnotationShortcuts.d.ts +14 -0
- package/dist/components/UI/ImageAnnotator/hooks/useAnnotationShortcuts.js +79 -0
- package/dist/components/UI/ImageAnnotator/hooks/useAnnotationShortcuts.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/hooks/useCoarsePointer.d.ts +5 -0
- package/dist/components/UI/ImageAnnotator/hooks/useCoarsePointer.js +23 -0
- package/dist/components/UI/ImageAnnotator/hooks/useCoarsePointer.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/hooks/useHtmlImage.d.ts +2 -0
- package/dist/components/UI/ImageAnnotator/hooks/useHtmlImage.js +27 -0
- package/dist/components/UI/ImageAnnotator/hooks/useHtmlImage.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/interfaces/annotationDocument.d.ts +89 -0
- package/dist/components/UI/ImageAnnotator/interfaces/annotationDocument.js +13 -0
- package/dist/components/UI/ImageAnnotator/interfaces/annotationDocument.js.map +1 -0
- package/dist/components/UI/ImagePlaceholder.d.ts +24 -0
- package/dist/components/UI/ImagePlaceholder.js +26 -0
- package/dist/components/UI/ImagePlaceholder.js.map +1 -0
- package/dist/components/UI/ImageZoomOverlay.d.ts +7 -0
- package/dist/components/UI/ImageZoomOverlay.js +49 -0
- package/dist/components/UI/ImageZoomOverlay.js.map +1 -0
- package/dist/components/UI/InformationCard.d.ts +26 -0
- package/dist/components/UI/InformationCard.js +89 -0
- package/dist/components/UI/InformationCard.js.map +1 -0
- package/dist/components/UI/Kanban/KanbanBoard.d.ts +26 -0
- package/dist/components/UI/Kanban/KanbanBoard.js +89 -0
- package/dist/components/UI/Kanban/KanbanBoard.js.map +1 -0
- package/dist/components/UI/Kanban/KanbanCard.d.ts +22 -0
- package/dist/components/UI/Kanban/KanbanCard.js +47 -0
- package/dist/components/UI/Kanban/KanbanCard.js.map +1 -0
- package/dist/components/UI/Kanban/KanbanLane.d.ts +37 -0
- package/dist/components/UI/Kanban/KanbanLane.js +77 -0
- package/dist/components/UI/Kanban/KanbanLane.js.map +1 -0
- package/dist/components/UI/Kanban/index.d.ts +4 -0
- package/dist/components/UI/Kanban/index.js +11 -0
- package/dist/components/UI/Kanban/index.js.map +1 -0
- package/dist/components/UI/Kanban/kanbanBoardContext.d.ts +13 -0
- package/dist/components/UI/Kanban/kanbanBoardContext.js +13 -0
- package/dist/components/UI/Kanban/kanbanBoardContext.js.map +1 -0
- package/dist/components/UI/LazyMarkdown.d.ts +5 -0
- package/dist/components/UI/LazyMarkdown.js +8 -0
- package/dist/components/UI/LazyMarkdown.js.map +1 -0
- package/dist/components/UI/LoadingPage.d.ts +2 -0
- package/dist/components/UI/LoadingPage.js +13 -0
- package/dist/components/UI/LoadingPage.js.map +1 -0
- package/dist/components/UI/LoadingSpinner.d.ts +14 -0
- package/dist/components/UI/LoadingSpinner.js +32 -0
- package/dist/components/UI/LoadingSpinner.js.map +1 -0
- package/dist/components/UI/MaterialSymbol/consts.d.ts +2 -0
- package/dist/components/UI/MaterialSymbol/consts.js +3472 -0
- package/dist/components/UI/MaterialSymbol/consts.js.map +1 -0
- package/dist/components/UI/MaterialSymbol/index.d.ts +18 -0
- package/dist/components/UI/MaterialSymbol/index.js +46 -0
- package/dist/components/UI/MaterialSymbol/index.js.map +1 -0
- package/dist/components/UI/MaterialSymbol/types.d.ts +37 -0
- package/dist/components/UI/MaterialSymbol/types.js +2 -0
- package/dist/components/UI/MaterialSymbol/types.js.map +1 -0
- package/dist/components/UI/NoDataFound/index.d.ts +31 -0
- package/dist/components/UI/NoDataFound/index.js +215 -0
- package/dist/components/UI/NoDataFound/index.js.map +1 -0
- package/dist/components/UI/NoDataFound/noDataFoundPresets.d.ts +31 -0
- package/dist/components/UI/NoDataFound/noDataFoundPresets.js +99 -0
- package/dist/components/UI/NoDataFound/noDataFoundPresets.js.map +1 -0
- package/dist/components/UI/ReferenceCard.d.ts +16 -0
- package/dist/components/UI/ReferenceCard.js +59 -0
- package/dist/components/UI/ReferenceCard.js.map +1 -0
- package/dist/components/UI/RichTextContent.d.ts +14 -0
- package/dist/components/UI/RichTextContent.js +28 -0
- package/dist/components/UI/RichTextContent.js.map +1 -0
- package/dist/components/UI/SkeletonLoading.d.ts +9 -0
- package/dist/components/UI/SkeletonLoading.js +20 -0
- package/dist/components/UI/SkeletonLoading.js.map +1 -0
- package/dist/components/UI/ThreeDots.d.ts +11 -0
- package/dist/components/UI/ThreeDots.js +18 -0
- package/dist/components/UI/ThreeDots.js.map +1 -0
- package/dist/components/UI/Toast.d.ts +16 -0
- package/dist/components/UI/Toast.js +81 -0
- package/dist/components/UI/Toast.js.map +1 -0
- package/dist/components/UI/ToastHost.d.ts +2 -0
- package/dist/components/UI/ToastHost.js +25 -0
- package/dist/components/UI/ToastHost.js.map +1 -0
- package/dist/components/UI/TypingEffect.d.ts +10 -0
- package/dist/components/UI/TypingEffect.js +31 -0
- package/dist/components/UI/TypingEffect.js.map +1 -0
- package/dist/components/UI/UmodeLogo.d.ts +10 -0
- package/dist/components/UI/UmodeLogo.js +128 -0
- package/dist/components/UI/UmodeLogo.js.map +1 -0
- package/dist/components/UI/UsersAvatar.d.ts +7 -0
- package/dist/components/UI/UsersAvatar.js +29 -0
- package/dist/components/UI/UsersAvatar.js.map +1 -0
- package/dist/components/UI/access/UiAccessContext.d.ts +21 -0
- package/dist/components/UI/access/UiAccessContext.js +14 -0
- package/dist/components/UI/access/UiAccessContext.js.map +1 -0
- package/dist/components/UI/cells/ArrayCell.d.ts +5 -0
- package/dist/components/UI/cells/ArrayCell.js +25 -0
- package/dist/components/UI/cells/ArrayCell.js.map +1 -0
- package/dist/components/UI/cells/BooleanCell.d.ts +5 -0
- package/dist/components/UI/cells/BooleanCell.js +22 -0
- package/dist/components/UI/cells/BooleanCell.js.map +1 -0
- package/dist/components/UI/cells/DetailsTableCell.d.ts +7 -0
- package/dist/components/UI/cells/DetailsTableCell.js +30 -0
- package/dist/components/UI/cells/DetailsTableCell.js.map +1 -0
- package/dist/components/UI/cells/ProductImageCell.d.ts +5 -0
- package/dist/components/UI/cells/ProductImageCell.js +21 -0
- package/dist/components/UI/cells/ProductImageCell.js.map +1 -0
- package/dist/components/UI/cells/UrlLinkCell.d.ts +6 -0
- package/dist/components/UI/cells/UrlLinkCell.js +19 -0
- package/dist/components/UI/cells/UrlLinkCell.js.map +1 -0
- package/dist/components/Upload/SimpleUploaderComponent.d.ts +9 -0
- package/dist/components/Upload/SimpleUploaderComponent.js +72 -0
- package/dist/components/Upload/SimpleUploaderComponent.js.map +1 -0
- package/dist/components/Upload/UploaderComponent.d.ts +29 -0
- package/dist/components/Upload/UploaderComponent.js +241 -0
- package/dist/components/Upload/UploaderComponent.js.map +1 -0
- package/dist/components/Upload/XlsExportButton.d.ts +13 -0
- package/dist/components/Upload/XlsExportButton.js +47 -0
- package/dist/components/Upload/XlsExportButton.js.map +1 -0
- package/dist/helpers/composeRefs.d.ts +7 -0
- package/dist/helpers/composeRefs.js +14 -0
- package/dist/helpers/composeRefs.js.map +1 -0
- package/dist/helpers/dateHelpers.d.ts +47 -0
- package/dist/helpers/dateHelpers.js +69 -0
- package/dist/helpers/dateHelpers.js.map +1 -0
- package/dist/helpers/fileAttachments.d.ts +3 -0
- package/dist/helpers/fileAttachments.js +17 -0
- package/dist/helpers/fileAttachments.js.map +1 -0
- package/dist/helpers/formatHelpers.d.ts +36 -0
- package/dist/helpers/formatHelpers.js +65 -0
- package/dist/helpers/formatHelpers.js.map +1 -0
- package/dist/helpers/imageCompression.d.ts +5 -0
- package/dist/helpers/imageCompression.js +49 -0
- package/dist/helpers/imageCompression.js.map +1 -0
- package/dist/helpers/imageFile.d.ts +16 -0
- package/dist/helpers/imageFile.js +59 -0
- package/dist/helpers/imageFile.js.map +1 -0
- package/dist/helpers/layeredSurfaces.d.ts +10 -0
- package/dist/helpers/layeredSurfaces.js +14 -0
- package/dist/helpers/layeredSurfaces.js.map +1 -0
- package/dist/helpers/mathHelpers.d.ts +14 -0
- package/dist/helpers/mathHelpers.js +13 -0
- package/dist/helpers/mathHelpers.js.map +1 -0
- package/dist/helpers/mergeClasses.d.ts +6 -0
- package/dist/helpers/mergeClasses.js +12 -0
- package/dist/helpers/mergeClasses.js.map +1 -0
- package/dist/helpers/moduleLoadErrorHelpers.d.ts +1 -0
- package/dist/helpers/moduleLoadErrorHelpers.js +25 -0
- package/dist/helpers/moduleLoadErrorHelpers.js.map +1 -0
- package/dist/helpers/objectHelpers.d.ts +13 -0
- package/dist/helpers/objectHelpers.js +60 -0
- package/dist/helpers/objectHelpers.js.map +1 -0
- package/dist/helpers/richText.d.ts +37 -0
- package/dist/helpers/richText.js +171 -0
- package/dist/helpers/richText.js.map +1 -0
- package/dist/helpers/stringHelpers.d.ts +45 -0
- package/dist/helpers/stringHelpers.js +57 -0
- package/dist/helpers/stringHelpers.js.map +1 -0
- package/dist/helpers/themeTokens.d.ts +28 -0
- package/dist/helpers/themeTokens.js +33 -0
- package/dist/helpers/themeTokens.js.map +1 -0
- package/dist/helpers/uiErrorPresenter.d.ts +21 -0
- package/dist/helpers/uiErrorPresenter.js +10 -0
- package/dist/helpers/uiErrorPresenter.js.map +1 -0
- package/dist/helpers/uiLogger.d.ts +8 -0
- package/dist/helpers/uiLogger.js +16 -0
- package/dist/helpers/uiLogger.js.map +1 -0
- package/dist/helpers/uiPreferences.d.ts +13 -0
- package/dist/helpers/uiPreferences.js +35 -0
- package/dist/helpers/uiPreferences.js.map +1 -0
- package/dist/helpers/urlParamSync.d.ts +19 -0
- package/dist/helpers/urlParamSync.js +54 -0
- package/dist/helpers/urlParamSync.js.map +1 -0
- package/dist/helpers/utilityHelpers.d.ts +81 -0
- package/dist/helpers/utilityHelpers.js +133 -0
- package/dist/helpers/utilityHelpers.js.map +1 -0
- package/dist/helpers/validationHelpers.d.ts +36 -0
- package/dist/helpers/validationHelpers.js +44 -0
- package/dist/helpers/validationHelpers.js.map +1 -0
- package/dist/hooks/useAnchoredFloating.d.ts +22 -0
- package/dist/hooks/useAnchoredFloating.js +59 -0
- package/dist/hooks/useAnchoredFloating.js.map +1 -0
- package/dist/hooks/useBreakpoint.d.ts +16 -0
- package/dist/hooks/useBreakpoint.js +47 -0
- package/dist/hooks/useBreakpoint.js.map +1 -0
- package/dist/hooks/useDebounce.d.ts +8 -0
- package/dist/hooks/useDebounce.js +36 -0
- package/dist/hooks/useDebounce.js.map +1 -0
- package/dist/hooks/useFileAttachments.d.ts +43 -0
- package/dist/hooks/useFileAttachments.js +158 -0
- package/dist/hooks/useFileAttachments.js.map +1 -0
- package/dist/hooks/useHoverCapable.d.ts +6 -0
- package/dist/hooks/useHoverCapable.js +28 -0
- package/dist/hooks/useHoverCapable.js.map +1 -0
- package/dist/hooks/useInlineEditor.d.ts +5 -0
- package/dist/hooks/useInlineEditor.js +41 -0
- package/dist/hooks/useInlineEditor.js.map +1 -0
- package/dist/hooks/useMobile.d.ts +7 -0
- package/dist/hooks/useMobile.js +8 -0
- package/dist/hooks/useMobile.js.map +1 -0
- package/dist/hooks/useNotification.d.ts +38 -0
- package/dist/hooks/useNotification.js +39 -0
- package/dist/hooks/useNotification.js.map +1 -0
- package/dist/hooks/useResolvedTheme.d.ts +7 -0
- package/dist/hooks/useResolvedTheme.js +15 -0
- package/dist/hooks/useResolvedTheme.js.map +1 -0
- package/dist/hooks/useVoiceTranscription.d.ts +25 -0
- package/dist/hooks/useVoiceTranscription.js +106 -0
- package/dist/hooks/useVoiceTranscription.js.map +1 -0
- package/dist/index.d.ts +50 -0
- package/dist/index.js +125 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/IFileAttachment.d.ts +18 -0
- package/dist/interfaces/IFileAttachment.js +2 -0
- package/dist/interfaces/IFileAttachment.js.map +1 -0
- package/dist/interfaces/IFilterOption.d.ts +10 -0
- package/dist/interfaces/IFilterOption.js +2 -0
- package/dist/interfaces/IFilterOption.js.map +1 -0
- package/dist/locales/en/ui.json.d.ts +470 -0
- package/dist/locales/en/ui.json.js +99 -0
- package/dist/locales/en/ui.json.js.map +1 -0
- package/dist/locales/index.d.ts +938 -0
- package/dist/locales/index.js +7 -0
- package/dist/locales/index.js.map +1 -0
- package/dist/locales/pt/ui.json.d.ts +470 -0
- package/dist/locales/pt/ui.json.js +99 -0
- package/dist/locales/pt/ui.json.js.map +1 -0
- package/dist/motion/index.d.ts +2 -0
- package/dist/motion/index.js +17 -0
- package/dist/motion/index.js.map +1 -0
- package/dist/motion/motionPresets.d.ts +44 -0
- package/dist/motion/motionPresets.js +67 -0
- package/dist/motion/motionPresets.js.map +1 -0
- package/dist/motion/motionTokens.d.ts +40 -0
- package/dist/motion/motionTokens.js +29 -0
- package/dist/motion/motionTokens.js.map +1 -0
- package/package.json +174 -0
- package/src/assets/styles/theme.css +381 -0
- package/tailwind-plugins/glass.js +167 -0
- package/tailwind.preset.js +367 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
const DEFAULT_COLUMN_WIDTH_PX = 180;
|
|
2
|
+
const ACTIONS_COLUMN_WIDTH_PX = 160;
|
|
3
|
+
const BADGE_COLUMN_WIDTH_PX = 96;
|
|
4
|
+
const REM_TO_PX = 16;
|
|
5
|
+
const TAILWIND_SCALE_TO_PX = 4;
|
|
6
|
+
const BADGE_CELL_TYPES = /* @__PURE__ */ new Set(["badgeStatus", "origin", "tag"]);
|
|
7
|
+
const isBadgeColumnType = (type) => !!type && BADGE_CELL_TYPES.has(type);
|
|
8
|
+
const HEADER_FONT = "600 0.625rem Inter, ui-sans-serif, system-ui, sans-serif";
|
|
9
|
+
const FALLBACK_CHAR_WIDTH_PX = 7;
|
|
10
|
+
let measureCanvas = null;
|
|
11
|
+
const textWidthCache = /* @__PURE__ */ new Map();
|
|
12
|
+
const measureTextWidthPx = (text, font) => {
|
|
13
|
+
const cacheKey = `${font}
|
|
14
|
+
${text}`;
|
|
15
|
+
const cached = textWidthCache.get(cacheKey);
|
|
16
|
+
if (cached !== void 0) return cached;
|
|
17
|
+
let width = text.length * FALLBACK_CHAR_WIDTH_PX;
|
|
18
|
+
if (typeof document !== "undefined") {
|
|
19
|
+
measureCanvas ?? (measureCanvas = document.createElement("canvas"));
|
|
20
|
+
const context = measureCanvas.getContext("2d");
|
|
21
|
+
if (context) {
|
|
22
|
+
context.font = font;
|
|
23
|
+
width = context.measureText(text).width;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
textWidthCache.set(cacheKey, width);
|
|
27
|
+
return width;
|
|
28
|
+
};
|
|
29
|
+
const measureHeaderTextWidthPx = (header) => measureTextWidthPx(header.toUpperCase(), HEADER_FONT);
|
|
30
|
+
const estimateColumnHeaderMinWidthPx = (columnConfig, context = {}) => {
|
|
31
|
+
if (!columnConfig) return DEFAULT_COLUMN_WIDTH_PX;
|
|
32
|
+
const horizontalPaddingPx = 32;
|
|
33
|
+
const sortIndicatorPx = columnConfig.sortable ? 22 : 0;
|
|
34
|
+
const resizeHandlePx = columnConfig.type !== "actions" ? 12 : 0;
|
|
35
|
+
const columnTogglePx = context.isFirstColumn && context.hasColumnToggle ? 32 : 0;
|
|
36
|
+
const labelWidthPx = measureHeaderTextWidthPx(columnConfig.header);
|
|
37
|
+
return Math.ceil(horizontalPaddingPx + labelWidthPx + sortIndicatorPx + resizeHandlePx + columnTogglePx);
|
|
38
|
+
};
|
|
39
|
+
const resolveTypeSeedWidthPx = (columnConfig) => {
|
|
40
|
+
if (!columnConfig) return DEFAULT_COLUMN_WIDTH_PX;
|
|
41
|
+
if (columnConfig.type === "actions") {
|
|
42
|
+
return parseWidthClassToPx(columnConfig.widthClassName) ?? ACTIONS_COLUMN_WIDTH_PX;
|
|
43
|
+
}
|
|
44
|
+
if (isBadgeColumnType(columnConfig.type)) {
|
|
45
|
+
return parseWidthClassToPx(columnConfig.widthClassName) ?? BADGE_COLUMN_WIDTH_PX;
|
|
46
|
+
}
|
|
47
|
+
return parseWidthClassToPx(columnConfig.widthClassName) ?? DEFAULT_COLUMN_WIDTH_PX;
|
|
48
|
+
};
|
|
49
|
+
const resolveColumnMinWidthPx = (columnConfig, context = {}) => Math.max(resolveTypeSeedWidthPx(columnConfig), estimateColumnHeaderMinWidthPx(columnConfig, context));
|
|
50
|
+
const parseWidthClassToPx = (widthClassName) => {
|
|
51
|
+
if (!widthClassName) return void 0;
|
|
52
|
+
const tokens = widthClassName.split(/\s+/).filter(Boolean);
|
|
53
|
+
for (const token of tokens) {
|
|
54
|
+
const arbitraryMatch = token.match(/^(?:min-)?w-\[(\d+(?:\.\d+)?)(px|rem)\]$/);
|
|
55
|
+
if (arbitraryMatch) {
|
|
56
|
+
const value = Number(arbitraryMatch[1]);
|
|
57
|
+
if (Number.isNaN(value)) continue;
|
|
58
|
+
return arbitraryMatch[2] === "rem" ? value * REM_TO_PX : value;
|
|
59
|
+
}
|
|
60
|
+
const scaleMatch = token.match(/^(?:min-)?w-(\d+)$/);
|
|
61
|
+
if (scaleMatch) {
|
|
62
|
+
const value = Number(scaleMatch[1]);
|
|
63
|
+
if (Number.isNaN(value)) continue;
|
|
64
|
+
return value * TAILWIND_SCALE_TO_PX;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return void 0;
|
|
68
|
+
};
|
|
69
|
+
const ACTIONS_CELL_HORIZONTAL_PADDING_PX = 32;
|
|
70
|
+
const ACTION_BUTTON_WIDTH_PX = 30;
|
|
71
|
+
const ACTION_BUTTON_GAP_PX = 4;
|
|
72
|
+
const BADGE_CELL_HORIZONTAL_PADDING_PX = 32;
|
|
73
|
+
const CHIP_HORIZONTAL_PADDING_PX = 20;
|
|
74
|
+
const CHIP_BORDER_PX = 2;
|
|
75
|
+
const CHIP_MIN_WIDTH_PX = 56;
|
|
76
|
+
const CHIP_DOT_WIDTH_PX = 10;
|
|
77
|
+
const CHIP_ICON_WIDTH_PX = 20;
|
|
78
|
+
const BADGE_WIDTH_BUFFER_PX = 6;
|
|
79
|
+
const BADGE_LABEL_FONT = HEADER_FONT;
|
|
80
|
+
const estimateActionsColumnWidthPx = (visibleActionCount) => {
|
|
81
|
+
const count = Math.max(visibleActionCount, 1);
|
|
82
|
+
return ACTIONS_CELL_HORIZONTAL_PADDING_PX + count * ACTION_BUTTON_WIDTH_PX + (count - 1) * ACTION_BUTTON_GAP_PX;
|
|
83
|
+
};
|
|
84
|
+
const ACTION_COUNT_FONT = "600 0.75rem Inter, ui-sans-serif, system-ui, sans-serif";
|
|
85
|
+
const ACTION_COUNT_GAP_PX = 4;
|
|
86
|
+
const estimateActionButtonWidthPx = (action, row) => {
|
|
87
|
+
const count = action.count?.(row);
|
|
88
|
+
if (typeof count !== "number") return ACTION_BUTTON_WIDTH_PX;
|
|
89
|
+
return ACTION_BUTTON_WIDTH_PX + ACTION_COUNT_GAP_PX + measureTextWidthPx(String(count), ACTION_COUNT_FONT);
|
|
90
|
+
};
|
|
91
|
+
const estimateActionsCellWidthPx = (actions, row) => {
|
|
92
|
+
const visibleActions = actions.filter((action) => !action.hidden?.(row));
|
|
93
|
+
if (visibleActions.length === 0) return ACTIONS_CELL_HORIZONTAL_PADDING_PX;
|
|
94
|
+
const buttonsWidthPx = visibleActions.reduce((total, action) => total + estimateActionButtonWidthPx(action, row), 0);
|
|
95
|
+
return ACTIONS_CELL_HORIZONTAL_PADDING_PX + buttonsWidthPx + (visibleActions.length - 1) * ACTION_BUTTON_GAP_PX;
|
|
96
|
+
};
|
|
97
|
+
const estimateBadgeCellWidthPx = ({ label, hasDot, hasIcon }) => {
|
|
98
|
+
const chipChromePx = CHIP_HORIZONTAL_PADDING_PX + CHIP_BORDER_PX + (hasDot ? CHIP_DOT_WIDTH_PX : 0) + (hasIcon ? CHIP_ICON_WIDTH_PX : 0);
|
|
99
|
+
const chipWidthPx = Math.max(
|
|
100
|
+
CHIP_MIN_WIDTH_PX,
|
|
101
|
+
chipChromePx + measureTextWidthPx(label.toUpperCase(), BADGE_LABEL_FONT)
|
|
102
|
+
);
|
|
103
|
+
return BADGE_CELL_HORIZONTAL_PADDING_PX + chipWidthPx + BADGE_WIDTH_BUFFER_PX;
|
|
104
|
+
};
|
|
105
|
+
const readBadgeChipMetrics = (column, row) => {
|
|
106
|
+
const value = column.accessor?.(row);
|
|
107
|
+
if (!value || typeof value !== "object") return null;
|
|
108
|
+
const record = value;
|
|
109
|
+
if (typeof record.label !== "string" || !record.label) return null;
|
|
110
|
+
return {
|
|
111
|
+
label: record.label,
|
|
112
|
+
hasDot: column.type === "badgeStatus",
|
|
113
|
+
hasIcon: column.type === "tag" && Boolean(record.chipIcon)
|
|
114
|
+
};
|
|
115
|
+
};
|
|
116
|
+
const resolveActionsColumnWidthPx = (actions, rows) => {
|
|
117
|
+
if (rows.length === 0) return estimateActionsColumnWidthPx(actions.length);
|
|
118
|
+
let widestPx = 0;
|
|
119
|
+
for (const row of rows) {
|
|
120
|
+
widestPx = Math.max(widestPx, estimateActionsCellWidthPx(actions, row));
|
|
121
|
+
}
|
|
122
|
+
return Math.ceil(widestPx);
|
|
123
|
+
};
|
|
124
|
+
const computeColumnContentWidths = (columns, rows) => {
|
|
125
|
+
const widths = /* @__PURE__ */ new Map();
|
|
126
|
+
for (const column of columns) {
|
|
127
|
+
if (column.type === "actions" && column.actions) {
|
|
128
|
+
widths.set(column.id, resolveActionsColumnWidthPx(column.actions, rows));
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (!isBadgeColumnType(column.type) || column.render) continue;
|
|
132
|
+
let widestPx = 0;
|
|
133
|
+
for (const row of rows) {
|
|
134
|
+
const metrics = readBadgeChipMetrics(column, row);
|
|
135
|
+
if (metrics) widestPx = Math.max(widestPx, estimateBadgeCellWidthPx(metrics));
|
|
136
|
+
}
|
|
137
|
+
if (widestPx > 0) widths.set(column.id, Math.ceil(Math.max(widestPx, estimateColumnHeaderMinWidthPx(column))));
|
|
138
|
+
}
|
|
139
|
+
return widths;
|
|
140
|
+
};
|
|
141
|
+
export {
|
|
142
|
+
ACTIONS_COLUMN_WIDTH_PX,
|
|
143
|
+
BADGE_COLUMN_WIDTH_PX,
|
|
144
|
+
DEFAULT_COLUMN_WIDTH_PX,
|
|
145
|
+
computeColumnContentWidths,
|
|
146
|
+
estimateActionsColumnWidthPx,
|
|
147
|
+
estimateColumnHeaderMinWidthPx,
|
|
148
|
+
isBadgeColumnType,
|
|
149
|
+
parseWidthClassToPx,
|
|
150
|
+
resolveColumnMinWidthPx,
|
|
151
|
+
resolveTypeSeedWidthPx
|
|
152
|
+
};
|
|
153
|
+
//# sourceMappingURL=dataTableColumnWidths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataTableColumnWidths.js","sources":["../../../../src/components/UI/DataTable/dataTableColumnWidths.ts"],"sourcesContent":["import type { IDataTableActionItem, IDataTableColumnConfig, IDataTableRow, TDataTableCellType } from './types';\n\n// Fallback width for columns that declare no width class (min-w-[11.25rem] = 180px).\nexport const DEFAULT_COLUMN_WIDTH_PX = 180;\n\n// Fallback width for the actions column when no rows are available to size it.\n// The rendered width scales with the action count (see estimateActionsColumnWidthPx).\nexport const ACTIONS_COLUMN_WIDTH_PX = 160;\n\n// Compact seed for badge/chip columns; minSize rises when the header requires more.\nexport const BADGE_COLUMN_WIDTH_PX = 96;\n\nconst REM_TO_PX = 16;\nconst TAILWIND_SCALE_TO_PX = 4;\n\nconst BADGE_CELL_TYPES: ReadonlySet<TDataTableCellType> = new Set(['badgeStatus', 'origin', 'tag']);\n\nexport const isBadgeColumnType = (type?: TDataTableCellType): boolean => !!type && BADGE_CELL_TYPES.has(type);\n\nexport interface IEstimateColumnHeaderMinWidthContext {\n isFirstColumn?: boolean;\n hasColumnToggle?: boolean;\n}\n\n// Matches DataTableHead th styles: text-xxs font-semibold uppercase tracking-wide.\nconst HEADER_FONT = '600 0.625rem Inter, ui-sans-serif, system-ui, sans-serif';\n\nconst FALLBACK_CHAR_WIDTH_PX = 7;\n\nlet measureCanvas: HTMLCanvasElement | null = null;\nconst textWidthCache = new Map<string, number>();\n\nconst measureTextWidthPx = (text: string, font: string): number => {\n const cacheKey = `${font}\\n${text}`;\n const cached = textWidthCache.get(cacheKey);\n if (cached !== undefined) return cached;\n\n let width = text.length * FALLBACK_CHAR_WIDTH_PX;\n if (typeof document !== 'undefined') {\n measureCanvas ??= document.createElement('canvas');\n const context = measureCanvas.getContext('2d');\n if (context) {\n context.font = font;\n width = context.measureText(text).width;\n }\n }\n\n textWidthCache.set(cacheKey, width);\n return width;\n};\n\nconst measureHeaderTextWidthPx = (header: string): number => measureTextWidthPx(header.toUpperCase(), HEADER_FONT);\n\nexport const estimateColumnHeaderMinWidthPx = <T extends IDataTableRow>(\n columnConfig: IDataTableColumnConfig<T> | undefined,\n context: IEstimateColumnHeaderMinWidthContext = {},\n): number => {\n if (!columnConfig) return DEFAULT_COLUMN_WIDTH_PX;\n\n const horizontalPaddingPx = 32;\n const sortIndicatorPx = columnConfig.sortable ? 22 : 0;\n const resizeHandlePx = columnConfig.type !== 'actions' ? 12 : 0;\n const columnTogglePx = context.isFirstColumn && context.hasColumnToggle ? 32 : 0;\n\n const labelWidthPx = measureHeaderTextWidthPx(columnConfig.header);\n\n return Math.ceil(horizontalPaddingPx + labelWidthPx + sortIndicatorPx + resizeHandlePx + columnTogglePx);\n};\n\nexport const resolveTypeSeedWidthPx = <T extends IDataTableRow>(\n columnConfig: IDataTableColumnConfig<T> | undefined,\n): number => {\n if (!columnConfig) return DEFAULT_COLUMN_WIDTH_PX;\n if (columnConfig.type === 'actions') {\n return parseWidthClassToPx(columnConfig.widthClassName) ?? ACTIONS_COLUMN_WIDTH_PX;\n }\n if (isBadgeColumnType(columnConfig.type)) {\n return parseWidthClassToPx(columnConfig.widthClassName) ?? BADGE_COLUMN_WIDTH_PX;\n }\n\n return parseWidthClassToPx(columnConfig.widthClassName) ?? DEFAULT_COLUMN_WIDTH_PX;\n};\n\nexport const resolveColumnMinWidthPx = <T extends IDataTableRow>(\n columnConfig: IDataTableColumnConfig<T> | undefined,\n context: IEstimateColumnHeaderMinWidthContext = {},\n): number => Math.max(resolveTypeSeedWidthPx(columnConfig), estimateColumnHeaderMinWidthPx(columnConfig, context));\n\n// Escape hatch only — configs should not rely on widthClassName.\nexport const parseWidthClassToPx = (widthClassName?: string): number | undefined => {\n if (!widthClassName) return undefined;\n\n const tokens = widthClassName.split(/\\s+/).filter(Boolean);\n\n for (const token of tokens) {\n const arbitraryMatch = token.match(/^(?:min-)?w-\\[(\\d+(?:\\.\\d+)?)(px|rem)\\]$/);\n if (arbitraryMatch) {\n const value = Number(arbitraryMatch[1]);\n if (Number.isNaN(value)) continue;\n return arbitraryMatch[2] === 'rem' ? value * REM_TO_PX : value;\n }\n\n const scaleMatch = token.match(/^(?:min-)?w-(\\d+)$/);\n if (scaleMatch) {\n const value = Number(scaleMatch[1]);\n if (Number.isNaN(value)) continue;\n return value * TAILWIND_SCALE_TO_PX;\n }\n }\n\n return undefined;\n};\n\n// Actions cell chrome: td px-4 (32) plus, per action, an icon button\n// (p-1.5 + an 18px icon = 30) separated by gap-1 (4).\nconst ACTIONS_CELL_HORIZONTAL_PADDING_PX = 32;\nconst ACTION_BUTTON_WIDTH_PX = 30;\nconst ACTION_BUTTON_GAP_PX = 4;\n\n// OutlinedChip chrome: px-2.5 (20) + 1px border each side (2), an optional 6px\n// status dot or 16px leading icon each followed by gap-x-1 (4), floored at\n// min-w-14 (56). BADGE_CELL_HORIZONTAL_PADDING_PX is the surrounding td px-4.\nconst BADGE_CELL_HORIZONTAL_PADDING_PX = 32;\nconst CHIP_HORIZONTAL_PADDING_PX = 20;\nconst CHIP_BORDER_PX = 2;\nconst CHIP_MIN_WIDTH_PX = 56;\nconst CHIP_DOT_WIDTH_PX = 10;\nconst CHIP_ICON_WIDTH_PX = 20;\n// Absorbs sub-pixel measurement rounding so the widest chip is never re-clipped.\nconst BADGE_WIDTH_BUFFER_PX = 6;\n\n// OutlinedChip label matches the header font (text-xxs font-semibold).\nconst BADGE_LABEL_FONT = HEADER_FONT;\n\ninterface IBadgeChipMetrics {\n label: string;\n hasDot: boolean;\n hasIcon: boolean;\n}\n\n// The actions column fits its widest visible action count; the width scales with\n// the number of buttons actually rendered (hidden actions are excluded per row).\nexport const estimateActionsColumnWidthPx = (visibleActionCount: number): number => {\n const count = Math.max(visibleActionCount, 1);\n return ACTIONS_CELL_HORIZONTAL_PADDING_PX + count * ACTION_BUTTON_WIDTH_PX + (count - 1) * ACTION_BUTTON_GAP_PX;\n};\n\n// An action rendering a numeric badge is wider than the icon-only button by the\n// inner gap plus the digits (text-xs font-semibold).\nconst ACTION_COUNT_FONT = '600 0.75rem Inter, ui-sans-serif, system-ui, sans-serif';\nconst ACTION_COUNT_GAP_PX = 4;\n\nconst estimateActionButtonWidthPx = <T extends IDataTableRow>(action: IDataTableActionItem<T>, row: T): number => {\n const count = action.count?.(row);\n if (typeof count !== 'number') return ACTION_BUTTON_WIDTH_PX;\n\n return ACTION_BUTTON_WIDTH_PX + ACTION_COUNT_GAP_PX + measureTextWidthPx(String(count), ACTION_COUNT_FONT);\n};\n\nconst estimateActionsCellWidthPx = <T extends IDataTableRow>(\n actions: Array<IDataTableActionItem<T>>,\n row: T,\n): number => {\n const visibleActions = actions.filter((action) => !action.hidden?.(row));\n if (visibleActions.length === 0) return ACTIONS_CELL_HORIZONTAL_PADDING_PX;\n\n const buttonsWidthPx = visibleActions.reduce((total, action) => total + estimateActionButtonWidthPx(action, row), 0);\n\n return ACTIONS_CELL_HORIZONTAL_PADDING_PX + buttonsWidthPx + (visibleActions.length - 1) * ACTION_BUTTON_GAP_PX;\n};\n\nconst estimateBadgeCellWidthPx = ({ label, hasDot, hasIcon }: IBadgeChipMetrics): number => {\n const chipChromePx =\n CHIP_HORIZONTAL_PADDING_PX + CHIP_BORDER_PX + (hasDot ? CHIP_DOT_WIDTH_PX : 0) + (hasIcon ? CHIP_ICON_WIDTH_PX : 0);\n const chipWidthPx = Math.max(\n CHIP_MIN_WIDTH_PX,\n chipChromePx + measureTextWidthPx(label.toUpperCase(), BADGE_LABEL_FONT),\n );\n\n return BADGE_CELL_HORIZONTAL_PADDING_PX + chipWidthPx + BADGE_WIDTH_BUFFER_PX;\n};\n\nconst readBadgeChipMetrics = <T extends IDataTableRow>(\n column: IDataTableColumnConfig<T>,\n row: T,\n): IBadgeChipMetrics | null => {\n const value = column.accessor?.(row);\n if (!value || typeof value !== 'object') return null;\n\n const record = value as Record<string, unknown>;\n if (typeof record.label !== 'string' || !record.label) return null;\n\n return {\n label: record.label,\n hasDot: column.type === 'badgeStatus',\n hasIcon: column.type === 'tag' && Boolean(record.chipIcon),\n };\n};\n\nconst resolveActionsColumnWidthPx = <T extends IDataTableRow>(\n actions: Array<IDataTableActionItem<T>>,\n rows: Array<T>,\n): number => {\n if (rows.length === 0) return estimateActionsColumnWidthPx(actions.length);\n\n let widestPx = 0;\n for (const row of rows) {\n widestPx = Math.max(widestPx, estimateActionsCellWidthPx(actions, row));\n }\n\n return Math.ceil(widestPx);\n};\n\n// Widths for columns whose size depends on the row data: the actions column\n// (scales with the visible action count) and badge columns (fit the widest chip\n// so labels are never clipped). Consumed by the table instance seed and by the\n// head/body min-width floors so all three agree on the same width.\nexport const computeColumnContentWidths = <T extends IDataTableRow>(\n columns: Array<IDataTableColumnConfig<T>>,\n rows: Array<T>,\n): Map<string, number> => {\n const widths = new Map<string, number>();\n\n for (const column of columns) {\n if (column.type === 'actions' && column.actions) {\n widths.set(column.id, resolveActionsColumnWidthPx(column.actions, rows));\n continue;\n }\n\n if (!isBadgeColumnType(column.type) || column.render) continue;\n\n let widestPx = 0;\n for (const row of rows) {\n const metrics = readBadgeChipMetrics(column, row);\n if (metrics) widestPx = Math.max(widestPx, estimateBadgeCellWidthPx(metrics));\n }\n\n if (widestPx > 0) widths.set(column.id, Math.ceil(Math.max(widestPx, estimateColumnHeaderMinWidthPx(column))));\n }\n\n return widths;\n};\n"],"names":[],"mappings":"AAGO,MAAM,0BAA0B;AAIhC,MAAM,0BAA0B;AAGhC,MAAM,wBAAwB;AAErC,MAAM,YAAY;AAClB,MAAM,uBAAuB;AAE7B,MAAM,mBAAoD,oBAAI,IAAI,CAAC,eAAe,UAAU,KAAK,CAAC;AAE3F,MAAM,oBAAoB,CAAC,SAAuC,CAAC,CAAC,QAAQ,iBAAiB,IAAI,IAAI;AAQ5G,MAAM,cAAc;AAEpB,MAAM,yBAAyB;AAE/B,IAAI,gBAA0C;AAC9C,MAAM,qCAAqB,IAAA;AAE3B,MAAM,qBAAqB,CAAC,MAAc,SAAyB;AACjE,QAAM,WAAW,GAAG,IAAI;AAAA,EAAK,IAAI;AACjC,QAAM,SAAS,eAAe,IAAI,QAAQ;AAC1C,MAAI,WAAW,OAAW,QAAO;AAEjC,MAAI,QAAQ,KAAK,SAAS;AAC1B,MAAI,OAAO,aAAa,aAAa;AACnC,sCAAkB,SAAS,cAAc,QAAQ;AACjD,UAAM,UAAU,cAAc,WAAW,IAAI;AAC7C,QAAI,SAAS;AACX,cAAQ,OAAO;AACf,cAAQ,QAAQ,YAAY,IAAI,EAAE;AAAA,IACpC;AAAA,EACF;AAEA,iBAAe,IAAI,UAAU,KAAK;AAClC,SAAO;AACT;AAEA,MAAM,2BAA2B,CAAC,WAA2B,mBAAmB,OAAO,YAAA,GAAe,WAAW;AAE1G,MAAM,iCAAiC,CAC5C,cACA,UAAgD,OACrC;AACX,MAAI,CAAC,aAAc,QAAO;AAE1B,QAAM,sBAAsB;AAC5B,QAAM,kBAAkB,aAAa,WAAW,KAAK;AACrD,QAAM,iBAAiB,aAAa,SAAS,YAAY,KAAK;AAC9D,QAAM,iBAAiB,QAAQ,iBAAiB,QAAQ,kBAAkB,KAAK;AAE/E,QAAM,eAAe,yBAAyB,aAAa,MAAM;AAEjE,SAAO,KAAK,KAAK,sBAAsB,eAAe,kBAAkB,iBAAiB,cAAc;AACzG;AAEO,MAAM,yBAAyB,CACpC,iBACW;AACX,MAAI,CAAC,aAAc,QAAO;AAC1B,MAAI,aAAa,SAAS,WAAW;AACnC,WAAO,oBAAoB,aAAa,cAAc,KAAK;AAAA,EAC7D;AACA,MAAI,kBAAkB,aAAa,IAAI,GAAG;AACxC,WAAO,oBAAoB,aAAa,cAAc,KAAK;AAAA,EAC7D;AAEA,SAAO,oBAAoB,aAAa,cAAc,KAAK;AAC7D;AAEO,MAAM,0BAA0B,CACrC,cACA,UAAgD,CAAA,MACrC,KAAK,IAAI,uBAAuB,YAAY,GAAG,+BAA+B,cAAc,OAAO,CAAC;AAG1G,MAAM,sBAAsB,CAAC,mBAAgD;AAClF,MAAI,CAAC,eAAgB,QAAO;AAE5B,QAAM,SAAS,eAAe,MAAM,KAAK,EAAE,OAAO,OAAO;AAEzD,aAAW,SAAS,QAAQ;AAC1B,UAAM,iBAAiB,MAAM,MAAM,0CAA0C;AAC7E,QAAI,gBAAgB;AAClB,YAAM,QAAQ,OAAO,eAAe,CAAC,CAAC;AACtC,UAAI,OAAO,MAAM,KAAK,EAAG;AACzB,aAAO,eAAe,CAAC,MAAM,QAAQ,QAAQ,YAAY;AAAA,IAC3D;AAEA,UAAM,aAAa,MAAM,MAAM,oBAAoB;AACnD,QAAI,YAAY;AACd,YAAM,QAAQ,OAAO,WAAW,CAAC,CAAC;AAClC,UAAI,OAAO,MAAM,KAAK,EAAG;AACzB,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AAEA,SAAO;AACT;AAIA,MAAM,qCAAqC;AAC3C,MAAM,yBAAyB;AAC/B,MAAM,uBAAuB;AAK7B,MAAM,mCAAmC;AACzC,MAAM,6BAA6B;AACnC,MAAM,iBAAiB;AACvB,MAAM,oBAAoB;AAC1B,MAAM,oBAAoB;AAC1B,MAAM,qBAAqB;AAE3B,MAAM,wBAAwB;AAG9B,MAAM,mBAAmB;AAUlB,MAAM,+BAA+B,CAAC,uBAAuC;AAClF,QAAM,QAAQ,KAAK,IAAI,oBAAoB,CAAC;AAC5C,SAAO,qCAAqC,QAAQ,0BAA0B,QAAQ,KAAK;AAC7F;AAIA,MAAM,oBAAoB;AAC1B,MAAM,sBAAsB;AAE5B,MAAM,8BAA8B,CAA0B,QAAiC,QAAmB;AAChH,QAAM,QAAQ,OAAO,QAAQ,GAAG;AAChC,MAAI,OAAO,UAAU,SAAU,QAAO;AAEtC,SAAO,yBAAyB,sBAAsB,mBAAmB,OAAO,KAAK,GAAG,iBAAiB;AAC3G;AAEA,MAAM,6BAA6B,CACjC,SACA,QACW;AACX,QAAM,iBAAiB,QAAQ,OAAO,CAAC,WAAW,CAAC,OAAO,SAAS,GAAG,CAAC;AACvE,MAAI,eAAe,WAAW,EAAG,QAAO;AAExC,QAAM,iBAAiB,eAAe,OAAO,CAAC,OAAO,WAAW,QAAQ,4BAA4B,QAAQ,GAAG,GAAG,CAAC;AAEnH,SAAO,qCAAqC,kBAAkB,eAAe,SAAS,KAAK;AAC7F;AAEA,MAAM,2BAA2B,CAAC,EAAE,OAAO,QAAQ,cAAyC;AAC1F,QAAM,eACJ,6BAA6B,kBAAkB,SAAS,oBAAoB,MAAM,UAAU,qBAAqB;AACnH,QAAM,cAAc,KAAK;AAAA,IACvB;AAAA,IACA,eAAe,mBAAmB,MAAM,YAAA,GAAe,gBAAgB;AAAA,EAAA;AAGzE,SAAO,mCAAmC,cAAc;AAC1D;AAEA,MAAM,uBAAuB,CAC3B,QACA,QAC6B;AAC7B,QAAM,QAAQ,OAAO,WAAW,GAAG;AACnC,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAEhD,QAAM,SAAS;AACf,MAAI,OAAO,OAAO,UAAU,YAAY,CAAC,OAAO,MAAO,QAAO;AAE9D,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO,SAAS;AAAA,IACxB,SAAS,OAAO,SAAS,SAAS,QAAQ,OAAO,QAAQ;AAAA,EAAA;AAE7D;AAEA,MAAM,8BAA8B,CAClC,SACA,SACW;AACX,MAAI,KAAK,WAAW,EAAG,QAAO,6BAA6B,QAAQ,MAAM;AAEzE,MAAI,WAAW;AACf,aAAW,OAAO,MAAM;AACtB,eAAW,KAAK,IAAI,UAAU,2BAA2B,SAAS,GAAG,CAAC;AAAA,EACxE;AAEA,SAAO,KAAK,KAAK,QAAQ;AAC3B;AAMO,MAAM,6BAA6B,CACxC,SACA,SACwB;AACxB,QAAM,6BAAa,IAAA;AAEnB,aAAW,UAAU,SAAS;AAC5B,QAAI,OAAO,SAAS,aAAa,OAAO,SAAS;AAC/C,aAAO,IAAI,OAAO,IAAI,4BAA4B,OAAO,SAAS,IAAI,CAAC;AACvE;AAAA,IACF;AAEA,QAAI,CAAC,kBAAkB,OAAO,IAAI,KAAK,OAAO,OAAQ;AAEtD,QAAI,WAAW;AACf,eAAW,OAAO,MAAM;AACtB,YAAM,UAAU,qBAAqB,QAAQ,GAAG;AAChD,UAAI,QAAS,YAAW,KAAK,IAAI,UAAU,yBAAyB,OAAO,CAAC;AAAA,IAC9E;AAEA,QAAI,WAAW,EAAG,QAAO,IAAI,OAAO,IAAI,KAAK,KAAK,KAAK,IAAI,UAAU,+BAA+B,MAAM,CAAC,CAAC,CAAC;AAAA,EAC/G;AAEA,SAAO;AACT;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { VisibilityState } from '@tanstack/react-table';
|
|
2
|
+
export interface IDataTableColumnsEntry {
|
|
3
|
+
/** Full column order: fixed start + reorderable + fixed end. */
|
|
4
|
+
order?: Array<string>;
|
|
5
|
+
/** Visibility of hideable columns only, never the non-hideable ones. */
|
|
6
|
+
visibility?: VisibilityState;
|
|
7
|
+
/** User-resized column widths in pixels, keyed by column id. */
|
|
8
|
+
sizing?: Record<string, number>;
|
|
9
|
+
}
|
|
10
|
+
export declare const detailColumnsEntryKey: (entityKey: string) => string;
|
|
11
|
+
export declare const readColumnsEntry: (entityKey: string) => IDataTableColumnsEntry;
|
|
12
|
+
export declare const writeColumnsEntry: (entityKey: string, patch: IDataTableColumnsEntry) => void;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { writeUiPreference, readUiPreference } from "../../../helpers/uiPreferences.js";
|
|
2
|
+
import { isJSON } from "../../../helpers/utilityHelpers.js";
|
|
3
|
+
const COLUMNS_STORAGE_KEY = "datatable-columns";
|
|
4
|
+
const LEGACY_PER_TABLE_KEY_PREFIX = `${COLUMNS_STORAGE_KEY}-`;
|
|
5
|
+
const ABANDONED_ORDER_KEY = "datatable-column-order";
|
|
6
|
+
const isCurrentEntryShape = (entry) => {
|
|
7
|
+
const candidate = entry;
|
|
8
|
+
return Array.isArray(candidate.order) || !!candidate.visibility && typeof candidate.visibility === "object" || !!candidate.sizing && typeof candidate.sizing === "object";
|
|
9
|
+
};
|
|
10
|
+
const normalizeSizing = (sizing) => {
|
|
11
|
+
if (!sizing || typeof sizing !== "object") return void 0;
|
|
12
|
+
const result = {};
|
|
13
|
+
for (const [columnId, width] of Object.entries(sizing)) {
|
|
14
|
+
if (typeof width === "number" && Number.isFinite(width)) result[columnId] = width;
|
|
15
|
+
}
|
|
16
|
+
return Object.keys(result).length > 0 ? result : void 0;
|
|
17
|
+
};
|
|
18
|
+
const normalizeEntry = (entry) => {
|
|
19
|
+
if (!entry || typeof entry !== "object") return {};
|
|
20
|
+
if (!isCurrentEntryShape(entry)) return { visibility: entry };
|
|
21
|
+
const candidate = entry;
|
|
22
|
+
return {
|
|
23
|
+
order: Array.isArray(candidate.order) ? candidate.order.filter((id) => typeof id === "string") : void 0,
|
|
24
|
+
visibility: candidate.visibility && typeof candidate.visibility === "object" ? candidate.visibility : void 0,
|
|
25
|
+
sizing: normalizeSizing(candidate.sizing)
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
const readNormalizedStore = () => {
|
|
29
|
+
const raw = readUiPreference(COLUMNS_STORAGE_KEY) ?? {};
|
|
30
|
+
const store = {};
|
|
31
|
+
for (const [entityKey, entry] of Object.entries(raw)) store[entityKey] = normalizeEntry(entry);
|
|
32
|
+
return store;
|
|
33
|
+
};
|
|
34
|
+
let didMigrateOrphanKeys = false;
|
|
35
|
+
const migrateOrphanKeys = () => {
|
|
36
|
+
if (didMigrateOrphanKeys) return;
|
|
37
|
+
didMigrateOrphanKeys = true;
|
|
38
|
+
const legacyKeys = Object.keys(localStorage).filter((key) => key.startsWith(LEGACY_PER_TABLE_KEY_PREFIX));
|
|
39
|
+
const hasAbandonedOrderKey = localStorage.getItem(ABANDONED_ORDER_KEY) !== null;
|
|
40
|
+
if (legacyKeys.length === 0 && !hasAbandonedOrderKey) return;
|
|
41
|
+
const store = readNormalizedStore();
|
|
42
|
+
for (const legacyKey of legacyKeys) {
|
|
43
|
+
const entityKey = legacyKey.slice(LEGACY_PER_TABLE_KEY_PREFIX.length);
|
|
44
|
+
const raw = localStorage.getItem(legacyKey);
|
|
45
|
+
if (!store[entityKey]?.visibility && raw && isJSON(raw)) {
|
|
46
|
+
store[entityKey] = { ...store[entityKey], visibility: JSON.parse(raw) };
|
|
47
|
+
}
|
|
48
|
+
localStorage.removeItem(legacyKey);
|
|
49
|
+
}
|
|
50
|
+
localStorage.removeItem(ABANDONED_ORDER_KEY);
|
|
51
|
+
writeUiPreference(COLUMNS_STORAGE_KEY, store);
|
|
52
|
+
};
|
|
53
|
+
const detailColumnsEntryKey = (entityKey) => `${entityKey}:detail`;
|
|
54
|
+
const readColumnsEntry = (entityKey) => {
|
|
55
|
+
migrateOrphanKeys();
|
|
56
|
+
return readNormalizedStore()[entityKey] ?? {};
|
|
57
|
+
};
|
|
58
|
+
const writeColumnsEntry = (entityKey, patch) => {
|
|
59
|
+
migrateOrphanKeys();
|
|
60
|
+
const store = readNormalizedStore();
|
|
61
|
+
writeUiPreference(COLUMNS_STORAGE_KEY, { ...store, [entityKey]: { ...store[entityKey], ...patch } });
|
|
62
|
+
};
|
|
63
|
+
export {
|
|
64
|
+
detailColumnsEntryKey,
|
|
65
|
+
readColumnsEntry,
|
|
66
|
+
writeColumnsEntry
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=dataTableColumnsStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataTableColumnsStore.js","sources":["../../../../src/components/UI/DataTable/dataTableColumnsStore.ts"],"sourcesContent":["import { readUiPreference, writeUiPreference } from '@/helpers/uiPreferences';\nimport { isJSON } from '@/helpers/utilityHelpers';\nimport type { VisibilityState } from '@tanstack/react-table';\n\n// Single localStorage entry for every table. Keys are the table `entityKey`,\n// values hold that table's column preferences (order + visibility together).\nconst COLUMNS_STORAGE_KEY = 'datatable-columns' as const;\nconst LEGACY_PER_TABLE_KEY_PREFIX = `${COLUMNS_STORAGE_KEY}-`;\n// A pre-release build of the column-ordering feature briefly wrote order to its\n// own key. It never reached production, so drop it and spare branch testers an\n// orphaned entry no one reads.\nconst ABANDONED_ORDER_KEY = 'datatable-column-order';\n\nexport interface IDataTableColumnsEntry {\n /** Full column order: fixed start + reorderable + fixed end. */\n order?: Array<string>;\n /** Visibility of hideable columns only, never the non-hideable ones. */\n visibility?: VisibilityState;\n /** User-resized column widths in pixels, keyed by column id. */\n sizing?: Record<string, number>;\n}\n\ntype TDataTableColumnsStore = Record<string, IDataTableColumnsEntry>;\n\n// Older builds stored the entry as a bare visibility map (`{ colors: { rgb: false } }`).\n// Detect the current shape structurally rather than by key presence, so a legacy\n// map holding a column literally named `order`/`visibility` is not misread.\nconst isCurrentEntryShape = (entry: object): boolean => {\n const candidate = entry as { order?: unknown; visibility?: unknown; sizing?: unknown };\n\n return (\n Array.isArray(candidate.order) ||\n (!!candidate.visibility && typeof candidate.visibility === 'object') ||\n (!!candidate.sizing && typeof candidate.sizing === 'object')\n );\n};\n\nconst normalizeSizing = (sizing: unknown): Record<string, number> | undefined => {\n if (!sizing || typeof sizing !== 'object') return undefined;\n\n const result: Record<string, number> = {};\n for (const [columnId, width] of Object.entries(sizing as Record<string, unknown>)) {\n if (typeof width === 'number' && Number.isFinite(width)) result[columnId] = width;\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n};\n\nconst normalizeEntry = (entry: unknown): IDataTableColumnsEntry => {\n if (!entry || typeof entry !== 'object') return {};\n if (!isCurrentEntryShape(entry)) return { visibility: entry as VisibilityState };\n\n const candidate = entry as { order?: unknown; visibility?: unknown; sizing?: unknown };\n\n return {\n order: Array.isArray(candidate.order)\n ? candidate.order.filter((id): id is string => typeof id === 'string')\n : undefined,\n visibility:\n candidate.visibility && typeof candidate.visibility === 'object'\n ? (candidate.visibility as VisibilityState)\n : undefined,\n sizing: normalizeSizing(candidate.sizing),\n };\n};\n\n// Reading normalizes the legacy shape on the fly, so the upgrade costs nothing\n// and lands on disk at the next write. Only the per-table keys need a real\n// migration, since they live outside the consolidated entry.\nconst readNormalizedStore = (): TDataTableColumnsStore => {\n const raw = readUiPreference<Record<string, unknown>>(COLUMNS_STORAGE_KEY) ?? {};\n const store: TDataTableColumnsStore = {};\n\n for (const [entityKey, entry] of Object.entries(raw)) store[entityKey] = normalizeEntry(entry);\n\n return store;\n};\n\nlet didMigrateOrphanKeys = false;\nconst migrateOrphanKeys = (): void => {\n if (didMigrateOrphanKeys) return;\n didMigrateOrphanKeys = true;\n\n const legacyKeys = Object.keys(localStorage).filter((key) => key.startsWith(LEGACY_PER_TABLE_KEY_PREFIX));\n const hasAbandonedOrderKey = localStorage.getItem(ABANDONED_ORDER_KEY) !== null;\n if (legacyKeys.length === 0 && !hasAbandonedOrderKey) return;\n\n const store = readNormalizedStore();\n\n for (const legacyKey of legacyKeys) {\n const entityKey = legacyKey.slice(LEGACY_PER_TABLE_KEY_PREFIX.length);\n const raw = localStorage.getItem(legacyKey);\n if (!store[entityKey]?.visibility && raw && isJSON(raw)) {\n store[entityKey] = { ...store[entityKey], visibility: JSON.parse(raw) as VisibilityState };\n }\n localStorage.removeItem(legacyKey);\n }\n\n localStorage.removeItem(ABANDONED_ORDER_KEY);\n writeUiPreference(COLUMNS_STORAGE_KEY, store);\n};\n\n// Detail (child) columns of a master/detail table persist their own entry so\n// each side keeps independent order and visibility preferences.\nexport const detailColumnsEntryKey = (entityKey: string): string => `${entityKey}:detail`;\n\nexport const readColumnsEntry = (entityKey: string): IDataTableColumnsEntry => {\n migrateOrphanKeys();\n\n return readNormalizedStore()[entityKey] ?? {};\n};\n\n// Patch-merges into the existing entry so the order and visibility hooks each\n// persist their own slice without clobbering the other.\nexport const writeColumnsEntry = (entityKey: string, patch: IDataTableColumnsEntry): void => {\n migrateOrphanKeys();\n\n const store = readNormalizedStore();\n writeUiPreference(COLUMNS_STORAGE_KEY, { ...store, [entityKey]: { ...store[entityKey], ...patch } });\n};\n"],"names":[],"mappings":";;AAMA,MAAM,sBAAsB;AAC5B,MAAM,8BAA8B,GAAG,mBAAmB;AAI1D,MAAM,sBAAsB;AAgB5B,MAAM,sBAAsB,CAAC,UAA2B;AACtD,QAAM,YAAY;AAElB,SACE,MAAM,QAAQ,UAAU,KAAK,KAC5B,CAAC,CAAC,UAAU,cAAc,OAAO,UAAU,eAAe,YAC1D,CAAC,CAAC,UAAU,UAAU,OAAO,UAAU,WAAW;AAEvD;AAEA,MAAM,kBAAkB,CAAC,WAAwD;AAC/E,MAAI,CAAC,UAAU,OAAO,WAAW,SAAU,QAAO;AAElD,QAAM,SAAiC,CAAA;AACvC,aAAW,CAAC,UAAU,KAAK,KAAK,OAAO,QAAQ,MAAiC,GAAG;AACjF,QAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,EAAG,QAAO,QAAQ,IAAI;AAAA,EAC9E;AAEA,SAAO,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS;AACnD;AAEA,MAAM,iBAAiB,CAAC,UAA2C;AACjE,MAAI,CAAC,SAAS,OAAO,UAAU,iBAAiB,CAAA;AAChD,MAAI,CAAC,oBAAoB,KAAK,EAAG,QAAO,EAAE,YAAY,MAAA;AAEtD,QAAM,YAAY;AAElB,SAAO;AAAA,IACL,OAAO,MAAM,QAAQ,UAAU,KAAK,IAChC,UAAU,MAAM,OAAO,CAAC,OAAqB,OAAO,OAAO,QAAQ,IACnE;AAAA,IACJ,YACE,UAAU,cAAc,OAAO,UAAU,eAAe,WACnD,UAAU,aACX;AAAA,IACN,QAAQ,gBAAgB,UAAU,MAAM;AAAA,EAAA;AAE5C;AAKA,MAAM,sBAAsB,MAA8B;AACxD,QAAM,MAAM,iBAA0C,mBAAmB,KAAK,CAAA;AAC9E,QAAM,QAAgC,CAAA;AAEtC,aAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,GAAG,EAAG,OAAM,SAAS,IAAI,eAAe,KAAK;AAE7F,SAAO;AACT;AAEA,IAAI,uBAAuB;AAC3B,MAAM,oBAAoB,MAAY;AACpC,MAAI,qBAAsB;AAC1B,yBAAuB;AAEvB,QAAM,aAAa,OAAO,KAAK,YAAY,EAAE,OAAO,CAAC,QAAQ,IAAI,WAAW,2BAA2B,CAAC;AACxG,QAAM,uBAAuB,aAAa,QAAQ,mBAAmB,MAAM;AAC3E,MAAI,WAAW,WAAW,KAAK,CAAC,qBAAsB;AAEtD,QAAM,QAAQ,oBAAA;AAEd,aAAW,aAAa,YAAY;AAClC,UAAM,YAAY,UAAU,MAAM,4BAA4B,MAAM;AACpE,UAAM,MAAM,aAAa,QAAQ,SAAS;AAC1C,QAAI,CAAC,MAAM,SAAS,GAAG,cAAc,OAAO,OAAO,GAAG,GAAG;AACvD,YAAM,SAAS,IAAI,EAAE,GAAG,MAAM,SAAS,GAAG,YAAY,KAAK,MAAM,GAAG,EAAA;AAAA,IACtE;AACA,iBAAa,WAAW,SAAS;AAAA,EACnC;AAEA,eAAa,WAAW,mBAAmB;AAC3C,oBAAkB,qBAAqB,KAAK;AAC9C;AAIO,MAAM,wBAAwB,CAAC,cAA8B,GAAG,SAAS;AAEzE,MAAM,mBAAmB,CAAC,cAA8C;AAC7E,oBAAA;AAEA,SAAO,oBAAA,EAAsB,SAAS,KAAK,CAAA;AAC7C;AAIO,MAAM,oBAAoB,CAAC,WAAmB,UAAwC;AAC3F,oBAAA;AAEA,QAAM,QAAQ,oBAAA;AACd,oBAAkB,qBAAqB,EAAE,GAAG,OAAO,CAAC,SAAS,GAAG,EAAE,GAAG,MAAM,SAAS,GAAG,GAAG,MAAA,GAAS;AACrG;"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const DATA_TABLE_OPACITY_TRANSITION_MS = 200;
|
|
2
|
+
export declare const DATA_TABLE_CROSSFADE_DIP_OPACITY = 0.55;
|
|
3
|
+
export declare const DATA_TABLE_UPDATING_OPACITY = 0.8;
|
|
4
|
+
export declare const DATA_TABLE_UPDATING_BAR_DELAY_MS = 100;
|
|
5
|
+
export declare const dataTableOpacityTransitionClass = "transition-opacity duration-base ease-out";
|
|
6
|
+
export declare const prefersReducedMotion: () => boolean;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const DATA_TABLE_OPACITY_TRANSITION_MS = 200;
|
|
2
|
+
const DATA_TABLE_CROSSFADE_DIP_OPACITY = 0.55;
|
|
3
|
+
const DATA_TABLE_UPDATING_OPACITY = 0.8;
|
|
4
|
+
const DATA_TABLE_UPDATING_BAR_DELAY_MS = 100;
|
|
5
|
+
const dataTableOpacityTransitionClass = "transition-opacity duration-base ease-out";
|
|
6
|
+
const prefersReducedMotion = () => typeof window !== "undefined" && typeof window.matchMedia === "function" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
7
|
+
export {
|
|
8
|
+
DATA_TABLE_CROSSFADE_DIP_OPACITY,
|
|
9
|
+
DATA_TABLE_OPACITY_TRANSITION_MS,
|
|
10
|
+
DATA_TABLE_UPDATING_BAR_DELAY_MS,
|
|
11
|
+
DATA_TABLE_UPDATING_OPACITY,
|
|
12
|
+
dataTableOpacityTransitionClass,
|
|
13
|
+
prefersReducedMotion
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=dataTableMotion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataTableMotion.js","sources":["../../../../src/components/UI/DataTable/dataTableMotion.ts"],"sourcesContent":["export const DATA_TABLE_OPACITY_TRANSITION_MS = 200;\nexport const DATA_TABLE_CROSSFADE_DIP_OPACITY = 0.55;\nexport const DATA_TABLE_UPDATING_OPACITY = 0.8;\nexport const DATA_TABLE_UPDATING_BAR_DELAY_MS = 100;\n\nexport const dataTableOpacityTransitionClass = 'transition-opacity duration-base ease-out';\n\nexport const prefersReducedMotion = (): boolean =>\n typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function' &&\n window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n"],"names":[],"mappings":"AAAO,MAAM,mCAAmC;AACzC,MAAM,mCAAmC;AACzC,MAAM,8BAA8B;AACpC,MAAM,mCAAmC;AAEzC,MAAM,kCAAkC;AAExC,MAAM,uBAAuB,MAClC,OAAO,WAAW,eAClB,OAAO,OAAO,eAAe,cAC7B,OAAO,WAAW,kCAAkC,EAAE;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* The small square at the bottom-right of the selection. It drives the drag with
|
|
4
|
+
* pointer capture, so every move event is delivered to this element and the grid
|
|
5
|
+
* needs no document-level pointer listeners.
|
|
6
|
+
*/
|
|
7
|
+
declare const GridFillHandle: React.FC;
|
|
8
|
+
export default GridFillHandle;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect } from "react";
|
|
3
|
+
import { useTranslation } from "react-i18next";
|
|
4
|
+
import ControlledButton from "../../../Form/ControlledButton.js";
|
|
5
|
+
import ControlledTooltip from "../../ControlledTooltip.js";
|
|
6
|
+
import { useGridStoreApi, useGridCellRegistry } from "./GridProvider.js";
|
|
7
|
+
import { GRID_CELL_DATA_ATTR, GRID_ROW_DATA_ATTR, GRID_COLUMN_DATA_ATTR } from "./gridTypes.js";
|
|
8
|
+
const GridFillHandle = () => {
|
|
9
|
+
const { t } = useTranslation("ui");
|
|
10
|
+
const store = useGridStoreApi();
|
|
11
|
+
const registry = useGridCellRegistry();
|
|
12
|
+
const [isDragging, setIsDragging] = useState(false);
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
if (!isDragging || !store) return void 0;
|
|
15
|
+
const handleKeyDown = (event) => {
|
|
16
|
+
if (event.key !== "Escape") return;
|
|
17
|
+
store.getState().cancelFill();
|
|
18
|
+
setIsDragging(false);
|
|
19
|
+
};
|
|
20
|
+
window.addEventListener("keydown", handleKeyDown);
|
|
21
|
+
return () => window.removeEventListener("keydown", handleKeyDown);
|
|
22
|
+
}, [isDragging, store]);
|
|
23
|
+
const handlePointerDown = (event) => {
|
|
24
|
+
if (!store) return;
|
|
25
|
+
event.preventDefault();
|
|
26
|
+
event.stopPropagation();
|
|
27
|
+
event.currentTarget.setPointerCapture(event.pointerId);
|
|
28
|
+
store.getState().startFill();
|
|
29
|
+
setIsDragging(true);
|
|
30
|
+
};
|
|
31
|
+
const handlePointerMove = (event) => {
|
|
32
|
+
if (!store || !store.getState().fillSourceRect) return;
|
|
33
|
+
const elementUnderPointer = document.elementFromPoint(event.clientX, event.clientY);
|
|
34
|
+
const cell = elementUnderPointer?.closest(`[${GRID_CELL_DATA_ATTR}]`);
|
|
35
|
+
const rowId = cell?.getAttribute(GRID_ROW_DATA_ATTR);
|
|
36
|
+
const columnId = cell?.getAttribute(GRID_COLUMN_DATA_ATTR);
|
|
37
|
+
if (!rowId || !columnId) return;
|
|
38
|
+
store.getState().updateFillTarget({ rowId, columnId });
|
|
39
|
+
};
|
|
40
|
+
const handlePointerUp = (event) => {
|
|
41
|
+
setIsDragging(false);
|
|
42
|
+
if (event.currentTarget.hasPointerCapture(event.pointerId)) {
|
|
43
|
+
event.currentTarget.releasePointerCapture(event.pointerId);
|
|
44
|
+
}
|
|
45
|
+
if (!store) return;
|
|
46
|
+
const result = store.getState().endFill();
|
|
47
|
+
if (result) registry?.commitFill(result);
|
|
48
|
+
};
|
|
49
|
+
return /* @__PURE__ */ jsx(ControlledTooltip, { content: t("dataTable.fillHandle"), children: /* @__PURE__ */ jsx(
|
|
50
|
+
ControlledButton,
|
|
51
|
+
{
|
|
52
|
+
defaultHtmlButton: true,
|
|
53
|
+
tabIndex: -1,
|
|
54
|
+
onMouseDown: (event) => event.stopPropagation(),
|
|
55
|
+
onPointerDown: handlePointerDown,
|
|
56
|
+
onPointerMove: handlePointerMove,
|
|
57
|
+
onPointerUp: handlePointerUp,
|
|
58
|
+
onPointerCancel: () => {
|
|
59
|
+
setIsDragging(false);
|
|
60
|
+
store?.getState().cancelFill();
|
|
61
|
+
},
|
|
62
|
+
className: "absolute bottom-0 right-0 z-30 size-2 cursor-crosshair rounded-[0.125rem] bg-brand",
|
|
63
|
+
children: null
|
|
64
|
+
}
|
|
65
|
+
) });
|
|
66
|
+
};
|
|
67
|
+
export {
|
|
68
|
+
GridFillHandle as default
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=GridFillHandle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GridFillHandle.js","sources":["../../../../../src/components/UI/DataTable/grid/GridFillHandle.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport ControlledButton from '@/components/Form/ControlledButton';\nimport ControlledTooltip from '@/components/UI/ControlledTooltip';\n\nimport { useGridCellRegistry, useGridStoreApi } from './GridProvider';\nimport { GRID_CELL_DATA_ATTR, GRID_COLUMN_DATA_ATTR, GRID_ROW_DATA_ATTR } from './gridTypes';\n\n/**\n * The small square at the bottom-right of the selection. It drives the drag with\n * pointer capture, so every move event is delivered to this element and the grid\n * needs no document-level pointer listeners.\n */\nconst GridFillHandle: React.FC = () => {\n const { t } = useTranslation('ui');\n const store = useGridStoreApi();\n const registry = useGridCellRegistry();\n const [isDragging, setIsDragging] = useState(false);\n\n useEffect(() => {\n if (!isDragging || !store) return undefined;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') return;\n store.getState().cancelFill();\n setIsDragging(false);\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [isDragging, store]);\n\n const handlePointerDown = (event: React.PointerEvent<HTMLButtonElement>) => {\n if (!store) return;\n event.preventDefault();\n event.stopPropagation();\n event.currentTarget.setPointerCapture(event.pointerId);\n store.getState().startFill();\n setIsDragging(true);\n };\n\n const handlePointerMove = (event: React.PointerEvent<HTMLButtonElement>) => {\n if (!store || !store.getState().fillSourceRect) return;\n\n const elementUnderPointer = document.elementFromPoint(event.clientX, event.clientY);\n const cell = elementUnderPointer?.closest(`[${GRID_CELL_DATA_ATTR}]`);\n const rowId = cell?.getAttribute(GRID_ROW_DATA_ATTR);\n const columnId = cell?.getAttribute(GRID_COLUMN_DATA_ATTR);\n if (!rowId || !columnId) return;\n\n store.getState().updateFillTarget({ rowId, columnId });\n };\n\n const handlePointerUp = (event: React.PointerEvent<HTMLButtonElement>) => {\n setIsDragging(false);\n if (event.currentTarget.hasPointerCapture(event.pointerId)) {\n event.currentTarget.releasePointerCapture(event.pointerId);\n }\n if (!store) return;\n\n const result = store.getState().endFill();\n if (result) registry?.commitFill(result);\n };\n\n return (\n <ControlledTooltip content={t('dataTable.fillHandle')}>\n <ControlledButton\n defaultHtmlButton\n // Out of the tab order on purpose: the handle is a pointer affordance, and\n // the keyboard reaches the same result by editing the cells directly.\n tabIndex={-1}\n // The cell below listens to `mousedown` to move the active cell. Preventing\n // the pointer event does not always suppress that compatibility event, and\n // letting it through would collapse the range the drag is about to read.\n onMouseDown={(event) => event.stopPropagation()}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={() => {\n setIsDragging(false);\n store?.getState().cancelFill();\n }}\n className=\"absolute bottom-0 right-0 z-30 size-2 cursor-crosshair rounded-[0.125rem] bg-brand\"\n >\n {null}\n </ControlledButton>\n </ControlledTooltip>\n );\n};\n\nexport default GridFillHandle;\n"],"names":[],"mappings":";;;;;;;AAcA,MAAM,iBAA2B,MAAM;AACrC,QAAM,EAAE,EAAA,IAAM,eAAe,IAAI;AACjC,QAAM,QAAQ,gBAAA;AACd,QAAM,WAAW,oBAAA;AACjB,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAElD,YAAU,MAAM;AACd,QAAI,CAAC,cAAc,CAAC,MAAO,QAAO;AAElC,UAAM,gBAAgB,CAAC,UAAyB;AAC9C,UAAI,MAAM,QAAQ,SAAU;AAC5B,YAAM,SAAA,EAAW,WAAA;AACjB,oBAAc,KAAK;AAAA,IACrB;AAEA,WAAO,iBAAiB,WAAW,aAAa;AAChD,WAAO,MAAM,OAAO,oBAAoB,WAAW,aAAa;AAAA,EAClE,GAAG,CAAC,YAAY,KAAK,CAAC;AAEtB,QAAM,oBAAoB,CAAC,UAAiD;AAC1E,QAAI,CAAC,MAAO;AACZ,UAAM,eAAA;AACN,UAAM,gBAAA;AACN,UAAM,cAAc,kBAAkB,MAAM,SAAS;AACrD,UAAM,SAAA,EAAW,UAAA;AACjB,kBAAc,IAAI;AAAA,EACpB;AAEA,QAAM,oBAAoB,CAAC,UAAiD;AAC1E,QAAI,CAAC,SAAS,CAAC,MAAM,SAAA,EAAW,eAAgB;AAEhD,UAAM,sBAAsB,SAAS,iBAAiB,MAAM,SAAS,MAAM,OAAO;AAClF,UAAM,OAAO,qBAAqB,QAAQ,IAAI,mBAAmB,GAAG;AACpE,UAAM,QAAQ,MAAM,aAAa,kBAAkB;AACnD,UAAM,WAAW,MAAM,aAAa,qBAAqB;AACzD,QAAI,CAAC,SAAS,CAAC,SAAU;AAEzB,UAAM,WAAW,iBAAiB,EAAE,OAAO,UAAU;AAAA,EACvD;AAEA,QAAM,kBAAkB,CAAC,UAAiD;AACxE,kBAAc,KAAK;AACnB,QAAI,MAAM,cAAc,kBAAkB,MAAM,SAAS,GAAG;AAC1D,YAAM,cAAc,sBAAsB,MAAM,SAAS;AAAA,IAC3D;AACA,QAAI,CAAC,MAAO;AAEZ,UAAM,SAAS,MAAM,SAAA,EAAW,QAAA;AAChC,QAAI,OAAQ,WAAU,WAAW,MAAM;AAAA,EACzC;AAEA,SACE,oBAAC,mBAAA,EAAkB,SAAS,EAAE,sBAAsB,GAClD,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,mBAAiB;AAAA,MAGjB,UAAU;AAAA,MAIV,aAAa,CAAC,UAAU,MAAM,gBAAA;AAAA,MAC9B,eAAe;AAAA,MACf,eAAe;AAAA,MACf,aAAa;AAAA,MACb,iBAAiB,MAAM;AACrB,sBAAc,KAAK;AACnB,eAAO,SAAA,EAAW,WAAA;AAAA,MACpB;AAAA,MACA,WAAU;AAAA,MAET,UAAA;AAAA,IAAA;AAAA,EAAA,GAEL;AAEJ;"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { StoreApi } from 'zustand/vanilla';
|
|
3
|
+
import { IGridFillResult, IGridState } from './gridStore';
|
|
4
|
+
import { IGridCellCoord } from './gridTypes';
|
|
5
|
+
export interface IGridCellRegistry {
|
|
6
|
+
register: (cellKey: string, element: HTMLElement | null) => void;
|
|
7
|
+
focusCell: (coord: IGridCellCoord) => void;
|
|
8
|
+
/** Hands a finished fill drag to the host table, which owns the row data. */
|
|
9
|
+
commitFill: (result: IGridFillResult) => void;
|
|
10
|
+
}
|
|
11
|
+
/** The grid store of the closest spreadsheet-enabled table, or `null` outside one. */
|
|
12
|
+
export declare const useGridStoreApi: () => StoreApi<IGridState> | null;
|
|
13
|
+
export declare const useGridCellRegistry: () => IGridCellRegistry | null;
|
|
14
|
+
/**
|
|
15
|
+
* Per-cell subscription to the grid state, as a bitmask. Reading a primitive
|
|
16
|
+
* through `useSyncExternalStore` means moving the active cell re-renders the two
|
|
17
|
+
* cells that changed, never the table.
|
|
18
|
+
*/
|
|
19
|
+
export declare const useGridCellState: (rowId: string, columnId: string) => number;
|
|
20
|
+
interface IGridProviderProps {
|
|
21
|
+
store: StoreApi<IGridState>;
|
|
22
|
+
onFillCommit?: (result: IGridFillResult) => void;
|
|
23
|
+
children: React.ReactNode;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Owns the DOM side of the grid: the cell element registry and the focus/scroll
|
|
27
|
+
* effect. It subscribes imperatively, so following the active cell costs no
|
|
28
|
+
* render of its own.
|
|
29
|
+
*/
|
|
30
|
+
declare const GridProvider: React.FC<IGridProviderProps>;
|
|
31
|
+
export default GridProvider;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useRef, useMemo, useEffect, useContext, useCallback, useSyncExternalStore } from "react";
|
|
3
|
+
import { selectGridCellState } from "./gridStore.js";
|
|
4
|
+
import { buildGridCellKey } from "./gridTypes.js";
|
|
5
|
+
const GridStoreContext = createContext(null);
|
|
6
|
+
const GridCellRegistryContext = createContext(null);
|
|
7
|
+
const useGridStoreApi = () => useContext(GridStoreContext);
|
|
8
|
+
const useGridCellRegistry = () => useContext(GridCellRegistryContext);
|
|
9
|
+
const useGridCellState = (rowId, columnId) => {
|
|
10
|
+
const store = useGridStoreApi();
|
|
11
|
+
const subscribe = useCallback(
|
|
12
|
+
(onStoreChange) => store ? store.subscribe(onStoreChange) : () => void 0,
|
|
13
|
+
[store]
|
|
14
|
+
);
|
|
15
|
+
const getSnapshot = useCallback(
|
|
16
|
+
() => store ? selectGridCellState(store.getState(), rowId, columnId) : 0,
|
|
17
|
+
[store, rowId, columnId]
|
|
18
|
+
);
|
|
19
|
+
return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
|
20
|
+
};
|
|
21
|
+
const EDITOR_FOCUS_SELECTOR = 'input, textarea, select, [contenteditable="true"], button, [tabindex]';
|
|
22
|
+
const GridEditingFocus = ({
|
|
23
|
+
store,
|
|
24
|
+
elements
|
|
25
|
+
}) => {
|
|
26
|
+
const editingKey = useSyncExternalStore(
|
|
27
|
+
useCallback((onStoreChange) => store.subscribe(onStoreChange), [store]),
|
|
28
|
+
() => {
|
|
29
|
+
const editing = store.getState().editingCell;
|
|
30
|
+
return editing ? buildGridCellKey(editing.rowId, editing.columnId) : null;
|
|
31
|
+
}
|
|
32
|
+
);
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
if (!editingKey) return;
|
|
35
|
+
elements.get(editingKey)?.querySelector(EDITOR_FOCUS_SELECTOR)?.focus();
|
|
36
|
+
}, [editingKey, elements]);
|
|
37
|
+
return null;
|
|
38
|
+
};
|
|
39
|
+
const GridProvider = ({ store, onFillCommit, children }) => {
|
|
40
|
+
const elementsRef = useRef(/* @__PURE__ */ new Map());
|
|
41
|
+
const onFillCommitRef = useRef(onFillCommit);
|
|
42
|
+
onFillCommitRef.current = onFillCommit;
|
|
43
|
+
const registry = useMemo(
|
|
44
|
+
() => ({
|
|
45
|
+
commitFill: (result) => onFillCommitRef.current?.(result),
|
|
46
|
+
register: (cellKey, element) => {
|
|
47
|
+
if (element) elementsRef.current.set(cellKey, element);
|
|
48
|
+
else elementsRef.current.delete(cellKey);
|
|
49
|
+
},
|
|
50
|
+
focusCell: (coord) => {
|
|
51
|
+
const element = elementsRef.current.get(buildGridCellKey(coord.rowId, coord.columnId));
|
|
52
|
+
if (!element) return;
|
|
53
|
+
element.focus({ preventScroll: true });
|
|
54
|
+
element.scrollIntoView({ block: "nearest", inline: "nearest" });
|
|
55
|
+
}
|
|
56
|
+
}),
|
|
57
|
+
[]
|
|
58
|
+
);
|
|
59
|
+
useEffect(
|
|
60
|
+
() => store.subscribe((state, previous) => {
|
|
61
|
+
const activeChanged = state.activeCell?.rowId !== previous.activeCell?.rowId || state.activeCell?.columnId !== previous.activeCell?.columnId;
|
|
62
|
+
const editingEnded = !!previous.editingCell && !state.editingCell;
|
|
63
|
+
if (!activeChanged && !editingEnded) return;
|
|
64
|
+
if (state.editingCell) return;
|
|
65
|
+
const coord = state.activeCell;
|
|
66
|
+
if (!coord) return;
|
|
67
|
+
const element = elementsRef.current.get(buildGridCellKey(coord.rowId, coord.columnId));
|
|
68
|
+
if (!element) return;
|
|
69
|
+
if (editingEnded || !element.contains(document.activeElement)) element.focus({ preventScroll: true });
|
|
70
|
+
element.scrollIntoView({ block: "nearest", inline: "nearest" });
|
|
71
|
+
}),
|
|
72
|
+
[store]
|
|
73
|
+
);
|
|
74
|
+
return /* @__PURE__ */ jsx(GridStoreContext.Provider, { value: store, children: /* @__PURE__ */ jsxs(GridCellRegistryContext.Provider, { value: registry, children: [
|
|
75
|
+
/* @__PURE__ */ jsx(GridEditingFocus, { store, elements: elementsRef.current }),
|
|
76
|
+
children
|
|
77
|
+
] }) });
|
|
78
|
+
};
|
|
79
|
+
export {
|
|
80
|
+
GridProvider as default,
|
|
81
|
+
useGridCellRegistry,
|
|
82
|
+
useGridCellState,
|
|
83
|
+
useGridStoreApi
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=GridProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GridProvider.js","sources":["../../../../../src/components/UI/DataTable/grid/GridProvider.tsx"],"sourcesContent":["import React, { createContext, useCallback, useContext, useEffect, useMemo, useRef, useSyncExternalStore } from 'react';\nimport { type StoreApi } from 'zustand/vanilla';\n\nimport { type IGridFillResult, type IGridState, selectGridCellState } from './gridStore';\nimport { buildGridCellKey, type IGridCellCoord } from './gridTypes';\n\nexport interface IGridCellRegistry {\n register: (cellKey: string, element: HTMLElement | null) => void;\n focusCell: (coord: IGridCellCoord) => void;\n /** Hands a finished fill drag to the host table, which owns the row data. */\n commitFill: (result: IGridFillResult) => void;\n}\n\nconst GridStoreContext = createContext<StoreApi<IGridState> | null>(null);\nconst GridCellRegistryContext = createContext<IGridCellRegistry | null>(null);\n\n/** The grid store of the closest spreadsheet-enabled table, or `null` outside one. */\nexport const useGridStoreApi = (): StoreApi<IGridState> | null => useContext(GridStoreContext);\n\nexport const useGridCellRegistry = (): IGridCellRegistry | null => useContext(GridCellRegistryContext);\n\n/**\n * Per-cell subscription to the grid state, as a bitmask. Reading a primitive\n * through `useSyncExternalStore` means moving the active cell re-renders the two\n * cells that changed, never the table.\n */\nexport const useGridCellState = (rowId: string, columnId: string): number => {\n const store = useGridStoreApi();\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => (store ? store.subscribe(onStoreChange) : () => undefined),\n [store],\n );\n\n const getSnapshot = useCallback(\n () => (store ? selectGridCellState(store.getState(), rowId, columnId) : 0),\n [store, rowId, columnId],\n );\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n};\n\nconst EDITOR_FOCUS_SELECTOR = 'input, textarea, select, [contenteditable=\"true\"], button, [tabindex]';\n\n/**\n * Moves the focus into the editor once React has actually mounted it. The store\n * subscription cannot do this: it runs during the state update, before the cell\n * has swapped its read view for the editor.\n */\nconst GridEditingFocus: React.FC<{ store: StoreApi<IGridState>; elements: Map<string, HTMLElement> }> = ({\n store,\n elements,\n}) => {\n const editingKey = useSyncExternalStore(\n useCallback((onStoreChange: () => void) => store.subscribe(onStoreChange), [store]),\n () => {\n const editing = store.getState().editingCell;\n return editing ? buildGridCellKey(editing.rowId, editing.columnId) : null;\n },\n );\n\n useEffect(() => {\n if (!editingKey) return;\n elements.get(editingKey)?.querySelector<HTMLElement>(EDITOR_FOCUS_SELECTOR)?.focus();\n }, [editingKey, elements]);\n\n return null;\n};\n\ninterface IGridProviderProps {\n store: StoreApi<IGridState>;\n onFillCommit?: (result: IGridFillResult) => void;\n children: React.ReactNode;\n}\n\n/**\n * Owns the DOM side of the grid: the cell element registry and the focus/scroll\n * effect. It subscribes imperatively, so following the active cell costs no\n * render of its own.\n */\nconst GridProvider: React.FC<IGridProviderProps> = ({ store, onFillCommit, children }) => {\n const elementsRef = useRef(new Map<string, HTMLElement>());\n\n // Read through a ref so the registry identity never changes: it reaches every\n // cell, and a new object there would re-render the whole body.\n const onFillCommitRef = useRef(onFillCommit);\n onFillCommitRef.current = onFillCommit;\n\n const registry = useMemo<IGridCellRegistry>(\n () => ({\n commitFill: (result) => onFillCommitRef.current?.(result),\n register: (cellKey, element) => {\n if (element) elementsRef.current.set(cellKey, element);\n else elementsRef.current.delete(cellKey);\n },\n focusCell: (coord) => {\n const element = elementsRef.current.get(buildGridCellKey(coord.rowId, coord.columnId));\n if (!element) return;\n element.focus({ preventScroll: true });\n element.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n },\n }),\n [],\n );\n\n useEffect(\n () =>\n store.subscribe((state, previous) => {\n const activeChanged =\n state.activeCell?.rowId !== previous.activeCell?.rowId ||\n state.activeCell?.columnId !== previous.activeCell?.columnId;\n const editingEnded = !!previous.editingCell && !state.editingCell;\n\n if (!activeChanged && !editingEnded) return;\n if (state.editingCell) return;\n\n const coord = state.activeCell;\n if (!coord) return;\n\n const element = elementsRef.current.get(buildGridCellKey(coord.rowId, coord.columnId));\n if (!element) return;\n\n // Leaving edit mode has to claim the focus BEFORE the editor unmounts,\n // otherwise the browser drops it on the body and the arrows stop working.\n if (editingEnded || !element.contains(document.activeElement)) element.focus({ preventScroll: true });\n\n element.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n }),\n [store],\n );\n\n return (\n <GridStoreContext.Provider value={store}>\n <GridCellRegistryContext.Provider value={registry}>\n <GridEditingFocus store={store} elements={elementsRef.current} />\n {children}\n </GridCellRegistryContext.Provider>\n </GridStoreContext.Provider>\n );\n};\n\nexport default GridProvider;\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A fill strategy reads the dragged source values and produces the value for each
|
|
3
|
+
* position beyond them. Adding a pattern (weekdays, month steps, text with a
|
|
4
|
+
* trailing counter) is one entry in `GRID_FILL_STRATEGIES`, and no other file in
|
|
5
|
+
* the grid changes.
|
|
6
|
+
*/
|
|
7
|
+
export interface IGridFillStrategy {
|
|
8
|
+
id: string;
|
|
9
|
+
/** Whether this strategy recognizes the source values as its own pattern. */
|
|
10
|
+
detect: (values: Array<unknown>) => boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Value for the target at `offset` (1 = the first cell after the source, in the
|
|
13
|
+
* drag direction). `direction` is 1 downwards and -1 upwards.
|
|
14
|
+
*/
|
|
15
|
+
generate: (values: Array<unknown>, offset: number, direction: 1 | -1) => unknown;
|
|
16
|
+
}
|
|
17
|
+
/** Order matters: the first strategy that recognizes the source wins. */
|
|
18
|
+
export declare const GRID_FILL_STRATEGIES: Array<IGridFillStrategy>;
|
|
19
|
+
export declare const resolveFillStrategy: (values: Array<unknown>, preferredId?: string) => IGridFillStrategy;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
const toFiniteNumber = (value) => {
|
|
2
|
+
if (typeof value === "number") return Number.isFinite(value) ? value : null;
|
|
3
|
+
if (typeof value !== "string" || value.trim() === "") return null;
|
|
4
|
+
const parsed = Number(value.replace(",", "."));
|
|
5
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
6
|
+
};
|
|
7
|
+
const toValidDate = (value) => {
|
|
8
|
+
if (typeof value !== "string" && !(value instanceof Date)) return null;
|
|
9
|
+
const date = value instanceof Date ? value : new Date(value);
|
|
10
|
+
return Number.isNaN(date.getTime()) ? null : date;
|
|
11
|
+
};
|
|
12
|
+
const DAY_IN_MS = 24 * 60 * 60 * 1e3;
|
|
13
|
+
const constantStrategy = {
|
|
14
|
+
id: "constant",
|
|
15
|
+
detect: () => true,
|
|
16
|
+
generate: (values, offset) => {
|
|
17
|
+
if (values.length === 0) return null;
|
|
18
|
+
if (values.length === 1) return values[0];
|
|
19
|
+
const index = (offset - 1) % values.length;
|
|
20
|
+
return values[index];
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
const numericSeriesStrategy = {
|
|
24
|
+
id: "numericSeries",
|
|
25
|
+
detect: (values) => {
|
|
26
|
+
if (values.length < 2) return false;
|
|
27
|
+
const numbers = values.map(toFiniteNumber);
|
|
28
|
+
if (numbers.some((entry) => entry == null)) return false;
|
|
29
|
+
const step = numbers[1] - numbers[0];
|
|
30
|
+
return numbers.every((entry, index) => index === 0 || entry - numbers[index - 1] === step);
|
|
31
|
+
},
|
|
32
|
+
generate: (values, offset, direction) => {
|
|
33
|
+
const numbers = values.map(toFiniteNumber);
|
|
34
|
+
const step = numbers[1] - numbers[0];
|
|
35
|
+
const anchor = direction === 1 ? numbers[numbers.length - 1] : numbers[0];
|
|
36
|
+
return anchor + step * offset * direction;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
const dateSeriesStrategy = {
|
|
40
|
+
id: "dateSeries",
|
|
41
|
+
detect: (values) => {
|
|
42
|
+
if (values.length < 2) return false;
|
|
43
|
+
const dates = values.map(toValidDate);
|
|
44
|
+
if (dates.some((entry) => entry == null)) return false;
|
|
45
|
+
const step = dates[1].getTime() - dates[0].getTime();
|
|
46
|
+
if (step === 0 || step % DAY_IN_MS !== 0) return false;
|
|
47
|
+
return dates.every(
|
|
48
|
+
(entry, index) => index === 0 || entry.getTime() - dates[index - 1].getTime() === step
|
|
49
|
+
);
|
|
50
|
+
},
|
|
51
|
+
generate: (values, offset, direction) => {
|
|
52
|
+
const dates = values.map(toValidDate);
|
|
53
|
+
const step = dates[1].getTime() - dates[0].getTime();
|
|
54
|
+
const anchor = direction === 1 ? dates[dates.length - 1] : dates[0];
|
|
55
|
+
const next = new Date(anchor.getTime() + step * offset * direction);
|
|
56
|
+
return next.toISOString();
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
const GRID_FILL_STRATEGIES = [
|
|
60
|
+
dateSeriesStrategy,
|
|
61
|
+
numericSeriesStrategy,
|
|
62
|
+
constantStrategy
|
|
63
|
+
];
|
|
64
|
+
const resolveFillStrategy = (values, preferredId) => {
|
|
65
|
+
const preferred = preferredId ? GRID_FILL_STRATEGIES.find((strategy) => strategy.id === preferredId) : void 0;
|
|
66
|
+
if (preferred) return preferred;
|
|
67
|
+
return GRID_FILL_STRATEGIES.find((strategy) => strategy.detect(values)) ?? constantStrategy;
|
|
68
|
+
};
|
|
69
|
+
export {
|
|
70
|
+
GRID_FILL_STRATEGIES,
|
|
71
|
+
resolveFillStrategy
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=fillStrategies.js.map
|