@umodeapporg/ui 0.0.0-canary.ca10e69
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/README.md +78 -0
- 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 +467 -0
- package/dist/components/DateTime/DatePicker.d.ts +21 -0
- package/dist/components/DateTime/DatePicker.js +124 -0
- package/dist/components/DateTime/DatePicker.js.map +1 -0
- package/dist/components/DateTime/DateRangePicker.d.ts +21 -0
- package/dist/components/DateTime/DateRangePicker.js +208 -0
- package/dist/components/DateTime/DateRangePicker.js.map +1 -0
- package/dist/components/Form/ControlledButton.d.ts +25 -0
- package/dist/components/Form/ControlledButton.js +73 -0
- package/dist/components/Form/ControlledButton.js.map +1 -0
- package/dist/components/Form/ControlledCheckbox.d.ts +16 -0
- package/dist/components/Form/ControlledCheckbox.js +115 -0
- package/dist/components/Form/ControlledCheckbox.js.map +1 -0
- package/dist/components/Form/ControlledDialog.d.ts +51 -0
- package/dist/components/Form/ControlledDialog.js +191 -0
- package/dist/components/Form/ControlledDialog.js.map +1 -0
- package/dist/components/Form/ControlledDialogPrimitives.d.ts +53 -0
- package/dist/components/Form/ControlledDialogPrimitives.js +245 -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 +241 -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 +33 -0
- package/dist/components/Form/ControlledImage/index.js +110 -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 +53 -0
- package/dist/components/Form/ControlledSelect.js +797 -0
- package/dist/components/Form/ControlledSelect.js.map +1 -0
- package/dist/components/Form/ControlledSwitch.d.ts +21 -0
- package/dist/components/Form/ControlledSwitch.js +107 -0
- package/dist/components/Form/ControlledSwitch.js.map +1 -0
- package/dist/components/Form/ControlledTabs.d.ts +75 -0
- package/dist/components/Form/ControlledTabs.js +515 -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 +48 -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 +60 -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 +13 -0
- package/dist/components/Form/ControlledVoiceTextarea.js +99 -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/FieldLabel.d.ts +16 -0
- package/dist/components/Form/FieldLabel.js +7 -0
- package/dist/components/Form/FieldLabel.js.map +1 -0
- package/dist/components/Form/RichTextEditor.d.ts +86 -0
- package/dist/components/Form/RichTextEditor.js +581 -0
- package/dist/components/Form/RichTextEditor.js.map +1 -0
- package/dist/components/Form/attachments/AttachmentPreviewList.d.ts +22 -0
- package/dist/components/Form/attachments/AttachmentPreviewList.js +95 -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 +24 -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/LinkButton.d.ts +26 -0
- package/dist/components/Navigation/LinkButton.js +82 -0
- package/dist/components/Navigation/LinkButton.js.map +1 -0
- package/dist/components/Navigation/PageTitle.d.ts +95 -0
- package/dist/components/Navigation/PageTitle.js +241 -0
- package/dist/components/Navigation/PageTitle.js.map +1 -0
- package/dist/components/Navigation/PageTitleCollapseContext.d.ts +13 -0
- package/dist/components/Navigation/PageTitleCollapseContext.js +9 -0
- package/dist/components/Navigation/PageTitleCollapseContext.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/Navigation/ReactRouterNavigationAdapter.d.ts +7 -0
- package/dist/components/Navigation/ReactRouterNavigationAdapter.js +27 -0
- package/dist/components/Navigation/ReactRouterNavigationAdapter.js.map +1 -0
- package/dist/components/Navigation/UiNavigationContext.d.ts +38 -0
- package/dist/components/Navigation/UiNavigationContext.js +44 -0
- package/dist/components/Navigation/UiNavigationContext.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 +390 -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 +266 -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/Shell/AppHeader.d.ts +25 -0
- package/dist/components/Shell/AppHeader.js +69 -0
- package/dist/components/Shell/AppHeader.js.map +1 -0
- package/dist/components/Shell/AppShell.d.ts +22 -0
- package/dist/components/Shell/AppShell.js +146 -0
- package/dist/components/Shell/AppShell.js.map +1 -0
- package/dist/components/Shell/AppSidebar.d.ts +20 -0
- package/dist/components/Shell/AppSidebar.js +93 -0
- package/dist/components/Shell/AppSidebar.js.map +1 -0
- package/dist/components/Shell/LanguageToggle.d.ts +8 -0
- package/dist/components/Shell/LanguageToggle.js +59 -0
- package/dist/components/Shell/LanguageToggle.js.map +1 -0
- package/dist/components/Shell/PumpkinGlyph.d.ts +13 -0
- package/dist/components/Shell/PumpkinGlyph.js +29 -0
- package/dist/components/Shell/PumpkinGlyph.js.map +1 -0
- package/dist/components/Shell/SidebarMenu.d.ts +29 -0
- package/dist/components/Shell/SidebarMenu.js +254 -0
- package/dist/components/Shell/SidebarMenu.js.map +1 -0
- package/dist/components/Shell/ThemeToggle.d.ts +18 -0
- package/dist/components/Shell/ThemeToggle.js +68 -0
- package/dist/components/Shell/ThemeToggle.js.map +1 -0
- package/dist/components/Shell/headerControlStyles.d.ts +10 -0
- package/dist/components/Shell/headerControlStyles.js +11 -0
- package/dist/components/Shell/headerControlStyles.js.map +1 -0
- package/dist/components/Shell/sidebarFavorites.d.ts +21 -0
- package/dist/components/Shell/sidebarFavorites.js +69 -0
- package/dist/components/Shell/sidebarFavorites.js.map +1 -0
- package/dist/components/Shell/useSidebarState.d.ts +14 -0
- package/dist/components/Shell/useSidebarState.js +106 -0
- package/dist/components/Shell/useSidebarState.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 +27 -0
- package/dist/components/UI/BaseDataCard.js +170 -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 +127 -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 +190 -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 +95 -0
- package/dist/components/UI/ControlledAccordion.js.map +1 -0
- package/dist/components/UI/ControlledCollapse.d.ts +18 -0
- package/dist/components/UI/ControlledCollapse.js +40 -0
- package/dist/components/UI/ControlledCollapse.js.map +1 -0
- package/dist/components/UI/ControlledMenu.d.ts +79 -0
- package/dist/components/UI/ControlledMenu.js +234 -0
- package/dist/components/UI/ControlledMenu.js.map +1 -0
- package/dist/components/UI/ControlledPopover.d.ts +59 -0
- package/dist/components/UI/ControlledPopover.js +189 -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 +15 -0
- package/dist/components/UI/ControlledSlider.js +34 -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 +146 -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 +108 -0
- package/dist/components/UI/DataTable/DataTable.js +606 -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 +33 -0
- package/dist/components/UI/DataTable/DataTableBody.js +260 -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 +88 -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 +282 -0
- package/dist/components/UI/DataTable/DataTableBulkEditDialog.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableBulkEditRowsPicker.d.ts +13 -0
- package/dist/components/UI/DataTable/DataTableBulkEditRowsPicker.js +95 -0
- package/dist/components/UI/DataTable/DataTableBulkEditRowsPicker.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableBulkEditValueEditor.d.ts +20 -0
- package/dist/components/UI/DataTable/DataTableBulkEditValueEditor.js +94 -0
- package/dist/components/UI/DataTable/DataTableBulkEditValueEditor.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableColumnToggle.d.ts +34 -0
- package/dist/components/UI/DataTable/DataTableColumnToggle.js +170 -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 +65 -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 +149 -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 +110 -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 +54 -0
- package/dist/components/UI/DataTable/applyDataTableFilters.js.map +1 -0
- package/dist/components/UI/DataTable/bulkEditValues.d.ts +8 -0
- package/dist/components/UI/DataTable/bulkEditValues.js +13 -0
- package/dist/components/UI/DataTable/bulkEditValues.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 +36 -0
- package/dist/components/UI/DataTable/grid/GridProvider.js +128 -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 +82 -0
- package/dist/components/UI/DataTable/grid/gridStore.js +259 -0
- package/dist/components/UI/DataTable/grid/gridStore.js.map +1 -0
- package/dist/components/UI/DataTable/grid/gridTypes.d.ts +59 -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 +25 -0
- package/dist/components/UI/DataTable/grid/useGridKeyboard.js +135 -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 +535 -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 +336 -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/useDataTableUndoHistory.d.ts +30 -0
- package/dist/components/UI/DataTable/useDataTableUndoHistory.js +130 -0
- package/dist/components/UI/DataTable/useDataTableUndoHistory.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/Flow/FlowAnnotationDraftPreview.d.ts +6 -0
- package/dist/components/UI/Flow/FlowAnnotationDraftPreview.js +65 -0
- package/dist/components/UI/Flow/FlowAnnotationDraftPreview.js.map +1 -0
- package/dist/components/UI/Flow/FlowAnnotationNode.d.ts +34 -0
- package/dist/components/UI/Flow/FlowAnnotationNode.js +231 -0
- package/dist/components/UI/Flow/FlowAnnotationNode.js.map +1 -0
- package/dist/components/UI/Flow/FlowAnnotationToolbar.d.ts +32 -0
- package/dist/components/UI/Flow/FlowAnnotationToolbar.js +298 -0
- package/dist/components/UI/Flow/FlowAnnotationToolbar.js.map +1 -0
- package/dist/components/UI/Flow/FlowBlockNode.d.ts +35 -0
- package/dist/components/UI/Flow/FlowBlockNode.js +91 -0
- package/dist/components/UI/Flow/FlowBlockNode.js.map +1 -0
- package/dist/components/UI/Flow/FlowCanvas.d.ts +23 -0
- package/dist/components/UI/Flow/FlowCanvas.js +559 -0
- package/dist/components/UI/Flow/FlowCanvas.js.map +1 -0
- package/dist/components/UI/Flow/FlowConnectionEdge.d.ts +18 -0
- package/dist/components/UI/Flow/FlowConnectionEdge.js +116 -0
- package/dist/components/UI/Flow/FlowConnectionEdge.js.map +1 -0
- package/dist/components/UI/Flow/FlowEditorProvider.d.ts +17 -0
- package/dist/components/UI/Flow/FlowEditorProvider.js +27 -0
- package/dist/components/UI/Flow/FlowEditorProvider.js.map +1 -0
- package/dist/components/UI/Flow/FlowInspector.d.ts +11 -0
- package/dist/components/UI/Flow/FlowInspector.js +131 -0
- package/dist/components/UI/Flow/FlowInspector.js.map +1 -0
- package/dist/components/UI/Flow/FlowIssueList.d.ts +8 -0
- package/dist/components/UI/Flow/FlowIssueList.js +55 -0
- package/dist/components/UI/Flow/FlowIssueList.js.map +1 -0
- package/dist/components/UI/Flow/FlowLaneMap.d.ts +30 -0
- package/dist/components/UI/Flow/FlowLaneMap.js +206 -0
- package/dist/components/UI/Flow/FlowLaneMap.js.map +1 -0
- package/dist/components/UI/Flow/FlowNodeShell.d.ts +20 -0
- package/dist/components/UI/Flow/FlowNodeShell.js +81 -0
- package/dist/components/UI/Flow/FlowNodeShell.js.map +1 -0
- package/dist/components/UI/Flow/FlowResizablePanel.d.ts +20 -0
- package/dist/components/UI/Flow/FlowResizablePanel.js +118 -0
- package/dist/components/UI/Flow/FlowResizablePanel.js.map +1 -0
- package/dist/components/UI/Flow/FlowSelectionBar.d.ts +10 -0
- package/dist/components/UI/Flow/FlowSelectionBar.js +56 -0
- package/dist/components/UI/Flow/FlowSelectionBar.js.map +1 -0
- package/dist/components/UI/Flow/FlowZoomControls.d.ts +12 -0
- package/dist/components/UI/Flow/FlowZoomControls.js +54 -0
- package/dist/components/UI/Flow/FlowZoomControls.js.map +1 -0
- package/dist/components/UI/Flow/flowAnnotations.d.ts +38 -0
- package/dist/components/UI/Flow/flowAnnotations.js +123 -0
- package/dist/components/UI/Flow/flowAnnotations.js.map +1 -0
- package/dist/components/UI/Flow/flowBlockRegistry.d.ts +12 -0
- package/dist/components/UI/Flow/flowBlockRegistry.js +20 -0
- package/dist/components/UI/Flow/flowBlockRegistry.js.map +1 -0
- package/dist/components/UI/Flow/flowEditorStore.d.ts +73 -0
- package/dist/components/UI/Flow/flowEditorStore.js +402 -0
- package/dist/components/UI/Flow/flowEditorStore.js.map +1 -0
- package/dist/components/UI/Flow/flowGraph.d.ts +32 -0
- package/dist/components/UI/Flow/flowGraph.js +157 -0
- package/dist/components/UI/Flow/flowGraph.js.map +1 -0
- package/dist/components/UI/Flow/flowTypes.d.ts +104 -0
- package/dist/components/UI/Flow/flowTypes.js +2 -0
- package/dist/components/UI/Flow/flowTypes.js.map +1 -0
- package/dist/components/UI/Flow/flowViewport.d.ts +25 -0
- package/dist/components/UI/Flow/flowViewport.js +31 -0
- package/dist/components/UI/Flow/flowViewport.js.map +1 -0
- package/dist/components/UI/Flow/index.d.ts +13 -0
- package/dist/components/UI/Flow/index.js +44 -0
- package/dist/components/UI/Flow/index.js.map +1 -0
- package/dist/components/UI/Flow/useFlowAnnotationDrawing.d.ts +25 -0
- package/dist/components/UI/Flow/useFlowAnnotationDrawing.js +117 -0
- package/dist/components/UI/Flow/useFlowAnnotationDrawing.js.map +1 -0
- package/dist/components/UI/Flow/useFlowLabels.d.ts +10 -0
- package/dist/components/UI/Flow/useFlowLabels.js +51 -0
- package/dist/components/UI/Flow/useFlowLabels.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 +74 -0
- package/dist/components/UI/HorizontalScrollArea.js.map +1 -0
- package/dist/components/UI/ImageAiAdjust/ImageAiAdjustDialog.d.ts +21 -0
- package/dist/components/UI/ImageAiAdjust/ImageAiAdjustDialog.js +235 -0
- package/dist/components/UI/ImageAiAdjust/ImageAiAdjustDialog.js.map +1 -0
- package/dist/components/UI/ImageAiAdjust/ImageAiDiscardReasonDialog.d.ts +8 -0
- package/dist/components/UI/ImageAiAdjust/ImageAiDiscardReasonDialog.js +67 -0
- package/dist/components/UI/ImageAiAdjust/ImageAiDiscardReasonDialog.js.map +1 -0
- package/dist/components/UI/ImageAiAdjust/ImageAiVerificationNotice.d.ts +8 -0
- package/dist/components/UI/ImageAiAdjust/ImageAiVerificationNotice.js +39 -0
- package/dist/components/UI/ImageAiAdjust/ImageAiVerificationNotice.js.map +1 -0
- package/dist/components/UI/ImageAiAdjust/imageAiReview.d.ts +22 -0
- package/dist/components/UI/ImageAiAdjust/imageAiReview.js +37 -0
- package/dist/components/UI/ImageAiAdjust/imageAiReview.js.map +1 -0
- package/dist/components/UI/ImageAiAdjust/imageAiVerification.d.ts +19 -0
- package/dist/components/UI/ImageAiAdjust/imageAiVerification.js +25 -0
- package/dist/components/UI/ImageAiAdjust/imageAiVerification.js.map +1 -0
- package/dist/components/UI/ImageAiAdjust/useImageAiAdjust.d.ts +52 -0
- package/dist/components/UI/ImageAiAdjust/useImageAiAdjust.js +109 -0
- package/dist/components/UI/ImageAiAdjust/useImageAiAdjust.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/AnnotationEditor.d.ts +13 -0
- package/dist/components/UI/ImageAnnotator/AnnotationEditor.js +362 -0
- package/dist/components/UI/ImageAnnotator/AnnotationEditor.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/ImageAnnotationDialog.d.ts +15 -0
- package/dist/components/UI/ImageAnnotator/ImageAnnotationDialog.js +61 -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/AnnotationCropFrame.d.ts +16 -0
- package/dist/components/UI/ImageAnnotator/canvas/AnnotationCropFrame.js +156 -0
- package/dist/components/UI/ImageAnnotator/canvas/AnnotationCropFrame.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 +127 -0
- package/dist/components/UI/ImageAnnotator/canvas/AnnotationSelection.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/canvas/AnnotationStage.d.ts +26 -0
- package/dist/components/UI/ImageAnnotator/canvas/AnnotationStage.js +241 -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 +70 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationColorPopover.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationCropBar.d.ts +12 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationCropBar.js +89 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationCropBar.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 +17 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationTextOverlay.js +79 -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 +91 -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/annotationCrop.d.ts +12 -0
- package/dist/components/UI/ImageAnnotator/helpers/annotationCrop.js +64 -0
- package/dist/components/UI/ImageAnnotator/helpers/annotationCrop.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 +29 -0
- package/dist/components/UI/ImageAnnotator/hooks/useAnnotationDocument.js +160 -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 +80 -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 +98 -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/ImageMaskPainter/index.d.ts +24 -0
- package/dist/components/UI/ImageMaskPainter/index.js +284 -0
- package/dist/components/UI/ImageMaskPainter/index.js.map +1 -0
- package/dist/components/UI/ImageMaskPainter/maskStrokes.d.ts +19 -0
- package/dist/components/UI/ImageMaskPainter/maskStrokes.js +71 -0
- package/dist/components/UI/ImageMaskPainter/maskStrokes.js.map +1 -0
- package/dist/components/UI/ImagePlaceholder.d.ts +24 -0
- package/dist/components/UI/ImagePlaceholder.js +29 -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 +53 -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 +91 -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 +51 -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 +30 -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 +22 -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/UserMenu.d.ts +50 -0
- package/dist/components/UI/UserMenu.js +212 -0
- package/dist/components/UI/UserMenu.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/iconFont.d.ts +9 -0
- package/dist/helpers/iconFont.js +37 -0
- package/dist/helpers/iconFont.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 +32 -0
- package/dist/helpers/imageFile.js +108 -0
- package/dist/helpers/imageFile.js.map +1 -0
- package/dist/helpers/layeredSurfaces.d.ts +28 -0
- package/dist/helpers/layeredSurfaces.js +19 -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 +10 -0
- package/dist/helpers/mergeClasses.js +34 -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 +59 -0
- package/dist/helpers/objectHelpers.js.map +1 -0
- package/dist/helpers/portalHost.d.ts +10 -0
- package/dist/helpers/portalHost.js +7 -0
- package/dist/helpers/portalHost.js.map +1 -0
- package/dist/helpers/richText.d.ts +46 -0
- package/dist/helpers/richText.js +197 -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/themeSkins.d.ts +12 -0
- package/dist/helpers/themeSkins.js +13 -0
- package/dist/helpers/themeSkins.js.map +1 -0
- package/dist/helpers/themeTokens.d.ts +28 -0
- package/dist/helpers/themeTokens.js +35 -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 +42 -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/useThemeSkin.d.ts +7 -0
- package/dist/hooks/useThemeSkin.js +19 -0
- package/dist/hooks/useThemeSkin.js.map +1 -0
- package/dist/hooks/useVoiceTranscription.d.ts +29 -0
- package/dist/hooks/useVoiceTranscription.js +208 -0
- package/dist/hooks/useVoiceTranscription.js.map +1 -0
- package/dist/index.d.ts +63 -0
- package/dist/index.js +157 -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 +12 -0
- package/dist/interfaces/IFilterOption.js +2 -0
- package/dist/interfaces/IFilterOption.js.map +1 -0
- package/dist/locales/en/ui.json.d.ts +682 -0
- package/dist/locales/en/ui.json.js +120 -0
- package/dist/locales/en/ui.json.js.map +1 -0
- package/dist/locales/index.d.ts +1362 -0
- package/dist/locales/index.js +7 -0
- package/dist/locales/index.js.map +1 -0
- package/dist/locales/pt/ui.json.d.ts +682 -0
- package/dist/locales/pt/ui.json.js +120 -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 +245 -0
- package/src/assets/fonts/LICENSE-Inter.txt +92 -0
- package/src/assets/fonts/LICENSE-MaterialSymbols.txt +202 -0
- package/src/assets/fonts/LICENSE-Virgil.txt +45 -0
- package/src/assets/fonts/inter-latin-ext.woff2 +0 -0
- package/src/assets/fonts/inter-latin.woff2 +0 -0
- package/src/assets/fonts/material-symbols-outlined.woff2 +0 -0
- package/src/assets/fonts/virgil.woff2 +0 -0
- package/src/assets/styles/base.css +585 -0
- package/src/assets/styles/index.css +1 -0
- package/src/assets/styles/theme.css +453 -0
- package/tailwind-plugins/glass.js +162 -0
- package/tailwind.preset.js +392 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, forwardRef, useContext } from "react";
|
|
3
|
+
import classNames from "classnames";
|
|
4
|
+
import { mergeClasses } from "../../helpers/mergeClasses.js";
|
|
5
|
+
const TabsContext = createContext({ active: "" });
|
|
6
|
+
const TabsRoot = ({ value, children, className }) => /* @__PURE__ */ jsx(TabsContext.Provider, { value: { active: value }, children: /* @__PURE__ */ jsx("div", { className: mergeClasses("block", className), children }) });
|
|
7
|
+
const TabsHeader = ({ children, className }) => /* @__PURE__ */ jsx("div", { role: "tablist", className: mergeClasses("relative flex", className), children });
|
|
8
|
+
const Tab = forwardRef(
|
|
9
|
+
({ value, disabled = false, className, children, ...rest }, ref) => {
|
|
10
|
+
const { active } = useContext(TabsContext);
|
|
11
|
+
const isActive = active === value;
|
|
12
|
+
return /* @__PURE__ */ jsx(
|
|
13
|
+
"div",
|
|
14
|
+
{
|
|
15
|
+
ref,
|
|
16
|
+
role: "tab",
|
|
17
|
+
"data-value": value,
|
|
18
|
+
"aria-selected": isActive,
|
|
19
|
+
tabIndex: disabled ? -1 : 0,
|
|
20
|
+
className: mergeClasses(
|
|
21
|
+
classNames(
|
|
22
|
+
"relative flex cursor-pointer select-none items-center justify-center border-b-2 py-2 text-sm transition-interactive",
|
|
23
|
+
isActive ? "border-brand" : "border-transparent",
|
|
24
|
+
{ "pointer-events-none opacity-50": disabled }
|
|
25
|
+
),
|
|
26
|
+
className
|
|
27
|
+
),
|
|
28
|
+
...rest,
|
|
29
|
+
children
|
|
30
|
+
}
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
);
|
|
34
|
+
Tab.displayName = "Tab";
|
|
35
|
+
const TabsBody = ({ children, className }) => /* @__PURE__ */ jsx("div", { className: mergeClasses("block w-full", className), children });
|
|
36
|
+
const TabPanel = ({ value, children, className }) => {
|
|
37
|
+
const { active } = useContext(TabsContext);
|
|
38
|
+
const isActive = active === value;
|
|
39
|
+
return /* @__PURE__ */ jsx("div", { role: "tabpanel", hidden: !isActive, className: mergeClasses(className, classNames({ "!hidden": !isActive })), children });
|
|
40
|
+
};
|
|
41
|
+
export {
|
|
42
|
+
Tab,
|
|
43
|
+
TabPanel,
|
|
44
|
+
TabsBody,
|
|
45
|
+
TabsHeader,
|
|
46
|
+
TabsRoot
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=ControlledTabsPrimitives.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ControlledTabsPrimitives.js","sources":["../../../src/components/Form/ControlledTabsPrimitives.tsx"],"sourcesContent":["import React, { createContext, forwardRef, useContext } from 'react';\nimport classNames from 'classnames';\n\nimport { mergeClasses } from '@/helpers/mergeClasses';\n\ninterface ITabsContext {\n active: string;\n}\n\nconst TabsContext = createContext<ITabsContext>({ active: '' });\n\ninterface ITabsRootProps {\n value: string;\n children: React.ReactNode;\n className?: string;\n}\n\nexport const TabsRoot: React.FC<ITabsRootProps> = ({ value, children, className }) => (\n <TabsContext.Provider value={{ active: value }}>\n <div className={mergeClasses('block', className)}>{children}</div>\n </TabsContext.Provider>\n);\n\ninterface ITabsHeaderProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport const TabsHeader: React.FC<ITabsHeaderProps> = ({ children, className }) => (\n <div role=\"tablist\" className={mergeClasses('relative flex', className)}>\n {children}\n </div>\n);\n\ninterface ITabProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'className'> {\n value: string;\n disabled?: boolean;\n className?: string;\n children: React.ReactNode;\n}\n\n/**\n * Rendered as a div with role=\"tab\", not a native button: a tab can carry its own controls\n * (inline rename, visibility toggle, drag handle), and a button inside a button is invalid\n * HTML that silently breaks the inner controls.\n *\n * The active underline lives on the tab itself rather than on a separate sliding indicator,\n * so no measurement is needed and reordering or horizontal scrolling cannot desynchronise it.\n */\nexport const Tab = forwardRef<HTMLDivElement, ITabProps>(\n ({ value, disabled = false, className, children, ...rest }, ref) => {\n const { active } = useContext(TabsContext);\n const isActive = active === value;\n\n return (\n <div\n ref={ref}\n role=\"tab\"\n // ControlledTabs locates tabs by this attribute to scroll the header.\n data-value={value}\n aria-selected={isActive}\n tabIndex={disabled ? -1 : 0}\n className={mergeClasses(\n classNames(\n 'relative flex cursor-pointer select-none items-center justify-center border-b-2 py-2 text-sm transition-interactive',\n isActive ? 'border-brand' : 'border-transparent',\n { 'pointer-events-none opacity-50': disabled },\n ),\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n );\n },\n);\n\nTab.displayName = 'Tab';\n\ninterface ITabsBodyProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport const TabsBody: React.FC<ITabsBodyProps> = ({ children, className }) => (\n <div className={mergeClasses('block w-full', className)}>{children}</div>\n);\n\ninterface ITabPanelProps {\n value: string;\n children: React.ReactNode;\n className?: string;\n}\n\n/**\n * Inactive panels stay MOUNTED and hidden. Unmounting them would discard the state, focus\n * and scroll position of every tab the user is not looking at.\n */\nexport const TabPanel: React.FC<ITabPanelProps> = ({ value, children, className }) => {\n const { active } = useContext(TabsContext);\n const isActive = active === value;\n\n // `hidden` goes AFTER the consumer classes on purpose: a `tabPanelClassName` such as\n // `flex flex-col` is a display utility too, so merged the other way round it would win over\n // `hidden` and every inactive panel would render stacked under the active one.\n return (\n <div role=\"tabpanel\" hidden={!isActive} className={mergeClasses(className, classNames({ '!hidden': !isActive }))}>\n {children}\n </div>\n );\n};\n"],"names":[],"mappings":";;;;AASA,MAAM,cAAc,cAA4B,EAAE,QAAQ,IAAI;AAQvD,MAAM,WAAqC,CAAC,EAAE,OAAO,UAAU,gBACpE,oBAAC,YAAY,UAAZ,EAAqB,OAAO,EAAE,QAAQ,MAAA,GACrC,UAAA,oBAAC,OAAA,EAAI,WAAW,aAAa,SAAS,SAAS,GAAI,SAAA,CAAS,EAAA,CAC9D;AAQK,MAAM,aAAyC,CAAC,EAAE,UAAU,gBACjE,oBAAC,OAAA,EAAI,MAAK,WAAU,WAAW,aAAa,iBAAiB,SAAS,GACnE,SAAA,CACH;AAkBK,MAAM,MAAM;AAAA,EACjB,CAAC,EAAE,OAAO,WAAW,OAAO,WAAW,UAAU,GAAG,KAAA,GAAQ,QAAQ;AAClE,UAAM,EAAE,OAAA,IAAW,WAAW,WAAW;AACzC,UAAM,WAAW,WAAW;AAE5B,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QAEL,cAAY;AAAA,QACZ,iBAAe;AAAA,QACf,UAAU,WAAW,KAAK;AAAA,QAC1B,WAAW;AAAA,UACT;AAAA,YACE;AAAA,YACA,WAAW,iBAAiB;AAAA,YAC5B,EAAE,kCAAkC,SAAA;AAAA,UAAS;AAAA,UAE/C;AAAA,QAAA;AAAA,QAED,GAAG;AAAA,QAEH;AAAA,MAAA;AAAA,IAAA;AAAA,EAGP;AACF;AAEA,IAAI,cAAc;AAOX,MAAM,WAAqC,CAAC,EAAE,UAAU,UAAA,MAC7D,oBAAC,OAAA,EAAI,WAAW,aAAa,gBAAgB,SAAS,GAAI,SAAA,CAAS;AAa9D,MAAM,WAAqC,CAAC,EAAE,OAAO,UAAU,gBAAgB;AACpF,QAAM,EAAE,OAAA,IAAW,WAAW,WAAW;AACzC,QAAM,WAAW,WAAW;AAK5B,6BACG,OAAA,EAAI,MAAK,YAAW,QAAQ,CAAC,UAAU,WAAW,aAAa,WAAW,WAAW,EAAE,WAAW,CAAC,UAAU,CAAC,GAC5G,UACH;AAEJ;"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export type TTextareaResize = 'none' | 'vertical';
|
|
3
|
+
interface IControlledTextareaProps extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'className' | 'style'> {
|
|
4
|
+
label?: string;
|
|
5
|
+
error?: boolean;
|
|
6
|
+
errorMessage?: string;
|
|
7
|
+
resize?: TTextareaResize;
|
|
8
|
+
className?: string;
|
|
9
|
+
containerClassName?: string;
|
|
10
|
+
/** Reaches the native textarea, for hosts that must focus or measure it imperatively. */
|
|
11
|
+
textareaRef?: React.Ref<HTMLTextAreaElement>;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The label is rendered as the placeholder and as the accessible name, mirroring
|
|
15
|
+
* ControlledInput: a floating label animates onto the border and relies on pseudo-element
|
|
16
|
+
* border segments to cut a notch, which breaks wherever the border is overridden.
|
|
17
|
+
*
|
|
18
|
+
* Background, border and focus ring come from the form base layer in index.css, so this
|
|
19
|
+
* component names no colour for them.
|
|
20
|
+
*/
|
|
21
|
+
declare const ControlledTextarea: React.FC<IControlledTextareaProps>;
|
|
22
|
+
export default ControlledTextarea;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import classNames from "classnames";
|
|
3
|
+
import { mergeClasses } from "../../helpers/mergeClasses.js";
|
|
4
|
+
const RESIZE_CLASS = {
|
|
5
|
+
none: "resize-none",
|
|
6
|
+
vertical: "resize-y"
|
|
7
|
+
};
|
|
8
|
+
const ControlledTextarea = ({
|
|
9
|
+
label,
|
|
10
|
+
error = false,
|
|
11
|
+
errorMessage,
|
|
12
|
+
resize = "vertical",
|
|
13
|
+
className,
|
|
14
|
+
containerClassName,
|
|
15
|
+
textareaRef,
|
|
16
|
+
rows = 4,
|
|
17
|
+
placeholder,
|
|
18
|
+
"aria-label": ariaLabel,
|
|
19
|
+
...rest
|
|
20
|
+
}) => /* @__PURE__ */ jsxs("div", { className: classNames("w-full", containerClassName), children: [
|
|
21
|
+
/* @__PURE__ */ jsx(
|
|
22
|
+
"textarea",
|
|
23
|
+
{
|
|
24
|
+
ref: textareaRef,
|
|
25
|
+
rows,
|
|
26
|
+
placeholder: placeholder ?? label,
|
|
27
|
+
"aria-label": ariaLabel ?? label,
|
|
28
|
+
"aria-invalid": error || void 0,
|
|
29
|
+
className: mergeClasses(
|
|
30
|
+
classNames(
|
|
31
|
+
"w-full rounded-lg border px-3 py-2.5 text-sm text-foreground transition-colors",
|
|
32
|
+
"placeholder:text-foreground-faint disabled:cursor-not-allowed disabled:bg-muted",
|
|
33
|
+
RESIZE_CLASS[resize],
|
|
34
|
+
{ "border-danger focus:border-danger": error }
|
|
35
|
+
),
|
|
36
|
+
className
|
|
37
|
+
),
|
|
38
|
+
...rest
|
|
39
|
+
}
|
|
40
|
+
),
|
|
41
|
+
error && errorMessage && /* @__PURE__ */ jsx("div", { className: "mt-1 text-xs text-danger-emphasis", children: errorMessage })
|
|
42
|
+
] });
|
|
43
|
+
export {
|
|
44
|
+
ControlledTextarea as default
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=ControlledTextarea.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ControlledTextarea.js","sources":["../../../src/components/Form/ControlledTextarea.tsx"],"sourcesContent":["import React from 'react';\nimport classNames from 'classnames';\n\nimport { mergeClasses } from '@/helpers/mergeClasses';\n\nexport type TTextareaResize = 'none' | 'vertical';\n\ninterface IControlledTextareaProps extends Omit<\n React.TextareaHTMLAttributes<HTMLTextAreaElement>,\n 'className' | 'style'\n> {\n label?: string;\n error?: boolean;\n errorMessage?: string;\n resize?: TTextareaResize;\n className?: string;\n containerClassName?: string;\n /** Reaches the native textarea, for hosts that must focus or measure it imperatively. */\n textareaRef?: React.Ref<HTMLTextAreaElement>;\n}\n\nconst RESIZE_CLASS: Record<TTextareaResize, string> = {\n none: 'resize-none',\n vertical: 'resize-y',\n};\n\n/**\n * The label is rendered as the placeholder and as the accessible name, mirroring\n * ControlledInput: a floating label animates onto the border and relies on pseudo-element\n * border segments to cut a notch, which breaks wherever the border is overridden.\n *\n * Background, border and focus ring come from the form base layer in index.css, so this\n * component names no colour for them.\n */\nconst ControlledTextarea: React.FC<IControlledTextareaProps> = ({\n label,\n error = false,\n errorMessage,\n resize = 'vertical',\n className,\n containerClassName,\n textareaRef,\n rows = 4,\n placeholder,\n 'aria-label': ariaLabel,\n ...rest\n}) => (\n <div className={classNames('w-full', containerClassName)}>\n <textarea\n ref={textareaRef}\n rows={rows}\n placeholder={placeholder ?? label}\n aria-label={ariaLabel ?? label}\n aria-invalid={error || undefined}\n className={mergeClasses(\n classNames(\n 'w-full rounded-lg border px-3 py-2.5 text-sm text-foreground transition-colors',\n 'placeholder:text-foreground-faint disabled:cursor-not-allowed disabled:bg-muted',\n RESIZE_CLASS[resize],\n { 'border-danger focus:border-danger': error },\n ),\n className,\n )}\n {...rest}\n />\n\n {error && errorMessage && <div className=\"mt-1 text-xs text-danger-emphasis\">{errorMessage}</div>}\n </div>\n);\n\nexport default ControlledTextarea;\n"],"names":[],"mappings":";;;AAqBA,MAAM,eAAgD;AAAA,EACpD,MAAM;AAAA,EACN,UAAU;AACZ;AAUA,MAAM,qBAAyD,CAAC;AAAA,EAC9D;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,cAAc;AAAA,EACd,GAAG;AACL,2BACG,OAAA,EAAI,WAAW,WAAW,UAAU,kBAAkB,GACrD,UAAA;AAAA,EAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK;AAAA,MACL;AAAA,MACA,aAAa,eAAe;AAAA,MAC5B,cAAY,aAAa;AAAA,MACzB,gBAAc,SAAS;AAAA,MACvB,WAAW;AAAA,QACT;AAAA,UACE;AAAA,UACA;AAAA,UACA,aAAa,MAAM;AAAA,UACnB,EAAE,qCAAqC,MAAA;AAAA,QAAM;AAAA,QAE/C;AAAA,MAAA;AAAA,MAED,GAAG;AAAA,IAAA;AAAA,EAAA;AAAA,EAGL,SAAS,gBAAgB,oBAAC,OAAA,EAAI,WAAU,qCAAqC,UAAA,aAAA,CAAa;AAAA,EAAA,CAC7F;"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
interface ITimelineSectionProps {
|
|
3
|
+
children?: React.ReactNode;
|
|
4
|
+
className?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare const ControlledTimelineRoot: React.FC<ITimelineSectionProps>;
|
|
7
|
+
interface IControlledTimelineItemProps extends ITimelineSectionProps {
|
|
8
|
+
/** Width of the icon column the connector line centres itself in. */
|
|
9
|
+
railWidth?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare const ControlledTimelineItem: React.FC<IControlledTimelineItemProps>;
|
|
12
|
+
/**
|
|
13
|
+
* Spans the item and centres itself in the icon column, whose width comes from the item's
|
|
14
|
+
* `--timeline-rail`. That keeps the line under icons of different sizes without measuring.
|
|
15
|
+
*/
|
|
16
|
+
export declare const ControlledTimelineConnector: React.FC<ITimelineSectionProps>;
|
|
17
|
+
export declare const ControlledTimelineHeader: React.FC<ITimelineSectionProps>;
|
|
18
|
+
export declare const ControlledTimelineIcon: React.FC<ITimelineSectionProps>;
|
|
19
|
+
export declare const ControlledTimelineBody: React.FC<ITimelineSectionProps>;
|
|
20
|
+
interface IControlledTimelineProps {
|
|
21
|
+
title: string;
|
|
22
|
+
description: React.ReactNode;
|
|
23
|
+
iconColor?: string;
|
|
24
|
+
}
|
|
25
|
+
declare const ControlledTimeline: React.FC<IControlledTimelineProps>;
|
|
26
|
+
export default ControlledTimeline;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { mergeClasses } from "../../helpers/mergeClasses.js";
|
|
3
|
+
const DEFAULT_RAIL_WIDTH = "1.75rem";
|
|
4
|
+
const ControlledTimelineRoot = ({ children, className }) => /* @__PURE__ */ jsx("div", { className: mergeClasses("flex w-full flex-col", className), children });
|
|
5
|
+
const ControlledTimelineItem = ({
|
|
6
|
+
children,
|
|
7
|
+
className,
|
|
8
|
+
railWidth = DEFAULT_RAIL_WIDTH
|
|
9
|
+
}) => /* @__PURE__ */ jsx(
|
|
10
|
+
"div",
|
|
11
|
+
{
|
|
12
|
+
style: { "--timeline-rail": railWidth },
|
|
13
|
+
className: mergeClasses("relative flex flex-col gap-2", className),
|
|
14
|
+
children
|
|
15
|
+
}
|
|
16
|
+
);
|
|
17
|
+
const ControlledTimelineConnector = ({ children, className }) => /* @__PURE__ */ jsxs(
|
|
18
|
+
"div",
|
|
19
|
+
{
|
|
20
|
+
"aria-hidden": true,
|
|
21
|
+
className: mergeClasses(
|
|
22
|
+
"absolute left-0 top-0 flex h-full w-[var(--timeline-rail,1.75rem)] justify-center",
|
|
23
|
+
className
|
|
24
|
+
),
|
|
25
|
+
children: [
|
|
26
|
+
/* @__PURE__ */ jsx("span", { className: "h-full w-0.5 bg-border" }),
|
|
27
|
+
children
|
|
28
|
+
]
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
const ControlledTimelineHeader = ({ children, className }) => /* @__PURE__ */ jsx("div", { className: mergeClasses("relative flex items-center gap-4", className), children });
|
|
32
|
+
const ControlledTimelineIcon = ({ children, className }) => /* @__PURE__ */ jsx(
|
|
33
|
+
"div",
|
|
34
|
+
{
|
|
35
|
+
className: mergeClasses(
|
|
36
|
+
"relative z-[2] flex w-[var(--timeline-rail,1.75rem)] shrink-0 items-center justify-center rounded-full",
|
|
37
|
+
className
|
|
38
|
+
),
|
|
39
|
+
children
|
|
40
|
+
}
|
|
41
|
+
);
|
|
42
|
+
const ControlledTimelineBody = ({ children, className }) => /* @__PURE__ */ jsx("div", { className: mergeClasses("flex gap-4 pl-[var(--timeline-rail,1.75rem)]", className), children });
|
|
43
|
+
const ControlledTimeline = ({ title, description, iconColor = "bg-scrim" }) => /* @__PURE__ */ jsx(ControlledTimelineRoot, { children: /* @__PURE__ */ jsxs(ControlledTimelineItem, { railWidth: "0.75rem", children: [
|
|
44
|
+
/* @__PURE__ */ jsx(ControlledTimelineConnector, {}),
|
|
45
|
+
/* @__PURE__ */ jsxs(ControlledTimelineHeader, { className: "h-3", children: [
|
|
46
|
+
/* @__PURE__ */ jsx(ControlledTimelineIcon, { className: mergeClasses("aspect-square", iconColor) }),
|
|
47
|
+
/* @__PURE__ */ jsx("span", { className: "text-base font-semibold text-foreground", children: title })
|
|
48
|
+
] }),
|
|
49
|
+
/* @__PURE__ */ jsx(ControlledTimelineBody, { className: "pb-8", children: description })
|
|
50
|
+
] }) });
|
|
51
|
+
export {
|
|
52
|
+
ControlledTimelineBody,
|
|
53
|
+
ControlledTimelineConnector,
|
|
54
|
+
ControlledTimelineHeader,
|
|
55
|
+
ControlledTimelineIcon,
|
|
56
|
+
ControlledTimelineItem,
|
|
57
|
+
ControlledTimelineRoot,
|
|
58
|
+
ControlledTimeline as default
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=ControlledTimeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ControlledTimeline.js","sources":["../../../src/components/Form/ControlledTimeline.tsx"],"sourcesContent":["import React from 'react';\n\nimport { mergeClasses } from '@/helpers/mergeClasses';\n\nconst DEFAULT_RAIL_WIDTH = '1.75rem';\n\ninterface ITimelineSectionProps {\n children?: React.ReactNode;\n className?: string;\n}\n\nexport const ControlledTimelineRoot: React.FC<ITimelineSectionProps> = ({ children, className }) => (\n <div className={mergeClasses('flex w-full flex-col', className)}>{children}</div>\n);\n\ninterface IControlledTimelineItemProps extends ITimelineSectionProps {\n /** Width of the icon column the connector line centres itself in. */\n railWidth?: string;\n}\n\nexport const ControlledTimelineItem: React.FC<IControlledTimelineItemProps> = ({\n children,\n className,\n railWidth = DEFAULT_RAIL_WIDTH,\n}) => (\n <div\n style={{ '--timeline-rail': railWidth } as React.CSSProperties}\n className={mergeClasses('relative flex flex-col gap-2', className)}\n >\n {children}\n </div>\n);\n\n/**\n * Spans the item and centres itself in the icon column, whose width comes from the item's\n * `--timeline-rail`. That keeps the line under icons of different sizes without measuring.\n */\nexport const ControlledTimelineConnector: React.FC<ITimelineSectionProps> = ({ children, className }) => (\n <div\n aria-hidden\n className={mergeClasses(\n 'absolute left-0 top-0 flex h-full w-[var(--timeline-rail,1.75rem)] justify-center',\n className,\n )}\n >\n <span className=\"h-full w-0.5 bg-border\" />\n {children}\n </div>\n);\n\nexport const ControlledTimelineHeader: React.FC<ITimelineSectionProps> = ({ children, className }) => (\n <div className={mergeClasses('relative flex items-center gap-4', className)}>{children}</div>\n);\n\nexport const ControlledTimelineIcon: React.FC<ITimelineSectionProps> = ({ children, className }) => (\n <div\n className={mergeClasses(\n 'relative z-[2] flex w-[var(--timeline-rail,1.75rem)] shrink-0 items-center justify-center rounded-full',\n className,\n )}\n >\n {children}\n </div>\n);\n\nexport const ControlledTimelineBody: React.FC<ITimelineSectionProps> = ({ children, className }) => (\n <div className={mergeClasses('flex gap-4 pl-[var(--timeline-rail,1.75rem)]', className)}>{children}</div>\n);\n\ninterface IControlledTimelineProps {\n title: string;\n description: React.ReactNode;\n iconColor?: string;\n}\n\nconst ControlledTimeline: React.FC<IControlledTimelineProps> = ({ title, description, iconColor = 'bg-scrim' }) => (\n <ControlledTimelineRoot>\n <ControlledTimelineItem railWidth=\"0.75rem\">\n <ControlledTimelineConnector />\n <ControlledTimelineHeader className=\"h-3\">\n <ControlledTimelineIcon className={mergeClasses('aspect-square', iconColor)} />\n <span className=\"text-base font-semibold text-foreground\">{title}</span>\n </ControlledTimelineHeader>\n <ControlledTimelineBody className=\"pb-8\">{description}</ControlledTimelineBody>\n </ControlledTimelineItem>\n </ControlledTimelineRoot>\n);\n\nexport default ControlledTimeline;\n"],"names":[],"mappings":";;AAIA,MAAM,qBAAqB;AAOpB,MAAM,yBAA0D,CAAC,EAAE,UAAU,UAAA,MAClF,oBAAC,OAAA,EAAI,WAAW,aAAa,wBAAwB,SAAS,GAAI,SAAA,CAAS;AAQtE,MAAM,yBAAiE,CAAC;AAAA,EAC7E;AAAA,EACA;AAAA,EACA,YAAY;AACd,MACE;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,OAAO,EAAE,mBAAmB,UAAA;AAAA,IAC5B,WAAW,aAAa,gCAAgC,SAAS;AAAA,IAEhE;AAAA,EAAA;AACH;AAOK,MAAM,8BAA+D,CAAC,EAAE,UAAU,gBACvF;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,eAAW;AAAA,IACX,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IAAA;AAAA,IAGF,UAAA;AAAA,MAAA,oBAAC,QAAA,EAAK,WAAU,yBAAA,CAAyB;AAAA,MACxC;AAAA,IAAA;AAAA,EAAA;AACH;AAGK,MAAM,2BAA4D,CAAC,EAAE,UAAU,UAAA,MACpF,oBAAC,OAAA,EAAI,WAAW,aAAa,oCAAoC,SAAS,GAAI,SAAA,CAAS;AAGlF,MAAM,yBAA0D,CAAC,EAAE,UAAU,gBAClF;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IAAA;AAAA,IAGD;AAAA,EAAA;AACH;AAGK,MAAM,yBAA0D,CAAC,EAAE,UAAU,UAAA,MAClF,oBAAC,OAAA,EAAI,WAAW,aAAa,gDAAgD,SAAS,GAAI,SAAA,CAAS;AASrG,MAAM,qBAAyD,CAAC,EAAE,OAAO,aAAa,YAAY,WAAA,MAChG,oBAAC,wBAAA,EACC,UAAA,qBAAC,wBAAA,EAAuB,WAAU,WAChC,UAAA;AAAA,EAAA,oBAAC,6BAAA,EAA4B;AAAA,EAC7B,qBAAC,0BAAA,EAAyB,WAAU,OAClC,UAAA;AAAA,IAAA,oBAAC,wBAAA,EAAuB,WAAW,aAAa,iBAAiB,SAAS,GAAG;AAAA,IAC7E,oBAAC,QAAA,EAAK,WAAU,2CAA2C,UAAA,MAAA,CAAM;AAAA,EAAA,GACnE;AAAA,EACA,oBAAC,wBAAA,EAAuB,WAAU,QAAQ,UAAA,YAAA,CAAY;AAAA,EAAA,CACxD,EAAA,CACF;"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { SymbolCodepoints } from '../UI/MaterialSymbol';
|
|
2
|
+
export type TControlledViewToggleSize = 'sm' | 'md';
|
|
3
|
+
export interface IControlledViewToggleOption<V extends string = string> {
|
|
4
|
+
value: V;
|
|
5
|
+
/** Optional icon; options without one render their label as text instead. */
|
|
6
|
+
icon?: SymbolCodepoints;
|
|
7
|
+
/**
|
|
8
|
+
* Option name. Rendered as visible text when the option has no icon or when
|
|
9
|
+
* `showLabels` is on; otherwise shown as the option's tooltip.
|
|
10
|
+
*/
|
|
11
|
+
label: string;
|
|
12
|
+
/**
|
|
13
|
+
* Replaces the label in the tooltip when the option needs to explain itself, not just be named.
|
|
14
|
+
* The label stays the accessible name, so it must remain short.
|
|
15
|
+
*/
|
|
16
|
+
tooltip?: string;
|
|
17
|
+
/** Counter badge next to the label, as in ControlledTabs. Hidden when null/undefined. */
|
|
18
|
+
count?: number | null;
|
|
19
|
+
/** Replaces the counter badge with a spinner while this option's data loads. */
|
|
20
|
+
loading?: boolean;
|
|
21
|
+
}
|
|
22
|
+
interface IControlledViewToggleBaseProps<V extends string = string> {
|
|
23
|
+
options: Array<IControlledViewToggleOption<V>>;
|
|
24
|
+
/** Renders every option's label as visible text next to its icon. */
|
|
25
|
+
showLabels?: boolean;
|
|
26
|
+
/** `md` (default) pairs with page-level controls; `sm` matches compact filter bars. */
|
|
27
|
+
size?: TControlledViewToggleSize;
|
|
28
|
+
/** Disables every option, keeping the current selection visible. */
|
|
29
|
+
disabled?: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Mirrors the selection in the URL, on by default like `ControlledTabs`. Turn it off for toggles
|
|
32
|
+
* that hold form state (a weekday picker, an AND/OR combinator) or that live inside a drawer,
|
|
33
|
+
* where the selection is not page state and should not reach the URL.
|
|
34
|
+
*/
|
|
35
|
+
syncWithUrl?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Query param used when `syncWithUrl` is on, defaults to `view`. A page holding more than one
|
|
38
|
+
* synced toggle must give each a unique key: the first one mounted keeps the param and the others
|
|
39
|
+
* stop writing (with a warning in development) instead of overwriting each other.
|
|
40
|
+
*
|
|
41
|
+
* Lifecycle mirrors `ControlledTabs`: on mount an existing valid param wins over `value` and is
|
|
42
|
+
* pushed to the host through `onChange`; with no param (or an invalid one) the current value is
|
|
43
|
+
* stamped into the URL right away. From there on the host selection is the authority and every
|
|
44
|
+
* change rewrites the param, always preserving the other params and replacing the history entry.
|
|
45
|
+
* In `multiple` mode values are comma separated and an empty selection removes the param.
|
|
46
|
+
*/
|
|
47
|
+
urlParamKey?: string;
|
|
48
|
+
className?: string;
|
|
49
|
+
}
|
|
50
|
+
interface IControlledViewToggleSingleProps<V extends string = string> extends IControlledViewToggleBaseProps<V> {
|
|
51
|
+
multiple?: false;
|
|
52
|
+
value: V;
|
|
53
|
+
onChange: (value: V) => void;
|
|
54
|
+
}
|
|
55
|
+
interface IControlledViewToggleMultipleProps<V extends string = string> extends IControlledViewToggleBaseProps<V> {
|
|
56
|
+
multiple: true;
|
|
57
|
+
value: Array<V>;
|
|
58
|
+
/** Receives the whole next selection, which may be empty. */
|
|
59
|
+
onChange: (values: Array<V>) => void;
|
|
60
|
+
}
|
|
61
|
+
export type TControlledViewToggleProps<V extends string = string> = IControlledViewToggleSingleProps<V> | IControlledViewToggleMultipleProps<V>;
|
|
62
|
+
/**
|
|
63
|
+
* Segmented toggle for switching between visualization modes (e.g. cards /
|
|
64
|
+
* list / grouped). Options can be icon-only, text-only or icon + text, and the
|
|
65
|
+
* component is generic over the option value union so hosts keep their own mode
|
|
66
|
+
* types. Clicking the already-active option fires `onChange` again, letting
|
|
67
|
+
* hosts react to re-selection (e.g. reopening a configuration dialog).
|
|
68
|
+
*
|
|
69
|
+
* With `multiple`, it becomes a segmented multi-select: `value` is the selected
|
|
70
|
+
* array, clicking an option adds or removes it, and `onChange` receives the
|
|
71
|
+
* whole next selection, which may be empty.
|
|
72
|
+
*/
|
|
73
|
+
declare const ControlledViewToggle: <V extends string = string>(props: TControlledViewToggleProps<V>) => import("react").JSX.Element;
|
|
74
|
+
export default ControlledViewToggle;
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo, useRef, useEffect, Fragment } from "react";
|
|
3
|
+
import classNames from "classnames";
|
|
4
|
+
import ControlledButton from "./ControlledButton.js";
|
|
5
|
+
import { useUiNavigation } from "../Navigation/UiNavigationContext.js";
|
|
6
|
+
import ControlledTooltip from "../UI/ControlledTooltip.js";
|
|
7
|
+
import LoadingSpinner from "../UI/LoadingSpinner.js";
|
|
8
|
+
import { MaterialSymbol } from "../UI/MaterialSymbol/index.js";
|
|
9
|
+
import { formatNumber } from "../../helpers/formatHelpers.js";
|
|
10
|
+
import { uiLogger } from "../../helpers/uiLogger.js";
|
|
11
|
+
import { TABS_URL_PARAM, claimUrlParam, releaseUrlParam, ownsUrlParam, queueUrlParamUpdate, URL_PARAM_PRIORITY } from "../../helpers/urlParamSync.js";
|
|
12
|
+
const DEFAULT_URL_PARAM_KEY = "view";
|
|
13
|
+
const SIZE_STYLES = {
|
|
14
|
+
sm: {
|
|
15
|
+
// Inner radius mirrors the container radius minus its padding, so the active
|
|
16
|
+
// segment stays concentric with the outer border.
|
|
17
|
+
container: "h-9 gap-1 rounded-xl",
|
|
18
|
+
button: "h-7 rounded-lg px-2.5",
|
|
19
|
+
textClass: "text-xs",
|
|
20
|
+
// One step darker than md so the segments match the neighbouring controls
|
|
21
|
+
// in the compact filter bars this size is used by.
|
|
22
|
+
inactive: "text-foreground-muted hover:bg-muted-hover hover:text-foreground",
|
|
23
|
+
icon: 16
|
|
24
|
+
},
|
|
25
|
+
// leading-[18px] matches the icon height so icon-only, text-only and
|
|
26
|
+
// icon + text options all keep the same button height.
|
|
27
|
+
md: {
|
|
28
|
+
container: "gap-1 rounded-lg shadow-sm",
|
|
29
|
+
button: "rounded-md px-2.5 py-1.5",
|
|
30
|
+
textClass: "text-sm leading-[18px]",
|
|
31
|
+
inactive: "text-foreground-subtle hover:bg-muted-hover hover:text-foreground-muted",
|
|
32
|
+
icon: 18
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
const ControlledViewToggle = (props) => {
|
|
36
|
+
const {
|
|
37
|
+
options,
|
|
38
|
+
showLabels = false,
|
|
39
|
+
size = "md",
|
|
40
|
+
disabled = false,
|
|
41
|
+
syncWithUrl = true,
|
|
42
|
+
urlParamKey = DEFAULT_URL_PARAM_KEY,
|
|
43
|
+
className
|
|
44
|
+
} = props;
|
|
45
|
+
const styles = SIZE_STYLES[size];
|
|
46
|
+
const { searchParams, setSearchParams } = useUiNavigation();
|
|
47
|
+
const safeOptions = useMemo(() => Array.isArray(options) ? options : [], [options]);
|
|
48
|
+
const selectedValues = props.multiple ? Array.isArray(props.value) ? props.value : [] : [props.value];
|
|
49
|
+
const serializedValue = selectedValues.join(",");
|
|
50
|
+
const hasReadUrlSelectionRef = useRef(false);
|
|
51
|
+
const pendingUrlSelectionRef = useRef(null);
|
|
52
|
+
const ownerIdRef = useRef({});
|
|
53
|
+
const isUrlParamReserved = urlParamKey === TABS_URL_PARAM;
|
|
54
|
+
const isUrlSyncEnabled = syncWithUrl && !isUrlParamReserved;
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
if (!syncWithUrl) return;
|
|
57
|
+
if (isUrlParamReserved) {
|
|
58
|
+
uiLogger.warn(
|
|
59
|
+
`[ControlledViewToggle] "${TABS_URL_PARAM}" belongs to ControlledTabs. Give this toggle its own urlParamKey: it will not write to the URL.`
|
|
60
|
+
);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const ownerId = ownerIdRef.current;
|
|
64
|
+
if (!claimUrlParam(urlParamKey, ownerId, URL_PARAM_PRIORITY.viewToggle)) {
|
|
65
|
+
uiLogger.warn(
|
|
66
|
+
`[ControlledViewToggle] More than one control syncs "${urlParamKey}". Give each one a unique urlParamKey: this instance will not write to the URL.`
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
return () => releaseUrlParam(urlParamKey, ownerId);
|
|
70
|
+
}, [syncWithUrl, isUrlParamReserved, urlParamKey]);
|
|
71
|
+
useEffect(() => {
|
|
72
|
+
if (!isUrlSyncEnabled || !ownsUrlParam(urlParamKey, ownerIdRef.current)) return;
|
|
73
|
+
const rawParam = searchParams.get(urlParamKey) ?? "";
|
|
74
|
+
if (pendingUrlSelectionRef.current !== null) {
|
|
75
|
+
if (serializedValue === pendingUrlSelectionRef.current) pendingUrlSelectionRef.current = null;
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (!hasReadUrlSelectionRef.current) {
|
|
79
|
+
hasReadUrlSelectionRef.current = true;
|
|
80
|
+
const optionValues = new Set(safeOptions.map((option) => option.value));
|
|
81
|
+
const urlValues = rawParam.split(",").map((rawValue) => rawValue.trim()).filter((rawValue) => optionValues.has(rawValue));
|
|
82
|
+
if (urlValues.length) {
|
|
83
|
+
const urlSelection = urlValues.join(",");
|
|
84
|
+
if (urlSelection !== serializedValue) {
|
|
85
|
+
pendingUrlSelectionRef.current = urlSelection;
|
|
86
|
+
if (props.multiple) props.onChange(urlValues);
|
|
87
|
+
else props.onChange(urlValues[0]);
|
|
88
|
+
}
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (rawParam === serializedValue) return;
|
|
93
|
+
queueUrlParamUpdate(urlParamKey, serializedValue, setSearchParams);
|
|
94
|
+
}, [isUrlSyncEnabled, urlParamKey, searchParams, safeOptions, serializedValue, setSearchParams, props]);
|
|
95
|
+
const handleSelectOption = (optionValue) => {
|
|
96
|
+
if (!props.multiple) {
|
|
97
|
+
props.onChange(optionValue);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const currentValues = Array.isArray(props.value) ? props.value : [];
|
|
101
|
+
props.onChange(
|
|
102
|
+
currentValues.includes(optionValue) ? currentValues.filter((selectedValue) => selectedValue !== optionValue) : [...currentValues, optionValue]
|
|
103
|
+
);
|
|
104
|
+
};
|
|
105
|
+
const renderOptionCounter = (option, isActive) => {
|
|
106
|
+
if (option.loading) return /* @__PURE__ */ jsx(LoadingSpinner, { size: 3 });
|
|
107
|
+
if (option.count === void 0 || option.count === null) return null;
|
|
108
|
+
return /* @__PURE__ */ jsx(
|
|
109
|
+
"span",
|
|
110
|
+
{
|
|
111
|
+
className: classNames(
|
|
112
|
+
"inline-flex min-w-[18px] items-center justify-center rounded-full px-1.5 py-px text-[11px] font-medium leading-none",
|
|
113
|
+
isActive ? "bg-glass/25 text-white" : "bg-muted-hover text-foreground-subtle"
|
|
114
|
+
),
|
|
115
|
+
children: formatNumber(option.count)
|
|
116
|
+
}
|
|
117
|
+
);
|
|
118
|
+
};
|
|
119
|
+
return /* @__PURE__ */ jsx(
|
|
120
|
+
"div",
|
|
121
|
+
{
|
|
122
|
+
className: classNames(
|
|
123
|
+
"inline-flex shrink-0 items-center border border-border bg-surface p-1",
|
|
124
|
+
styles.container,
|
|
125
|
+
className
|
|
126
|
+
),
|
|
127
|
+
children: safeOptions.map((option) => {
|
|
128
|
+
const isActive = selectedValues.includes(option.value);
|
|
129
|
+
const showText = showLabels || !option.icon;
|
|
130
|
+
const button = /* @__PURE__ */ jsxs(
|
|
131
|
+
ControlledButton,
|
|
132
|
+
{
|
|
133
|
+
defaultHtmlButton: true,
|
|
134
|
+
"aria-pressed": isActive,
|
|
135
|
+
disabled,
|
|
136
|
+
onClick: () => handleSelectOption(option.value),
|
|
137
|
+
className: classNames(
|
|
138
|
+
"flex items-center justify-center gap-1.5 outline-none transition-colors focus-visible:ring-2 focus-visible:ring-brand-border disabled:cursor-not-allowed",
|
|
139
|
+
styles.button,
|
|
140
|
+
isActive ? "bg-brand text-brand-fg shadow-sm" : styles.inactive
|
|
141
|
+
),
|
|
142
|
+
children: [
|
|
143
|
+
option.icon && /* @__PURE__ */ jsx(MaterialSymbol, { icon: option.icon, size: styles.icon }),
|
|
144
|
+
showText && /* @__PURE__ */ jsx("span", { className: classNames("whitespace-nowrap font-medium", styles.textClass), children: option.label }),
|
|
145
|
+
renderOptionCounter(option, isActive)
|
|
146
|
+
]
|
|
147
|
+
}
|
|
148
|
+
);
|
|
149
|
+
return showText ? /* @__PURE__ */ jsx(Fragment, { children: button }, option.value) : /* @__PURE__ */ jsx(ControlledTooltip, { content: option.tooltip ?? option.label, children: button }, option.value);
|
|
150
|
+
})
|
|
151
|
+
}
|
|
152
|
+
);
|
|
153
|
+
};
|
|
154
|
+
export {
|
|
155
|
+
ControlledViewToggle as default
|
|
156
|
+
};
|
|
157
|
+
//# sourceMappingURL=ControlledViewToggle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ControlledViewToggle.js","sources":["../../../src/components/Form/ControlledViewToggle.tsx"],"sourcesContent":["import { Fragment, useEffect, useMemo, useRef } from 'react';\nimport classNames from 'classnames';\n\nimport ControlledButton from '@/components/Form/ControlledButton';\nimport { useUiNavigation } from '@/components/Navigation/UiNavigationContext';\nimport ControlledTooltip from '@/components/UI/ControlledTooltip';\nimport LoadingSpinner from '@/components/UI/LoadingSpinner';\nimport { MaterialSymbol, SymbolCodepoints } from '@/components/UI/MaterialSymbol';\nimport { formatNumber } from '@/helpers/formatHelpers';\nimport { uiLogger } from '@/helpers/uiLogger';\nimport {\n claimUrlParam,\n ownsUrlParam,\n queueUrlParamUpdate,\n releaseUrlParam,\n TABS_URL_PARAM,\n URL_PARAM_PRIORITY,\n} from '@/helpers/urlParamSync';\n\nexport type TControlledViewToggleSize = 'sm' | 'md';\n\nexport interface IControlledViewToggleOption<V extends string = string> {\n value: V;\n /** Optional icon; options without one render their label as text instead. */\n icon?: SymbolCodepoints;\n /**\n * Option name. Rendered as visible text when the option has no icon or when\n * `showLabels` is on; otherwise shown as the option's tooltip.\n */\n label: string;\n /**\n * Replaces the label in the tooltip when the option needs to explain itself, not just be named.\n * The label stays the accessible name, so it must remain short.\n */\n tooltip?: string;\n /** Counter badge next to the label, as in ControlledTabs. Hidden when null/undefined. */\n count?: number | null;\n /** Replaces the counter badge with a spinner while this option's data loads. */\n loading?: boolean;\n}\n\ninterface IControlledViewToggleBaseProps<V extends string = string> {\n options: Array<IControlledViewToggleOption<V>>;\n /** Renders every option's label as visible text next to its icon. */\n showLabels?: boolean;\n /** `md` (default) pairs with page-level controls; `sm` matches compact filter bars. */\n size?: TControlledViewToggleSize;\n /** Disables every option, keeping the current selection visible. */\n disabled?: boolean;\n /**\n * Mirrors the selection in the URL, on by default like `ControlledTabs`. Turn it off for toggles\n * that hold form state (a weekday picker, an AND/OR combinator) or that live inside a drawer,\n * where the selection is not page state and should not reach the URL.\n */\n syncWithUrl?: boolean;\n /**\n * Query param used when `syncWithUrl` is on, defaults to `view`. A page holding more than one\n * synced toggle must give each a unique key: the first one mounted keeps the param and the others\n * stop writing (with a warning in development) instead of overwriting each other.\n *\n * Lifecycle mirrors `ControlledTabs`: on mount an existing valid param wins over `value` and is\n * pushed to the host through `onChange`; with no param (or an invalid one) the current value is\n * stamped into the URL right away. From there on the host selection is the authority and every\n * change rewrites the param, always preserving the other params and replacing the history entry.\n * In `multiple` mode values are comma separated and an empty selection removes the param.\n */\n urlParamKey?: string;\n className?: string;\n}\n\ninterface IControlledViewToggleSingleProps<V extends string = string> extends IControlledViewToggleBaseProps<V> {\n multiple?: false;\n value: V;\n onChange: (value: V) => void;\n}\n\ninterface IControlledViewToggleMultipleProps<V extends string = string> extends IControlledViewToggleBaseProps<V> {\n multiple: true;\n value: Array<V>;\n /** Receives the whole next selection, which may be empty. */\n onChange: (values: Array<V>) => void;\n}\n\nexport type TControlledViewToggleProps<V extends string = string> =\n IControlledViewToggleSingleProps<V> | IControlledViewToggleMultipleProps<V>;\n\nconst DEFAULT_URL_PARAM_KEY = 'view';\n\nconst SIZE_STYLES: Record<\n TControlledViewToggleSize,\n { container: string; button: string; textClass: string; inactive: string; icon: number }\n> = {\n sm: {\n // Inner radius mirrors the container radius minus its padding, so the active\n // segment stays concentric with the outer border.\n container: 'h-9 gap-1 rounded-xl',\n button: 'h-7 rounded-lg px-2.5',\n textClass: 'text-xs',\n // One step darker than md so the segments match the neighbouring controls\n // in the compact filter bars this size is used by.\n inactive: 'text-foreground-muted hover:bg-muted-hover hover:text-foreground',\n icon: 16,\n },\n // leading-[18px] matches the icon height so icon-only, text-only and\n // icon + text options all keep the same button height.\n md: {\n container: 'gap-1 rounded-lg shadow-sm',\n button: 'rounded-md px-2.5 py-1.5',\n textClass: 'text-sm leading-[18px]',\n inactive: 'text-foreground-subtle hover:bg-muted-hover hover:text-foreground-muted',\n icon: 18,\n },\n};\n\n/**\n * Segmented toggle for switching between visualization modes (e.g. cards /\n * list / grouped). Options can be icon-only, text-only or icon + text, and the\n * component is generic over the option value union so hosts keep their own mode\n * types. Clicking the already-active option fires `onChange` again, letting\n * hosts react to re-selection (e.g. reopening a configuration dialog).\n *\n * With `multiple`, it becomes a segmented multi-select: `value` is the selected\n * array, clicking an option adds or removes it, and `onChange` receives the\n * whole next selection, which may be empty.\n */\nconst ControlledViewToggle = <V extends string = string>(props: TControlledViewToggleProps<V>) => {\n const {\n options,\n showLabels = false,\n size = 'md',\n disabled = false,\n syncWithUrl = true,\n urlParamKey = DEFAULT_URL_PARAM_KEY,\n className,\n } = props;\n const styles = SIZE_STYLES[size];\n const { searchParams, setSearchParams } = useUiNavigation();\n\n const safeOptions = useMemo(() => (Array.isArray(options) ? options : []), [options]);\n const selectedValues = props.multiple ? (Array.isArray(props.value) ? props.value : []) : [props.value];\n const serializedValue = selectedValues.join(',');\n\n const hasReadUrlSelectionRef = useRef(false);\n const pendingUrlSelectionRef = useRef<string | null>(null);\n const ownerIdRef = useRef<object>({});\n\n const isUrlParamReserved = urlParamKey === TABS_URL_PARAM;\n const isUrlSyncEnabled = syncWithUrl && !isUrlParamReserved;\n\n useEffect(() => {\n if (!syncWithUrl) return;\n\n if (isUrlParamReserved) {\n uiLogger.warn(\n `[ControlledViewToggle] \"${TABS_URL_PARAM}\" belongs to ControlledTabs. ` +\n 'Give this toggle its own urlParamKey: it will not write to the URL.',\n );\n return;\n }\n\n const ownerId = ownerIdRef.current;\n\n if (!claimUrlParam(urlParamKey, ownerId, URL_PARAM_PRIORITY.viewToggle)) {\n uiLogger.warn(\n `[ControlledViewToggle] More than one control syncs \"${urlParamKey}\". ` +\n 'Give each one a unique urlParamKey: this instance will not write to the URL.',\n );\n }\n\n return () => releaseUrlParam(urlParamKey, ownerId);\n }, [syncWithUrl, isUrlParamReserved, urlParamKey]);\n\n // Um efeito só, em duas fases. Na montagem o parâmetro manda: existindo um valor válido ele é\n // aplicado no host, e a escrita fica suspensa até o host adotá-lo (senão o valor padrão seria\n // gravado por cima do que veio na URL). Não existindo, o valor atual é carimbado na hora. Depois\n // disso a seleção do host é a autoridade e a URL apenas a reflete.\n useEffect(() => {\n if (!isUrlSyncEnabled || !ownsUrlParam(urlParamKey, ownerIdRef.current)) return;\n\n const rawParam = searchParams.get(urlParamKey) ?? '';\n\n if (pendingUrlSelectionRef.current !== null) {\n if (serializedValue === pendingUrlSelectionRef.current) pendingUrlSelectionRef.current = null;\n return;\n }\n\n if (!hasReadUrlSelectionRef.current) {\n hasReadUrlSelectionRef.current = true;\n\n const optionValues = new Set(safeOptions.map((option) => option.value));\n const urlValues = rawParam\n .split(',')\n .map((rawValue) => rawValue.trim())\n .filter((rawValue): rawValue is V => optionValues.has(rawValue as V));\n\n if (urlValues.length) {\n const urlSelection = urlValues.join(',');\n if (urlSelection !== serializedValue) {\n pendingUrlSelectionRef.current = urlSelection;\n if (props.multiple) props.onChange(urlValues);\n else props.onChange(urlValues[0]);\n }\n return;\n }\n }\n\n if (rawParam === serializedValue) return;\n\n queueUrlParamUpdate(urlParamKey, serializedValue, setSearchParams);\n }, [isUrlSyncEnabled, urlParamKey, searchParams, safeOptions, serializedValue, setSearchParams, props]);\n\n const handleSelectOption = (optionValue: V) => {\n if (!props.multiple) {\n props.onChange(optionValue);\n return;\n }\n\n const currentValues = Array.isArray(props.value) ? props.value : [];\n props.onChange(\n currentValues.includes(optionValue)\n ? currentValues.filter((selectedValue) => selectedValue !== optionValue)\n : [...currentValues, optionValue],\n );\n };\n\n const renderOptionCounter = (option: IControlledViewToggleOption<V>, isActive: boolean) => {\n if (option.loading) return <LoadingSpinner size={3} />;\n if (option.count === undefined || option.count === null) return null;\n\n return (\n <span\n className={classNames(\n 'inline-flex min-w-[18px] items-center justify-center rounded-full px-1.5 py-px text-[11px] font-medium leading-none',\n isActive ? 'bg-glass/25 text-white' : 'bg-muted-hover text-foreground-subtle',\n )}\n >\n {formatNumber(option.count)}\n </span>\n );\n };\n\n return (\n <div\n className={classNames(\n 'inline-flex shrink-0 items-center border border-border bg-surface p-1',\n styles.container,\n className,\n )}\n >\n {safeOptions.map((option) => {\n const isActive = selectedValues.includes(option.value);\n const showText = showLabels || !option.icon;\n\n const button = (\n <ControlledButton\n defaultHtmlButton\n aria-pressed={isActive}\n disabled={disabled}\n onClick={() => handleSelectOption(option.value)}\n className={classNames(\n 'flex items-center justify-center gap-1.5 outline-none transition-colors focus-visible:ring-2 focus-visible:ring-brand-border disabled:cursor-not-allowed',\n styles.button,\n isActive ? 'bg-brand text-brand-fg shadow-sm' : styles.inactive,\n )}\n >\n {option.icon && <MaterialSymbol icon={option.icon} size={styles.icon} />}\n {showText && (\n <span className={classNames('whitespace-nowrap font-medium', styles.textClass)}>{option.label}</span>\n )}\n {renderOptionCounter(option, isActive)}\n </ControlledButton>\n );\n\n // The tooltip only adds value when the label is not already visible.\n return showText ? (\n <Fragment key={option.value}>{button}</Fragment>\n ) : (\n <ControlledTooltip key={option.value} content={option.tooltip ?? option.label}>\n {button}\n </ControlledTooltip>\n );\n })}\n </div>\n );\n};\n\nexport default ControlledViewToggle;\n"],"names":[],"mappings":";;;;;;;;;;;AAsFA,MAAM,wBAAwB;AAE9B,MAAM,cAGF;AAAA,EACF,IAAI;AAAA;AAAA;AAAA,IAGF,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,WAAW;AAAA;AAAA;AAAA,IAGX,UAAU;AAAA,IACV,MAAM;AAAA,EAAA;AAAA;AAAA;AAAA,EAIR,IAAI;AAAA,IACF,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,UAAU;AAAA,IACV,MAAM;AAAA,EAAA;AAEV;AAaA,MAAM,uBAAuB,CAA4B,UAAyC;AAChG,QAAM;AAAA,IACJ;AAAA,IACA,aAAa;AAAA,IACb,OAAO;AAAA,IACP,WAAW;AAAA,IACX,cAAc;AAAA,IACd,cAAc;AAAA,IACd;AAAA,EAAA,IACE;AACJ,QAAM,SAAS,YAAY,IAAI;AAC/B,QAAM,EAAE,cAAc,gBAAA,IAAoB,gBAAA;AAE1C,QAAM,cAAc,QAAQ,MAAO,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAA,GAAK,CAAC,OAAO,CAAC;AACpF,QAAM,iBAAiB,MAAM,WAAY,MAAM,QAAQ,MAAM,KAAK,IAAI,MAAM,QAAQ,CAAA,IAAM,CAAC,MAAM,KAAK;AACtG,QAAM,kBAAkB,eAAe,KAAK,GAAG;AAE/C,QAAM,yBAAyB,OAAO,KAAK;AAC3C,QAAM,yBAAyB,OAAsB,IAAI;AACzD,QAAM,aAAa,OAAe,EAAE;AAEpC,QAAM,qBAAqB,gBAAgB;AAC3C,QAAM,mBAAmB,eAAe,CAAC;AAEzC,YAAU,MAAM;AACd,QAAI,CAAC,YAAa;AAElB,QAAI,oBAAoB;AACtB,eAAS;AAAA,QACP,2BAA2B,cAAc;AAAA,MAAA;AAG3C;AAAA,IACF;AAEA,UAAM,UAAU,WAAW;AAE3B,QAAI,CAAC,cAAc,aAAa,SAAS,mBAAmB,UAAU,GAAG;AACvE,eAAS;AAAA,QACP,uDAAuD,WAAW;AAAA,MAAA;AAAA,IAGtE;AAEA,WAAO,MAAM,gBAAgB,aAAa,OAAO;AAAA,EACnD,GAAG,CAAC,aAAa,oBAAoB,WAAW,CAAC;AAMjD,YAAU,MAAM;AACd,QAAI,CAAC,oBAAoB,CAAC,aAAa,aAAa,WAAW,OAAO,EAAG;AAEzE,UAAM,WAAW,aAAa,IAAI,WAAW,KAAK;AAElD,QAAI,uBAAuB,YAAY,MAAM;AAC3C,UAAI,oBAAoB,uBAAuB,QAAS,wBAAuB,UAAU;AACzF;AAAA,IACF;AAEA,QAAI,CAAC,uBAAuB,SAAS;AACnC,6BAAuB,UAAU;AAEjC,YAAM,eAAe,IAAI,IAAI,YAAY,IAAI,CAAC,WAAW,OAAO,KAAK,CAAC;AACtE,YAAM,YAAY,SACf,MAAM,GAAG,EACT,IAAI,CAAC,aAAa,SAAS,KAAA,CAAM,EACjC,OAAO,CAAC,aAA4B,aAAa,IAAI,QAAa,CAAC;AAEtE,UAAI,UAAU,QAAQ;AACpB,cAAM,eAAe,UAAU,KAAK,GAAG;AACvC,YAAI,iBAAiB,iBAAiB;AACpC,iCAAuB,UAAU;AACjC,cAAI,MAAM,SAAU,OAAM,SAAS,SAAS;AAAA,cACvC,OAAM,SAAS,UAAU,CAAC,CAAC;AAAA,QAClC;AACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,aAAa,gBAAiB;AAElC,wBAAoB,aAAa,iBAAiB,eAAe;AAAA,EACnE,GAAG,CAAC,kBAAkB,aAAa,cAAc,aAAa,iBAAiB,iBAAiB,KAAK,CAAC;AAEtG,QAAM,qBAAqB,CAAC,gBAAmB;AAC7C,QAAI,CAAC,MAAM,UAAU;AACnB,YAAM,SAAS,WAAW;AAC1B;AAAA,IACF;AAEA,UAAM,gBAAgB,MAAM,QAAQ,MAAM,KAAK,IAAI,MAAM,QAAQ,CAAA;AACjE,UAAM;AAAA,MACJ,cAAc,SAAS,WAAW,IAC9B,cAAc,OAAO,CAAC,kBAAkB,kBAAkB,WAAW,IACrE,CAAC,GAAG,eAAe,WAAW;AAAA,IAAA;AAAA,EAEtC;AAEA,QAAM,sBAAsB,CAAC,QAAwC,aAAsB;AACzF,QAAI,OAAO,QAAS,QAAO,oBAAC,gBAAA,EAAe,MAAM,GAAG;AACpD,QAAI,OAAO,UAAU,UAAa,OAAO,UAAU,KAAM,QAAO;AAEhE,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA,WAAW,2BAA2B;AAAA,QAAA;AAAA,QAGvC,UAAA,aAAa,OAAO,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAGhC;AAEA,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,OAAO;AAAA,QACP;AAAA,MAAA;AAAA,MAGD,UAAA,YAAY,IAAI,CAAC,WAAW;AAC3B,cAAM,WAAW,eAAe,SAAS,OAAO,KAAK;AACrD,cAAM,WAAW,cAAc,CAAC,OAAO;AAEvC,cAAM,SACJ;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,mBAAiB;AAAA,YACjB,gBAAc;AAAA,YACd;AAAA,YACA,SAAS,MAAM,mBAAmB,OAAO,KAAK;AAAA,YAC9C,WAAW;AAAA,cACT;AAAA,cACA,OAAO;AAAA,cACP,WAAW,qCAAqC,OAAO;AAAA,YAAA;AAAA,YAGxD,UAAA;AAAA,cAAA,OAAO,4BAAS,gBAAA,EAAe,MAAM,OAAO,MAAM,MAAM,OAAO,KAAA,CAAM;AAAA,cACrE,YACC,oBAAC,QAAA,EAAK,WAAW,WAAW,iCAAiC,OAAO,SAAS,GAAI,UAAA,OAAO,MAAA,CAAM;AAAA,cAE/F,oBAAoB,QAAQ,QAAQ;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAKzC,eAAO,WACL,oBAAC,UAAA,EAA6B,UAAA,UAAf,OAAO,KAAe,IAErC,oBAAC,mBAAA,EAAqC,SAAS,OAAO,WAAW,OAAO,OACrE,UAAA,OAAA,GADqB,OAAO,KAE/B;AAAA,MAEJ,CAAC;AAAA,IAAA;AAAA,EAAA;AAGP;"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
interface IControlledVoiceTextareaProps {
|
|
2
|
+
/** Reaches the field itself, so a `FieldLabel` can point at it. */
|
|
3
|
+
id?: string;
|
|
4
|
+
value: string;
|
|
5
|
+
onChange: (value: string) => void;
|
|
6
|
+
placeholder?: string;
|
|
7
|
+
rows?: number;
|
|
8
|
+
lang?: string;
|
|
9
|
+
className?: string;
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
}
|
|
12
|
+
declare const ControlledVoiceTextarea: React.FC<IControlledVoiceTextareaProps>;
|
|
13
|
+
export default ControlledVoiceTextarea;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useRef, useEffect } from "react";
|
|
3
|
+
import classNames from "classnames";
|
|
4
|
+
import { useTranslation } from "react-i18next";
|
|
5
|
+
import ControlledTooltip from "../UI/ControlledTooltip.js";
|
|
6
|
+
import { useVoiceTranscription, VOICE_COMMANDS, applyVoiceUpdate, appendInterimTranscript } from "../../hooks/useVoiceTranscription.js";
|
|
7
|
+
import { MaterialSymbol } from "../UI/MaterialSymbol/index.js";
|
|
8
|
+
import ControlledButton from "./ControlledButton.js";
|
|
9
|
+
import ControlledTextarea from "./ControlledTextarea.js";
|
|
10
|
+
const ControlledVoiceTextarea = ({
|
|
11
|
+
id,
|
|
12
|
+
value,
|
|
13
|
+
onChange,
|
|
14
|
+
placeholder,
|
|
15
|
+
rows = 4,
|
|
16
|
+
lang = "pt-BR",
|
|
17
|
+
className,
|
|
18
|
+
disabled
|
|
19
|
+
}) => {
|
|
20
|
+
const { t } = useTranslation("ui");
|
|
21
|
+
const committedRef = useRef(value);
|
|
22
|
+
const lastEmittedValueRef = useRef(value);
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
if (value === lastEmittedValueRef.current) return;
|
|
25
|
+
committedRef.current = value;
|
|
26
|
+
lastEmittedValueRef.current = value;
|
|
27
|
+
}, [value]);
|
|
28
|
+
const emitValue = (next) => {
|
|
29
|
+
lastEmittedValueRef.current = next;
|
|
30
|
+
onChange(next);
|
|
31
|
+
};
|
|
32
|
+
const { isSupported, isListening, error, toggle } = useVoiceTranscription({
|
|
33
|
+
lang,
|
|
34
|
+
onCommit: (update) => {
|
|
35
|
+
const next = applyVoiceUpdate(committedRef.current, update);
|
|
36
|
+
committedRef.current = next;
|
|
37
|
+
emitValue(next);
|
|
38
|
+
},
|
|
39
|
+
onInterim: (text) => emitValue(appendInterimTranscript(committedRef.current, text))
|
|
40
|
+
});
|
|
41
|
+
const handleManualChange = (next) => {
|
|
42
|
+
committedRef.current = next;
|
|
43
|
+
emitValue(next);
|
|
44
|
+
};
|
|
45
|
+
const errorMessageByCode = {
|
|
46
|
+
permission: t("voiceInput.errors.permission"),
|
|
47
|
+
microphone: t("voiceInput.errors.microphone"),
|
|
48
|
+
network: t("voiceInput.errors.network"),
|
|
49
|
+
unavailable: t("voiceInput.errors.unavailable")
|
|
50
|
+
};
|
|
51
|
+
const commandHint = VOICE_COMMANDS.map((command) => command.phrases[0]).join(", ");
|
|
52
|
+
return /* @__PURE__ */ jsxs("div", { className: classNames("relative w-full", className), children: [
|
|
53
|
+
/* @__PURE__ */ jsx(
|
|
54
|
+
ControlledTextarea,
|
|
55
|
+
{
|
|
56
|
+
id,
|
|
57
|
+
value,
|
|
58
|
+
rows,
|
|
59
|
+
resize: "none",
|
|
60
|
+
disabled,
|
|
61
|
+
placeholder,
|
|
62
|
+
onChange: (e) => handleManualChange(e.target.value),
|
|
63
|
+
className: "pr-12"
|
|
64
|
+
}
|
|
65
|
+
),
|
|
66
|
+
isSupported && /* @__PURE__ */ jsxs("div", { className: "absolute right-2 top-2 flex items-center gap-1", children: [
|
|
67
|
+
/* @__PURE__ */ jsx(ControlledTooltip, { content: t("voiceInput.commandsHint", { commands: commandHint }), className: "w-56", children: /* @__PURE__ */ jsx("span", { className: "flex size-7 items-center justify-center rounded-full text-foreground-faint", children: /* @__PURE__ */ jsx(MaterialSymbol, { icon: "help", size: 16 }) }) }),
|
|
68
|
+
/* @__PURE__ */ jsx(ControlledTooltip, { content: isListening ? t("voiceInput.stop") : t("voiceInput.start"), children: /* @__PURE__ */ jsx(
|
|
69
|
+
ControlledButton,
|
|
70
|
+
{
|
|
71
|
+
"aria-label": isListening ? t("voiceInput.stop") : t("voiceInput.start"),
|
|
72
|
+
defaultHtmlButton: true,
|
|
73
|
+
disabled,
|
|
74
|
+
onClick: toggle,
|
|
75
|
+
className: classNames(
|
|
76
|
+
"flex size-8 items-center justify-center rounded-full transition-colors",
|
|
77
|
+
isListening ? "bg-danger-soft text-danger-emphasis hover:bg-danger-soft" : "text-foreground-faint hover:bg-muted-hover hover:text-brand-emphasis"
|
|
78
|
+
),
|
|
79
|
+
children: /* @__PURE__ */ jsx(
|
|
80
|
+
MaterialSymbol,
|
|
81
|
+
{
|
|
82
|
+
icon: isListening ? "stop" : "mic",
|
|
83
|
+
size: 18,
|
|
84
|
+
className: isListening ? "animate-pulse" : ""
|
|
85
|
+
}
|
|
86
|
+
)
|
|
87
|
+
}
|
|
88
|
+
) })
|
|
89
|
+
] }),
|
|
90
|
+
isSupported && error && /* @__PURE__ */ jsxs("span", { role: "alert", className: "mt-1 flex items-center gap-1 text-xs text-danger-emphasis", children: [
|
|
91
|
+
/* @__PURE__ */ jsx(MaterialSymbol, { icon: "mic_off", size: 14 }),
|
|
92
|
+
errorMessageByCode[error]
|
|
93
|
+
] })
|
|
94
|
+
] });
|
|
95
|
+
};
|
|
96
|
+
export {
|
|
97
|
+
ControlledVoiceTextarea as default
|
|
98
|
+
};
|
|
99
|
+
//# sourceMappingURL=ControlledVoiceTextarea.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ControlledVoiceTextarea.js","sources":["../../../src/components/Form/ControlledVoiceTextarea.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport classNames from 'classnames';\nimport { useTranslation } from 'react-i18next';\n\nimport ControlledTooltip from '@/components/UI/ControlledTooltip';\nimport {\n appendInterimTranscript,\n applyVoiceUpdate,\n TVoiceTranscriptionError,\n useVoiceTranscription,\n VOICE_COMMANDS,\n} from '@/hooks/useVoiceTranscription';\n\nimport { MaterialSymbol } from '../UI/MaterialSymbol';\n\nimport ControlledButton from './ControlledButton';\nimport ControlledTextarea from './ControlledTextarea';\n\ninterface IControlledVoiceTextareaProps {\n /** Reaches the field itself, so a `FieldLabel` can point at it. */\n id?: string;\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n rows?: number;\n lang?: string;\n className?: string;\n disabled?: boolean;\n}\n\nconst ControlledVoiceTextarea: React.FC<IControlledVoiceTextareaProps> = ({\n id,\n value,\n onChange,\n placeholder,\n rows = 4,\n lang = 'pt-BR',\n className,\n disabled,\n}) => {\n const { t } = useTranslation('ui');\n\n const committedRef = useRef(value);\n const lastEmittedValueRef = useRef(value);\n\n useEffect(() => {\n if (value === lastEmittedValueRef.current) return;\n committedRef.current = value;\n lastEmittedValueRef.current = value;\n }, [value]);\n\n const emitValue = (next: string) => {\n lastEmittedValueRef.current = next;\n onChange(next);\n };\n\n const { isSupported, isListening, error, toggle } = useVoiceTranscription({\n lang,\n onCommit: (update) => {\n const next = applyVoiceUpdate(committedRef.current, update);\n committedRef.current = next;\n emitValue(next);\n },\n onInterim: (text) => emitValue(appendInterimTranscript(committedRef.current, text)),\n });\n\n const handleManualChange = (next: string) => {\n committedRef.current = next;\n emitValue(next);\n };\n\n const errorMessageByCode: Record<TVoiceTranscriptionError, string> = {\n permission: t('voiceInput.errors.permission'),\n microphone: t('voiceInput.errors.microphone'),\n network: t('voiceInput.errors.network'),\n unavailable: t('voiceInput.errors.unavailable'),\n };\n\n const commandHint = VOICE_COMMANDS.map((command) => command.phrases[0]).join(', ');\n\n return (\n <div className={classNames('relative w-full', className)}>\n <ControlledTextarea\n id={id}\n value={value}\n rows={rows}\n resize=\"none\"\n disabled={disabled}\n placeholder={placeholder}\n onChange={(e) => handleManualChange(e.target.value)}\n className=\"pr-12\"\n />\n\n {isSupported && (\n <div className=\"absolute right-2 top-2 flex items-center gap-1\">\n <ControlledTooltip content={t('voiceInput.commandsHint', { commands: commandHint })} className=\"w-56\">\n <span className=\"flex size-7 items-center justify-center rounded-full text-foreground-faint\">\n <MaterialSymbol icon=\"help\" size={16} />\n </span>\n </ControlledTooltip>\n <ControlledTooltip content={isListening ? t('voiceInput.stop') : t('voiceInput.start')}>\n <ControlledButton\n aria-label={isListening ? t('voiceInput.stop') : t('voiceInput.start')}\n defaultHtmlButton\n disabled={disabled}\n onClick={toggle}\n className={classNames(\n 'flex size-8 items-center justify-center rounded-full transition-colors',\n isListening\n ? 'bg-danger-soft text-danger-emphasis hover:bg-danger-soft'\n : 'text-foreground-faint hover:bg-muted-hover hover:text-brand-emphasis',\n )}\n >\n <MaterialSymbol\n icon={isListening ? 'stop' : 'mic'}\n size={18}\n className={isListening ? 'animate-pulse' : ''}\n />\n </ControlledButton>\n </ControlledTooltip>\n </div>\n )}\n\n {isSupported && error && (\n <span role=\"alert\" className=\"mt-1 flex items-center gap-1 text-xs text-danger-emphasis\">\n <MaterialSymbol icon=\"mic_off\" size={14} />\n {errorMessageByCode[error]}\n </span>\n )}\n </div>\n );\n};\n\nexport default ControlledVoiceTextarea;\n"],"names":[],"mappings":";;;;;;;;;AA8BA,MAAM,0BAAmE,CAAC;AAAA,EACxE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,OAAO;AAAA,EACP;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,EAAA,IAAM,eAAe,IAAI;AAEjC,QAAM,eAAe,OAAO,KAAK;AACjC,QAAM,sBAAsB,OAAO,KAAK;AAExC,YAAU,MAAM;AACd,QAAI,UAAU,oBAAoB,QAAS;AAC3C,iBAAa,UAAU;AACvB,wBAAoB,UAAU;AAAA,EAChC,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,YAAY,CAAC,SAAiB;AAClC,wBAAoB,UAAU;AAC9B,aAAS,IAAI;AAAA,EACf;AAEA,QAAM,EAAE,aAAa,aAAa,OAAO,OAAA,IAAW,sBAAsB;AAAA,IACxE;AAAA,IACA,UAAU,CAAC,WAAW;AACpB,YAAM,OAAO,iBAAiB,aAAa,SAAS,MAAM;AAC1D,mBAAa,UAAU;AACvB,gBAAU,IAAI;AAAA,IAChB;AAAA,IACA,WAAW,CAAC,SAAS,UAAU,wBAAwB,aAAa,SAAS,IAAI,CAAC;AAAA,EAAA,CACnF;AAED,QAAM,qBAAqB,CAAC,SAAiB;AAC3C,iBAAa,UAAU;AACvB,cAAU,IAAI;AAAA,EAChB;AAEA,QAAM,qBAA+D;AAAA,IACnE,YAAY,EAAE,8BAA8B;AAAA,IAC5C,YAAY,EAAE,8BAA8B;AAAA,IAC5C,SAAS,EAAE,2BAA2B;AAAA,IACtC,aAAa,EAAE,+BAA+B;AAAA,EAAA;AAGhD,QAAM,cAAc,eAAe,IAAI,CAAC,YAAY,QAAQ,QAAQ,CAAC,CAAC,EAAE,KAAK,IAAI;AAEjF,8BACG,OAAA,EAAI,WAAW,WAAW,mBAAmB,SAAS,GACrD,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA,UAAU,CAAC,MAAM,mBAAmB,EAAE,OAAO,KAAK;AAAA,QAClD,WAAU;AAAA,MAAA;AAAA,IAAA;AAAA,IAGX,eACC,qBAAC,OAAA,EAAI,WAAU,kDACb,UAAA;AAAA,MAAA,oBAAC,mBAAA,EAAkB,SAAS,EAAE,2BAA2B,EAAE,UAAU,YAAA,CAAa,GAAG,WAAU,QAC7F,8BAAC,QAAA,EAAK,WAAU,8EACd,UAAA,oBAAC,gBAAA,EAAe,MAAK,QAAO,MAAM,IAAI,EAAA,CACxC,EAAA,CACF;AAAA,MACA,oBAAC,qBAAkB,SAAS,cAAc,EAAE,iBAAiB,IAAI,EAAE,kBAAkB,GACnF,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,cAAY,cAAc,EAAE,iBAAiB,IAAI,EAAE,kBAAkB;AAAA,UACrE,mBAAiB;AAAA,UACjB;AAAA,UACA,SAAS;AAAA,UACT,WAAW;AAAA,YACT;AAAA,YACA,cACI,6DACA;AAAA,UAAA;AAAA,UAGN,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAM,cAAc,SAAS;AAAA,cAC7B,MAAM;AAAA,cACN,WAAW,cAAc,kBAAkB;AAAA,YAAA;AAAA,UAAA;AAAA,QAC7C;AAAA,MAAA,EACF,CACF;AAAA,IAAA,GACF;AAAA,IAGD,eAAe,SACd,qBAAC,UAAK,MAAK,SAAQ,WAAU,6DAC3B,UAAA;AAAA,MAAA,oBAAC,gBAAA,EAAe,MAAK,WAAU,MAAM,IAAI;AAAA,MACxC,mBAAmB,KAAK;AAAA,IAAA,EAAA,CAC3B;AAAA,EAAA,GAEJ;AAEJ;"}
|