@portnet/ui 6.0.1 → 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 +737 -0
- package/dist/esm/index.js +90 -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 -39
- 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 +146 -0
- package/dist/esm/v2/__tests__/FieldWidth.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FileCard.test.js +18 -18
- package/dist/esm/v2/__tests__/FileCard.test.js.map +1 -1
- package/dist/esm/v2/__tests__/FormikCheckbox.test.js +173 -0
- package/dist/esm/v2/__tests__/FormikCheckbox.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FormikDateTimePicker.test.js +236 -0
- package/dist/esm/v2/__tests__/FormikDateTimePicker.test.js.map +1 -0
- 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 +299 -0
- package/dist/esm/v2/__tests__/FormikRadioGroup.test.js.map +1 -0
- package/dist/esm/v2/__tests__/MobileRowCard.test.js +44 -43
- 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 -22
- 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 +118 -90
- 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 +210 -52
- 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 +64 -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 +14 -4
- 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 +26 -75
- 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 +130 -0
- package/dist/esm/v2/patterns/FormikCheckbox.js.map +1 -0
- 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 -66
- package/dist/esm/v2/patterns/FormikCombobox.js.map +1 -1
- package/dist/esm/v2/patterns/FormikDatePicker.js +51 -99
- package/dist/esm/v2/patterns/FormikDatePicker.js.map +1 -1
- package/dist/esm/v2/patterns/FormikDateTimePicker.js +136 -0
- package/dist/esm/v2/patterns/FormikDateTimePicker.js.map +1 -0
- 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 -50
- package/dist/esm/v2/patterns/FormikInput.js.map +1 -1
- package/dist/esm/v2/patterns/FormikRadioGroup.js +129 -0
- package/dist/esm/v2/patterns/FormikRadioGroup.js.map +1 -0
- 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 -84
- package/dist/esm/v2/patterns/FormikSelect.js.map +1 -1
- package/dist/esm/v2/patterns/FormikTextarea.js +30 -43
- package/dist/esm/v2/patterns/FormikTextarea.js.map +1 -1
- package/dist/esm/v2/patterns/KeyboardShortcutsHelp.js +64 -65
- 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 +127 -0
- package/dist/esm/v2/patterns/RowFavoriteToggle.js.map +1 -0
- 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 +72 -0
- package/dist/esm/v2/patterns/_pickerSerialisation.js.map +1 -0
- 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 +235 -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 +203 -0
- package/dist/esm/v2/personalization/capabilities/gridPreferences.js.map +1 -0
- package/dist/esm/v2/personalization/capabilities/index.js +5 -0
- package/dist/esm/v2/personalization/capabilities/index.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 +35 -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 +9 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +122 -47
- 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 +98 -69
- 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 +148 -0
- package/dist/v2/__tests__/FieldWidth.test.js.map +1 -0
- package/dist/v2/__tests__/FileCard.test.js +45 -48
- package/dist/v2/__tests__/FileCard.test.js.map +1 -1
- package/dist/v2/__tests__/FormikCheckbox.test.js +175 -0
- package/dist/v2/__tests__/FormikCheckbox.test.js.map +1 -0
- package/dist/v2/__tests__/FormikDateTimePicker.test.js +237 -0
- package/dist/v2/__tests__/FormikDateTimePicker.test.js.map +1 -0
- 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 +300 -0
- package/dist/v2/__tests__/FormikRadioGroup.test.js.map +1 -0
- package/dist/v2/__tests__/MobileRowCard.test.js +100 -102
- 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 +38 -46
- 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.d.ts.map +1 -1
- package/dist/v2/components/DateTimePicker.js +121 -95
- 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 +121 -5
- package/dist/v2/components/Field.d.ts.map +1 -1
- package/dist/v2/components/Field.js +221 -62
- 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 +67 -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.d.ts.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.d.ts +9 -9
- package/dist/v2/patterns/FavoriteColumn.d.ts.map +1 -1
- package/dist/v2/patterns/FavoriteColumn.js +32 -80
- 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.d.ts +77 -0
- package/dist/v2/patterns/FormikCheckbox.d.ts.map +1 -0
- package/dist/v2/patterns/FormikCheckbox.js +138 -0
- package/dist/v2/patterns/FormikCheckbox.js.map +1 -0
- 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.d.ts +7 -1
- package/dist/v2/patterns/FormikCombobox.d.ts.map +1 -1
- package/dist/v2/patterns/FormikCombobox.js +55 -69
- package/dist/v2/patterns/FormikCombobox.js.map +1 -1
- package/dist/v2/patterns/FormikDatePicker.d.ts +13 -1
- package/dist/v2/patterns/FormikDatePicker.d.ts.map +1 -1
- package/dist/v2/patterns/FormikDatePicker.js +59 -106
- package/dist/v2/patterns/FormikDatePicker.js.map +1 -1
- package/dist/v2/patterns/FormikDateTimePicker.d.ts +111 -0
- package/dist/v2/patterns/FormikDateTimePicker.d.ts.map +1 -0
- package/dist/v2/patterns/FormikDateTimePicker.js +144 -0
- package/dist/v2/patterns/FormikDateTimePicker.js.map +1 -0
- 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.d.ts +11 -1
- package/dist/v2/patterns/FormikInput.d.ts.map +1 -1
- package/dist/v2/patterns/FormikInput.js +45 -55
- package/dist/v2/patterns/FormikInput.js.map +1 -1
- package/dist/v2/patterns/FormikRadioGroup.d.ts +80 -0
- package/dist/v2/patterns/FormikRadioGroup.d.ts.map +1 -0
- package/dist/v2/patterns/FormikRadioGroup.js +137 -0
- package/dist/v2/patterns/FormikRadioGroup.js.map +1 -0
- 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.d.ts +9 -1
- package/dist/v2/patterns/FormikSelect.d.ts.map +1 -1
- package/dist/v2/patterns/FormikSelect.js +70 -89
- package/dist/v2/patterns/FormikSelect.js.map +1 -1
- package/dist/v2/patterns/FormikTextarea.d.ts +9 -1
- package/dist/v2/patterns/FormikTextarea.d.ts.map +1 -1
- package/dist/v2/patterns/FormikTextarea.js +35 -48
- package/dist/v2/patterns/FormikTextarea.js.map +1 -1
- package/dist/v2/patterns/KeyboardShortcutsHelp.d.ts +14 -1
- package/dist/v2/patterns/KeyboardShortcutsHelp.d.ts.map +1 -1
- package/dist/v2/patterns/KeyboardShortcutsHelp.js +71 -74
- 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 +98 -0
- package/dist/v2/patterns/RowFavoriteToggle.d.ts.map +1 -0
- package/dist/v2/patterns/RowFavoriteToggle.js +135 -0
- package/dist/v2/patterns/RowFavoriteToggle.js.map +1 -0
- 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.d.ts +44 -0
- package/dist/v2/patterns/_pickerSerialisation.d.ts.map +1 -0
- package/dist/v2/patterns/_pickerSerialisation.js +80 -0
- package/dist/v2/patterns/_pickerSerialisation.js.map +1 -0
- 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 +247 -0
- package/dist/v2/patterns/index.d.ts.map +1 -1
- package/dist/v2/patterns/index.js +182 -70
- 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.d.ts +100 -0
- package/dist/v2/personalization/capabilities/gridPreferences.d.ts.map +1 -0
- package/dist/v2/personalization/capabilities/gridPreferences.js +210 -0
- package/dist/v2/personalization/capabilities/gridPreferences.js.map +1 -0
- package/dist/v2/personalization/capabilities/index.d.ts +6 -0
- package/dist/v2/personalization/capabilities/index.d.ts.map +1 -1
- package/dist/v2/personalization/capabilities/index.js +23 -10
- package/dist/v2/personalization/capabilities/index.js.map +1 -1
- 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 +34 -0
- package/dist/v2/personalization/index.d.ts.map +1 -1
- package/dist/v2/personalization/index.js +41 -21
- 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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-palette.test.js","names":["_contrast","require","_chart","_tokens","WHITE","surface","DARK_SURFACE","dark","MIN_DELTA_E","parseHex","hex","h","replace","parseInt","slice","toLinear","channel","c","Math","pow","toLab","rgb","r","g","b","x","y","z","f","t","cbrt","fx","fy","fz","deltaE","a","la","lb","hypot","RGB_TO_LMS","LMS_TO_RGB","DEUTERANOPIA","PROTANOPIA","apply","m","v","simulate","deficiency","linear","seen","encode","clamped","min","max","srgb","round","worstCaseSeparation","ra","rb","describe","test","expect","chartCategorical","toHaveLength","CHART_CATEGORICAL_CORE","toBe","every","forEach","colour","index","passesContrast","contrastRatio","tooClose","i","length","j","separation","push","toFixed","toEqual","toBeGreaterThan","toBeLessThan","fill","chartColorOn","chartCategoricalOn","failures","filter","Number","NaN","chartColor","statusColours","Set","Object","values","status","flatMap","s","soft","toUpperCase","fg","overlap","has"],"sources":["../../../src/lib/v2/__tests__/chart-palette.test.ts"],"sourcesContent":["import { contrastRatio, passesContrast } from \"../utils/contrast\";\r\nimport {\r\n chartCategorical,\r\n chartCategoricalOn,\r\n chartColor,\r\n chartColorOn,\r\n CHART_CATEGORICAL_CORE,\r\n} from \"../tokens/chart\";\r\nimport { surface, dark, status } from \"../tokens\";\r\n\r\n/**\r\n * Categorical chart palette certification (gap G-37).\r\n *\r\n * WHY THIS FILE EXISTS\r\n * --------------------\r\n * `tokens/chart.ts` makes three claims that a consumer cannot check and that a\r\n * comment cannot keep true:\r\n *\r\n * 1. every fill clears the 3:1 non-text floor (WCAG 1.4.11 / R-C.3) on the\r\n * LIGHT surface;\r\n * 2. and on the DARK surface — which is what allows ONE array to serve both\r\n * themes, where `status` needs a `dark.status` override;\r\n * 3. the entries stay distinguishable from each other, INCLUDING under\r\n * colour-vision deficiency.\r\n *\r\n * The third is the one that matters most and is the least obvious. A pie chart\r\n * encodes its data in hue alone: two slices that collapse to the same colour\r\n * under deuteranopia do not merely look similar, they merge, and the reader\r\n * loses the datum. Roughly 8% of men have a red-green deficiency, so a palette\r\n * verified only under normal vision is verified for the easy case.\r\n *\r\n * Same discipline as contrast-palette.test.ts: ratios are COMPUTED here, never\r\n * copied from a comment. The palette this replaced — 32 hex literals across two\r\n * files in `refonte-frontend` — had none of the three properties verified, and\r\n * two of its entries (#0088FE / #2196f3) were a ~9 ΔE pair that merged under\r\n * both simulated dichromacies.\r\n */\r\n\r\nconst WHITE = surface.surface;\r\nconst DARK_SURFACE = dark.surface;\r\n\r\n/** Minimum separation demanded of any pair, in CIE76 ΔE units. */\r\nconst MIN_DELTA_E = 12;\r\n\r\ntype Rgb = readonly [number, number, number];\r\n\r\nfunction parseHex(hex: string): Rgb {\r\n const h = hex.replace(\"#\", \"\");\r\n return [\r\n parseInt(h.slice(0, 2), 16),\r\n parseInt(h.slice(2, 4), 16),\r\n parseInt(h.slice(4, 6), 16),\r\n ] as const;\r\n}\r\n\r\nfunction toLinear(channel: number): number {\r\n const c = channel / 255;\r\n return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\r\n}\r\n\r\n/* ── CIE L*a*b* + CIE76 ─────────────────────────────────────────────────────\r\n * CIE76 rather than CIEDE2000: it is a weaker metric, so a threshold that\r\n * passes under CIE76 is the more conservative claim, and it is short enough to\r\n * read in one sitting. */\r\nfunction toLab(rgb: Rgb): readonly [number, number, number] {\r\n const [r, g, b] = [toLinear(rgb[0]), toLinear(rgb[1]), toLinear(rgb[2])];\r\n const x = (0.4124 * r + 0.3576 * g + 0.1805 * b) / 0.95047;\r\n const y = 0.2126 * r + 0.7152 * g + 0.0722 * b;\r\n const z = (0.0193 * r + 0.1192 * g + 0.9505 * b) / 1.08883;\r\n const f = (t: number): number =>\r\n t > 216 / 24389 ? Math.cbrt(t) : (841 / 108) * t + 4 / 29;\r\n const [fx, fy, fz] = [f(x), f(y), f(z)];\r\n return [116 * fy - 16, 500 * (fx - fy), 200 * (fy - fz)] as const;\r\n}\r\n\r\nfunction deltaE(a: Rgb, b: Rgb): number {\r\n const la = toLab(a);\r\n const lb = toLab(b);\r\n return Math.hypot(la[0] - lb[0], la[1] - lb[1], la[2] - lb[2]);\r\n}\r\n\r\n/* ── Dichromacy simulation (Viénot, Brettel & Mollon 1999) ──────────────────\r\n * Linear RGB → LMS, collapse the missing cone response, back to sRGB. */\r\ntype Matrix = readonly [Rgb, Rgb, Rgb];\r\n\r\nconst RGB_TO_LMS: Matrix = [\r\n [17.8824, 43.5161, 4.11935],\r\n [3.45565, 27.1554, 3.86714],\r\n [0.0299566, 0.184309, 1.46709],\r\n] as const;\r\n\r\nconst LMS_TO_RGB: Matrix = [\r\n [0.080944, -0.130504, 0.116721],\r\n [-0.0102485, 0.0540194, -0.113615],\r\n [-0.000365294, -0.00412163, 0.693513],\r\n] as const;\r\n\r\n/** Green-cone deficiency. */\r\nconst DEUTERANOPIA: Matrix = [\r\n [1, 0, 0],\r\n [0.494207, 0, 1.24827],\r\n [0, 0, 1],\r\n] as const;\r\n\r\n/** Red-cone deficiency. */\r\nconst PROTANOPIA: Matrix = [\r\n [0, 2.02344, -2.52581],\r\n [0, 1, 0],\r\n [0, 0, 1],\r\n] as const;\r\n\r\nfunction apply(m: Matrix, v: Rgb): Rgb {\r\n return [\r\n m[0][0] * v[0] + m[0][1] * v[1] + m[0][2] * v[2],\r\n m[1][0] * v[0] + m[1][1] * v[1] + m[1][2] * v[2],\r\n m[2][0] * v[0] + m[2][1] * v[1] + m[2][2] * v[2],\r\n ] as const;\r\n}\r\n\r\nfunction simulate(rgb: Rgb, deficiency: Matrix): Rgb {\r\n const linear: Rgb = [toLinear(rgb[0]), toLinear(rgb[1]), toLinear(rgb[2])] as const;\r\n const seen = apply(LMS_TO_RGB, apply(deficiency, apply(RGB_TO_LMS, linear)));\r\n const encode = (c: number): number => {\r\n const clamped = Math.min(1, Math.max(0, c));\r\n const srgb =\r\n clamped <= 0.0031308\r\n ? 12.92 * clamped\r\n : 1.055 * Math.pow(clamped, 1 / 2.4) - 0.055;\r\n return Math.round(Math.min(1, Math.max(0, srgb)) * 255);\r\n };\r\n return [encode(seen[0]), encode(seen[1]), encode(seen[2])] as const;\r\n}\r\n\r\n/** Worst-case separation: normal vision, deuteranopia, protanopia. */\r\nfunction worstCaseSeparation(a: string, b: string): number {\r\n const ra = parseHex(a);\r\n const rb = parseHex(b);\r\n return Math.min(\r\n deltaE(ra, rb),\r\n deltaE(simulate(ra, DEUTERANOPIA), simulate(rb, DEUTERANOPIA)),\r\n deltaE(simulate(ra, PROTANOPIA), simulate(rb, PROTANOPIA))\r\n );\r\n}\r\n\r\ndescribe(\"Categorical chart palette (tokens/chart)\", () => {\r\n test(\"shape is pinned — 12 entries, 8 of them the hue-balanced core\", () => {\r\n expect(chartCategorical).toHaveLength(12);\r\n expect(CHART_CATEGORICAL_CORE).toBe(8);\r\n expect(chartCategorical.every((c) => /^#[0-9A-F]{6}$/.test(c))).toBe(true);\r\n });\r\n\r\n describe(\"non-text contrast ≥ 3:1 (WCAG 1.4.11 / R-C.3)\", () => {\r\n chartCategorical.forEach((colour, index) => {\r\n test(`--chart-${index + 1} (${colour}) on the light surface`, () => {\r\n expect(passesContrast(contrastRatio(colour, WHITE), \"ui\")).toBe(true);\r\n });\r\n\r\n /**\r\n * The dark-surface half is what earns this palette a single array. If a\r\n * future hue is nudged out of the luminance window, THIS is the test that\r\n * fails, and the remedy is to re-solve the lightness — not to add a\r\n * `dark.chart` override, which would double the surface to maintain.\r\n */\r\n test(`--chart-${index + 1} (${colour}) on the dark surface`, () => {\r\n expect(passesContrast(contrastRatio(colour, DARK_SURFACE), \"ui\")).toBe(true);\r\n });\r\n });\r\n });\r\n\r\n describe(\"mutual distinguishability, normal vision and dichromacy\", () => {\r\n test(`every pair is ≥ ${MIN_DELTA_E} ΔE in the worst of three vision models`, () => {\r\n const tooClose: string[] = [];\r\n for (let i = 0; i < chartCategorical.length; i += 1) {\r\n for (let j = i + 1; j < chartCategorical.length; j += 1) {\r\n const a = chartCategorical[i] as string;\r\n const b = chartCategorical[j] as string;\r\n const separation = worstCaseSeparation(a, b);\r\n if (separation < MIN_DELTA_E) {\r\n tooClose.push(\r\n `${a} (${i + 1}) vs ${b} (${j + 1}) — ${separation.toFixed(1)} ΔE`\r\n );\r\n }\r\n }\r\n }\r\n expect(tooClose).toEqual([]);\r\n });\r\n\r\n /**\r\n * The tightest pair, asserted at its MEASURED value rather than at the\r\n * threshold — the convention this repository already uses in\r\n * contrast-palette.test.ts, so that drift shows up as a diff instead of as\r\n * a pass that quietly got worse.\r\n */\r\n test(\"the closest pair is red vs olive, at ~12.4 ΔE\", () => {\r\n const separation = worstCaseSeparation(\"#C92E1D\", \"#3B7911\");\r\n expect(separation).toBeGreaterThan(12);\r\n expect(separation).toBeLessThan(13);\r\n });\r\n });\r\n\r\n describe(\"chartColorOn() — text drawn ON a slice is AA (WCAG 1.4.3)\", () => {\r\n chartCategorical.forEach((fill, index) => {\r\n test(`label on --chart-${index + 1} (${fill})`, () => {\r\n expect(passesContrast(contrastRatio(chartColorOn(index), fill), \"normal\")).toBe(\r\n true\r\n );\r\n });\r\n });\r\n\r\n test(\"the label array is index-aligned with the palette\", () => {\r\n expect(chartCategoricalOn).toHaveLength(chartCategorical.length);\r\n });\r\n\r\n /**\r\n * The regression this closes: `refonte-frontend` printed `fill=\"white\"` on\r\n * every pie label. Asserted here so the two-tier palette can never be\r\n * paired with a single label colour again — white FAILS on the light tier.\r\n */\r\n test(\"a single white label colour would NOT satisfy AA on every entry\", () => {\r\n const failures = chartCategorical.filter(\r\n (fill) => !passesContrast(contrastRatio(\"#FFFFFF\", fill), \"normal\")\r\n );\r\n expect(failures.length).toBeGreaterThan(0);\r\n });\r\n\r\n test(\"bad input resolves to the first label colour\", () => {\r\n expect(chartColorOn(-1)).toBe(chartCategoricalOn[0]);\r\n expect(chartColorOn(Number.NaN)).toBe(chartCategoricalOn[0]);\r\n expect(chartColorOn(12)).toBe(chartCategoricalOn[0]);\r\n });\r\n });\r\n\r\n describe(\"chartColor()\", () => {\r\n test(\"returns the palette in order\", () => {\r\n chartCategorical.forEach((colour, index) => {\r\n expect(chartColor(index)).toBe(colour);\r\n });\r\n });\r\n\r\n test(\"cycles past the end\", () => {\r\n expect(chartColor(12)).toBe(chartCategorical[0]);\r\n expect(chartColor(13)).toBe(chartCategorical[1]);\r\n });\r\n\r\n test(\"bad input resolves to the first entry instead of throwing\", () => {\r\n expect(chartColor(-1)).toBe(chartCategorical[0]);\r\n expect(chartColor(Number.NaN)).toBe(chartCategorical[0]);\r\n });\r\n\r\n test(\"fractional indices floor rather than producing undefined\", () => {\r\n expect(chartColor(2.7)).toBe(chartCategorical[2]);\r\n });\r\n });\r\n\r\n /**\r\n * A categorical palette must not be mistaken for the workflow palette. These\r\n * are different vocabularies (R-2.2 reserves `status` for canonical workflow\r\n * states), and a value shared between them would invite exactly the confusion\r\n * the split exists to prevent.\r\n */\r\n test(\"no entry duplicates a workflow status colour\", () => {\r\n const statusColours = new Set(\r\n Object.values(status).flatMap((s) => [\r\n s.soft.toUpperCase(),\r\n s.fg.toUpperCase(),\r\n ])\r\n );\r\n const overlap = chartCategorical.filter((c) => statusColours.has(c.toUpperCase()));\r\n expect(overlap).toEqual([]);\r\n });\r\n});\r\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -2,12 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
var _contrast = require("../utils/contrast");
|
|
4
4
|
var _tokens = require("../tokens");
|
|
5
|
-
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
6
|
-
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
7
|
-
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
8
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
9
|
-
function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0) { ; } } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i["return"] && (_r = _i["return"](), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
|
|
10
|
-
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
11
5
|
/**
|
|
12
6
|
* Token-palette contrast certification (Charter §05.1 / WCAG 2.1 AA).
|
|
13
7
|
*
|
|
@@ -28,43 +22,30 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
|
28
22
|
*/
|
|
29
23
|
|
|
30
24
|
/** Every light-mode surface that body text can land on. */
|
|
31
|
-
|
|
32
|
-
describe("Token palette — WCAG AA contrast (R-C.1 / R-C.2 / R-C.3)",
|
|
33
|
-
describe("ink on light surfaces — normal text ≥ 4.5:1",
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
name = _LIGHT_SURFACES$_i[0],
|
|
37
|
-
bg = _LIGHT_SURFACES$_i[1];
|
|
38
|
-
test("fg on ".concat(name), function () {
|
|
25
|
+
const LIGHT_SURFACES = [["surface", _tokens.surface.surface], ["bgElev", _tokens.surface.bgElev], ["bg", _tokens.surface.bg], ["bgSubtle", _tokens.surface.bgSubtle]];
|
|
26
|
+
describe("Token palette — WCAG AA contrast (R-C.1 / R-C.2 / R-C.3)", () => {
|
|
27
|
+
describe("ink on light surfaces — normal text ≥ 4.5:1", () => {
|
|
28
|
+
for (const [name, bg] of LIGHT_SURFACES) {
|
|
29
|
+
test(`fg on ${name}`, () => {
|
|
39
30
|
expect((0, _contrast.passesContrast)((0, _contrast.contrastRatio)(_tokens.ink.fg, bg), "normal")).toBe(true);
|
|
40
31
|
});
|
|
41
|
-
test(
|
|
32
|
+
test(`fgMuted on ${name}`, () => {
|
|
42
33
|
expect((0, _contrast.passesContrast)((0, _contrast.contrastRatio)(_tokens.ink.fgMuted, bg), "normal")).toBe(true);
|
|
43
34
|
});
|
|
44
|
-
};
|
|
45
|
-
for (var _i = 0, _LIGHT_SURFACES = LIGHT_SURFACES; _i < _LIGHT_SURFACES.length; _i++) {
|
|
46
|
-
_loop();
|
|
47
35
|
}
|
|
48
|
-
test("fgInverse on the darkest dark surface",
|
|
36
|
+
test("fgInverse on the darkest dark surface", () => {
|
|
49
37
|
expect((0, _contrast.passesContrast)((0, _contrast.contrastRatio)(_tokens.ink.fgInverse, _tokens.dark.bg), "normal")).toBe(true);
|
|
50
38
|
});
|
|
51
39
|
});
|
|
52
|
-
describe("semantic fg — readable on white AND on its own soft fill",
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
name = _pairs$_i[0],
|
|
57
|
-
fg = _pairs$_i[1],
|
|
58
|
-
soft = _pairs$_i[2];
|
|
59
|
-
test("".concat(name, "Fg on white"), function () {
|
|
40
|
+
describe("semantic fg — readable on white AND on its own soft fill", () => {
|
|
41
|
+
const pairs = [["success", _tokens.semantic.successFg, _tokens.semantic.successSoft], ["warning", _tokens.semantic.warningFg, _tokens.semantic.warningSoft], ["danger", _tokens.semantic.dangerFg, _tokens.semantic.dangerSoft], ["info", _tokens.semantic.infoFg, _tokens.semantic.infoSoft]];
|
|
42
|
+
for (const [name, fg, soft] of pairs) {
|
|
43
|
+
test(`${name}Fg on white`, () => {
|
|
60
44
|
expect((0, _contrast.passesContrast)((0, _contrast.contrastRatio)(fg, "#FFFFFF"), "normal")).toBe(true);
|
|
61
45
|
});
|
|
62
|
-
test(
|
|
46
|
+
test(`${name}Fg on ${name}Soft`, () => {
|
|
63
47
|
expect((0, _contrast.passesContrast)((0, _contrast.contrastRatio)(fg, soft), "normal")).toBe(true);
|
|
64
48
|
});
|
|
65
|
-
};
|
|
66
|
-
for (var _i2 = 0, _pairs = pairs; _i2 < _pairs.length; _i2++) {
|
|
67
|
-
_loop2();
|
|
68
49
|
}
|
|
69
50
|
});
|
|
70
51
|
|
|
@@ -72,63 +53,50 @@ describe("Token palette — WCAG AA contrast (R-C.1 / R-C.2 / R-C.3)", function
|
|
|
72
53
|
* The Charter's promise in §02.1: "Combinaison background -soft +
|
|
73
54
|
* foreground -fg = AA garanti." This is that promise, enforced.
|
|
74
55
|
*/
|
|
75
|
-
describe("status palette — every -fg on its own -soft is AA (§02.1)",
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
56
|
+
describe("status palette — every -fg on its own -soft is AA (§02.1)", () => {
|
|
57
|
+
for (const key of Object.keys(_tokens.status)) {
|
|
58
|
+
test(`status.${key}`, () => {
|
|
59
|
+
const {
|
|
60
|
+
soft,
|
|
61
|
+
fg
|
|
62
|
+
} = _tokens.status[key];
|
|
82
63
|
expect((0, _contrast.passesContrast)((0, _contrast.contrastRatio)(fg, soft), "normal")).toBe(true);
|
|
83
64
|
});
|
|
84
|
-
test(
|
|
65
|
+
test(`status.${key} fg on white`, () => {
|
|
85
66
|
expect((0, _contrast.passesContrast)((0, _contrast.contrastRatio)(_tokens.status[key].fg, "#FFFFFF"), "normal")).toBe(true);
|
|
86
67
|
});
|
|
87
|
-
};
|
|
88
|
-
for (var _i3 = 0, _arr2 = Object.keys(_tokens.status); _i3 < _arr2.length; _i3++) {
|
|
89
|
-
_loop3();
|
|
90
68
|
}
|
|
91
69
|
});
|
|
92
|
-
describe("non-text UI ≥ 3:1 (WCAG 1.4.11 / R-C.3)",
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
name = _saturated$_i[0],
|
|
97
|
-
colour = _saturated$_i[1];
|
|
98
|
-
test("".concat(name, " (icon / border grade) on white"), function () {
|
|
70
|
+
describe("non-text UI ≥ 3:1 (WCAG 1.4.11 / R-C.3)", () => {
|
|
71
|
+
const saturated = [["success", _tokens.semantic.success], ["warning", _tokens.semantic.warning], ["danger", _tokens.semantic.danger], ["info", _tokens.semantic.info]];
|
|
72
|
+
for (const [name, colour] of saturated) {
|
|
73
|
+
test(`${name} (icon / border grade) on white`, () => {
|
|
99
74
|
expect((0, _contrast.passesContrast)((0, _contrast.contrastRatio)(colour, "#FFFFFF"), "ui")).toBe(true);
|
|
100
75
|
});
|
|
101
|
-
};
|
|
102
|
-
for (var _i4 = 0, _saturated = saturated; _i4 < _saturated.length; _i4++) {
|
|
103
|
-
_loop4();
|
|
104
76
|
}
|
|
105
77
|
});
|
|
106
|
-
describe("brand",
|
|
107
|
-
test("accent on white is AA for normal text",
|
|
78
|
+
describe("brand", () => {
|
|
79
|
+
test("accent on white is AA for normal text", () => {
|
|
108
80
|
expect((0, _contrast.passesContrast)((0, _contrast.contrastRatio)(_tokens.brand.accent, "#FFFFFF"), "normal")).toBe(true);
|
|
109
81
|
});
|
|
110
|
-
test("accentFg on accent — the primary-button pair",
|
|
82
|
+
test("accentFg on accent — the primary-button pair", () => {
|
|
111
83
|
expect((0, _contrast.passesContrast)((0, _contrast.contrastRatio)(_tokens.brand.accentFg, _tokens.brand.accent), "normal")).toBe(true);
|
|
112
84
|
});
|
|
113
|
-
test("accentHover keeps AA against accentFg (pressed state stays readable)",
|
|
85
|
+
test("accentHover keeps AA against accentFg (pressed state stays readable)", () => {
|
|
114
86
|
expect((0, _contrast.passesContrast)((0, _contrast.contrastRatio)(_tokens.brand.accentFg, _tokens.brand.accentHover), "normal")).toBe(true);
|
|
115
87
|
});
|
|
116
88
|
});
|
|
117
|
-
describe("dark mode",
|
|
118
|
-
test("dark.fg on dark.surface",
|
|
89
|
+
describe("dark mode", () => {
|
|
90
|
+
test("dark.fg on dark.surface", () => {
|
|
119
91
|
expect((0, _contrast.passesContrast)((0, _contrast.contrastRatio)(_tokens.dark.fg, _tokens.dark.surface), "normal")).toBe(true);
|
|
120
92
|
});
|
|
121
|
-
test("dark.fgMuted on dark.surface",
|
|
93
|
+
test("dark.fgMuted on dark.surface", () => {
|
|
122
94
|
expect((0, _contrast.passesContrast)((0, _contrast.contrastRatio)(_tokens.dark.fgMuted, _tokens.dark.surface), "normal")).toBe(true);
|
|
123
95
|
});
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
test("dark status.".concat(key, ".fg on dark.surface"), function () {
|
|
96
|
+
for (const key of Object.keys(_tokens.dark.status)) {
|
|
97
|
+
test(`dark status.${key}.fg on dark.surface`, () => {
|
|
127
98
|
expect((0, _contrast.passesContrast)((0, _contrast.contrastRatio)(_tokens.dark.status[key].fg, _tokens.dark.surface), "normal")).toBe(true);
|
|
128
99
|
});
|
|
129
|
-
};
|
|
130
|
-
for (var _i5 = 0, _arr3 = Object.keys(_tokens.dark.status); _i5 < _arr3.length; _i5++) {
|
|
131
|
-
_loop5();
|
|
132
100
|
}
|
|
133
101
|
});
|
|
134
102
|
|
|
@@ -138,7 +106,7 @@ describe("Token palette — WCAG AA contrast (R-C.1 / R-C.2 / R-C.3)", function
|
|
|
138
106
|
* any drift shows up as a diff. Both need a palette decision, not a
|
|
139
107
|
* test change.
|
|
140
108
|
* ══════════════════════════════════════════════════════════════════ */
|
|
141
|
-
describe("KNOWN AA FAILURES (documented, pending decision)",
|
|
109
|
+
describe("KNOWN AA FAILURES (documented, pending decision)", () => {
|
|
142
110
|
/**
|
|
143
111
|
* A9-01 — `fgSubtle` on `bgSubtle` ≈ 4.32:1, below the 4.5 floor.
|
|
144
112
|
*
|
|
@@ -158,8 +126,8 @@ describe("Token palette — WCAG AA contrast (R-C.1 / R-C.2 / R-C.3)", function
|
|
|
158
126
|
* fleet-wide), or switch those labels to `--fg-muted` (AAA, 7.5:1 on
|
|
159
127
|
* bgSubtle) which is what every other label surface already uses.
|
|
160
128
|
*/
|
|
161
|
-
test("fgSubtle on bgSubtle is BELOW AA — ~4.32:1",
|
|
162
|
-
|
|
129
|
+
test("fgSubtle on bgSubtle is BELOW AA — ~4.32:1", () => {
|
|
130
|
+
const ratio = (0, _contrast.contrastRatio)(_tokens.ink.fgSubtle, _tokens.surface.bgSubtle);
|
|
163
131
|
expect(ratio).not.toBeNull();
|
|
164
132
|
expect(ratio).toBeLessThan(_contrast.WCAG_AA_NORMAL);
|
|
165
133
|
expect(ratio).toBeGreaterThan(4.2);
|
|
@@ -185,8 +153,8 @@ describe("Token palette — WCAG AA contrast (R-C.1 / R-C.2 / R-C.3)", function
|
|
|
185
153
|
* #868FA3 / #8A92A5; change the token and this assertion flips to the
|
|
186
154
|
* `passesContrast(..., "ui")` form.
|
|
187
155
|
*/
|
|
188
|
-
test("borderStrong on white is BELOW 3:1 — ~2.87:1 (comment in colors.ts is wrong)",
|
|
189
|
-
|
|
156
|
+
test("borderStrong on white is BELOW 3:1 — ~2.87:1 (comment in colors.ts is wrong)", () => {
|
|
157
|
+
const ratio = (0, _contrast.contrastRatio)(_tokens.border.borderStrong, "#FFFFFF");
|
|
190
158
|
expect(ratio).not.toBeNull();
|
|
191
159
|
expect(ratio).toBeLessThan(_contrast.WCAG_AA_UI_NON_TEXT);
|
|
192
160
|
expect(ratio).toBeGreaterThan(2.8);
|
|
@@ -201,8 +169,8 @@ describe("Token palette — WCAG AA contrast (R-C.1 / R-C.2 / R-C.3)", function
|
|
|
201
169
|
* consuming modules (neither sets `[data-theme="dark"]` on <html>), which
|
|
202
170
|
* is why nobody has seen it — see the RGESN R-9.5 note in the handover.
|
|
203
171
|
*/
|
|
204
|
-
test("dark.borderStrong on dark.surface is BELOW 3:1 — ~2.28:1",
|
|
205
|
-
|
|
172
|
+
test("dark.borderStrong on dark.surface is BELOW 3:1 — ~2.28:1", () => {
|
|
173
|
+
const ratio = (0, _contrast.contrastRatio)(_tokens.dark.borderStrong, _tokens.dark.surface);
|
|
206
174
|
expect(ratio).not.toBeNull();
|
|
207
175
|
expect(ratio).toBeLessThan(_contrast.WCAG_AA_UI_NON_TEXT);
|
|
208
176
|
expect(ratio).toBeGreaterThan(2.2);
|
|
@@ -215,8 +183,8 @@ describe("Token palette — WCAG AA contrast (R-C.1 / R-C.2 / R-C.3)", function
|
|
|
215
183
|
* restriction is machine-checked rather than comment-only: it fails BOTH
|
|
216
184
|
* the text floor and the 3:1 non-text floor.
|
|
217
185
|
*/
|
|
218
|
-
test("brandSecondary text pair is BELOW AA and below 3:1 — fills only",
|
|
219
|
-
|
|
186
|
+
test("brandSecondary text pair is BELOW AA and below 3:1 — fills only", () => {
|
|
187
|
+
const ratio = (0, _contrast.contrastRatio)(_tokens.brandSecondary.secondaryFg, _tokens.brandSecondary.secondary);
|
|
220
188
|
expect(ratio).not.toBeNull();
|
|
221
189
|
expect(ratio).toBeLessThan(_contrast.WCAG_AA_UI_NON_TEXT);
|
|
222
190
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contrast-palette.test.js","names":["_contrast","require","_tokens","_slicedToArray","arr","i","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","TypeError","o","minLen","_arrayLikeToArray","n","Object","prototype","toString","call","slice","constructor","name","Array","from","test","len","length","arr2","_i","Symbol","iterator","_s","_e","_x","_r","_arr","_n","_d","next","done","push","value","err","isArray","LIGHT_SURFACES","surface","bgElev","bg","bgSubtle","describe","_loop","_LIGHT_SURFACES$_i","_LIGHT_SURFACES","concat","expect","passesContrast","contrastRatio","ink","fg","toBe","fgMuted","fgInverse","dark","pairs","semantic","successFg","successSoft","warningFg","warningSoft","dangerFg","dangerSoft","infoFg","infoSoft","_loop2","_pairs$_i","_pairs","_i2","soft","_loop3","key","_arr2","_i3","_status$key","status","keys","saturated","success","warning","danger","info","_loop4","_saturated$_i","_saturated","_i4","colour","brand","accent","accentFg","accentHover","_loop5","_arr3","_i5","ratio","fgSubtle","not","toBeNull","toBeLessThan","WCAG_AA_NORMAL","toBeGreaterThan","border","borderStrong","WCAG_AA_UI_NON_TEXT","brandSecondary","secondaryFg","secondary"],"sources":["../../../src/lib/v2/__tests__/contrast-palette.test.ts"],"sourcesContent":["import {\r\n contrastRatio,\r\n passesContrast,\r\n WCAG_AA_NORMAL,\r\n WCAG_AA_UI_NON_TEXT,\r\n} from \"../utils/contrast\";\r\nimport { ink, surface, border, semantic, status, brand, brandSecondary, dark } from \"../tokens\";\r\n\r\n/**\r\n * Token-palette contrast certification (Charter §05.1 / WCAG 2.1 AA).\r\n *\r\n * WHY THIS FILE EXISTS\r\n * --------------------\r\n * R-C.1 / R-C.2 / R-C.3 are MUST rules, and until now nothing verified them.\r\n * `utils/contrast.ts` shipped a correct WCAG ratio implementation and had no\r\n * test asserting the palette it exists to check; the ratios in `colors.ts` were\r\n * hand-written COMMENTS, unenforced — exactly the class of claim that drifts\r\n * silently when a hue is nudged.\r\n *\r\n * Contrast is one of the few a11y rules that is fully computable without a\r\n * browser, so it belongs in CI rather than in a manual audit pass.\r\n *\r\n * Found by writing it: `fgSubtle` on `bgSubtle` is ~4.32:1 — BELOW AA. See the\r\n * documented-failure block at the bottom; that is a real finding, not a test\r\n * artefact.\r\n */\r\n\r\n/** Every light-mode surface that body text can land on. */\r\nconst LIGHT_SURFACES: Array<[string, string]> = [\r\n [\"surface\", surface.surface],\r\n [\"bgElev\", surface.bgElev],\r\n [\"bg\", surface.bg],\r\n [\"bgSubtle\", surface.bgSubtle],\r\n];\r\n\r\ndescribe(\"Token palette — WCAG AA contrast (R-C.1 / R-C.2 / R-C.3)\", () => {\r\n describe(\"ink on light surfaces — normal text ≥ 4.5:1\", () => {\r\n for (const [name, bg] of LIGHT_SURFACES) {\r\n test(`fg on ${name}`, () => {\r\n expect(passesContrast(contrastRatio(ink.fg, bg), \"normal\")).toBe(true);\r\n });\r\n test(`fgMuted on ${name}`, () => {\r\n expect(passesContrast(contrastRatio(ink.fgMuted, bg), \"normal\")).toBe(true);\r\n });\r\n }\r\n\r\n test(\"fgInverse on the darkest dark surface\", () => {\r\n expect(passesContrast(contrastRatio(ink.fgInverse, dark.bg), \"normal\")).toBe(true);\r\n });\r\n });\r\n\r\n describe(\"semantic fg — readable on white AND on its own soft fill\", () => {\r\n const pairs: Array<[string, string, string]> = [\r\n [\"success\", semantic.successFg, semantic.successSoft],\r\n [\"warning\", semantic.warningFg, semantic.warningSoft],\r\n [\"danger\", semantic.dangerFg, semantic.dangerSoft],\r\n [\"info\", semantic.infoFg, semantic.infoSoft],\r\n ];\r\n for (const [name, fg, soft] of pairs) {\r\n test(`${name}Fg on white`, () => {\r\n expect(passesContrast(contrastRatio(fg, \"#FFFFFF\"), \"normal\")).toBe(true);\r\n });\r\n test(`${name}Fg on ${name}Soft`, () => {\r\n expect(passesContrast(contrastRatio(fg, soft), \"normal\")).toBe(true);\r\n });\r\n }\r\n });\r\n\r\n /**\r\n * The Charter's promise in §02.1: \"Combinaison background -soft +\r\n * foreground -fg = AA garanti.\" This is that promise, enforced.\r\n */\r\n describe(\"status palette — every -fg on its own -soft is AA (§02.1)\", () => {\r\n for (const key of Object.keys(status) as Array<keyof typeof status>) {\r\n test(`status.${key}`, () => {\r\n const { soft, fg } = status[key];\r\n expect(passesContrast(contrastRatio(fg, soft), \"normal\")).toBe(true);\r\n });\r\n test(`status.${key} fg on white`, () => {\r\n expect(passesContrast(contrastRatio(status[key].fg, \"#FFFFFF\"), \"normal\")).toBe(true);\r\n });\r\n }\r\n });\r\n\r\n describe(\"non-text UI ≥ 3:1 (WCAG 1.4.11 / R-C.3)\", () => {\r\n const saturated: Array<[string, string]> = [\r\n [\"success\", semantic.success],\r\n [\"warning\", semantic.warning],\r\n [\"danger\", semantic.danger],\r\n [\"info\", semantic.info],\r\n ];\r\n for (const [name, colour] of saturated) {\r\n test(`${name} (icon / border grade) on white`, () => {\r\n expect(passesContrast(contrastRatio(colour, \"#FFFFFF\"), \"ui\")).toBe(true);\r\n });\r\n }\r\n });\r\n\r\n describe(\"brand\", () => {\r\n test(\"accent on white is AA for normal text\", () => {\r\n expect(passesContrast(contrastRatio(brand.accent, \"#FFFFFF\"), \"normal\")).toBe(true);\r\n });\r\n test(\"accentFg on accent — the primary-button pair\", () => {\r\n expect(passesContrast(contrastRatio(brand.accentFg, brand.accent), \"normal\")).toBe(true);\r\n });\r\n test(\"accentHover keeps AA against accentFg (pressed state stays readable)\", () => {\r\n expect(passesContrast(contrastRatio(brand.accentFg, brand.accentHover), \"normal\")).toBe(true);\r\n });\r\n });\r\n\r\n describe(\"dark mode\", () => {\r\n test(\"dark.fg on dark.surface\", () => {\r\n expect(passesContrast(contrastRatio(dark.fg, dark.surface), \"normal\")).toBe(true);\r\n });\r\n test(\"dark.fgMuted on dark.surface\", () => {\r\n expect(passesContrast(contrastRatio(dark.fgMuted, dark.surface), \"normal\")).toBe(true);\r\n });\r\n for (const key of Object.keys(dark.status) as Array<keyof typeof dark.status>) {\r\n test(`dark status.${key}.fg on dark.surface`, () => {\r\n expect(\r\n passesContrast(contrastRatio(dark.status[key].fg, dark.surface), \"normal\")\r\n ).toBe(true);\r\n });\r\n }\r\n });\r\n\r\n /* ══════════════════════════════════════════════════════════════════\r\n * DOCUMENTED FAILURES — asserted at their MEASURED value, not at the\r\n * threshold, so the suite stays green while the breach stays visible and\r\n * any drift shows up as a diff. Both need a palette decision, not a\r\n * test change.\r\n * ══════════════════════════════════════════════════════════════════ */\r\n describe(\"KNOWN AA FAILURES (documented, pending decision)\", () => {\r\n /**\r\n * A9-01 — `fgSubtle` on `bgSubtle` ≈ 4.32:1, below the 4.5 floor.\r\n *\r\n * `colors.ts` documents fgSubtle as \"AA · 4.81:1 on white — incidental\r\n * text only (WCAG 1.4.6)\". On white that holds. On `bgSubtle` it does not,\r\n * and the exemption does not rescue it, because fgSubtle is NOT used only\r\n * for incidental text — it colours KV eyebrow labels, section captions and\r\n * hero stat labels, all of which name the value beside them.\r\n *\r\n * LIVE BREACH: both preview drawers put `--fg-subtle` labels on a\r\n * `--bg-subtle` hero panel (dfd `GestionDFDPreviewDrawer` HERO_BOX_STYLE +\r\n * HERO_LABEL_STYLE, ti `GestionTIPreviewDrawer` HERO_STAT_LABEL_STYLE), at\r\n * `--text-xs` (12px) — too small to qualify as large text, so the 4.5\r\n * floor applies.\r\n *\r\n * FIX OPTIONS: darken fgSubtle (affects the muted/subtle hierarchy\r\n * fleet-wide), or switch those labels to `--fg-muted` (AAA, 7.5:1 on\r\n * bgSubtle) which is what every other label surface already uses.\r\n */\r\n test(\"fgSubtle on bgSubtle is BELOW AA — ~4.32:1\", () => {\r\n const ratio = contrastRatio(ink.fgSubtle, surface.bgSubtle);\r\n expect(ratio).not.toBeNull();\r\n expect(ratio as number).toBeLessThan(WCAG_AA_NORMAL);\r\n expect(ratio as number).toBeGreaterThan(4.2);\r\n // It DOES pass on white — the failure is surface-specific.\r\n expect(passesContrast(contrastRatio(ink.fgSubtle, \"#FFFFFF\"), \"normal\")).toBe(true);\r\n });\r\n\r\n /**\r\n * A9-02 — `borderStrong` ≈ 2.87:1 on white. BELOW the 3:1 non-text floor.\r\n *\r\n * ⚠️ The token's own comment in `colors.ts` reads:\r\n * borderStrong: \"#9099AA\", // WCAG 1.4.11 · ≥ 3:1 against white\r\n * That claim is FALSE. This is precisely the drift this file exists to\r\n * catch — an unenforced hand-written ratio that nobody re-derived.\r\n *\r\n * IMPACT depends on usage. `--border-strong` currently colours the\r\n * scrollbar thumb (`base.css`) and the `kbd` bottom edge in\r\n * KeyboardShortcutsHelp. If it is ever used for an INPUT border or any\r\n * other control boundary, 1.4.11 applies and the breach is live — audit\r\n * usage before deciding severity.\r\n *\r\n * FIX: darken to relative luminance ≤ 0.30 (currently 0.316). Roughly\r\n * #868FA3 / #8A92A5; change the token and this assertion flips to the\r\n * `passesContrast(..., \"ui\")` form.\r\n */\r\n test(\"borderStrong on white is BELOW 3:1 — ~2.87:1 (comment in colors.ts is wrong)\", () => {\r\n const ratio = contrastRatio(border.borderStrong, \"#FFFFFF\");\r\n expect(ratio).not.toBeNull();\r\n expect(ratio as number).toBeLessThan(WCAG_AA_UI_NON_TEXT);\r\n expect(ratio as number).toBeGreaterThan(2.8);\r\n });\r\n\r\n /**\r\n * A9-03 — `dark.borderStrong` ≈ 2.28:1 on `dark.surface`. Worse than the\r\n * light-mode equivalent, and the same 1.4.11 floor applies in dark mode.\r\n *\r\n * FIX: lighten to relative luminance ≥ 0.119 (currently 0.078) — roughly\r\n * #5C6478 or lighter. Note dark mode is currently UNREACHABLE in both\r\n * consuming modules (neither sets `[data-theme=\"dark\"]` on <html>), which\r\n * is why nobody has seen it — see the RGESN R-9.5 note in the handover.\r\n */\r\n test(\"dark.borderStrong on dark.surface is BELOW 3:1 — ~2.28:1\", () => {\r\n const ratio = contrastRatio(dark.borderStrong, dark.surface);\r\n expect(ratio).not.toBeNull();\r\n expect(ratio as number).toBeLessThan(WCAG_AA_UI_NON_TEXT);\r\n expect(ratio as number).toBeGreaterThan(2.2);\r\n });\r\n\r\n /**\r\n * Already flagged in colors.ts itself: secondaryFg (#FFFFFF) on\r\n * secondary (#4FB8CF) ≈ 1.96:1. The token comment restricts it to\r\n * chip/badge surfaces and non-text accent fills. Asserted here so the\r\n * restriction is machine-checked rather than comment-only: it fails BOTH\r\n * the text floor and the 3:1 non-text floor.\r\n */\r\n test(\"brandSecondary text pair is BELOW AA and below 3:1 — fills only\", () => {\r\n const ratio = contrastRatio(brandSecondary.secondaryFg, brandSecondary.secondary);\r\n expect(ratio).not.toBeNull();\r\n expect(ratio as number).toBeLessThan(WCAG_AA_UI_NON_TEXT);\r\n });\r\n });\r\n});\r\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"contrast-palette.test.js","names":["_contrast","require","_tokens","LIGHT_SURFACES","surface","bgElev","bg","bgSubtle","describe","name","test","expect","passesContrast","contrastRatio","ink","fg","toBe","fgMuted","fgInverse","dark","pairs","semantic","successFg","successSoft","warningFg","warningSoft","dangerFg","dangerSoft","infoFg","infoSoft","soft","key","Object","keys","status","saturated","success","warning","danger","info","colour","brand","accent","accentFg","accentHover","ratio","fgSubtle","not","toBeNull","toBeLessThan","WCAG_AA_NORMAL","toBeGreaterThan","border","borderStrong","WCAG_AA_UI_NON_TEXT","brandSecondary","secondaryFg","secondary"],"sources":["../../../src/lib/v2/__tests__/contrast-palette.test.ts"],"sourcesContent":["import {\r\n contrastRatio,\r\n passesContrast,\r\n WCAG_AA_NORMAL,\r\n WCAG_AA_UI_NON_TEXT,\r\n} from \"../utils/contrast\";\r\nimport { ink, surface, border, semantic, status, brand, brandSecondary, dark } from \"../tokens\";\r\n\r\n/**\r\n * Token-palette contrast certification (Charter §05.1 / WCAG 2.1 AA).\r\n *\r\n * WHY THIS FILE EXISTS\r\n * --------------------\r\n * R-C.1 / R-C.2 / R-C.3 are MUST rules, and until now nothing verified them.\r\n * `utils/contrast.ts` shipped a correct WCAG ratio implementation and had no\r\n * test asserting the palette it exists to check; the ratios in `colors.ts` were\r\n * hand-written COMMENTS, unenforced — exactly the class of claim that drifts\r\n * silently when a hue is nudged.\r\n *\r\n * Contrast is one of the few a11y rules that is fully computable without a\r\n * browser, so it belongs in CI rather than in a manual audit pass.\r\n *\r\n * Found by writing it: `fgSubtle` on `bgSubtle` is ~4.32:1 — BELOW AA. See the\r\n * documented-failure block at the bottom; that is a real finding, not a test\r\n * artefact.\r\n */\r\n\r\n/** Every light-mode surface that body text can land on. */\r\nconst LIGHT_SURFACES: Array<[string, string]> = [\r\n [\"surface\", surface.surface],\r\n [\"bgElev\", surface.bgElev],\r\n [\"bg\", surface.bg],\r\n [\"bgSubtle\", surface.bgSubtle],\r\n];\r\n\r\ndescribe(\"Token palette — WCAG AA contrast (R-C.1 / R-C.2 / R-C.3)\", () => {\r\n describe(\"ink on light surfaces — normal text ≥ 4.5:1\", () => {\r\n for (const [name, bg] of LIGHT_SURFACES) {\r\n test(`fg on ${name}`, () => {\r\n expect(passesContrast(contrastRatio(ink.fg, bg), \"normal\")).toBe(true);\r\n });\r\n test(`fgMuted on ${name}`, () => {\r\n expect(passesContrast(contrastRatio(ink.fgMuted, bg), \"normal\")).toBe(true);\r\n });\r\n }\r\n\r\n test(\"fgInverse on the darkest dark surface\", () => {\r\n expect(passesContrast(contrastRatio(ink.fgInverse, dark.bg), \"normal\")).toBe(true);\r\n });\r\n });\r\n\r\n describe(\"semantic fg — readable on white AND on its own soft fill\", () => {\r\n const pairs: Array<[string, string, string]> = [\r\n [\"success\", semantic.successFg, semantic.successSoft],\r\n [\"warning\", semantic.warningFg, semantic.warningSoft],\r\n [\"danger\", semantic.dangerFg, semantic.dangerSoft],\r\n [\"info\", semantic.infoFg, semantic.infoSoft],\r\n ];\r\n for (const [name, fg, soft] of pairs) {\r\n test(`${name}Fg on white`, () => {\r\n expect(passesContrast(contrastRatio(fg, \"#FFFFFF\"), \"normal\")).toBe(true);\r\n });\r\n test(`${name}Fg on ${name}Soft`, () => {\r\n expect(passesContrast(contrastRatio(fg, soft), \"normal\")).toBe(true);\r\n });\r\n }\r\n });\r\n\r\n /**\r\n * The Charter's promise in §02.1: \"Combinaison background -soft +\r\n * foreground -fg = AA garanti.\" This is that promise, enforced.\r\n */\r\n describe(\"status palette — every -fg on its own -soft is AA (§02.1)\", () => {\r\n for (const key of Object.keys(status) as Array<keyof typeof status>) {\r\n test(`status.${key}`, () => {\r\n const { soft, fg } = status[key];\r\n expect(passesContrast(contrastRatio(fg, soft), \"normal\")).toBe(true);\r\n });\r\n test(`status.${key} fg on white`, () => {\r\n expect(passesContrast(contrastRatio(status[key].fg, \"#FFFFFF\"), \"normal\")).toBe(true);\r\n });\r\n }\r\n });\r\n\r\n describe(\"non-text UI ≥ 3:1 (WCAG 1.4.11 / R-C.3)\", () => {\r\n const saturated: Array<[string, string]> = [\r\n [\"success\", semantic.success],\r\n [\"warning\", semantic.warning],\r\n [\"danger\", semantic.danger],\r\n [\"info\", semantic.info],\r\n ];\r\n for (const [name, colour] of saturated) {\r\n test(`${name} (icon / border grade) on white`, () => {\r\n expect(passesContrast(contrastRatio(colour, \"#FFFFFF\"), \"ui\")).toBe(true);\r\n });\r\n }\r\n });\r\n\r\n describe(\"brand\", () => {\r\n test(\"accent on white is AA for normal text\", () => {\r\n expect(passesContrast(contrastRatio(brand.accent, \"#FFFFFF\"), \"normal\")).toBe(true);\r\n });\r\n test(\"accentFg on accent — the primary-button pair\", () => {\r\n expect(passesContrast(contrastRatio(brand.accentFg, brand.accent), \"normal\")).toBe(true);\r\n });\r\n test(\"accentHover keeps AA against accentFg (pressed state stays readable)\", () => {\r\n expect(passesContrast(contrastRatio(brand.accentFg, brand.accentHover), \"normal\")).toBe(true);\r\n });\r\n });\r\n\r\n describe(\"dark mode\", () => {\r\n test(\"dark.fg on dark.surface\", () => {\r\n expect(passesContrast(contrastRatio(dark.fg, dark.surface), \"normal\")).toBe(true);\r\n });\r\n test(\"dark.fgMuted on dark.surface\", () => {\r\n expect(passesContrast(contrastRatio(dark.fgMuted, dark.surface), \"normal\")).toBe(true);\r\n });\r\n for (const key of Object.keys(dark.status) as Array<keyof typeof dark.status>) {\r\n test(`dark status.${key}.fg on dark.surface`, () => {\r\n expect(\r\n passesContrast(contrastRatio(dark.status[key].fg, dark.surface), \"normal\")\r\n ).toBe(true);\r\n });\r\n }\r\n });\r\n\r\n /* ══════════════════════════════════════════════════════════════════\r\n * DOCUMENTED FAILURES — asserted at their MEASURED value, not at the\r\n * threshold, so the suite stays green while the breach stays visible and\r\n * any drift shows up as a diff. Both need a palette decision, not a\r\n * test change.\r\n * ══════════════════════════════════════════════════════════════════ */\r\n describe(\"KNOWN AA FAILURES (documented, pending decision)\", () => {\r\n /**\r\n * A9-01 — `fgSubtle` on `bgSubtle` ≈ 4.32:1, below the 4.5 floor.\r\n *\r\n * `colors.ts` documents fgSubtle as \"AA · 4.81:1 on white — incidental\r\n * text only (WCAG 1.4.6)\". On white that holds. On `bgSubtle` it does not,\r\n * and the exemption does not rescue it, because fgSubtle is NOT used only\r\n * for incidental text — it colours KV eyebrow labels, section captions and\r\n * hero stat labels, all of which name the value beside them.\r\n *\r\n * LIVE BREACH: both preview drawers put `--fg-subtle` labels on a\r\n * `--bg-subtle` hero panel (dfd `GestionDFDPreviewDrawer` HERO_BOX_STYLE +\r\n * HERO_LABEL_STYLE, ti `GestionTIPreviewDrawer` HERO_STAT_LABEL_STYLE), at\r\n * `--text-xs` (12px) — too small to qualify as large text, so the 4.5\r\n * floor applies.\r\n *\r\n * FIX OPTIONS: darken fgSubtle (affects the muted/subtle hierarchy\r\n * fleet-wide), or switch those labels to `--fg-muted` (AAA, 7.5:1 on\r\n * bgSubtle) which is what every other label surface already uses.\r\n */\r\n test(\"fgSubtle on bgSubtle is BELOW AA — ~4.32:1\", () => {\r\n const ratio = contrastRatio(ink.fgSubtle, surface.bgSubtle);\r\n expect(ratio).not.toBeNull();\r\n expect(ratio as number).toBeLessThan(WCAG_AA_NORMAL);\r\n expect(ratio as number).toBeGreaterThan(4.2);\r\n // It DOES pass on white — the failure is surface-specific.\r\n expect(passesContrast(contrastRatio(ink.fgSubtle, \"#FFFFFF\"), \"normal\")).toBe(true);\r\n });\r\n\r\n /**\r\n * A9-02 — `borderStrong` ≈ 2.87:1 on white. BELOW the 3:1 non-text floor.\r\n *\r\n * ⚠️ The token's own comment in `colors.ts` reads:\r\n * borderStrong: \"#9099AA\", // WCAG 1.4.11 · ≥ 3:1 against white\r\n * That claim is FALSE. This is precisely the drift this file exists to\r\n * catch — an unenforced hand-written ratio that nobody re-derived.\r\n *\r\n * IMPACT depends on usage. `--border-strong` currently colours the\r\n * scrollbar thumb (`base.css`) and the `kbd` bottom edge in\r\n * KeyboardShortcutsHelp. If it is ever used for an INPUT border or any\r\n * other control boundary, 1.4.11 applies and the breach is live — audit\r\n * usage before deciding severity.\r\n *\r\n * FIX: darken to relative luminance ≤ 0.30 (currently 0.316). Roughly\r\n * #868FA3 / #8A92A5; change the token and this assertion flips to the\r\n * `passesContrast(..., \"ui\")` form.\r\n */\r\n test(\"borderStrong on white is BELOW 3:1 — ~2.87:1 (comment in colors.ts is wrong)\", () => {\r\n const ratio = contrastRatio(border.borderStrong, \"#FFFFFF\");\r\n expect(ratio).not.toBeNull();\r\n expect(ratio as number).toBeLessThan(WCAG_AA_UI_NON_TEXT);\r\n expect(ratio as number).toBeGreaterThan(2.8);\r\n });\r\n\r\n /**\r\n * A9-03 — `dark.borderStrong` ≈ 2.28:1 on `dark.surface`. Worse than the\r\n * light-mode equivalent, and the same 1.4.11 floor applies in dark mode.\r\n *\r\n * FIX: lighten to relative luminance ≥ 0.119 (currently 0.078) — roughly\r\n * #5C6478 or lighter. Note dark mode is currently UNREACHABLE in both\r\n * consuming modules (neither sets `[data-theme=\"dark\"]` on <html>), which\r\n * is why nobody has seen it — see the RGESN R-9.5 note in the handover.\r\n */\r\n test(\"dark.borderStrong on dark.surface is BELOW 3:1 — ~2.28:1\", () => {\r\n const ratio = contrastRatio(dark.borderStrong, dark.surface);\r\n expect(ratio).not.toBeNull();\r\n expect(ratio as number).toBeLessThan(WCAG_AA_UI_NON_TEXT);\r\n expect(ratio as number).toBeGreaterThan(2.2);\r\n });\r\n\r\n /**\r\n * Already flagged in colors.ts itself: secondaryFg (#FFFFFF) on\r\n * secondary (#4FB8CF) ≈ 1.96:1. The token comment restricts it to\r\n * chip/badge surfaces and non-text accent fills. Asserted here so the\r\n * restriction is machine-checked rather than comment-only: it fails BOTH\r\n * the text floor and the 3:1 non-text floor.\r\n */\r\n test(\"brandSecondary text pair is BELOW AA and below 3:1 — fills only\", () => {\r\n const ratio = contrastRatio(brandSecondary.secondaryFg, brandSecondary.secondary);\r\n expect(ratio).not.toBeNull();\r\n expect(ratio as number).toBeLessThan(WCAG_AA_UI_NON_TEXT);\r\n });\r\n });\r\n});\r\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -13,45 +13,42 @@ var _cssVariables = require("../theme/cssVariables");
|
|
|
13
13
|
* - dropped a critical variable downstream consumers rely on, or
|
|
14
14
|
* - leaked an alias name (--md / --lg) into the global namespace.
|
|
15
15
|
*/
|
|
16
|
-
describe("getCssVariables() — Batch 1 + 2 invariants",
|
|
17
|
-
|
|
18
|
-
beforeAll(
|
|
16
|
+
describe("getCssVariables() — Batch 1 + 2 invariants", () => {
|
|
17
|
+
let css;
|
|
18
|
+
beforeAll(() => {
|
|
19
19
|
css = (0, _cssVariables.getCssVariables)();
|
|
20
20
|
});
|
|
21
|
-
test("emits a :root block",
|
|
21
|
+
test("emits a :root block", () => {
|
|
22
22
|
expect(css).toMatch(/:root\s*\{/);
|
|
23
23
|
});
|
|
24
|
-
test("never emits ': undefined' values (the ghost-token bug class)",
|
|
24
|
+
test("never emits ': undefined' values (the ghost-token bug class)", () => {
|
|
25
25
|
// Match `--anything: undefined;` with optional whitespace.
|
|
26
26
|
// This catches the regression that produced --fw-black resolving
|
|
27
27
|
// to undefined in :root after Batch 1 removed fontWeight.black.
|
|
28
|
-
|
|
28
|
+
const matches = css.match(/--[\w-]+\s*:\s*undefined\b/g);
|
|
29
29
|
expect(matches).toBeNull();
|
|
30
30
|
});
|
|
31
|
-
test("does NOT emit --fw-black (Batch 1 removed fontWeight.black)",
|
|
31
|
+
test("does NOT emit --fw-black (Batch 1 removed fontWeight.black)", () => {
|
|
32
32
|
expect(css).not.toMatch(/--fw-black/);
|
|
33
33
|
});
|
|
34
|
-
test("emits all critical brand + ink + surface variables",
|
|
35
|
-
|
|
36
|
-
for (
|
|
37
|
-
|
|
38
|
-
expect(css).toContain("".concat(v, ":"));
|
|
34
|
+
test("emits all critical brand + ink + surface variables", () => {
|
|
35
|
+
const required = ["--accent", "--accent-soft", "--accent-hover", "--accent-fg", "--fg", "--fg-muted", "--fg-subtle", "--fg-inverse", "--bg", "--bg-elev", "--bg-subtle", "--bg-hover", "--surface", "--border", "--border-strong"];
|
|
36
|
+
for (const v of required) {
|
|
37
|
+
expect(css).toContain(`${v}:`);
|
|
39
38
|
}
|
|
40
39
|
});
|
|
41
|
-
test("emits all semantic + status palette variables",
|
|
42
|
-
|
|
43
|
-
for (
|
|
44
|
-
|
|
45
|
-
expect(css).toContain("".concat(v, ":"));
|
|
40
|
+
test("emits all semantic + status palette variables", () => {
|
|
41
|
+
const required = ["--success", "--success-fg", "--success-soft", "--danger", "--danger-fg", "--danger-soft", "--warning", "--warning-fg", "--warning-soft", "--info", "--info-fg", "--info-soft", "--status-new-soft", "--status-new-fg", "--status-sent-soft", "--status-sent-fg", "--status-pending-soft", "--status-pending-fg", "--status-approved-soft", "--status-approved-fg", "--status-rejected-soft", "--status-rejected-fg", "--status-neutral-soft", "--status-neutral-fg"];
|
|
42
|
+
for (const v of required) {
|
|
43
|
+
expect(css).toContain(`${v}:`);
|
|
46
44
|
}
|
|
47
45
|
});
|
|
48
|
-
test("emits the typography variables",
|
|
49
|
-
|
|
46
|
+
test("emits the typography variables", () => {
|
|
47
|
+
const required = ["--font-sans", "--font-mono", "--text-display", "--text-h2", "--text-h3", "--text-h4", "--text-body", "--text-sm", "--text-xs", "--fw-regular", "--fw-medium", "--fw-semibold", "--fw-bold", "--lh-tight", "--lh-snug", "--lh-normal", "--lh-loose",
|
|
50
48
|
// A7-02 — letter-spacing scale.
|
|
51
49
|
"--ls-tight", "--ls-normal", "--ls-wide"];
|
|
52
|
-
for (
|
|
53
|
-
|
|
54
|
-
expect(css).toContain("".concat(v, ":"));
|
|
50
|
+
for (const v of required) {
|
|
51
|
+
expect(css).toContain(`${v}:`);
|
|
55
52
|
}
|
|
56
53
|
});
|
|
57
54
|
|
|
@@ -72,50 +69,46 @@ describe("getCssVariables() — Batch 1 + 2 invariants", function () {
|
|
|
72
69
|
* call site. Adding any of them is a Charter §02 amendment and must arrive
|
|
73
70
|
* with its table entry, not via a failing consumer.
|
|
74
71
|
*/
|
|
75
|
-
test("does NOT emit the four rejected phantom tokens (A7-02)",
|
|
76
|
-
for (
|
|
77
|
-
|
|
78
|
-
expect(css).not.toContain("".concat(v, ":"));
|
|
72
|
+
test("does NOT emit the four rejected phantom tokens (A7-02)", () => {
|
|
73
|
+
for (const v of ["--border-subtle", "--r-xs", "--icon-sm", "--icon-xl"]) {
|
|
74
|
+
expect(css).not.toContain(`${v}:`);
|
|
79
75
|
}
|
|
80
76
|
});
|
|
81
|
-
test("emits the spacing grid (--s-1 through --s-10)",
|
|
82
|
-
for (
|
|
83
|
-
expect(css).toContain(
|
|
77
|
+
test("emits the spacing grid (--s-1 through --s-10)", () => {
|
|
78
|
+
for (let i = 1; i <= 10; i += 1) {
|
|
79
|
+
expect(css).toContain(`--s-${i}:`);
|
|
84
80
|
}
|
|
85
81
|
});
|
|
86
|
-
test("emits the spacing aliases under --space-* prefix",
|
|
87
|
-
|
|
88
|
-
for (
|
|
89
|
-
|
|
90
|
-
expect(css).toContain("--space-".concat(a, ":"));
|
|
82
|
+
test("emits the spacing aliases under --space-* prefix", () => {
|
|
83
|
+
const aliases = ["xs", "sm", "md", "lg", "xl", "xxl"];
|
|
84
|
+
for (const a of aliases) {
|
|
85
|
+
expect(css).toContain(`--space-${a}:`);
|
|
91
86
|
}
|
|
92
87
|
});
|
|
93
|
-
test("does NOT emit unprefixed alias names that would pollute the global CSS namespace",
|
|
88
|
+
test("does NOT emit unprefixed alias names that would pollute the global CSS namespace", () => {
|
|
94
89
|
// Bare --md / --lg / --xl would collide with consumer stylesheets.
|
|
95
90
|
// Batch 2 explicitly partitioned spacing into numeric grid (--s-N)
|
|
96
91
|
// and semantic aliases (--space-X) to prevent this.
|
|
97
92
|
// Use word boundaries so we don't false-match --r-md, --space-md, etc.
|
|
98
|
-
|
|
99
|
-
for (
|
|
100
|
-
var re = _polluters[_i6];
|
|
93
|
+
const polluters = [/[^\w-]--xs\s*:/, /[^\w-]--sm\s*:/, /[^\w-]--md\s*:/, /[^\w-]--lg\s*:/, /[^\w-]--xl\s*:/, /[^\w-]--xxl\s*:/];
|
|
94
|
+
for (const re of polluters) {
|
|
101
95
|
expect(css).not.toMatch(re);
|
|
102
96
|
}
|
|
103
97
|
});
|
|
104
|
-
test("emits radius, shadow, motion, easing, layout, density",
|
|
105
|
-
|
|
106
|
-
for (
|
|
107
|
-
|
|
108
|
-
expect(css).toContain("".concat(v, ":"));
|
|
98
|
+
test("emits radius, shadow, motion, easing, layout, density", () => {
|
|
99
|
+
const required = ["--r-sm", "--r-md", "--r-lg", "--r-xl", "--r-full", "--r-none", "--shadow-xs", "--shadow-sm", "--shadow-md", "--shadow-lg", "--shadow-focus", "--duration-fast", "--duration-base", "--duration-slow", "--easing-out", "--easing-in", "--easing-soft", "--sidebar-w", "--topbar-h", "--content-max", "--form-max", "--tactile-min", "--row-h", "--input-h", "--btn-h", "--text-fs"];
|
|
100
|
+
for (const v of required) {
|
|
101
|
+
expect(css).toContain(`${v}:`);
|
|
109
102
|
}
|
|
110
103
|
});
|
|
111
|
-
test("emits z-index variables",
|
|
104
|
+
test("emits z-index variables", () => {
|
|
112
105
|
// Iterates the full zIndex object in cssVariables, so any
|
|
113
106
|
// future zIndex slot (popover, snackbar, tooltip from Batch 1)
|
|
114
107
|
// surfaces here without code change.
|
|
115
108
|
expect(css).toMatch(/--z-modal\s*:/);
|
|
116
109
|
expect(css).toMatch(/--z-sticky\s*:/);
|
|
117
110
|
});
|
|
118
|
-
test("emits the dark-mode override block with derived soft variants",
|
|
111
|
+
test("emits the dark-mode override block with derived soft variants", () => {
|
|
119
112
|
expect(css).toContain('[data-theme="dark"]');
|
|
120
113
|
// Soft semantic fills are color-mix-derived in dark, not static hex
|
|
121
114
|
// (Batch 2 contrast fix for WCAG 1.4.11 non-text on dark surfaces).
|
|
@@ -124,16 +117,16 @@ describe("getCssVariables() — Batch 1 + 2 invariants", function () {
|
|
|
124
117
|
expect(css).toMatch(/--warning-soft:\s*color-mix/);
|
|
125
118
|
expect(css).toMatch(/--info-soft:\s*color-mix/);
|
|
126
119
|
});
|
|
127
|
-
test("emits the compact density override block",
|
|
120
|
+
test("emits the compact density override block", () => {
|
|
128
121
|
expect(css).toContain('[data-density="compact"]');
|
|
129
122
|
// Compact override shrinks the row/input/btn heights.
|
|
130
123
|
expect(css).toMatch(/\[data-density="compact"\][\s\S]*--btn-h:/);
|
|
131
124
|
});
|
|
132
|
-
test("emits the collapsed-sidebar override",
|
|
125
|
+
test("emits the collapsed-sidebar override", () => {
|
|
133
126
|
expect(css).toContain('[data-nav-collapsed="true"]');
|
|
134
127
|
});
|
|
135
|
-
test("brand override propagates through resolveBrand",
|
|
136
|
-
|
|
128
|
+
test("brand override propagates through resolveBrand", () => {
|
|
129
|
+
const customCss = (0, _cssVariables.getCssVariables)({
|
|
137
130
|
brand: {
|
|
138
131
|
accent: "#FF0000"
|
|
139
132
|
}
|
|
@@ -142,10 +135,10 @@ describe("getCssVariables() — Batch 1 + 2 invariants", function () {
|
|
|
142
135
|
// Default also still emits its accent
|
|
143
136
|
expect(css).toMatch(/--accent:\s*#[0-9a-fA-F]{3,8}/);
|
|
144
137
|
});
|
|
145
|
-
test("brand override does NOT pollute other brand fields when omitted",
|
|
138
|
+
test("brand override does NOT pollute other brand fields when omitted", () => {
|
|
146
139
|
// Partial brand override — accentSoft should fall back to default,
|
|
147
140
|
// not to undefined or an empty string.
|
|
148
|
-
|
|
141
|
+
const customCss = (0, _cssVariables.getCssVariables)({
|
|
149
142
|
brand: {
|
|
150
143
|
accent: "#FF0000"
|
|
151
144
|
}
|