@portnet/ui 6.0.2 → 6.0.3
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/CHANGELOG.md +652 -0
- package/dist/esm/index.js +72 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/v2/__tests__/AppMain.test.js +130 -0
- package/dist/esm/v2/__tests__/AppMain.test.js.map +1 -0
- package/dist/esm/v2/__tests__/ChartFigure.test.js +180 -0
- package/dist/esm/v2/__tests__/ChartFigure.test.js.map +1 -0
- package/dist/esm/v2/__tests__/DataGridRowActionsPropagation.test.js +150 -0
- package/dist/esm/v2/__tests__/DataGridRowActionsPropagation.test.js.map +1 -0
- package/dist/esm/v2/__tests__/DrawerTactileTargets.test.js +93 -0
- package/dist/esm/v2/__tests__/DrawerTactileTargets.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FieldError.test.js +71 -38
- package/dist/esm/v2/__tests__/FieldError.test.js.map +1 -1
- package/dist/esm/v2/__tests__/FieldNaming.test.js +160 -0
- package/dist/esm/v2/__tests__/FieldNaming.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FieldWidth.test.js +11 -11
- package/dist/esm/v2/__tests__/FieldWidth.test.js.map +1 -1
- package/dist/esm/v2/__tests__/FileCard.test.js +18 -17
- package/dist/esm/v2/__tests__/FileCard.test.js.map +1 -1
- package/dist/esm/v2/__tests__/FormikCheckbox.test.js +87 -179
- package/dist/esm/v2/__tests__/FormikCheckbox.test.js.map +1 -1
- package/dist/esm/v2/__tests__/FormikDateTimePicker.test.js +32 -44
- package/dist/esm/v2/__tests__/FormikDateTimePicker.test.js.map +1 -1
- package/dist/esm/v2/__tests__/FormikDisplayWidth.test.js +101 -0
- package/dist/esm/v2/__tests__/FormikDisplayWidth.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FormikRadioGroup.test.js +118 -199
- package/dist/esm/v2/__tests__/FormikRadioGroup.test.js.map +1 -1
- package/dist/esm/v2/__tests__/MobileRowCard.test.js +44 -42
- package/dist/esm/v2/__tests__/MobileRowCard.test.js.map +1 -1
- package/dist/esm/v2/__tests__/PreviewDrawer.test.js +165 -0
- package/dist/esm/v2/__tests__/PreviewDrawer.test.js.map +1 -0
- package/dist/esm/v2/__tests__/ReferentielFieldContainer.test.js +156 -0
- package/dist/esm/v2/__tests__/ReferentielFieldContainer.test.js.map +1 -0
- package/dist/esm/v2/__tests__/SectionErrorBoundary.test.js +37 -52
- package/dist/esm/v2/__tests__/SectionErrorBoundary.test.js.map +1 -1
- package/dist/esm/v2/__tests__/apiError.test.js +50 -69
- package/dist/esm/v2/__tests__/apiError.test.js.map +1 -1
- package/dist/esm/v2/__tests__/banned-patterns.test.js +41 -122
- package/dist/esm/v2/__tests__/banned-patterns.test.js.map +1 -1
- package/dist/esm/v2/__tests__/chart-palette.test.js +204 -0
- package/dist/esm/v2/__tests__/chart-palette.test.js.map +1 -0
- package/dist/esm/v2/__tests__/contrast-palette.test.js +42 -74
- package/dist/esm/v2/__tests__/contrast-palette.test.js.map +1 -1
- package/dist/esm/v2/__tests__/cssVariables.test.js +44 -51
- package/dist/esm/v2/__tests__/cssVariables.test.js.map +1 -1
- package/dist/esm/v2/__tests__/fileValidation.test.js +134 -0
- package/dist/esm/v2/__tests__/fileValidation.test.js.map +1 -0
- package/dist/esm/v2/__tests__/filterCriteria.test.js +321 -0
- package/dist/esm/v2/__tests__/filterCriteria.test.js.map +1 -0
- package/dist/esm/v2/__tests__/fmtDate.test.js +68 -0
- package/dist/esm/v2/__tests__/fmtDate.test.js.map +1 -0
- package/dist/esm/v2/__tests__/gap-leakage-refonte.test.js +218 -0
- package/dist/esm/v2/__tests__/gap-leakage-refonte.test.js.map +1 -0
- package/dist/esm/v2/__tests__/labels-merge.test.js +17 -21
- package/dist/esm/v2/__tests__/labels-merge.test.js.map +1 -1
- package/dist/esm/v2/__tests__/locale-fallback.test.js +35 -40
- package/dist/esm/v2/__tests__/locale-fallback.test.js.map +1 -1
- package/dist/esm/v2/__tests__/reviveSavedCriteria.test.js +143 -0
- package/dist/esm/v2/__tests__/reviveSavedCriteria.test.js.map +1 -0
- package/dist/esm/v2/__tests__/rowActions.test.js +182 -0
- package/dist/esm/v2/__tests__/rowActions.test.js.map +1 -0
- package/dist/esm/v2/__tests__/useFocusOnRouteChange.test.js +155 -0
- package/dist/esm/v2/__tests__/useFocusOnRouteChange.test.js.map +1 -0
- package/dist/esm/v2/__tests__/useFocusTrap.test.js +266 -402
- package/dist/esm/v2/__tests__/useFocusTrap.test.js.map +1 -1
- package/dist/esm/v2/__tests__/usePrefersReducedMotion.test.js +120 -0
- package/dist/esm/v2/__tests__/usePrefersReducedMotion.test.js.map +1 -0
- package/dist/esm/v2/components/Accordion.js +48 -70
- package/dist/esm/v2/components/Accordion.js.map +1 -1
- package/dist/esm/v2/components/ActionStrip.js +31 -43
- package/dist/esm/v2/components/ActionStrip.js.map +1 -1
- package/dist/esm/v2/components/Banner.js +25 -22
- package/dist/esm/v2/components/Banner.js.map +1 -1
- package/dist/esm/v2/components/Busy.js +14 -19
- package/dist/esm/v2/components/Busy.js.map +1 -1
- package/dist/esm/v2/components/Button.js +34 -45
- package/dist/esm/v2/components/Button.js.map +1 -1
- package/dist/esm/v2/components/CategoryTag.js +44 -27
- package/dist/esm/v2/components/CategoryTag.js.map +1 -1
- package/dist/esm/v2/components/Checkbox.js +32 -38
- package/dist/esm/v2/components/Checkbox.js.map +1 -1
- package/dist/esm/v2/components/Chip.js +23 -36
- package/dist/esm/v2/components/Chip.js.map +1 -1
- package/dist/esm/v2/components/Combobox.js +112 -136
- package/dist/esm/v2/components/Combobox.js.map +1 -1
- package/dist/esm/v2/components/CommandPalette.js +113 -198
- package/dist/esm/v2/components/CommandPalette.js.map +1 -1
- package/dist/esm/v2/components/ConfirmDialog.js +36 -45
- package/dist/esm/v2/components/ConfirmDialog.js.map +1 -1
- package/dist/esm/v2/components/DatePicker.js +78 -81
- package/dist/esm/v2/components/DatePicker.js.map +1 -1
- package/dist/esm/v2/components/DateRangePicker.js +63 -74
- package/dist/esm/v2/components/DateRangePicker.js.map +1 -1
- package/dist/esm/v2/components/DateTimePicker.js +81 -86
- package/dist/esm/v2/components/DateTimePicker.js.map +1 -1
- package/dist/esm/v2/components/Drawer.js +71 -65
- package/dist/esm/v2/components/Drawer.js.map +1 -1
- package/dist/esm/v2/components/Dropzone.js +130 -177
- package/dist/esm/v2/components/Dropzone.js.map +1 -1
- package/dist/esm/v2/components/EmptyState.js +9 -9
- package/dist/esm/v2/components/EmptyState.js.map +1 -1
- package/dist/esm/v2/components/FavoriteToggle.js +24 -33
- package/dist/esm/v2/components/FavoriteToggle.js.map +1 -1
- package/dist/esm/v2/components/Field.js +155 -59
- package/dist/esm/v2/components/Field.js.map +1 -1
- package/dist/esm/v2/components/FieldError.js +9 -13
- package/dist/esm/v2/components/FieldError.js.map +1 -1
- package/dist/esm/v2/components/FieldHelp.js +28 -49
- package/dist/esm/v2/components/FieldHelp.js.map +1 -1
- package/dist/esm/v2/components/FileCard.js +14 -19
- package/dist/esm/v2/components/FileCard.js.map +1 -1
- package/dist/esm/v2/components/FilterTab.js +22 -31
- package/dist/esm/v2/components/FilterTab.js.map +1 -1
- package/dist/esm/v2/components/ForbiddenPage.js +28 -8
- package/dist/esm/v2/components/ForbiddenPage.js.map +1 -1
- package/dist/esm/v2/components/FormGrid.js +48 -54
- package/dist/esm/v2/components/FormGrid.js.map +1 -1
- package/dist/esm/v2/components/FormikDisplay.js +98 -24
- package/dist/esm/v2/components/FormikDisplay.js.map +1 -1
- package/dist/esm/v2/components/Input.js +75 -34
- package/dist/esm/v2/components/Input.js.map +1 -1
- package/dist/esm/v2/components/KPICard.js +42 -51
- package/dist/esm/v2/components/KPICard.js.map +1 -1
- package/dist/esm/v2/components/KPIStrip.js +9 -15
- package/dist/esm/v2/components/KPIStrip.js.map +1 -1
- package/dist/esm/v2/components/KV.js +16 -23
- package/dist/esm/v2/components/KV.js.map +1 -1
- package/dist/esm/v2/components/KVGrid.js +15 -23
- package/dist/esm/v2/components/KVGrid.js.map +1 -1
- package/dist/esm/v2/components/Layout.js +81 -117
- package/dist/esm/v2/components/Layout.js.map +1 -1
- package/dist/esm/v2/components/MobileRowCard.js +64 -75
- package/dist/esm/v2/components/MobileRowCard.js.map +1 -1
- package/dist/esm/v2/components/Modal.js +44 -53
- package/dist/esm/v2/components/Modal.js.map +1 -1
- package/dist/esm/v2/components/NetworkErrorPage.js +28 -11
- package/dist/esm/v2/components/NetworkErrorPage.js.map +1 -1
- package/dist/esm/v2/components/NotFoundPage.js +28 -9
- package/dist/esm/v2/components/NotFoundPage.js.map +1 -1
- package/dist/esm/v2/components/NumberInput.js +77 -107
- package/dist/esm/v2/components/NumberInput.js.map +1 -1
- package/dist/esm/v2/components/OverflowMenu.js +24 -42
- package/dist/esm/v2/components/OverflowMenu.js.map +1 -1
- package/dist/esm/v2/components/PdfViewer.js +24 -33
- package/dist/esm/v2/components/PdfViewer.js.map +1 -1
- package/dist/esm/v2/components/ProgressBar.js +28 -36
- package/dist/esm/v2/components/ProgressBar.js.map +1 -1
- package/dist/esm/v2/components/Radio.js +49 -57
- package/dist/esm/v2/components/Radio.js.map +1 -1
- package/dist/esm/v2/components/SectionErrorBoundary.js +84 -130
- package/dist/esm/v2/components/SectionErrorBoundary.js.map +1 -1
- package/dist/esm/v2/components/SectionHeader.js +24 -31
- package/dist/esm/v2/components/SectionHeader.js.map +1 -1
- package/dist/esm/v2/components/Segmented.js +59 -84
- package/dist/esm/v2/components/Segmented.js.map +1 -1
- package/dist/esm/v2/components/Select.js +100 -138
- package/dist/esm/v2/components/Select.js.map +1 -1
- package/dist/esm/v2/components/ServerErrorPage.js +27 -10
- package/dist/esm/v2/components/ServerErrorPage.js.map +1 -1
- package/dist/esm/v2/components/Skeleton.js +81 -96
- package/dist/esm/v2/components/Skeleton.js.map +1 -1
- package/dist/esm/v2/components/SkipLink.js +6 -7
- package/dist/esm/v2/components/SkipLink.js.map +1 -1
- package/dist/esm/v2/components/Spinner.js +13 -22
- package/dist/esm/v2/components/Spinner.js.map +1 -1
- package/dist/esm/v2/components/Status.js +14 -25
- package/dist/esm/v2/components/Status.js.map +1 -1
- package/dist/esm/v2/components/Stepper.js +68 -71
- package/dist/esm/v2/components/Stepper.js.map +1 -1
- package/dist/esm/v2/components/Surface.js +25 -44
- package/dist/esm/v2/components/Surface.js.map +1 -1
- package/dist/esm/v2/components/Switch.js +21 -29
- package/dist/esm/v2/components/Switch.js.map +1 -1
- package/dist/esm/v2/components/TabPanel.js +84 -0
- package/dist/esm/v2/components/TabPanel.js.map +1 -0
- package/dist/esm/v2/components/Tabs.js +43 -19
- package/dist/esm/v2/components/Tabs.js.map +1 -1
- package/dist/esm/v2/components/TelInput.js +75 -108
- package/dist/esm/v2/components/TelInput.js.map +1 -1
- package/dist/esm/v2/components/Textarea.js +21 -30
- package/dist/esm/v2/components/Textarea.js.map +1 -1
- package/dist/esm/v2/components/TimePicker.js +59 -69
- package/dist/esm/v2/components/TimePicker.js.map +1 -1
- package/dist/esm/v2/components/Toast.js +109 -163
- package/dist/esm/v2/components/Toast.js.map +1 -1
- package/dist/esm/v2/components/Tooltip.js +18 -31
- package/dist/esm/v2/components/Tooltip.js.map +1 -1
- package/dist/esm/v2/components/_ErrorPageBody.js +6 -5
- package/dist/esm/v2/components/_ErrorPageBody.js.map +1 -1
- package/dist/esm/v2/components/_pickerShared.js +2 -2
- package/dist/esm/v2/components/_pickerShared.js.map +1 -1
- package/dist/esm/v2/components/index.js +37 -0
- package/dist/esm/v2/components/index.js.map +1 -1
- package/dist/esm/v2/hooks/index.js +62 -0
- package/dist/esm/v2/hooks/index.js.map +1 -1
- package/dist/esm/v2/hooks/useAppliedFilters.js +112 -0
- package/dist/esm/v2/hooks/useAppliedFilters.js.map +1 -0
- package/dist/esm/v2/hooks/useDebouncedCallback.js +82 -0
- package/dist/esm/v2/hooks/useDebouncedCallback.js.map +1 -0
- package/dist/esm/v2/hooks/useDelayedFlag.js +5 -19
- package/dist/esm/v2/hooks/useDelayedFlag.js.map +1 -1
- package/dist/esm/v2/hooks/useDensity.js +13 -17
- package/dist/esm/v2/hooks/useDensity.js.map +1 -1
- package/dist/esm/v2/hooks/useFocusFirstError.js +25 -33
- package/dist/esm/v2/hooks/useFocusFirstError.js.map +1 -1
- package/dist/esm/v2/hooks/useFocusOnRouteChange.js +81 -0
- package/dist/esm/v2/hooks/useFocusOnRouteChange.js.map +1 -0
- package/dist/esm/v2/hooks/useFocusTrap.js +19 -23
- package/dist/esm/v2/hooks/useFocusTrap.js.map +1 -1
- package/dist/esm/v2/hooks/useFormAutoSave.js +38 -53
- package/dist/esm/v2/hooks/useFormAutoSave.js.map +1 -1
- package/dist/esm/v2/hooks/useFormCompletionProgress.js +32 -51
- package/dist/esm/v2/hooks/useFormCompletionProgress.js.map +1 -1
- package/dist/esm/v2/hooks/useKeyboardShortcuts.js +125 -0
- package/dist/esm/v2/hooks/useKeyboardShortcuts.js.map +1 -0
- package/dist/esm/v2/hooks/usePrefersReducedMotion.js +99 -0
- package/dist/esm/v2/hooks/usePrefersReducedMotion.js.map +1 -0
- package/dist/esm/v2/hooks/useResolvedDensity.js +2 -10
- package/dist/esm/v2/hooks/useResolvedDensity.js.map +1 -1
- package/dist/esm/v2/hooks/useSortedRows.js +3 -5
- package/dist/esm/v2/hooks/useSortedRows.js.map +1 -1
- package/dist/esm/v2/hooks/useTabLoading.js +6 -21
- package/dist/esm/v2/hooks/useTabLoading.js.map +1 -1
- package/dist/esm/v2/index.js +2 -3
- package/dist/esm/v2/index.js.map +1 -1
- package/dist/esm/v2/modalContext.js +2 -2
- package/dist/esm/v2/modalContext.js.map +1 -1
- package/dist/esm/v2/models/favorite.js.map +1 -1
- package/dist/esm/v2/models/personalization.js.map +1 -1
- package/dist/esm/v2/models/referentiel.js.map +1 -1
- package/dist/esm/v2/models/savedFilter.js.map +1 -1
- package/dist/esm/v2/patterns/ActionBar.js +115 -159
- package/dist/esm/v2/patterns/ActionBar.js.map +1 -1
- package/dist/esm/v2/patterns/AppMain.js +108 -0
- package/dist/esm/v2/patterns/AppMain.js.map +1 -0
- package/dist/esm/v2/patterns/BulkActionBar.js +31 -34
- package/dist/esm/v2/patterns/BulkActionBar.js.map +1 -1
- package/dist/esm/v2/patterns/ChartFigure.js +151 -0
- package/dist/esm/v2/patterns/ChartFigure.js.map +1 -0
- package/dist/esm/v2/patterns/CollapsibleDataGrid.js +111 -152
- package/dist/esm/v2/patterns/CollapsibleDataGrid.js.map +1 -1
- package/dist/esm/v2/patterns/ColumnsToggle.js +43 -77
- package/dist/esm/v2/patterns/ColumnsToggle.js.map +1 -1
- package/dist/esm/v2/patterns/DataGrid.js +221 -255
- package/dist/esm/v2/patterns/DataGrid.js.map +1 -1
- package/dist/esm/v2/patterns/DataGridSettingsMenu.js +76 -94
- package/dist/esm/v2/patterns/DataGridSettingsMenu.js.map +1 -1
- package/dist/esm/v2/patterns/DataGridToolbar.js +85 -89
- package/dist/esm/v2/patterns/DataGridToolbar.js.map +1 -1
- package/dist/esm/v2/patterns/DataGridVirtualized.js +141 -182
- package/dist/esm/v2/patterns/DataGridVirtualized.js.map +1 -1
- package/dist/esm/v2/patterns/DeleteResourceConfirmDialog.js +26 -30
- package/dist/esm/v2/patterns/DeleteResourceConfirmDialog.js.map +1 -1
- package/dist/esm/v2/patterns/DetailSplit.js +108 -0
- package/dist/esm/v2/patterns/DetailSplit.js.map +1 -0
- package/dist/esm/v2/patterns/FavoriteColumn.js +15 -17
- package/dist/esm/v2/patterns/FavoriteColumn.js.map +1 -1
- package/dist/esm/v2/patterns/FavoritesFilter.js +30 -39
- package/dist/esm/v2/patterns/FavoritesFilter.js.map +1 -1
- package/dist/esm/v2/patterns/FilterTabBar.js +112 -0
- package/dist/esm/v2/patterns/FilterTabBar.js.map +1 -0
- package/dist/esm/v2/patterns/FormErrorSummary.js +12 -13
- package/dist/esm/v2/patterns/FormErrorSummary.js.map +1 -1
- package/dist/esm/v2/patterns/FormPageShell.js +43 -41
- package/dist/esm/v2/patterns/FormPageShell.js.map +1 -1
- package/dist/esm/v2/patterns/FormSection.js +30 -38
- package/dist/esm/v2/patterns/FormSection.js.map +1 -1
- package/dist/esm/v2/patterns/FormikCheckbox.js +29 -39
- package/dist/esm/v2/patterns/FormikCheckbox.js.map +1 -1
- package/dist/esm/v2/patterns/FormikCheckboxGroup.js +56 -60
- package/dist/esm/v2/patterns/FormikCheckboxGroup.js.map +1 -1
- package/dist/esm/v2/patterns/FormikCombobox.js +51 -69
- package/dist/esm/v2/patterns/FormikCombobox.js.map +1 -1
- package/dist/esm/v2/patterns/FormikDatePicker.js +44 -58
- package/dist/esm/v2/patterns/FormikDatePicker.js.map +1 -1
- package/dist/esm/v2/patterns/FormikDateTimePicker.js +44 -58
- package/dist/esm/v2/patterns/FormikDateTimePicker.js.map +1 -1
- package/dist/esm/v2/patterns/FormikErrorFocus.js +22 -23
- package/dist/esm/v2/patterns/FormikErrorFocus.js.map +1 -1
- package/dist/esm/v2/patterns/FormikErrorSummary.js +89 -0
- package/dist/esm/v2/patterns/FormikErrorSummary.js.map +1 -0
- package/dist/esm/v2/patterns/FormikFile.js +94 -78
- package/dist/esm/v2/patterns/FormikFile.js.map +1 -1
- package/dist/esm/v2/patterns/FormikInput.js +40 -53
- package/dist/esm/v2/patterns/FormikInput.js.map +1 -1
- package/dist/esm/v2/patterns/FormikRadioGroup.js +39 -51
- package/dist/esm/v2/patterns/FormikRadioGroup.js.map +1 -1
- package/dist/esm/v2/patterns/FormikReferentielField.js +49 -59
- package/dist/esm/v2/patterns/FormikReferentielField.js.map +1 -1
- package/dist/esm/v2/patterns/FormikSelect.js +64 -87
- package/dist/esm/v2/patterns/FormikSelect.js.map +1 -1
- package/dist/esm/v2/patterns/FormikTextarea.js +30 -46
- package/dist/esm/v2/patterns/FormikTextarea.js.map +1 -1
- package/dist/esm/v2/patterns/KeyboardShortcutsHelp.js +53 -71
- package/dist/esm/v2/patterns/KeyboardShortcutsHelp.js.map +1 -1
- package/dist/esm/v2/patterns/NetworkErrorBanner.js +6 -7
- package/dist/esm/v2/patterns/NetworkErrorBanner.js.map +1 -1
- package/dist/esm/v2/patterns/PageContent.js +10 -14
- package/dist/esm/v2/patterns/PageContent.js.map +1 -1
- package/dist/esm/v2/patterns/PreviewDrawer.js +153 -0
- package/dist/esm/v2/patterns/PreviewDrawer.js.map +1 -0
- package/dist/esm/v2/patterns/ReferentielField.js +327 -312
- package/dist/esm/v2/patterns/ReferentielField.js.map +1 -1
- package/dist/esm/v2/patterns/RowFavoriteToggle.js +27 -22
- package/dist/esm/v2/patterns/RowFavoriteToggle.js.map +1 -1
- package/dist/esm/v2/patterns/SaveFilterDialog.js +38 -66
- package/dist/esm/v2/patterns/SaveFilterDialog.js.map +1 -1
- package/dist/esm/v2/patterns/SavedFiltersMenu.js +62 -81
- package/dist/esm/v2/patterns/SavedFiltersMenu.js.map +1 -1
- package/dist/esm/v2/patterns/SkeletonPageShell.js +106 -129
- package/dist/esm/v2/patterns/SkeletonPageShell.js.map +1 -1
- package/dist/esm/v2/patterns/SortableHeader.js +22 -45
- package/dist/esm/v2/patterns/SortableHeader.js.map +1 -1
- package/dist/esm/v2/patterns/Tour.js +94 -120
- package/dist/esm/v2/patterns/Tour.js.map +1 -1
- package/dist/esm/v2/patterns/_dataGridShared.js +107 -128
- package/dist/esm/v2/patterns/_dataGridShared.js.map +1 -1
- package/dist/esm/v2/patterns/_pickerSerialisation.js +6 -8
- package/dist/esm/v2/patterns/_pickerSerialisation.js.map +1 -1
- package/dist/esm/v2/patterns/_sort.js +17 -33
- package/dist/esm/v2/patterns/_sort.js.map +1 -1
- package/dist/esm/v2/patterns/_useColumnReorder.js +122 -160
- package/dist/esm/v2/patterns/_useColumnReorder.js.map +1 -1
- package/dist/esm/v2/patterns/_useColumnResize.js +78 -96
- package/dist/esm/v2/patterns/_useColumnResize.js.map +1 -1
- package/dist/esm/v2/patterns/filterCriteria.js +102 -0
- package/dist/esm/v2/patterns/filterCriteria.js.map +1 -0
- package/dist/esm/v2/patterns/index.js +152 -0
- package/dist/esm/v2/patterns/index.js.map +1 -1
- package/dist/esm/v2/patterns/rowActions.js +223 -0
- package/dist/esm/v2/patterns/rowActions.js.map +1 -0
- package/dist/esm/v2/personalization/PersonalizationProvider.js +50 -47
- package/dist/esm/v2/personalization/PersonalizationProvider.js.map +1 -1
- package/dist/esm/v2/personalization/adapters/_storageKey.js +5 -5
- package/dist/esm/v2/personalization/adapters/_storageKey.js.map +1 -1
- package/dist/esm/v2/personalization/adapters/createLocalStorageAdapter.js +22 -23
- package/dist/esm/v2/personalization/adapters/createLocalStorageAdapter.js.map +1 -1
- package/dist/esm/v2/personalization/adapters/createMemoryAdapter.js +13 -13
- package/dist/esm/v2/personalization/adapters/createMemoryAdapter.js.map +1 -1
- package/dist/esm/v2/personalization/capabilities/favorites.js +36 -60
- package/dist/esm/v2/personalization/capabilities/favorites.js.map +1 -1
- package/dist/esm/v2/personalization/capabilities/favoritesView.js +22 -34
- package/dist/esm/v2/personalization/capabilities/favoritesView.js.map +1 -1
- package/dist/esm/v2/personalization/capabilities/gridPreferences.js +28 -34
- package/dist/esm/v2/personalization/capabilities/gridPreferences.js.map +1 -1
- package/dist/esm/v2/personalization/capabilities/reviveSavedCriteria.js +119 -0
- package/dist/esm/v2/personalization/capabilities/reviveSavedCriteria.js.map +1 -0
- package/dist/esm/v2/personalization/capabilities/savedFilters.js +90 -98
- package/dist/esm/v2/personalization/capabilities/savedFilters.js.map +1 -1
- package/dist/esm/v2/personalization/createPersonalizationStore.js +78 -181
- package/dist/esm/v2/personalization/createPersonalizationStore.js.map +1 -1
- package/dist/esm/v2/personalization/index.js +17 -0
- package/dist/esm/v2/personalization/index.js.map +1 -1
- package/dist/esm/v2/personalization/personalizationContext.js +9 -9
- package/dist/esm/v2/personalization/personalizationContext.js.map +1 -1
- package/dist/esm/v2/personalization/schema.js +8 -9
- package/dist/esm/v2/personalization/schema.js.map +1 -1
- package/dist/esm/v2/referentiel/ReferentielProvider.js +27 -42
- package/dist/esm/v2/referentiel/ReferentielProvider.js.map +1 -1
- package/dist/esm/v2/referentiel/types.js +2 -0
- package/dist/esm/v2/referentiel/types.js.map +1 -0
- package/dist/esm/v2/referentiel/useReferentielClient.js +10 -11
- package/dist/esm/v2/referentiel/useReferentielClient.js.map +1 -1
- package/dist/esm/v2/referentiel/useReferentielOptions.js +60 -117
- package/dist/esm/v2/referentiel/useReferentielOptions.js.map +1 -1
- package/dist/esm/v2/referentiel/useReferentielSearch.js +37 -91
- package/dist/esm/v2/referentiel/useReferentielSearch.js.map +1 -1
- package/dist/esm/v2/theme/_brand.js +8 -24
- package/dist/esm/v2/theme/_brand.js.map +1 -1
- package/dist/esm/v2/theme/_brandSecondary.js +8 -24
- package/dist/esm/v2/theme/_brandSecondary.js.map +1 -1
- package/dist/esm/v2/theme/createPortnetTheme.js +51 -61
- package/dist/esm/v2/theme/createPortnetTheme.js.map +1 -1
- package/dist/esm/v2/theme/cssVariables.js +62 -69
- package/dist/esm/v2/theme/cssVariables.js.map +1 -1
- package/dist/esm/v2/theme/index.js +5 -5
- package/dist/esm/v2/theme/index.js.map +1 -1
- package/dist/esm/v2/tokens/breakpoints.js +14 -14
- package/dist/esm/v2/tokens/breakpoints.js.map +1 -1
- package/dist/esm/v2/tokens/chart.js +261 -0
- package/dist/esm/v2/tokens/chart.js.map +1 -0
- package/dist/esm/v2/tokens/colors.js +22 -22
- package/dist/esm/v2/tokens/colors.js.map +1 -1
- package/dist/esm/v2/tokens/density.js +62 -7
- package/dist/esm/v2/tokens/density.js.map +1 -1
- package/dist/esm/v2/tokens/index.js +49 -34
- package/dist/esm/v2/tokens/index.js.map +1 -1
- package/dist/esm/v2/tokens/motion.js +12 -20
- package/dist/esm/v2/tokens/motion.js.map +1 -1
- package/dist/esm/v2/tokens/radius.js +1 -1
- package/dist/esm/v2/tokens/radius.js.map +1 -1
- package/dist/esm/v2/tokens/shadows.js +6 -6
- package/dist/esm/v2/tokens/shadows.js.map +1 -1
- package/dist/esm/v2/tokens/spacing.js +2 -2
- package/dist/esm/v2/tokens/spacing.js.map +1 -1
- package/dist/esm/v2/tokens/state.js +1 -1
- package/dist/esm/v2/tokens/state.js.map +1 -1
- package/dist/esm/v2/tokens/statusPalette.js +17 -21
- package/dist/esm/v2/tokens/statusPalette.js.map +1 -1
- package/dist/esm/v2/tokens/tokens.json +6 -1
- package/dist/esm/v2/tokens/typography.js +13 -13
- package/dist/esm/v2/tokens/typography.js.map +1 -1
- package/dist/esm/v2/tokens/zIndex.js +1 -1
- package/dist/esm/v2/tokens/zIndex.js.map +1 -1
- package/dist/esm/v2/types/datagrid.js.map +1 -1
- package/dist/esm/v2/utils/apiError.js +16 -37
- package/dist/esm/v2/utils/apiError.js.map +1 -1
- package/dist/esm/v2/utils/contrast.js +31 -32
- package/dist/esm/v2/utils/contrast.js.map +1 -1
- package/dist/esm/v2/utils/cx.js +5 -25
- package/dist/esm/v2/utils/cx.js.map +1 -1
- package/dist/esm/v2/utils/fileDownload.js +23 -26
- package/dist/esm/v2/utils/fileDownload.js.map +1 -1
- package/dist/esm/v2/utils/fileValidation.js +209 -0
- package/dist/esm/v2/utils/fileValidation.js.map +1 -0
- package/dist/esm/v2/utils/fmtDate.js +111 -0
- package/dist/esm/v2/utils/fmtDate.js.map +1 -0
- package/dist/esm/v2/utils/fmtMoney.js +8 -10
- package/dist/esm/v2/utils/fmtMoney.js.map +1 -1
- package/dist/esm/v2/utils/formikErrors.js +78 -0
- package/dist/esm/v2/utils/formikErrors.js.map +1 -0
- package/dist/esm/v2/utils/index.js +35 -2
- package/dist/esm/v2/utils/index.js.map +1 -1
- package/dist/esm/v2/utils/mergeLabels.js +7 -12
- package/dist/esm/v2/utils/mergeLabels.js.map +1 -1
- package/dist/esm/v2/utils/networkStatus.js +12 -12
- package/dist/esm/v2/utils/networkStatus.js.map +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +110 -49
- package/dist/index.js.map +1 -1
- package/dist/v2/__tests__/AppMain.test.js +133 -0
- package/dist/v2/__tests__/AppMain.test.js.map +1 -0
- package/dist/v2/__tests__/ChartFigure.test.js +183 -0
- package/dist/v2/__tests__/ChartFigure.test.js.map +1 -0
- package/dist/v2/__tests__/DataGridRowActionsPropagation.test.js +153 -0
- package/dist/v2/__tests__/DataGridRowActionsPropagation.test.js.map +1 -0
- package/dist/v2/__tests__/DrawerTactileTargets.test.js +94 -0
- package/dist/v2/__tests__/DrawerTactileTargets.test.js.map +1 -0
- package/dist/v2/__tests__/FieldError.test.js +82 -49
- package/dist/v2/__tests__/FieldError.test.js.map +1 -1
- package/dist/v2/__tests__/FieldNaming.test.js +161 -0
- package/dist/v2/__tests__/FieldNaming.test.js.map +1 -0
- package/dist/v2/__tests__/FieldWidth.test.js +23 -25
- package/dist/v2/__tests__/FieldWidth.test.js.map +1 -1
- package/dist/v2/__tests__/FileCard.test.js +29 -28
- package/dist/v2/__tests__/FileCard.test.js.map +1 -1
- package/dist/v2/__tests__/FormikCheckbox.test.js +90 -183
- package/dist/v2/__tests__/FormikCheckbox.test.js.map +1 -1
- package/dist/v2/__tests__/FormikDateTimePicker.test.js +38 -48
- package/dist/v2/__tests__/FormikDateTimePicker.test.js.map +1 -1
- package/dist/v2/__tests__/FormikDisplayWidth.test.js +102 -0
- package/dist/v2/__tests__/FormikDisplayWidth.test.js.map +1 -0
- package/dist/v2/__tests__/FormikRadioGroup.test.js +123 -204
- package/dist/v2/__tests__/FormikRadioGroup.test.js.map +1 -1
- package/dist/v2/__tests__/MobileRowCard.test.js +63 -61
- package/dist/v2/__tests__/MobileRowCard.test.js.map +1 -1
- package/dist/v2/__tests__/PreviewDrawer.test.js +169 -0
- package/dist/v2/__tests__/PreviewDrawer.test.js.map +1 -0
- package/dist/v2/__tests__/ReferentielFieldContainer.test.js +159 -0
- package/dist/v2/__tests__/ReferentielFieldContainer.test.js.map +1 -0
- package/dist/v2/__tests__/SectionErrorBoundary.test.js +53 -68
- package/dist/v2/__tests__/SectionErrorBoundary.test.js.map +1 -1
- package/dist/v2/__tests__/apiError.test.js +50 -69
- package/dist/v2/__tests__/apiError.test.js.map +1 -1
- package/dist/v2/__tests__/banned-patterns.test.js +42 -123
- package/dist/v2/__tests__/banned-patterns.test.js.map +1 -1
- package/dist/v2/__tests__/chart-palette.test.js +205 -0
- package/dist/v2/__tests__/chart-palette.test.js.map +1 -0
- package/dist/v2/__tests__/contrast-palette.test.js +42 -74
- package/dist/v2/__tests__/contrast-palette.test.js.map +1 -1
- package/dist/v2/__tests__/cssVariables.test.js +44 -51
- package/dist/v2/__tests__/cssVariables.test.js.map +1 -1
- package/dist/v2/__tests__/fileValidation.test.js +136 -0
- package/dist/v2/__tests__/fileValidation.test.js.map +1 -0
- package/dist/v2/__tests__/filterCriteria.test.js +324 -0
- package/dist/v2/__tests__/filterCriteria.test.js.map +1 -0
- package/dist/v2/__tests__/fmtDate.test.js +69 -0
- package/dist/v2/__tests__/fmtDate.test.js.map +1 -0
- package/dist/v2/__tests__/gap-leakage-refonte.test.js +221 -0
- package/dist/v2/__tests__/gap-leakage-refonte.test.js.map +1 -0
- package/dist/v2/__tests__/labels-merge.test.js +23 -27
- package/dist/v2/__tests__/labels-merge.test.js.map +1 -1
- package/dist/v2/__tests__/locale-fallback.test.js +47 -52
- package/dist/v2/__tests__/locale-fallback.test.js.map +1 -1
- package/dist/v2/__tests__/reviveSavedCriteria.test.js +144 -0
- package/dist/v2/__tests__/reviveSavedCriteria.test.js.map +1 -0
- package/dist/v2/__tests__/rowActions.test.js +186 -0
- package/dist/v2/__tests__/rowActions.test.js.map +1 -0
- package/dist/v2/__tests__/useFocusOnRouteChange.test.js +156 -0
- package/dist/v2/__tests__/useFocusOnRouteChange.test.js.map +1 -0
- package/dist/v2/__tests__/useFocusTrap.test.js +270 -407
- package/dist/v2/__tests__/useFocusTrap.test.js.map +1 -1
- package/dist/v2/__tests__/usePrefersReducedMotion.test.js +123 -0
- package/dist/v2/__tests__/usePrefersReducedMotion.test.js.map +1 -0
- package/dist/v2/components/Accordion.js +60 -82
- package/dist/v2/components/Accordion.js.map +1 -1
- package/dist/v2/components/ActionStrip.js +40 -52
- package/dist/v2/components/ActionStrip.js.map +1 -1
- package/dist/v2/components/Banner.js +42 -41
- package/dist/v2/components/Banner.js.map +1 -1
- package/dist/v2/components/Busy.js +22 -27
- package/dist/v2/components/Busy.js.map +1 -1
- package/dist/v2/components/Button.js +39 -50
- package/dist/v2/components/Button.js.map +1 -1
- package/dist/v2/components/CategoryTag.d.ts.map +1 -1
- package/dist/v2/components/CategoryTag.js +49 -32
- package/dist/v2/components/CategoryTag.js.map +1 -1
- package/dist/v2/components/Checkbox.js +39 -45
- package/dist/v2/components/Checkbox.js.map +1 -1
- package/dist/v2/components/Chip.js +29 -42
- package/dist/v2/components/Chip.js.map +1 -1
- package/dist/v2/components/Combobox.js +122 -144
- package/dist/v2/components/Combobox.js.map +1 -1
- package/dist/v2/components/CommandPalette.js +138 -225
- package/dist/v2/components/CommandPalette.js.map +1 -1
- package/dist/v2/components/ConfirmDialog.js +46 -56
- package/dist/v2/components/ConfirmDialog.js.map +1 -1
- package/dist/v2/components/DatePicker.js +81 -86
- package/dist/v2/components/DatePicker.js.map +1 -1
- package/dist/v2/components/DateRangePicker.js +77 -87
- package/dist/v2/components/DateRangePicker.js.map +1 -1
- package/dist/v2/components/DateTimePicker.js +84 -91
- package/dist/v2/components/DateTimePicker.js.map +1 -1
- package/dist/v2/components/Drawer.d.ts.map +1 -1
- package/dist/v2/components/Drawer.js +93 -88
- package/dist/v2/components/Drawer.js.map +1 -1
- package/dist/v2/components/Dropzone.js +150 -196
- package/dist/v2/components/Dropzone.js.map +1 -1
- package/dist/v2/components/EmptyState.js +18 -20
- package/dist/v2/components/EmptyState.js.map +1 -1
- package/dist/v2/components/FavoriteToggle.js +28 -39
- package/dist/v2/components/FavoriteToggle.js.map +1 -1
- package/dist/v2/components/Field.d.ts +62 -4
- package/dist/v2/components/Field.d.ts.map +1 -1
- package/dist/v2/components/Field.js +169 -70
- package/dist/v2/components/Field.js.map +1 -1
- package/dist/v2/components/FieldError.js +18 -21
- package/dist/v2/components/FieldError.js.map +1 -1
- package/dist/v2/components/FieldHelp.js +40 -60
- package/dist/v2/components/FieldHelp.js.map +1 -1
- package/dist/v2/components/FileCard.js +27 -31
- package/dist/v2/components/FileCard.js.map +1 -1
- package/dist/v2/components/FilterTab.js +30 -38
- package/dist/v2/components/FilterTab.js.map +1 -1
- package/dist/v2/components/ForbiddenPage.d.ts +25 -1
- package/dist/v2/components/ForbiddenPage.d.ts.map +1 -1
- package/dist/v2/components/ForbiddenPage.js +37 -17
- package/dist/v2/components/ForbiddenPage.js.map +1 -1
- package/dist/v2/components/FormGrid.js +53 -59
- package/dist/v2/components/FormGrid.js.map +1 -1
- package/dist/v2/components/FormikDisplay.d.ts +50 -1
- package/dist/v2/components/FormikDisplay.d.ts.map +1 -1
- package/dist/v2/components/FormikDisplay.js +108 -33
- package/dist/v2/components/FormikDisplay.js.map +1 -1
- package/dist/v2/components/Input.d.ts +40 -0
- package/dist/v2/components/Input.d.ts.map +1 -1
- package/dist/v2/components/Input.js +81 -41
- package/dist/v2/components/Input.js.map +1 -1
- package/dist/v2/components/KPICard.js +57 -67
- package/dist/v2/components/KPICard.js.map +1 -1
- package/dist/v2/components/KPIStrip.js +16 -22
- package/dist/v2/components/KPIStrip.js.map +1 -1
- package/dist/v2/components/KV.js +25 -31
- package/dist/v2/components/KV.js.map +1 -1
- package/dist/v2/components/KVGrid.js +19 -26
- package/dist/v2/components/KVGrid.js.map +1 -1
- package/dist/v2/components/Layout.js +91 -120
- package/dist/v2/components/Layout.js.map +1 -1
- package/dist/v2/components/MobileRowCard.js +79 -91
- package/dist/v2/components/MobileRowCard.js.map +1 -1
- package/dist/v2/components/Modal.js +61 -69
- package/dist/v2/components/Modal.js.map +1 -1
- package/dist/v2/components/NetworkErrorPage.d.ts +19 -1
- package/dist/v2/components/NetworkErrorPage.d.ts.map +1 -1
- package/dist/v2/components/NetworkErrorPage.js +38 -21
- package/dist/v2/components/NetworkErrorPage.js.map +1 -1
- package/dist/v2/components/NotFoundPage.d.ts +17 -1
- package/dist/v2/components/NotFoundPage.d.ts.map +1 -1
- package/dist/v2/components/NotFoundPage.js +37 -18
- package/dist/v2/components/NotFoundPage.js.map +1 -1
- package/dist/v2/components/NumberInput.js +88 -118
- package/dist/v2/components/NumberInput.js.map +1 -1
- package/dist/v2/components/OverflowMenu.js +38 -56
- package/dist/v2/components/OverflowMenu.js.map +1 -1
- package/dist/v2/components/PdfViewer.js +34 -45
- package/dist/v2/components/PdfViewer.js.map +1 -1
- package/dist/v2/components/ProgressBar.js +42 -49
- package/dist/v2/components/ProgressBar.js.map +1 -1
- package/dist/v2/components/Radio.js +59 -67
- package/dist/v2/components/Radio.js.map +1 -1
- package/dist/v2/components/SectionErrorBoundary.js +90 -135
- package/dist/v2/components/SectionErrorBoundary.js.map +1 -1
- package/dist/v2/components/SectionHeader.js +34 -41
- package/dist/v2/components/SectionHeader.js.map +1 -1
- package/dist/v2/components/Segmented.js +69 -93
- package/dist/v2/components/Segmented.js.map +1 -1
- package/dist/v2/components/Select.d.ts +26 -2
- package/dist/v2/components/Select.d.ts.map +1 -1
- package/dist/v2/components/Select.js +120 -155
- package/dist/v2/components/Select.js.map +1 -1
- package/dist/v2/components/ServerErrorPage.d.ts +27 -1
- package/dist/v2/components/ServerErrorPage.d.ts.map +1 -1
- package/dist/v2/components/ServerErrorPage.js +37 -20
- package/dist/v2/components/ServerErrorPage.js.map +1 -1
- package/dist/v2/components/Skeleton.js +86 -100
- package/dist/v2/components/Skeleton.js.map +1 -1
- package/dist/v2/components/SkipLink.js +9 -12
- package/dist/v2/components/SkipLink.js.map +1 -1
- package/dist/v2/components/Spinner.js +16 -25
- package/dist/v2/components/Spinner.js.map +1 -1
- package/dist/v2/components/Status.js +18 -29
- package/dist/v2/components/Status.js.map +1 -1
- package/dist/v2/components/Stepper.js +80 -82
- package/dist/v2/components/Stepper.js.map +1 -1
- package/dist/v2/components/Surface.js +34 -49
- package/dist/v2/components/Surface.js.map +1 -1
- package/dist/v2/components/Switch.js +29 -37
- package/dist/v2/components/Switch.js.map +1 -1
- package/dist/v2/components/TabPanel.d.ts +17 -0
- package/dist/v2/components/TabPanel.d.ts.map +1 -0
- package/dist/v2/components/TabPanel.js +90 -0
- package/dist/v2/components/TabPanel.js.map +1 -0
- package/dist/v2/components/Tabs.d.ts +25 -0
- package/dist/v2/components/Tabs.d.ts.map +1 -1
- package/dist/v2/components/Tabs.js +53 -29
- package/dist/v2/components/Tabs.js.map +1 -1
- package/dist/v2/components/TelInput.js +80 -115
- package/dist/v2/components/TelInput.js.map +1 -1
- package/dist/v2/components/Textarea.js +26 -35
- package/dist/v2/components/Textarea.js.map +1 -1
- package/dist/v2/components/TimePicker.js +62 -74
- package/dist/v2/components/TimePicker.js.map +1 -1
- package/dist/v2/components/Toast.js +119 -174
- package/dist/v2/components/Toast.js.map +1 -1
- package/dist/v2/components/Tooltip.js +23 -38
- package/dist/v2/components/Tooltip.js.map +1 -1
- package/dist/v2/components/_ErrorPageBody.js +15 -16
- package/dist/v2/components/_ErrorPageBody.js.map +1 -1
- package/dist/v2/components/_pickerShared.js +5 -5
- package/dist/v2/components/_pickerShared.js.map +1 -1
- package/dist/v2/components/index.d.ts +40 -1
- package/dist/v2/components/index.d.ts.map +1 -1
- package/dist/v2/components/index.js +153 -136
- package/dist/v2/components/index.js.map +1 -1
- package/dist/v2/hooks/index.d.ts +65 -0
- package/dist/v2/hooks/index.d.ts.map +1 -1
- package/dist/v2/hooks/index.js +63 -24
- package/dist/v2/hooks/index.js.map +1 -1
- package/dist/v2/hooks/useAppliedFilters.d.ts +102 -0
- package/dist/v2/hooks/useAppliedFilters.d.ts.map +1 -0
- package/dist/v2/hooks/useAppliedFilters.js +117 -0
- package/dist/v2/hooks/useAppliedFilters.js.map +1 -0
- package/dist/v2/hooks/useDebouncedCallback.d.ts +64 -0
- package/dist/v2/hooks/useDebouncedCallback.d.ts.map +1 -0
- package/dist/v2/hooks/useDebouncedCallback.js +87 -0
- package/dist/v2/hooks/useDebouncedCallback.js.map +1 -0
- package/dist/v2/hooks/useDelayedFlag.js +6 -20
- package/dist/v2/hooks/useDelayedFlag.js.map +1 -1
- package/dist/v2/hooks/useDensity.d.ts.map +1 -1
- package/dist/v2/hooks/useDensity.js +14 -18
- package/dist/v2/hooks/useDensity.js.map +1 -1
- package/dist/v2/hooks/useFocusFirstError.js +26 -34
- package/dist/v2/hooks/useFocusFirstError.js.map +1 -1
- package/dist/v2/hooks/useFocusOnRouteChange.d.ts +65 -0
- package/dist/v2/hooks/useFocusOnRouteChange.d.ts.map +1 -0
- package/dist/v2/hooks/useFocusOnRouteChange.js +88 -0
- package/dist/v2/hooks/useFocusOnRouteChange.js.map +1 -0
- package/dist/v2/hooks/useFocusTrap.js +20 -24
- package/dist/v2/hooks/useFocusTrap.js.map +1 -1
- package/dist/v2/hooks/useFormAutoSave.d.ts +4 -4
- package/dist/v2/hooks/useFormAutoSave.d.ts.map +1 -1
- package/dist/v2/hooks/useFormAutoSave.js +39 -54
- package/dist/v2/hooks/useFormAutoSave.js.map +1 -1
- package/dist/v2/hooks/useFormCompletionProgress.d.ts +1 -1
- package/dist/v2/hooks/useFormCompletionProgress.d.ts.map +1 -1
- package/dist/v2/hooks/useFormCompletionProgress.js +33 -52
- package/dist/v2/hooks/useFormCompletionProgress.js.map +1 -1
- package/dist/v2/hooks/useKeyboardShortcuts.d.ts +25 -0
- package/dist/v2/hooks/useKeyboardShortcuts.d.ts.map +1 -0
- package/dist/v2/hooks/useKeyboardShortcuts.js +132 -0
- package/dist/v2/hooks/useKeyboardShortcuts.js.map +1 -0
- package/dist/v2/hooks/usePrefersReducedMotion.d.ts +56 -0
- package/dist/v2/hooks/usePrefersReducedMotion.d.ts.map +1 -0
- package/dist/v2/hooks/usePrefersReducedMotion.js +105 -0
- package/dist/v2/hooks/usePrefersReducedMotion.js.map +1 -0
- package/dist/v2/hooks/useResolvedDensity.js +5 -13
- package/dist/v2/hooks/useResolvedDensity.js.map +1 -1
- package/dist/v2/hooks/useSortedRows.js +4 -6
- package/dist/v2/hooks/useSortedRows.js.map +1 -1
- package/dist/v2/hooks/useTabLoading.js +7 -22
- package/dist/v2/hooks/useTabLoading.js.map +1 -1
- package/dist/v2/index.js +143 -145
- package/dist/v2/index.js.map +1 -1
- package/dist/v2/modalContext.js +2 -2
- package/dist/v2/modalContext.js.map +1 -1
- package/dist/v2/models/favorite.d.ts +8 -9
- package/dist/v2/models/favorite.d.ts.map +1 -1
- package/dist/v2/models/favorite.js.map +1 -1
- package/dist/v2/models/index.js +4 -4
- package/dist/v2/models/index.js.map +1 -1
- package/dist/v2/models/personalization.d.ts +44 -48
- package/dist/v2/models/personalization.d.ts.map +1 -1
- package/dist/v2/models/personalization.js.map +1 -1
- package/dist/v2/models/referentiel.d.ts +32 -50
- package/dist/v2/models/referentiel.d.ts.map +1 -1
- package/dist/v2/models/referentiel.js.map +1 -1
- package/dist/v2/models/savedFilter.d.ts +8 -17
- package/dist/v2/models/savedFilter.d.ts.map +1 -1
- package/dist/v2/models/savedFilter.js.map +1 -1
- package/dist/v2/patterns/ActionBar.js +152 -187
- package/dist/v2/patterns/ActionBar.js.map +1 -1
- package/dist/v2/patterns/AppMain.d.ts +109 -0
- package/dist/v2/patterns/AppMain.d.ts.map +1 -0
- package/dist/v2/patterns/AppMain.js +115 -0
- package/dist/v2/patterns/AppMain.js.map +1 -0
- package/dist/v2/patterns/BulkActionBar.js +40 -42
- package/dist/v2/patterns/BulkActionBar.js.map +1 -1
- package/dist/v2/patterns/ChartFigure.d.ts +124 -0
- package/dist/v2/patterns/ChartFigure.d.ts.map +1 -0
- package/dist/v2/patterns/ChartFigure.js +159 -0
- package/dist/v2/patterns/ChartFigure.js.map +1 -0
- package/dist/v2/patterns/CollapsibleDataGrid.js +138 -174
- package/dist/v2/patterns/CollapsibleDataGrid.js.map +1 -1
- package/dist/v2/patterns/ColumnsToggle.js +60 -94
- package/dist/v2/patterns/ColumnsToggle.js.map +1 -1
- package/dist/v2/patterns/DataGrid.d.ts.map +1 -1
- package/dist/v2/patterns/DataGrid.js +262 -297
- package/dist/v2/patterns/DataGrid.js.map +1 -1
- package/dist/v2/patterns/DataGridSettingsMenu.d.ts +12 -0
- package/dist/v2/patterns/DataGridSettingsMenu.d.ts.map +1 -1
- package/dist/v2/patterns/DataGridSettingsMenu.js +104 -121
- package/dist/v2/patterns/DataGridSettingsMenu.js.map +1 -1
- package/dist/v2/patterns/DataGridToolbar.js +103 -106
- package/dist/v2/patterns/DataGridToolbar.js.map +1 -1
- package/dist/v2/patterns/DataGridVirtualized.js +179 -217
- package/dist/v2/patterns/DataGridVirtualized.js.map +1 -1
- package/dist/v2/patterns/DeleteResourceConfirmDialog.js +32 -35
- package/dist/v2/patterns/DeleteResourceConfirmDialog.js.map +1 -1
- package/dist/v2/patterns/DetailSplit.d.ts +87 -0
- package/dist/v2/patterns/DetailSplit.d.ts.map +1 -0
- package/dist/v2/patterns/DetailSplit.js +116 -0
- package/dist/v2/patterns/DetailSplit.js.map +1 -0
- package/dist/v2/patterns/FavoriteColumn.js +22 -23
- package/dist/v2/patterns/FavoriteColumn.js.map +1 -1
- package/dist/v2/patterns/FavoritesFilter.js +36 -44
- package/dist/v2/patterns/FavoritesFilter.js.map +1 -1
- package/dist/v2/patterns/FilterTabBar.d.ts +28 -0
- package/dist/v2/patterns/FilterTabBar.d.ts.map +1 -0
- package/dist/v2/patterns/FilterTabBar.js +120 -0
- package/dist/v2/patterns/FilterTabBar.js.map +1 -0
- package/dist/v2/patterns/FormErrorSummary.js +20 -23
- package/dist/v2/patterns/FormErrorSummary.js.map +1 -1
- package/dist/v2/patterns/FormPageShell.js +53 -50
- package/dist/v2/patterns/FormPageShell.js.map +1 -1
- package/dist/v2/patterns/FormSection.d.ts +8 -3
- package/dist/v2/patterns/FormSection.d.ts.map +1 -1
- package/dist/v2/patterns/FormSection.js +44 -51
- package/dist/v2/patterns/FormSection.js.map +1 -1
- package/dist/v2/patterns/FormikCheckbox.js +36 -45
- package/dist/v2/patterns/FormikCheckbox.js.map +1 -1
- package/dist/v2/patterns/FormikCheckboxGroup.d.ts +17 -1
- package/dist/v2/patterns/FormikCheckboxGroup.d.ts.map +1 -1
- package/dist/v2/patterns/FormikCheckboxGroup.js +62 -65
- package/dist/v2/patterns/FormikCheckboxGroup.js.map +1 -1
- package/dist/v2/patterns/FormikCombobox.js +55 -72
- package/dist/v2/patterns/FormikCombobox.js.map +1 -1
- package/dist/v2/patterns/FormikDatePicker.js +50 -64
- package/dist/v2/patterns/FormikDatePicker.js.map +1 -1
- package/dist/v2/patterns/FormikDateTimePicker.js +50 -64
- package/dist/v2/patterns/FormikDateTimePicker.js.map +1 -1
- package/dist/v2/patterns/FormikErrorFocus.js +25 -26
- package/dist/v2/patterns/FormikErrorFocus.js.map +1 -1
- package/dist/v2/patterns/FormikErrorSummary.d.ts +74 -0
- package/dist/v2/patterns/FormikErrorSummary.d.ts.map +1 -0
- package/dist/v2/patterns/FormikErrorSummary.js +97 -0
- package/dist/v2/patterns/FormikErrorSummary.js.map +1 -0
- package/dist/v2/patterns/FormikFile.d.ts +14 -1
- package/dist/v2/patterns/FormikFile.d.ts.map +1 -1
- package/dist/v2/patterns/FormikFile.js +99 -83
- package/dist/v2/patterns/FormikFile.js.map +1 -1
- package/dist/v2/patterns/FormikInput.js +45 -58
- package/dist/v2/patterns/FormikInput.js.map +1 -1
- package/dist/v2/patterns/FormikRadioGroup.js +45 -56
- package/dist/v2/patterns/FormikRadioGroup.js.map +1 -1
- package/dist/v2/patterns/FormikReferentielField.d.ts +12 -1
- package/dist/v2/patterns/FormikReferentielField.d.ts.map +1 -1
- package/dist/v2/patterns/FormikReferentielField.js +54 -64
- package/dist/v2/patterns/FormikReferentielField.js.map +1 -1
- package/dist/v2/patterns/FormikSelect.js +70 -92
- package/dist/v2/patterns/FormikSelect.js.map +1 -1
- package/dist/v2/patterns/FormikTextarea.js +35 -51
- package/dist/v2/patterns/FormikTextarea.js.map +1 -1
- package/dist/v2/patterns/KeyboardShortcutsHelp.js +60 -80
- package/dist/v2/patterns/KeyboardShortcutsHelp.js.map +1 -1
- package/dist/v2/patterns/NetworkErrorBanner.js +13 -16
- package/dist/v2/patterns/NetworkErrorBanner.js.map +1 -1
- package/dist/v2/patterns/PageContent.js +17 -20
- package/dist/v2/patterns/PageContent.js.map +1 -1
- package/dist/v2/patterns/PreviewDrawer.d.ts +49 -0
- package/dist/v2/patterns/PreviewDrawer.d.ts.map +1 -0
- package/dist/v2/patterns/PreviewDrawer.js +159 -0
- package/dist/v2/patterns/PreviewDrawer.js.map +1 -0
- package/dist/v2/patterns/ReferentielField.d.ts +86 -2
- package/dist/v2/patterns/ReferentielField.d.ts.map +1 -1
- package/dist/v2/patterns/ReferentielField.js +347 -327
- package/dist/v2/patterns/ReferentielField.js.map +1 -1
- package/dist/v2/patterns/RowFavoriteToggle.d.ts +6 -0
- package/dist/v2/patterns/RowFavoriteToggle.d.ts.map +1 -1
- package/dist/v2/patterns/RowFavoriteToggle.js +38 -30
- package/dist/v2/patterns/RowFavoriteToggle.js.map +1 -1
- package/dist/v2/patterns/SaveFilterDialog.js +50 -77
- package/dist/v2/patterns/SaveFilterDialog.js.map +1 -1
- package/dist/v2/patterns/SavedFiltersMenu.js +89 -107
- package/dist/v2/patterns/SavedFiltersMenu.js.map +1 -1
- package/dist/v2/patterns/SkeletonPageShell.js +122 -143
- package/dist/v2/patterns/SkeletonPageShell.js.map +1 -1
- package/dist/v2/patterns/SortableHeader.js +35 -57
- package/dist/v2/patterns/SortableHeader.js.map +1 -1
- package/dist/v2/patterns/Tour.js +121 -142
- package/dist/v2/patterns/Tour.js.map +1 -1
- package/dist/v2/patterns/_dataGridShared.d.ts.map +1 -1
- package/dist/v2/patterns/_dataGridShared.js +131 -147
- package/dist/v2/patterns/_dataGridShared.js.map +1 -1
- package/dist/v2/patterns/_pickerSerialisation.js +9 -10
- package/dist/v2/patterns/_pickerSerialisation.js.map +1 -1
- package/dist/v2/patterns/_sort.js +17 -33
- package/dist/v2/patterns/_sort.js.map +1 -1
- package/dist/v2/patterns/_useColumnReorder.js +124 -163
- package/dist/v2/patterns/_useColumnReorder.js.map +1 -1
- package/dist/v2/patterns/_useColumnResize.js +80 -99
- package/dist/v2/patterns/_useColumnResize.js.map +1 -1
- package/dist/v2/patterns/filterCriteria.d.ts +78 -0
- package/dist/v2/patterns/filterCriteria.d.ts.map +1 -0
- package/dist/v2/patterns/filterCriteria.js +110 -0
- package/dist/v2/patterns/filterCriteria.js.map +1 -0
- package/dist/v2/patterns/index.d.ts +160 -0
- package/dist/v2/patterns/index.d.ts.map +1 -1
- package/dist/v2/patterns/index.js +157 -79
- package/dist/v2/patterns/index.js.map +1 -1
- package/dist/v2/patterns/rowActions.d.ts +150 -0
- package/dist/v2/patterns/rowActions.d.ts.map +1 -0
- package/dist/v2/patterns/rowActions.js +232 -0
- package/dist/v2/patterns/rowActions.js.map +1 -0
- package/dist/v2/personalization/PersonalizationProvider.d.ts.map +1 -1
- package/dist/v2/personalization/PersonalizationProvider.js +57 -53
- package/dist/v2/personalization/PersonalizationProvider.js.map +1 -1
- package/dist/v2/personalization/adapters/_storageKey.js +5 -5
- package/dist/v2/personalization/adapters/_storageKey.js.map +1 -1
- package/dist/v2/personalization/adapters/createLocalStorageAdapter.js +25 -24
- package/dist/v2/personalization/adapters/createLocalStorageAdapter.js.map +1 -1
- package/dist/v2/personalization/adapters/createMemoryAdapter.js +14 -14
- package/dist/v2/personalization/adapters/createMemoryAdapter.js.map +1 -1
- package/dist/v2/personalization/adapters/index.js +5 -5
- package/dist/v2/personalization/adapters/index.js.map +1 -1
- package/dist/v2/personalization/capabilities/favorites.js +39 -62
- package/dist/v2/personalization/capabilities/favorites.js.map +1 -1
- package/dist/v2/personalization/capabilities/favoritesView.js +25 -37
- package/dist/v2/personalization/capabilities/favoritesView.js.map +1 -1
- package/dist/v2/personalization/capabilities/gridPreferences.js +31 -36
- package/dist/v2/personalization/capabilities/gridPreferences.js.map +1 -1
- package/dist/v2/personalization/capabilities/index.js +12 -12
- package/dist/v2/personalization/capabilities/reviveSavedCriteria.d.ts +88 -0
- package/dist/v2/personalization/capabilities/reviveSavedCriteria.d.ts.map +1 -0
- package/dist/v2/personalization/capabilities/reviveSavedCriteria.js +126 -0
- package/dist/v2/personalization/capabilities/reviveSavedCriteria.js.map +1 -0
- package/dist/v2/personalization/capabilities/savedFilters.js +93 -100
- package/dist/v2/personalization/capabilities/savedFilters.js.map +1 -1
- package/dist/v2/personalization/createPersonalizationStore.d.ts.map +1 -1
- package/dist/v2/personalization/createPersonalizationStore.js +81 -182
- package/dist/v2/personalization/createPersonalizationStore.js.map +1 -1
- package/dist/v2/personalization/index.d.ts +16 -0
- package/dist/v2/personalization/index.d.ts.map +1 -1
- package/dist/v2/personalization/index.js +30 -23
- package/dist/v2/personalization/index.js.map +1 -1
- package/dist/v2/personalization/personalizationContext.js +10 -12
- package/dist/v2/personalization/personalizationContext.js.map +1 -1
- package/dist/v2/personalization/schema.js +8 -9
- package/dist/v2/personalization/schema.js.map +1 -1
- package/dist/v2/referentiel/ReferentielProvider.js +31 -45
- package/dist/v2/referentiel/ReferentielProvider.js.map +1 -1
- package/dist/v2/referentiel/index.js +11 -13
- package/dist/v2/referentiel/index.js.map +1 -1
- package/dist/v2/referentiel/types.d.ts +105 -0
- package/dist/v2/referentiel/types.d.ts.map +1 -0
- package/dist/v2/referentiel/types.js +6 -0
- package/dist/v2/referentiel/types.js.map +1 -0
- package/dist/v2/referentiel/useReferentielClient.js +13 -16
- package/dist/v2/referentiel/useReferentielClient.js.map +1 -1
- package/dist/v2/referentiel/useReferentielOptions.d.ts +7 -17
- package/dist/v2/referentiel/useReferentielOptions.d.ts.map +1 -1
- package/dist/v2/referentiel/useReferentielOptions.js +63 -120
- package/dist/v2/referentiel/useReferentielOptions.js.map +1 -1
- package/dist/v2/referentiel/useReferentielSearch.d.ts +7 -48
- package/dist/v2/referentiel/useReferentielSearch.d.ts.map +1 -1
- package/dist/v2/referentiel/useReferentielSearch.js +40 -95
- package/dist/v2/referentiel/useReferentielSearch.js.map +1 -1
- package/dist/v2/theme/_brand.js +12 -26
- package/dist/v2/theme/_brand.js.map +1 -1
- package/dist/v2/theme/_brandSecondary.js +12 -26
- package/dist/v2/theme/_brandSecondary.js.map +1 -1
- package/dist/v2/theme/createPortnetTheme.js +41 -49
- package/dist/v2/theme/createPortnetTheme.js.map +1 -1
- package/dist/v2/theme/cssVariables.d.ts +3 -3
- package/dist/v2/theme/cssVariables.d.ts.map +1 -1
- package/dist/v2/theme/cssVariables.js +65 -70
- package/dist/v2/theme/cssVariables.js.map +1 -1
- package/dist/v2/theme/index.js +10 -10
- package/dist/v2/theme/index.js.map +1 -1
- package/dist/v2/tokens/breakpoints.js +16 -16
- package/dist/v2/tokens/breakpoints.js.map +1 -1
- package/dist/v2/tokens/chart.d.ts +103 -0
- package/dist/v2/tokens/chart.d.ts.map +1 -0
- package/dist/v2/tokens/chart.js +270 -0
- package/dist/v2/tokens/chart.js.map +1 -0
- package/dist/v2/tokens/colors.js +24 -24
- package/dist/v2/tokens/colors.js.map +1 -1
- package/dist/v2/tokens/density.d.ts +104 -0
- package/dist/v2/tokens/density.d.ts.map +1 -1
- package/dist/v2/tokens/density.js +67 -12
- package/dist/v2/tokens/density.js.map +1 -1
- package/dist/v2/tokens/index.d.ts +50 -1
- package/dist/v2/tokens/index.d.ts.map +1 -1
- package/dist/v2/tokens/index.js +116 -68
- package/dist/v2/tokens/index.js.map +1 -1
- package/dist/v2/tokens/motion.js +16 -22
- package/dist/v2/tokens/motion.js.map +1 -1
- package/dist/v2/tokens/radius.js +3 -3
- package/dist/v2/tokens/radius.js.map +1 -1
- package/dist/v2/tokens/shadows.js +8 -8
- package/dist/v2/tokens/shadows.js.map +1 -1
- package/dist/v2/tokens/spacing.js +4 -4
- package/dist/v2/tokens/spacing.js.map +1 -1
- package/dist/v2/tokens/state.js +3 -3
- package/dist/v2/tokens/state.js.map +1 -1
- package/dist/v2/tokens/statusPalette.js +21 -23
- package/dist/v2/tokens/statusPalette.js.map +1 -1
- package/dist/v2/tokens/tokens.json +6 -1
- package/dist/v2/tokens/typography.js +15 -15
- package/dist/v2/tokens/typography.js.map +1 -1
- package/dist/v2/tokens/zIndex.js +3 -3
- package/dist/v2/tokens/zIndex.js.map +1 -1
- package/dist/v2/types/datagrid.d.ts +9 -1
- package/dist/v2/types/datagrid.d.ts.map +1 -1
- package/dist/v2/types/datagrid.js.map +1 -1
- package/dist/v2/types/index.js +2 -2
- package/dist/v2/types/index.js.map +1 -1
- package/dist/v2/utils/apiError.js +16 -37
- package/dist/v2/utils/apiError.js.map +1 -1
- package/dist/v2/utils/contrast.js +31 -32
- package/dist/v2/utils/contrast.js.map +1 -1
- package/dist/v2/utils/cx.js +7 -27
- package/dist/v2/utils/cx.js.map +1 -1
- package/dist/v2/utils/fileDownload.js +25 -28
- package/dist/v2/utils/fileDownload.js.map +1 -1
- package/dist/v2/utils/fileValidation.d.ts +116 -0
- package/dist/v2/utils/fileValidation.d.ts.map +1 -0
- package/dist/v2/utils/fileValidation.js +220 -0
- package/dist/v2/utils/fileValidation.js.map +1 -0
- package/dist/v2/utils/fmtDate.d.ts +103 -0
- package/dist/v2/utils/fmtDate.d.ts.map +1 -0
- package/dist/v2/utils/fmtDate.js +119 -0
- package/dist/v2/utils/fmtDate.js.map +1 -0
- package/dist/v2/utils/fmtMoney.d.ts +3 -3
- package/dist/v2/utils/fmtMoney.d.ts.map +1 -1
- package/dist/v2/utils/fmtMoney.js +9 -11
- package/dist/v2/utils/fmtMoney.js.map +1 -1
- package/dist/v2/utils/formikErrors.d.ts +67 -0
- package/dist/v2/utils/formikErrors.d.ts.map +1 -0
- package/dist/v2/utils/formikErrors.js +85 -0
- package/dist/v2/utils/formikErrors.js.map +1 -0
- package/dist/v2/utils/index.d.ts +5 -0
- package/dist/v2/utils/index.d.ts.map +1 -1
- package/dist/v2/utils/index.js +67 -18
- package/dist/v2/utils/index.js.map +1 -1
- package/dist/v2/utils/mergeLabels.js +9 -14
- package/dist/v2/utils/mergeLabels.js.map +1 -1
- package/dist/v2/utils/networkStatus.js +14 -14
- package/dist/v2/utils/networkStatus.js.map +1 -1
- package/package.json +26 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dropzone.js","names":["React","mergeLabels","Box","IconButton","CloudUploadIcon","CloseIcon","InsertDriveFileIcon","jsx","_jsx","jsxs","_jsxs","defaultFormatBytes","n","Number","isFinite","concat","Math","round","toFixed","DEFAULT_REASONS","Object","freeze","defaultBuildRejectMessage","rejected","reasons","total","length","noun","head","tally","_iterator","_createForOfIteratorHelper","_step","s","done","r","value","label","reason","err","e","f","buckets","entries","only","parts","map","_ref","_ref2","_slicedToArray","join","DEFAULT_LABELS","ariaLabel","formatBytes","buildRejectMessage","addedSingle","name","addedMultiple","removeItem","matchesAccept","file","accept","tokens","split","t","trim","filter","Boolean","some","startsWith","toLowerCase","endsWith","prefix","slice","type","Dropzone","_ref3","maxSize","maxFiles","_ref3$multiple","multiple","_ref3$disabled","disabled","_ref3$value","onAdd","onRemove","onReject","ariaLabelProp","hint","labels","sx","id","_ref3$error","error","ariaInvalidProp","ariaDescribedByProp","L","useMemo","_objectSpread","dropLabel","inputRef","useRef","liveRef","_React$useState","useState","_React$useState2","dragOver","setDragOver","hintId","useId","isInvalid","describedBy","undefined","announce","msg","current","textContent","validate","useCallback","incoming","accepted","remainingSlots","max","Infinity","_iterator2","_step2","push","size","handleFiles","fileList","files","Array","from","_validate","_accepted","first","onInputChange","target","openPicker","_inputRef$current","click","onDragOver","preventDefault","stopPropagation","onDragLeave","currentTarget","contains","relatedTarget","onDrop","_e$dataTransfer","dataTransfer","borderColor","width","children","component","onClick","onDragEnter","font","color","display","flexDirection","alignItems","justifyContent","gap","padding","background","border","borderRadius","cursor","opacity","textAlign","transition","outline","outlineOffset","style","fontSize","fontWeight","ref","onChange","tabIndex","position","height","margin","overflow","clipPath","role","className","listStyle","i","_ref4","_f$id","_f$size","status","progress","flex","minWidth","textOverflow","whiteSpace","fontVariantNumeric","NaN"],"sources":["../../../../src/lib/v2/components/Dropzone.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport { mergeLabels } from \"../utils/mergeLabels\";\r\nimport Box from \"@mui/material/Box\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport CloudUploadIcon from \"@mui/icons-material/CloudUpload\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport InsertDriveFileIcon from \"@mui/icons-material/InsertDriveFileOutlined\";\r\nimport type { SxProps, Theme } from \"@mui/material/styles\";\r\n\r\n/**\r\n * Dropzone - Portnet UI v2\r\n *\r\n * Charter §03 · Component \"Dropzone / FileUpload\". Drop area + click/keyboard\r\n * to open the OS file picker. Stateless wrt upload progress - the caller owns\r\n * the upload state and feeds it back via `value`.\r\n *\r\n * <Dropzone\r\n * accept=\"application/pdf,image/png,image/jpeg\"\r\n * maxSize={5 * 1024 * 1024}\r\n * multiple\r\n * value={files} // [{ id, name, size, progress, status, error }]\r\n * onAdd={handleNewFiles}\r\n * onRemove={(id) => removeFile(id)}\r\n * onReject={(rejections) => showErrors(rejections)}\r\n * hint=\"Formats acceptés : PDF, PNG, JPG. Max 5 Mo par fichier.\"\r\n * />\r\n *\r\n * Localisation (FR / EN / AR):\r\n * <Dropzone labels={{\r\n * label: \"Drag files here or click to browse\",\r\n * ariaLabel: \"File drop zone\",\r\n * formatBytes: (n) => `${(n / 1024 / 1024).toFixed(1)} MB`,\r\n * reasons: {\r\n * \"max-size\": \"too large\",\r\n * \"type\": \"wrong type\",\r\n * \"max-files\": \"limit reached\",\r\n * },\r\n * buildRejectMessage: (rejected) => `${rejected.length} file(s) rejected`,\r\n * addedSingle: (name) => `Added: ${name}`,\r\n * addedMultiple: (n) => `${n} files added`,\r\n * removeItem: (name) => `Remove ${name}`,\r\n * }} />\r\n *\r\n * ── INSIDE A <Field> (R-I.1, R-I.3) ──────────────────────────────────\r\n *\r\n * Wrap it to get a visible label, required marker and error message:\r\n *\r\n * <Field label=\"Facture\" required error={fileError} htmlFor=\"facture-file\">\r\n * <Dropzone value={…} onAdd={…} />\r\n * </Field>\r\n *\r\n * Field clones its child with `id`, `aria-invalid`, `aria-describedby` and\r\n * `error`. This component ACCEPTS all four and forwards them to the drop\r\n * <button> — which is the canonical accessibility handle, not the hidden\r\n * input. Before that forwarding existed the props were dropped silently:\r\n * Field's <label htmlFor> pointed at an id present on no element, so the\r\n * label named nothing and the button's accessible name was only the generic\r\n * \"Zone de dépôt de fichiers\"; and a host-set error rendered its message\r\n * while the control stayed valid to AT.\r\n *\r\n * `htmlFor` is worth passing explicitly when the field must be addressable\r\n * from outside — Field otherwise generates a `useId`-based id, which is\r\n * stable across renders but not predictable, so it cannot be targeted by\r\n * focusFieldByName after a failed submit.\r\n *\r\n * A11y note (R-Ar.1):\r\n * The drop target is a native <button>, not <div role=\"button\">.\r\n * Enter/Space activation, disabled state, and AT exposure come for\r\n * free from the platform. The hidden <input type=\"file\"> nested\r\n * inside the button is aria-hidden - the button is the canonical\r\n * accessibility handle.\r\n *\r\n * A11y note (R-A.1, live region):\r\n * Acceptances and rejections are announced via a polite live region.\r\n * Rejections are broken down by reason so SR users learn WHY without\r\n * needing a host-side toast. aria-relevant is set explicitly to\r\n * \"additions text\" — the spec default, but some SR + browser combos\r\n * (NVDA + Firefox notably) skip announcements without it.\r\n */\r\n\r\nexport type DropzoneFileStatus = \"ready\" | \"uploading\" | \"done\" | \"error\";\r\n\r\nexport interface DropzoneFile {\r\n id?: string | number | undefined;\r\n name: string;\r\n size?: number | undefined;\r\n progress?: number | undefined;\r\n status?: DropzoneFileStatus | undefined;\r\n error?: string | undefined;\r\n}\r\n\r\nexport type DropzoneRejectReason = \"max-size\" | \"type\" | \"max-files\";\r\n\r\nexport interface DropzoneRejection {\r\n file: File;\r\n reason: DropzoneRejectReason;\r\n}\r\n\r\nexport interface DropzoneReasons {\r\n \"max-size\"?: string | undefined;\r\n \"type\"?: string | undefined;\r\n \"max-files\"?: string | undefined;\r\n}\r\n\r\nexport interface DropzoneLabels {\r\n label?: React.ReactNode | undefined;\r\n ariaLabel?: string | undefined;\r\n formatBytes?: ((n: number) => string) | undefined;\r\n reasons?: DropzoneReasons | undefined;\r\n buildRejectMessage?: ((rejected: DropzoneRejection[], reasons: DropzoneReasons) => string) | undefined;\r\n addedSingle?: ((name: string) => string) | undefined;\r\n addedMultiple?: ((n: number) => string) | undefined;\r\n removeItem?: ((name: string) => string) | undefined;\r\n}\r\n\r\nexport interface DropzoneProps {\r\n accept?: string | undefined;\r\n maxSize?: number | undefined;\r\n maxFiles?: number | undefined;\r\n multiple?: boolean | undefined;\r\n disabled?: boolean | undefined;\r\n value?: DropzoneFile[] | undefined;\r\n onAdd?: ((files: File[]) => void) | undefined;\r\n onRemove?: ((id: string | number) => void) | undefined;\r\n onReject?: ((rejections: DropzoneRejection[]) => void) | undefined;\r\n // Legacy/back-compat per-prop overrides; win over labels.* when both passed.\r\n label?: React.ReactNode | undefined;\r\n \"aria-label\"?: string | undefined;\r\n hint?: React.ReactNode | undefined;\r\n labels?: DropzoneLabels | undefined;\r\n sx?: SxProps<Theme> | undefined;\r\n /**\r\n * Id for the drop <button>. Injected by Field from `htmlFor || name`, so\r\n * its <label htmlFor> resolves to a real element (R-I.1).\r\n *\r\n * Pass a stable value through Field's `htmlFor` when the field needs to be\r\n * addressable from outside the component — focusFieldByName resolves\r\n * `[id=…]` first, and that is how a failed submit reaches a Dropzone\r\n * (R-F.3).\r\n */\r\n id?: string | undefined;\r\n /**\r\n * Invalid state. Injected by Field as `error={hasError}`.\r\n *\r\n * Drives both the danger border and `aria-invalid`, so the state is\r\n * conveyed visually AND programmatically rather than by the helper text\r\n * alone (R-4.1 / R-I.3).\r\n */\r\n error?: boolean | undefined;\r\n /**\r\n * Injected by Field. Accepted explicitly so an aria-invalid passed without\r\n * `error` still lands — the two are separate props on Field's clone and a\r\n * host can legitimately set either.\r\n */\r\n \"aria-invalid\"?: boolean | \"true\" | \"false\" | undefined;\r\n /**\r\n * Injected by Field, pointing at its hint and/or error message. MERGED with\r\n * this component's own internal hint id rather than replacing it — both\r\n * descriptions are real and the user needs both.\r\n */\r\n \"aria-describedby\"?: string | undefined;\r\n}\r\n\r\n// ─── Default FR formatters ───────────────────────────────────────────\r\n\r\nfunction defaultFormatBytes(n: number): string {\r\n if (!Number.isFinite(n)) return \"—\";\r\n if (n < 1024) return `${n} o`;\r\n if (n < 1024 * 1024) return `${Math.round(n / 1024)} Ko`;\r\n return `${(n / 1024 / 1024).toFixed(1)} Mo`;\r\n}\r\n\r\nconst DEFAULT_REASONS = Object.freeze({\r\n \"max-size\": \"trop volumineux\",\r\n \"type\": \"type non autorisé\",\r\n \"max-files\": \"limite atteinte\",\r\n});\r\n\r\n/**\r\n * Build a SR-friendly French sentence summarising a rejection bundle.\r\n * Examples:\r\n * 1 file, max-size → \"1 fichier refusé : trop volumineux.\"\r\n * 3 files, mixed reasons → \"3 fichiers refusés : 1 trop volumineux,\r\n * 2 type non autorisé.\"\r\n */\r\nfunction defaultBuildRejectMessage(rejected: DropzoneRejection[], reasons: DropzoneReasons): string {\r\n const total = rejected.length;\r\n if (total === 0) return \"\";\r\n const noun = total > 1 ? \"fichiers refusés\" : \"fichier refusé\";\r\n const head = `${total} ${noun}`;\r\n\r\n const tally: Record<string, number> = {};\r\n for (const r of rejected) {\r\n const label = reasons[r.reason];\r\n if (!label) continue;\r\n tally[label] = (tally[label] || 0) + 1;\r\n }\r\n const buckets = Object.entries(tally);\r\n if (buckets.length === 0) return `${head}.`;\r\n\r\n if (buckets.length === 1) {\r\n const only = buckets[0];\r\n return only ? `${head} : ${only[0]}.` : `${head}.`;\r\n }\r\n const parts = buckets.map(([label, n]) => `${n} ${label}`);\r\n return `${head} : ${parts.join(\", \")}.`;\r\n}\r\n\r\nconst DEFAULT_LABELS = Object.freeze({\r\n label: \"Glissez vos fichiers ici ou cliquez pour parcourir\",\r\n ariaLabel: \"Zone de dépôt de fichiers\",\r\n formatBytes: defaultFormatBytes,\r\n reasons: DEFAULT_REASONS,\r\n buildRejectMessage: defaultBuildRejectMessage,\r\n addedSingle: (name: string) => `Fichier ajouté : ${name}`,\r\n addedMultiple: (n: number) => `${n} fichiers ajoutés`,\r\n removeItem: (name: string) => `Retirer ${name}`,\r\n});\r\n\r\n// ─── Helpers ──────────────────────────────────────────────────────────\r\n\r\nfunction matchesAccept(file: File, accept: string | undefined): boolean {\r\n if (!accept) return true;\r\n const tokens = accept.split(\",\").map((t) => t.trim()).filter(Boolean);\r\n if (tokens.length === 0) return true;\r\n return tokens.some((t) => {\r\n if (t.startsWith(\".\")) {\r\n return file.name.toLowerCase().endsWith(t.toLowerCase());\r\n }\r\n if (t.endsWith(\"/*\")) {\r\n const prefix = t.slice(0, -1); // \"image/\"\r\n return file.type.startsWith(prefix);\r\n }\r\n return file.type === t;\r\n });\r\n}\r\n\r\n// ─── Component ────────────────────────────────────────────────────────\r\n\r\nfunction Dropzone({\r\n accept,\r\n maxSize,\r\n maxFiles,\r\n multiple = false,\r\n disabled = false,\r\n value = [],\r\n onAdd,\r\n onRemove,\r\n onReject,\r\n // Legacy prop names: kept for back-compat. When the consumer passes\r\n // either, it wins over labels.* with the same role.\r\n label,\r\n \"aria-label\": ariaLabelProp,\r\n hint,\r\n labels,\r\n sx,\r\n // Injected by Field (R-I.1 / R-I.3). Forwarded to the drop <button>\r\n // below — see the \"INSIDE A <Field>\" note in the module docstring.\r\n id,\r\n error = false,\r\n \"aria-invalid\": ariaInvalidProp,\r\n \"aria-describedby\": ariaDescribedByProp,\r\n}: DropzoneProps) {\r\n const L = React.useMemo(() => {\r\n if (!labels) return DEFAULT_LABELS;\r\n return mergeLabels(DEFAULT_LABELS, {\r\n ...labels,\r\n /*\r\n * `reasons` is a NESTED dictionary and needs its own merge, at its own\r\n * level. Merging only at the top would replace the whole sub-object, so a\r\n * consumer overriding ONE reason would delete the others — and the\r\n * previous `|| {}` guarded the sub-object against being undefined without\r\n * guarding its VALUES, which is the same hazard one level down.\r\n */\r\n reasons: mergeLabels(DEFAULT_REASONS, labels.reasons),\r\n });\r\n }, [labels]);\r\n\r\n const dropLabel = label != null ? label : L.label;\r\n const ariaLabel = ariaLabelProp != null ? ariaLabelProp : L.ariaLabel;\r\n\r\n const inputRef = React.useRef<HTMLInputElement>(null);\r\n const liveRef = React.useRef<HTMLDivElement>(null);\r\n const [dragOver, setDragOver] = React.useState(false);\r\n // Stable, per-instance, collision-safe id for the hint association.\r\n const hintId = React.useId();\r\n\r\n /*\r\n * R-I.3 — invalid when Field said so via `error`, or when a host set the\r\n * attribute directly. Either alone is sufficient; Field passes both, other\r\n * callers may pass one.\r\n */\r\n const isInvalid =\r\n error || ariaInvalidProp === true || ariaInvalidProp === \"true\";\r\n\r\n /*\r\n * MERGED, not replaced. Field's value points at its hint and/or its error\r\n * message; hintId points at this component's own hint, rendered inside the\r\n * button. Dropping either would lose a real description — which is what\r\n * happened while this prop was not accepted at all.\r\n */\r\n const describedBy =\r\n [ariaDescribedByProp, hint ? hintId : null].filter(Boolean).join(\" \") ||\r\n undefined;\r\n\r\n const announce = (msg: string) => {\r\n if (liveRef.current) {\r\n // Setting via DOM (not state) avoids re-renders that would re-trigger\r\n // SR announcements for unrelated UI updates.\r\n liveRef.current.textContent = msg;\r\n }\r\n };\r\n\r\n const validate = React.useCallback(\r\n (incoming: File[]): { accepted: File[]; rejected: DropzoneRejection[] } => {\r\n const accepted: File[] = [];\r\n const rejected: DropzoneRejection[] = [];\r\n const remainingSlots = maxFiles != null ? Math.max(0, maxFiles - value.length) : Infinity;\r\n\r\n for (const file of incoming) {\r\n if (accepted.length >= remainingSlots) {\r\n rejected.push({ file, reason: \"max-files\" });\r\n continue;\r\n }\r\n if (maxSize != null && file.size > maxSize) {\r\n rejected.push({ file, reason: \"max-size\" });\r\n continue;\r\n }\r\n if (!matchesAccept(file, accept)) {\r\n rejected.push({ file, reason: \"type\" });\r\n continue;\r\n }\r\n accepted.push(file);\r\n if (!multiple) break; // single mode: only first valid\r\n }\r\n return { accepted, rejected };\r\n },\r\n [accept, maxSize, maxFiles, multiple, value.length]\r\n );\r\n\r\n const handleFiles = (fileList: FileList | File[] | null | undefined) => {\r\n if (disabled) return;\r\n const files = Array.from(fileList || []);\r\n if (files.length === 0) return;\r\n const { accepted, rejected } = validate(files);\r\n if (accepted.length > 0) {\r\n onAdd?.(accepted);\r\n const [first] = accepted;\r\n announce(\r\n accepted.length === 1 && first\r\n ? L.addedSingle(first.name)\r\n : L.addedMultiple(accepted.length)\r\n );\r\n }\r\n if (rejected.length > 0) {\r\n onReject?.(rejected);\r\n announce(L.buildRejectMessage(rejected, L.reasons));\r\n }\r\n };\r\n\r\n const onInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n handleFiles(e.target.files);\r\n // reset so the same file can be re-added after removal\r\n e.target.value = \"\";\r\n };\r\n\r\n const openPicker = () => {\r\n if (disabled) return;\r\n inputRef.current?.click();\r\n };\r\n\r\n const onDragOver = (e: React.DragEvent) => {\r\n if (disabled) return;\r\n e.preventDefault();\r\n e.stopPropagation();\r\n if (!dragOver) setDragOver(true);\r\n };\r\n const onDragLeave = (e: React.DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n // Only clear when leaving the wrapper itself, not crossing a child.\r\n if (e.currentTarget.contains(e.relatedTarget as Node | null)) return;\r\n setDragOver(false);\r\n };\r\n const onDrop = (e: React.DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setDragOver(false);\r\n if (disabled) return;\r\n handleFiles(e.dataTransfer?.files);\r\n };\r\n\r\n /*\r\n * Border colour precedence: dragOver > invalid > resting.\r\n *\r\n * Drag feedback wins deliberately — while a file is over the target the\r\n * user needs to know the drop will land, and the invalid state is about to\r\n * be resolved by that very drop.\r\n */\r\n const borderColor = dragOver\r\n ? \"var(--accent)\"\r\n : isInvalid\r\n ? \"var(--danger)\"\r\n : \"var(--border-strong)\";\r\n\r\n return (\r\n <Box sx={{ width: \"100%\", ...sx }}>\r\n <Box\r\n component=\"button\"\r\n type=\"button\"\r\n {...(id !== undefined ? { id } : {})}\r\n disabled={disabled}\r\n aria-label={ariaLabel}\r\n {...(isInvalid ? { \"aria-invalid\": true } : {})}\r\n aria-describedby={describedBy}\r\n onClick={openPicker}\r\n onDragOver={onDragOver}\r\n onDragEnter={onDragOver}\r\n onDragLeave={onDragLeave}\r\n onDrop={onDrop}\r\n sx={{\r\n // <button> reset - neutralise UA defaults so the drop target\r\n // visually matches the previous Box-based design.\r\n font: \"inherit\",\r\n color: \"inherit\",\r\n width: \"100%\",\r\n // Layout\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: 1,\r\n padding: \"var(--s-5) var(--s-4)\",\r\n background: dragOver ? \"var(--accent-soft)\" : \"var(--bg-subtle)\",\r\n border: `2px dashed ${borderColor}`,\r\n borderRadius: \"var(--r-lg)\",\r\n cursor: disabled ? \"not-allowed\" : \"pointer\",\r\n opacity: disabled ? 0.55 : 1,\r\n textAlign: \"center\",\r\n transition:\r\n \"background var(--duration-fast, 80ms) ease, border-color var(--duration-fast, 80ms) ease\",\r\n \"&:hover\": (!disabled && !dragOver)\r\n ? { background: \"var(--bg-hover)\", borderColor: \"var(--accent)\" }\r\n : {},\r\n \"&:focus-visible\": {\r\n outline: \"2px solid var(--accent)\",\r\n outlineOffset: \"var(--pui-outline-offset)\",\r\n },\r\n }}\r\n >\r\n <Box\r\n aria-hidden=\"true\"\r\n sx={{\r\n color: dragOver\r\n ? \"var(--accent)\"\r\n : isInvalid\r\n ? \"var(--danger)\"\r\n : \"var(--fg-muted)\",\r\n display: \"inline-flex\",\r\n }}\r\n >\r\n <CloudUploadIcon style={{ fontSize: 32 }} />\r\n </Box>\r\n <Box\r\n sx={{\r\n fontSize: \"var(--text-sm)\",\r\n fontWeight: \"var(--fw-semibold)\",\r\n color: \"var(--fg)\",\r\n }}\r\n >\r\n {dropLabel}\r\n </Box>\r\n {hint && (\r\n <Box\r\n id={hintId}\r\n sx={{ fontSize: \"var(--text-xs)\", color: \"var(--fg-muted)\" }}\r\n >\r\n {hint}\r\n </Box>\r\n )}\r\n {/* visually-hidden, accessibility-tree-hidden native input.\r\n The wrapping <button> is the canonical a11y handle; the input\r\n is just the bridge to the OS file picker.\r\n C2 — clipPath: inset(50%) (modern) replaces the deprecated\r\n clip: rect(0,0,0,0) so a strict CSP that disables `clip`\r\n cannot leak the input on screen. */}\r\n <input\r\n ref={inputRef}\r\n type=\"file\"\r\n accept={accept}\r\n multiple={multiple}\r\n disabled={disabled}\r\n onChange={onInputChange}\r\n tabIndex={-1}\r\n aria-hidden=\"true\"\r\n style={{\r\n position: \"absolute\",\r\n width: 1, height: 1, padding: 0, margin: -1,\r\n overflow: \"hidden\", clipPath: \"inset(50%)\", border: 0,\r\n }}\r\n />\r\n </Box>\r\n\r\n {/* Live region — newly-added file announcements + rejection summary.\r\n C3 — aria-relevant explicit (defense-in-depth for NVDA+Firefox). */}\r\n <Box\r\n ref={liveRef}\r\n role=\"status\"\r\n aria-live=\"polite\"\r\n aria-relevant=\"additions text\"\r\n className=\"pui-sr-only\"\r\n />\r\n\r\n {/* file list */}\r\n {value.length > 0 && (\r\n <Box\r\n component=\"ul\"\r\n /* Explicit role — several screen readers strip list semantics when\r\n CSS list-style:none is applied. Same reason FormErrorSummary sets\r\n it. */\r\n role=\"list\"\r\n sx={{\r\n listStyle: \"none\",\r\n padding: 0,\r\n margin: \"var(--s-3) 0 0\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: \"var(--s-1)\",\r\n }}\r\n >\r\n {value.map((f, i) => {\r\n const id = f.id ?? f.name ?? i;\r\n const status = f.status || (f.error ? \"error\" : f.progress === 100 ? \"done\" : f.progress != null ? \"uploading\" : \"ready\");\r\n const color =\r\n status === \"error\" ? \"var(--danger)\" :\r\n status === \"done\" ? \"var(--success)\" : \"var(--fg-muted)\";\r\n return (\r\n <Box\r\n component=\"li\"\r\n role=\"listitem\"\r\n key={id}\r\n sx={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: \"var(--s-2)\",\r\n padding: \"var(--s-2) var(--s-3)\",\r\n background: \"var(--surface)\",\r\n border: \"1px solid var(--border)\",\r\n borderRadius: \"var(--r-md)\",\r\n }}\r\n >\r\n <Box aria-hidden=\"true\" sx={{ color, display: \"inline-flex\" }}>\r\n <InsertDriveFileIcon fontSize=\"small\" />\r\n </Box>\r\n <Box sx={{ flex: 1, minWidth: 0 }}>\r\n <Box\r\n sx={{\r\n fontSize: \"var(--text-sm)\",\r\n fontWeight: \"var(--fw-medium)\",\r\n color: \"var(--fg)\",\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n }}\r\n >\r\n {f.name}\r\n </Box>\r\n <Box\r\n sx={{\r\n fontSize: \"var(--text-xs)\",\r\n color: status === \"error\" ? \"var(--danger)\" : \"var(--fg-subtle)\",\r\n fontVariantNumeric: \"tabular-nums\",\r\n }}\r\n >\r\n {status === \"error\" && f.error\r\n ? f.error\r\n : `${L.formatBytes(f.size ?? NaN)}${f.progress != null ? ` · ${Math.round(f.progress)}%` : \"\"}`}\r\n </Box>\r\n </Box>\r\n {onRemove && (\r\n <IconButton\r\n size=\"small\"\r\n onClick={(e) => { e.stopPropagation(); onRemove(id); }}\r\n aria-label={L.removeItem(f.name)}\r\n sx={{ color: \"var(--fg-muted)\" }}\r\n >\r\n <CloseIcon fontSize=\"small\" />\r\n </IconButton>\r\n )}\r\n </Box>\r\n );\r\n })}\r\n </Box>\r\n )}\r\n </Box>\r\n );\r\n}\r\n\r\nexport default Dropzone;\r\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"Dropzone.js","names":["React","mergeLabels","Box","IconButton","CloudUploadIcon","CloseIcon","InsertDriveFileIcon","jsx","_jsx","jsxs","_jsxs","defaultFormatBytes","n","Number","isFinite","Math","round","toFixed","DEFAULT_REASONS","Object","freeze","defaultBuildRejectMessage","rejected","reasons","total","length","noun","head","tally","r","label","reason","buckets","entries","only","parts","map","join","DEFAULT_LABELS","ariaLabel","formatBytes","buildRejectMessage","addedSingle","name","addedMultiple","removeItem","matchesAccept","file","accept","tokens","split","t","trim","filter","Boolean","some","startsWith","toLowerCase","endsWith","prefix","slice","type","Dropzone","maxSize","maxFiles","multiple","disabled","value","onAdd","onRemove","onReject","ariaLabelProp","hint","labels","sx","id","error","ariaInvalidProp","ariaDescribedByProp","L","useMemo","dropLabel","inputRef","useRef","liveRef","dragOver","setDragOver","useState","hintId","useId","isInvalid","describedBy","undefined","announce","msg","current","textContent","validate","useCallback","incoming","accepted","remainingSlots","max","Infinity","push","size","handleFiles","fileList","files","Array","from","first","onInputChange","e","target","openPicker","click","onDragOver","preventDefault","stopPropagation","onDragLeave","currentTarget","contains","relatedTarget","onDrop","dataTransfer","borderColor","width","children","component","onClick","onDragEnter","font","color","display","flexDirection","alignItems","justifyContent","gap","padding","background","border","borderRadius","cursor","opacity","textAlign","transition","outline","outlineOffset","style","fontSize","fontWeight","ref","onChange","tabIndex","position","height","margin","overflow","clipPath","role","className","listStyle","f","i","status","progress","flex","minWidth","textOverflow","whiteSpace","fontVariantNumeric","NaN"],"sources":["../../../../src/lib/v2/components/Dropzone.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport { mergeLabels } from \"../utils/mergeLabels\";\r\nimport Box from \"@mui/material/Box\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport CloudUploadIcon from \"@mui/icons-material/CloudUpload\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport InsertDriveFileIcon from \"@mui/icons-material/InsertDriveFileOutlined\";\r\nimport type { SxProps, Theme } from \"@mui/material/styles\";\r\n\r\n/**\r\n * Dropzone - Portnet UI v2\r\n *\r\n * Charter §03 · Component \"Dropzone / FileUpload\". Drop area + click/keyboard\r\n * to open the OS file picker. Stateless wrt upload progress - the caller owns\r\n * the upload state and feeds it back via `value`.\r\n *\r\n * <Dropzone\r\n * accept=\"application/pdf,image/png,image/jpeg\"\r\n * maxSize={5 * 1024 * 1024}\r\n * multiple\r\n * value={files} // [{ id, name, size, progress, status, error }]\r\n * onAdd={handleNewFiles}\r\n * onRemove={(id) => removeFile(id)}\r\n * onReject={(rejections) => showErrors(rejections)}\r\n * hint=\"Formats acceptés : PDF, PNG, JPG. Max 5 Mo par fichier.\"\r\n * />\r\n *\r\n * Localisation (FR / EN / AR):\r\n * <Dropzone labels={{\r\n * label: \"Drag files here or click to browse\",\r\n * ariaLabel: \"File drop zone\",\r\n * formatBytes: (n) => `${(n / 1024 / 1024).toFixed(1)} MB`,\r\n * reasons: {\r\n * \"max-size\": \"too large\",\r\n * \"type\": \"wrong type\",\r\n * \"max-files\": \"limit reached\",\r\n * },\r\n * buildRejectMessage: (rejected) => `${rejected.length} file(s) rejected`,\r\n * addedSingle: (name) => `Added: ${name}`,\r\n * addedMultiple: (n) => `${n} files added`,\r\n * removeItem: (name) => `Remove ${name}`,\r\n * }} />\r\n *\r\n * ── INSIDE A <Field> (R-I.1, R-I.3) ──────────────────────────────────\r\n *\r\n * Wrap it to get a visible label, required marker and error message:\r\n *\r\n * <Field label=\"Facture\" required error={fileError} htmlFor=\"facture-file\">\r\n * <Dropzone value={…} onAdd={…} />\r\n * </Field>\r\n *\r\n * Field clones its child with `id`, `aria-invalid`, `aria-describedby` and\r\n * `error`. This component ACCEPTS all four and forwards them to the drop\r\n * <button> — which is the canonical accessibility handle, not the hidden\r\n * input. Before that forwarding existed the props were dropped silently:\r\n * Field's <label htmlFor> pointed at an id present on no element, so the\r\n * label named nothing and the button's accessible name was only the generic\r\n * \"Zone de dépôt de fichiers\"; and a host-set error rendered its message\r\n * while the control stayed valid to AT.\r\n *\r\n * `htmlFor` is worth passing explicitly when the field must be addressable\r\n * from outside — Field otherwise generates a `useId`-based id, which is\r\n * stable across renders but not predictable, so it cannot be targeted by\r\n * focusFieldByName after a failed submit.\r\n *\r\n * A11y note (R-Ar.1):\r\n * The drop target is a native <button>, not <div role=\"button\">.\r\n * Enter/Space activation, disabled state, and AT exposure come for\r\n * free from the platform. The hidden <input type=\"file\"> nested\r\n * inside the button is aria-hidden - the button is the canonical\r\n * accessibility handle.\r\n *\r\n * A11y note (R-A.1, live region):\r\n * Acceptances and rejections are announced via a polite live region.\r\n * Rejections are broken down by reason so SR users learn WHY without\r\n * needing a host-side toast. aria-relevant is set explicitly to\r\n * \"additions text\" — the spec default, but some SR + browser combos\r\n * (NVDA + Firefox notably) skip announcements without it.\r\n */\r\n\r\nexport type DropzoneFileStatus = \"ready\" | \"uploading\" | \"done\" | \"error\";\r\n\r\nexport interface DropzoneFile {\r\n id?: string | number | undefined;\r\n name: string;\r\n size?: number | undefined;\r\n progress?: number | undefined;\r\n status?: DropzoneFileStatus | undefined;\r\n error?: string | undefined;\r\n}\r\n\r\nexport type DropzoneRejectReason = \"max-size\" | \"type\" | \"max-files\";\r\n\r\nexport interface DropzoneRejection {\r\n file: File;\r\n reason: DropzoneRejectReason;\r\n}\r\n\r\nexport interface DropzoneReasons {\r\n \"max-size\"?: string | undefined;\r\n \"type\"?: string | undefined;\r\n \"max-files\"?: string | undefined;\r\n}\r\n\r\nexport interface DropzoneLabels {\r\n label?: React.ReactNode | undefined;\r\n ariaLabel?: string | undefined;\r\n formatBytes?: ((n: number) => string) | undefined;\r\n reasons?: DropzoneReasons | undefined;\r\n buildRejectMessage?: ((rejected: DropzoneRejection[], reasons: DropzoneReasons) => string) | undefined;\r\n addedSingle?: ((name: string) => string) | undefined;\r\n addedMultiple?: ((n: number) => string) | undefined;\r\n removeItem?: ((name: string) => string) | undefined;\r\n}\r\n\r\nexport interface DropzoneProps {\r\n accept?: string | undefined;\r\n maxSize?: number | undefined;\r\n maxFiles?: number | undefined;\r\n multiple?: boolean | undefined;\r\n disabled?: boolean | undefined;\r\n value?: DropzoneFile[] | undefined;\r\n onAdd?: ((files: File[]) => void) | undefined;\r\n onRemove?: ((id: string | number) => void) | undefined;\r\n onReject?: ((rejections: DropzoneRejection[]) => void) | undefined;\r\n // Legacy/back-compat per-prop overrides; win over labels.* when both passed.\r\n label?: React.ReactNode | undefined;\r\n \"aria-label\"?: string | undefined;\r\n hint?: React.ReactNode | undefined;\r\n labels?: DropzoneLabels | undefined;\r\n sx?: SxProps<Theme> | undefined;\r\n /**\r\n * Id for the drop <button>. Injected by Field from `htmlFor || name`, so\r\n * its <label htmlFor> resolves to a real element (R-I.1).\r\n *\r\n * Pass a stable value through Field's `htmlFor` when the field needs to be\r\n * addressable from outside the component — focusFieldByName resolves\r\n * `[id=…]` first, and that is how a failed submit reaches a Dropzone\r\n * (R-F.3).\r\n */\r\n id?: string | undefined;\r\n /**\r\n * Invalid state. Injected by Field as `error={hasError}`.\r\n *\r\n * Drives both the danger border and `aria-invalid`, so the state is\r\n * conveyed visually AND programmatically rather than by the helper text\r\n * alone (R-4.1 / R-I.3).\r\n */\r\n error?: boolean | undefined;\r\n /**\r\n * Injected by Field. Accepted explicitly so an aria-invalid passed without\r\n * `error` still lands — the two are separate props on Field's clone and a\r\n * host can legitimately set either.\r\n */\r\n \"aria-invalid\"?: boolean | \"true\" | \"false\" | undefined;\r\n /**\r\n * Injected by Field, pointing at its hint and/or error message. MERGED with\r\n * this component's own internal hint id rather than replacing it — both\r\n * descriptions are real and the user needs both.\r\n */\r\n \"aria-describedby\"?: string | undefined;\r\n}\r\n\r\n// ─── Default FR formatters ───────────────────────────────────────────\r\n\r\nfunction defaultFormatBytes(n: number): string {\r\n if (!Number.isFinite(n)) return \"—\";\r\n if (n < 1024) return `${n} o`;\r\n if (n < 1024 * 1024) return `${Math.round(n / 1024)} Ko`;\r\n return `${(n / 1024 / 1024).toFixed(1)} Mo`;\r\n}\r\n\r\nconst DEFAULT_REASONS = Object.freeze({\r\n \"max-size\": \"trop volumineux\",\r\n \"type\": \"type non autorisé\",\r\n \"max-files\": \"limite atteinte\",\r\n});\r\n\r\n/**\r\n * Build a SR-friendly French sentence summarising a rejection bundle.\r\n * Examples:\r\n * 1 file, max-size → \"1 fichier refusé : trop volumineux.\"\r\n * 3 files, mixed reasons → \"3 fichiers refusés : 1 trop volumineux,\r\n * 2 type non autorisé.\"\r\n */\r\nfunction defaultBuildRejectMessage(rejected: DropzoneRejection[], reasons: DropzoneReasons): string {\r\n const total = rejected.length;\r\n if (total === 0) return \"\";\r\n const noun = total > 1 ? \"fichiers refusés\" : \"fichier refusé\";\r\n const head = `${total} ${noun}`;\r\n\r\n const tally: Record<string, number> = {};\r\n for (const r of rejected) {\r\n const label = reasons[r.reason];\r\n if (!label) continue;\r\n tally[label] = (tally[label] || 0) + 1;\r\n }\r\n const buckets = Object.entries(tally);\r\n if (buckets.length === 0) return `${head}.`;\r\n\r\n if (buckets.length === 1) {\r\n const only = buckets[0];\r\n return only ? `${head} : ${only[0]}.` : `${head}.`;\r\n }\r\n const parts = buckets.map(([label, n]) => `${n} ${label}`);\r\n return `${head} : ${parts.join(\", \")}.`;\r\n}\r\n\r\nconst DEFAULT_LABELS = Object.freeze({\r\n label: \"Glissez vos fichiers ici ou cliquez pour parcourir\",\r\n ariaLabel: \"Zone de dépôt de fichiers\",\r\n formatBytes: defaultFormatBytes,\r\n reasons: DEFAULT_REASONS,\r\n buildRejectMessage: defaultBuildRejectMessage,\r\n addedSingle: (name: string) => `Fichier ajouté : ${name}`,\r\n addedMultiple: (n: number) => `${n} fichiers ajoutés`,\r\n removeItem: (name: string) => `Retirer ${name}`,\r\n});\r\n\r\n// ─── Helpers ──────────────────────────────────────────────────────────\r\n\r\nfunction matchesAccept(file: File, accept: string | undefined): boolean {\r\n if (!accept) return true;\r\n const tokens = accept.split(\",\").map((t) => t.trim()).filter(Boolean);\r\n if (tokens.length === 0) return true;\r\n return tokens.some((t) => {\r\n if (t.startsWith(\".\")) {\r\n return file.name.toLowerCase().endsWith(t.toLowerCase());\r\n }\r\n if (t.endsWith(\"/*\")) {\r\n const prefix = t.slice(0, -1); // \"image/\"\r\n return file.type.startsWith(prefix);\r\n }\r\n return file.type === t;\r\n });\r\n}\r\n\r\n// ─── Component ────────────────────────────────────────────────────────\r\n\r\nfunction Dropzone({\r\n accept,\r\n maxSize,\r\n maxFiles,\r\n multiple = false,\r\n disabled = false,\r\n value = [],\r\n onAdd,\r\n onRemove,\r\n onReject,\r\n // Legacy prop names: kept for back-compat. When the consumer passes\r\n // either, it wins over labels.* with the same role.\r\n label,\r\n \"aria-label\": ariaLabelProp,\r\n hint,\r\n labels,\r\n sx,\r\n // Injected by Field (R-I.1 / R-I.3). Forwarded to the drop <button>\r\n // below — see the \"INSIDE A <Field>\" note in the module docstring.\r\n id,\r\n error = false,\r\n \"aria-invalid\": ariaInvalidProp,\r\n \"aria-describedby\": ariaDescribedByProp,\r\n}: DropzoneProps) {\r\n const L = React.useMemo(() => {\r\n if (!labels) return DEFAULT_LABELS;\r\n return mergeLabels(DEFAULT_LABELS, {\r\n ...labels,\r\n /*\r\n * `reasons` is a NESTED dictionary and needs its own merge, at its own\r\n * level. Merging only at the top would replace the whole sub-object, so a\r\n * consumer overriding ONE reason would delete the others — and the\r\n * previous `|| {}` guarded the sub-object against being undefined without\r\n * guarding its VALUES, which is the same hazard one level down.\r\n */\r\n reasons: mergeLabels(DEFAULT_REASONS, labels.reasons),\r\n });\r\n }, [labels]);\r\n\r\n const dropLabel = label != null ? label : L.label;\r\n const ariaLabel = ariaLabelProp != null ? ariaLabelProp : L.ariaLabel;\r\n\r\n const inputRef = React.useRef<HTMLInputElement>(null);\r\n const liveRef = React.useRef<HTMLDivElement>(null);\r\n const [dragOver, setDragOver] = React.useState(false);\r\n // Stable, per-instance, collision-safe id for the hint association.\r\n const hintId = React.useId();\r\n\r\n /*\r\n * R-I.3 — invalid when Field said so via `error`, or when a host set the\r\n * attribute directly. Either alone is sufficient; Field passes both, other\r\n * callers may pass one.\r\n */\r\n const isInvalid =\r\n error || ariaInvalidProp === true || ariaInvalidProp === \"true\";\r\n\r\n /*\r\n * MERGED, not replaced. Field's value points at its hint and/or its error\r\n * message; hintId points at this component's own hint, rendered inside the\r\n * button. Dropping either would lose a real description — which is what\r\n * happened while this prop was not accepted at all.\r\n */\r\n const describedBy =\r\n [ariaDescribedByProp, hint ? hintId : null].filter(Boolean).join(\" \") ||\r\n undefined;\r\n\r\n const announce = (msg: string) => {\r\n if (liveRef.current) {\r\n // Setting via DOM (not state) avoids re-renders that would re-trigger\r\n // SR announcements for unrelated UI updates.\r\n liveRef.current.textContent = msg;\r\n }\r\n };\r\n\r\n const validate = React.useCallback(\r\n (incoming: File[]): { accepted: File[]; rejected: DropzoneRejection[] } => {\r\n const accepted: File[] = [];\r\n const rejected: DropzoneRejection[] = [];\r\n const remainingSlots = maxFiles != null ? Math.max(0, maxFiles - value.length) : Infinity;\r\n\r\n for (const file of incoming) {\r\n if (accepted.length >= remainingSlots) {\r\n rejected.push({ file, reason: \"max-files\" });\r\n continue;\r\n }\r\n if (maxSize != null && file.size > maxSize) {\r\n rejected.push({ file, reason: \"max-size\" });\r\n continue;\r\n }\r\n if (!matchesAccept(file, accept)) {\r\n rejected.push({ file, reason: \"type\" });\r\n continue;\r\n }\r\n accepted.push(file);\r\n if (!multiple) break; // single mode: only first valid\r\n }\r\n return { accepted, rejected };\r\n },\r\n [accept, maxSize, maxFiles, multiple, value.length]\r\n );\r\n\r\n const handleFiles = (fileList: FileList | File[] | null | undefined) => {\r\n if (disabled) return;\r\n const files = Array.from(fileList || []);\r\n if (files.length === 0) return;\r\n const { accepted, rejected } = validate(files);\r\n if (accepted.length > 0) {\r\n onAdd?.(accepted);\r\n const [first] = accepted;\r\n announce(\r\n accepted.length === 1 && first\r\n ? L.addedSingle(first.name)\r\n : L.addedMultiple(accepted.length)\r\n );\r\n }\r\n if (rejected.length > 0) {\r\n onReject?.(rejected);\r\n announce(L.buildRejectMessage(rejected, L.reasons));\r\n }\r\n };\r\n\r\n const onInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n handleFiles(e.target.files);\r\n // reset so the same file can be re-added after removal\r\n e.target.value = \"\";\r\n };\r\n\r\n const openPicker = () => {\r\n if (disabled) return;\r\n inputRef.current?.click();\r\n };\r\n\r\n const onDragOver = (e: React.DragEvent) => {\r\n if (disabled) return;\r\n e.preventDefault();\r\n e.stopPropagation();\r\n if (!dragOver) setDragOver(true);\r\n };\r\n const onDragLeave = (e: React.DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n // Only clear when leaving the wrapper itself, not crossing a child.\r\n if (e.currentTarget.contains(e.relatedTarget as Node | null)) return;\r\n setDragOver(false);\r\n };\r\n const onDrop = (e: React.DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setDragOver(false);\r\n if (disabled) return;\r\n handleFiles(e.dataTransfer?.files);\r\n };\r\n\r\n /*\r\n * Border colour precedence: dragOver > invalid > resting.\r\n *\r\n * Drag feedback wins deliberately — while a file is over the target the\r\n * user needs to know the drop will land, and the invalid state is about to\r\n * be resolved by that very drop.\r\n */\r\n const borderColor = dragOver\r\n ? \"var(--accent)\"\r\n : isInvalid\r\n ? \"var(--danger)\"\r\n : \"var(--border-strong)\";\r\n\r\n return (\r\n <Box sx={{ width: \"100%\", ...sx }}>\r\n <Box\r\n component=\"button\"\r\n type=\"button\"\r\n {...(id !== undefined ? { id } : {})}\r\n disabled={disabled}\r\n aria-label={ariaLabel}\r\n {...(isInvalid ? { \"aria-invalid\": true } : {})}\r\n aria-describedby={describedBy}\r\n onClick={openPicker}\r\n onDragOver={onDragOver}\r\n onDragEnter={onDragOver}\r\n onDragLeave={onDragLeave}\r\n onDrop={onDrop}\r\n sx={{\r\n // <button> reset - neutralise UA defaults so the drop target\r\n // visually matches the previous Box-based design.\r\n font: \"inherit\",\r\n color: \"inherit\",\r\n width: \"100%\",\r\n // Layout\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: 1,\r\n padding: \"var(--s-5) var(--s-4)\",\r\n background: dragOver ? \"var(--accent-soft)\" : \"var(--bg-subtle)\",\r\n border: `2px dashed ${borderColor}`,\r\n borderRadius: \"var(--r-lg)\",\r\n cursor: disabled ? \"not-allowed\" : \"pointer\",\r\n opacity: disabled ? 0.55 : 1,\r\n textAlign: \"center\",\r\n transition:\r\n \"background var(--duration-fast, 80ms) ease, border-color var(--duration-fast, 80ms) ease\",\r\n \"&:hover\": (!disabled && !dragOver)\r\n ? { background: \"var(--bg-hover)\", borderColor: \"var(--accent)\" }\r\n : {},\r\n \"&:focus-visible\": {\r\n outline: \"2px solid var(--accent)\",\r\n outlineOffset: \"var(--pui-outline-offset)\",\r\n },\r\n }}\r\n >\r\n <Box\r\n aria-hidden=\"true\"\r\n sx={{\r\n color: dragOver\r\n ? \"var(--accent)\"\r\n : isInvalid\r\n ? \"var(--danger)\"\r\n : \"var(--fg-muted)\",\r\n display: \"inline-flex\",\r\n }}\r\n >\r\n <CloudUploadIcon style={{ fontSize: 32 }} />\r\n </Box>\r\n <Box\r\n sx={{\r\n fontSize: \"var(--text-sm)\",\r\n fontWeight: \"var(--fw-semibold)\",\r\n color: \"var(--fg)\",\r\n }}\r\n >\r\n {dropLabel}\r\n </Box>\r\n {hint && (\r\n <Box\r\n id={hintId}\r\n sx={{ fontSize: \"var(--text-xs)\", color: \"var(--fg-muted)\" }}\r\n >\r\n {hint}\r\n </Box>\r\n )}\r\n {/* visually-hidden, accessibility-tree-hidden native input.\r\n The wrapping <button> is the canonical a11y handle; the input\r\n is just the bridge to the OS file picker.\r\n C2 — clipPath: inset(50%) (modern) replaces the deprecated\r\n clip: rect(0,0,0,0) so a strict CSP that disables `clip`\r\n cannot leak the input on screen. */}\r\n <input\r\n ref={inputRef}\r\n type=\"file\"\r\n accept={accept}\r\n multiple={multiple}\r\n disabled={disabled}\r\n onChange={onInputChange}\r\n tabIndex={-1}\r\n aria-hidden=\"true\"\r\n style={{\r\n position: \"absolute\",\r\n width: 1, height: 1, padding: 0, margin: -1,\r\n overflow: \"hidden\", clipPath: \"inset(50%)\", border: 0,\r\n }}\r\n />\r\n </Box>\r\n\r\n {/* Live region — newly-added file announcements + rejection summary.\r\n C3 — aria-relevant explicit (defense-in-depth for NVDA+Firefox). */}\r\n <Box\r\n ref={liveRef}\r\n role=\"status\"\r\n aria-live=\"polite\"\r\n aria-relevant=\"additions text\"\r\n className=\"pui-sr-only\"\r\n />\r\n\r\n {/* file list */}\r\n {value.length > 0 && (\r\n <Box\r\n component=\"ul\"\r\n /* Explicit role — several screen readers strip list semantics when\r\n CSS list-style:none is applied. Same reason FormErrorSummary sets\r\n it. */\r\n role=\"list\"\r\n sx={{\r\n listStyle: \"none\",\r\n padding: 0,\r\n margin: \"var(--s-3) 0 0\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: \"var(--s-1)\",\r\n }}\r\n >\r\n {value.map((f, i) => {\r\n const id = f.id ?? f.name ?? i;\r\n const status = f.status || (f.error ? \"error\" : f.progress === 100 ? \"done\" : f.progress != null ? \"uploading\" : \"ready\");\r\n const color =\r\n status === \"error\" ? \"var(--danger)\" :\r\n status === \"done\" ? \"var(--success)\" : \"var(--fg-muted)\";\r\n return (\r\n <Box\r\n component=\"li\"\r\n role=\"listitem\"\r\n key={id}\r\n sx={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: \"var(--s-2)\",\r\n padding: \"var(--s-2) var(--s-3)\",\r\n background: \"var(--surface)\",\r\n border: \"1px solid var(--border)\",\r\n borderRadius: \"var(--r-md)\",\r\n }}\r\n >\r\n <Box aria-hidden=\"true\" sx={{ color, display: \"inline-flex\" }}>\r\n <InsertDriveFileIcon fontSize=\"small\" />\r\n </Box>\r\n <Box sx={{ flex: 1, minWidth: 0 }}>\r\n <Box\r\n sx={{\r\n fontSize: \"var(--text-sm)\",\r\n fontWeight: \"var(--fw-medium)\",\r\n color: \"var(--fg)\",\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n }}\r\n >\r\n {f.name}\r\n </Box>\r\n <Box\r\n sx={{\r\n fontSize: \"var(--text-xs)\",\r\n color: status === \"error\" ? \"var(--danger)\" : \"var(--fg-subtle)\",\r\n fontVariantNumeric: \"tabular-nums\",\r\n }}\r\n >\r\n {status === \"error\" && f.error\r\n ? f.error\r\n : `${L.formatBytes(f.size ?? NaN)}${f.progress != null ? ` · ${Math.round(f.progress)}%` : \"\"}`}\r\n </Box>\r\n </Box>\r\n {onRemove && (\r\n <IconButton\r\n size=\"small\"\r\n onClick={(e) => { e.stopPropagation(); onRemove(id); }}\r\n aria-label={L.removeItem(f.name)}\r\n sx={{ color: \"var(--fg-muted)\" }}\r\n >\r\n <CloseIcon fontSize=\"small\" />\r\n </IconButton>\r\n )}\r\n </Box>\r\n );\r\n })}\r\n </Box>\r\n )}\r\n </Box>\r\n );\r\n}\r\n\r\nexport default Dropzone;\r\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -21,14 +21,14 @@ import Button from "./Button";
|
|
|
21
21
|
* />
|
|
22
22
|
*/
|
|
23
23
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
24
|
-
function EmptyState(
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
24
|
+
function EmptyState({
|
|
25
|
+
variant = "initial",
|
|
26
|
+
icon,
|
|
27
|
+
title,
|
|
28
|
+
description,
|
|
29
|
+
action
|
|
30
|
+
}) {
|
|
31
|
+
const variantStyle = {
|
|
32
32
|
initial: {
|
|
33
33
|
iconColor: "var(--fg-subtle)"
|
|
34
34
|
},
|
|
@@ -41,7 +41,7 @@ function EmptyState(_ref) {
|
|
|
41
41
|
}[variant] || {
|
|
42
42
|
iconColor: "var(--fg-subtle)"
|
|
43
43
|
};
|
|
44
|
-
|
|
44
|
+
const buttonVariant = variant === "error" ? "secondary" : "primary";
|
|
45
45
|
return /*#__PURE__*/_jsxs(Box, {
|
|
46
46
|
role: variant === "error" ? "alert" : undefined,
|
|
47
47
|
sx: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmptyState.js","names":["React","Box","Typography","Button","jsx","_jsx","jsxs","_jsxs","EmptyState","
|
|
1
|
+
{"version":3,"file":"EmptyState.js","names":["React","Box","Typography","Button","jsx","_jsx","jsxs","_jsxs","EmptyState","variant","icon","title","description","action","variantStyle","initial","iconColor","filtered","error","buttonVariant","role","undefined","sx","display","flexDirection","alignItems","textAlign","padding","background","border","borderRadius","children","width","height","placeItems","color","marginBottom","fontSize","component","fontWeight","lineHeight","maxWidth","onClick","label"],"sources":["../../../../src/lib/v2/components/EmptyState.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport Box from \"@mui/material/Box\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport Button from \"./Button\";\r\nimport type { ButtonProps } from \"./Button\";\r\n\r\n/**\r\n * EmptyState — Portnet UI v2\r\n *\r\n * Charter §04.3 · 3 variants required:\r\n * - initial → primary CTA (e.g. \"+ Nouveau titre\")\r\n * - filtered → \"Réinitialiser filtres\"\r\n * - error → \"Réessayer\"\r\n *\r\n * Anti-pattern: generic clipart illustration. A single icon suffices (R-Em.2).\r\n *\r\n * <EmptyState\r\n * icon={<DescriptionIcon />}\r\n * title=\"Aucun titre d'importation\"\r\n * description=\"Créez votre premier titre pour commencer.\"\r\n * action={{ label: \"Nouveau titre\", onClick: createNew }}\r\n * />\r\n */\r\n\r\nexport type EmptyStateVariant = \"initial\" | \"filtered\" | \"error\";\r\n\r\nexport interface EmptyStateAction {\r\n label: React.ReactNode;\r\n onClick?: (() => void) | undefined;\r\n icon?: React.ReactNode | undefined;\r\n variant?: ButtonProps[\"variant\"] | undefined;\r\n}\r\n\r\nexport interface EmptyStateProps {\r\n variant?: EmptyStateVariant | undefined;\r\n icon?: React.ReactNode | undefined;\r\n title: React.ReactNode;\r\n description?: React.ReactNode | undefined;\r\n action?: EmptyStateAction | undefined;\r\n}\r\n\r\nfunction EmptyState({\r\n variant = \"initial\",\r\n icon,\r\n title,\r\n description,\r\n action,\r\n}: EmptyStateProps) {\r\n const variantStyle = {\r\n initial: { iconColor: \"var(--fg-subtle)\" },\r\n filtered: { iconColor: \"var(--fg-subtle)\" },\r\n error: { iconColor: \"var(--danger)\" },\r\n }[variant] || { iconColor: \"var(--fg-subtle)\" };\r\n\r\n const buttonVariant = variant === \"error\" ? \"secondary\" : \"primary\";\r\n\r\n return (\r\n <Box\r\n role={variant === \"error\" ? \"alert\" : undefined}\r\n sx={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n textAlign: \"center\",\r\n padding: \"var(--s-9) var(--s-6)\",\r\n background: \"var(--surface)\",\r\n border: \"1px solid var(--border)\",\r\n borderRadius: \"var(--r-lg)\",\r\n }}\r\n >\r\n {icon && (\r\n <Box\r\n sx={{\r\n // Icon halo size — visual element dimensions, not spacing.\r\n // Intentionally literal (not promoted to a spacing token).\r\n width: 48,\r\n height: 48,\r\n borderRadius: \"var(--r-full)\",\r\n background: \"var(--bg-subtle)\",\r\n display: \"grid\",\r\n placeItems: \"center\",\r\n color: variantStyle.iconColor,\r\n marginBottom: \"var(--s-3)\",\r\n \"& svg\": { fontSize: 24 }, // intrinsic icon size\r\n }}\r\n >\r\n {icon}\r\n </Box>\r\n )}\r\n <Typography\r\n component=\"h3\"\r\n sx={{\r\n fontSize: \"var(--text-h4)\",\r\n fontWeight: \"var(--fw-semibold)\",\r\n color: \"var(--fg)\",\r\n marginBottom: \"var(--s-1)\",\r\n lineHeight: \"var(--lh-snug)\",\r\n }}\r\n >\r\n {title}\r\n </Typography>\r\n {description && (\r\n <Typography\r\n sx={{\r\n fontSize: \"var(--text-sm)\",\r\n color: \"var(--fg-muted)\",\r\n // Readable measure (~50–60ch). Not a spacing-scale value.\r\n maxWidth: 360,\r\n marginBottom: \"var(--s-3)\",\r\n }}\r\n >\r\n {description}\r\n </Typography>\r\n )}\r\n {action && (\r\n <Button variant={action.variant || buttonVariant} icon={action.icon} onClick={action.onClick}>\r\n {action.label}\r\n </Button>\r\n )}\r\n </Box>\r\n );\r\n}\r\n\r\nexport default EmptyState;\r\n"],"mappings":"AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAC9B,OAAOC,GAAG,MAAM,mBAAmB;AACnC,OAAOC,UAAU,MAAM,0BAA0B;AACjD,OAAOC,MAAM,MAAM,UAAU;;AAG7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAhBA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAmCA,SAASC,UAAUA,CAAC;EAClBC,OAAO,GAAG,SAAS;EACnBC,IAAI;EACJC,KAAK;EACLC,WAAW;EACXC;AACe,CAAC,EAAE;EAClB,MAAMC,YAAY,GAAG;IACnBC,OAAO,EAAG;MAAEC,SAAS,EAAE;IAAmB,CAAC;IAC3CC,QAAQ,EAAE;MAAED,SAAS,EAAE;IAAmB,CAAC;IAC3CE,KAAK,EAAK;MAAEF,SAAS,EAAE;IAAmB;EAC5C,CAAC,CAACP,OAAO,CAAC,IAAI;IAAEO,SAAS,EAAE;EAAmB,CAAC;EAE/C,MAAMG,aAAa,GAAGV,OAAO,KAAK,OAAO,GAAG,WAAW,GAAG,SAAS;EAEnE,oBACEF,KAAA,CAACN,GAAG;IACFmB,IAAI,EAAEX,OAAO,KAAK,OAAO,GAAG,OAAO,GAAGY,SAAU;IAChDC,EAAE,EAAE;MACFC,OAAO,EAAE,MAAM;MACfC,aAAa,EAAE,QAAQ;MACvBC,UAAU,EAAE,QAAQ;MACpBC,SAAS,EAAE,QAAQ;MACnBC,OAAO,EAAE,uBAAuB;MAChCC,UAAU,EAAE,gBAAgB;MAC5BC,MAAM,EAAE,yBAAyB;MACjCC,YAAY,EAAE;IAChB,CAAE;IAAAC,QAAA,GAEDrB,IAAI,iBACHL,IAAA,CAACJ,GAAG;MACFqB,EAAE,EAAE;QACF;QACA;QACAU,KAAK,EAAE,EAAE;QACTC,MAAM,EAAE,EAAE;QACVH,YAAY,EAAE,eAAe;QAC7BF,UAAU,EAAE,kBAAkB;QAC9BL,OAAO,EAAE,MAAM;QACfW,UAAU,EAAE,QAAQ;QACpBC,KAAK,EAAErB,YAAY,CAACE,SAAS;QAC7BoB,YAAY,EAAE,YAAY;QAC1B,OAAO,EAAE;UAAEC,QAAQ,EAAE;QAAG,CAAC,CAAE;MAC7B,CAAE;MAAAN,QAAA,EAEDrB;IAAI,CACF,CACN,eACDL,IAAA,CAACH,UAAU;MACToC,SAAS,EAAC,IAAI;MACdhB,EAAE,EAAE;QACFe,QAAQ,EAAE,gBAAgB;QAC1BE,UAAU,EAAE,oBAAoB;QAChCJ,KAAK,EAAE,WAAW;QAClBC,YAAY,EAAE,YAAY;QAC1BI,UAAU,EAAE;MACd,CAAE;MAAAT,QAAA,EAEDpB;IAAK,CACI,CAAC,EACZC,WAAW,iBACVP,IAAA,CAACH,UAAU;MACToB,EAAE,EAAE;QACFe,QAAQ,EAAE,gBAAgB;QAC1BF,KAAK,EAAE,iBAAiB;QACxB;QACAM,QAAQ,EAAE,GAAG;QACbL,YAAY,EAAE;MAChB,CAAE;MAAAL,QAAA,EAEDnB;IAAW,CACF,CACb,EACAC,MAAM,iBACLR,IAAA,CAACF,MAAM;MAACM,OAAO,EAAEI,MAAM,CAACJ,OAAO,IAAIU,aAAc;MAACT,IAAI,EAAEG,MAAM,CAACH,IAAK;MAACgC,OAAO,EAAE7B,MAAM,CAAC6B,OAAQ;MAAAX,QAAA,EAC1FlB,MAAM,CAAC8B;IAAK,CACP,CACT;EAAA,CACE,CAAC;AAEV;AAEA,eAAenC,UAAU","ignoreList":[]}
|
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
|
2
|
-
var _excluded = ["pressed", "onChange", "size", "disabled", "labels", "sx", "aria-label"];
|
|
3
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
4
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
5
|
-
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
6
|
-
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
|
|
7
|
-
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
8
|
-
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
9
|
-
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
10
1
|
import * as React from "react";
|
|
11
2
|
import IconButton from "@mui/material/IconButton";
|
|
12
3
|
import StarRoundedIcon from "@mui/icons-material/StarRounded";
|
|
@@ -49,13 +40,13 @@ import { mergeLabels } from "../utils/mergeLabels";
|
|
|
49
40
|
* removeFavorite: "Unfollow" }} />
|
|
50
41
|
*/
|
|
51
42
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
52
|
-
|
|
43
|
+
const DEFAULT_LABELS = Object.freeze({
|
|
53
44
|
addFavorite: "Suivre",
|
|
54
45
|
removeFavorite: "Ne plus suivre"
|
|
55
46
|
});
|
|
56
47
|
// Box = interactive hit area (px, like OverflowMenu's minWidth); glyph =
|
|
57
48
|
// icon font-size inherited by the SvgIcon via fontSize="inherit".
|
|
58
|
-
|
|
49
|
+
const SIZE_MAP = Object.freeze({
|
|
59
50
|
xs: Object.freeze({
|
|
60
51
|
box: 24,
|
|
61
52
|
glyph: 16
|
|
@@ -73,35 +64,34 @@ var SIZE_MAP = Object.freeze({
|
|
|
73
64
|
glyph: 28
|
|
74
65
|
})
|
|
75
66
|
});
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
var dims = SIZE_MAP[size] || SIZE_MAP.md;
|
|
67
|
+
const FavoriteToggle = /*#__PURE__*/React.forwardRef(function FavoriteToggle({
|
|
68
|
+
pressed = false,
|
|
69
|
+
onChange,
|
|
70
|
+
size = "md",
|
|
71
|
+
disabled,
|
|
72
|
+
labels,
|
|
73
|
+
sx,
|
|
74
|
+
"aria-label": ariaLabel,
|
|
75
|
+
...rest
|
|
76
|
+
}, ref) {
|
|
77
|
+
const L = mergeLabels(DEFAULT_LABELS, labels);
|
|
78
|
+
const dims = SIZE_MAP[size] || SIZE_MAP.md;
|
|
89
79
|
// Toggle-button convention: the accessible name describes the ACTION
|
|
90
80
|
// activation performs; aria-pressed conveys the current state. Hosts can
|
|
91
81
|
// override with a richer per-row name via the `aria-label` prop.
|
|
92
|
-
|
|
93
|
-
|
|
82
|
+
const computedAria = ariaLabel || (pressed ? L.removeFavorite : L.addFavorite);
|
|
83
|
+
const handleClick = function handleClick(e) {
|
|
94
84
|
if (disabled) return;
|
|
95
85
|
if (typeof onChange === "function") onChange(!pressed, e);
|
|
96
86
|
};
|
|
97
|
-
|
|
98
|
-
return /*#__PURE__*/_jsx(IconButton,
|
|
87
|
+
const Star = pressed ? StarRoundedIcon : StarBorderRoundedIcon;
|
|
88
|
+
return /*#__PURE__*/_jsx(IconButton, {
|
|
99
89
|
ref: ref,
|
|
100
90
|
onClick: handleClick,
|
|
101
91
|
disabled: disabled,
|
|
102
92
|
"aria-pressed": !!pressed,
|
|
103
93
|
"aria-label": computedAria,
|
|
104
|
-
sx:
|
|
94
|
+
sx: {
|
|
105
95
|
width: dims.box,
|
|
106
96
|
height: dims.box,
|
|
107
97
|
fontSize: dims.glyph,
|
|
@@ -115,13 +105,14 @@ var FavoriteToggle = /*#__PURE__*/React.forwardRef(function FavoriteToggle(_ref,
|
|
|
115
105
|
},
|
|
116
106
|
"@media (prefers-reduced-motion: reduce)": {
|
|
117
107
|
transition: "none"
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
|
|
108
|
+
},
|
|
109
|
+
...sx
|
|
110
|
+
},
|
|
111
|
+
...rest,
|
|
121
112
|
children: /*#__PURE__*/_jsx(Star, {
|
|
122
113
|
fontSize: "inherit"
|
|
123
114
|
})
|
|
124
|
-
})
|
|
115
|
+
});
|
|
125
116
|
});
|
|
126
117
|
export default FavoriteToggle;
|
|
127
118
|
//# sourceMappingURL=FavoriteToggle.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FavoriteToggle.js","names":["React","IconButton","StarRoundedIcon","StarBorderRoundedIcon","mergeLabels","jsx","_jsx","DEFAULT_LABELS","Object","freeze","addFavorite","removeFavorite","SIZE_MAP","xs","box","glyph","sm","md","lg","FavoriteToggle","forwardRef","
|
|
1
|
+
{"version":3,"file":"FavoriteToggle.js","names":["React","IconButton","StarRoundedIcon","StarBorderRoundedIcon","mergeLabels","jsx","_jsx","DEFAULT_LABELS","Object","freeze","addFavorite","removeFavorite","SIZE_MAP","xs","box","glyph","sm","md","lg","FavoriteToggle","forwardRef","pressed","onChange","size","disabled","labels","sx","ariaLabel","rest","ref","L","dims","computedAria","handleClick","e","Star","onClick","width","height","fontSize","color","boxShadow","transition","children"],"sources":["../../../../src/lib/v2/components/FavoriteToggle.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport type { IconButtonProps } from \"@mui/material/IconButton\";\r\nimport StarRoundedIcon from \"@mui/icons-material/StarRounded\";\r\nimport StarBorderRoundedIcon from \"@mui/icons-material/StarBorderRounded\";\r\nimport { mergeLabels } from \"../utils/mergeLabels\";\r\n\r\n/**\r\n * FavoriteToggle - Portnet UI v2\r\n *\r\n * Charter §03 · presentational ☆/★ follow (\"suivi\") toggle. A CONTROLLED\r\n * `<button aria-pressed>` with a star glyph. The glyph is decorative\r\n * (MUI SvgIcon is aria-hidden by default); state is conveyed by\r\n * `aria-pressed` AND by glyph SHAPE (outline ☆ vs filled ★), so it never\r\n * relies on colour alone (WCAG 1.4.1 Use of Color).\r\n *\r\n * Presentational and provider-FREE by design — it keeps the leaf-vs-\r\n * personalization boundary clean and stays usable outside the foundation.\r\n * Wire it to the favorites capability:\r\n *\r\n * const { isFavorite, toggle } = useIsFavorite(\"ti:list\", row.id);\r\n * <FavoriteToggle pressed={isFavorite} onChange={toggle} size=\"sm\" />\r\n *\r\n * …or drive it from any state:\r\n *\r\n * <FavoriteToggle pressed={on} onChange={(next) => setOn(next)} />\r\n *\r\n * Touch target: md (default) = 44px (WCAG 2.5.5 AAA); sm = 32px for dense\r\n * DataGrid rows (meets 2.5.8 AA ≥ 24px, with headroom); lg = 48px; xs =\r\n * 24px — the WCAG 2.5.8 AA floor exactly, with NO headroom left. Reserve\r\n * xs for genuinely space-constrained columns where sm's 32px still\r\n * doesn't fit (e.g. a compact favorites column under a table's\r\n * table-layout:auto, where an explicit column width can't shrink the\r\n * cell below the toggle's own intrinsic box) — don't reach for it over\r\n * sm by default. The toggle renders itself unconditionally; the DataGrid\r\n * follow column (makeFavoriteColumn) wraps it with the Gmail-style hover\r\n * reveal for unfollowed rows.\r\n *\r\n * Localisation (FR / EN / AR):\r\n * <FavoriteToggle labels={{ addFavorite: \"Follow\",\r\n * removeFavorite: \"Unfollow\" }} />\r\n */\r\n\r\nconst DEFAULT_LABELS = Object.freeze({\r\n addFavorite: \"Suivre\",\r\n removeFavorite: \"Ne plus suivre\",\r\n});\r\n\r\nexport type FavoriteToggleSize = \"xs\" | \"sm\" | \"md\" | \"lg\";\r\n\r\ninterface SizeDims {\r\n box: number;\r\n glyph: number;\r\n}\r\n\r\n// Box = interactive hit area (px, like OverflowMenu's minWidth); glyph =\r\n// icon font-size inherited by the SvgIcon via fontSize=\"inherit\".\r\nconst SIZE_MAP: Record<FavoriteToggleSize, SizeDims> = Object.freeze({\r\n xs: Object.freeze({ box: 24, glyph: 16 }),\r\n sm: Object.freeze({ box: 32, glyph: 20 }),\r\n md: Object.freeze({ box: 44, glyph: 24 }),\r\n lg: Object.freeze({ box: 48, glyph: 28 }),\r\n});\r\n\r\nexport interface FavoriteToggleLabels {\r\n addFavorite?: string | undefined;\r\n removeFavorite?: string | undefined;\r\n}\r\n\r\nexport interface FavoriteToggleProps\r\n extends Omit<IconButtonProps, \"onChange\" | \"size\"> {\r\n /** Current follow state. */\r\n pressed?: boolean | undefined;\r\n /** Activation handler: (nextPressed, event) => void. */\r\n onChange?: ((nextPressed: boolean, event: React.MouseEvent<HTMLButtonElement>) => void) | undefined;\r\n /** Touch-target size. */\r\n size?: FavoriteToggleSize | undefined;\r\n /** Localised action labels (FR default; EN/AR supported). */\r\n labels?: FavoriteToggleLabels | undefined;\r\n /** Explicit accessible name; overrides the labels-derived one. */\r\n \"aria-label\"?: string | undefined;\r\n}\r\n\r\nconst FavoriteToggle = React.forwardRef<HTMLButtonElement, FavoriteToggleProps>(\r\n function FavoriteToggle(\r\n {\r\n pressed = false,\r\n onChange,\r\n size = \"md\",\r\n disabled,\r\n labels,\r\n sx,\r\n \"aria-label\": ariaLabel,\r\n ...rest\r\n },\r\n ref\r\n ) {\r\n const L = mergeLabels(DEFAULT_LABELS, labels);\r\n const dims = SIZE_MAP[size] || SIZE_MAP.md;\r\n // Toggle-button convention: the accessible name describes the ACTION\r\n // activation performs; aria-pressed conveys the current state. Hosts can\r\n // override with a richer per-row name via the `aria-label` prop.\r\n const computedAria = ariaLabel || (pressed ? L.removeFavorite : L.addFavorite);\r\n\r\n const handleClick = function handleClick(e: React.MouseEvent<HTMLButtonElement>) {\r\n if (disabled) return;\r\n if (typeof onChange === \"function\") onChange(!pressed, e);\r\n };\r\n\r\n const Star = pressed ? StarRoundedIcon : StarBorderRoundedIcon;\r\n\r\n return (\r\n <IconButton\r\n ref={ref}\r\n onClick={handleClick}\r\n disabled={disabled}\r\n aria-pressed={!!pressed}\r\n aria-label={computedAria}\r\n sx={{\r\n width: dims.box,\r\n height: dims.box,\r\n fontSize: dims.glyph,\r\n color: pressed ? \"var(--accent)\" : \"var(--fg-muted)\",\r\n \"&:hover\": { color: pressed ? \"var(--accent)\" : \"var(--fg)\" },\r\n // Reuse the canonical focus halo token (same as Switch / R-AI.1).\r\n \"&.Mui-focusVisible\": { boxShadow: \"var(--shadow-focus)\" },\r\n \"@media (prefers-reduced-motion: reduce)\": { transition: \"none\" },\r\n ...sx,\r\n }}\r\n {...rest}\r\n >\r\n <Star fontSize=\"inherit\" />\r\n </IconButton>\r\n );\r\n }\r\n);\r\n\r\nexport default FavoriteToggle;\r\n"],"mappings":"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","ignoreList":[]}
|