@portnet/ui 6.0.2 → 6.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +652 -0
- package/dist/esm/index.js +72 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/v2/__tests__/AppMain.test.js +130 -0
- package/dist/esm/v2/__tests__/AppMain.test.js.map +1 -0
- package/dist/esm/v2/__tests__/ChartFigure.test.js +180 -0
- package/dist/esm/v2/__tests__/ChartFigure.test.js.map +1 -0
- package/dist/esm/v2/__tests__/DataGridRowActionsPropagation.test.js +150 -0
- package/dist/esm/v2/__tests__/DataGridRowActionsPropagation.test.js.map +1 -0
- package/dist/esm/v2/__tests__/DrawerTactileTargets.test.js +93 -0
- package/dist/esm/v2/__tests__/DrawerTactileTargets.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FieldError.test.js +71 -38
- package/dist/esm/v2/__tests__/FieldError.test.js.map +1 -1
- package/dist/esm/v2/__tests__/FieldNaming.test.js +160 -0
- package/dist/esm/v2/__tests__/FieldNaming.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FieldWidth.test.js +11 -11
- package/dist/esm/v2/__tests__/FieldWidth.test.js.map +1 -1
- package/dist/esm/v2/__tests__/FileCard.test.js +18 -17
- package/dist/esm/v2/__tests__/FileCard.test.js.map +1 -1
- package/dist/esm/v2/__tests__/FormikCheckbox.test.js +87 -179
- package/dist/esm/v2/__tests__/FormikCheckbox.test.js.map +1 -1
- package/dist/esm/v2/__tests__/FormikDateTimePicker.test.js +32 -44
- package/dist/esm/v2/__tests__/FormikDateTimePicker.test.js.map +1 -1
- package/dist/esm/v2/__tests__/FormikDisplayWidth.test.js +101 -0
- package/dist/esm/v2/__tests__/FormikDisplayWidth.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FormikRadioGroup.test.js +118 -199
- package/dist/esm/v2/__tests__/FormikRadioGroup.test.js.map +1 -1
- package/dist/esm/v2/__tests__/MobileRowCard.test.js +44 -42
- package/dist/esm/v2/__tests__/MobileRowCard.test.js.map +1 -1
- package/dist/esm/v2/__tests__/PreviewDrawer.test.js +165 -0
- package/dist/esm/v2/__tests__/PreviewDrawer.test.js.map +1 -0
- package/dist/esm/v2/__tests__/ReferentielFieldContainer.test.js +156 -0
- package/dist/esm/v2/__tests__/ReferentielFieldContainer.test.js.map +1 -0
- package/dist/esm/v2/__tests__/SectionErrorBoundary.test.js +37 -52
- package/dist/esm/v2/__tests__/SectionErrorBoundary.test.js.map +1 -1
- package/dist/esm/v2/__tests__/apiError.test.js +50 -69
- package/dist/esm/v2/__tests__/apiError.test.js.map +1 -1
- package/dist/esm/v2/__tests__/banned-patterns.test.js +41 -122
- package/dist/esm/v2/__tests__/banned-patterns.test.js.map +1 -1
- package/dist/esm/v2/__tests__/chart-palette.test.js +204 -0
- package/dist/esm/v2/__tests__/chart-palette.test.js.map +1 -0
- package/dist/esm/v2/__tests__/contrast-palette.test.js +42 -74
- package/dist/esm/v2/__tests__/contrast-palette.test.js.map +1 -1
- package/dist/esm/v2/__tests__/cssVariables.test.js +44 -51
- package/dist/esm/v2/__tests__/cssVariables.test.js.map +1 -1
- package/dist/esm/v2/__tests__/fileValidation.test.js +134 -0
- package/dist/esm/v2/__tests__/fileValidation.test.js.map +1 -0
- package/dist/esm/v2/__tests__/filterCriteria.test.js +321 -0
- package/dist/esm/v2/__tests__/filterCriteria.test.js.map +1 -0
- package/dist/esm/v2/__tests__/fmtDate.test.js +68 -0
- package/dist/esm/v2/__tests__/fmtDate.test.js.map +1 -0
- package/dist/esm/v2/__tests__/gap-leakage-refonte.test.js +218 -0
- package/dist/esm/v2/__tests__/gap-leakage-refonte.test.js.map +1 -0
- package/dist/esm/v2/__tests__/labels-merge.test.js +17 -21
- package/dist/esm/v2/__tests__/labels-merge.test.js.map +1 -1
- package/dist/esm/v2/__tests__/locale-fallback.test.js +35 -40
- package/dist/esm/v2/__tests__/locale-fallback.test.js.map +1 -1
- package/dist/esm/v2/__tests__/reviveSavedCriteria.test.js +143 -0
- package/dist/esm/v2/__tests__/reviveSavedCriteria.test.js.map +1 -0
- package/dist/esm/v2/__tests__/rowActions.test.js +182 -0
- package/dist/esm/v2/__tests__/rowActions.test.js.map +1 -0
- package/dist/esm/v2/__tests__/useFocusOnRouteChange.test.js +155 -0
- package/dist/esm/v2/__tests__/useFocusOnRouteChange.test.js.map +1 -0
- package/dist/esm/v2/__tests__/useFocusTrap.test.js +266 -402
- package/dist/esm/v2/__tests__/useFocusTrap.test.js.map +1 -1
- package/dist/esm/v2/__tests__/usePrefersReducedMotion.test.js +120 -0
- package/dist/esm/v2/__tests__/usePrefersReducedMotion.test.js.map +1 -0
- package/dist/esm/v2/components/Accordion.js +48 -70
- package/dist/esm/v2/components/Accordion.js.map +1 -1
- package/dist/esm/v2/components/ActionStrip.js +31 -43
- package/dist/esm/v2/components/ActionStrip.js.map +1 -1
- package/dist/esm/v2/components/Banner.js +25 -22
- package/dist/esm/v2/components/Banner.js.map +1 -1
- package/dist/esm/v2/components/Busy.js +14 -19
- package/dist/esm/v2/components/Busy.js.map +1 -1
- package/dist/esm/v2/components/Button.js +34 -45
- package/dist/esm/v2/components/Button.js.map +1 -1
- package/dist/esm/v2/components/CategoryTag.js +44 -27
- package/dist/esm/v2/components/CategoryTag.js.map +1 -1
- package/dist/esm/v2/components/Checkbox.js +32 -38
- package/dist/esm/v2/components/Checkbox.js.map +1 -1
- package/dist/esm/v2/components/Chip.js +23 -36
- package/dist/esm/v2/components/Chip.js.map +1 -1
- package/dist/esm/v2/components/Combobox.js +112 -136
- package/dist/esm/v2/components/Combobox.js.map +1 -1
- package/dist/esm/v2/components/CommandPalette.js +113 -198
- package/dist/esm/v2/components/CommandPalette.js.map +1 -1
- package/dist/esm/v2/components/ConfirmDialog.js +36 -45
- package/dist/esm/v2/components/ConfirmDialog.js.map +1 -1
- package/dist/esm/v2/components/DatePicker.js +78 -81
- package/dist/esm/v2/components/DatePicker.js.map +1 -1
- package/dist/esm/v2/components/DateRangePicker.js +63 -74
- package/dist/esm/v2/components/DateRangePicker.js.map +1 -1
- package/dist/esm/v2/components/DateTimePicker.js +81 -86
- package/dist/esm/v2/components/DateTimePicker.js.map +1 -1
- package/dist/esm/v2/components/Drawer.js +71 -65
- package/dist/esm/v2/components/Drawer.js.map +1 -1
- package/dist/esm/v2/components/Dropzone.js +130 -177
- package/dist/esm/v2/components/Dropzone.js.map +1 -1
- package/dist/esm/v2/components/EmptyState.js +9 -9
- package/dist/esm/v2/components/EmptyState.js.map +1 -1
- package/dist/esm/v2/components/FavoriteToggle.js +24 -33
- package/dist/esm/v2/components/FavoriteToggle.js.map +1 -1
- package/dist/esm/v2/components/Field.js +155 -59
- package/dist/esm/v2/components/Field.js.map +1 -1
- package/dist/esm/v2/components/FieldError.js +9 -13
- package/dist/esm/v2/components/FieldError.js.map +1 -1
- package/dist/esm/v2/components/FieldHelp.js +28 -49
- package/dist/esm/v2/components/FieldHelp.js.map +1 -1
- package/dist/esm/v2/components/FileCard.js +14 -19
- package/dist/esm/v2/components/FileCard.js.map +1 -1
- package/dist/esm/v2/components/FilterTab.js +22 -31
- package/dist/esm/v2/components/FilterTab.js.map +1 -1
- package/dist/esm/v2/components/ForbiddenPage.js +28 -8
- package/dist/esm/v2/components/ForbiddenPage.js.map +1 -1
- package/dist/esm/v2/components/FormGrid.js +48 -54
- package/dist/esm/v2/components/FormGrid.js.map +1 -1
- package/dist/esm/v2/components/FormikDisplay.js +98 -24
- package/dist/esm/v2/components/FormikDisplay.js.map +1 -1
- package/dist/esm/v2/components/Input.js +75 -34
- package/dist/esm/v2/components/Input.js.map +1 -1
- package/dist/esm/v2/components/KPICard.js +42 -51
- package/dist/esm/v2/components/KPICard.js.map +1 -1
- package/dist/esm/v2/components/KPIStrip.js +9 -15
- package/dist/esm/v2/components/KPIStrip.js.map +1 -1
- package/dist/esm/v2/components/KV.js +16 -23
- package/dist/esm/v2/components/KV.js.map +1 -1
- package/dist/esm/v2/components/KVGrid.js +15 -23
- package/dist/esm/v2/components/KVGrid.js.map +1 -1
- package/dist/esm/v2/components/Layout.js +81 -117
- package/dist/esm/v2/components/Layout.js.map +1 -1
- package/dist/esm/v2/components/MobileRowCard.js +64 -75
- package/dist/esm/v2/components/MobileRowCard.js.map +1 -1
- package/dist/esm/v2/components/Modal.js +44 -53
- package/dist/esm/v2/components/Modal.js.map +1 -1
- package/dist/esm/v2/components/NetworkErrorPage.js +28 -11
- package/dist/esm/v2/components/NetworkErrorPage.js.map +1 -1
- package/dist/esm/v2/components/NotFoundPage.js +28 -9
- package/dist/esm/v2/components/NotFoundPage.js.map +1 -1
- package/dist/esm/v2/components/NumberInput.js +77 -107
- package/dist/esm/v2/components/NumberInput.js.map +1 -1
- package/dist/esm/v2/components/OverflowMenu.js +24 -42
- package/dist/esm/v2/components/OverflowMenu.js.map +1 -1
- package/dist/esm/v2/components/PdfViewer.js +24 -33
- package/dist/esm/v2/components/PdfViewer.js.map +1 -1
- package/dist/esm/v2/components/ProgressBar.js +28 -36
- package/dist/esm/v2/components/ProgressBar.js.map +1 -1
- package/dist/esm/v2/components/Radio.js +49 -57
- package/dist/esm/v2/components/Radio.js.map +1 -1
- package/dist/esm/v2/components/SectionErrorBoundary.js +84 -130
- package/dist/esm/v2/components/SectionErrorBoundary.js.map +1 -1
- package/dist/esm/v2/components/SectionHeader.js +24 -31
- package/dist/esm/v2/components/SectionHeader.js.map +1 -1
- package/dist/esm/v2/components/Segmented.js +59 -84
- package/dist/esm/v2/components/Segmented.js.map +1 -1
- package/dist/esm/v2/components/Select.js +100 -138
- package/dist/esm/v2/components/Select.js.map +1 -1
- package/dist/esm/v2/components/ServerErrorPage.js +27 -10
- package/dist/esm/v2/components/ServerErrorPage.js.map +1 -1
- package/dist/esm/v2/components/Skeleton.js +81 -96
- package/dist/esm/v2/components/Skeleton.js.map +1 -1
- package/dist/esm/v2/components/SkipLink.js +6 -7
- package/dist/esm/v2/components/SkipLink.js.map +1 -1
- package/dist/esm/v2/components/Spinner.js +13 -22
- package/dist/esm/v2/components/Spinner.js.map +1 -1
- package/dist/esm/v2/components/Status.js +14 -25
- package/dist/esm/v2/components/Status.js.map +1 -1
- package/dist/esm/v2/components/Stepper.js +68 -71
- package/dist/esm/v2/components/Stepper.js.map +1 -1
- package/dist/esm/v2/components/Surface.js +25 -44
- package/dist/esm/v2/components/Surface.js.map +1 -1
- package/dist/esm/v2/components/Switch.js +21 -29
- package/dist/esm/v2/components/Switch.js.map +1 -1
- package/dist/esm/v2/components/TabPanel.js +84 -0
- package/dist/esm/v2/components/TabPanel.js.map +1 -0
- package/dist/esm/v2/components/Tabs.js +43 -19
- package/dist/esm/v2/components/Tabs.js.map +1 -1
- package/dist/esm/v2/components/TelInput.js +75 -108
- package/dist/esm/v2/components/TelInput.js.map +1 -1
- package/dist/esm/v2/components/Textarea.js +21 -30
- package/dist/esm/v2/components/Textarea.js.map +1 -1
- package/dist/esm/v2/components/TimePicker.js +59 -69
- package/dist/esm/v2/components/TimePicker.js.map +1 -1
- package/dist/esm/v2/components/Toast.js +109 -163
- package/dist/esm/v2/components/Toast.js.map +1 -1
- package/dist/esm/v2/components/Tooltip.js +18 -31
- package/dist/esm/v2/components/Tooltip.js.map +1 -1
- package/dist/esm/v2/components/_ErrorPageBody.js +6 -5
- package/dist/esm/v2/components/_ErrorPageBody.js.map +1 -1
- package/dist/esm/v2/components/_pickerShared.js +2 -2
- package/dist/esm/v2/components/_pickerShared.js.map +1 -1
- package/dist/esm/v2/components/index.js +37 -0
- package/dist/esm/v2/components/index.js.map +1 -1
- package/dist/esm/v2/hooks/index.js +62 -0
- package/dist/esm/v2/hooks/index.js.map +1 -1
- package/dist/esm/v2/hooks/useAppliedFilters.js +112 -0
- package/dist/esm/v2/hooks/useAppliedFilters.js.map +1 -0
- package/dist/esm/v2/hooks/useDebouncedCallback.js +82 -0
- package/dist/esm/v2/hooks/useDebouncedCallback.js.map +1 -0
- package/dist/esm/v2/hooks/useDelayedFlag.js +5 -19
- package/dist/esm/v2/hooks/useDelayedFlag.js.map +1 -1
- package/dist/esm/v2/hooks/useDensity.js +13 -17
- package/dist/esm/v2/hooks/useDensity.js.map +1 -1
- package/dist/esm/v2/hooks/useFocusFirstError.js +25 -33
- package/dist/esm/v2/hooks/useFocusFirstError.js.map +1 -1
- package/dist/esm/v2/hooks/useFocusOnRouteChange.js +81 -0
- package/dist/esm/v2/hooks/useFocusOnRouteChange.js.map +1 -0
- package/dist/esm/v2/hooks/useFocusTrap.js +19 -23
- package/dist/esm/v2/hooks/useFocusTrap.js.map +1 -1
- package/dist/esm/v2/hooks/useFormAutoSave.js +38 -53
- package/dist/esm/v2/hooks/useFormAutoSave.js.map +1 -1
- package/dist/esm/v2/hooks/useFormCompletionProgress.js +32 -51
- package/dist/esm/v2/hooks/useFormCompletionProgress.js.map +1 -1
- package/dist/esm/v2/hooks/useKeyboardShortcuts.js +125 -0
- package/dist/esm/v2/hooks/useKeyboardShortcuts.js.map +1 -0
- package/dist/esm/v2/hooks/usePrefersReducedMotion.js +99 -0
- package/dist/esm/v2/hooks/usePrefersReducedMotion.js.map +1 -0
- package/dist/esm/v2/hooks/useResolvedDensity.js +2 -10
- package/dist/esm/v2/hooks/useResolvedDensity.js.map +1 -1
- package/dist/esm/v2/hooks/useSortedRows.js +3 -5
- package/dist/esm/v2/hooks/useSortedRows.js.map +1 -1
- package/dist/esm/v2/hooks/useTabLoading.js +6 -21
- package/dist/esm/v2/hooks/useTabLoading.js.map +1 -1
- package/dist/esm/v2/index.js +2 -3
- package/dist/esm/v2/index.js.map +1 -1
- package/dist/esm/v2/modalContext.js +2 -2
- package/dist/esm/v2/modalContext.js.map +1 -1
- package/dist/esm/v2/models/favorite.js.map +1 -1
- package/dist/esm/v2/models/personalization.js.map +1 -1
- package/dist/esm/v2/models/referentiel.js.map +1 -1
- package/dist/esm/v2/models/savedFilter.js.map +1 -1
- package/dist/esm/v2/patterns/ActionBar.js +115 -159
- package/dist/esm/v2/patterns/ActionBar.js.map +1 -1
- package/dist/esm/v2/patterns/AppMain.js +108 -0
- package/dist/esm/v2/patterns/AppMain.js.map +1 -0
- package/dist/esm/v2/patterns/BulkActionBar.js +31 -34
- package/dist/esm/v2/patterns/BulkActionBar.js.map +1 -1
- package/dist/esm/v2/patterns/ChartFigure.js +151 -0
- package/dist/esm/v2/patterns/ChartFigure.js.map +1 -0
- package/dist/esm/v2/patterns/CollapsibleDataGrid.js +111 -152
- package/dist/esm/v2/patterns/CollapsibleDataGrid.js.map +1 -1
- package/dist/esm/v2/patterns/ColumnsToggle.js +43 -77
- package/dist/esm/v2/patterns/ColumnsToggle.js.map +1 -1
- package/dist/esm/v2/patterns/DataGrid.js +221 -255
- package/dist/esm/v2/patterns/DataGrid.js.map +1 -1
- package/dist/esm/v2/patterns/DataGridSettingsMenu.js +76 -94
- package/dist/esm/v2/patterns/DataGridSettingsMenu.js.map +1 -1
- package/dist/esm/v2/patterns/DataGridToolbar.js +85 -89
- package/dist/esm/v2/patterns/DataGridToolbar.js.map +1 -1
- package/dist/esm/v2/patterns/DataGridVirtualized.js +141 -182
- package/dist/esm/v2/patterns/DataGridVirtualized.js.map +1 -1
- package/dist/esm/v2/patterns/DeleteResourceConfirmDialog.js +26 -30
- package/dist/esm/v2/patterns/DeleteResourceConfirmDialog.js.map +1 -1
- package/dist/esm/v2/patterns/DetailSplit.js +108 -0
- package/dist/esm/v2/patterns/DetailSplit.js.map +1 -0
- package/dist/esm/v2/patterns/FavoriteColumn.js +15 -17
- package/dist/esm/v2/patterns/FavoriteColumn.js.map +1 -1
- package/dist/esm/v2/patterns/FavoritesFilter.js +30 -39
- package/dist/esm/v2/patterns/FavoritesFilter.js.map +1 -1
- package/dist/esm/v2/patterns/FilterTabBar.js +112 -0
- package/dist/esm/v2/patterns/FilterTabBar.js.map +1 -0
- package/dist/esm/v2/patterns/FormErrorSummary.js +12 -13
- package/dist/esm/v2/patterns/FormErrorSummary.js.map +1 -1
- package/dist/esm/v2/patterns/FormPageShell.js +43 -41
- package/dist/esm/v2/patterns/FormPageShell.js.map +1 -1
- package/dist/esm/v2/patterns/FormSection.js +30 -38
- package/dist/esm/v2/patterns/FormSection.js.map +1 -1
- package/dist/esm/v2/patterns/FormikCheckbox.js +29 -39
- package/dist/esm/v2/patterns/FormikCheckbox.js.map +1 -1
- package/dist/esm/v2/patterns/FormikCheckboxGroup.js +56 -60
- package/dist/esm/v2/patterns/FormikCheckboxGroup.js.map +1 -1
- package/dist/esm/v2/patterns/FormikCombobox.js +51 -69
- package/dist/esm/v2/patterns/FormikCombobox.js.map +1 -1
- package/dist/esm/v2/patterns/FormikDatePicker.js +44 -58
- package/dist/esm/v2/patterns/FormikDatePicker.js.map +1 -1
- package/dist/esm/v2/patterns/FormikDateTimePicker.js +44 -58
- package/dist/esm/v2/patterns/FormikDateTimePicker.js.map +1 -1
- package/dist/esm/v2/patterns/FormikErrorFocus.js +22 -23
- package/dist/esm/v2/patterns/FormikErrorFocus.js.map +1 -1
- package/dist/esm/v2/patterns/FormikErrorSummary.js +89 -0
- package/dist/esm/v2/patterns/FormikErrorSummary.js.map +1 -0
- package/dist/esm/v2/patterns/FormikFile.js +94 -78
- package/dist/esm/v2/patterns/FormikFile.js.map +1 -1
- package/dist/esm/v2/patterns/FormikInput.js +40 -53
- package/dist/esm/v2/patterns/FormikInput.js.map +1 -1
- package/dist/esm/v2/patterns/FormikRadioGroup.js +39 -51
- package/dist/esm/v2/patterns/FormikRadioGroup.js.map +1 -1
- package/dist/esm/v2/patterns/FormikReferentielField.js +49 -59
- package/dist/esm/v2/patterns/FormikReferentielField.js.map +1 -1
- package/dist/esm/v2/patterns/FormikSelect.js +64 -87
- package/dist/esm/v2/patterns/FormikSelect.js.map +1 -1
- package/dist/esm/v2/patterns/FormikTextarea.js +30 -46
- package/dist/esm/v2/patterns/FormikTextarea.js.map +1 -1
- package/dist/esm/v2/patterns/KeyboardShortcutsHelp.js +53 -71
- package/dist/esm/v2/patterns/KeyboardShortcutsHelp.js.map +1 -1
- package/dist/esm/v2/patterns/NetworkErrorBanner.js +6 -7
- package/dist/esm/v2/patterns/NetworkErrorBanner.js.map +1 -1
- package/dist/esm/v2/patterns/PageContent.js +10 -14
- package/dist/esm/v2/patterns/PageContent.js.map +1 -1
- package/dist/esm/v2/patterns/PreviewDrawer.js +153 -0
- package/dist/esm/v2/patterns/PreviewDrawer.js.map +1 -0
- package/dist/esm/v2/patterns/ReferentielField.js +327 -312
- package/dist/esm/v2/patterns/ReferentielField.js.map +1 -1
- package/dist/esm/v2/patterns/RowFavoriteToggle.js +27 -22
- package/dist/esm/v2/patterns/RowFavoriteToggle.js.map +1 -1
- package/dist/esm/v2/patterns/SaveFilterDialog.js +38 -66
- package/dist/esm/v2/patterns/SaveFilterDialog.js.map +1 -1
- package/dist/esm/v2/patterns/SavedFiltersMenu.js +62 -81
- package/dist/esm/v2/patterns/SavedFiltersMenu.js.map +1 -1
- package/dist/esm/v2/patterns/SkeletonPageShell.js +106 -129
- package/dist/esm/v2/patterns/SkeletonPageShell.js.map +1 -1
- package/dist/esm/v2/patterns/SortableHeader.js +22 -45
- package/dist/esm/v2/patterns/SortableHeader.js.map +1 -1
- package/dist/esm/v2/patterns/Tour.js +94 -120
- package/dist/esm/v2/patterns/Tour.js.map +1 -1
- package/dist/esm/v2/patterns/_dataGridShared.js +107 -128
- package/dist/esm/v2/patterns/_dataGridShared.js.map +1 -1
- package/dist/esm/v2/patterns/_pickerSerialisation.js +6 -8
- package/dist/esm/v2/patterns/_pickerSerialisation.js.map +1 -1
- package/dist/esm/v2/patterns/_sort.js +17 -33
- package/dist/esm/v2/patterns/_sort.js.map +1 -1
- package/dist/esm/v2/patterns/_useColumnReorder.js +122 -160
- package/dist/esm/v2/patterns/_useColumnReorder.js.map +1 -1
- package/dist/esm/v2/patterns/_useColumnResize.js +78 -96
- package/dist/esm/v2/patterns/_useColumnResize.js.map +1 -1
- package/dist/esm/v2/patterns/filterCriteria.js +102 -0
- package/dist/esm/v2/patterns/filterCriteria.js.map +1 -0
- package/dist/esm/v2/patterns/index.js +152 -0
- package/dist/esm/v2/patterns/index.js.map +1 -1
- package/dist/esm/v2/patterns/rowActions.js +223 -0
- package/dist/esm/v2/patterns/rowActions.js.map +1 -0
- package/dist/esm/v2/personalization/PersonalizationProvider.js +50 -47
- package/dist/esm/v2/personalization/PersonalizationProvider.js.map +1 -1
- package/dist/esm/v2/personalization/adapters/_storageKey.js +5 -5
- package/dist/esm/v2/personalization/adapters/_storageKey.js.map +1 -1
- package/dist/esm/v2/personalization/adapters/createLocalStorageAdapter.js +22 -23
- package/dist/esm/v2/personalization/adapters/createLocalStorageAdapter.js.map +1 -1
- package/dist/esm/v2/personalization/adapters/createMemoryAdapter.js +13 -13
- package/dist/esm/v2/personalization/adapters/createMemoryAdapter.js.map +1 -1
- package/dist/esm/v2/personalization/capabilities/favorites.js +36 -60
- package/dist/esm/v2/personalization/capabilities/favorites.js.map +1 -1
- package/dist/esm/v2/personalization/capabilities/favoritesView.js +22 -34
- package/dist/esm/v2/personalization/capabilities/favoritesView.js.map +1 -1
- package/dist/esm/v2/personalization/capabilities/gridPreferences.js +28 -34
- package/dist/esm/v2/personalization/capabilities/gridPreferences.js.map +1 -1
- package/dist/esm/v2/personalization/capabilities/reviveSavedCriteria.js +119 -0
- package/dist/esm/v2/personalization/capabilities/reviveSavedCriteria.js.map +1 -0
- package/dist/esm/v2/personalization/capabilities/savedFilters.js +90 -98
- package/dist/esm/v2/personalization/capabilities/savedFilters.js.map +1 -1
- package/dist/esm/v2/personalization/createPersonalizationStore.js +78 -181
- package/dist/esm/v2/personalization/createPersonalizationStore.js.map +1 -1
- package/dist/esm/v2/personalization/index.js +17 -0
- package/dist/esm/v2/personalization/index.js.map +1 -1
- package/dist/esm/v2/personalization/personalizationContext.js +9 -9
- package/dist/esm/v2/personalization/personalizationContext.js.map +1 -1
- package/dist/esm/v2/personalization/schema.js +8 -9
- package/dist/esm/v2/personalization/schema.js.map +1 -1
- package/dist/esm/v2/referentiel/ReferentielProvider.js +27 -42
- package/dist/esm/v2/referentiel/ReferentielProvider.js.map +1 -1
- package/dist/esm/v2/referentiel/types.js +2 -0
- package/dist/esm/v2/referentiel/types.js.map +1 -0
- package/dist/esm/v2/referentiel/useReferentielClient.js +10 -11
- package/dist/esm/v2/referentiel/useReferentielClient.js.map +1 -1
- package/dist/esm/v2/referentiel/useReferentielOptions.js +60 -117
- package/dist/esm/v2/referentiel/useReferentielOptions.js.map +1 -1
- package/dist/esm/v2/referentiel/useReferentielSearch.js +37 -91
- package/dist/esm/v2/referentiel/useReferentielSearch.js.map +1 -1
- package/dist/esm/v2/theme/_brand.js +8 -24
- package/dist/esm/v2/theme/_brand.js.map +1 -1
- package/dist/esm/v2/theme/_brandSecondary.js +8 -24
- package/dist/esm/v2/theme/_brandSecondary.js.map +1 -1
- package/dist/esm/v2/theme/createPortnetTheme.js +51 -61
- package/dist/esm/v2/theme/createPortnetTheme.js.map +1 -1
- package/dist/esm/v2/theme/cssVariables.js +62 -69
- package/dist/esm/v2/theme/cssVariables.js.map +1 -1
- package/dist/esm/v2/theme/index.js +5 -5
- package/dist/esm/v2/theme/index.js.map +1 -1
- package/dist/esm/v2/tokens/breakpoints.js +14 -14
- package/dist/esm/v2/tokens/breakpoints.js.map +1 -1
- package/dist/esm/v2/tokens/chart.js +261 -0
- package/dist/esm/v2/tokens/chart.js.map +1 -0
- package/dist/esm/v2/tokens/colors.js +22 -22
- package/dist/esm/v2/tokens/colors.js.map +1 -1
- package/dist/esm/v2/tokens/density.js +62 -7
- package/dist/esm/v2/tokens/density.js.map +1 -1
- package/dist/esm/v2/tokens/index.js +49 -34
- package/dist/esm/v2/tokens/index.js.map +1 -1
- package/dist/esm/v2/tokens/motion.js +12 -20
- package/dist/esm/v2/tokens/motion.js.map +1 -1
- package/dist/esm/v2/tokens/radius.js +1 -1
- package/dist/esm/v2/tokens/radius.js.map +1 -1
- package/dist/esm/v2/tokens/shadows.js +6 -6
- package/dist/esm/v2/tokens/shadows.js.map +1 -1
- package/dist/esm/v2/tokens/spacing.js +2 -2
- package/dist/esm/v2/tokens/spacing.js.map +1 -1
- package/dist/esm/v2/tokens/state.js +1 -1
- package/dist/esm/v2/tokens/state.js.map +1 -1
- package/dist/esm/v2/tokens/statusPalette.js +17 -21
- package/dist/esm/v2/tokens/statusPalette.js.map +1 -1
- package/dist/esm/v2/tokens/tokens.json +6 -1
- package/dist/esm/v2/tokens/typography.js +13 -13
- package/dist/esm/v2/tokens/typography.js.map +1 -1
- package/dist/esm/v2/tokens/zIndex.js +1 -1
- package/dist/esm/v2/tokens/zIndex.js.map +1 -1
- package/dist/esm/v2/types/datagrid.js.map +1 -1
- package/dist/esm/v2/utils/apiError.js +16 -37
- package/dist/esm/v2/utils/apiError.js.map +1 -1
- package/dist/esm/v2/utils/contrast.js +31 -32
- package/dist/esm/v2/utils/contrast.js.map +1 -1
- package/dist/esm/v2/utils/cx.js +5 -25
- package/dist/esm/v2/utils/cx.js.map +1 -1
- package/dist/esm/v2/utils/fileDownload.js +23 -26
- package/dist/esm/v2/utils/fileDownload.js.map +1 -1
- package/dist/esm/v2/utils/fileValidation.js +209 -0
- package/dist/esm/v2/utils/fileValidation.js.map +1 -0
- package/dist/esm/v2/utils/fmtDate.js +111 -0
- package/dist/esm/v2/utils/fmtDate.js.map +1 -0
- package/dist/esm/v2/utils/fmtMoney.js +8 -10
- package/dist/esm/v2/utils/fmtMoney.js.map +1 -1
- package/dist/esm/v2/utils/formikErrors.js +78 -0
- package/dist/esm/v2/utils/formikErrors.js.map +1 -0
- package/dist/esm/v2/utils/index.js +35 -2
- package/dist/esm/v2/utils/index.js.map +1 -1
- package/dist/esm/v2/utils/mergeLabels.js +7 -12
- package/dist/esm/v2/utils/mergeLabels.js.map +1 -1
- package/dist/esm/v2/utils/networkStatus.js +12 -12
- package/dist/esm/v2/utils/networkStatus.js.map +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +110 -49
- package/dist/index.js.map +1 -1
- package/dist/v2/__tests__/AppMain.test.js +133 -0
- package/dist/v2/__tests__/AppMain.test.js.map +1 -0
- package/dist/v2/__tests__/ChartFigure.test.js +183 -0
- package/dist/v2/__tests__/ChartFigure.test.js.map +1 -0
- package/dist/v2/__tests__/DataGridRowActionsPropagation.test.js +153 -0
- package/dist/v2/__tests__/DataGridRowActionsPropagation.test.js.map +1 -0
- package/dist/v2/__tests__/DrawerTactileTargets.test.js +94 -0
- package/dist/v2/__tests__/DrawerTactileTargets.test.js.map +1 -0
- package/dist/v2/__tests__/FieldError.test.js +82 -49
- package/dist/v2/__tests__/FieldError.test.js.map +1 -1
- package/dist/v2/__tests__/FieldNaming.test.js +161 -0
- package/dist/v2/__tests__/FieldNaming.test.js.map +1 -0
- package/dist/v2/__tests__/FieldWidth.test.js +23 -25
- package/dist/v2/__tests__/FieldWidth.test.js.map +1 -1
- package/dist/v2/__tests__/FileCard.test.js +29 -28
- package/dist/v2/__tests__/FileCard.test.js.map +1 -1
- package/dist/v2/__tests__/FormikCheckbox.test.js +90 -183
- package/dist/v2/__tests__/FormikCheckbox.test.js.map +1 -1
- package/dist/v2/__tests__/FormikDateTimePicker.test.js +38 -48
- package/dist/v2/__tests__/FormikDateTimePicker.test.js.map +1 -1
- package/dist/v2/__tests__/FormikDisplayWidth.test.js +102 -0
- package/dist/v2/__tests__/FormikDisplayWidth.test.js.map +1 -0
- package/dist/v2/__tests__/FormikRadioGroup.test.js +123 -204
- package/dist/v2/__tests__/FormikRadioGroup.test.js.map +1 -1
- package/dist/v2/__tests__/MobileRowCard.test.js +63 -61
- package/dist/v2/__tests__/MobileRowCard.test.js.map +1 -1
- package/dist/v2/__tests__/PreviewDrawer.test.js +169 -0
- package/dist/v2/__tests__/PreviewDrawer.test.js.map +1 -0
- package/dist/v2/__tests__/ReferentielFieldContainer.test.js +159 -0
- package/dist/v2/__tests__/ReferentielFieldContainer.test.js.map +1 -0
- package/dist/v2/__tests__/SectionErrorBoundary.test.js +53 -68
- package/dist/v2/__tests__/SectionErrorBoundary.test.js.map +1 -1
- package/dist/v2/__tests__/apiError.test.js +50 -69
- package/dist/v2/__tests__/apiError.test.js.map +1 -1
- package/dist/v2/__tests__/banned-patterns.test.js +42 -123
- package/dist/v2/__tests__/banned-patterns.test.js.map +1 -1
- package/dist/v2/__tests__/chart-palette.test.js +205 -0
- package/dist/v2/__tests__/chart-palette.test.js.map +1 -0
- package/dist/v2/__tests__/contrast-palette.test.js +42 -74
- package/dist/v2/__tests__/contrast-palette.test.js.map +1 -1
- package/dist/v2/__tests__/cssVariables.test.js +44 -51
- package/dist/v2/__tests__/cssVariables.test.js.map +1 -1
- package/dist/v2/__tests__/fileValidation.test.js +136 -0
- package/dist/v2/__tests__/fileValidation.test.js.map +1 -0
- package/dist/v2/__tests__/filterCriteria.test.js +324 -0
- package/dist/v2/__tests__/filterCriteria.test.js.map +1 -0
- package/dist/v2/__tests__/fmtDate.test.js +69 -0
- package/dist/v2/__tests__/fmtDate.test.js.map +1 -0
- package/dist/v2/__tests__/gap-leakage-refonte.test.js +221 -0
- package/dist/v2/__tests__/gap-leakage-refonte.test.js.map +1 -0
- package/dist/v2/__tests__/labels-merge.test.js +23 -27
- package/dist/v2/__tests__/labels-merge.test.js.map +1 -1
- package/dist/v2/__tests__/locale-fallback.test.js +47 -52
- package/dist/v2/__tests__/locale-fallback.test.js.map +1 -1
- package/dist/v2/__tests__/reviveSavedCriteria.test.js +144 -0
- package/dist/v2/__tests__/reviveSavedCriteria.test.js.map +1 -0
- package/dist/v2/__tests__/rowActions.test.js +186 -0
- package/dist/v2/__tests__/rowActions.test.js.map +1 -0
- package/dist/v2/__tests__/useFocusOnRouteChange.test.js +156 -0
- package/dist/v2/__tests__/useFocusOnRouteChange.test.js.map +1 -0
- package/dist/v2/__tests__/useFocusTrap.test.js +270 -407
- package/dist/v2/__tests__/useFocusTrap.test.js.map +1 -1
- package/dist/v2/__tests__/usePrefersReducedMotion.test.js +123 -0
- package/dist/v2/__tests__/usePrefersReducedMotion.test.js.map +1 -0
- package/dist/v2/components/Accordion.js +60 -82
- package/dist/v2/components/Accordion.js.map +1 -1
- package/dist/v2/components/ActionStrip.js +40 -52
- package/dist/v2/components/ActionStrip.js.map +1 -1
- package/dist/v2/components/Banner.js +42 -41
- package/dist/v2/components/Banner.js.map +1 -1
- package/dist/v2/components/Busy.js +22 -27
- package/dist/v2/components/Busy.js.map +1 -1
- package/dist/v2/components/Button.js +39 -50
- package/dist/v2/components/Button.js.map +1 -1
- package/dist/v2/components/CategoryTag.d.ts.map +1 -1
- package/dist/v2/components/CategoryTag.js +49 -32
- package/dist/v2/components/CategoryTag.js.map +1 -1
- package/dist/v2/components/Checkbox.js +39 -45
- package/dist/v2/components/Checkbox.js.map +1 -1
- package/dist/v2/components/Chip.js +29 -42
- package/dist/v2/components/Chip.js.map +1 -1
- package/dist/v2/components/Combobox.js +122 -144
- package/dist/v2/components/Combobox.js.map +1 -1
- package/dist/v2/components/CommandPalette.js +138 -225
- package/dist/v2/components/CommandPalette.js.map +1 -1
- package/dist/v2/components/ConfirmDialog.js +46 -56
- package/dist/v2/components/ConfirmDialog.js.map +1 -1
- package/dist/v2/components/DatePicker.js +81 -86
- package/dist/v2/components/DatePicker.js.map +1 -1
- package/dist/v2/components/DateRangePicker.js +77 -87
- package/dist/v2/components/DateRangePicker.js.map +1 -1
- package/dist/v2/components/DateTimePicker.js +84 -91
- package/dist/v2/components/DateTimePicker.js.map +1 -1
- package/dist/v2/components/Drawer.d.ts.map +1 -1
- package/dist/v2/components/Drawer.js +93 -88
- package/dist/v2/components/Drawer.js.map +1 -1
- package/dist/v2/components/Dropzone.js +150 -196
- package/dist/v2/components/Dropzone.js.map +1 -1
- package/dist/v2/components/EmptyState.js +18 -20
- package/dist/v2/components/EmptyState.js.map +1 -1
- package/dist/v2/components/FavoriteToggle.js +28 -39
- package/dist/v2/components/FavoriteToggle.js.map +1 -1
- package/dist/v2/components/Field.d.ts +62 -4
- package/dist/v2/components/Field.d.ts.map +1 -1
- package/dist/v2/components/Field.js +169 -70
- package/dist/v2/components/Field.js.map +1 -1
- package/dist/v2/components/FieldError.js +18 -21
- package/dist/v2/components/FieldError.js.map +1 -1
- package/dist/v2/components/FieldHelp.js +40 -60
- package/dist/v2/components/FieldHelp.js.map +1 -1
- package/dist/v2/components/FileCard.js +27 -31
- package/dist/v2/components/FileCard.js.map +1 -1
- package/dist/v2/components/FilterTab.js +30 -38
- package/dist/v2/components/FilterTab.js.map +1 -1
- package/dist/v2/components/ForbiddenPage.d.ts +25 -1
- package/dist/v2/components/ForbiddenPage.d.ts.map +1 -1
- package/dist/v2/components/ForbiddenPage.js +37 -17
- package/dist/v2/components/ForbiddenPage.js.map +1 -1
- package/dist/v2/components/FormGrid.js +53 -59
- package/dist/v2/components/FormGrid.js.map +1 -1
- package/dist/v2/components/FormikDisplay.d.ts +50 -1
- package/dist/v2/components/FormikDisplay.d.ts.map +1 -1
- package/dist/v2/components/FormikDisplay.js +108 -33
- package/dist/v2/components/FormikDisplay.js.map +1 -1
- package/dist/v2/components/Input.d.ts +40 -0
- package/dist/v2/components/Input.d.ts.map +1 -1
- package/dist/v2/components/Input.js +81 -41
- package/dist/v2/components/Input.js.map +1 -1
- package/dist/v2/components/KPICard.js +57 -67
- package/dist/v2/components/KPICard.js.map +1 -1
- package/dist/v2/components/KPIStrip.js +16 -22
- package/dist/v2/components/KPIStrip.js.map +1 -1
- package/dist/v2/components/KV.js +25 -31
- package/dist/v2/components/KV.js.map +1 -1
- package/dist/v2/components/KVGrid.js +19 -26
- package/dist/v2/components/KVGrid.js.map +1 -1
- package/dist/v2/components/Layout.js +91 -120
- package/dist/v2/components/Layout.js.map +1 -1
- package/dist/v2/components/MobileRowCard.js +79 -91
- package/dist/v2/components/MobileRowCard.js.map +1 -1
- package/dist/v2/components/Modal.js +61 -69
- package/dist/v2/components/Modal.js.map +1 -1
- package/dist/v2/components/NetworkErrorPage.d.ts +19 -1
- package/dist/v2/components/NetworkErrorPage.d.ts.map +1 -1
- package/dist/v2/components/NetworkErrorPage.js +38 -21
- package/dist/v2/components/NetworkErrorPage.js.map +1 -1
- package/dist/v2/components/NotFoundPage.d.ts +17 -1
- package/dist/v2/components/NotFoundPage.d.ts.map +1 -1
- package/dist/v2/components/NotFoundPage.js +37 -18
- package/dist/v2/components/NotFoundPage.js.map +1 -1
- package/dist/v2/components/NumberInput.js +88 -118
- package/dist/v2/components/NumberInput.js.map +1 -1
- package/dist/v2/components/OverflowMenu.js +38 -56
- package/dist/v2/components/OverflowMenu.js.map +1 -1
- package/dist/v2/components/PdfViewer.js +34 -45
- package/dist/v2/components/PdfViewer.js.map +1 -1
- package/dist/v2/components/ProgressBar.js +42 -49
- package/dist/v2/components/ProgressBar.js.map +1 -1
- package/dist/v2/components/Radio.js +59 -67
- package/dist/v2/components/Radio.js.map +1 -1
- package/dist/v2/components/SectionErrorBoundary.js +90 -135
- package/dist/v2/components/SectionErrorBoundary.js.map +1 -1
- package/dist/v2/components/SectionHeader.js +34 -41
- package/dist/v2/components/SectionHeader.js.map +1 -1
- package/dist/v2/components/Segmented.js +69 -93
- package/dist/v2/components/Segmented.js.map +1 -1
- package/dist/v2/components/Select.d.ts +26 -2
- package/dist/v2/components/Select.d.ts.map +1 -1
- package/dist/v2/components/Select.js +120 -155
- package/dist/v2/components/Select.js.map +1 -1
- package/dist/v2/components/ServerErrorPage.d.ts +27 -1
- package/dist/v2/components/ServerErrorPage.d.ts.map +1 -1
- package/dist/v2/components/ServerErrorPage.js +37 -20
- package/dist/v2/components/ServerErrorPage.js.map +1 -1
- package/dist/v2/components/Skeleton.js +86 -100
- package/dist/v2/components/Skeleton.js.map +1 -1
- package/dist/v2/components/SkipLink.js +9 -12
- package/dist/v2/components/SkipLink.js.map +1 -1
- package/dist/v2/components/Spinner.js +16 -25
- package/dist/v2/components/Spinner.js.map +1 -1
- package/dist/v2/components/Status.js +18 -29
- package/dist/v2/components/Status.js.map +1 -1
- package/dist/v2/components/Stepper.js +80 -82
- package/dist/v2/components/Stepper.js.map +1 -1
- package/dist/v2/components/Surface.js +34 -49
- package/dist/v2/components/Surface.js.map +1 -1
- package/dist/v2/components/Switch.js +29 -37
- package/dist/v2/components/Switch.js.map +1 -1
- package/dist/v2/components/TabPanel.d.ts +17 -0
- package/dist/v2/components/TabPanel.d.ts.map +1 -0
- package/dist/v2/components/TabPanel.js +90 -0
- package/dist/v2/components/TabPanel.js.map +1 -0
- package/dist/v2/components/Tabs.d.ts +25 -0
- package/dist/v2/components/Tabs.d.ts.map +1 -1
- package/dist/v2/components/Tabs.js +53 -29
- package/dist/v2/components/Tabs.js.map +1 -1
- package/dist/v2/components/TelInput.js +80 -115
- package/dist/v2/components/TelInput.js.map +1 -1
- package/dist/v2/components/Textarea.js +26 -35
- package/dist/v2/components/Textarea.js.map +1 -1
- package/dist/v2/components/TimePicker.js +62 -74
- package/dist/v2/components/TimePicker.js.map +1 -1
- package/dist/v2/components/Toast.js +119 -174
- package/dist/v2/components/Toast.js.map +1 -1
- package/dist/v2/components/Tooltip.js +23 -38
- package/dist/v2/components/Tooltip.js.map +1 -1
- package/dist/v2/components/_ErrorPageBody.js +15 -16
- package/dist/v2/components/_ErrorPageBody.js.map +1 -1
- package/dist/v2/components/_pickerShared.js +5 -5
- package/dist/v2/components/_pickerShared.js.map +1 -1
- package/dist/v2/components/index.d.ts +40 -1
- package/dist/v2/components/index.d.ts.map +1 -1
- package/dist/v2/components/index.js +153 -136
- package/dist/v2/components/index.js.map +1 -1
- package/dist/v2/hooks/index.d.ts +65 -0
- package/dist/v2/hooks/index.d.ts.map +1 -1
- package/dist/v2/hooks/index.js +63 -24
- package/dist/v2/hooks/index.js.map +1 -1
- package/dist/v2/hooks/useAppliedFilters.d.ts +102 -0
- package/dist/v2/hooks/useAppliedFilters.d.ts.map +1 -0
- package/dist/v2/hooks/useAppliedFilters.js +117 -0
- package/dist/v2/hooks/useAppliedFilters.js.map +1 -0
- package/dist/v2/hooks/useDebouncedCallback.d.ts +64 -0
- package/dist/v2/hooks/useDebouncedCallback.d.ts.map +1 -0
- package/dist/v2/hooks/useDebouncedCallback.js +87 -0
- package/dist/v2/hooks/useDebouncedCallback.js.map +1 -0
- package/dist/v2/hooks/useDelayedFlag.js +6 -20
- package/dist/v2/hooks/useDelayedFlag.js.map +1 -1
- package/dist/v2/hooks/useDensity.d.ts.map +1 -1
- package/dist/v2/hooks/useDensity.js +14 -18
- package/dist/v2/hooks/useDensity.js.map +1 -1
- package/dist/v2/hooks/useFocusFirstError.js +26 -34
- package/dist/v2/hooks/useFocusFirstError.js.map +1 -1
- package/dist/v2/hooks/useFocusOnRouteChange.d.ts +65 -0
- package/dist/v2/hooks/useFocusOnRouteChange.d.ts.map +1 -0
- package/dist/v2/hooks/useFocusOnRouteChange.js +88 -0
- package/dist/v2/hooks/useFocusOnRouteChange.js.map +1 -0
- package/dist/v2/hooks/useFocusTrap.js +20 -24
- package/dist/v2/hooks/useFocusTrap.js.map +1 -1
- package/dist/v2/hooks/useFormAutoSave.d.ts +4 -4
- package/dist/v2/hooks/useFormAutoSave.d.ts.map +1 -1
- package/dist/v2/hooks/useFormAutoSave.js +39 -54
- package/dist/v2/hooks/useFormAutoSave.js.map +1 -1
- package/dist/v2/hooks/useFormCompletionProgress.d.ts +1 -1
- package/dist/v2/hooks/useFormCompletionProgress.d.ts.map +1 -1
- package/dist/v2/hooks/useFormCompletionProgress.js +33 -52
- package/dist/v2/hooks/useFormCompletionProgress.js.map +1 -1
- package/dist/v2/hooks/useKeyboardShortcuts.d.ts +25 -0
- package/dist/v2/hooks/useKeyboardShortcuts.d.ts.map +1 -0
- package/dist/v2/hooks/useKeyboardShortcuts.js +132 -0
- package/dist/v2/hooks/useKeyboardShortcuts.js.map +1 -0
- package/dist/v2/hooks/usePrefersReducedMotion.d.ts +56 -0
- package/dist/v2/hooks/usePrefersReducedMotion.d.ts.map +1 -0
- package/dist/v2/hooks/usePrefersReducedMotion.js +105 -0
- package/dist/v2/hooks/usePrefersReducedMotion.js.map +1 -0
- package/dist/v2/hooks/useResolvedDensity.js +5 -13
- package/dist/v2/hooks/useResolvedDensity.js.map +1 -1
- package/dist/v2/hooks/useSortedRows.js +4 -6
- package/dist/v2/hooks/useSortedRows.js.map +1 -1
- package/dist/v2/hooks/useTabLoading.js +7 -22
- package/dist/v2/hooks/useTabLoading.js.map +1 -1
- package/dist/v2/index.js +143 -145
- package/dist/v2/index.js.map +1 -1
- package/dist/v2/modalContext.js +2 -2
- package/dist/v2/modalContext.js.map +1 -1
- package/dist/v2/models/favorite.d.ts +8 -9
- package/dist/v2/models/favorite.d.ts.map +1 -1
- package/dist/v2/models/favorite.js.map +1 -1
- package/dist/v2/models/index.js +4 -4
- package/dist/v2/models/index.js.map +1 -1
- package/dist/v2/models/personalization.d.ts +44 -48
- package/dist/v2/models/personalization.d.ts.map +1 -1
- package/dist/v2/models/personalization.js.map +1 -1
- package/dist/v2/models/referentiel.d.ts +32 -50
- package/dist/v2/models/referentiel.d.ts.map +1 -1
- package/dist/v2/models/referentiel.js.map +1 -1
- package/dist/v2/models/savedFilter.d.ts +8 -17
- package/dist/v2/models/savedFilter.d.ts.map +1 -1
- package/dist/v2/models/savedFilter.js.map +1 -1
- package/dist/v2/patterns/ActionBar.js +152 -187
- package/dist/v2/patterns/ActionBar.js.map +1 -1
- package/dist/v2/patterns/AppMain.d.ts +109 -0
- package/dist/v2/patterns/AppMain.d.ts.map +1 -0
- package/dist/v2/patterns/AppMain.js +115 -0
- package/dist/v2/patterns/AppMain.js.map +1 -0
- package/dist/v2/patterns/BulkActionBar.js +40 -42
- package/dist/v2/patterns/BulkActionBar.js.map +1 -1
- package/dist/v2/patterns/ChartFigure.d.ts +124 -0
- package/dist/v2/patterns/ChartFigure.d.ts.map +1 -0
- package/dist/v2/patterns/ChartFigure.js +159 -0
- package/dist/v2/patterns/ChartFigure.js.map +1 -0
- package/dist/v2/patterns/CollapsibleDataGrid.js +138 -174
- package/dist/v2/patterns/CollapsibleDataGrid.js.map +1 -1
- package/dist/v2/patterns/ColumnsToggle.js +60 -94
- package/dist/v2/patterns/ColumnsToggle.js.map +1 -1
- package/dist/v2/patterns/DataGrid.d.ts.map +1 -1
- package/dist/v2/patterns/DataGrid.js +262 -297
- package/dist/v2/patterns/DataGrid.js.map +1 -1
- package/dist/v2/patterns/DataGridSettingsMenu.d.ts +12 -0
- package/dist/v2/patterns/DataGridSettingsMenu.d.ts.map +1 -1
- package/dist/v2/patterns/DataGridSettingsMenu.js +104 -121
- package/dist/v2/patterns/DataGridSettingsMenu.js.map +1 -1
- package/dist/v2/patterns/DataGridToolbar.js +103 -106
- package/dist/v2/patterns/DataGridToolbar.js.map +1 -1
- package/dist/v2/patterns/DataGridVirtualized.js +179 -217
- package/dist/v2/patterns/DataGridVirtualized.js.map +1 -1
- package/dist/v2/patterns/DeleteResourceConfirmDialog.js +32 -35
- package/dist/v2/patterns/DeleteResourceConfirmDialog.js.map +1 -1
- package/dist/v2/patterns/DetailSplit.d.ts +87 -0
- package/dist/v2/patterns/DetailSplit.d.ts.map +1 -0
- package/dist/v2/patterns/DetailSplit.js +116 -0
- package/dist/v2/patterns/DetailSplit.js.map +1 -0
- package/dist/v2/patterns/FavoriteColumn.js +22 -23
- package/dist/v2/patterns/FavoriteColumn.js.map +1 -1
- package/dist/v2/patterns/FavoritesFilter.js +36 -44
- package/dist/v2/patterns/FavoritesFilter.js.map +1 -1
- package/dist/v2/patterns/FilterTabBar.d.ts +28 -0
- package/dist/v2/patterns/FilterTabBar.d.ts.map +1 -0
- package/dist/v2/patterns/FilterTabBar.js +120 -0
- package/dist/v2/patterns/FilterTabBar.js.map +1 -0
- package/dist/v2/patterns/FormErrorSummary.js +20 -23
- package/dist/v2/patterns/FormErrorSummary.js.map +1 -1
- package/dist/v2/patterns/FormPageShell.js +53 -50
- package/dist/v2/patterns/FormPageShell.js.map +1 -1
- package/dist/v2/patterns/FormSection.d.ts +8 -3
- package/dist/v2/patterns/FormSection.d.ts.map +1 -1
- package/dist/v2/patterns/FormSection.js +44 -51
- package/dist/v2/patterns/FormSection.js.map +1 -1
- package/dist/v2/patterns/FormikCheckbox.js +36 -45
- package/dist/v2/patterns/FormikCheckbox.js.map +1 -1
- package/dist/v2/patterns/FormikCheckboxGroup.d.ts +17 -1
- package/dist/v2/patterns/FormikCheckboxGroup.d.ts.map +1 -1
- package/dist/v2/patterns/FormikCheckboxGroup.js +62 -65
- package/dist/v2/patterns/FormikCheckboxGroup.js.map +1 -1
- package/dist/v2/patterns/FormikCombobox.js +55 -72
- package/dist/v2/patterns/FormikCombobox.js.map +1 -1
- package/dist/v2/patterns/FormikDatePicker.js +50 -64
- package/dist/v2/patterns/FormikDatePicker.js.map +1 -1
- package/dist/v2/patterns/FormikDateTimePicker.js +50 -64
- package/dist/v2/patterns/FormikDateTimePicker.js.map +1 -1
- package/dist/v2/patterns/FormikErrorFocus.js +25 -26
- package/dist/v2/patterns/FormikErrorFocus.js.map +1 -1
- package/dist/v2/patterns/FormikErrorSummary.d.ts +74 -0
- package/dist/v2/patterns/FormikErrorSummary.d.ts.map +1 -0
- package/dist/v2/patterns/FormikErrorSummary.js +97 -0
- package/dist/v2/patterns/FormikErrorSummary.js.map +1 -0
- package/dist/v2/patterns/FormikFile.d.ts +14 -1
- package/dist/v2/patterns/FormikFile.d.ts.map +1 -1
- package/dist/v2/patterns/FormikFile.js +99 -83
- package/dist/v2/patterns/FormikFile.js.map +1 -1
- package/dist/v2/patterns/FormikInput.js +45 -58
- package/dist/v2/patterns/FormikInput.js.map +1 -1
- package/dist/v2/patterns/FormikRadioGroup.js +45 -56
- package/dist/v2/patterns/FormikRadioGroup.js.map +1 -1
- package/dist/v2/patterns/FormikReferentielField.d.ts +12 -1
- package/dist/v2/patterns/FormikReferentielField.d.ts.map +1 -1
- package/dist/v2/patterns/FormikReferentielField.js +54 -64
- package/dist/v2/patterns/FormikReferentielField.js.map +1 -1
- package/dist/v2/patterns/FormikSelect.js +70 -92
- package/dist/v2/patterns/FormikSelect.js.map +1 -1
- package/dist/v2/patterns/FormikTextarea.js +35 -51
- package/dist/v2/patterns/FormikTextarea.js.map +1 -1
- package/dist/v2/patterns/KeyboardShortcutsHelp.js +60 -80
- package/dist/v2/patterns/KeyboardShortcutsHelp.js.map +1 -1
- package/dist/v2/patterns/NetworkErrorBanner.js +13 -16
- package/dist/v2/patterns/NetworkErrorBanner.js.map +1 -1
- package/dist/v2/patterns/PageContent.js +17 -20
- package/dist/v2/patterns/PageContent.js.map +1 -1
- package/dist/v2/patterns/PreviewDrawer.d.ts +49 -0
- package/dist/v2/patterns/PreviewDrawer.d.ts.map +1 -0
- package/dist/v2/patterns/PreviewDrawer.js +159 -0
- package/dist/v2/patterns/PreviewDrawer.js.map +1 -0
- package/dist/v2/patterns/ReferentielField.d.ts +86 -2
- package/dist/v2/patterns/ReferentielField.d.ts.map +1 -1
- package/dist/v2/patterns/ReferentielField.js +347 -327
- package/dist/v2/patterns/ReferentielField.js.map +1 -1
- package/dist/v2/patterns/RowFavoriteToggle.d.ts +6 -0
- package/dist/v2/patterns/RowFavoriteToggle.d.ts.map +1 -1
- package/dist/v2/patterns/RowFavoriteToggle.js +38 -30
- package/dist/v2/patterns/RowFavoriteToggle.js.map +1 -1
- package/dist/v2/patterns/SaveFilterDialog.js +50 -77
- package/dist/v2/patterns/SaveFilterDialog.js.map +1 -1
- package/dist/v2/patterns/SavedFiltersMenu.js +89 -107
- package/dist/v2/patterns/SavedFiltersMenu.js.map +1 -1
- package/dist/v2/patterns/SkeletonPageShell.js +122 -143
- package/dist/v2/patterns/SkeletonPageShell.js.map +1 -1
- package/dist/v2/patterns/SortableHeader.js +35 -57
- package/dist/v2/patterns/SortableHeader.js.map +1 -1
- package/dist/v2/patterns/Tour.js +121 -142
- package/dist/v2/patterns/Tour.js.map +1 -1
- package/dist/v2/patterns/_dataGridShared.d.ts.map +1 -1
- package/dist/v2/patterns/_dataGridShared.js +131 -147
- package/dist/v2/patterns/_dataGridShared.js.map +1 -1
- package/dist/v2/patterns/_pickerSerialisation.js +9 -10
- package/dist/v2/patterns/_pickerSerialisation.js.map +1 -1
- package/dist/v2/patterns/_sort.js +17 -33
- package/dist/v2/patterns/_sort.js.map +1 -1
- package/dist/v2/patterns/_useColumnReorder.js +124 -163
- package/dist/v2/patterns/_useColumnReorder.js.map +1 -1
- package/dist/v2/patterns/_useColumnResize.js +80 -99
- package/dist/v2/patterns/_useColumnResize.js.map +1 -1
- package/dist/v2/patterns/filterCriteria.d.ts +78 -0
- package/dist/v2/patterns/filterCriteria.d.ts.map +1 -0
- package/dist/v2/patterns/filterCriteria.js +110 -0
- package/dist/v2/patterns/filterCriteria.js.map +1 -0
- package/dist/v2/patterns/index.d.ts +160 -0
- package/dist/v2/patterns/index.d.ts.map +1 -1
- package/dist/v2/patterns/index.js +157 -79
- package/dist/v2/patterns/index.js.map +1 -1
- package/dist/v2/patterns/rowActions.d.ts +150 -0
- package/dist/v2/patterns/rowActions.d.ts.map +1 -0
- package/dist/v2/patterns/rowActions.js +232 -0
- package/dist/v2/patterns/rowActions.js.map +1 -0
- package/dist/v2/personalization/PersonalizationProvider.d.ts.map +1 -1
- package/dist/v2/personalization/PersonalizationProvider.js +57 -53
- package/dist/v2/personalization/PersonalizationProvider.js.map +1 -1
- package/dist/v2/personalization/adapters/_storageKey.js +5 -5
- package/dist/v2/personalization/adapters/_storageKey.js.map +1 -1
- package/dist/v2/personalization/adapters/createLocalStorageAdapter.js +25 -24
- package/dist/v2/personalization/adapters/createLocalStorageAdapter.js.map +1 -1
- package/dist/v2/personalization/adapters/createMemoryAdapter.js +14 -14
- package/dist/v2/personalization/adapters/createMemoryAdapter.js.map +1 -1
- package/dist/v2/personalization/adapters/index.js +5 -5
- package/dist/v2/personalization/adapters/index.js.map +1 -1
- package/dist/v2/personalization/capabilities/favorites.js +39 -62
- package/dist/v2/personalization/capabilities/favorites.js.map +1 -1
- package/dist/v2/personalization/capabilities/favoritesView.js +25 -37
- package/dist/v2/personalization/capabilities/favoritesView.js.map +1 -1
- package/dist/v2/personalization/capabilities/gridPreferences.js +31 -36
- package/dist/v2/personalization/capabilities/gridPreferences.js.map +1 -1
- package/dist/v2/personalization/capabilities/index.js +12 -12
- package/dist/v2/personalization/capabilities/reviveSavedCriteria.d.ts +88 -0
- package/dist/v2/personalization/capabilities/reviveSavedCriteria.d.ts.map +1 -0
- package/dist/v2/personalization/capabilities/reviveSavedCriteria.js +126 -0
- package/dist/v2/personalization/capabilities/reviveSavedCriteria.js.map +1 -0
- package/dist/v2/personalization/capabilities/savedFilters.js +93 -100
- package/dist/v2/personalization/capabilities/savedFilters.js.map +1 -1
- package/dist/v2/personalization/createPersonalizationStore.d.ts.map +1 -1
- package/dist/v2/personalization/createPersonalizationStore.js +81 -182
- package/dist/v2/personalization/createPersonalizationStore.js.map +1 -1
- package/dist/v2/personalization/index.d.ts +16 -0
- package/dist/v2/personalization/index.d.ts.map +1 -1
- package/dist/v2/personalization/index.js +30 -23
- package/dist/v2/personalization/index.js.map +1 -1
- package/dist/v2/personalization/personalizationContext.js +10 -12
- package/dist/v2/personalization/personalizationContext.js.map +1 -1
- package/dist/v2/personalization/schema.js +8 -9
- package/dist/v2/personalization/schema.js.map +1 -1
- package/dist/v2/referentiel/ReferentielProvider.js +31 -45
- package/dist/v2/referentiel/ReferentielProvider.js.map +1 -1
- package/dist/v2/referentiel/index.js +11 -13
- package/dist/v2/referentiel/index.js.map +1 -1
- package/dist/v2/referentiel/types.d.ts +105 -0
- package/dist/v2/referentiel/types.d.ts.map +1 -0
- package/dist/v2/referentiel/types.js +6 -0
- package/dist/v2/referentiel/types.js.map +1 -0
- package/dist/v2/referentiel/useReferentielClient.js +13 -16
- package/dist/v2/referentiel/useReferentielClient.js.map +1 -1
- package/dist/v2/referentiel/useReferentielOptions.d.ts +7 -17
- package/dist/v2/referentiel/useReferentielOptions.d.ts.map +1 -1
- package/dist/v2/referentiel/useReferentielOptions.js +63 -120
- package/dist/v2/referentiel/useReferentielOptions.js.map +1 -1
- package/dist/v2/referentiel/useReferentielSearch.d.ts +7 -48
- package/dist/v2/referentiel/useReferentielSearch.d.ts.map +1 -1
- package/dist/v2/referentiel/useReferentielSearch.js +40 -95
- package/dist/v2/referentiel/useReferentielSearch.js.map +1 -1
- package/dist/v2/theme/_brand.js +12 -26
- package/dist/v2/theme/_brand.js.map +1 -1
- package/dist/v2/theme/_brandSecondary.js +12 -26
- package/dist/v2/theme/_brandSecondary.js.map +1 -1
- package/dist/v2/theme/createPortnetTheme.js +41 -49
- package/dist/v2/theme/createPortnetTheme.js.map +1 -1
- package/dist/v2/theme/cssVariables.d.ts +3 -3
- package/dist/v2/theme/cssVariables.d.ts.map +1 -1
- package/dist/v2/theme/cssVariables.js +65 -70
- package/dist/v2/theme/cssVariables.js.map +1 -1
- package/dist/v2/theme/index.js +10 -10
- package/dist/v2/theme/index.js.map +1 -1
- package/dist/v2/tokens/breakpoints.js +16 -16
- package/dist/v2/tokens/breakpoints.js.map +1 -1
- package/dist/v2/tokens/chart.d.ts +103 -0
- package/dist/v2/tokens/chart.d.ts.map +1 -0
- package/dist/v2/tokens/chart.js +270 -0
- package/dist/v2/tokens/chart.js.map +1 -0
- package/dist/v2/tokens/colors.js +24 -24
- package/dist/v2/tokens/colors.js.map +1 -1
- package/dist/v2/tokens/density.d.ts +104 -0
- package/dist/v2/tokens/density.d.ts.map +1 -1
- package/dist/v2/tokens/density.js +67 -12
- package/dist/v2/tokens/density.js.map +1 -1
- package/dist/v2/tokens/index.d.ts +50 -1
- package/dist/v2/tokens/index.d.ts.map +1 -1
- package/dist/v2/tokens/index.js +116 -68
- package/dist/v2/tokens/index.js.map +1 -1
- package/dist/v2/tokens/motion.js +16 -22
- package/dist/v2/tokens/motion.js.map +1 -1
- package/dist/v2/tokens/radius.js +3 -3
- package/dist/v2/tokens/radius.js.map +1 -1
- package/dist/v2/tokens/shadows.js +8 -8
- package/dist/v2/tokens/shadows.js.map +1 -1
- package/dist/v2/tokens/spacing.js +4 -4
- package/dist/v2/tokens/spacing.js.map +1 -1
- package/dist/v2/tokens/state.js +3 -3
- package/dist/v2/tokens/state.js.map +1 -1
- package/dist/v2/tokens/statusPalette.js +21 -23
- package/dist/v2/tokens/statusPalette.js.map +1 -1
- package/dist/v2/tokens/tokens.json +6 -1
- package/dist/v2/tokens/typography.js +15 -15
- package/dist/v2/tokens/typography.js.map +1 -1
- package/dist/v2/tokens/zIndex.js +3 -3
- package/dist/v2/tokens/zIndex.js.map +1 -1
- package/dist/v2/types/datagrid.d.ts +9 -1
- package/dist/v2/types/datagrid.d.ts.map +1 -1
- package/dist/v2/types/datagrid.js.map +1 -1
- package/dist/v2/types/index.js +2 -2
- package/dist/v2/types/index.js.map +1 -1
- package/dist/v2/utils/apiError.js +16 -37
- package/dist/v2/utils/apiError.js.map +1 -1
- package/dist/v2/utils/contrast.js +31 -32
- package/dist/v2/utils/contrast.js.map +1 -1
- package/dist/v2/utils/cx.js +7 -27
- package/dist/v2/utils/cx.js.map +1 -1
- package/dist/v2/utils/fileDownload.js +25 -28
- package/dist/v2/utils/fileDownload.js.map +1 -1
- package/dist/v2/utils/fileValidation.d.ts +116 -0
- package/dist/v2/utils/fileValidation.d.ts.map +1 -0
- package/dist/v2/utils/fileValidation.js +220 -0
- package/dist/v2/utils/fileValidation.js.map +1 -0
- package/dist/v2/utils/fmtDate.d.ts +103 -0
- package/dist/v2/utils/fmtDate.d.ts.map +1 -0
- package/dist/v2/utils/fmtDate.js +119 -0
- package/dist/v2/utils/fmtDate.js.map +1 -0
- package/dist/v2/utils/fmtMoney.d.ts +3 -3
- package/dist/v2/utils/fmtMoney.d.ts.map +1 -1
- package/dist/v2/utils/fmtMoney.js +9 -11
- package/dist/v2/utils/fmtMoney.js.map +1 -1
- package/dist/v2/utils/formikErrors.d.ts +67 -0
- package/dist/v2/utils/formikErrors.d.ts.map +1 -0
- package/dist/v2/utils/formikErrors.js +85 -0
- package/dist/v2/utils/formikErrors.js.map +1 -0
- package/dist/v2/utils/index.d.ts +5 -0
- package/dist/v2/utils/index.d.ts.map +1 -1
- package/dist/v2/utils/index.js +67 -18
- package/dist/v2/utils/index.js.map +1 -1
- package/dist/v2/utils/mergeLabels.js +9 -14
- package/dist/v2/utils/mergeLabels.js.map +1 -1
- package/dist/v2/utils/networkStatus.js +14 -14
- package/dist/v2/utils/networkStatus.js.map +1 -1
- package/package.json +26 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"banned-patterns.test.js","names":["_regeneratorRuntime","exports","Op","Object","prototype","hasOwn","hasOwnProperty","defineProperty","obj","key","desc","value","$Symbol","Symbol","iteratorSymbol","iterator","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","define","enumerable","configurable","writable","err","wrap","innerFn","outerFn","self","tryLocsList","protoGenerator","Generator","generator","create","context","Context","makeInvokeMethod","tryCatch","fn","arg","type","call","ContinueSentinel","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","getPrototypeOf","NativeIteratorPrototype","values","Gp","defineIteratorMethods","forEach","method","_invoke","AsyncIterator","PromiseImpl","invoke","resolve","reject","record","result","_typeof","__await","then","unwrapped","error","previousPromise","callInvokeWithMethodAndArg","state","Error","doneResult","delegate","delegateResult","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","done","methodName","undefined","TypeError","info","resultName","next","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","iterable","iteratorMethod","isNaN","length","i","displayName","isGeneratorFunction","genFun","ctor","constructor","name","mark","setPrototypeOf","__proto__","awrap","async","Promise","iter","keys","val","object","reverse","pop","skipTempReset","prev","charAt","slice","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","_catch","thrown","delegateYield","_marked","walk","_createForOfIteratorHelper","o","allowArrayLike","it","Array","isArray","_unsupportedIterableToArray","F","s","n","e","_e","f","normalCompletion","didErr","step","_e2","minLen","_arrayLikeToArray","toString","from","test","arr","len","arr2","fs","path","V2_ROOT","__dirname","dir","_iterator","_step","p","walk$","_context","readdirSync","withFileTypes","join","isDirectory","isFile","endsWith","t1","readAllSourceFiles","files","_iterator2","_step2","file","content","readFileSync","findOffenders","predicate","filter","map","relative","describe","beforeAll","expect","toBeGreaterThan","offenders","c","includes","toEqual","re"],"sources":["../../../../src/lib/v2/__tests__/banned-patterns.test.ts"],"sourcesContent":["/* eslint-env node */\r\nimport * as fs from \"fs\";\r\nimport * as path from \"path\";\r\n\r\n/**\r\n * Static-analysis tests guarding against re-introduction of banned\r\n * patterns in src/lib/v2/. Pure filesystem scan; no React, no jsdom.\r\n *\r\n * Each banned pattern has a unique regression history documented in\r\n * the per-test comment so future readers know WHY the rule exists,\r\n * not just what it forbids.\r\n */\r\n\r\nconst V2_ROOT: string = path.resolve(__dirname, \"..\");\r\n\r\ninterface SourceFile {\r\n path: string;\r\n content: string;\r\n}\r\n\r\n/**\r\n * Recursively walk a directory, yielding paths of source files that\r\n * are eligible for scanning. Excludes nested __tests__ folders so\r\n * test fixtures referencing banned strings as test data don't trigger\r\n * the rule. Scans .js/.jsx/.ts/.tsx/.css (ambient .d.ts excluded — no\r\n * runtime style/breakpoint literals live there).\r\n */\r\nfunction* walk(dir: string): Generator<string> {\r\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\r\n const p = path.join(dir, entry.name);\r\n if (entry.isDirectory()) {\r\n if (entry.name === \"__tests__\" || entry.name === \"node_modules\") continue;\r\n yield* walk(p);\r\n } else if (\r\n entry.isFile() &&\r\n /\\.(?:jsx?|tsx?|css)$/.test(entry.name) &&\r\n !entry.name.endsWith(\".d.ts\")\r\n ) {\r\n yield p;\r\n }\r\n }\r\n}\r\n\r\nfunction readAllSourceFiles(): SourceFile[] {\r\n const files: SourceFile[] = [];\r\n for (const file of walk(V2_ROOT)) {\r\n files.push({ path: file, content: fs.readFileSync(file, \"utf8\") });\r\n }\r\n return files;\r\n}\r\n\r\nfunction findOffenders(\r\n files: SourceFile[],\r\n predicate: (content: string) => boolean\r\n): string[] {\r\n return files\r\n .filter((f) => predicate(f.content))\r\n .map((f) => path.relative(V2_ROOT, f.path));\r\n}\r\n\r\ndescribe(\"Banned patterns in src/lib/v2/ (regression guard)\", () => {\r\n let files: SourceFile[];\r\n\r\n beforeAll(() => {\r\n files = readAllSourceFiles();\r\n // Sanity check — make sure the walker actually found source.\r\n // A misconfigured path would silently make every test pass with\r\n // an empty input set; this prevents that false-positive.\r\n expect(files.length).toBeGreaterThan(20);\r\n });\r\n\r\n /**\r\n * --fw-black ghost token\r\n * History: Batch 1 removed fontWeight.black from the typography\r\n * tokens; Batch 2 dropped the matching `--fw-black` line from the\r\n * cssVariables emitter. Two regression sites detected later\r\n * (KPICard in Batch 6, FormSection in Batch 7) — both silently\r\n * lost their bold weight at runtime. The CSS variable was\r\n * referenced but resolved to undefined.\r\n *\r\n * ⚠ THE SCAN IS RAW AND COMMENT-BLIND. DO NOT \"FIX\" THAT.\r\n *\r\n * `findOffenders` matches the banned literal anywhere in the file, including\r\n * inside comments. That is deliberate: a guard that parses code can be fooled\r\n * by anything its parser mishandles, whereas a text scan cannot. The cost is\r\n * that DOCUMENTING the banned token — even to record its removal — trips the\r\n * rule.\r\n *\r\n * That is exactly what happened during the procuration-portnet-fe audit: both\r\n * `--fw-black` tests failed, and the \"offenders\" turned out to be explanatory\r\n * comments in `KPICard.tsx` and `theme/cssVariables.ts` describing the very\r\n * fix this rule enforces. The code was correct; both files already used\r\n * `var(--fw-bold)`. The comments were reworded to refer to the token\r\n * descriptively instead.\r\n *\r\n * So: if this fails, read the offending lines BEFORE assuming a regression.\r\n * The correct remedy is to reword the prose, never to add comment-stripping\r\n * here — that would weaken every rule in this file to fix a documentation\r\n * nit.\r\n *\r\n * `__tests__` is excluded from `walk`, which is why this docstring may name\r\n * the token freely.\r\n */\r\n test(\"no `--fw-black` references anywhere in src/lib/v2/\", () => {\r\n const offenders = findOffenders(files, (c) => c.includes(\"--fw-black\"));\r\n expect(offenders).toEqual([]);\r\n });\r\n\r\n test(\"no `var(--fw-black)` consumption (paranoid duplicate of the above)\", () => {\r\n const offenders = findOffenders(files, (c) => c.includes(\"var(--fw-black)\"));\r\n expect(offenders).toEqual([]);\r\n });\r\n\r\n /**\r\n * fontWeight: 650\r\n * History: Banned by Batch 1 typography refactor — 650 is a\r\n * non-standard CSS weight not supported by non-variable fallback\r\n * fonts. Re-introduced twice in Batch 6 (Stepper HStepper +\r\n * FilterTab). Each time it took a careful read to spot, since\r\n * 650 looks \"close enough\" to semibold (600).\r\n */\r\n test(\"no `fontWeight: 650` literal in component sx / inline style\", () => {\r\n // Match `fontWeight: 650` and `fontWeight:650` (with or without space).\r\n // Word boundary on the right so we don't false-match 6500.\r\n const re = /fontWeight\\s*:\\s*650\\b/;\r\n const offenders = findOffenders(files, (c) => re.test(c));\r\n expect(offenders).toEqual([]);\r\n });\r\n\r\n /**\r\n * Plain CSS form `font-weight: 650`\r\n * Same rationale as above but for the kebab-case form used inside\r\n * .css files (base.css and friends).\r\n */\r\n test(\"no `font-weight: 650` in CSS files\", () => {\r\n const re = /font-weight\\s*:\\s*650\\b/;\r\n const offenders = findOffenders(files, (c) => re.test(c));\r\n expect(offenders).toEqual([]);\r\n });\r\n\r\n /**\r\n * Hardcoded breakpoint — raw px-width @media query\r\n * History: Batch 1 (mobile & responsive certification). The\r\n * breakpoint scale is single-sourced in tokens/breakpoints and\r\n * wired into BOTH the MUI theme (theme.breakpoints) and the `mq`\r\n * string helpers. A raw `@media (min-width:600px)` (or any literal\r\n * px width) bypasses that single source and silently re-introduces\r\n * the MUI-default divergence (sm:600 / md:900 / lg:1200) the token\r\n * wiring was added to eliminate.\r\n *\r\n * Token-derived queries are produced via mq.up()/down() as\r\n * interpolated `${...}px` strings — no digit follows `width:`, so\r\n * they never match. Feature queries (prefers-reduced-motion,\r\n * pointer, print) carry no width literal and are unaffected.\r\n */\r\n test(\"no hardcoded px-width @media query (use mq.up/down or theme.breakpoints)\", () => {\r\n const re = /@media[^{]*\\b(?:min|max)-width\\s*:\\s*\\d/;\r\n const offenders = findOffenders(files, (c) => re.test(c));\r\n expect(offenders).toEqual([]);\r\n });\r\n\r\n /**\r\n * Hardcoded breakpoint — useMediaQuery() with a literal px string\r\n * History: Batch 1. `useMediaQuery(\"(max-width: 600px)\")` hardcodes a\r\n * breakpoint outside the token scale. The sanctioned form passes a\r\n * theme callback — `useMediaQuery(theme.breakpoints.down(\"sm\"))` — so\r\n * the query resolves against the wired token values. This rule flags\r\n * only the string-literal form: the theme-callback form has no quote\r\n * immediately after the opening paren and is unaffected.\r\n */\r\n test(\"no useMediaQuery() with a literal px breakpoint string\", () => {\r\n const re = /useMediaQuery\\(\\s*[\"'`][^)]*\\d+\\s*px/;\r\n const offenders = findOffenders(files, (c) => re.test(c));\r\n expect(offenders).toEqual([]);\r\n });\r\n\r\n /**\r\n * Hardcoded px floor in a CSS-grid minmax() track\r\n * History: Batch 2 (KVGrid + components/FormGrid) and Batch 9\r\n * (patterns/FormGrid) — the mobile & responsive certification. An\r\n * auto-fill grid written as `minmax(<N>px, 1fr)` uses the px value as\r\n * a HARD track minimum: when that floor exceeds the available\r\n * container width (a large N, or the grid nested inside a narrow\r\n * column / Drawer at the sm tier) the track cannot shrink and\r\n * overflows its container, producing horizontal scroll on tablet /\r\n * phone viewports (WCAG 1.4.10 Reflow).\r\n *\r\n * The sanctioned forms never match this rule:\r\n * - `minmax(0, 1fr)` → 0 floor, no px\r\n * - `minmax(min(${w}px, 100%), 1fr)` → starts with `min(` (not a\r\n * digit) and the px floor is\r\n * clamped to the container\r\n * Only a LITERAL leading-digit px floor — `minmax(240px, …)` — trips\r\n * the rule, which is exactly the un-clamped, un-tokenised regression\r\n * the responsive audit forbids. Verified green against every\r\n * display:grid site in the v2 surface (KVGrid, components/FormGrid,\r\n * patterns/FormGrid, FormGrid.Item, KeyboardShortcutsHelp).\r\n */\r\n test(\"no hardcoded px floor in a CSS-grid minmax() track (clamp with min(…,100%))\", () => {\r\n const re = /minmax\\(\\s*\\d+(?:\\.\\d+)?\\s*px/i;\r\n const offenders = findOffenders(files, (c) => re.test(c));\r\n expect(offenders).toEqual([]);\r\n });\r\n});\r\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"banned-patterns.test.js","names":["fs","path","V2_ROOT","resolve","__dirname","walk","dir","entry","readdirSync","withFileTypes","p","join","name","isDirectory","isFile","test","endsWith","readAllSourceFiles","files","file","push","content","readFileSync","findOffenders","predicate","filter","f","map","relative","describe","beforeAll","expect","length","toBeGreaterThan","offenders","c","includes","toEqual","re"],"sources":["../../../../src/lib/v2/__tests__/banned-patterns.test.ts"],"sourcesContent":["import * as fs from \"fs\";\r\nimport * as path from \"path\";\r\n\r\n/**\r\n * Static-analysis tests guarding against re-introduction of banned\r\n * patterns in src/lib/v2/. Pure filesystem scan; no React, no jsdom.\r\n *\r\n * Each banned pattern has a unique regression history documented in\r\n * the per-test comment so future readers know WHY the rule exists,\r\n * not just what it forbids.\r\n */\r\n\r\nconst V2_ROOT: string = path.resolve(__dirname, \"..\");\r\n\r\ninterface SourceFile {\r\n path: string;\r\n content: string;\r\n}\r\n\r\n/**\r\n * Recursively walk a directory, yielding paths of source files that\r\n * are eligible for scanning. Excludes nested __tests__ folders so\r\n * test fixtures referencing banned strings as test data don't trigger\r\n * the rule. Scans .js/.jsx/.ts/.tsx/.css (ambient .d.ts excluded — no\r\n * runtime style/breakpoint literals live there).\r\n */\r\nfunction* walk(dir: string): Generator<string> {\r\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\r\n const p = path.join(dir, entry.name);\r\n if (entry.isDirectory()) {\r\n if (entry.name === \"__tests__\" || entry.name === \"node_modules\") continue;\r\n yield* walk(p);\r\n } else if (\r\n entry.isFile() &&\r\n /\\.(?:jsx?|tsx?|css)$/.test(entry.name) &&\r\n !entry.name.endsWith(\".d.ts\")\r\n ) {\r\n yield p;\r\n }\r\n }\r\n}\r\n\r\nfunction readAllSourceFiles(): SourceFile[] {\r\n const files: SourceFile[] = [];\r\n for (const file of walk(V2_ROOT)) {\r\n files.push({ path: file, content: fs.readFileSync(file, \"utf8\") });\r\n }\r\n return files;\r\n}\r\n\r\nfunction findOffenders(\r\n files: SourceFile[],\r\n predicate: (content: string) => boolean\r\n): string[] {\r\n return files\r\n .filter((f) => predicate(f.content))\r\n .map((f) => path.relative(V2_ROOT, f.path));\r\n}\r\n\r\ndescribe(\"Banned patterns in src/lib/v2/ (regression guard)\", () => {\r\n let files: SourceFile[];\r\n\r\n beforeAll(() => {\r\n files = readAllSourceFiles();\r\n // Sanity check — make sure the walker actually found source.\r\n // A misconfigured path would silently make every test pass with\r\n // an empty input set; this prevents that false-positive.\r\n expect(files.length).toBeGreaterThan(20);\r\n });\r\n\r\n /**\r\n * --fw-black ghost token\r\n * History: Batch 1 removed fontWeight.black from the typography\r\n * tokens; Batch 2 dropped the matching `--fw-black` line from the\r\n * cssVariables emitter. Two regression sites detected later\r\n * (KPICard in Batch 6, FormSection in Batch 7) — both silently\r\n * lost their bold weight at runtime. The CSS variable was\r\n * referenced but resolved to undefined.\r\n *\r\n * ⚠ THE SCAN IS RAW AND COMMENT-BLIND. DO NOT \"FIX\" THAT.\r\n *\r\n * `findOffenders` matches the banned literal anywhere in the file, including\r\n * inside comments. That is deliberate: a guard that parses code can be fooled\r\n * by anything its parser mishandles, whereas a text scan cannot. The cost is\r\n * that DOCUMENTING the banned token — even to record its removal — trips the\r\n * rule.\r\n *\r\n * That is exactly what happened during the procuration-portnet-fe audit: both\r\n * `--fw-black` tests failed, and the \"offenders\" turned out to be explanatory\r\n * comments in `KPICard.tsx` and `theme/cssVariables.ts` describing the very\r\n * fix this rule enforces. The code was correct; both files already used\r\n * `var(--fw-bold)`. The comments were reworded to refer to the token\r\n * descriptively instead.\r\n *\r\n * So: if this fails, read the offending lines BEFORE assuming a regression.\r\n * The correct remedy is to reword the prose, never to add comment-stripping\r\n * here — that would weaken every rule in this file to fix a documentation\r\n * nit.\r\n *\r\n * `__tests__` is excluded from `walk`, which is why this docstring may name\r\n * the token freely.\r\n */\r\n test(\"no `--fw-black` references anywhere in src/lib/v2/\", () => {\r\n const offenders = findOffenders(files, (c) => c.includes(\"--fw-black\"));\r\n expect(offenders).toEqual([]);\r\n });\r\n\r\n test(\"no `var(--fw-black)` consumption (paranoid duplicate of the above)\", () => {\r\n const offenders = findOffenders(files, (c) => c.includes(\"var(--fw-black)\"));\r\n expect(offenders).toEqual([]);\r\n });\r\n\r\n /**\r\n * fontWeight: 650\r\n * History: Banned by Batch 1 typography refactor — 650 is a\r\n * non-standard CSS weight not supported by non-variable fallback\r\n * fonts. Re-introduced twice in Batch 6 (Stepper HStepper +\r\n * FilterTab). Each time it took a careful read to spot, since\r\n * 650 looks \"close enough\" to semibold (600).\r\n */\r\n test(\"no `fontWeight: 650` literal in component sx / inline style\", () => {\r\n // Match `fontWeight: 650` and `fontWeight:650` (with or without space).\r\n // Word boundary on the right so we don't false-match 6500.\r\n const re = /fontWeight\\s*:\\s*650\\b/;\r\n const offenders = findOffenders(files, (c) => re.test(c));\r\n expect(offenders).toEqual([]);\r\n });\r\n\r\n /**\r\n * Plain CSS form `font-weight: 650`\r\n * Same rationale as above but for the kebab-case form used inside\r\n * .css files (base.css and friends).\r\n */\r\n test(\"no `font-weight: 650` in CSS files\", () => {\r\n const re = /font-weight\\s*:\\s*650\\b/;\r\n const offenders = findOffenders(files, (c) => re.test(c));\r\n expect(offenders).toEqual([]);\r\n });\r\n\r\n /**\r\n * Hardcoded breakpoint — raw px-width @media query\r\n * History: Batch 1 (mobile & responsive certification). The\r\n * breakpoint scale is single-sourced in tokens/breakpoints and\r\n * wired into BOTH the MUI theme (theme.breakpoints) and the `mq`\r\n * string helpers. A raw `@media (min-width:600px)` (or any literal\r\n * px width) bypasses that single source and silently re-introduces\r\n * the MUI-default divergence (sm:600 / md:900 / lg:1200) the token\r\n * wiring was added to eliminate.\r\n *\r\n * Token-derived queries are produced via mq.up()/down() as\r\n * interpolated `${...}px` strings — no digit follows `width:`, so\r\n * they never match. Feature queries (prefers-reduced-motion,\r\n * pointer, print) carry no width literal and are unaffected.\r\n */\r\n test(\"no hardcoded px-width @media query (use mq.up/down or theme.breakpoints)\", () => {\r\n const re = /@media[^{]*\\b(?:min|max)-width\\s*:\\s*\\d/;\r\n const offenders = findOffenders(files, (c) => re.test(c));\r\n expect(offenders).toEqual([]);\r\n });\r\n\r\n /**\r\n * Hardcoded breakpoint — useMediaQuery() with a literal px string\r\n * History: Batch 1. `useMediaQuery(\"(max-width: 600px)\")` hardcodes a\r\n * breakpoint outside the token scale. The sanctioned form passes a\r\n * theme callback — `useMediaQuery(theme.breakpoints.down(\"sm\"))` — so\r\n * the query resolves against the wired token values. This rule flags\r\n * only the string-literal form: the theme-callback form has no quote\r\n * immediately after the opening paren and is unaffected.\r\n */\r\n test(\"no useMediaQuery() with a literal px breakpoint string\", () => {\r\n const re = /useMediaQuery\\(\\s*[\"'`][^)]*\\d+\\s*px/;\r\n const offenders = findOffenders(files, (c) => re.test(c));\r\n expect(offenders).toEqual([]);\r\n });\r\n\r\n /**\r\n * Hardcoded px floor in a CSS-grid minmax() track\r\n * History: Batch 2 (KVGrid + components/FormGrid) and Batch 9\r\n * (patterns/FormGrid) — the mobile & responsive certification. An\r\n * auto-fill grid written as `minmax(<N>px, 1fr)` uses the px value as\r\n * a HARD track minimum: when that floor exceeds the available\r\n * container width (a large N, or the grid nested inside a narrow\r\n * column / Drawer at the sm tier) the track cannot shrink and\r\n * overflows its container, producing horizontal scroll on tablet /\r\n * phone viewports (WCAG 1.4.10 Reflow).\r\n *\r\n * The sanctioned forms never match this rule:\r\n * - `minmax(0, 1fr)` → 0 floor, no px\r\n * - `minmax(min(${w}px, 100%), 1fr)` → starts with `min(` (not a\r\n * digit) and the px floor is\r\n * clamped to the container\r\n * Only a LITERAL leading-digit px floor — `minmax(240px, …)` — trips\r\n * the rule, which is exactly the un-clamped, un-tokenised regression\r\n * the responsive audit forbids. Verified green against every\r\n * display:grid site in the v2 surface (KVGrid, components/FormGrid,\r\n * patterns/FormGrid, FormGrid.Item, KeyboardShortcutsHelp).\r\n */\r\n test(\"no hardcoded px floor in a CSS-grid minmax() track (clamp with min(…,100%))\", () => {\r\n const re = /minmax\\(\\s*\\d+(?:\\.\\d+)?\\s*px/i;\r\n const offenders = findOffenders(files, (c) => re.test(c));\r\n expect(offenders).toEqual([]);\r\n });\r\n});\r\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { contrastRatio, passesContrast } from "../utils/contrast";
|
|
2
|
+
import { chartCategorical, chartCategoricalOn, chartColor, chartColorOn, CHART_CATEGORICAL_CORE } from "../tokens/chart";
|
|
3
|
+
import { surface, dark, status } from "../tokens";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Categorical chart palette certification (gap G-37).
|
|
7
|
+
*
|
|
8
|
+
* WHY THIS FILE EXISTS
|
|
9
|
+
* --------------------
|
|
10
|
+
* `tokens/chart.ts` makes three claims that a consumer cannot check and that a
|
|
11
|
+
* comment cannot keep true:
|
|
12
|
+
*
|
|
13
|
+
* 1. every fill clears the 3:1 non-text floor (WCAG 1.4.11 / R-C.3) on the
|
|
14
|
+
* LIGHT surface;
|
|
15
|
+
* 2. and on the DARK surface — which is what allows ONE array to serve both
|
|
16
|
+
* themes, where `status` needs a `dark.status` override;
|
|
17
|
+
* 3. the entries stay distinguishable from each other, INCLUDING under
|
|
18
|
+
* colour-vision deficiency.
|
|
19
|
+
*
|
|
20
|
+
* The third is the one that matters most and is the least obvious. A pie chart
|
|
21
|
+
* encodes its data in hue alone: two slices that collapse to the same colour
|
|
22
|
+
* under deuteranopia do not merely look similar, they merge, and the reader
|
|
23
|
+
* loses the datum. Roughly 8% of men have a red-green deficiency, so a palette
|
|
24
|
+
* verified only under normal vision is verified for the easy case.
|
|
25
|
+
*
|
|
26
|
+
* Same discipline as contrast-palette.test.ts: ratios are COMPUTED here, never
|
|
27
|
+
* copied from a comment. The palette this replaced — 32 hex literals across two
|
|
28
|
+
* files in `refonte-frontend` — had none of the three properties verified, and
|
|
29
|
+
* two of its entries (#0088FE / #2196f3) were a ~9 ΔE pair that merged under
|
|
30
|
+
* both simulated dichromacies.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
const WHITE = surface.surface;
|
|
34
|
+
const DARK_SURFACE = dark.surface;
|
|
35
|
+
|
|
36
|
+
/** Minimum separation demanded of any pair, in CIE76 ΔE units. */
|
|
37
|
+
const MIN_DELTA_E = 12;
|
|
38
|
+
function parseHex(hex) {
|
|
39
|
+
const h = hex.replace("#", "");
|
|
40
|
+
return [parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4, 6), 16)];
|
|
41
|
+
}
|
|
42
|
+
function toLinear(channel) {
|
|
43
|
+
const c = channel / 255;
|
|
44
|
+
return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/* ── CIE L*a*b* + CIE76 ─────────────────────────────────────────────────────
|
|
48
|
+
* CIE76 rather than CIEDE2000: it is a weaker metric, so a threshold that
|
|
49
|
+
* passes under CIE76 is the more conservative claim, and it is short enough to
|
|
50
|
+
* read in one sitting. */
|
|
51
|
+
function toLab(rgb) {
|
|
52
|
+
const [r, g, b] = [toLinear(rgb[0]), toLinear(rgb[1]), toLinear(rgb[2])];
|
|
53
|
+
const x = (0.4124 * r + 0.3576 * g + 0.1805 * b) / 0.95047;
|
|
54
|
+
const y = 0.2126 * r + 0.7152 * g + 0.0722 * b;
|
|
55
|
+
const z = (0.0193 * r + 0.1192 * g + 0.9505 * b) / 1.08883;
|
|
56
|
+
const f = t => t > 216 / 24389 ? Math.cbrt(t) : 841 / 108 * t + 4 / 29;
|
|
57
|
+
const [fx, fy, fz] = [f(x), f(y), f(z)];
|
|
58
|
+
return [116 * fy - 16, 500 * (fx - fy), 200 * (fy - fz)];
|
|
59
|
+
}
|
|
60
|
+
function deltaE(a, b) {
|
|
61
|
+
const la = toLab(a);
|
|
62
|
+
const lb = toLab(b);
|
|
63
|
+
return Math.hypot(la[0] - lb[0], la[1] - lb[1], la[2] - lb[2]);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/* ── Dichromacy simulation (Viénot, Brettel & Mollon 1999) ──────────────────
|
|
67
|
+
* Linear RGB → LMS, collapse the missing cone response, back to sRGB. */
|
|
68
|
+
|
|
69
|
+
const RGB_TO_LMS = [[17.8824, 43.5161, 4.11935], [3.45565, 27.1554, 3.86714], [0.0299566, 0.184309, 1.46709]];
|
|
70
|
+
const LMS_TO_RGB = [[0.080944, -0.130504, 0.116721], [-0.0102485, 0.0540194, -0.113615], [-0.000365294, -0.00412163, 0.693513]];
|
|
71
|
+
|
|
72
|
+
/** Green-cone deficiency. */
|
|
73
|
+
const DEUTERANOPIA = [[1, 0, 0], [0.494207, 0, 1.24827], [0, 0, 1]];
|
|
74
|
+
|
|
75
|
+
/** Red-cone deficiency. */
|
|
76
|
+
const PROTANOPIA = [[0, 2.02344, -2.52581], [0, 1, 0], [0, 0, 1]];
|
|
77
|
+
function apply(m, v) {
|
|
78
|
+
return [m[0][0] * v[0] + m[0][1] * v[1] + m[0][2] * v[2], m[1][0] * v[0] + m[1][1] * v[1] + m[1][2] * v[2], m[2][0] * v[0] + m[2][1] * v[1] + m[2][2] * v[2]];
|
|
79
|
+
}
|
|
80
|
+
function simulate(rgb, deficiency) {
|
|
81
|
+
const linear = [toLinear(rgb[0]), toLinear(rgb[1]), toLinear(rgb[2])];
|
|
82
|
+
const seen = apply(LMS_TO_RGB, apply(deficiency, apply(RGB_TO_LMS, linear)));
|
|
83
|
+
const encode = c => {
|
|
84
|
+
const clamped = Math.min(1, Math.max(0, c));
|
|
85
|
+
const srgb = clamped <= 0.0031308 ? 12.92 * clamped : 1.055 * Math.pow(clamped, 1 / 2.4) - 0.055;
|
|
86
|
+
return Math.round(Math.min(1, Math.max(0, srgb)) * 255);
|
|
87
|
+
};
|
|
88
|
+
return [encode(seen[0]), encode(seen[1]), encode(seen[2])];
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** Worst-case separation: normal vision, deuteranopia, protanopia. */
|
|
92
|
+
function worstCaseSeparation(a, b) {
|
|
93
|
+
const ra = parseHex(a);
|
|
94
|
+
const rb = parseHex(b);
|
|
95
|
+
return Math.min(deltaE(ra, rb), deltaE(simulate(ra, DEUTERANOPIA), simulate(rb, DEUTERANOPIA)), deltaE(simulate(ra, PROTANOPIA), simulate(rb, PROTANOPIA)));
|
|
96
|
+
}
|
|
97
|
+
describe("Categorical chart palette (tokens/chart)", () => {
|
|
98
|
+
test("shape is pinned — 12 entries, 8 of them the hue-balanced core", () => {
|
|
99
|
+
expect(chartCategorical).toHaveLength(12);
|
|
100
|
+
expect(CHART_CATEGORICAL_CORE).toBe(8);
|
|
101
|
+
expect(chartCategorical.every(c => /^#[0-9A-F]{6}$/.test(c))).toBe(true);
|
|
102
|
+
});
|
|
103
|
+
describe("non-text contrast ≥ 3:1 (WCAG 1.4.11 / R-C.3)", () => {
|
|
104
|
+
chartCategorical.forEach((colour, index) => {
|
|
105
|
+
test(`--chart-${index + 1} (${colour}) on the light surface`, () => {
|
|
106
|
+
expect(passesContrast(contrastRatio(colour, WHITE), "ui")).toBe(true);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* The dark-surface half is what earns this palette a single array. If a
|
|
111
|
+
* future hue is nudged out of the luminance window, THIS is the test that
|
|
112
|
+
* fails, and the remedy is to re-solve the lightness — not to add a
|
|
113
|
+
* `dark.chart` override, which would double the surface to maintain.
|
|
114
|
+
*/
|
|
115
|
+
test(`--chart-${index + 1} (${colour}) on the dark surface`, () => {
|
|
116
|
+
expect(passesContrast(contrastRatio(colour, DARK_SURFACE), "ui")).toBe(true);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
describe("mutual distinguishability, normal vision and dichromacy", () => {
|
|
121
|
+
test(`every pair is ≥ ${MIN_DELTA_E} ΔE in the worst of three vision models`, () => {
|
|
122
|
+
const tooClose = [];
|
|
123
|
+
for (let i = 0; i < chartCategorical.length; i += 1) {
|
|
124
|
+
for (let j = i + 1; j < chartCategorical.length; j += 1) {
|
|
125
|
+
const a = chartCategorical[i];
|
|
126
|
+
const b = chartCategorical[j];
|
|
127
|
+
const separation = worstCaseSeparation(a, b);
|
|
128
|
+
if (separation < MIN_DELTA_E) {
|
|
129
|
+
tooClose.push(`${a} (${i + 1}) vs ${b} (${j + 1}) — ${separation.toFixed(1)} ΔE`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
expect(tooClose).toEqual([]);
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* The tightest pair, asserted at its MEASURED value rather than at the
|
|
138
|
+
* threshold — the convention this repository already uses in
|
|
139
|
+
* contrast-palette.test.ts, so that drift shows up as a diff instead of as
|
|
140
|
+
* a pass that quietly got worse.
|
|
141
|
+
*/
|
|
142
|
+
test("the closest pair is red vs olive, at ~12.4 ΔE", () => {
|
|
143
|
+
const separation = worstCaseSeparation("#C92E1D", "#3B7911");
|
|
144
|
+
expect(separation).toBeGreaterThan(12);
|
|
145
|
+
expect(separation).toBeLessThan(13);
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
describe("chartColorOn() — text drawn ON a slice is AA (WCAG 1.4.3)", () => {
|
|
149
|
+
chartCategorical.forEach((fill, index) => {
|
|
150
|
+
test(`label on --chart-${index + 1} (${fill})`, () => {
|
|
151
|
+
expect(passesContrast(contrastRatio(chartColorOn(index), fill), "normal")).toBe(true);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
test("the label array is index-aligned with the palette", () => {
|
|
155
|
+
expect(chartCategoricalOn).toHaveLength(chartCategorical.length);
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* The regression this closes: `refonte-frontend` printed `fill="white"` on
|
|
160
|
+
* every pie label. Asserted here so the two-tier palette can never be
|
|
161
|
+
* paired with a single label colour again — white FAILS on the light tier.
|
|
162
|
+
*/
|
|
163
|
+
test("a single white label colour would NOT satisfy AA on every entry", () => {
|
|
164
|
+
const failures = chartCategorical.filter(fill => !passesContrast(contrastRatio("#FFFFFF", fill), "normal"));
|
|
165
|
+
expect(failures.length).toBeGreaterThan(0);
|
|
166
|
+
});
|
|
167
|
+
test("bad input resolves to the first label colour", () => {
|
|
168
|
+
expect(chartColorOn(-1)).toBe(chartCategoricalOn[0]);
|
|
169
|
+
expect(chartColorOn(Number.NaN)).toBe(chartCategoricalOn[0]);
|
|
170
|
+
expect(chartColorOn(12)).toBe(chartCategoricalOn[0]);
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
describe("chartColor()", () => {
|
|
174
|
+
test("returns the palette in order", () => {
|
|
175
|
+
chartCategorical.forEach((colour, index) => {
|
|
176
|
+
expect(chartColor(index)).toBe(colour);
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
test("cycles past the end", () => {
|
|
180
|
+
expect(chartColor(12)).toBe(chartCategorical[0]);
|
|
181
|
+
expect(chartColor(13)).toBe(chartCategorical[1]);
|
|
182
|
+
});
|
|
183
|
+
test("bad input resolves to the first entry instead of throwing", () => {
|
|
184
|
+
expect(chartColor(-1)).toBe(chartCategorical[0]);
|
|
185
|
+
expect(chartColor(Number.NaN)).toBe(chartCategorical[0]);
|
|
186
|
+
});
|
|
187
|
+
test("fractional indices floor rather than producing undefined", () => {
|
|
188
|
+
expect(chartColor(2.7)).toBe(chartCategorical[2]);
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* A categorical palette must not be mistaken for the workflow palette. These
|
|
194
|
+
* are different vocabularies (R-2.2 reserves `status` for canonical workflow
|
|
195
|
+
* states), and a value shared between them would invite exactly the confusion
|
|
196
|
+
* the split exists to prevent.
|
|
197
|
+
*/
|
|
198
|
+
test("no entry duplicates a workflow status colour", () => {
|
|
199
|
+
const statusColours = new Set(Object.values(status).flatMap(s => [s.soft.toUpperCase(), s.fg.toUpperCase()]));
|
|
200
|
+
const overlap = chartCategorical.filter(c => statusColours.has(c.toUpperCase()));
|
|
201
|
+
expect(overlap).toEqual([]);
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
//# sourceMappingURL=chart-palette.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-palette.test.js","names":["contrastRatio","passesContrast","chartCategorical","chartCategoricalOn","chartColor","chartColorOn","CHART_CATEGORICAL_CORE","surface","dark","status","WHITE","DARK_SURFACE","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","toHaveLength","toBe","every","forEach","colour","index","tooClose","i","length","j","separation","push","toFixed","toEqual","toBeGreaterThan","toBeLessThan","fill","failures","filter","Number","NaN","statusColours","Set","Object","values","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":[]}
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
2
|
-
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."); }
|
|
3
|
-
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); }
|
|
4
|
-
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; }
|
|
5
|
-
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; } }
|
|
6
|
-
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
7
1
|
import { contrastRatio, passesContrast, WCAG_AA_NORMAL, WCAG_AA_UI_NON_TEXT } from "../utils/contrast";
|
|
8
2
|
import { ink, surface, border, semantic, status, brand, brandSecondary, dark } from "../tokens";
|
|
9
3
|
|
|
@@ -27,43 +21,30 @@ import { ink, surface, border, semantic, status, brand, brandSecondary, dark } f
|
|
|
27
21
|
*/
|
|
28
22
|
|
|
29
23
|
/** Every light-mode surface that body text can land on. */
|
|
30
|
-
|
|
31
|
-
describe("Token palette — WCAG AA contrast (R-C.1 / R-C.2 / R-C.3)",
|
|
32
|
-
describe("ink on light surfaces — normal text ≥ 4.5:1",
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
name = _LIGHT_SURFACES$_i[0],
|
|
36
|
-
bg = _LIGHT_SURFACES$_i[1];
|
|
37
|
-
test("fg on ".concat(name), function () {
|
|
24
|
+
const LIGHT_SURFACES = [["surface", surface.surface], ["bgElev", surface.bgElev], ["bg", surface.bg], ["bgSubtle", surface.bgSubtle]];
|
|
25
|
+
describe("Token palette — WCAG AA contrast (R-C.1 / R-C.2 / R-C.3)", () => {
|
|
26
|
+
describe("ink on light surfaces — normal text ≥ 4.5:1", () => {
|
|
27
|
+
for (const [name, bg] of LIGHT_SURFACES) {
|
|
28
|
+
test(`fg on ${name}`, () => {
|
|
38
29
|
expect(passesContrast(contrastRatio(ink.fg, bg), "normal")).toBe(true);
|
|
39
30
|
});
|
|
40
|
-
test(
|
|
31
|
+
test(`fgMuted on ${name}`, () => {
|
|
41
32
|
expect(passesContrast(contrastRatio(ink.fgMuted, bg), "normal")).toBe(true);
|
|
42
33
|
});
|
|
43
|
-
};
|
|
44
|
-
for (var _i = 0, _LIGHT_SURFACES = LIGHT_SURFACES; _i < _LIGHT_SURFACES.length; _i++) {
|
|
45
|
-
_loop();
|
|
46
34
|
}
|
|
47
|
-
test("fgInverse on the darkest dark surface",
|
|
35
|
+
test("fgInverse on the darkest dark surface", () => {
|
|
48
36
|
expect(passesContrast(contrastRatio(ink.fgInverse, dark.bg), "normal")).toBe(true);
|
|
49
37
|
});
|
|
50
38
|
});
|
|
51
|
-
describe("semantic fg — readable on white AND on its own soft fill",
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
name = _pairs$_i[0],
|
|
56
|
-
fg = _pairs$_i[1],
|
|
57
|
-
soft = _pairs$_i[2];
|
|
58
|
-
test("".concat(name, "Fg on white"), function () {
|
|
39
|
+
describe("semantic fg — readable on white AND on its own soft fill", () => {
|
|
40
|
+
const pairs = [["success", semantic.successFg, semantic.successSoft], ["warning", semantic.warningFg, semantic.warningSoft], ["danger", semantic.dangerFg, semantic.dangerSoft], ["info", semantic.infoFg, semantic.infoSoft]];
|
|
41
|
+
for (const [name, fg, soft] of pairs) {
|
|
42
|
+
test(`${name}Fg on white`, () => {
|
|
59
43
|
expect(passesContrast(contrastRatio(fg, "#FFFFFF"), "normal")).toBe(true);
|
|
60
44
|
});
|
|
61
|
-
test(
|
|
45
|
+
test(`${name}Fg on ${name}Soft`, () => {
|
|
62
46
|
expect(passesContrast(contrastRatio(fg, soft), "normal")).toBe(true);
|
|
63
47
|
});
|
|
64
|
-
};
|
|
65
|
-
for (var _i2 = 0, _pairs = pairs; _i2 < _pairs.length; _i2++) {
|
|
66
|
-
_loop2();
|
|
67
48
|
}
|
|
68
49
|
});
|
|
69
50
|
|
|
@@ -71,63 +52,50 @@ describe("Token palette — WCAG AA contrast (R-C.1 / R-C.2 / R-C.3)", function
|
|
|
71
52
|
* The Charter's promise in §02.1: "Combinaison background -soft +
|
|
72
53
|
* foreground -fg = AA garanti." This is that promise, enforced.
|
|
73
54
|
*/
|
|
74
|
-
describe("status palette — every -fg on its own -soft is AA (§02.1)",
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
55
|
+
describe("status palette — every -fg on its own -soft is AA (§02.1)", () => {
|
|
56
|
+
for (const key of Object.keys(status)) {
|
|
57
|
+
test(`status.${key}`, () => {
|
|
58
|
+
const {
|
|
59
|
+
soft,
|
|
60
|
+
fg
|
|
61
|
+
} = status[key];
|
|
81
62
|
expect(passesContrast(contrastRatio(fg, soft), "normal")).toBe(true);
|
|
82
63
|
});
|
|
83
|
-
test(
|
|
64
|
+
test(`status.${key} fg on white`, () => {
|
|
84
65
|
expect(passesContrast(contrastRatio(status[key].fg, "#FFFFFF"), "normal")).toBe(true);
|
|
85
66
|
});
|
|
86
|
-
};
|
|
87
|
-
for (var _i3 = 0, _arr2 = Object.keys(status); _i3 < _arr2.length; _i3++) {
|
|
88
|
-
_loop3();
|
|
89
67
|
}
|
|
90
68
|
});
|
|
91
|
-
describe("non-text UI ≥ 3:1 (WCAG 1.4.11 / R-C.3)",
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
name = _saturated$_i[0],
|
|
96
|
-
colour = _saturated$_i[1];
|
|
97
|
-
test("".concat(name, " (icon / border grade) on white"), function () {
|
|
69
|
+
describe("non-text UI ≥ 3:1 (WCAG 1.4.11 / R-C.3)", () => {
|
|
70
|
+
const saturated = [["success", semantic.success], ["warning", semantic.warning], ["danger", semantic.danger], ["info", semantic.info]];
|
|
71
|
+
for (const [name, colour] of saturated) {
|
|
72
|
+
test(`${name} (icon / border grade) on white`, () => {
|
|
98
73
|
expect(passesContrast(contrastRatio(colour, "#FFFFFF"), "ui")).toBe(true);
|
|
99
74
|
});
|
|
100
|
-
};
|
|
101
|
-
for (var _i4 = 0, _saturated = saturated; _i4 < _saturated.length; _i4++) {
|
|
102
|
-
_loop4();
|
|
103
75
|
}
|
|
104
76
|
});
|
|
105
|
-
describe("brand",
|
|
106
|
-
test("accent on white is AA for normal text",
|
|
77
|
+
describe("brand", () => {
|
|
78
|
+
test("accent on white is AA for normal text", () => {
|
|
107
79
|
expect(passesContrast(contrastRatio(brand.accent, "#FFFFFF"), "normal")).toBe(true);
|
|
108
80
|
});
|
|
109
|
-
test("accentFg on accent — the primary-button pair",
|
|
81
|
+
test("accentFg on accent — the primary-button pair", () => {
|
|
110
82
|
expect(passesContrast(contrastRatio(brand.accentFg, brand.accent), "normal")).toBe(true);
|
|
111
83
|
});
|
|
112
|
-
test("accentHover keeps AA against accentFg (pressed state stays readable)",
|
|
84
|
+
test("accentHover keeps AA against accentFg (pressed state stays readable)", () => {
|
|
113
85
|
expect(passesContrast(contrastRatio(brand.accentFg, brand.accentHover), "normal")).toBe(true);
|
|
114
86
|
});
|
|
115
87
|
});
|
|
116
|
-
describe("dark mode",
|
|
117
|
-
test("dark.fg on dark.surface",
|
|
88
|
+
describe("dark mode", () => {
|
|
89
|
+
test("dark.fg on dark.surface", () => {
|
|
118
90
|
expect(passesContrast(contrastRatio(dark.fg, dark.surface), "normal")).toBe(true);
|
|
119
91
|
});
|
|
120
|
-
test("dark.fgMuted on dark.surface",
|
|
92
|
+
test("dark.fgMuted on dark.surface", () => {
|
|
121
93
|
expect(passesContrast(contrastRatio(dark.fgMuted, dark.surface), "normal")).toBe(true);
|
|
122
94
|
});
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
test("dark status.".concat(key, ".fg on dark.surface"), function () {
|
|
95
|
+
for (const key of Object.keys(dark.status)) {
|
|
96
|
+
test(`dark status.${key}.fg on dark.surface`, () => {
|
|
126
97
|
expect(passesContrast(contrastRatio(dark.status[key].fg, dark.surface), "normal")).toBe(true);
|
|
127
98
|
});
|
|
128
|
-
};
|
|
129
|
-
for (var _i5 = 0, _arr3 = Object.keys(dark.status); _i5 < _arr3.length; _i5++) {
|
|
130
|
-
_loop5();
|
|
131
99
|
}
|
|
132
100
|
});
|
|
133
101
|
|
|
@@ -137,7 +105,7 @@ describe("Token palette — WCAG AA contrast (R-C.1 / R-C.2 / R-C.3)", function
|
|
|
137
105
|
* any drift shows up as a diff. Both need a palette decision, not a
|
|
138
106
|
* test change.
|
|
139
107
|
* ══════════════════════════════════════════════════════════════════ */
|
|
140
|
-
describe("KNOWN AA FAILURES (documented, pending decision)",
|
|
108
|
+
describe("KNOWN AA FAILURES (documented, pending decision)", () => {
|
|
141
109
|
/**
|
|
142
110
|
* A9-01 — `fgSubtle` on `bgSubtle` ≈ 4.32:1, below the 4.5 floor.
|
|
143
111
|
*
|
|
@@ -157,8 +125,8 @@ describe("Token palette — WCAG AA contrast (R-C.1 / R-C.2 / R-C.3)", function
|
|
|
157
125
|
* fleet-wide), or switch those labels to `--fg-muted` (AAA, 7.5:1 on
|
|
158
126
|
* bgSubtle) which is what every other label surface already uses.
|
|
159
127
|
*/
|
|
160
|
-
test("fgSubtle on bgSubtle is BELOW AA — ~4.32:1",
|
|
161
|
-
|
|
128
|
+
test("fgSubtle on bgSubtle is BELOW AA — ~4.32:1", () => {
|
|
129
|
+
const ratio = contrastRatio(ink.fgSubtle, surface.bgSubtle);
|
|
162
130
|
expect(ratio).not.toBeNull();
|
|
163
131
|
expect(ratio).toBeLessThan(WCAG_AA_NORMAL);
|
|
164
132
|
expect(ratio).toBeGreaterThan(4.2);
|
|
@@ -184,8 +152,8 @@ describe("Token palette — WCAG AA contrast (R-C.1 / R-C.2 / R-C.3)", function
|
|
|
184
152
|
* #868FA3 / #8A92A5; change the token and this assertion flips to the
|
|
185
153
|
* `passesContrast(..., "ui")` form.
|
|
186
154
|
*/
|
|
187
|
-
test("borderStrong on white is BELOW 3:1 — ~2.87:1 (comment in colors.ts is wrong)",
|
|
188
|
-
|
|
155
|
+
test("borderStrong on white is BELOW 3:1 — ~2.87:1 (comment in colors.ts is wrong)", () => {
|
|
156
|
+
const ratio = contrastRatio(border.borderStrong, "#FFFFFF");
|
|
189
157
|
expect(ratio).not.toBeNull();
|
|
190
158
|
expect(ratio).toBeLessThan(WCAG_AA_UI_NON_TEXT);
|
|
191
159
|
expect(ratio).toBeGreaterThan(2.8);
|
|
@@ -200,8 +168,8 @@ describe("Token palette — WCAG AA contrast (R-C.1 / R-C.2 / R-C.3)", function
|
|
|
200
168
|
* consuming modules (neither sets `[data-theme="dark"]` on <html>), which
|
|
201
169
|
* is why nobody has seen it — see the RGESN R-9.5 note in the handover.
|
|
202
170
|
*/
|
|
203
|
-
test("dark.borderStrong on dark.surface is BELOW 3:1 — ~2.28:1",
|
|
204
|
-
|
|
171
|
+
test("dark.borderStrong on dark.surface is BELOW 3:1 — ~2.28:1", () => {
|
|
172
|
+
const ratio = contrastRatio(dark.borderStrong, dark.surface);
|
|
205
173
|
expect(ratio).not.toBeNull();
|
|
206
174
|
expect(ratio).toBeLessThan(WCAG_AA_UI_NON_TEXT);
|
|
207
175
|
expect(ratio).toBeGreaterThan(2.2);
|
|
@@ -214,8 +182,8 @@ describe("Token palette — WCAG AA contrast (R-C.1 / R-C.2 / R-C.3)", function
|
|
|
214
182
|
* restriction is machine-checked rather than comment-only: it fails BOTH
|
|
215
183
|
* the text floor and the 3:1 non-text floor.
|
|
216
184
|
*/
|
|
217
|
-
test("brandSecondary text pair is BELOW AA and below 3:1 — fills only",
|
|
218
|
-
|
|
185
|
+
test("brandSecondary text pair is BELOW AA and below 3:1 — fills only", () => {
|
|
186
|
+
const ratio = contrastRatio(brandSecondary.secondaryFg, brandSecondary.secondary);
|
|
219
187
|
expect(ratio).not.toBeNull();
|
|
220
188
|
expect(ratio).toBeLessThan(WCAG_AA_UI_NON_TEXT);
|
|
221
189
|
});
|