@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":"OverflowMenu.js","names":["React","IconButton","Menu","MenuItem","Divider","MoreHorizIcon","Box","mergeLabels","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","DEFAULT_LABELS","Object","freeze","trigger","shortcut","s","concat","MENU_SLOT_PROPS","paper","sx","minWidth","boxShadow","border","borderRadius","list","role","dense","OverflowMenu","_ref","_ref$actions","actions","ariaLabel","_ref$align","align","labels","L","triggerAria","_React$useState","useState","_React$useState2","_slicedToArray","anchor","setAnchor","open","Boolean","process","env","length","console","warn","handleOpen","e","currentTarget","handleClose","triggerNode","cloneElement","onClick","event","_onClick","_ref2","props","call","size","color","children","fontSize","anchorEl","onClose","anchorOrigin","vertical","horizontal","transformOrigin","slotProps","map","a","i","divider","borderColor","disabled","_a$onClick","danger","background","undefined","gap","icon","display","flex","label","component","padding","fontFamily"],"sources":["../../../../src/lib/v2/components/OverflowMenu.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport Menu from \"@mui/material/Menu\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\nimport Divider from \"@mui/material/Divider\";\r\nimport MoreHorizIcon from \"@mui/icons-material/MoreHoriz\";\r\nimport Box from \"@mui/material/Box\";\r\nimport { mergeLabels } from \"../utils/mergeLabels\";\r\n\r\n/**\r\n * OverflowMenu - Portnet UI v2\r\n *\r\n * Charter §03 · Component \"OverflowMenu\". ARIA menu for ancillary row actions.\r\n *\r\n * Max 7 items · separator before danger · kbd shortcut visible right.\r\n *\r\n * <OverflowMenu actions={[\r\n * { label: \"Voir le détail\", icon: <Visibility />, onClick: open, shortcut: \"↵\" },\r\n * { label: \"Modifier\", icon: <Edit />, onClick: edit },\r\n * { divider: true },\r\n * { label: \"Supprimer\", icon: <Delete />, onClick: remove, danger: true, shortcut: \"⌫\" },\r\n * ]} />\r\n *\r\n * Localisation (FR / EN / AR):\r\n * <OverflowMenu labels={{\r\n * trigger: \"More actions\",\r\n * shortcut: (s) => `Shortcut ${s}`,\r\n * }} />\r\n *\r\n * The legacy `ariaLabel` prop still wins over labels.trigger when\r\n * both are passed, for back-compat.\r\n */\r\n\r\nexport interface OverflowMenuAction {\r\n label?: React.ReactNode | undefined;\r\n /** Rendered directly (no cloneElement) — any renderable node. */\r\n icon?: React.ReactNode | undefined;\r\n onClick?: (() => void) | undefined;\r\n shortcut?: React.ReactNode | undefined;\r\n danger?: boolean | undefined;\r\n disabled?: boolean | undefined;\r\n divider?: boolean | undefined;\r\n}\r\n\r\nexport interface OverflowMenuLabels {\r\n trigger?: string | undefined;\r\n shortcut?: string | ((shortcut: React.ReactNode) => string) | undefined;\r\n}\r\n\r\nexport interface OverflowMenuProps {\r\n /** Row actions. Charter recommends ≤ 7. @default [] */\r\n actions?: OverflowMenuAction[] | undefined;\r\n /**\r\n * Custom trigger element. Cloned via React.cloneElement to inject the\r\n * open handler + aria-haspopup/aria-expanded (must be a single element).\r\n */\r\n trigger?: React.ReactElement | undefined;\r\n /** Legacy accessible name for the default trigger (wins over labels.trigger). */\r\n ariaLabel?: string | undefined;\r\n /** Menu alignment. @default \"right\" */\r\n align?: \"left\" | \"right\" | undefined;\r\n labels?: OverflowMenuLabels | undefined;\r\n}\r\n\r\nconst DEFAULT_LABELS = Object.freeze({\r\n trigger: \"Plus d'actions\",\r\n shortcut: (s: React.ReactNode) => `Raccourci ${s}`,\r\n});\r\n\r\n// MUI v9: slot bag for the Menu. The component already used slotProps.paper\r\n// for the paper slot; this commit moves MenuListProps onto the same path\r\n// via the `list` slot key. Hoisted so the reference is stable across\r\n// renders. `role: \"menu\" as const` keeps the AriaRole literal.\r\nconst MENU_SLOT_PROPS = Object.freeze({\r\n paper: {\r\n sx: {\r\n minWidth: 200,\r\n boxShadow: \"var(--shadow-md)\",\r\n border: \"1px solid var(--border)\",\r\n borderRadius: \"var(--r-md)\",\r\n },\r\n },\r\n list: { role: \"menu\" as const, dense: true },\r\n});\r\n\r\nfunction OverflowMenu({\r\n actions = [],\r\n trigger,\r\n ariaLabel,\r\n align = \"right\",\r\n labels,\r\n}: OverflowMenuProps) {\r\n const L = mergeLabels(DEFAULT_LABELS, labels);\r\n // Legacy ariaLabel prop wins over labels.trigger.\r\n const triggerAria = ariaLabel ?? L.trigger;\r\n\r\n const [anchor, setAnchor] = React.useState<HTMLElement | null>(null);\r\n const open = Boolean(anchor);\r\n\r\n if (process.env[\"NODE_ENV\"] !== \"production\" && actions.length > 7) {\r\n // eslint-disable-next-line no-console\r\n console.warn(\"[@portnet/ui v2] <OverflowMenu> over 7 items - charter recommends ≤ 7.\");\r\n }\r\n\r\n const handleOpen = (e: React.MouseEvent<HTMLElement>) => setAnchor(e.currentTarget);\r\n const handleClose = () => setAnchor(null);\r\n\r\n // R-2.1 - when a host passes a custom trigger, preserve its existing\r\n // onClick (analytics, focus capture, optimistic UI etc.) by chaining\r\n // it before our handleOpen. Without this, cloneElement silently\r\n // overwrites the host's handler.\r\n const triggerNode = trigger\r\n ? React.cloneElement(trigger as React.ReactElement<Record<string, unknown>>, {\r\n onClick: (event: React.MouseEvent<HTMLElement>) => {\r\n (trigger.props as { onClick?: (e: React.MouseEvent<HTMLElement>) => void }).onClick?.(event);\r\n handleOpen(event);\r\n },\r\n \"aria-haspopup\": \"menu\",\r\n \"aria-expanded\": open,\r\n })\r\n : (\r\n <IconButton\r\n onClick={handleOpen}\r\n aria-label={triggerAria}\r\n aria-haspopup=\"menu\"\r\n aria-expanded={open}\r\n size=\"small\"\r\n sx={{ color: \"var(--fg-muted)\" }}\r\n >\r\n <MoreHorizIcon fontSize=\"small\" />\r\n </IconButton>\r\n );\r\n\r\n return (\r\n <>\r\n {triggerNode}\r\n <Menu\r\n anchorEl={anchor}\r\n open={open}\r\n onClose={handleClose}\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: align === \"right\" ? \"right\" : \"left\" }}\r\n transformOrigin={{ vertical: \"top\", horizontal: align === \"right\" ? \"right\" : \"left\" }}\r\n slotProps={MENU_SLOT_PROPS}\r\n >\r\n {actions.map((a, i) => {\r\n if (a.divider) return <Divider key={`d-${i}`} sx={{ borderColor: \"var(--border)\" }} />;\r\n return (\r\n <MenuItem\r\n key={i}\r\n role=\"menuitem\"\r\n disabled={a.disabled}\r\n onClick={() => { handleClose(); a.onClick?.(); }}\r\n sx={{\r\n fontSize: \"var(--text-sm)\",\r\n color: a.danger ? \"var(--danger)\" : \"var(--fg)\",\r\n \"&:hover\": a.danger ? { background: \"var(--danger-soft)\" } : undefined,\r\n gap: 1.5,\r\n }}\r\n >\r\n {a.icon && <Box sx={{ display: \"inline-flex\", color: a.danger ? \"var(--danger)\" : \"var(--fg-muted)\" }}>{a.icon}</Box>}\r\n <Box sx={{ flex: 1 }}>{a.label}</Box>\r\n {a.shortcut && (\r\n <Box\r\n component=\"kbd\"\r\n aria-label={typeof L.shortcut === \"function\" ? L.shortcut(a.shortcut) : `${L.shortcut} ${a.shortcut}`}\r\n sx={{\r\n fontSize: \"var(--text-xs)\",\r\n color: \"var(--fg-subtle)\",\r\n background: \"var(--bg-subtle)\",\r\n border: \"1px solid var(--border)\",\r\n borderRadius: \"var(--r-sm)\",\r\n padding: \"1px var(--s-2)\",\r\n fontFamily: \"var(--font-mono)\",\r\n }}\r\n >\r\n {a.shortcut}\r\n </Box>\r\n )}\r\n </MenuItem>\r\n );\r\n })}\r\n </Menu>\r\n </>\r\n );\r\n}\r\n\r\nexport default OverflowMenu;\r\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"OverflowMenu.js","names":["React","IconButton","Menu","MenuItem","Divider","MoreHorizIcon","Box","mergeLabels","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","DEFAULT_LABELS","Object","freeze","trigger","shortcut","s","MENU_SLOT_PROPS","paper","sx","minWidth","boxShadow","border","borderRadius","list","role","dense","OverflowMenu","actions","ariaLabel","align","labels","L","triggerAria","anchor","setAnchor","useState","open","Boolean","process","env","length","console","warn","handleOpen","e","currentTarget","handleClose","triggerNode","cloneElement","onClick","event","props","size","color","children","fontSize","anchorEl","onClose","anchorOrigin","vertical","horizontal","transformOrigin","slotProps","map","a","i","divider","borderColor","disabled","danger","background","undefined","gap","icon","display","flex","label","component","padding","fontFamily"],"sources":["../../../../src/lib/v2/components/OverflowMenu.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport Menu from \"@mui/material/Menu\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\nimport Divider from \"@mui/material/Divider\";\r\nimport MoreHorizIcon from \"@mui/icons-material/MoreHoriz\";\r\nimport Box from \"@mui/material/Box\";\r\nimport { mergeLabels } from \"../utils/mergeLabels\";\r\n\r\n/**\r\n * OverflowMenu - Portnet UI v2\r\n *\r\n * Charter §03 · Component \"OverflowMenu\". ARIA menu for ancillary row actions.\r\n *\r\n * Max 7 items · separator before danger · kbd shortcut visible right.\r\n *\r\n * <OverflowMenu actions={[\r\n * { label: \"Voir le détail\", icon: <Visibility />, onClick: open, shortcut: \"↵\" },\r\n * { label: \"Modifier\", icon: <Edit />, onClick: edit },\r\n * { divider: true },\r\n * { label: \"Supprimer\", icon: <Delete />, onClick: remove, danger: true, shortcut: \"⌫\" },\r\n * ]} />\r\n *\r\n * Localisation (FR / EN / AR):\r\n * <OverflowMenu labels={{\r\n * trigger: \"More actions\",\r\n * shortcut: (s) => `Shortcut ${s}`,\r\n * }} />\r\n *\r\n * The legacy `ariaLabel` prop still wins over labels.trigger when\r\n * both are passed, for back-compat.\r\n */\r\n\r\nexport interface OverflowMenuAction {\r\n label?: React.ReactNode | undefined;\r\n /** Rendered directly (no cloneElement) — any renderable node. */\r\n icon?: React.ReactNode | undefined;\r\n onClick?: (() => void) | undefined;\r\n shortcut?: React.ReactNode | undefined;\r\n danger?: boolean | undefined;\r\n disabled?: boolean | undefined;\r\n divider?: boolean | undefined;\r\n}\r\n\r\nexport interface OverflowMenuLabels {\r\n trigger?: string | undefined;\r\n shortcut?: string | ((shortcut: React.ReactNode) => string) | undefined;\r\n}\r\n\r\nexport interface OverflowMenuProps {\r\n /** Row actions. Charter recommends ≤ 7. @default [] */\r\n actions?: OverflowMenuAction[] | undefined;\r\n /**\r\n * Custom trigger element. Cloned via React.cloneElement to inject the\r\n * open handler + aria-haspopup/aria-expanded (must be a single element).\r\n */\r\n trigger?: React.ReactElement | undefined;\r\n /** Legacy accessible name for the default trigger (wins over labels.trigger). */\r\n ariaLabel?: string | undefined;\r\n /** Menu alignment. @default \"right\" */\r\n align?: \"left\" | \"right\" | undefined;\r\n labels?: OverflowMenuLabels | undefined;\r\n}\r\n\r\nconst DEFAULT_LABELS = Object.freeze({\r\n trigger: \"Plus d'actions\",\r\n shortcut: (s: React.ReactNode) => `Raccourci ${s}`,\r\n});\r\n\r\n// MUI v9: slot bag for the Menu. The component already used slotProps.paper\r\n// for the paper slot; this commit moves MenuListProps onto the same path\r\n// via the `list` slot key. Hoisted so the reference is stable across\r\n// renders. `role: \"menu\" as const` keeps the AriaRole literal.\r\nconst MENU_SLOT_PROPS = Object.freeze({\r\n paper: {\r\n sx: {\r\n minWidth: 200,\r\n boxShadow: \"var(--shadow-md)\",\r\n border: \"1px solid var(--border)\",\r\n borderRadius: \"var(--r-md)\",\r\n },\r\n },\r\n list: { role: \"menu\" as const, dense: true },\r\n});\r\n\r\nfunction OverflowMenu({\r\n actions = [],\r\n trigger,\r\n ariaLabel,\r\n align = \"right\",\r\n labels,\r\n}: OverflowMenuProps) {\r\n const L = mergeLabels(DEFAULT_LABELS, labels);\r\n // Legacy ariaLabel prop wins over labels.trigger.\r\n const triggerAria = ariaLabel ?? L.trigger;\r\n\r\n const [anchor, setAnchor] = React.useState<HTMLElement | null>(null);\r\n const open = Boolean(anchor);\r\n\r\n if (process.env[\"NODE_ENV\"] !== \"production\" && actions.length > 7) {\r\n // eslint-disable-next-line no-console\r\n console.warn(\"[@portnet/ui v2] <OverflowMenu> over 7 items - charter recommends ≤ 7.\");\r\n }\r\n\r\n const handleOpen = (e: React.MouseEvent<HTMLElement>) => setAnchor(e.currentTarget);\r\n const handleClose = () => setAnchor(null);\r\n\r\n // R-2.1 - when a host passes a custom trigger, preserve its existing\r\n // onClick (analytics, focus capture, optimistic UI etc.) by chaining\r\n // it before our handleOpen. Without this, cloneElement silently\r\n // overwrites the host's handler.\r\n const triggerNode = trigger\r\n ? React.cloneElement(trigger as React.ReactElement<Record<string, unknown>>, {\r\n onClick: (event: React.MouseEvent<HTMLElement>) => {\r\n (trigger.props as { onClick?: (e: React.MouseEvent<HTMLElement>) => void }).onClick?.(event);\r\n handleOpen(event);\r\n },\r\n \"aria-haspopup\": \"menu\",\r\n \"aria-expanded\": open,\r\n })\r\n : (\r\n <IconButton\r\n onClick={handleOpen}\r\n aria-label={triggerAria}\r\n aria-haspopup=\"menu\"\r\n aria-expanded={open}\r\n size=\"small\"\r\n sx={{ color: \"var(--fg-muted)\" }}\r\n >\r\n <MoreHorizIcon fontSize=\"small\" />\r\n </IconButton>\r\n );\r\n\r\n return (\r\n <>\r\n {triggerNode}\r\n <Menu\r\n anchorEl={anchor}\r\n open={open}\r\n onClose={handleClose}\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: align === \"right\" ? \"right\" : \"left\" }}\r\n transformOrigin={{ vertical: \"top\", horizontal: align === \"right\" ? \"right\" : \"left\" }}\r\n slotProps={MENU_SLOT_PROPS}\r\n >\r\n {actions.map((a, i) => {\r\n if (a.divider) return <Divider key={`d-${i}`} sx={{ borderColor: \"var(--border)\" }} />;\r\n return (\r\n <MenuItem\r\n key={i}\r\n role=\"menuitem\"\r\n disabled={a.disabled}\r\n onClick={() => { handleClose(); a.onClick?.(); }}\r\n sx={{\r\n fontSize: \"var(--text-sm)\",\r\n color: a.danger ? \"var(--danger)\" : \"var(--fg)\",\r\n \"&:hover\": a.danger ? { background: \"var(--danger-soft)\" } : undefined,\r\n gap: 1.5,\r\n }}\r\n >\r\n {a.icon && <Box sx={{ display: \"inline-flex\", color: a.danger ? \"var(--danger)\" : \"var(--fg-muted)\" }}>{a.icon}</Box>}\r\n <Box sx={{ flex: 1 }}>{a.label}</Box>\r\n {a.shortcut && (\r\n <Box\r\n component=\"kbd\"\r\n aria-label={typeof L.shortcut === \"function\" ? L.shortcut(a.shortcut) : `${L.shortcut} ${a.shortcut}`}\r\n sx={{\r\n fontSize: \"var(--text-xs)\",\r\n color: \"var(--fg-subtle)\",\r\n background: \"var(--bg-subtle)\",\r\n border: \"1px solid var(--border)\",\r\n borderRadius: \"var(--r-sm)\",\r\n padding: \"1px var(--s-2)\",\r\n fontFamily: \"var(--font-mono)\",\r\n }}\r\n >\r\n {a.shortcut}\r\n </Box>\r\n )}\r\n </MenuItem>\r\n );\r\n })}\r\n </Menu>\r\n </>\r\n );\r\n}\r\n\r\nexport default OverflowMenu;\r\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -36,28 +36,21 @@ import "@react-pdf-viewer/default-layout/lib/styles/index.css";
|
|
|
36
36
|
* bundle cost for the rest of the platform.
|
|
37
37
|
*/
|
|
38
38
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
39
|
-
function PdfViewer(
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
_ref$ariaLabel = _ref.ariaLabel,
|
|
55
|
-
ariaLabel = _ref$ariaLabel === void 0 ? "Document PDF" : _ref$ariaLabel;
|
|
56
|
-
var layoutPlugin = React.useMemo(function () {
|
|
57
|
-
return defaultLayoutPlugin();
|
|
58
|
-
}, []);
|
|
59
|
-
var src = fileUrl !== null && fileUrl !== void 0 ? fileUrl : base64 ? "data:application/pdf;base64,".concat(base64) : undefined;
|
|
60
|
-
var body;
|
|
39
|
+
function PdfViewer({
|
|
40
|
+
fileUrl,
|
|
41
|
+
base64,
|
|
42
|
+
workerUrl,
|
|
43
|
+
loading = false,
|
|
44
|
+
error,
|
|
45
|
+
errorTitle = "Échec du chargement du document",
|
|
46
|
+
emptyLabel = "Aucun document à afficher.",
|
|
47
|
+
height = "75vh",
|
|
48
|
+
defaultScale = 0.95,
|
|
49
|
+
ariaLabel = "Document PDF"
|
|
50
|
+
}) {
|
|
51
|
+
const layoutPlugin = React.useMemo(() => defaultLayoutPlugin(), []);
|
|
52
|
+
const src = fileUrl ?? (base64 ? `data:application/pdf;base64,${base64}` : undefined);
|
|
53
|
+
let body;
|
|
61
54
|
if (loading) {
|
|
62
55
|
body = /*#__PURE__*/_jsx(Box, {
|
|
63
56
|
sx: {
|
|
@@ -86,23 +79,21 @@ function PdfViewer(_ref) {
|
|
|
86
79
|
sx: {
|
|
87
80
|
border: "1px solid var(--border)",
|
|
88
81
|
borderRadius: "var(--r-md)",
|
|
89
|
-
height
|
|
82
|
+
height,
|
|
90
83
|
width: "100%"
|
|
91
84
|
},
|
|
92
85
|
children: /*#__PURE__*/_jsx(Viewer, {
|
|
93
86
|
fileUrl: src,
|
|
94
87
|
plugins: [layoutPlugin],
|
|
95
88
|
defaultScale: defaultScale,
|
|
96
|
-
renderLoader:
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
});
|
|
105
|
-
}
|
|
89
|
+
renderLoader: percentages => /*#__PURE__*/_jsx(Box, {
|
|
90
|
+
sx: {
|
|
91
|
+
width: 240
|
|
92
|
+
},
|
|
93
|
+
children: /*#__PURE__*/_jsx(ProgressBar, {
|
|
94
|
+
progress: Math.round(percentages)
|
|
95
|
+
})
|
|
96
|
+
})
|
|
106
97
|
})
|
|
107
98
|
})
|
|
108
99
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PdfViewer.js","names":["React","Box","Viewer","Worker","ProgressBar","defaultLayoutPlugin","Spinner","Banner","jsx","_jsx","PdfViewer","
|
|
1
|
+
{"version":3,"file":"PdfViewer.js","names":["React","Box","Viewer","Worker","ProgressBar","defaultLayoutPlugin","Spinner","Banner","jsx","_jsx","PdfViewer","fileUrl","base64","workerUrl","loading","error","errorTitle","emptyLabel","height","defaultScale","ariaLabel","layoutPlugin","useMemo","src","undefined","body","sx","display","placeItems","minHeight","width","children","variant","title","border","borderRadius","plugins","renderLoader","percentages","progress","Math","round","role","justifyContent"],"sources":["../../../../src/lib/v2/components/PdfViewer.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport Box from \"@mui/material/Box\";\r\nimport { Viewer, Worker, ProgressBar } from \"@react-pdf-viewer/core\";\r\nimport { defaultLayoutPlugin } from \"@react-pdf-viewer/default-layout\";\r\nimport Spinner from \"./Spinner\";\r\nimport Banner from \"./Banner\";\r\n\r\nimport \"@react-pdf-viewer/core/lib/styles/index.css\";\r\nimport \"@react-pdf-viewer/default-layout/lib/styles/index.css\";\r\n\r\n/**\r\n * PdfViewer — Portnet UI v2\r\n *\r\n * Charter §07 · document viewing / §04.4 · loading & empty states.\r\n *\r\n * Presentational, store- and router-agnostic wrapper over @react-pdf-viewer\r\n * (pdf.js). The HOST owns fetching: pass a ready `fileUrl` (http(s) or `data:`\r\n * URL) OR a raw `base64` payload, plus the externally-controlled `loading` /\r\n * `error` flags and the pdf.js `workerUrl`. No redux, no dispatch, no config\r\n * import — that is exactly what lets it live in the shared library.\r\n *\r\n * <PdfViewer\r\n * base64={pdf}\r\n * loading={isLoading}\r\n * error={failed && \"Le document n'a pas pu être chargé.\"}\r\n * workerUrl={cfg.pdfWorkerUrl}\r\n * />\r\n *\r\n * State precedence: loading → error → (no source) → viewer.\r\n * - loading → v2.Spinner (charter §04.4: no ad-hoc CircularProgress).\r\n * - error → v2.Banner variant=\"error\" (R-A.2 alert semantics).\r\n * - no src → v2.Banner variant=\"info\" (empty).\r\n *\r\n * Dependency note (RFC): pulls @react-pdf-viewer/core,\r\n * @react-pdf-viewer/default-layout and pdfjs-dist. Declared as OPTIONAL peer\r\n * dependencies — only PDF-consuming modules install them, so there is no\r\n * bundle cost for the rest of the platform.\r\n */\r\n\r\nexport interface PdfViewerProps {\r\n /** Full URL or `data:` URL of the PDF. Takes precedence over `base64`. */\r\n fileUrl?: string | undefined;\r\n /** Raw base64 PDF payload (without the `data:application/pdf;base64,` prefix). */\r\n base64?: string | undefined;\r\n /** pdf.js worker URL — host-provided (e.g. from runtime config). */\r\n workerUrl: string;\r\n /** Show the loading spinner instead of the viewer. */\r\n loading?: boolean | undefined;\r\n /** When truthy, shows an error Banner (this node is the message) instead of the viewer. */\r\n error?: React.ReactNode | undefined;\r\n /** Error banner title. Default \"Échec du chargement du document\". */\r\n errorTitle?: React.ReactNode | undefined;\r\n /** Message shown when there is no source and no loading/error. */\r\n emptyLabel?: React.ReactNode | undefined;\r\n /** Viewer container height. Default \"75vh\". */\r\n height?: number | string | undefined;\r\n /** Initial zoom. Default 0.95. */\r\n defaultScale?: number | undefined;\r\n /** Accessible label for the viewer region. Default \"Document PDF\". */\r\n ariaLabel?: string | undefined;\r\n}\r\n\r\nfunction PdfViewer({\r\n fileUrl,\r\n base64,\r\n workerUrl,\r\n loading = false,\r\n error,\r\n errorTitle = \"Échec du chargement du document\",\r\n emptyLabel = \"Aucun document à afficher.\",\r\n height = \"75vh\",\r\n defaultScale = 0.95,\r\n ariaLabel = \"Document PDF\",\r\n}: PdfViewerProps) {\r\n const layoutPlugin = React.useMemo(() => defaultLayoutPlugin(), []);\r\n const src = fileUrl ?? (base64 ? `data:application/pdf;base64,${base64}` : undefined);\r\n\r\n let body: React.ReactNode;\r\n if (loading) {\r\n body = (\r\n <Box sx={{ display: \"grid\", placeItems: \"center\", minHeight: 200, width: \"100%\" }}>\r\n <Spinner />\r\n </Box>\r\n );\r\n } else if (error) {\r\n body = (\r\n <Banner variant=\"error\" title={errorTitle}>\r\n {error}\r\n </Banner>\r\n );\r\n } else if (!src) {\r\n body = <Banner variant=\"info\">{emptyLabel}</Banner>;\r\n } else {\r\n body = (\r\n <Worker workerUrl={workerUrl}>\r\n <Box\r\n sx={{\r\n border: \"1px solid var(--border)\",\r\n borderRadius: \"var(--r-md)\",\r\n height,\r\n width: \"100%\",\r\n }}\r\n >\r\n <Viewer\r\n fileUrl={src}\r\n plugins={[layoutPlugin]}\r\n defaultScale={defaultScale}\r\n renderLoader={(percentages: number) => (\r\n <Box sx={{ width: 240 }}>\r\n <ProgressBar progress={Math.round(percentages)} />\r\n </Box>\r\n )}\r\n />\r\n </Box>\r\n </Worker>\r\n );\r\n }\r\n\r\n return (\r\n <Box\r\n role=\"region\"\r\n aria-label={ariaLabel}\r\n sx={{ display: \"flex\", justifyContent: \"center\", width: \"100%\" }}\r\n >\r\n {body}\r\n </Box>\r\n );\r\n}\r\n\r\nexport default PdfViewer;\r\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,9 +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
|
-
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; }
|
|
3
|
-
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; }
|
|
4
|
-
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; }
|
|
5
|
-
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
|
|
6
|
-
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); }
|
|
7
1
|
import * as React from "react";
|
|
8
2
|
import Box from "@mui/material/Box";
|
|
9
3
|
|
|
@@ -42,39 +36,36 @@ import Box from "@mui/material/Box";
|
|
|
42
36
|
* helper="3 sur 6 fichiers traités" />
|
|
43
37
|
*/
|
|
44
38
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
45
|
-
|
|
39
|
+
const VARIANT_COLOR = {
|
|
46
40
|
primary: "var(--accent)",
|
|
47
41
|
success: "var(--success)",
|
|
48
42
|
warning: "var(--warning)",
|
|
49
43
|
danger: "var(--danger)"
|
|
50
44
|
};
|
|
51
|
-
|
|
45
|
+
const SIZE_HEIGHT = {
|
|
52
46
|
sm: 4,
|
|
53
47
|
md: 6,
|
|
54
48
|
lg: 8
|
|
55
49
|
};
|
|
56
|
-
function ProgressBar(
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
ariaLabel = _ref["aria-label"],
|
|
69
|
-
ariaLabelledBy = _ref["aria-labelledby"],
|
|
70
|
-
sx = _ref.sx;
|
|
50
|
+
function ProgressBar({
|
|
51
|
+
value,
|
|
52
|
+
indeterminate = false,
|
|
53
|
+
variant = "primary",
|
|
54
|
+
size = "md",
|
|
55
|
+
label,
|
|
56
|
+
helper,
|
|
57
|
+
showLabel = false,
|
|
58
|
+
"aria-label": ariaLabel,
|
|
59
|
+
"aria-labelledby": ariaLabelledBy,
|
|
60
|
+
sx
|
|
61
|
+
}) {
|
|
71
62
|
// Defensive clamp: callers occasionally pass over-range values (e.g. 102%
|
|
72
63
|
// from rounding). Charter forbids surprising the user — clamp instead of
|
|
73
64
|
// overflowing the track visually.
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
65
|
+
const isDet = !indeterminate && value != null;
|
|
66
|
+
const clamped = isDet ? Math.max(0, Math.min(100, Number(value) || 0)) : 0;
|
|
67
|
+
const fill = VARIANT_COLOR[variant] || VARIANT_COLOR.primary;
|
|
68
|
+
const height = SIZE_HEIGHT[size] || SIZE_HEIGHT.md;
|
|
78
69
|
if (process.env["NODE_ENV"] !== "production" && !ariaLabel && !ariaLabelledBy && !label) {
|
|
79
70
|
// eslint-disable-next-line no-console
|
|
80
71
|
console.warn("[@portnet/ui v2] <ProgressBar> requires aria-label, aria-labelledby, or a `label` prop for screen readers.");
|
|
@@ -84,14 +75,15 @@ function ProgressBar(_ref) {
|
|
|
84
75
|
// so the caller doesn't have to manage the id themselves.
|
|
85
76
|
// If `helper` is rendered, wire it via aria-describedby on the
|
|
86
77
|
// progressbar so the qualitative context reaches AT. Audit Batch 5.
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
78
|
+
const reactId = React.useId();
|
|
79
|
+
const labelId = label ? `${reactId}-lbl` : undefined;
|
|
80
|
+
const helperId = helper ? `${reactId}-hlp` : undefined;
|
|
81
|
+
const effectiveLabelledBy = ariaLabelledBy || labelId;
|
|
91
82
|
return /*#__PURE__*/_jsxs(Box, {
|
|
92
|
-
sx:
|
|
93
|
-
width: "100%"
|
|
94
|
-
|
|
83
|
+
sx: {
|
|
84
|
+
width: "100%",
|
|
85
|
+
...sx
|
|
86
|
+
},
|
|
95
87
|
children: [(label || isDet && showLabel) && /*#__PURE__*/_jsxs(Box, {
|
|
96
88
|
sx: {
|
|
97
89
|
display: "flex",
|
|
@@ -133,7 +125,7 @@ function ProgressBar(_ref) {
|
|
|
133
125
|
sx: {
|
|
134
126
|
position: "relative",
|
|
135
127
|
width: "100%",
|
|
136
|
-
height
|
|
128
|
+
height,
|
|
137
129
|
borderRadius: "var(--r-full)",
|
|
138
130
|
background: "var(--bg-subtle)",
|
|
139
131
|
overflow: "hidden"
|
|
@@ -142,7 +134,7 @@ function ProgressBar(_ref) {
|
|
|
142
134
|
"aria-hidden": "true",
|
|
143
135
|
sx: {
|
|
144
136
|
height: "100%",
|
|
145
|
-
width:
|
|
137
|
+
width: `${clamped}%`,
|
|
146
138
|
background: fill,
|
|
147
139
|
borderRadius: "inherit",
|
|
148
140
|
transition: "width var(--duration-base, 180ms) var(--easing-out, cubic-bezier(.2,.8,.2,1))"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProgressBar.js","names":["React","Box","jsx","_jsx","jsxs","_jsxs","VARIANT_COLOR","primary","success","warning","danger","SIZE_HEIGHT","sm","md","lg","ProgressBar","_ref","value","_ref$indeterminate","indeterminate","_ref$variant","variant","_ref$size","size","label","helper","_ref$showLabel","showLabel","ariaLabel","ariaLabelledBy","sx","isDet","clamped","Math","max","min","Number","fill","height","process","env","console","warn","reactId","useId","labelId","concat","undefined","helperId","effectiveLabelledBy","_objectSpread","width","children","display","alignItems","justifyContent","gap","marginBottom","id","component","fontSize","fontWeight","color","lineHeight","fontVariantNumeric","marginLeft","round","role","position","borderRadius","background","overflow","transition","inset","content","top","bottom","left","willChange","animation","transform","marginTop"],"sources":["../../../../src/lib/v2/components/ProgressBar.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport Box from \"@mui/material/Box\";\r\nimport type { SxProps, Theme } from \"@mui/material/styles\";\r\n\r\n/**\r\n * ProgressBar — Portnet UI v2\r\n *\r\n * Charter §03 · Component \"ProgressBar\". Determinate or indeterminate\r\n * progress indicator for chunked operations (uploads, batch jobs,\r\n * long-running form steps) where a Skeleton is not appropriate.\r\n *\r\n * R-Sk usage rule (charter §03 Skeleton): \"Use ProgressBar (not\r\n * skeleton) for operations whose duration is known and where the user\r\n * benefits from a percentage signal — e.g. file uploads, batch\r\n * exports, multi-step ingestion.\"\r\n *\r\n * a11y:\r\n * - role=\"progressbar\"\r\n * - Determinate: aria-valuenow / aria-valuemin / aria-valuemax (charter R-Ar)\r\n * - Indeterminate: aria-valuenow OMITTED (WAI-ARIA convention)\r\n * - aria-label or aria-labelledby (caller responsibility — provide one)\r\n * - aria-describedby wires the `helper` text into the AT tree so SR\r\n * users hear the qualitative context (\"3 sur 6 fichiers traités\")\r\n * alongside the quantitative one (\"42 %\"). Audit Batch 5 / B5-2.\r\n *\r\n * Examples:\r\n *\r\n * <ProgressBar value={42} aria-label=\"Téléversement en cours\" />\r\n *\r\n * <ProgressBar value={87} variant=\"success\" showLabel\r\n * aria-label=\"Indexation des documents\" />\r\n *\r\n * <ProgressBar indeterminate aria-label=\"Connexion au serveur\" />\r\n *\r\n * <ProgressBar value={50} size=\"lg\" variant=\"warning\"\r\n * label=\"Synchronisation BAM\"\r\n * helper=\"3 sur 6 fichiers traités\" />\r\n */\r\n\r\nexport type ProgressBarVariant = \"primary\" | \"success\" | \"warning\" | \"danger\";\r\nexport type ProgressBarSize = \"sm\" | \"md\" | \"lg\";\r\n\r\nconst VARIANT_COLOR: Record<ProgressBarVariant, string> = {\r\n primary: \"var(--accent)\",\r\n success: \"var(--success)\",\r\n warning: \"var(--warning)\",\r\n danger: \"var(--danger)\",\r\n};\r\n\r\nconst SIZE_HEIGHT: Record<ProgressBarSize, number> = { sm: 4, md: 6, lg: 8 };\r\n\r\nexport interface ProgressBarProps {\r\n value?: number | undefined;\r\n indeterminate?: boolean | undefined;\r\n variant?: ProgressBarVariant | undefined;\r\n size?: ProgressBarSize | undefined;\r\n label?: React.ReactNode | undefined;\r\n helper?: React.ReactNode | undefined;\r\n showLabel?: boolean | undefined;\r\n \"aria-label\"?: string | undefined;\r\n \"aria-labelledby\"?: string | undefined;\r\n sx?: SxProps<Theme> | undefined;\r\n}\r\n\r\nfunction ProgressBar({\r\n value,\r\n indeterminate = false,\r\n variant = \"primary\",\r\n size = \"md\",\r\n label,\r\n helper,\r\n showLabel = false,\r\n \"aria-label\": ariaLabel,\r\n \"aria-labelledby\": ariaLabelledBy,\r\n sx,\r\n}: ProgressBarProps) {\r\n // Defensive clamp: callers occasionally pass over-range values (e.g. 102%\r\n // from rounding). Charter forbids surprising the user — clamp instead of\r\n // overflowing the track visually.\r\n const isDet = !indeterminate && value != null;\r\n const clamped = isDet ? Math.max(0, Math.min(100, Number(value) || 0)) : 0;\r\n const fill = VARIANT_COLOR[variant] || VARIANT_COLOR.primary;\r\n const height = SIZE_HEIGHT[size] || SIZE_HEIGHT.md;\r\n\r\n if (process.env[\"NODE_ENV\"] !== \"production\" && !ariaLabel && !ariaLabelledBy && !label) {\r\n // eslint-disable-next-line no-console\r\n console.warn(\r\n \"[@portnet/ui v2] <ProgressBar> requires aria-label, aria-labelledby, or a `label` prop for screen readers.\"\r\n );\r\n }\r\n\r\n // If an inline `label` is rendered we wire aria-labelledby internally\r\n // so the caller doesn't have to manage the id themselves.\r\n // If `helper` is rendered, wire it via aria-describedby on the\r\n // progressbar so the qualitative context reaches AT. Audit Batch 5.\r\n const reactId = React.useId();\r\n const labelId = label ? `${reactId}-lbl` : undefined;\r\n const helperId = helper ? `${reactId}-hlp` : undefined;\r\n const effectiveLabelledBy = ariaLabelledBy || labelId;\r\n\r\n return (\r\n <Box sx={{ width: \"100%\", ...sx }}>\r\n {(label || (isDet && showLabel)) && (\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n alignItems: \"baseline\",\r\n justifyContent: \"space-between\",\r\n gap: 1,\r\n marginBottom: 0.5,\r\n }}\r\n >\r\n {label && (\r\n <Box\r\n id={labelId}\r\n component=\"span\"\r\n sx={{\r\n fontSize: \"var(--text-sm)\",\r\n fontWeight: \"var(--fw-semibold)\",\r\n color: \"var(--fg)\",\r\n lineHeight: \"var(--lh-snug)\",\r\n }}\r\n >\r\n {label}\r\n </Box>\r\n )}\r\n {isDet && showLabel && (\r\n <Box\r\n component=\"span\"\r\n aria-hidden=\"true\"\r\n sx={{\r\n fontSize: \"var(--text-xs)\",\r\n fontWeight: \"var(--fw-semibold)\",\r\n color: \"var(--fg-muted)\",\r\n fontVariantNumeric: \"tabular-nums\",\r\n marginLeft: \"auto\",\r\n }}\r\n >\r\n {Math.round(clamped)}%\r\n </Box>\r\n )}\r\n </Box>\r\n )}\r\n\r\n <Box\r\n role=\"progressbar\"\r\n aria-label={ariaLabel}\r\n aria-labelledby={effectiveLabelledBy}\r\n aria-describedby={helperId}\r\n aria-valuemin={isDet ? 0 : undefined}\r\n aria-valuemax={isDet ? 100 : undefined}\r\n aria-valuenow={isDet ? Math.round(clamped) : undefined}\r\n sx={{\r\n position: \"relative\",\r\n width: \"100%\",\r\n height,\r\n borderRadius: \"var(--r-full)\",\r\n background: \"var(--bg-subtle)\",\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n {isDet ? (\r\n <Box\r\n aria-hidden=\"true\"\r\n sx={{\r\n height: \"100%\",\r\n width: `${clamped}%`,\r\n background: fill,\r\n borderRadius: \"inherit\",\r\n transition:\r\n \"width var(--duration-base, 180ms) var(--easing-out, cubic-bezier(.2,.8,.2,1))\",\r\n }}\r\n />\r\n ) : (\r\n <Box\r\n aria-hidden=\"true\"\r\n sx={{\r\n position: \"absolute\",\r\n inset: 0,\r\n \"&::before\": {\r\n content: '\"\"',\r\n position: \"absolute\",\r\n top: 0,\r\n bottom: 0,\r\n // R-Mi.3 / perf — bar parked at left:0 and swept via a\r\n // composited transform instead of animating `left` (which\r\n // reflows every frame). translateX is relative to the bar's\r\n // OWN width (40% of the track), so -100% parks it just off\r\n // the start edge (== old left:-40%) and 250% (= 250% × 40%\r\n // = 100% of the track) drives it off the far end (== old\r\n // left:100%) — same sweep, zero layout.\r\n left: 0,\r\n width: \"40%\",\r\n background: fill,\r\n borderRadius: \"inherit\",\r\n willChange: \"transform\",\r\n animation: \"pui-progressbar-indeterminate 1.4s ease-in-out infinite\",\r\n },\r\n \"@keyframes pui-progressbar-indeterminate\": {\r\n \"0%\": { transform: \"translateX(-100%)\" },\r\n \"60%\": { transform: \"translateX(250%)\" },\r\n \"100%\": { transform: \"translateX(250%)\" },\r\n },\r\n // The global prefers-reduced-motion rule in base.css already\r\n // suppresses animations; nothing extra needed here.\r\n }}\r\n />\r\n )}\r\n </Box>\r\n\r\n {helper && (\r\n <Box\r\n id={helperId}\r\n sx={{\r\n marginTop: 0.5,\r\n fontSize: \"var(--text-xs)\",\r\n color: \"var(--fg-subtle)\",\r\n lineHeight: \"var(--lh-normal)\",\r\n }}\r\n >\r\n {helper}\r\n </Box>\r\n )}\r\n </Box>\r\n );\r\n}\r\n\r\nexport default ProgressBar;\r\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"ProgressBar.js","names":["React","Box","jsx","_jsx","jsxs","_jsxs","VARIANT_COLOR","primary","success","warning","danger","SIZE_HEIGHT","sm","md","lg","ProgressBar","value","indeterminate","variant","size","label","helper","showLabel","ariaLabel","ariaLabelledBy","sx","isDet","clamped","Math","max","min","Number","fill","height","process","env","console","warn","reactId","useId","labelId","undefined","helperId","effectiveLabelledBy","width","children","display","alignItems","justifyContent","gap","marginBottom","id","component","fontSize","fontWeight","color","lineHeight","fontVariantNumeric","marginLeft","round","role","position","borderRadius","background","overflow","transition","inset","content","top","bottom","left","willChange","animation","transform","marginTop"],"sources":["../../../../src/lib/v2/components/ProgressBar.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport Box from \"@mui/material/Box\";\r\nimport type { SxProps, Theme } from \"@mui/material/styles\";\r\n\r\n/**\r\n * ProgressBar — Portnet UI v2\r\n *\r\n * Charter §03 · Component \"ProgressBar\". Determinate or indeterminate\r\n * progress indicator for chunked operations (uploads, batch jobs,\r\n * long-running form steps) where a Skeleton is not appropriate.\r\n *\r\n * R-Sk usage rule (charter §03 Skeleton): \"Use ProgressBar (not\r\n * skeleton) for operations whose duration is known and where the user\r\n * benefits from a percentage signal — e.g. file uploads, batch\r\n * exports, multi-step ingestion.\"\r\n *\r\n * a11y:\r\n * - role=\"progressbar\"\r\n * - Determinate: aria-valuenow / aria-valuemin / aria-valuemax (charter R-Ar)\r\n * - Indeterminate: aria-valuenow OMITTED (WAI-ARIA convention)\r\n * - aria-label or aria-labelledby (caller responsibility — provide one)\r\n * - aria-describedby wires the `helper` text into the AT tree so SR\r\n * users hear the qualitative context (\"3 sur 6 fichiers traités\")\r\n * alongside the quantitative one (\"42 %\"). Audit Batch 5 / B5-2.\r\n *\r\n * Examples:\r\n *\r\n * <ProgressBar value={42} aria-label=\"Téléversement en cours\" />\r\n *\r\n * <ProgressBar value={87} variant=\"success\" showLabel\r\n * aria-label=\"Indexation des documents\" />\r\n *\r\n * <ProgressBar indeterminate aria-label=\"Connexion au serveur\" />\r\n *\r\n * <ProgressBar value={50} size=\"lg\" variant=\"warning\"\r\n * label=\"Synchronisation BAM\"\r\n * helper=\"3 sur 6 fichiers traités\" />\r\n */\r\n\r\nexport type ProgressBarVariant = \"primary\" | \"success\" | \"warning\" | \"danger\";\r\nexport type ProgressBarSize = \"sm\" | \"md\" | \"lg\";\r\n\r\nconst VARIANT_COLOR: Record<ProgressBarVariant, string> = {\r\n primary: \"var(--accent)\",\r\n success: \"var(--success)\",\r\n warning: \"var(--warning)\",\r\n danger: \"var(--danger)\",\r\n};\r\n\r\nconst SIZE_HEIGHT: Record<ProgressBarSize, number> = { sm: 4, md: 6, lg: 8 };\r\n\r\nexport interface ProgressBarProps {\r\n value?: number | undefined;\r\n indeterminate?: boolean | undefined;\r\n variant?: ProgressBarVariant | undefined;\r\n size?: ProgressBarSize | undefined;\r\n label?: React.ReactNode | undefined;\r\n helper?: React.ReactNode | undefined;\r\n showLabel?: boolean | undefined;\r\n \"aria-label\"?: string | undefined;\r\n \"aria-labelledby\"?: string | undefined;\r\n sx?: SxProps<Theme> | undefined;\r\n}\r\n\r\nfunction ProgressBar({\r\n value,\r\n indeterminate = false,\r\n variant = \"primary\",\r\n size = \"md\",\r\n label,\r\n helper,\r\n showLabel = false,\r\n \"aria-label\": ariaLabel,\r\n \"aria-labelledby\": ariaLabelledBy,\r\n sx,\r\n}: ProgressBarProps) {\r\n // Defensive clamp: callers occasionally pass over-range values (e.g. 102%\r\n // from rounding). Charter forbids surprising the user — clamp instead of\r\n // overflowing the track visually.\r\n const isDet = !indeterminate && value != null;\r\n const clamped = isDet ? Math.max(0, Math.min(100, Number(value) || 0)) : 0;\r\n const fill = VARIANT_COLOR[variant] || VARIANT_COLOR.primary;\r\n const height = SIZE_HEIGHT[size] || SIZE_HEIGHT.md;\r\n\r\n if (process.env[\"NODE_ENV\"] !== \"production\" && !ariaLabel && !ariaLabelledBy && !label) {\r\n // eslint-disable-next-line no-console\r\n console.warn(\r\n \"[@portnet/ui v2] <ProgressBar> requires aria-label, aria-labelledby, or a `label` prop for screen readers.\"\r\n );\r\n }\r\n\r\n // If an inline `label` is rendered we wire aria-labelledby internally\r\n // so the caller doesn't have to manage the id themselves.\r\n // If `helper` is rendered, wire it via aria-describedby on the\r\n // progressbar so the qualitative context reaches AT. Audit Batch 5.\r\n const reactId = React.useId();\r\n const labelId = label ? `${reactId}-lbl` : undefined;\r\n const helperId = helper ? `${reactId}-hlp` : undefined;\r\n const effectiveLabelledBy = ariaLabelledBy || labelId;\r\n\r\n return (\r\n <Box sx={{ width: \"100%\", ...sx }}>\r\n {(label || (isDet && showLabel)) && (\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n alignItems: \"baseline\",\r\n justifyContent: \"space-between\",\r\n gap: 1,\r\n marginBottom: 0.5,\r\n }}\r\n >\r\n {label && (\r\n <Box\r\n id={labelId}\r\n component=\"span\"\r\n sx={{\r\n fontSize: \"var(--text-sm)\",\r\n fontWeight: \"var(--fw-semibold)\",\r\n color: \"var(--fg)\",\r\n lineHeight: \"var(--lh-snug)\",\r\n }}\r\n >\r\n {label}\r\n </Box>\r\n )}\r\n {isDet && showLabel && (\r\n <Box\r\n component=\"span\"\r\n aria-hidden=\"true\"\r\n sx={{\r\n fontSize: \"var(--text-xs)\",\r\n fontWeight: \"var(--fw-semibold)\",\r\n color: \"var(--fg-muted)\",\r\n fontVariantNumeric: \"tabular-nums\",\r\n marginLeft: \"auto\",\r\n }}\r\n >\r\n {Math.round(clamped)}%\r\n </Box>\r\n )}\r\n </Box>\r\n )}\r\n\r\n <Box\r\n role=\"progressbar\"\r\n aria-label={ariaLabel}\r\n aria-labelledby={effectiveLabelledBy}\r\n aria-describedby={helperId}\r\n aria-valuemin={isDet ? 0 : undefined}\r\n aria-valuemax={isDet ? 100 : undefined}\r\n aria-valuenow={isDet ? Math.round(clamped) : undefined}\r\n sx={{\r\n position: \"relative\",\r\n width: \"100%\",\r\n height,\r\n borderRadius: \"var(--r-full)\",\r\n background: \"var(--bg-subtle)\",\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n {isDet ? (\r\n <Box\r\n aria-hidden=\"true\"\r\n sx={{\r\n height: \"100%\",\r\n width: `${clamped}%`,\r\n background: fill,\r\n borderRadius: \"inherit\",\r\n transition:\r\n \"width var(--duration-base, 180ms) var(--easing-out, cubic-bezier(.2,.8,.2,1))\",\r\n }}\r\n />\r\n ) : (\r\n <Box\r\n aria-hidden=\"true\"\r\n sx={{\r\n position: \"absolute\",\r\n inset: 0,\r\n \"&::before\": {\r\n content: '\"\"',\r\n position: \"absolute\",\r\n top: 0,\r\n bottom: 0,\r\n // R-Mi.3 / perf — bar parked at left:0 and swept via a\r\n // composited transform instead of animating `left` (which\r\n // reflows every frame). translateX is relative to the bar's\r\n // OWN width (40% of the track), so -100% parks it just off\r\n // the start edge (== old left:-40%) and 250% (= 250% × 40%\r\n // = 100% of the track) drives it off the far end (== old\r\n // left:100%) — same sweep, zero layout.\r\n left: 0,\r\n width: \"40%\",\r\n background: fill,\r\n borderRadius: \"inherit\",\r\n willChange: \"transform\",\r\n animation: \"pui-progressbar-indeterminate 1.4s ease-in-out infinite\",\r\n },\r\n \"@keyframes pui-progressbar-indeterminate\": {\r\n \"0%\": { transform: \"translateX(-100%)\" },\r\n \"60%\": { transform: \"translateX(250%)\" },\r\n \"100%\": { transform: \"translateX(250%)\" },\r\n },\r\n // The global prefers-reduced-motion rule in base.css already\r\n // suppresses animations; nothing extra needed here.\r\n }}\r\n />\r\n )}\r\n </Box>\r\n\r\n {helper && (\r\n <Box\r\n id={helperId}\r\n sx={{\r\n marginTop: 0.5,\r\n fontSize: \"var(--text-xs)\",\r\n color: \"var(--fg-subtle)\",\r\n lineHeight: \"var(--lh-normal)\",\r\n }}\r\n >\r\n {helper}\r\n </Box>\r\n )}\r\n </Box>\r\n );\r\n}\r\n\r\nexport default ProgressBar;\r\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,14 +1,3 @@
|
|
|
1
|
-
var _excluded = ["checked", "onChange", "label", "value", "disabled", "inputProps", "sx"],
|
|
2
|
-
_excluded2 = ["value", "onChange", "options", "row", "disabled", "name", "id", "sx"],
|
|
3
|
-
_excluded3 = ["error", "fullWidth"];
|
|
4
|
-
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); }
|
|
5
|
-
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; }
|
|
6
|
-
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; }
|
|
7
|
-
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; }
|
|
8
|
-
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
|
|
9
|
-
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); }
|
|
10
|
-
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; }
|
|
11
|
-
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; }
|
|
12
1
|
import * as React from "react";
|
|
13
2
|
import MuiRadio from "@mui/material/Radio";
|
|
14
3
|
import MuiRadioGroup from "@mui/material/RadioGroup";
|
|
@@ -34,16 +23,17 @@ import Box from "@mui/material/Box";
|
|
|
34
23
|
* passing `inputProps={...}` to v2.Radio is unchanged.
|
|
35
24
|
*/
|
|
36
25
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
37
|
-
export
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
26
|
+
export const Radio = /*#__PURE__*/React.forwardRef(function Radio({
|
|
27
|
+
checked,
|
|
28
|
+
onChange,
|
|
29
|
+
label,
|
|
30
|
+
value,
|
|
31
|
+
disabled,
|
|
32
|
+
inputProps,
|
|
33
|
+
sx,
|
|
34
|
+
...rest
|
|
35
|
+
}, ref) {
|
|
36
|
+
const radio = /*#__PURE__*/_jsx(MuiRadio, {
|
|
47
37
|
ref: ref,
|
|
48
38
|
checked: !!checked,
|
|
49
39
|
onChange: onChange,
|
|
@@ -58,14 +48,16 @@ export var Radio = /*#__PURE__*/React.forwardRef(function Radio(_ref, ref) {
|
|
|
58
48
|
slotProps: inputProps ? {
|
|
59
49
|
input: inputProps
|
|
60
50
|
} : undefined,
|
|
61
|
-
sx:
|
|
51
|
+
sx: {
|
|
62
52
|
padding: "6px",
|
|
63
53
|
"&:focus-visible": {
|
|
64
54
|
outline: "2px solid var(--accent)",
|
|
65
55
|
outlineOffset: "var(--pui-outline-offset)"
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
|
|
56
|
+
},
|
|
57
|
+
...sx
|
|
58
|
+
},
|
|
59
|
+
...rest
|
|
60
|
+
});
|
|
69
61
|
if (!label) return radio;
|
|
70
62
|
return /*#__PURE__*/_jsx(FormControlLabel, {
|
|
71
63
|
control: radio,
|
|
@@ -118,24 +110,22 @@ export var Radio = /*#__PURE__*/React.forwardRef(function Radio(_ref, ref) {
|
|
|
118
110
|
* valid on the group and are still forwarded.
|
|
119
111
|
*/
|
|
120
112
|
|
|
121
|
-
export function RadioGroup(
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
sx = _ref2.sx,
|
|
133
|
-
rest = _objectWithoutProperties(_ref2, _excluded2);
|
|
113
|
+
export function RadioGroup({
|
|
114
|
+
value,
|
|
115
|
+
onChange,
|
|
116
|
+
options = [],
|
|
117
|
+
row = false,
|
|
118
|
+
disabled = false,
|
|
119
|
+
name,
|
|
120
|
+
id,
|
|
121
|
+
sx,
|
|
122
|
+
...rest
|
|
123
|
+
}) {
|
|
134
124
|
// R-Ar.1 - stable, SSR-safe, per-instance base for option helper ids.
|
|
135
125
|
// Each option that exposes a `helper` derives a deterministic id from
|
|
136
126
|
// this base + its index, so the inner <input type="radio">'s
|
|
137
127
|
// aria-describedby points at the right <Box> element.
|
|
138
|
-
|
|
128
|
+
const baseId = React.useId();
|
|
139
129
|
|
|
140
130
|
// RG-1 — Field cloneElement-injects presentational/validation props onto this
|
|
141
131
|
// child; `error` and `fullWidth` are not valid on the role="radiogroup"
|
|
@@ -143,30 +133,32 @@ export function RadioGroup(_ref2) {
|
|
|
143
133
|
// those two (object-rest omit); the aria-* / id Field also injects remain in
|
|
144
134
|
// `domRest` and stay valid on the group. Cast because these injected props
|
|
145
135
|
// are not part of RadioGroupProps.
|
|
146
|
-
|
|
147
|
-
_fieldError
|
|
148
|
-
_fieldFullWidth
|
|
149
|
-
domRest
|
|
150
|
-
|
|
151
|
-
|
|
136
|
+
const {
|
|
137
|
+
error: _fieldError,
|
|
138
|
+
fullWidth: _fieldFullWidth,
|
|
139
|
+
...domRest
|
|
140
|
+
} = rest;
|
|
141
|
+
return /*#__PURE__*/_jsx(MuiRadioGroup, {
|
|
142
|
+
value: value ?? "",
|
|
152
143
|
onChange: onChange,
|
|
153
144
|
row: row,
|
|
154
145
|
name: name,
|
|
155
146
|
id: id,
|
|
156
|
-
sx:
|
|
157
|
-
gap: row ? 2 : 0.5
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
147
|
+
sx: {
|
|
148
|
+
gap: row ? 2 : 0.5,
|
|
149
|
+
...sx
|
|
150
|
+
},
|
|
151
|
+
...domRest,
|
|
152
|
+
children: options.map((opt, idx) => {
|
|
153
|
+
const v = typeof opt === "string" ? opt : opt.value;
|
|
154
|
+
const lbl = typeof opt === "string" ? opt : opt.label;
|
|
155
|
+
const helper = typeof opt === "string" ? null : opt.helper;
|
|
156
|
+
const optDisabled = disabled || typeof opt === "object" && opt.disabled;
|
|
165
157
|
// Per-option deterministic id. Uses the loop index so the
|
|
166
158
|
// value type (string, number, object) doesn't constrain the
|
|
167
159
|
// shape. Stable across renders for the same option list.
|
|
168
|
-
|
|
169
|
-
|
|
160
|
+
const helperId = helper ? `${baseId}-h-${idx}` : undefined;
|
|
161
|
+
const labelNode = helper ? /*#__PURE__*/_jsxs(Box, {
|
|
170
162
|
sx: {
|
|
171
163
|
display: "flex",
|
|
172
164
|
flexDirection: "column",
|
|
@@ -222,7 +214,7 @@ export function RadioGroup(_ref2) {
|
|
|
222
214
|
}
|
|
223
215
|
}, v);
|
|
224
216
|
})
|
|
225
|
-
})
|
|
217
|
+
});
|
|
226
218
|
}
|
|
227
219
|
export default Radio;
|
|
228
220
|
//# sourceMappingURL=Radio.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Radio.js","names":["React","MuiRadio","MuiRadioGroup","FormControlLabel","Box","jsx","_jsx","jsxs","_jsxs","Radio","forwardRef","_ref","ref","checked","onChange","label","value","disabled","inputProps","sx","rest","_objectWithoutProperties","_excluded","radio","_objectSpread","size","slotProps","input","undefined","padding","outline","outlineOffset","control","margin","fontSize","RadioGroup","_ref2","_ref2$options","options","_ref2$row","row","_ref2$disabled","name","id","_excluded2","baseId","useId","_ref3","_fieldError","error","_fieldFullWidth","fullWidth","domRest","_excluded3","gap","children","map","opt","idx","v","lbl","helper","optDisabled","_typeof","helperId","concat","labelNode","display","flexDirection","paddingY","component","color","alignItems"],"sources":["../../../../src/lib/v2/components/Radio.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport MuiRadio from \"@mui/material/Radio\";\r\nimport type { RadioProps as MuiRadioProps } from \"@mui/material/Radio\";\r\nimport MuiRadioGroup from \"@mui/material/RadioGroup\";\r\nimport type { RadioGroupProps as MuiRadioGroupProps } from \"@mui/material/RadioGroup\";\r\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\r\nimport Box from \"@mui/material/Box\";\r\n\r\n/**\r\n * Radio - Portnet UI v2\r\n *\r\n * Charter §03 · Component \"Radio\". Required by R-Sel.2 (2-3 options\r\n * -> Radio or Segmented).\r\n *\r\n * Low-level: a single controlled radio. For typical usage, prefer\r\n * <RadioGroup options={...}> below.\r\n *\r\n * <Radio checked={v === \"a\"} onChange={() => setV(\"a\")} label=\"Option A\" value=\"a\" />\r\n *\r\n * MUI v9 surface notes (audit Batch 2 external):\r\n * The public `inputProps` is routed internally to slotProps.input -\r\n * MUI v9 idiomatic location for native <input type=\"radio\"/> attributes.\r\n * `inputProps` was deprecated in v6 and REMOVED in v9, so it is no longer\r\n * inherited from MuiRadioProps and must be re-declared here. Consumer code\r\n * passing `inputProps={...}` to v2.Radio is unchanged.\r\n */\r\nexport interface RadioProps extends MuiRadioProps {\r\n label?: React.ReactNode | undefined;\r\n /** Native <input> attributes. Routed to slotProps.input (v9). */\r\n inputProps?: React.InputHTMLAttributes<HTMLInputElement> | undefined;\r\n}\r\n\r\nexport const Radio = React.forwardRef<React.ComponentRef<typeof MuiRadio>, RadioProps>(function Radio(\r\n { checked, onChange, label, value, disabled, inputProps, sx, ...rest },\r\n ref,\r\n) {\r\n const radio = (\r\n <MuiRadio\r\n ref={ref}\r\n checked={!!checked}\r\n onChange={onChange}\r\n value={value}\r\n disabled={disabled}\r\n size=\"small\"\r\n // MUI v9: Radio inputProps -> slotProps.input (same migration class\r\n // as Checkbox / Switch / NumberInput). Emitted conditionally so we\r\n // don't pass `slotProps={{ input: undefined }}` when nothing is\r\n // supplied.\r\n slotProps={inputProps ? { input: inputProps } : undefined}\r\n sx={{\r\n padding: \"6px\",\r\n \"&:focus-visible\": {\r\n outline: \"2px solid var(--accent)\",\r\n outlineOffset: \"var(--pui-outline-offset)\",\r\n },\r\n ...sx,\r\n }}\r\n {...rest}\r\n />\r\n );\r\n if (!label) return radio;\r\n return (\r\n <FormControlLabel\r\n control={radio}\r\n label={label}\r\n value={value}\r\n disabled={disabled}\r\n sx={{\r\n margin: 0,\r\n \"& .MuiFormControlLabel-label\": { fontSize: \"var(--text-sm, 13px)\" },\r\n }}\r\n />\r\n );\r\n});\r\n\r\n/**\r\n * RadioGroup - Portnet UI v2\r\n *\r\n * Declarative group of radios taking an `options` array. Use inside\r\n * <Field> for label / hint / error / a11y wiring.\r\n *\r\n * <Field label=\"Type d'opération\" required>\r\n * <RadioGroup\r\n * value={op}\r\n * onChange={e => setOp(e.target.value)}\r\n * options={[\r\n * { value: \"import\", label: \"Importation\" },\r\n * { value: \"export\", label: \"Exportation\" },\r\n * { value: \"transit\", label: \"Transit\", helper: \"Marchandises en transit douanier\" },\r\n * ]}\r\n * />\r\n * </Field>\r\n *\r\n * Layout:\r\n * row={false} (default) -> vertical stack\r\n * row={true} -> horizontal (use only when labels are short)\r\n *\r\n * A11y (audit Batch 5, finding B3-3):\r\n * When an option carries a `helper` text, RadioGroup wires it\r\n * to the inner radio input via aria-describedby - SR users hear\r\n * the helper alongside the label when navigating. Without this\r\n * link the helper is purely visual.\r\n *\r\n * A11y (audit Batch 19, RG-1):\r\n * Used inside <Field>, Field cloneElement-injects presentational /\r\n * validation props onto this group. `error` and `fullWidth` are not valid\r\n * on the role=\"radiogroup\" element (React emits \"non-boolean / unrecognized\r\n * attribute\" warnings), so they are stripped before the spread. The aria-*\r\n * (labelledby / describedby / invalid) and id that Field also injects stay\r\n * valid on the group and are still forwarded.\r\n */\r\nexport interface RadioOption {\r\n value: string | number;\r\n label: React.ReactNode;\r\n helper?: React.ReactNode | undefined;\r\n disabled?: boolean | undefined;\r\n}\r\n\r\nexport type RadioGroupOption = string | RadioOption;\r\n\r\nexport interface RadioGroupProps extends Omit<MuiRadioGroupProps, \"value\" | \"children\"> {\r\n value?: string | number | undefined;\r\n options?: RadioGroupOption[] | undefined;\r\n disabled?: boolean | undefined;\r\n}\r\n\r\nexport function RadioGroup({\r\n value,\r\n onChange,\r\n options = [],\r\n row = false,\r\n disabled = false,\r\n name,\r\n id,\r\n sx,\r\n ...rest\r\n}: RadioGroupProps) {\r\n // R-Ar.1 - stable, SSR-safe, per-instance base for option helper ids.\r\n // Each option that exposes a `helper` derives a deterministic id from\r\n // this base + its index, so the inner <input type=\"radio\">'s\r\n // aria-describedby points at the right <Box> element.\r\n const baseId = React.useId();\r\n\r\n // RG-1 — Field cloneElement-injects presentational/validation props onto this\r\n // child; `error` and `fullWidth` are not valid on the role=\"radiogroup\"\r\n // element and would trigger React attribute warnings if forwarded. Strip just\r\n // those two (object-rest omit); the aria-* / id Field also injects remain in\r\n // `domRest` and stay valid on the group. Cast because these injected props\r\n // are not part of RadioGroupProps.\r\n const { error: _fieldError, fullWidth: _fieldFullWidth, ...domRest } =\r\n rest as typeof rest & { error?: unknown; fullWidth?: unknown };\r\n\r\n return (\r\n <MuiRadioGroup\r\n value={value ?? \"\"}\r\n onChange={onChange}\r\n row={row}\r\n name={name}\r\n id={id}\r\n sx={{ gap: row ? 2 : 0.5, ...sx }}\r\n {...domRest}\r\n >\r\n {options.map((opt, idx) => {\r\n const v = typeof opt === \"string\" ? opt : opt.value;\r\n const lbl = typeof opt === \"string\" ? opt : opt.label;\r\n const helper = typeof opt === \"string\" ? null : opt.helper;\r\n const optDisabled = disabled || (typeof opt === \"object\" && opt.disabled);\r\n // Per-option deterministic id. Uses the loop index so the\r\n // value type (string, number, object) doesn't constrain the\r\n // shape. Stable across renders for the same option list.\r\n const helperId = helper ? `${baseId}-h-${idx}` : undefined;\r\n const labelNode = helper ? (\r\n <Box sx={{ display: \"flex\", flexDirection: \"column\", paddingY: 0.25 }}>\r\n <Box component=\"span\" sx={{ fontSize: \"var(--text-sm)\", color: \"var(--fg)\" }}>\r\n {lbl}\r\n </Box>\r\n <Box\r\n id={helperId}\r\n component=\"span\"\r\n sx={{ fontSize: \"var(--text-xs)\", color: \"var(--fg-subtle)\" }}\r\n >\r\n {helper}\r\n </Box>\r\n </Box>\r\n ) : lbl;\r\n return (\r\n <FormControlLabel\r\n key={v}\r\n value={v}\r\n disabled={optDisabled}\r\n control={\r\n <MuiRadio\r\n size=\"small\"\r\n // MUI v9: aria-describedby routed through slotProps.input\r\n // to land on the inner <input type=\"radio\">, not on the\r\n // root span. SR users hear the helper as a description\r\n // when focusing the radio.\r\n slotProps={helperId ? { input: { \"aria-describedby\": helperId } } : undefined}\r\n sx={{\r\n padding: \"6px\",\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 }\r\n label={labelNode}\r\n sx={{\r\n margin: 0,\r\n alignItems: helper ? \"flex-start\" : \"center\",\r\n \"& .MuiFormControlLabel-label\": { fontSize: \"var(--text-sm)\" },\r\n }}\r\n />\r\n );\r\n })}\r\n </MuiRadioGroup>\r\n );\r\n}\r\n\r\nexport default Radio;\r\n"],"mappings":";;;;;;;;;;;AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAC9B,OAAOC,QAAQ,MAAM,qBAAqB;AAE1C,OAAOC,aAAa,MAAM,0BAA0B;AAEpD,OAAOC,gBAAgB,MAAM,gCAAgC;AAC7D,OAAOC,GAAG,MAAM,mBAAmB;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAjBA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAwBA,OAAO,IAAMC,KAAK,gBAAGT,KAAK,CAACU,UAAU,CAAkD,SAASD,KAAKA,CAAAE,IAAA,EAEnGC,GAAG,EACH;EAAA,IAFEC,OAAO,GAAAF,IAAA,CAAPE,OAAO;IAAEC,QAAQ,GAAAH,IAAA,CAARG,QAAQ;IAAEC,KAAK,GAAAJ,IAAA,CAALI,KAAK;IAAEC,KAAK,GAAAL,IAAA,CAALK,KAAK;IAAEC,QAAQ,GAAAN,IAAA,CAARM,QAAQ;IAAEC,UAAU,GAAAP,IAAA,CAAVO,UAAU;IAAEC,EAAE,GAAAR,IAAA,CAAFQ,EAAE;IAAKC,IAAI,GAAAC,wBAAA,CAAAV,IAAA,EAAAW,SAAA;EAGpE,IAAMC,KAAK,gBACTjB,IAAA,CAACL,QAAQ,EAAAuB,aAAA;IACPZ,GAAG,EAAEA,GAAI;IACTC,OAAO,EAAE,CAAC,CAACA,OAAQ;IACnBC,QAAQ,EAAEA,QAAS;IACnBE,KAAK,EAAEA,KAAM;IACbC,QAAQ,EAAEA,QAAS;IACnBQ,IAAI,EAAC;IACL;IACA;IACA;IACA;IAAA;IACAC,SAAS,EAAER,UAAU,GAAG;MAAES,KAAK,EAAET;IAAW,CAAC,GAAGU,SAAU;IAC1DT,EAAE,EAAAK,aAAA;MACAK,OAAO,EAAE,KAAK;MACd,iBAAiB,EAAE;QACjBC,OAAO,EAAE,yBAAyB;QAClCC,aAAa,EAAE;MACjB;IAAC,GACEZ,EAAE;EACL,GACEC,IAAI,CACT,CACF;EACD,IAAI,CAACL,KAAK,EAAE,OAAOQ,KAAK;EACxB,oBACEjB,IAAA,CAACH,gBAAgB;IACf6B,OAAO,EAAET,KAAM;IACfR,KAAK,EAAEA,KAAM;IACbC,KAAK,EAAEA,KAAM;IACbC,QAAQ,EAAEA,QAAS;IACnBE,EAAE,EAAE;MACFc,MAAM,EAAE,CAAC;MACT,8BAA8B,EAAE;QAAEC,QAAQ,EAAE;MAAuB;IACrE;EAAE,CACH,CAAC;AAEN,CAAC,CAAC;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAgBA,OAAO,SAASC,UAAUA,CAAAC,KAAA,EAUN;EAAA,IATlBpB,KAAK,GAAAoB,KAAA,CAALpB,KAAK;IACLF,QAAQ,GAAAsB,KAAA,CAARtB,QAAQ;IAAAuB,aAAA,GAAAD,KAAA,CACRE,OAAO;IAAPA,OAAO,GAAAD,aAAA,cAAG,EAAE,GAAAA,aAAA;IAAAE,SAAA,GAAAH,KAAA,CACZI,GAAG;IAAHA,GAAG,GAAAD,SAAA,cAAG,KAAK,GAAAA,SAAA;IAAAE,cAAA,GAAAL,KAAA,CACXnB,QAAQ;IAARA,QAAQ,GAAAwB,cAAA,cAAG,KAAK,GAAAA,cAAA;IAChBC,IAAI,GAAAN,KAAA,CAAJM,IAAI;IACJC,EAAE,GAAAP,KAAA,CAAFO,EAAE;IACFxB,EAAE,GAAAiB,KAAA,CAAFjB,EAAE;IACCC,IAAI,GAAAC,wBAAA,CAAAe,KAAA,EAAAQ,UAAA;EAEP;EACA;EACA;EACA;EACA,IAAMC,MAAM,GAAG7C,KAAK,CAAC8C,KAAK,CAAC,CAAC;;EAE5B;EACA;EACA;EACA;EACA;EACA;EACA,IAAAC,KAAA,GACE3B,IAAI;IADS4B,WAAW,GAAAD,KAAA,CAAlBE,KAAK;IAA0BC,eAAe,GAAAH,KAAA,CAA1BI,SAAS;IAAsBC,OAAO,GAAA/B,wBAAA,CAAA0B,KAAA,EAAAM,UAAA;EAGlE,oBACE/C,IAAA,CAACJ,aAAa,EAAAsB,aAAA,CAAAA,aAAA;IACZR,KAAK,EAAEA,KAAK,aAALA,KAAK,cAALA,KAAK,GAAI,EAAG;IACnBF,QAAQ,EAAEA,QAAS;IACnB0B,GAAG,EAAEA,GAAI;IACTE,IAAI,EAAEA,IAAK;IACXC,EAAE,EAAEA,EAAG;IACPxB,EAAE,EAAAK,aAAA;MAAI8B,GAAG,EAAEd,GAAG,GAAG,CAAC,GAAG;IAAG,GAAKrB,EAAE;EAAG,GAC9BiC,OAAO;IAAAG,QAAA,EAEVjB,OAAO,CAACkB,GAAG,CAAC,UAACC,GAAG,EAAEC,GAAG,EAAK;MACzB,IAAMC,CAAC,GAAG,OAAOF,GAAG,KAAK,QAAQ,GAAGA,GAAG,GAAGA,GAAG,CAACzC,KAAK;MACnD,IAAM4C,GAAG,GAAG,OAAOH,GAAG,KAAK,QAAQ,GAAGA,GAAG,GAAGA,GAAG,CAAC1C,KAAK;MACrD,IAAM8C,MAAM,GAAG,OAAOJ,GAAG,KAAK,QAAQ,GAAG,IAAI,GAAGA,GAAG,CAACI,MAAM;MAC1D,IAAMC,WAAW,GAAG7C,QAAQ,IAAK8C,OAAA,CAAON,GAAG,MAAK,QAAQ,IAAIA,GAAG,CAACxC,QAAS;MACzE;MACA;MACA;MACA,IAAM+C,QAAQ,GAAGH,MAAM,MAAAI,MAAA,CAAMpB,MAAM,SAAAoB,MAAA,CAAMP,GAAG,IAAK9B,SAAS;MAC1D,IAAMsC,SAAS,GAAGL,MAAM,gBACtBrD,KAAA,CAACJ,GAAG;QAACe,EAAE,EAAE;UAAEgD,OAAO,EAAE,MAAM;UAAEC,aAAa,EAAE,QAAQ;UAAEC,QAAQ,EAAE;QAAK,CAAE;QAAAd,QAAA,gBACpEjD,IAAA,CAACF,GAAG;UAACkE,SAAS,EAAC,MAAM;UAACnD,EAAE,EAAE;YAAEe,QAAQ,EAAE,gBAAgB;YAAEqC,KAAK,EAAE;UAAY,CAAE;UAAAhB,QAAA,EAC1EK;QAAG,CACD,CAAC,eACNtD,IAAA,CAACF,GAAG;UACFuC,EAAE,EAAEqB,QAAS;UACbM,SAAS,EAAC,MAAM;UAChBnD,EAAE,EAAE;YAAEe,QAAQ,EAAE,gBAAgB;YAAEqC,KAAK,EAAE;UAAmB,CAAE;UAAAhB,QAAA,EAE7DM;QAAM,CACJ,CAAC;MAAA,CACH,CAAC,GACJD,GAAG;MACP,oBACEtD,IAAA,CAACH,gBAAgB;QAEfa,KAAK,EAAE2C,CAAE;QACT1C,QAAQ,EAAE6C,WAAY;QACtB9B,OAAO,eACL1B,IAAA,CAACL,QAAQ;UACPwB,IAAI,EAAC;UACL;UACA;UACA;UACA;UAAA;UACAC,SAAS,EAAEsC,QAAQ,GAAG;YAAErC,KAAK,EAAE;cAAE,kBAAkB,EAAEqC;YAAS;UAAE,CAAC,GAAGpC,SAAU;UAC9ET,EAAE,EAAE;YACFU,OAAO,EAAE,KAAK;YACd,iBAAiB,EAAE;cACjBC,OAAO,EAAE,yBAAyB;cAClCC,aAAa,EAAE;YACjB;UACF;QAAE,CACH,CACF;QACDhB,KAAK,EAAEmD,SAAU;QACjB/C,EAAE,EAAE;UACFc,MAAM,EAAE,CAAC;UACTuC,UAAU,EAAEX,MAAM,GAAG,YAAY,GAAG,QAAQ;UAC5C,8BAA8B,EAAE;YAAE3B,QAAQ,EAAE;UAAiB;QAC/D;MAAE,GAzBGyB,CA0BN,CAAC;IAEN,CAAC;EAAC,EACW,CAAC;AAEpB;AAEA,eAAelD,KAAK","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"Radio.js","names":["React","MuiRadio","MuiRadioGroup","FormControlLabel","Box","jsx","_jsx","jsxs","_jsxs","Radio","forwardRef","checked","onChange","label","value","disabled","inputProps","sx","rest","ref","radio","size","slotProps","input","undefined","padding","outline","outlineOffset","control","margin","fontSize","RadioGroup","options","row","name","id","baseId","useId","error","_fieldError","fullWidth","_fieldFullWidth","domRest","gap","children","map","opt","idx","v","lbl","helper","optDisabled","helperId","labelNode","display","flexDirection","paddingY","component","color","alignItems"],"sources":["../../../../src/lib/v2/components/Radio.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport MuiRadio from \"@mui/material/Radio\";\r\nimport type { RadioProps as MuiRadioProps } from \"@mui/material/Radio\";\r\nimport MuiRadioGroup from \"@mui/material/RadioGroup\";\r\nimport type { RadioGroupProps as MuiRadioGroupProps } from \"@mui/material/RadioGroup\";\r\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\r\nimport Box from \"@mui/material/Box\";\r\n\r\n/**\r\n * Radio - Portnet UI v2\r\n *\r\n * Charter §03 · Component \"Radio\". Required by R-Sel.2 (2-3 options\r\n * -> Radio or Segmented).\r\n *\r\n * Low-level: a single controlled radio. For typical usage, prefer\r\n * <RadioGroup options={...}> below.\r\n *\r\n * <Radio checked={v === \"a\"} onChange={() => setV(\"a\")} label=\"Option A\" value=\"a\" />\r\n *\r\n * MUI v9 surface notes (audit Batch 2 external):\r\n * The public `inputProps` is routed internally to slotProps.input -\r\n * MUI v9 idiomatic location for native <input type=\"radio\"/> attributes.\r\n * `inputProps` was deprecated in v6 and REMOVED in v9, so it is no longer\r\n * inherited from MuiRadioProps and must be re-declared here. Consumer code\r\n * passing `inputProps={...}` to v2.Radio is unchanged.\r\n */\r\nexport interface RadioProps extends MuiRadioProps {\r\n label?: React.ReactNode | undefined;\r\n /** Native <input> attributes. Routed to slotProps.input (v9). */\r\n inputProps?: React.InputHTMLAttributes<HTMLInputElement> | undefined;\r\n}\r\n\r\nexport const Radio = React.forwardRef<React.ComponentRef<typeof MuiRadio>, RadioProps>(function Radio(\r\n { checked, onChange, label, value, disabled, inputProps, sx, ...rest },\r\n ref,\r\n) {\r\n const radio = (\r\n <MuiRadio\r\n ref={ref}\r\n checked={!!checked}\r\n onChange={onChange}\r\n value={value}\r\n disabled={disabled}\r\n size=\"small\"\r\n // MUI v9: Radio inputProps -> slotProps.input (same migration class\r\n // as Checkbox / Switch / NumberInput). Emitted conditionally so we\r\n // don't pass `slotProps={{ input: undefined }}` when nothing is\r\n // supplied.\r\n slotProps={inputProps ? { input: inputProps } : undefined}\r\n sx={{\r\n padding: \"6px\",\r\n \"&:focus-visible\": {\r\n outline: \"2px solid var(--accent)\",\r\n outlineOffset: \"var(--pui-outline-offset)\",\r\n },\r\n ...sx,\r\n }}\r\n {...rest}\r\n />\r\n );\r\n if (!label) return radio;\r\n return (\r\n <FormControlLabel\r\n control={radio}\r\n label={label}\r\n value={value}\r\n disabled={disabled}\r\n sx={{\r\n margin: 0,\r\n \"& .MuiFormControlLabel-label\": { fontSize: \"var(--text-sm, 13px)\" },\r\n }}\r\n />\r\n );\r\n});\r\n\r\n/**\r\n * RadioGroup - Portnet UI v2\r\n *\r\n * Declarative group of radios taking an `options` array. Use inside\r\n * <Field> for label / hint / error / a11y wiring.\r\n *\r\n * <Field label=\"Type d'opération\" required>\r\n * <RadioGroup\r\n * value={op}\r\n * onChange={e => setOp(e.target.value)}\r\n * options={[\r\n * { value: \"import\", label: \"Importation\" },\r\n * { value: \"export\", label: \"Exportation\" },\r\n * { value: \"transit\", label: \"Transit\", helper: \"Marchandises en transit douanier\" },\r\n * ]}\r\n * />\r\n * </Field>\r\n *\r\n * Layout:\r\n * row={false} (default) -> vertical stack\r\n * row={true} -> horizontal (use only when labels are short)\r\n *\r\n * A11y (audit Batch 5, finding B3-3):\r\n * When an option carries a `helper` text, RadioGroup wires it\r\n * to the inner radio input via aria-describedby - SR users hear\r\n * the helper alongside the label when navigating. Without this\r\n * link the helper is purely visual.\r\n *\r\n * A11y (audit Batch 19, RG-1):\r\n * Used inside <Field>, Field cloneElement-injects presentational /\r\n * validation props onto this group. `error` and `fullWidth` are not valid\r\n * on the role=\"radiogroup\" element (React emits \"non-boolean / unrecognized\r\n * attribute\" warnings), so they are stripped before the spread. The aria-*\r\n * (labelledby / describedby / invalid) and id that Field also injects stay\r\n * valid on the group and are still forwarded.\r\n */\r\nexport interface RadioOption {\r\n value: string | number;\r\n label: React.ReactNode;\r\n helper?: React.ReactNode | undefined;\r\n disabled?: boolean | undefined;\r\n}\r\n\r\nexport type RadioGroupOption = string | RadioOption;\r\n\r\nexport interface RadioGroupProps extends Omit<MuiRadioGroupProps, \"value\" | \"children\"> {\r\n value?: string | number | undefined;\r\n options?: RadioGroupOption[] | undefined;\r\n disabled?: boolean | undefined;\r\n}\r\n\r\nexport function RadioGroup({\r\n value,\r\n onChange,\r\n options = [],\r\n row = false,\r\n disabled = false,\r\n name,\r\n id,\r\n sx,\r\n ...rest\r\n}: RadioGroupProps) {\r\n // R-Ar.1 - stable, SSR-safe, per-instance base for option helper ids.\r\n // Each option that exposes a `helper` derives a deterministic id from\r\n // this base + its index, so the inner <input type=\"radio\">'s\r\n // aria-describedby points at the right <Box> element.\r\n const baseId = React.useId();\r\n\r\n // RG-1 — Field cloneElement-injects presentational/validation props onto this\r\n // child; `error` and `fullWidth` are not valid on the role=\"radiogroup\"\r\n // element and would trigger React attribute warnings if forwarded. Strip just\r\n // those two (object-rest omit); the aria-* / id Field also injects remain in\r\n // `domRest` and stay valid on the group. Cast because these injected props\r\n // are not part of RadioGroupProps.\r\n const { error: _fieldError, fullWidth: _fieldFullWidth, ...domRest } =\r\n rest as typeof rest & { error?: unknown; fullWidth?: unknown };\r\n\r\n return (\r\n <MuiRadioGroup\r\n value={value ?? \"\"}\r\n onChange={onChange}\r\n row={row}\r\n name={name}\r\n id={id}\r\n sx={{ gap: row ? 2 : 0.5, ...sx }}\r\n {...domRest}\r\n >\r\n {options.map((opt, idx) => {\r\n const v = typeof opt === \"string\" ? opt : opt.value;\r\n const lbl = typeof opt === \"string\" ? opt : opt.label;\r\n const helper = typeof opt === \"string\" ? null : opt.helper;\r\n const optDisabled = disabled || (typeof opt === \"object\" && opt.disabled);\r\n // Per-option deterministic id. Uses the loop index so the\r\n // value type (string, number, object) doesn't constrain the\r\n // shape. Stable across renders for the same option list.\r\n const helperId = helper ? `${baseId}-h-${idx}` : undefined;\r\n const labelNode = helper ? (\r\n <Box sx={{ display: \"flex\", flexDirection: \"column\", paddingY: 0.25 }}>\r\n <Box component=\"span\" sx={{ fontSize: \"var(--text-sm)\", color: \"var(--fg)\" }}>\r\n {lbl}\r\n </Box>\r\n <Box\r\n id={helperId}\r\n component=\"span\"\r\n sx={{ fontSize: \"var(--text-xs)\", color: \"var(--fg-subtle)\" }}\r\n >\r\n {helper}\r\n </Box>\r\n </Box>\r\n ) : lbl;\r\n return (\r\n <FormControlLabel\r\n key={v}\r\n value={v}\r\n disabled={optDisabled}\r\n control={\r\n <MuiRadio\r\n size=\"small\"\r\n // MUI v9: aria-describedby routed through slotProps.input\r\n // to land on the inner <input type=\"radio\">, not on the\r\n // root span. SR users hear the helper as a description\r\n // when focusing the radio.\r\n slotProps={helperId ? { input: { \"aria-describedby\": helperId } } : undefined}\r\n sx={{\r\n padding: \"6px\",\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 }\r\n label={labelNode}\r\n sx={{\r\n margin: 0,\r\n alignItems: helper ? \"flex-start\" : \"center\",\r\n \"& .MuiFormControlLabel-label\": { fontSize: \"var(--text-sm)\" },\r\n }}\r\n />\r\n );\r\n })}\r\n </MuiRadioGroup>\r\n );\r\n}\r\n\r\nexport default Radio;\r\n"],"mappings":"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","ignoreList":[]}
|