@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.
Files changed (980) hide show
  1. package/CHANGELOG.md +652 -0
  2. package/dist/esm/index.js +72 -3
  3. package/dist/esm/index.js.map +1 -1
  4. package/dist/esm/v2/__tests__/AppMain.test.js +130 -0
  5. package/dist/esm/v2/__tests__/AppMain.test.js.map +1 -0
  6. package/dist/esm/v2/__tests__/ChartFigure.test.js +180 -0
  7. package/dist/esm/v2/__tests__/ChartFigure.test.js.map +1 -0
  8. package/dist/esm/v2/__tests__/DataGridRowActionsPropagation.test.js +150 -0
  9. package/dist/esm/v2/__tests__/DataGridRowActionsPropagation.test.js.map +1 -0
  10. package/dist/esm/v2/__tests__/DrawerTactileTargets.test.js +93 -0
  11. package/dist/esm/v2/__tests__/DrawerTactileTargets.test.js.map +1 -0
  12. package/dist/esm/v2/__tests__/FieldError.test.js +71 -38
  13. package/dist/esm/v2/__tests__/FieldError.test.js.map +1 -1
  14. package/dist/esm/v2/__tests__/FieldNaming.test.js +160 -0
  15. package/dist/esm/v2/__tests__/FieldNaming.test.js.map +1 -0
  16. package/dist/esm/v2/__tests__/FieldWidth.test.js +11 -11
  17. package/dist/esm/v2/__tests__/FieldWidth.test.js.map +1 -1
  18. package/dist/esm/v2/__tests__/FileCard.test.js +18 -17
  19. package/dist/esm/v2/__tests__/FileCard.test.js.map +1 -1
  20. package/dist/esm/v2/__tests__/FormikCheckbox.test.js +87 -179
  21. package/dist/esm/v2/__tests__/FormikCheckbox.test.js.map +1 -1
  22. package/dist/esm/v2/__tests__/FormikDateTimePicker.test.js +32 -44
  23. package/dist/esm/v2/__tests__/FormikDateTimePicker.test.js.map +1 -1
  24. package/dist/esm/v2/__tests__/FormikDisplayWidth.test.js +101 -0
  25. package/dist/esm/v2/__tests__/FormikDisplayWidth.test.js.map +1 -0
  26. package/dist/esm/v2/__tests__/FormikRadioGroup.test.js +118 -199
  27. package/dist/esm/v2/__tests__/FormikRadioGroup.test.js.map +1 -1
  28. package/dist/esm/v2/__tests__/MobileRowCard.test.js +44 -42
  29. package/dist/esm/v2/__tests__/MobileRowCard.test.js.map +1 -1
  30. package/dist/esm/v2/__tests__/PreviewDrawer.test.js +165 -0
  31. package/dist/esm/v2/__tests__/PreviewDrawer.test.js.map +1 -0
  32. package/dist/esm/v2/__tests__/ReferentielFieldContainer.test.js +156 -0
  33. package/dist/esm/v2/__tests__/ReferentielFieldContainer.test.js.map +1 -0
  34. package/dist/esm/v2/__tests__/SectionErrorBoundary.test.js +37 -52
  35. package/dist/esm/v2/__tests__/SectionErrorBoundary.test.js.map +1 -1
  36. package/dist/esm/v2/__tests__/apiError.test.js +50 -69
  37. package/dist/esm/v2/__tests__/apiError.test.js.map +1 -1
  38. package/dist/esm/v2/__tests__/banned-patterns.test.js +41 -122
  39. package/dist/esm/v2/__tests__/banned-patterns.test.js.map +1 -1
  40. package/dist/esm/v2/__tests__/chart-palette.test.js +204 -0
  41. package/dist/esm/v2/__tests__/chart-palette.test.js.map +1 -0
  42. package/dist/esm/v2/__tests__/contrast-palette.test.js +42 -74
  43. package/dist/esm/v2/__tests__/contrast-palette.test.js.map +1 -1
  44. package/dist/esm/v2/__tests__/cssVariables.test.js +44 -51
  45. package/dist/esm/v2/__tests__/cssVariables.test.js.map +1 -1
  46. package/dist/esm/v2/__tests__/fileValidation.test.js +134 -0
  47. package/dist/esm/v2/__tests__/fileValidation.test.js.map +1 -0
  48. package/dist/esm/v2/__tests__/filterCriteria.test.js +321 -0
  49. package/dist/esm/v2/__tests__/filterCriteria.test.js.map +1 -0
  50. package/dist/esm/v2/__tests__/fmtDate.test.js +68 -0
  51. package/dist/esm/v2/__tests__/fmtDate.test.js.map +1 -0
  52. package/dist/esm/v2/__tests__/gap-leakage-refonte.test.js +218 -0
  53. package/dist/esm/v2/__tests__/gap-leakage-refonte.test.js.map +1 -0
  54. package/dist/esm/v2/__tests__/labels-merge.test.js +17 -21
  55. package/dist/esm/v2/__tests__/labels-merge.test.js.map +1 -1
  56. package/dist/esm/v2/__tests__/locale-fallback.test.js +35 -40
  57. package/dist/esm/v2/__tests__/locale-fallback.test.js.map +1 -1
  58. package/dist/esm/v2/__tests__/reviveSavedCriteria.test.js +143 -0
  59. package/dist/esm/v2/__tests__/reviveSavedCriteria.test.js.map +1 -0
  60. package/dist/esm/v2/__tests__/rowActions.test.js +182 -0
  61. package/dist/esm/v2/__tests__/rowActions.test.js.map +1 -0
  62. package/dist/esm/v2/__tests__/useFocusOnRouteChange.test.js +155 -0
  63. package/dist/esm/v2/__tests__/useFocusOnRouteChange.test.js.map +1 -0
  64. package/dist/esm/v2/__tests__/useFocusTrap.test.js +266 -402
  65. package/dist/esm/v2/__tests__/useFocusTrap.test.js.map +1 -1
  66. package/dist/esm/v2/__tests__/usePrefersReducedMotion.test.js +120 -0
  67. package/dist/esm/v2/__tests__/usePrefersReducedMotion.test.js.map +1 -0
  68. package/dist/esm/v2/components/Accordion.js +48 -70
  69. package/dist/esm/v2/components/Accordion.js.map +1 -1
  70. package/dist/esm/v2/components/ActionStrip.js +31 -43
  71. package/dist/esm/v2/components/ActionStrip.js.map +1 -1
  72. package/dist/esm/v2/components/Banner.js +25 -22
  73. package/dist/esm/v2/components/Banner.js.map +1 -1
  74. package/dist/esm/v2/components/Busy.js +14 -19
  75. package/dist/esm/v2/components/Busy.js.map +1 -1
  76. package/dist/esm/v2/components/Button.js +34 -45
  77. package/dist/esm/v2/components/Button.js.map +1 -1
  78. package/dist/esm/v2/components/CategoryTag.js +44 -27
  79. package/dist/esm/v2/components/CategoryTag.js.map +1 -1
  80. package/dist/esm/v2/components/Checkbox.js +32 -38
  81. package/dist/esm/v2/components/Checkbox.js.map +1 -1
  82. package/dist/esm/v2/components/Chip.js +23 -36
  83. package/dist/esm/v2/components/Chip.js.map +1 -1
  84. package/dist/esm/v2/components/Combobox.js +112 -136
  85. package/dist/esm/v2/components/Combobox.js.map +1 -1
  86. package/dist/esm/v2/components/CommandPalette.js +113 -198
  87. package/dist/esm/v2/components/CommandPalette.js.map +1 -1
  88. package/dist/esm/v2/components/ConfirmDialog.js +36 -45
  89. package/dist/esm/v2/components/ConfirmDialog.js.map +1 -1
  90. package/dist/esm/v2/components/DatePicker.js +78 -81
  91. package/dist/esm/v2/components/DatePicker.js.map +1 -1
  92. package/dist/esm/v2/components/DateRangePicker.js +63 -74
  93. package/dist/esm/v2/components/DateRangePicker.js.map +1 -1
  94. package/dist/esm/v2/components/DateTimePicker.js +81 -86
  95. package/dist/esm/v2/components/DateTimePicker.js.map +1 -1
  96. package/dist/esm/v2/components/Drawer.js +71 -65
  97. package/dist/esm/v2/components/Drawer.js.map +1 -1
  98. package/dist/esm/v2/components/Dropzone.js +130 -177
  99. package/dist/esm/v2/components/Dropzone.js.map +1 -1
  100. package/dist/esm/v2/components/EmptyState.js +9 -9
  101. package/dist/esm/v2/components/EmptyState.js.map +1 -1
  102. package/dist/esm/v2/components/FavoriteToggle.js +24 -33
  103. package/dist/esm/v2/components/FavoriteToggle.js.map +1 -1
  104. package/dist/esm/v2/components/Field.js +155 -59
  105. package/dist/esm/v2/components/Field.js.map +1 -1
  106. package/dist/esm/v2/components/FieldError.js +9 -13
  107. package/dist/esm/v2/components/FieldError.js.map +1 -1
  108. package/dist/esm/v2/components/FieldHelp.js +28 -49
  109. package/dist/esm/v2/components/FieldHelp.js.map +1 -1
  110. package/dist/esm/v2/components/FileCard.js +14 -19
  111. package/dist/esm/v2/components/FileCard.js.map +1 -1
  112. package/dist/esm/v2/components/FilterTab.js +22 -31
  113. package/dist/esm/v2/components/FilterTab.js.map +1 -1
  114. package/dist/esm/v2/components/ForbiddenPage.js +28 -8
  115. package/dist/esm/v2/components/ForbiddenPage.js.map +1 -1
  116. package/dist/esm/v2/components/FormGrid.js +48 -54
  117. package/dist/esm/v2/components/FormGrid.js.map +1 -1
  118. package/dist/esm/v2/components/FormikDisplay.js +98 -24
  119. package/dist/esm/v2/components/FormikDisplay.js.map +1 -1
  120. package/dist/esm/v2/components/Input.js +75 -34
  121. package/dist/esm/v2/components/Input.js.map +1 -1
  122. package/dist/esm/v2/components/KPICard.js +42 -51
  123. package/dist/esm/v2/components/KPICard.js.map +1 -1
  124. package/dist/esm/v2/components/KPIStrip.js +9 -15
  125. package/dist/esm/v2/components/KPIStrip.js.map +1 -1
  126. package/dist/esm/v2/components/KV.js +16 -23
  127. package/dist/esm/v2/components/KV.js.map +1 -1
  128. package/dist/esm/v2/components/KVGrid.js +15 -23
  129. package/dist/esm/v2/components/KVGrid.js.map +1 -1
  130. package/dist/esm/v2/components/Layout.js +81 -117
  131. package/dist/esm/v2/components/Layout.js.map +1 -1
  132. package/dist/esm/v2/components/MobileRowCard.js +64 -75
  133. package/dist/esm/v2/components/MobileRowCard.js.map +1 -1
  134. package/dist/esm/v2/components/Modal.js +44 -53
  135. package/dist/esm/v2/components/Modal.js.map +1 -1
  136. package/dist/esm/v2/components/NetworkErrorPage.js +28 -11
  137. package/dist/esm/v2/components/NetworkErrorPage.js.map +1 -1
  138. package/dist/esm/v2/components/NotFoundPage.js +28 -9
  139. package/dist/esm/v2/components/NotFoundPage.js.map +1 -1
  140. package/dist/esm/v2/components/NumberInput.js +77 -107
  141. package/dist/esm/v2/components/NumberInput.js.map +1 -1
  142. package/dist/esm/v2/components/OverflowMenu.js +24 -42
  143. package/dist/esm/v2/components/OverflowMenu.js.map +1 -1
  144. package/dist/esm/v2/components/PdfViewer.js +24 -33
  145. package/dist/esm/v2/components/PdfViewer.js.map +1 -1
  146. package/dist/esm/v2/components/ProgressBar.js +28 -36
  147. package/dist/esm/v2/components/ProgressBar.js.map +1 -1
  148. package/dist/esm/v2/components/Radio.js +49 -57
  149. package/dist/esm/v2/components/Radio.js.map +1 -1
  150. package/dist/esm/v2/components/SectionErrorBoundary.js +84 -130
  151. package/dist/esm/v2/components/SectionErrorBoundary.js.map +1 -1
  152. package/dist/esm/v2/components/SectionHeader.js +24 -31
  153. package/dist/esm/v2/components/SectionHeader.js.map +1 -1
  154. package/dist/esm/v2/components/Segmented.js +59 -84
  155. package/dist/esm/v2/components/Segmented.js.map +1 -1
  156. package/dist/esm/v2/components/Select.js +100 -138
  157. package/dist/esm/v2/components/Select.js.map +1 -1
  158. package/dist/esm/v2/components/ServerErrorPage.js +27 -10
  159. package/dist/esm/v2/components/ServerErrorPage.js.map +1 -1
  160. package/dist/esm/v2/components/Skeleton.js +81 -96
  161. package/dist/esm/v2/components/Skeleton.js.map +1 -1
  162. package/dist/esm/v2/components/SkipLink.js +6 -7
  163. package/dist/esm/v2/components/SkipLink.js.map +1 -1
  164. package/dist/esm/v2/components/Spinner.js +13 -22
  165. package/dist/esm/v2/components/Spinner.js.map +1 -1
  166. package/dist/esm/v2/components/Status.js +14 -25
  167. package/dist/esm/v2/components/Status.js.map +1 -1
  168. package/dist/esm/v2/components/Stepper.js +68 -71
  169. package/dist/esm/v2/components/Stepper.js.map +1 -1
  170. package/dist/esm/v2/components/Surface.js +25 -44
  171. package/dist/esm/v2/components/Surface.js.map +1 -1
  172. package/dist/esm/v2/components/Switch.js +21 -29
  173. package/dist/esm/v2/components/Switch.js.map +1 -1
  174. package/dist/esm/v2/components/TabPanel.js +84 -0
  175. package/dist/esm/v2/components/TabPanel.js.map +1 -0
  176. package/dist/esm/v2/components/Tabs.js +43 -19
  177. package/dist/esm/v2/components/Tabs.js.map +1 -1
  178. package/dist/esm/v2/components/TelInput.js +75 -108
  179. package/dist/esm/v2/components/TelInput.js.map +1 -1
  180. package/dist/esm/v2/components/Textarea.js +21 -30
  181. package/dist/esm/v2/components/Textarea.js.map +1 -1
  182. package/dist/esm/v2/components/TimePicker.js +59 -69
  183. package/dist/esm/v2/components/TimePicker.js.map +1 -1
  184. package/dist/esm/v2/components/Toast.js +109 -163
  185. package/dist/esm/v2/components/Toast.js.map +1 -1
  186. package/dist/esm/v2/components/Tooltip.js +18 -31
  187. package/dist/esm/v2/components/Tooltip.js.map +1 -1
  188. package/dist/esm/v2/components/_ErrorPageBody.js +6 -5
  189. package/dist/esm/v2/components/_ErrorPageBody.js.map +1 -1
  190. package/dist/esm/v2/components/_pickerShared.js +2 -2
  191. package/dist/esm/v2/components/_pickerShared.js.map +1 -1
  192. package/dist/esm/v2/components/index.js +37 -0
  193. package/dist/esm/v2/components/index.js.map +1 -1
  194. package/dist/esm/v2/hooks/index.js +62 -0
  195. package/dist/esm/v2/hooks/index.js.map +1 -1
  196. package/dist/esm/v2/hooks/useAppliedFilters.js +112 -0
  197. package/dist/esm/v2/hooks/useAppliedFilters.js.map +1 -0
  198. package/dist/esm/v2/hooks/useDebouncedCallback.js +82 -0
  199. package/dist/esm/v2/hooks/useDebouncedCallback.js.map +1 -0
  200. package/dist/esm/v2/hooks/useDelayedFlag.js +5 -19
  201. package/dist/esm/v2/hooks/useDelayedFlag.js.map +1 -1
  202. package/dist/esm/v2/hooks/useDensity.js +13 -17
  203. package/dist/esm/v2/hooks/useDensity.js.map +1 -1
  204. package/dist/esm/v2/hooks/useFocusFirstError.js +25 -33
  205. package/dist/esm/v2/hooks/useFocusFirstError.js.map +1 -1
  206. package/dist/esm/v2/hooks/useFocusOnRouteChange.js +81 -0
  207. package/dist/esm/v2/hooks/useFocusOnRouteChange.js.map +1 -0
  208. package/dist/esm/v2/hooks/useFocusTrap.js +19 -23
  209. package/dist/esm/v2/hooks/useFocusTrap.js.map +1 -1
  210. package/dist/esm/v2/hooks/useFormAutoSave.js +38 -53
  211. package/dist/esm/v2/hooks/useFormAutoSave.js.map +1 -1
  212. package/dist/esm/v2/hooks/useFormCompletionProgress.js +32 -51
  213. package/dist/esm/v2/hooks/useFormCompletionProgress.js.map +1 -1
  214. package/dist/esm/v2/hooks/useKeyboardShortcuts.js +125 -0
  215. package/dist/esm/v2/hooks/useKeyboardShortcuts.js.map +1 -0
  216. package/dist/esm/v2/hooks/usePrefersReducedMotion.js +99 -0
  217. package/dist/esm/v2/hooks/usePrefersReducedMotion.js.map +1 -0
  218. package/dist/esm/v2/hooks/useResolvedDensity.js +2 -10
  219. package/dist/esm/v2/hooks/useResolvedDensity.js.map +1 -1
  220. package/dist/esm/v2/hooks/useSortedRows.js +3 -5
  221. package/dist/esm/v2/hooks/useSortedRows.js.map +1 -1
  222. package/dist/esm/v2/hooks/useTabLoading.js +6 -21
  223. package/dist/esm/v2/hooks/useTabLoading.js.map +1 -1
  224. package/dist/esm/v2/index.js +2 -3
  225. package/dist/esm/v2/index.js.map +1 -1
  226. package/dist/esm/v2/modalContext.js +2 -2
  227. package/dist/esm/v2/modalContext.js.map +1 -1
  228. package/dist/esm/v2/models/favorite.js.map +1 -1
  229. package/dist/esm/v2/models/personalization.js.map +1 -1
  230. package/dist/esm/v2/models/referentiel.js.map +1 -1
  231. package/dist/esm/v2/models/savedFilter.js.map +1 -1
  232. package/dist/esm/v2/patterns/ActionBar.js +115 -159
  233. package/dist/esm/v2/patterns/ActionBar.js.map +1 -1
  234. package/dist/esm/v2/patterns/AppMain.js +108 -0
  235. package/dist/esm/v2/patterns/AppMain.js.map +1 -0
  236. package/dist/esm/v2/patterns/BulkActionBar.js +31 -34
  237. package/dist/esm/v2/patterns/BulkActionBar.js.map +1 -1
  238. package/dist/esm/v2/patterns/ChartFigure.js +151 -0
  239. package/dist/esm/v2/patterns/ChartFigure.js.map +1 -0
  240. package/dist/esm/v2/patterns/CollapsibleDataGrid.js +111 -152
  241. package/dist/esm/v2/patterns/CollapsibleDataGrid.js.map +1 -1
  242. package/dist/esm/v2/patterns/ColumnsToggle.js +43 -77
  243. package/dist/esm/v2/patterns/ColumnsToggle.js.map +1 -1
  244. package/dist/esm/v2/patterns/DataGrid.js +221 -255
  245. package/dist/esm/v2/patterns/DataGrid.js.map +1 -1
  246. package/dist/esm/v2/patterns/DataGridSettingsMenu.js +76 -94
  247. package/dist/esm/v2/patterns/DataGridSettingsMenu.js.map +1 -1
  248. package/dist/esm/v2/patterns/DataGridToolbar.js +85 -89
  249. package/dist/esm/v2/patterns/DataGridToolbar.js.map +1 -1
  250. package/dist/esm/v2/patterns/DataGridVirtualized.js +141 -182
  251. package/dist/esm/v2/patterns/DataGridVirtualized.js.map +1 -1
  252. package/dist/esm/v2/patterns/DeleteResourceConfirmDialog.js +26 -30
  253. package/dist/esm/v2/patterns/DeleteResourceConfirmDialog.js.map +1 -1
  254. package/dist/esm/v2/patterns/DetailSplit.js +108 -0
  255. package/dist/esm/v2/patterns/DetailSplit.js.map +1 -0
  256. package/dist/esm/v2/patterns/FavoriteColumn.js +15 -17
  257. package/dist/esm/v2/patterns/FavoriteColumn.js.map +1 -1
  258. package/dist/esm/v2/patterns/FavoritesFilter.js +30 -39
  259. package/dist/esm/v2/patterns/FavoritesFilter.js.map +1 -1
  260. package/dist/esm/v2/patterns/FilterTabBar.js +112 -0
  261. package/dist/esm/v2/patterns/FilterTabBar.js.map +1 -0
  262. package/dist/esm/v2/patterns/FormErrorSummary.js +12 -13
  263. package/dist/esm/v2/patterns/FormErrorSummary.js.map +1 -1
  264. package/dist/esm/v2/patterns/FormPageShell.js +43 -41
  265. package/dist/esm/v2/patterns/FormPageShell.js.map +1 -1
  266. package/dist/esm/v2/patterns/FormSection.js +30 -38
  267. package/dist/esm/v2/patterns/FormSection.js.map +1 -1
  268. package/dist/esm/v2/patterns/FormikCheckbox.js +29 -39
  269. package/dist/esm/v2/patterns/FormikCheckbox.js.map +1 -1
  270. package/dist/esm/v2/patterns/FormikCheckboxGroup.js +56 -60
  271. package/dist/esm/v2/patterns/FormikCheckboxGroup.js.map +1 -1
  272. package/dist/esm/v2/patterns/FormikCombobox.js +51 -69
  273. package/dist/esm/v2/patterns/FormikCombobox.js.map +1 -1
  274. package/dist/esm/v2/patterns/FormikDatePicker.js +44 -58
  275. package/dist/esm/v2/patterns/FormikDatePicker.js.map +1 -1
  276. package/dist/esm/v2/patterns/FormikDateTimePicker.js +44 -58
  277. package/dist/esm/v2/patterns/FormikDateTimePicker.js.map +1 -1
  278. package/dist/esm/v2/patterns/FormikErrorFocus.js +22 -23
  279. package/dist/esm/v2/patterns/FormikErrorFocus.js.map +1 -1
  280. package/dist/esm/v2/patterns/FormikErrorSummary.js +89 -0
  281. package/dist/esm/v2/patterns/FormikErrorSummary.js.map +1 -0
  282. package/dist/esm/v2/patterns/FormikFile.js +94 -78
  283. package/dist/esm/v2/patterns/FormikFile.js.map +1 -1
  284. package/dist/esm/v2/patterns/FormikInput.js +40 -53
  285. package/dist/esm/v2/patterns/FormikInput.js.map +1 -1
  286. package/dist/esm/v2/patterns/FormikRadioGroup.js +39 -51
  287. package/dist/esm/v2/patterns/FormikRadioGroup.js.map +1 -1
  288. package/dist/esm/v2/patterns/FormikReferentielField.js +49 -59
  289. package/dist/esm/v2/patterns/FormikReferentielField.js.map +1 -1
  290. package/dist/esm/v2/patterns/FormikSelect.js +64 -87
  291. package/dist/esm/v2/patterns/FormikSelect.js.map +1 -1
  292. package/dist/esm/v2/patterns/FormikTextarea.js +30 -46
  293. package/dist/esm/v2/patterns/FormikTextarea.js.map +1 -1
  294. package/dist/esm/v2/patterns/KeyboardShortcutsHelp.js +53 -71
  295. package/dist/esm/v2/patterns/KeyboardShortcutsHelp.js.map +1 -1
  296. package/dist/esm/v2/patterns/NetworkErrorBanner.js +6 -7
  297. package/dist/esm/v2/patterns/NetworkErrorBanner.js.map +1 -1
  298. package/dist/esm/v2/patterns/PageContent.js +10 -14
  299. package/dist/esm/v2/patterns/PageContent.js.map +1 -1
  300. package/dist/esm/v2/patterns/PreviewDrawer.js +153 -0
  301. package/dist/esm/v2/patterns/PreviewDrawer.js.map +1 -0
  302. package/dist/esm/v2/patterns/ReferentielField.js +327 -312
  303. package/dist/esm/v2/patterns/ReferentielField.js.map +1 -1
  304. package/dist/esm/v2/patterns/RowFavoriteToggle.js +27 -22
  305. package/dist/esm/v2/patterns/RowFavoriteToggle.js.map +1 -1
  306. package/dist/esm/v2/patterns/SaveFilterDialog.js +38 -66
  307. package/dist/esm/v2/patterns/SaveFilterDialog.js.map +1 -1
  308. package/dist/esm/v2/patterns/SavedFiltersMenu.js +62 -81
  309. package/dist/esm/v2/patterns/SavedFiltersMenu.js.map +1 -1
  310. package/dist/esm/v2/patterns/SkeletonPageShell.js +106 -129
  311. package/dist/esm/v2/patterns/SkeletonPageShell.js.map +1 -1
  312. package/dist/esm/v2/patterns/SortableHeader.js +22 -45
  313. package/dist/esm/v2/patterns/SortableHeader.js.map +1 -1
  314. package/dist/esm/v2/patterns/Tour.js +94 -120
  315. package/dist/esm/v2/patterns/Tour.js.map +1 -1
  316. package/dist/esm/v2/patterns/_dataGridShared.js +107 -128
  317. package/dist/esm/v2/patterns/_dataGridShared.js.map +1 -1
  318. package/dist/esm/v2/patterns/_pickerSerialisation.js +6 -8
  319. package/dist/esm/v2/patterns/_pickerSerialisation.js.map +1 -1
  320. package/dist/esm/v2/patterns/_sort.js +17 -33
  321. package/dist/esm/v2/patterns/_sort.js.map +1 -1
  322. package/dist/esm/v2/patterns/_useColumnReorder.js +122 -160
  323. package/dist/esm/v2/patterns/_useColumnReorder.js.map +1 -1
  324. package/dist/esm/v2/patterns/_useColumnResize.js +78 -96
  325. package/dist/esm/v2/patterns/_useColumnResize.js.map +1 -1
  326. package/dist/esm/v2/patterns/filterCriteria.js +102 -0
  327. package/dist/esm/v2/patterns/filterCriteria.js.map +1 -0
  328. package/dist/esm/v2/patterns/index.js +152 -0
  329. package/dist/esm/v2/patterns/index.js.map +1 -1
  330. package/dist/esm/v2/patterns/rowActions.js +223 -0
  331. package/dist/esm/v2/patterns/rowActions.js.map +1 -0
  332. package/dist/esm/v2/personalization/PersonalizationProvider.js +50 -47
  333. package/dist/esm/v2/personalization/PersonalizationProvider.js.map +1 -1
  334. package/dist/esm/v2/personalization/adapters/_storageKey.js +5 -5
  335. package/dist/esm/v2/personalization/adapters/_storageKey.js.map +1 -1
  336. package/dist/esm/v2/personalization/adapters/createLocalStorageAdapter.js +22 -23
  337. package/dist/esm/v2/personalization/adapters/createLocalStorageAdapter.js.map +1 -1
  338. package/dist/esm/v2/personalization/adapters/createMemoryAdapter.js +13 -13
  339. package/dist/esm/v2/personalization/adapters/createMemoryAdapter.js.map +1 -1
  340. package/dist/esm/v2/personalization/capabilities/favorites.js +36 -60
  341. package/dist/esm/v2/personalization/capabilities/favorites.js.map +1 -1
  342. package/dist/esm/v2/personalization/capabilities/favoritesView.js +22 -34
  343. package/dist/esm/v2/personalization/capabilities/favoritesView.js.map +1 -1
  344. package/dist/esm/v2/personalization/capabilities/gridPreferences.js +28 -34
  345. package/dist/esm/v2/personalization/capabilities/gridPreferences.js.map +1 -1
  346. package/dist/esm/v2/personalization/capabilities/reviveSavedCriteria.js +119 -0
  347. package/dist/esm/v2/personalization/capabilities/reviveSavedCriteria.js.map +1 -0
  348. package/dist/esm/v2/personalization/capabilities/savedFilters.js +90 -98
  349. package/dist/esm/v2/personalization/capabilities/savedFilters.js.map +1 -1
  350. package/dist/esm/v2/personalization/createPersonalizationStore.js +78 -181
  351. package/dist/esm/v2/personalization/createPersonalizationStore.js.map +1 -1
  352. package/dist/esm/v2/personalization/index.js +17 -0
  353. package/dist/esm/v2/personalization/index.js.map +1 -1
  354. package/dist/esm/v2/personalization/personalizationContext.js +9 -9
  355. package/dist/esm/v2/personalization/personalizationContext.js.map +1 -1
  356. package/dist/esm/v2/personalization/schema.js +8 -9
  357. package/dist/esm/v2/personalization/schema.js.map +1 -1
  358. package/dist/esm/v2/referentiel/ReferentielProvider.js +27 -42
  359. package/dist/esm/v2/referentiel/ReferentielProvider.js.map +1 -1
  360. package/dist/esm/v2/referentiel/types.js +2 -0
  361. package/dist/esm/v2/referentiel/types.js.map +1 -0
  362. package/dist/esm/v2/referentiel/useReferentielClient.js +10 -11
  363. package/dist/esm/v2/referentiel/useReferentielClient.js.map +1 -1
  364. package/dist/esm/v2/referentiel/useReferentielOptions.js +60 -117
  365. package/dist/esm/v2/referentiel/useReferentielOptions.js.map +1 -1
  366. package/dist/esm/v2/referentiel/useReferentielSearch.js +37 -91
  367. package/dist/esm/v2/referentiel/useReferentielSearch.js.map +1 -1
  368. package/dist/esm/v2/theme/_brand.js +8 -24
  369. package/dist/esm/v2/theme/_brand.js.map +1 -1
  370. package/dist/esm/v2/theme/_brandSecondary.js +8 -24
  371. package/dist/esm/v2/theme/_brandSecondary.js.map +1 -1
  372. package/dist/esm/v2/theme/createPortnetTheme.js +51 -61
  373. package/dist/esm/v2/theme/createPortnetTheme.js.map +1 -1
  374. package/dist/esm/v2/theme/cssVariables.js +62 -69
  375. package/dist/esm/v2/theme/cssVariables.js.map +1 -1
  376. package/dist/esm/v2/theme/index.js +5 -5
  377. package/dist/esm/v2/theme/index.js.map +1 -1
  378. package/dist/esm/v2/tokens/breakpoints.js +14 -14
  379. package/dist/esm/v2/tokens/breakpoints.js.map +1 -1
  380. package/dist/esm/v2/tokens/chart.js +261 -0
  381. package/dist/esm/v2/tokens/chart.js.map +1 -0
  382. package/dist/esm/v2/tokens/colors.js +22 -22
  383. package/dist/esm/v2/tokens/colors.js.map +1 -1
  384. package/dist/esm/v2/tokens/density.js +62 -7
  385. package/dist/esm/v2/tokens/density.js.map +1 -1
  386. package/dist/esm/v2/tokens/index.js +49 -34
  387. package/dist/esm/v2/tokens/index.js.map +1 -1
  388. package/dist/esm/v2/tokens/motion.js +12 -20
  389. package/dist/esm/v2/tokens/motion.js.map +1 -1
  390. package/dist/esm/v2/tokens/radius.js +1 -1
  391. package/dist/esm/v2/tokens/radius.js.map +1 -1
  392. package/dist/esm/v2/tokens/shadows.js +6 -6
  393. package/dist/esm/v2/tokens/shadows.js.map +1 -1
  394. package/dist/esm/v2/tokens/spacing.js +2 -2
  395. package/dist/esm/v2/tokens/spacing.js.map +1 -1
  396. package/dist/esm/v2/tokens/state.js +1 -1
  397. package/dist/esm/v2/tokens/state.js.map +1 -1
  398. package/dist/esm/v2/tokens/statusPalette.js +17 -21
  399. package/dist/esm/v2/tokens/statusPalette.js.map +1 -1
  400. package/dist/esm/v2/tokens/tokens.json +6 -1
  401. package/dist/esm/v2/tokens/typography.js +13 -13
  402. package/dist/esm/v2/tokens/typography.js.map +1 -1
  403. package/dist/esm/v2/tokens/zIndex.js +1 -1
  404. package/dist/esm/v2/tokens/zIndex.js.map +1 -1
  405. package/dist/esm/v2/types/datagrid.js.map +1 -1
  406. package/dist/esm/v2/utils/apiError.js +16 -37
  407. package/dist/esm/v2/utils/apiError.js.map +1 -1
  408. package/dist/esm/v2/utils/contrast.js +31 -32
  409. package/dist/esm/v2/utils/contrast.js.map +1 -1
  410. package/dist/esm/v2/utils/cx.js +5 -25
  411. package/dist/esm/v2/utils/cx.js.map +1 -1
  412. package/dist/esm/v2/utils/fileDownload.js +23 -26
  413. package/dist/esm/v2/utils/fileDownload.js.map +1 -1
  414. package/dist/esm/v2/utils/fileValidation.js +209 -0
  415. package/dist/esm/v2/utils/fileValidation.js.map +1 -0
  416. package/dist/esm/v2/utils/fmtDate.js +111 -0
  417. package/dist/esm/v2/utils/fmtDate.js.map +1 -0
  418. package/dist/esm/v2/utils/fmtMoney.js +8 -10
  419. package/dist/esm/v2/utils/fmtMoney.js.map +1 -1
  420. package/dist/esm/v2/utils/formikErrors.js +78 -0
  421. package/dist/esm/v2/utils/formikErrors.js.map +1 -0
  422. package/dist/esm/v2/utils/index.js +35 -2
  423. package/dist/esm/v2/utils/index.js.map +1 -1
  424. package/dist/esm/v2/utils/mergeLabels.js +7 -12
  425. package/dist/esm/v2/utils/mergeLabels.js.map +1 -1
  426. package/dist/esm/v2/utils/networkStatus.js +12 -12
  427. package/dist/esm/v2/utils/networkStatus.js.map +1 -1
  428. package/dist/index.d.ts +7 -1
  429. package/dist/index.d.ts.map +1 -1
  430. package/dist/index.js +110 -49
  431. package/dist/index.js.map +1 -1
  432. package/dist/v2/__tests__/AppMain.test.js +133 -0
  433. package/dist/v2/__tests__/AppMain.test.js.map +1 -0
  434. package/dist/v2/__tests__/ChartFigure.test.js +183 -0
  435. package/dist/v2/__tests__/ChartFigure.test.js.map +1 -0
  436. package/dist/v2/__tests__/DataGridRowActionsPropagation.test.js +153 -0
  437. package/dist/v2/__tests__/DataGridRowActionsPropagation.test.js.map +1 -0
  438. package/dist/v2/__tests__/DrawerTactileTargets.test.js +94 -0
  439. package/dist/v2/__tests__/DrawerTactileTargets.test.js.map +1 -0
  440. package/dist/v2/__tests__/FieldError.test.js +82 -49
  441. package/dist/v2/__tests__/FieldError.test.js.map +1 -1
  442. package/dist/v2/__tests__/FieldNaming.test.js +161 -0
  443. package/dist/v2/__tests__/FieldNaming.test.js.map +1 -0
  444. package/dist/v2/__tests__/FieldWidth.test.js +23 -25
  445. package/dist/v2/__tests__/FieldWidth.test.js.map +1 -1
  446. package/dist/v2/__tests__/FileCard.test.js +29 -28
  447. package/dist/v2/__tests__/FileCard.test.js.map +1 -1
  448. package/dist/v2/__tests__/FormikCheckbox.test.js +90 -183
  449. package/dist/v2/__tests__/FormikCheckbox.test.js.map +1 -1
  450. package/dist/v2/__tests__/FormikDateTimePicker.test.js +38 -48
  451. package/dist/v2/__tests__/FormikDateTimePicker.test.js.map +1 -1
  452. package/dist/v2/__tests__/FormikDisplayWidth.test.js +102 -0
  453. package/dist/v2/__tests__/FormikDisplayWidth.test.js.map +1 -0
  454. package/dist/v2/__tests__/FormikRadioGroup.test.js +123 -204
  455. package/dist/v2/__tests__/FormikRadioGroup.test.js.map +1 -1
  456. package/dist/v2/__tests__/MobileRowCard.test.js +63 -61
  457. package/dist/v2/__tests__/MobileRowCard.test.js.map +1 -1
  458. package/dist/v2/__tests__/PreviewDrawer.test.js +169 -0
  459. package/dist/v2/__tests__/PreviewDrawer.test.js.map +1 -0
  460. package/dist/v2/__tests__/ReferentielFieldContainer.test.js +159 -0
  461. package/dist/v2/__tests__/ReferentielFieldContainer.test.js.map +1 -0
  462. package/dist/v2/__tests__/SectionErrorBoundary.test.js +53 -68
  463. package/dist/v2/__tests__/SectionErrorBoundary.test.js.map +1 -1
  464. package/dist/v2/__tests__/apiError.test.js +50 -69
  465. package/dist/v2/__tests__/apiError.test.js.map +1 -1
  466. package/dist/v2/__tests__/banned-patterns.test.js +42 -123
  467. package/dist/v2/__tests__/banned-patterns.test.js.map +1 -1
  468. package/dist/v2/__tests__/chart-palette.test.js +205 -0
  469. package/dist/v2/__tests__/chart-palette.test.js.map +1 -0
  470. package/dist/v2/__tests__/contrast-palette.test.js +42 -74
  471. package/dist/v2/__tests__/contrast-palette.test.js.map +1 -1
  472. package/dist/v2/__tests__/cssVariables.test.js +44 -51
  473. package/dist/v2/__tests__/cssVariables.test.js.map +1 -1
  474. package/dist/v2/__tests__/fileValidation.test.js +136 -0
  475. package/dist/v2/__tests__/fileValidation.test.js.map +1 -0
  476. package/dist/v2/__tests__/filterCriteria.test.js +324 -0
  477. package/dist/v2/__tests__/filterCriteria.test.js.map +1 -0
  478. package/dist/v2/__tests__/fmtDate.test.js +69 -0
  479. package/dist/v2/__tests__/fmtDate.test.js.map +1 -0
  480. package/dist/v2/__tests__/gap-leakage-refonte.test.js +221 -0
  481. package/dist/v2/__tests__/gap-leakage-refonte.test.js.map +1 -0
  482. package/dist/v2/__tests__/labels-merge.test.js +23 -27
  483. package/dist/v2/__tests__/labels-merge.test.js.map +1 -1
  484. package/dist/v2/__tests__/locale-fallback.test.js +47 -52
  485. package/dist/v2/__tests__/locale-fallback.test.js.map +1 -1
  486. package/dist/v2/__tests__/reviveSavedCriteria.test.js +144 -0
  487. package/dist/v2/__tests__/reviveSavedCriteria.test.js.map +1 -0
  488. package/dist/v2/__tests__/rowActions.test.js +186 -0
  489. package/dist/v2/__tests__/rowActions.test.js.map +1 -0
  490. package/dist/v2/__tests__/useFocusOnRouteChange.test.js +156 -0
  491. package/dist/v2/__tests__/useFocusOnRouteChange.test.js.map +1 -0
  492. package/dist/v2/__tests__/useFocusTrap.test.js +270 -407
  493. package/dist/v2/__tests__/useFocusTrap.test.js.map +1 -1
  494. package/dist/v2/__tests__/usePrefersReducedMotion.test.js +123 -0
  495. package/dist/v2/__tests__/usePrefersReducedMotion.test.js.map +1 -0
  496. package/dist/v2/components/Accordion.js +60 -82
  497. package/dist/v2/components/Accordion.js.map +1 -1
  498. package/dist/v2/components/ActionStrip.js +40 -52
  499. package/dist/v2/components/ActionStrip.js.map +1 -1
  500. package/dist/v2/components/Banner.js +42 -41
  501. package/dist/v2/components/Banner.js.map +1 -1
  502. package/dist/v2/components/Busy.js +22 -27
  503. package/dist/v2/components/Busy.js.map +1 -1
  504. package/dist/v2/components/Button.js +39 -50
  505. package/dist/v2/components/Button.js.map +1 -1
  506. package/dist/v2/components/CategoryTag.d.ts.map +1 -1
  507. package/dist/v2/components/CategoryTag.js +49 -32
  508. package/dist/v2/components/CategoryTag.js.map +1 -1
  509. package/dist/v2/components/Checkbox.js +39 -45
  510. package/dist/v2/components/Checkbox.js.map +1 -1
  511. package/dist/v2/components/Chip.js +29 -42
  512. package/dist/v2/components/Chip.js.map +1 -1
  513. package/dist/v2/components/Combobox.js +122 -144
  514. package/dist/v2/components/Combobox.js.map +1 -1
  515. package/dist/v2/components/CommandPalette.js +138 -225
  516. package/dist/v2/components/CommandPalette.js.map +1 -1
  517. package/dist/v2/components/ConfirmDialog.js +46 -56
  518. package/dist/v2/components/ConfirmDialog.js.map +1 -1
  519. package/dist/v2/components/DatePicker.js +81 -86
  520. package/dist/v2/components/DatePicker.js.map +1 -1
  521. package/dist/v2/components/DateRangePicker.js +77 -87
  522. package/dist/v2/components/DateRangePicker.js.map +1 -1
  523. package/dist/v2/components/DateTimePicker.js +84 -91
  524. package/dist/v2/components/DateTimePicker.js.map +1 -1
  525. package/dist/v2/components/Drawer.d.ts.map +1 -1
  526. package/dist/v2/components/Drawer.js +93 -88
  527. package/dist/v2/components/Drawer.js.map +1 -1
  528. package/dist/v2/components/Dropzone.js +150 -196
  529. package/dist/v2/components/Dropzone.js.map +1 -1
  530. package/dist/v2/components/EmptyState.js +18 -20
  531. package/dist/v2/components/EmptyState.js.map +1 -1
  532. package/dist/v2/components/FavoriteToggle.js +28 -39
  533. package/dist/v2/components/FavoriteToggle.js.map +1 -1
  534. package/dist/v2/components/Field.d.ts +62 -4
  535. package/dist/v2/components/Field.d.ts.map +1 -1
  536. package/dist/v2/components/Field.js +169 -70
  537. package/dist/v2/components/Field.js.map +1 -1
  538. package/dist/v2/components/FieldError.js +18 -21
  539. package/dist/v2/components/FieldError.js.map +1 -1
  540. package/dist/v2/components/FieldHelp.js +40 -60
  541. package/dist/v2/components/FieldHelp.js.map +1 -1
  542. package/dist/v2/components/FileCard.js +27 -31
  543. package/dist/v2/components/FileCard.js.map +1 -1
  544. package/dist/v2/components/FilterTab.js +30 -38
  545. package/dist/v2/components/FilterTab.js.map +1 -1
  546. package/dist/v2/components/ForbiddenPage.d.ts +25 -1
  547. package/dist/v2/components/ForbiddenPage.d.ts.map +1 -1
  548. package/dist/v2/components/ForbiddenPage.js +37 -17
  549. package/dist/v2/components/ForbiddenPage.js.map +1 -1
  550. package/dist/v2/components/FormGrid.js +53 -59
  551. package/dist/v2/components/FormGrid.js.map +1 -1
  552. package/dist/v2/components/FormikDisplay.d.ts +50 -1
  553. package/dist/v2/components/FormikDisplay.d.ts.map +1 -1
  554. package/dist/v2/components/FormikDisplay.js +108 -33
  555. package/dist/v2/components/FormikDisplay.js.map +1 -1
  556. package/dist/v2/components/Input.d.ts +40 -0
  557. package/dist/v2/components/Input.d.ts.map +1 -1
  558. package/dist/v2/components/Input.js +81 -41
  559. package/dist/v2/components/Input.js.map +1 -1
  560. package/dist/v2/components/KPICard.js +57 -67
  561. package/dist/v2/components/KPICard.js.map +1 -1
  562. package/dist/v2/components/KPIStrip.js +16 -22
  563. package/dist/v2/components/KPIStrip.js.map +1 -1
  564. package/dist/v2/components/KV.js +25 -31
  565. package/dist/v2/components/KV.js.map +1 -1
  566. package/dist/v2/components/KVGrid.js +19 -26
  567. package/dist/v2/components/KVGrid.js.map +1 -1
  568. package/dist/v2/components/Layout.js +91 -120
  569. package/dist/v2/components/Layout.js.map +1 -1
  570. package/dist/v2/components/MobileRowCard.js +79 -91
  571. package/dist/v2/components/MobileRowCard.js.map +1 -1
  572. package/dist/v2/components/Modal.js +61 -69
  573. package/dist/v2/components/Modal.js.map +1 -1
  574. package/dist/v2/components/NetworkErrorPage.d.ts +19 -1
  575. package/dist/v2/components/NetworkErrorPage.d.ts.map +1 -1
  576. package/dist/v2/components/NetworkErrorPage.js +38 -21
  577. package/dist/v2/components/NetworkErrorPage.js.map +1 -1
  578. package/dist/v2/components/NotFoundPage.d.ts +17 -1
  579. package/dist/v2/components/NotFoundPage.d.ts.map +1 -1
  580. package/dist/v2/components/NotFoundPage.js +37 -18
  581. package/dist/v2/components/NotFoundPage.js.map +1 -1
  582. package/dist/v2/components/NumberInput.js +88 -118
  583. package/dist/v2/components/NumberInput.js.map +1 -1
  584. package/dist/v2/components/OverflowMenu.js +38 -56
  585. package/dist/v2/components/OverflowMenu.js.map +1 -1
  586. package/dist/v2/components/PdfViewer.js +34 -45
  587. package/dist/v2/components/PdfViewer.js.map +1 -1
  588. package/dist/v2/components/ProgressBar.js +42 -49
  589. package/dist/v2/components/ProgressBar.js.map +1 -1
  590. package/dist/v2/components/Radio.js +59 -67
  591. package/dist/v2/components/Radio.js.map +1 -1
  592. package/dist/v2/components/SectionErrorBoundary.js +90 -135
  593. package/dist/v2/components/SectionErrorBoundary.js.map +1 -1
  594. package/dist/v2/components/SectionHeader.js +34 -41
  595. package/dist/v2/components/SectionHeader.js.map +1 -1
  596. package/dist/v2/components/Segmented.js +69 -93
  597. package/dist/v2/components/Segmented.js.map +1 -1
  598. package/dist/v2/components/Select.d.ts +26 -2
  599. package/dist/v2/components/Select.d.ts.map +1 -1
  600. package/dist/v2/components/Select.js +120 -155
  601. package/dist/v2/components/Select.js.map +1 -1
  602. package/dist/v2/components/ServerErrorPage.d.ts +27 -1
  603. package/dist/v2/components/ServerErrorPage.d.ts.map +1 -1
  604. package/dist/v2/components/ServerErrorPage.js +37 -20
  605. package/dist/v2/components/ServerErrorPage.js.map +1 -1
  606. package/dist/v2/components/Skeleton.js +86 -100
  607. package/dist/v2/components/Skeleton.js.map +1 -1
  608. package/dist/v2/components/SkipLink.js +9 -12
  609. package/dist/v2/components/SkipLink.js.map +1 -1
  610. package/dist/v2/components/Spinner.js +16 -25
  611. package/dist/v2/components/Spinner.js.map +1 -1
  612. package/dist/v2/components/Status.js +18 -29
  613. package/dist/v2/components/Status.js.map +1 -1
  614. package/dist/v2/components/Stepper.js +80 -82
  615. package/dist/v2/components/Stepper.js.map +1 -1
  616. package/dist/v2/components/Surface.js +34 -49
  617. package/dist/v2/components/Surface.js.map +1 -1
  618. package/dist/v2/components/Switch.js +29 -37
  619. package/dist/v2/components/Switch.js.map +1 -1
  620. package/dist/v2/components/TabPanel.d.ts +17 -0
  621. package/dist/v2/components/TabPanel.d.ts.map +1 -0
  622. package/dist/v2/components/TabPanel.js +90 -0
  623. package/dist/v2/components/TabPanel.js.map +1 -0
  624. package/dist/v2/components/Tabs.d.ts +25 -0
  625. package/dist/v2/components/Tabs.d.ts.map +1 -1
  626. package/dist/v2/components/Tabs.js +53 -29
  627. package/dist/v2/components/Tabs.js.map +1 -1
  628. package/dist/v2/components/TelInput.js +80 -115
  629. package/dist/v2/components/TelInput.js.map +1 -1
  630. package/dist/v2/components/Textarea.js +26 -35
  631. package/dist/v2/components/Textarea.js.map +1 -1
  632. package/dist/v2/components/TimePicker.js +62 -74
  633. package/dist/v2/components/TimePicker.js.map +1 -1
  634. package/dist/v2/components/Toast.js +119 -174
  635. package/dist/v2/components/Toast.js.map +1 -1
  636. package/dist/v2/components/Tooltip.js +23 -38
  637. package/dist/v2/components/Tooltip.js.map +1 -1
  638. package/dist/v2/components/_ErrorPageBody.js +15 -16
  639. package/dist/v2/components/_ErrorPageBody.js.map +1 -1
  640. package/dist/v2/components/_pickerShared.js +5 -5
  641. package/dist/v2/components/_pickerShared.js.map +1 -1
  642. package/dist/v2/components/index.d.ts +40 -1
  643. package/dist/v2/components/index.d.ts.map +1 -1
  644. package/dist/v2/components/index.js +153 -136
  645. package/dist/v2/components/index.js.map +1 -1
  646. package/dist/v2/hooks/index.d.ts +65 -0
  647. package/dist/v2/hooks/index.d.ts.map +1 -1
  648. package/dist/v2/hooks/index.js +63 -24
  649. package/dist/v2/hooks/index.js.map +1 -1
  650. package/dist/v2/hooks/useAppliedFilters.d.ts +102 -0
  651. package/dist/v2/hooks/useAppliedFilters.d.ts.map +1 -0
  652. package/dist/v2/hooks/useAppliedFilters.js +117 -0
  653. package/dist/v2/hooks/useAppliedFilters.js.map +1 -0
  654. package/dist/v2/hooks/useDebouncedCallback.d.ts +64 -0
  655. package/dist/v2/hooks/useDebouncedCallback.d.ts.map +1 -0
  656. package/dist/v2/hooks/useDebouncedCallback.js +87 -0
  657. package/dist/v2/hooks/useDebouncedCallback.js.map +1 -0
  658. package/dist/v2/hooks/useDelayedFlag.js +6 -20
  659. package/dist/v2/hooks/useDelayedFlag.js.map +1 -1
  660. package/dist/v2/hooks/useDensity.d.ts.map +1 -1
  661. package/dist/v2/hooks/useDensity.js +14 -18
  662. package/dist/v2/hooks/useDensity.js.map +1 -1
  663. package/dist/v2/hooks/useFocusFirstError.js +26 -34
  664. package/dist/v2/hooks/useFocusFirstError.js.map +1 -1
  665. package/dist/v2/hooks/useFocusOnRouteChange.d.ts +65 -0
  666. package/dist/v2/hooks/useFocusOnRouteChange.d.ts.map +1 -0
  667. package/dist/v2/hooks/useFocusOnRouteChange.js +88 -0
  668. package/dist/v2/hooks/useFocusOnRouteChange.js.map +1 -0
  669. package/dist/v2/hooks/useFocusTrap.js +20 -24
  670. package/dist/v2/hooks/useFocusTrap.js.map +1 -1
  671. package/dist/v2/hooks/useFormAutoSave.d.ts +4 -4
  672. package/dist/v2/hooks/useFormAutoSave.d.ts.map +1 -1
  673. package/dist/v2/hooks/useFormAutoSave.js +39 -54
  674. package/dist/v2/hooks/useFormAutoSave.js.map +1 -1
  675. package/dist/v2/hooks/useFormCompletionProgress.d.ts +1 -1
  676. package/dist/v2/hooks/useFormCompletionProgress.d.ts.map +1 -1
  677. package/dist/v2/hooks/useFormCompletionProgress.js +33 -52
  678. package/dist/v2/hooks/useFormCompletionProgress.js.map +1 -1
  679. package/dist/v2/hooks/useKeyboardShortcuts.d.ts +25 -0
  680. package/dist/v2/hooks/useKeyboardShortcuts.d.ts.map +1 -0
  681. package/dist/v2/hooks/useKeyboardShortcuts.js +132 -0
  682. package/dist/v2/hooks/useKeyboardShortcuts.js.map +1 -0
  683. package/dist/v2/hooks/usePrefersReducedMotion.d.ts +56 -0
  684. package/dist/v2/hooks/usePrefersReducedMotion.d.ts.map +1 -0
  685. package/dist/v2/hooks/usePrefersReducedMotion.js +105 -0
  686. package/dist/v2/hooks/usePrefersReducedMotion.js.map +1 -0
  687. package/dist/v2/hooks/useResolvedDensity.js +5 -13
  688. package/dist/v2/hooks/useResolvedDensity.js.map +1 -1
  689. package/dist/v2/hooks/useSortedRows.js +4 -6
  690. package/dist/v2/hooks/useSortedRows.js.map +1 -1
  691. package/dist/v2/hooks/useTabLoading.js +7 -22
  692. package/dist/v2/hooks/useTabLoading.js.map +1 -1
  693. package/dist/v2/index.js +143 -145
  694. package/dist/v2/index.js.map +1 -1
  695. package/dist/v2/modalContext.js +2 -2
  696. package/dist/v2/modalContext.js.map +1 -1
  697. package/dist/v2/models/favorite.d.ts +8 -9
  698. package/dist/v2/models/favorite.d.ts.map +1 -1
  699. package/dist/v2/models/favorite.js.map +1 -1
  700. package/dist/v2/models/index.js +4 -4
  701. package/dist/v2/models/index.js.map +1 -1
  702. package/dist/v2/models/personalization.d.ts +44 -48
  703. package/dist/v2/models/personalization.d.ts.map +1 -1
  704. package/dist/v2/models/personalization.js.map +1 -1
  705. package/dist/v2/models/referentiel.d.ts +32 -50
  706. package/dist/v2/models/referentiel.d.ts.map +1 -1
  707. package/dist/v2/models/referentiel.js.map +1 -1
  708. package/dist/v2/models/savedFilter.d.ts +8 -17
  709. package/dist/v2/models/savedFilter.d.ts.map +1 -1
  710. package/dist/v2/models/savedFilter.js.map +1 -1
  711. package/dist/v2/patterns/ActionBar.js +152 -187
  712. package/dist/v2/patterns/ActionBar.js.map +1 -1
  713. package/dist/v2/patterns/AppMain.d.ts +109 -0
  714. package/dist/v2/patterns/AppMain.d.ts.map +1 -0
  715. package/dist/v2/patterns/AppMain.js +115 -0
  716. package/dist/v2/patterns/AppMain.js.map +1 -0
  717. package/dist/v2/patterns/BulkActionBar.js +40 -42
  718. package/dist/v2/patterns/BulkActionBar.js.map +1 -1
  719. package/dist/v2/patterns/ChartFigure.d.ts +124 -0
  720. package/dist/v2/patterns/ChartFigure.d.ts.map +1 -0
  721. package/dist/v2/patterns/ChartFigure.js +159 -0
  722. package/dist/v2/patterns/ChartFigure.js.map +1 -0
  723. package/dist/v2/patterns/CollapsibleDataGrid.js +138 -174
  724. package/dist/v2/patterns/CollapsibleDataGrid.js.map +1 -1
  725. package/dist/v2/patterns/ColumnsToggle.js +60 -94
  726. package/dist/v2/patterns/ColumnsToggle.js.map +1 -1
  727. package/dist/v2/patterns/DataGrid.d.ts.map +1 -1
  728. package/dist/v2/patterns/DataGrid.js +262 -297
  729. package/dist/v2/patterns/DataGrid.js.map +1 -1
  730. package/dist/v2/patterns/DataGridSettingsMenu.d.ts +12 -0
  731. package/dist/v2/patterns/DataGridSettingsMenu.d.ts.map +1 -1
  732. package/dist/v2/patterns/DataGridSettingsMenu.js +104 -121
  733. package/dist/v2/patterns/DataGridSettingsMenu.js.map +1 -1
  734. package/dist/v2/patterns/DataGridToolbar.js +103 -106
  735. package/dist/v2/patterns/DataGridToolbar.js.map +1 -1
  736. package/dist/v2/patterns/DataGridVirtualized.js +179 -217
  737. package/dist/v2/patterns/DataGridVirtualized.js.map +1 -1
  738. package/dist/v2/patterns/DeleteResourceConfirmDialog.js +32 -35
  739. package/dist/v2/patterns/DeleteResourceConfirmDialog.js.map +1 -1
  740. package/dist/v2/patterns/DetailSplit.d.ts +87 -0
  741. package/dist/v2/patterns/DetailSplit.d.ts.map +1 -0
  742. package/dist/v2/patterns/DetailSplit.js +116 -0
  743. package/dist/v2/patterns/DetailSplit.js.map +1 -0
  744. package/dist/v2/patterns/FavoriteColumn.js +22 -23
  745. package/dist/v2/patterns/FavoriteColumn.js.map +1 -1
  746. package/dist/v2/patterns/FavoritesFilter.js +36 -44
  747. package/dist/v2/patterns/FavoritesFilter.js.map +1 -1
  748. package/dist/v2/patterns/FilterTabBar.d.ts +28 -0
  749. package/dist/v2/patterns/FilterTabBar.d.ts.map +1 -0
  750. package/dist/v2/patterns/FilterTabBar.js +120 -0
  751. package/dist/v2/patterns/FilterTabBar.js.map +1 -0
  752. package/dist/v2/patterns/FormErrorSummary.js +20 -23
  753. package/dist/v2/patterns/FormErrorSummary.js.map +1 -1
  754. package/dist/v2/patterns/FormPageShell.js +53 -50
  755. package/dist/v2/patterns/FormPageShell.js.map +1 -1
  756. package/dist/v2/patterns/FormSection.d.ts +8 -3
  757. package/dist/v2/patterns/FormSection.d.ts.map +1 -1
  758. package/dist/v2/patterns/FormSection.js +44 -51
  759. package/dist/v2/patterns/FormSection.js.map +1 -1
  760. package/dist/v2/patterns/FormikCheckbox.js +36 -45
  761. package/dist/v2/patterns/FormikCheckbox.js.map +1 -1
  762. package/dist/v2/patterns/FormikCheckboxGroup.d.ts +17 -1
  763. package/dist/v2/patterns/FormikCheckboxGroup.d.ts.map +1 -1
  764. package/dist/v2/patterns/FormikCheckboxGroup.js +62 -65
  765. package/dist/v2/patterns/FormikCheckboxGroup.js.map +1 -1
  766. package/dist/v2/patterns/FormikCombobox.js +55 -72
  767. package/dist/v2/patterns/FormikCombobox.js.map +1 -1
  768. package/dist/v2/patterns/FormikDatePicker.js +50 -64
  769. package/dist/v2/patterns/FormikDatePicker.js.map +1 -1
  770. package/dist/v2/patterns/FormikDateTimePicker.js +50 -64
  771. package/dist/v2/patterns/FormikDateTimePicker.js.map +1 -1
  772. package/dist/v2/patterns/FormikErrorFocus.js +25 -26
  773. package/dist/v2/patterns/FormikErrorFocus.js.map +1 -1
  774. package/dist/v2/patterns/FormikErrorSummary.d.ts +74 -0
  775. package/dist/v2/patterns/FormikErrorSummary.d.ts.map +1 -0
  776. package/dist/v2/patterns/FormikErrorSummary.js +97 -0
  777. package/dist/v2/patterns/FormikErrorSummary.js.map +1 -0
  778. package/dist/v2/patterns/FormikFile.d.ts +14 -1
  779. package/dist/v2/patterns/FormikFile.d.ts.map +1 -1
  780. package/dist/v2/patterns/FormikFile.js +99 -83
  781. package/dist/v2/patterns/FormikFile.js.map +1 -1
  782. package/dist/v2/patterns/FormikInput.js +45 -58
  783. package/dist/v2/patterns/FormikInput.js.map +1 -1
  784. package/dist/v2/patterns/FormikRadioGroup.js +45 -56
  785. package/dist/v2/patterns/FormikRadioGroup.js.map +1 -1
  786. package/dist/v2/patterns/FormikReferentielField.d.ts +12 -1
  787. package/dist/v2/patterns/FormikReferentielField.d.ts.map +1 -1
  788. package/dist/v2/patterns/FormikReferentielField.js +54 -64
  789. package/dist/v2/patterns/FormikReferentielField.js.map +1 -1
  790. package/dist/v2/patterns/FormikSelect.js +70 -92
  791. package/dist/v2/patterns/FormikSelect.js.map +1 -1
  792. package/dist/v2/patterns/FormikTextarea.js +35 -51
  793. package/dist/v2/patterns/FormikTextarea.js.map +1 -1
  794. package/dist/v2/patterns/KeyboardShortcutsHelp.js +60 -80
  795. package/dist/v2/patterns/KeyboardShortcutsHelp.js.map +1 -1
  796. package/dist/v2/patterns/NetworkErrorBanner.js +13 -16
  797. package/dist/v2/patterns/NetworkErrorBanner.js.map +1 -1
  798. package/dist/v2/patterns/PageContent.js +17 -20
  799. package/dist/v2/patterns/PageContent.js.map +1 -1
  800. package/dist/v2/patterns/PreviewDrawer.d.ts +49 -0
  801. package/dist/v2/patterns/PreviewDrawer.d.ts.map +1 -0
  802. package/dist/v2/patterns/PreviewDrawer.js +159 -0
  803. package/dist/v2/patterns/PreviewDrawer.js.map +1 -0
  804. package/dist/v2/patterns/ReferentielField.d.ts +86 -2
  805. package/dist/v2/patterns/ReferentielField.d.ts.map +1 -1
  806. package/dist/v2/patterns/ReferentielField.js +347 -327
  807. package/dist/v2/patterns/ReferentielField.js.map +1 -1
  808. package/dist/v2/patterns/RowFavoriteToggle.d.ts +6 -0
  809. package/dist/v2/patterns/RowFavoriteToggle.d.ts.map +1 -1
  810. package/dist/v2/patterns/RowFavoriteToggle.js +38 -30
  811. package/dist/v2/patterns/RowFavoriteToggle.js.map +1 -1
  812. package/dist/v2/patterns/SaveFilterDialog.js +50 -77
  813. package/dist/v2/patterns/SaveFilterDialog.js.map +1 -1
  814. package/dist/v2/patterns/SavedFiltersMenu.js +89 -107
  815. package/dist/v2/patterns/SavedFiltersMenu.js.map +1 -1
  816. package/dist/v2/patterns/SkeletonPageShell.js +122 -143
  817. package/dist/v2/patterns/SkeletonPageShell.js.map +1 -1
  818. package/dist/v2/patterns/SortableHeader.js +35 -57
  819. package/dist/v2/patterns/SortableHeader.js.map +1 -1
  820. package/dist/v2/patterns/Tour.js +121 -142
  821. package/dist/v2/patterns/Tour.js.map +1 -1
  822. package/dist/v2/patterns/_dataGridShared.d.ts.map +1 -1
  823. package/dist/v2/patterns/_dataGridShared.js +131 -147
  824. package/dist/v2/patterns/_dataGridShared.js.map +1 -1
  825. package/dist/v2/patterns/_pickerSerialisation.js +9 -10
  826. package/dist/v2/patterns/_pickerSerialisation.js.map +1 -1
  827. package/dist/v2/patterns/_sort.js +17 -33
  828. package/dist/v2/patterns/_sort.js.map +1 -1
  829. package/dist/v2/patterns/_useColumnReorder.js +124 -163
  830. package/dist/v2/patterns/_useColumnReorder.js.map +1 -1
  831. package/dist/v2/patterns/_useColumnResize.js +80 -99
  832. package/dist/v2/patterns/_useColumnResize.js.map +1 -1
  833. package/dist/v2/patterns/filterCriteria.d.ts +78 -0
  834. package/dist/v2/patterns/filterCriteria.d.ts.map +1 -0
  835. package/dist/v2/patterns/filterCriteria.js +110 -0
  836. package/dist/v2/patterns/filterCriteria.js.map +1 -0
  837. package/dist/v2/patterns/index.d.ts +160 -0
  838. package/dist/v2/patterns/index.d.ts.map +1 -1
  839. package/dist/v2/patterns/index.js +157 -79
  840. package/dist/v2/patterns/index.js.map +1 -1
  841. package/dist/v2/patterns/rowActions.d.ts +150 -0
  842. package/dist/v2/patterns/rowActions.d.ts.map +1 -0
  843. package/dist/v2/patterns/rowActions.js +232 -0
  844. package/dist/v2/patterns/rowActions.js.map +1 -0
  845. package/dist/v2/personalization/PersonalizationProvider.d.ts.map +1 -1
  846. package/dist/v2/personalization/PersonalizationProvider.js +57 -53
  847. package/dist/v2/personalization/PersonalizationProvider.js.map +1 -1
  848. package/dist/v2/personalization/adapters/_storageKey.js +5 -5
  849. package/dist/v2/personalization/adapters/_storageKey.js.map +1 -1
  850. package/dist/v2/personalization/adapters/createLocalStorageAdapter.js +25 -24
  851. package/dist/v2/personalization/adapters/createLocalStorageAdapter.js.map +1 -1
  852. package/dist/v2/personalization/adapters/createMemoryAdapter.js +14 -14
  853. package/dist/v2/personalization/adapters/createMemoryAdapter.js.map +1 -1
  854. package/dist/v2/personalization/adapters/index.js +5 -5
  855. package/dist/v2/personalization/adapters/index.js.map +1 -1
  856. package/dist/v2/personalization/capabilities/favorites.js +39 -62
  857. package/dist/v2/personalization/capabilities/favorites.js.map +1 -1
  858. package/dist/v2/personalization/capabilities/favoritesView.js +25 -37
  859. package/dist/v2/personalization/capabilities/favoritesView.js.map +1 -1
  860. package/dist/v2/personalization/capabilities/gridPreferences.js +31 -36
  861. package/dist/v2/personalization/capabilities/gridPreferences.js.map +1 -1
  862. package/dist/v2/personalization/capabilities/index.js +12 -12
  863. package/dist/v2/personalization/capabilities/reviveSavedCriteria.d.ts +88 -0
  864. package/dist/v2/personalization/capabilities/reviveSavedCriteria.d.ts.map +1 -0
  865. package/dist/v2/personalization/capabilities/reviveSavedCriteria.js +126 -0
  866. package/dist/v2/personalization/capabilities/reviveSavedCriteria.js.map +1 -0
  867. package/dist/v2/personalization/capabilities/savedFilters.js +93 -100
  868. package/dist/v2/personalization/capabilities/savedFilters.js.map +1 -1
  869. package/dist/v2/personalization/createPersonalizationStore.d.ts.map +1 -1
  870. package/dist/v2/personalization/createPersonalizationStore.js +81 -182
  871. package/dist/v2/personalization/createPersonalizationStore.js.map +1 -1
  872. package/dist/v2/personalization/index.d.ts +16 -0
  873. package/dist/v2/personalization/index.d.ts.map +1 -1
  874. package/dist/v2/personalization/index.js +30 -23
  875. package/dist/v2/personalization/index.js.map +1 -1
  876. package/dist/v2/personalization/personalizationContext.js +10 -12
  877. package/dist/v2/personalization/personalizationContext.js.map +1 -1
  878. package/dist/v2/personalization/schema.js +8 -9
  879. package/dist/v2/personalization/schema.js.map +1 -1
  880. package/dist/v2/referentiel/ReferentielProvider.js +31 -45
  881. package/dist/v2/referentiel/ReferentielProvider.js.map +1 -1
  882. package/dist/v2/referentiel/index.js +11 -13
  883. package/dist/v2/referentiel/index.js.map +1 -1
  884. package/dist/v2/referentiel/types.d.ts +105 -0
  885. package/dist/v2/referentiel/types.d.ts.map +1 -0
  886. package/dist/v2/referentiel/types.js +6 -0
  887. package/dist/v2/referentiel/types.js.map +1 -0
  888. package/dist/v2/referentiel/useReferentielClient.js +13 -16
  889. package/dist/v2/referentiel/useReferentielClient.js.map +1 -1
  890. package/dist/v2/referentiel/useReferentielOptions.d.ts +7 -17
  891. package/dist/v2/referentiel/useReferentielOptions.d.ts.map +1 -1
  892. package/dist/v2/referentiel/useReferentielOptions.js +63 -120
  893. package/dist/v2/referentiel/useReferentielOptions.js.map +1 -1
  894. package/dist/v2/referentiel/useReferentielSearch.d.ts +7 -48
  895. package/dist/v2/referentiel/useReferentielSearch.d.ts.map +1 -1
  896. package/dist/v2/referentiel/useReferentielSearch.js +40 -95
  897. package/dist/v2/referentiel/useReferentielSearch.js.map +1 -1
  898. package/dist/v2/theme/_brand.js +12 -26
  899. package/dist/v2/theme/_brand.js.map +1 -1
  900. package/dist/v2/theme/_brandSecondary.js +12 -26
  901. package/dist/v2/theme/_brandSecondary.js.map +1 -1
  902. package/dist/v2/theme/createPortnetTheme.js +41 -49
  903. package/dist/v2/theme/createPortnetTheme.js.map +1 -1
  904. package/dist/v2/theme/cssVariables.d.ts +3 -3
  905. package/dist/v2/theme/cssVariables.d.ts.map +1 -1
  906. package/dist/v2/theme/cssVariables.js +65 -70
  907. package/dist/v2/theme/cssVariables.js.map +1 -1
  908. package/dist/v2/theme/index.js +10 -10
  909. package/dist/v2/theme/index.js.map +1 -1
  910. package/dist/v2/tokens/breakpoints.js +16 -16
  911. package/dist/v2/tokens/breakpoints.js.map +1 -1
  912. package/dist/v2/tokens/chart.d.ts +103 -0
  913. package/dist/v2/tokens/chart.d.ts.map +1 -0
  914. package/dist/v2/tokens/chart.js +270 -0
  915. package/dist/v2/tokens/chart.js.map +1 -0
  916. package/dist/v2/tokens/colors.js +24 -24
  917. package/dist/v2/tokens/colors.js.map +1 -1
  918. package/dist/v2/tokens/density.d.ts +104 -0
  919. package/dist/v2/tokens/density.d.ts.map +1 -1
  920. package/dist/v2/tokens/density.js +67 -12
  921. package/dist/v2/tokens/density.js.map +1 -1
  922. package/dist/v2/tokens/index.d.ts +50 -1
  923. package/dist/v2/tokens/index.d.ts.map +1 -1
  924. package/dist/v2/tokens/index.js +116 -68
  925. package/dist/v2/tokens/index.js.map +1 -1
  926. package/dist/v2/tokens/motion.js +16 -22
  927. package/dist/v2/tokens/motion.js.map +1 -1
  928. package/dist/v2/tokens/radius.js +3 -3
  929. package/dist/v2/tokens/radius.js.map +1 -1
  930. package/dist/v2/tokens/shadows.js +8 -8
  931. package/dist/v2/tokens/shadows.js.map +1 -1
  932. package/dist/v2/tokens/spacing.js +4 -4
  933. package/dist/v2/tokens/spacing.js.map +1 -1
  934. package/dist/v2/tokens/state.js +3 -3
  935. package/dist/v2/tokens/state.js.map +1 -1
  936. package/dist/v2/tokens/statusPalette.js +21 -23
  937. package/dist/v2/tokens/statusPalette.js.map +1 -1
  938. package/dist/v2/tokens/tokens.json +6 -1
  939. package/dist/v2/tokens/typography.js +15 -15
  940. package/dist/v2/tokens/typography.js.map +1 -1
  941. package/dist/v2/tokens/zIndex.js +3 -3
  942. package/dist/v2/tokens/zIndex.js.map +1 -1
  943. package/dist/v2/types/datagrid.d.ts +9 -1
  944. package/dist/v2/types/datagrid.d.ts.map +1 -1
  945. package/dist/v2/types/datagrid.js.map +1 -1
  946. package/dist/v2/types/index.js +2 -2
  947. package/dist/v2/types/index.js.map +1 -1
  948. package/dist/v2/utils/apiError.js +16 -37
  949. package/dist/v2/utils/apiError.js.map +1 -1
  950. package/dist/v2/utils/contrast.js +31 -32
  951. package/dist/v2/utils/contrast.js.map +1 -1
  952. package/dist/v2/utils/cx.js +7 -27
  953. package/dist/v2/utils/cx.js.map +1 -1
  954. package/dist/v2/utils/fileDownload.js +25 -28
  955. package/dist/v2/utils/fileDownload.js.map +1 -1
  956. package/dist/v2/utils/fileValidation.d.ts +116 -0
  957. package/dist/v2/utils/fileValidation.d.ts.map +1 -0
  958. package/dist/v2/utils/fileValidation.js +220 -0
  959. package/dist/v2/utils/fileValidation.js.map +1 -0
  960. package/dist/v2/utils/fmtDate.d.ts +103 -0
  961. package/dist/v2/utils/fmtDate.d.ts.map +1 -0
  962. package/dist/v2/utils/fmtDate.js +119 -0
  963. package/dist/v2/utils/fmtDate.js.map +1 -0
  964. package/dist/v2/utils/fmtMoney.d.ts +3 -3
  965. package/dist/v2/utils/fmtMoney.d.ts.map +1 -1
  966. package/dist/v2/utils/fmtMoney.js +9 -11
  967. package/dist/v2/utils/fmtMoney.js.map +1 -1
  968. package/dist/v2/utils/formikErrors.d.ts +67 -0
  969. package/dist/v2/utils/formikErrors.d.ts.map +1 -0
  970. package/dist/v2/utils/formikErrors.js +85 -0
  971. package/dist/v2/utils/formikErrors.js.map +1 -0
  972. package/dist/v2/utils/index.d.ts +5 -0
  973. package/dist/v2/utils/index.d.ts.map +1 -1
  974. package/dist/v2/utils/index.js +67 -18
  975. package/dist/v2/utils/index.js.map +1 -1
  976. package/dist/v2/utils/mergeLabels.js +9 -14
  977. package/dist/v2/utils/mergeLabels.js.map +1 -1
  978. package/dist/v2/utils/networkStatus.js +14 -14
  979. package/dist/v2/utils/networkStatus.js.map +1 -1
  980. package/package.json +26 -9
@@ -1 +1 @@
1
- {"version":3,"file":"contrast-palette.test.js","names":["_contrast","require","_tokens","_slicedToArray","arr","i","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","TypeError","o","minLen","_arrayLikeToArray","n","Object","prototype","toString","call","slice","constructor","name","Array","from","test","len","length","arr2","_i","Symbol","iterator","_s","_e","_x","_r","_arr","_n","_d","next","done","push","value","err","isArray","LIGHT_SURFACES","surface","bgElev","bg","bgSubtle","describe","_loop","_LIGHT_SURFACES$_i","_LIGHT_SURFACES","concat","expect","passesContrast","contrastRatio","ink","fg","toBe","fgMuted","fgInverse","dark","pairs","semantic","successFg","successSoft","warningFg","warningSoft","dangerFg","dangerSoft","infoFg","infoSoft","_loop2","_pairs$_i","_pairs","_i2","soft","_loop3","key","_arr2","_i3","_status$key","status","keys","saturated","success","warning","danger","info","_loop4","_saturated$_i","_saturated","_i4","colour","brand","accent","accentFg","accentHover","_loop5","_arr3","_i5","ratio","fgSubtle","not","toBeNull","toBeLessThan","WCAG_AA_NORMAL","toBeGreaterThan","border","borderStrong","WCAG_AA_UI_NON_TEXT","brandSecondary","secondaryFg","secondary"],"sources":["../../../src/lib/v2/__tests__/contrast-palette.test.ts"],"sourcesContent":["import {\r\n contrastRatio,\r\n passesContrast,\r\n WCAG_AA_NORMAL,\r\n WCAG_AA_UI_NON_TEXT,\r\n} from \"../utils/contrast\";\r\nimport { ink, surface, border, semantic, status, brand, brandSecondary, dark } from \"../tokens\";\r\n\r\n/**\r\n * Token-palette contrast certification (Charter §05.1 / WCAG 2.1 AA).\r\n *\r\n * WHY THIS FILE EXISTS\r\n * --------------------\r\n * R-C.1 / R-C.2 / R-C.3 are MUST rules, and until now nothing verified them.\r\n * `utils/contrast.ts` shipped a correct WCAG ratio implementation and had no\r\n * test asserting the palette it exists to check; the ratios in `colors.ts` were\r\n * hand-written COMMENTS, unenforced — exactly the class of claim that drifts\r\n * silently when a hue is nudged.\r\n *\r\n * Contrast is one of the few a11y rules that is fully computable without a\r\n * browser, so it belongs in CI rather than in a manual audit pass.\r\n *\r\n * Found by writing it: `fgSubtle` on `bgSubtle` is ~4.32:1 — BELOW AA. See the\r\n * documented-failure block at the bottom; that is a real finding, not a test\r\n * artefact.\r\n */\r\n\r\n/** Every light-mode surface that body text can land on. */\r\nconst LIGHT_SURFACES: Array<[string, string]> = [\r\n [\"surface\", surface.surface],\r\n [\"bgElev\", surface.bgElev],\r\n [\"bg\", surface.bg],\r\n [\"bgSubtle\", surface.bgSubtle],\r\n];\r\n\r\ndescribe(\"Token palette — WCAG AA contrast (R-C.1 / R-C.2 / R-C.3)\", () => {\r\n describe(\"ink on light surfaces — normal text ≥ 4.5:1\", () => {\r\n for (const [name, bg] of LIGHT_SURFACES) {\r\n test(`fg on ${name}`, () => {\r\n expect(passesContrast(contrastRatio(ink.fg, bg), \"normal\")).toBe(true);\r\n });\r\n test(`fgMuted on ${name}`, () => {\r\n expect(passesContrast(contrastRatio(ink.fgMuted, bg), \"normal\")).toBe(true);\r\n });\r\n }\r\n\r\n test(\"fgInverse on the darkest dark surface\", () => {\r\n expect(passesContrast(contrastRatio(ink.fgInverse, dark.bg), \"normal\")).toBe(true);\r\n });\r\n });\r\n\r\n describe(\"semantic fg — readable on white AND on its own soft fill\", () => {\r\n const pairs: Array<[string, string, string]> = [\r\n [\"success\", semantic.successFg, semantic.successSoft],\r\n [\"warning\", semantic.warningFg, semantic.warningSoft],\r\n [\"danger\", semantic.dangerFg, semantic.dangerSoft],\r\n [\"info\", semantic.infoFg, semantic.infoSoft],\r\n ];\r\n for (const [name, fg, soft] of pairs) {\r\n test(`${name}Fg on white`, () => {\r\n expect(passesContrast(contrastRatio(fg, \"#FFFFFF\"), \"normal\")).toBe(true);\r\n });\r\n test(`${name}Fg on ${name}Soft`, () => {\r\n expect(passesContrast(contrastRatio(fg, soft), \"normal\")).toBe(true);\r\n });\r\n }\r\n });\r\n\r\n /**\r\n * The Charter's promise in §02.1: \"Combinaison background -soft +\r\n * foreground -fg = AA garanti.\" This is that promise, enforced.\r\n */\r\n describe(\"status palette — every -fg on its own -soft is AA (§02.1)\", () => {\r\n for (const key of Object.keys(status) as Array<keyof typeof status>) {\r\n test(`status.${key}`, () => {\r\n const { soft, fg } = status[key];\r\n expect(passesContrast(contrastRatio(fg, soft), \"normal\")).toBe(true);\r\n });\r\n test(`status.${key} fg on white`, () => {\r\n expect(passesContrast(contrastRatio(status[key].fg, \"#FFFFFF\"), \"normal\")).toBe(true);\r\n });\r\n }\r\n });\r\n\r\n describe(\"non-text UI ≥ 3:1 (WCAG 1.4.11 / R-C.3)\", () => {\r\n const saturated: Array<[string, string]> = [\r\n [\"success\", semantic.success],\r\n [\"warning\", semantic.warning],\r\n [\"danger\", semantic.danger],\r\n [\"info\", semantic.info],\r\n ];\r\n for (const [name, colour] of saturated) {\r\n test(`${name} (icon / border grade) on white`, () => {\r\n expect(passesContrast(contrastRatio(colour, \"#FFFFFF\"), \"ui\")).toBe(true);\r\n });\r\n }\r\n });\r\n\r\n describe(\"brand\", () => {\r\n test(\"accent on white is AA for normal text\", () => {\r\n expect(passesContrast(contrastRatio(brand.accent, \"#FFFFFF\"), \"normal\")).toBe(true);\r\n });\r\n test(\"accentFg on accent — the primary-button pair\", () => {\r\n expect(passesContrast(contrastRatio(brand.accentFg, brand.accent), \"normal\")).toBe(true);\r\n });\r\n test(\"accentHover keeps AA against accentFg (pressed state stays readable)\", () => {\r\n expect(passesContrast(contrastRatio(brand.accentFg, brand.accentHover), \"normal\")).toBe(true);\r\n });\r\n });\r\n\r\n describe(\"dark mode\", () => {\r\n test(\"dark.fg on dark.surface\", () => {\r\n expect(passesContrast(contrastRatio(dark.fg, dark.surface), \"normal\")).toBe(true);\r\n });\r\n test(\"dark.fgMuted on dark.surface\", () => {\r\n expect(passesContrast(contrastRatio(dark.fgMuted, dark.surface), \"normal\")).toBe(true);\r\n });\r\n for (const key of Object.keys(dark.status) as Array<keyof typeof dark.status>) {\r\n test(`dark status.${key}.fg on dark.surface`, () => {\r\n expect(\r\n passesContrast(contrastRatio(dark.status[key].fg, dark.surface), \"normal\")\r\n ).toBe(true);\r\n });\r\n }\r\n });\r\n\r\n /* ══════════════════════════════════════════════════════════════════\r\n * DOCUMENTED FAILURES — asserted at their MEASURED value, not at the\r\n * threshold, so the suite stays green while the breach stays visible and\r\n * any drift shows up as a diff. Both need a palette decision, not a\r\n * test change.\r\n * ══════════════════════════════════════════════════════════════════ */\r\n describe(\"KNOWN AA FAILURES (documented, pending decision)\", () => {\r\n /**\r\n * A9-01 — `fgSubtle` on `bgSubtle` ≈ 4.32:1, below the 4.5 floor.\r\n *\r\n * `colors.ts` documents fgSubtle as \"AA · 4.81:1 on white — incidental\r\n * text only (WCAG 1.4.6)\". On white that holds. On `bgSubtle` it does not,\r\n * and the exemption does not rescue it, because fgSubtle is NOT used only\r\n * for incidental text — it colours KV eyebrow labels, section captions and\r\n * hero stat labels, all of which name the value beside them.\r\n *\r\n * LIVE BREACH: both preview drawers put `--fg-subtle` labels on a\r\n * `--bg-subtle` hero panel (dfd `GestionDFDPreviewDrawer` HERO_BOX_STYLE +\r\n * HERO_LABEL_STYLE, ti `GestionTIPreviewDrawer` HERO_STAT_LABEL_STYLE), at\r\n * `--text-xs` (12px) — too small to qualify as large text, so the 4.5\r\n * floor applies.\r\n *\r\n * FIX OPTIONS: darken fgSubtle (affects the muted/subtle hierarchy\r\n * fleet-wide), or switch those labels to `--fg-muted` (AAA, 7.5:1 on\r\n * bgSubtle) which is what every other label surface already uses.\r\n */\r\n test(\"fgSubtle on bgSubtle is BELOW AA — ~4.32:1\", () => {\r\n const ratio = contrastRatio(ink.fgSubtle, surface.bgSubtle);\r\n expect(ratio).not.toBeNull();\r\n expect(ratio as number).toBeLessThan(WCAG_AA_NORMAL);\r\n expect(ratio as number).toBeGreaterThan(4.2);\r\n // It DOES pass on white — the failure is surface-specific.\r\n expect(passesContrast(contrastRatio(ink.fgSubtle, \"#FFFFFF\"), \"normal\")).toBe(true);\r\n });\r\n\r\n /**\r\n * A9-02 — `borderStrong` ≈ 2.87:1 on white. BELOW the 3:1 non-text floor.\r\n *\r\n * ⚠️ The token's own comment in `colors.ts` reads:\r\n * borderStrong: \"#9099AA\", // WCAG 1.4.11 · ≥ 3:1 against white\r\n * That claim is FALSE. This is precisely the drift this file exists to\r\n * catch — an unenforced hand-written ratio that nobody re-derived.\r\n *\r\n * IMPACT depends on usage. `--border-strong` currently colours the\r\n * scrollbar thumb (`base.css`) and the `kbd` bottom edge in\r\n * KeyboardShortcutsHelp. If it is ever used for an INPUT border or any\r\n * other control boundary, 1.4.11 applies and the breach is live — audit\r\n * usage before deciding severity.\r\n *\r\n * FIX: darken to relative luminance ≤ 0.30 (currently 0.316). Roughly\r\n * #868FA3 / #8A92A5; change the token and this assertion flips to the\r\n * `passesContrast(..., \"ui\")` form.\r\n */\r\n test(\"borderStrong on white is BELOW 3:1 — ~2.87:1 (comment in colors.ts is wrong)\", () => {\r\n const ratio = contrastRatio(border.borderStrong, \"#FFFFFF\");\r\n expect(ratio).not.toBeNull();\r\n expect(ratio as number).toBeLessThan(WCAG_AA_UI_NON_TEXT);\r\n expect(ratio as number).toBeGreaterThan(2.8);\r\n });\r\n\r\n /**\r\n * A9-03 — `dark.borderStrong` ≈ 2.28:1 on `dark.surface`. Worse than the\r\n * light-mode equivalent, and the same 1.4.11 floor applies in dark mode.\r\n *\r\n * FIX: lighten to relative luminance ≥ 0.119 (currently 0.078) — roughly\r\n * #5C6478 or lighter. Note dark mode is currently UNREACHABLE in both\r\n * consuming modules (neither sets `[data-theme=\"dark\"]` on <html>), which\r\n * is why nobody has seen it — see the RGESN R-9.5 note in the handover.\r\n */\r\n test(\"dark.borderStrong on dark.surface is BELOW 3:1 — ~2.28:1\", () => {\r\n const ratio = contrastRatio(dark.borderStrong, dark.surface);\r\n expect(ratio).not.toBeNull();\r\n expect(ratio as number).toBeLessThan(WCAG_AA_UI_NON_TEXT);\r\n expect(ratio as number).toBeGreaterThan(2.2);\r\n });\r\n\r\n /**\r\n * Already flagged in colors.ts itself: secondaryFg (#FFFFFF) on\r\n * secondary (#4FB8CF) ≈ 1.96:1. The token comment restricts it to\r\n * chip/badge surfaces and non-text accent fills. Asserted here so the\r\n * restriction is machine-checked rather than comment-only: it fails BOTH\r\n * the text floor and the 3:1 non-text floor.\r\n */\r\n test(\"brandSecondary text pair is BELOW AA and below 3:1 — fills only\", () => {\r\n const ratio = contrastRatio(brandSecondary.secondaryFg, brandSecondary.secondary);\r\n expect(ratio).not.toBeNull();\r\n expect(ratio as number).toBeLessThan(WCAG_AA_UI_NON_TEXT);\r\n });\r\n });\r\n});\r\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"contrast-palette.test.js","names":["_contrast","require","_tokens","LIGHT_SURFACES","surface","bgElev","bg","bgSubtle","describe","name","test","expect","passesContrast","contrastRatio","ink","fg","toBe","fgMuted","fgInverse","dark","pairs","semantic","successFg","successSoft","warningFg","warningSoft","dangerFg","dangerSoft","infoFg","infoSoft","soft","key","Object","keys","status","saturated","success","warning","danger","info","colour","brand","accent","accentFg","accentHover","ratio","fgSubtle","not","toBeNull","toBeLessThan","WCAG_AA_NORMAL","toBeGreaterThan","border","borderStrong","WCAG_AA_UI_NON_TEXT","brandSecondary","secondaryFg","secondary"],"sources":["../../../src/lib/v2/__tests__/contrast-palette.test.ts"],"sourcesContent":["import {\r\n contrastRatio,\r\n passesContrast,\r\n WCAG_AA_NORMAL,\r\n WCAG_AA_UI_NON_TEXT,\r\n} from \"../utils/contrast\";\r\nimport { ink, surface, border, semantic, status, brand, brandSecondary, dark } from \"../tokens\";\r\n\r\n/**\r\n * Token-palette contrast certification (Charter §05.1 / WCAG 2.1 AA).\r\n *\r\n * WHY THIS FILE EXISTS\r\n * --------------------\r\n * R-C.1 / R-C.2 / R-C.3 are MUST rules, and until now nothing verified them.\r\n * `utils/contrast.ts` shipped a correct WCAG ratio implementation and had no\r\n * test asserting the palette it exists to check; the ratios in `colors.ts` were\r\n * hand-written COMMENTS, unenforced — exactly the class of claim that drifts\r\n * silently when a hue is nudged.\r\n *\r\n * Contrast is one of the few a11y rules that is fully computable without a\r\n * browser, so it belongs in CI rather than in a manual audit pass.\r\n *\r\n * Found by writing it: `fgSubtle` on `bgSubtle` is ~4.32:1 — BELOW AA. See the\r\n * documented-failure block at the bottom; that is a real finding, not a test\r\n * artefact.\r\n */\r\n\r\n/** Every light-mode surface that body text can land on. */\r\nconst LIGHT_SURFACES: Array<[string, string]> = [\r\n [\"surface\", surface.surface],\r\n [\"bgElev\", surface.bgElev],\r\n [\"bg\", surface.bg],\r\n [\"bgSubtle\", surface.bgSubtle],\r\n];\r\n\r\ndescribe(\"Token palette — WCAG AA contrast (R-C.1 / R-C.2 / R-C.3)\", () => {\r\n describe(\"ink on light surfaces — normal text ≥ 4.5:1\", () => {\r\n for (const [name, bg] of LIGHT_SURFACES) {\r\n test(`fg on ${name}`, () => {\r\n expect(passesContrast(contrastRatio(ink.fg, bg), \"normal\")).toBe(true);\r\n });\r\n test(`fgMuted on ${name}`, () => {\r\n expect(passesContrast(contrastRatio(ink.fgMuted, bg), \"normal\")).toBe(true);\r\n });\r\n }\r\n\r\n test(\"fgInverse on the darkest dark surface\", () => {\r\n expect(passesContrast(contrastRatio(ink.fgInverse, dark.bg), \"normal\")).toBe(true);\r\n });\r\n });\r\n\r\n describe(\"semantic fg — readable on white AND on its own soft fill\", () => {\r\n const pairs: Array<[string, string, string]> = [\r\n [\"success\", semantic.successFg, semantic.successSoft],\r\n [\"warning\", semantic.warningFg, semantic.warningSoft],\r\n [\"danger\", semantic.dangerFg, semantic.dangerSoft],\r\n [\"info\", semantic.infoFg, semantic.infoSoft],\r\n ];\r\n for (const [name, fg, soft] of pairs) {\r\n test(`${name}Fg on white`, () => {\r\n expect(passesContrast(contrastRatio(fg, \"#FFFFFF\"), \"normal\")).toBe(true);\r\n });\r\n test(`${name}Fg on ${name}Soft`, () => {\r\n expect(passesContrast(contrastRatio(fg, soft), \"normal\")).toBe(true);\r\n });\r\n }\r\n });\r\n\r\n /**\r\n * The Charter's promise in §02.1: \"Combinaison background -soft +\r\n * foreground -fg = AA garanti.\" This is that promise, enforced.\r\n */\r\n describe(\"status palette — every -fg on its own -soft is AA (§02.1)\", () => {\r\n for (const key of Object.keys(status) as Array<keyof typeof status>) {\r\n test(`status.${key}`, () => {\r\n const { soft, fg } = status[key];\r\n expect(passesContrast(contrastRatio(fg, soft), \"normal\")).toBe(true);\r\n });\r\n test(`status.${key} fg on white`, () => {\r\n expect(passesContrast(contrastRatio(status[key].fg, \"#FFFFFF\"), \"normal\")).toBe(true);\r\n });\r\n }\r\n });\r\n\r\n describe(\"non-text UI ≥ 3:1 (WCAG 1.4.11 / R-C.3)\", () => {\r\n const saturated: Array<[string, string]> = [\r\n [\"success\", semantic.success],\r\n [\"warning\", semantic.warning],\r\n [\"danger\", semantic.danger],\r\n [\"info\", semantic.info],\r\n ];\r\n for (const [name, colour] of saturated) {\r\n test(`${name} (icon / border grade) on white`, () => {\r\n expect(passesContrast(contrastRatio(colour, \"#FFFFFF\"), \"ui\")).toBe(true);\r\n });\r\n }\r\n });\r\n\r\n describe(\"brand\", () => {\r\n test(\"accent on white is AA for normal text\", () => {\r\n expect(passesContrast(contrastRatio(brand.accent, \"#FFFFFF\"), \"normal\")).toBe(true);\r\n });\r\n test(\"accentFg on accent — the primary-button pair\", () => {\r\n expect(passesContrast(contrastRatio(brand.accentFg, brand.accent), \"normal\")).toBe(true);\r\n });\r\n test(\"accentHover keeps AA against accentFg (pressed state stays readable)\", () => {\r\n expect(passesContrast(contrastRatio(brand.accentFg, brand.accentHover), \"normal\")).toBe(true);\r\n });\r\n });\r\n\r\n describe(\"dark mode\", () => {\r\n test(\"dark.fg on dark.surface\", () => {\r\n expect(passesContrast(contrastRatio(dark.fg, dark.surface), \"normal\")).toBe(true);\r\n });\r\n test(\"dark.fgMuted on dark.surface\", () => {\r\n expect(passesContrast(contrastRatio(dark.fgMuted, dark.surface), \"normal\")).toBe(true);\r\n });\r\n for (const key of Object.keys(dark.status) as Array<keyof typeof dark.status>) {\r\n test(`dark status.${key}.fg on dark.surface`, () => {\r\n expect(\r\n passesContrast(contrastRatio(dark.status[key].fg, dark.surface), \"normal\")\r\n ).toBe(true);\r\n });\r\n }\r\n });\r\n\r\n /* ══════════════════════════════════════════════════════════════════\r\n * DOCUMENTED FAILURES — asserted at their MEASURED value, not at the\r\n * threshold, so the suite stays green while the breach stays visible and\r\n * any drift shows up as a diff. Both need a palette decision, not a\r\n * test change.\r\n * ══════════════════════════════════════════════════════════════════ */\r\n describe(\"KNOWN AA FAILURES (documented, pending decision)\", () => {\r\n /**\r\n * A9-01 — `fgSubtle` on `bgSubtle` ≈ 4.32:1, below the 4.5 floor.\r\n *\r\n * `colors.ts` documents fgSubtle as \"AA · 4.81:1 on white — incidental\r\n * text only (WCAG 1.4.6)\". On white that holds. On `bgSubtle` it does not,\r\n * and the exemption does not rescue it, because fgSubtle is NOT used only\r\n * for incidental text — it colours KV eyebrow labels, section captions and\r\n * hero stat labels, all of which name the value beside them.\r\n *\r\n * LIVE BREACH: both preview drawers put `--fg-subtle` labels on a\r\n * `--bg-subtle` hero panel (dfd `GestionDFDPreviewDrawer` HERO_BOX_STYLE +\r\n * HERO_LABEL_STYLE, ti `GestionTIPreviewDrawer` HERO_STAT_LABEL_STYLE), at\r\n * `--text-xs` (12px) — too small to qualify as large text, so the 4.5\r\n * floor applies.\r\n *\r\n * FIX OPTIONS: darken fgSubtle (affects the muted/subtle hierarchy\r\n * fleet-wide), or switch those labels to `--fg-muted` (AAA, 7.5:1 on\r\n * bgSubtle) which is what every other label surface already uses.\r\n */\r\n test(\"fgSubtle on bgSubtle is BELOW AA — ~4.32:1\", () => {\r\n const ratio = contrastRatio(ink.fgSubtle, surface.bgSubtle);\r\n expect(ratio).not.toBeNull();\r\n expect(ratio as number).toBeLessThan(WCAG_AA_NORMAL);\r\n expect(ratio as number).toBeGreaterThan(4.2);\r\n // It DOES pass on white — the failure is surface-specific.\r\n expect(passesContrast(contrastRatio(ink.fgSubtle, \"#FFFFFF\"), \"normal\")).toBe(true);\r\n });\r\n\r\n /**\r\n * A9-02 — `borderStrong` ≈ 2.87:1 on white. BELOW the 3:1 non-text floor.\r\n *\r\n * ⚠️ The token's own comment in `colors.ts` reads:\r\n * borderStrong: \"#9099AA\", // WCAG 1.4.11 · ≥ 3:1 against white\r\n * That claim is FALSE. This is precisely the drift this file exists to\r\n * catch — an unenforced hand-written ratio that nobody re-derived.\r\n *\r\n * IMPACT depends on usage. `--border-strong` currently colours the\r\n * scrollbar thumb (`base.css`) and the `kbd` bottom edge in\r\n * KeyboardShortcutsHelp. If it is ever used for an INPUT border or any\r\n * other control boundary, 1.4.11 applies and the breach is live — audit\r\n * usage before deciding severity.\r\n *\r\n * FIX: darken to relative luminance ≤ 0.30 (currently 0.316). Roughly\r\n * #868FA3 / #8A92A5; change the token and this assertion flips to the\r\n * `passesContrast(..., \"ui\")` form.\r\n */\r\n test(\"borderStrong on white is BELOW 3:1 — ~2.87:1 (comment in colors.ts is wrong)\", () => {\r\n const ratio = contrastRatio(border.borderStrong, \"#FFFFFF\");\r\n expect(ratio).not.toBeNull();\r\n expect(ratio as number).toBeLessThan(WCAG_AA_UI_NON_TEXT);\r\n expect(ratio as number).toBeGreaterThan(2.8);\r\n });\r\n\r\n /**\r\n * A9-03 — `dark.borderStrong` ≈ 2.28:1 on `dark.surface`. Worse than the\r\n * light-mode equivalent, and the same 1.4.11 floor applies in dark mode.\r\n *\r\n * FIX: lighten to relative luminance ≥ 0.119 (currently 0.078) — roughly\r\n * #5C6478 or lighter. Note dark mode is currently UNREACHABLE in both\r\n * consuming modules (neither sets `[data-theme=\"dark\"]` on <html>), which\r\n * is why nobody has seen it — see the RGESN R-9.5 note in the handover.\r\n */\r\n test(\"dark.borderStrong on dark.surface is BELOW 3:1 — ~2.28:1\", () => {\r\n const ratio = contrastRatio(dark.borderStrong, dark.surface);\r\n expect(ratio).not.toBeNull();\r\n expect(ratio as number).toBeLessThan(WCAG_AA_UI_NON_TEXT);\r\n expect(ratio as number).toBeGreaterThan(2.2);\r\n });\r\n\r\n /**\r\n * Already flagged in colors.ts itself: secondaryFg (#FFFFFF) on\r\n * secondary (#4FB8CF) ≈ 1.96:1. The token comment restricts it to\r\n * chip/badge surfaces and non-text accent fills. Asserted here so the\r\n * restriction is machine-checked rather than comment-only: it fails BOTH\r\n * the text floor and the 3:1 non-text floor.\r\n */\r\n test(\"brandSecondary text pair is BELOW AA and below 3:1 — fills only\", () => {\r\n const ratio = contrastRatio(brandSecondary.secondaryFg, brandSecondary.secondary);\r\n expect(ratio).not.toBeNull();\r\n expect(ratio as number).toBeLessThan(WCAG_AA_UI_NON_TEXT);\r\n });\r\n });\r\n});\r\n"],"mappings":"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","ignoreList":[]}
@@ -13,45 +13,42 @@ var _cssVariables = require("../theme/cssVariables");
13
13
  * - dropped a critical variable downstream consumers rely on, or
14
14
  * - leaked an alias name (--md / --lg) into the global namespace.
15
15
  */
16
- describe("getCssVariables() — Batch 1 + 2 invariants", function () {
17
- var css;
18
- beforeAll(function () {
16
+ describe("getCssVariables() — Batch 1 + 2 invariants", () => {
17
+ let css;
18
+ beforeAll(() => {
19
19
  css = (0, _cssVariables.getCssVariables)();
20
20
  });
21
- test("emits a :root block", function () {
21
+ test("emits a :root block", () => {
22
22
  expect(css).toMatch(/:root\s*\{/);
23
23
  });
24
- test("never emits ': undefined' values (the ghost-token bug class)", function () {
24
+ test("never emits ': undefined' values (the ghost-token bug class)", () => {
25
25
  // Match `--anything: undefined;` with optional whitespace.
26
26
  // This catches the regression that produced --fw-black resolving
27
27
  // to undefined in :root after Batch 1 removed fontWeight.black.
28
- var matches = css.match(/--[\w-]+\s*:\s*undefined\b/g);
28
+ const matches = css.match(/--[\w-]+\s*:\s*undefined\b/g);
29
29
  expect(matches).toBeNull();
30
30
  });
31
- test("does NOT emit --fw-black (Batch 1 removed fontWeight.black)", function () {
31
+ test("does NOT emit --fw-black (Batch 1 removed fontWeight.black)", () => {
32
32
  expect(css).not.toMatch(/--fw-black/);
33
33
  });
34
- test("emits all critical brand + ink + surface variables", function () {
35
- var required = ["--accent", "--accent-soft", "--accent-hover", "--accent-fg", "--fg", "--fg-muted", "--fg-subtle", "--fg-inverse", "--bg", "--bg-elev", "--bg-subtle", "--bg-hover", "--surface", "--border", "--border-strong"];
36
- for (var _i = 0, _required = required; _i < _required.length; _i++) {
37
- var v = _required[_i];
38
- expect(css).toContain("".concat(v, ":"));
34
+ test("emits all critical brand + ink + surface variables", () => {
35
+ const required = ["--accent", "--accent-soft", "--accent-hover", "--accent-fg", "--fg", "--fg-muted", "--fg-subtle", "--fg-inverse", "--bg", "--bg-elev", "--bg-subtle", "--bg-hover", "--surface", "--border", "--border-strong"];
36
+ for (const v of required) {
37
+ expect(css).toContain(`${v}:`);
39
38
  }
40
39
  });
41
- test("emits all semantic + status palette variables", function () {
42
- var required = ["--success", "--success-fg", "--success-soft", "--danger", "--danger-fg", "--danger-soft", "--warning", "--warning-fg", "--warning-soft", "--info", "--info-fg", "--info-soft", "--status-new-soft", "--status-new-fg", "--status-sent-soft", "--status-sent-fg", "--status-pending-soft", "--status-pending-fg", "--status-approved-soft", "--status-approved-fg", "--status-rejected-soft", "--status-rejected-fg", "--status-neutral-soft", "--status-neutral-fg"];
43
- for (var _i2 = 0, _required2 = required; _i2 < _required2.length; _i2++) {
44
- var v = _required2[_i2];
45
- expect(css).toContain("".concat(v, ":"));
40
+ test("emits all semantic + status palette variables", () => {
41
+ const required = ["--success", "--success-fg", "--success-soft", "--danger", "--danger-fg", "--danger-soft", "--warning", "--warning-fg", "--warning-soft", "--info", "--info-fg", "--info-soft", "--status-new-soft", "--status-new-fg", "--status-sent-soft", "--status-sent-fg", "--status-pending-soft", "--status-pending-fg", "--status-approved-soft", "--status-approved-fg", "--status-rejected-soft", "--status-rejected-fg", "--status-neutral-soft", "--status-neutral-fg"];
42
+ for (const v of required) {
43
+ expect(css).toContain(`${v}:`);
46
44
  }
47
45
  });
48
- test("emits the typography variables", function () {
49
- var required = ["--font-sans", "--font-mono", "--text-display", "--text-h2", "--text-h3", "--text-h4", "--text-body", "--text-sm", "--text-xs", "--fw-regular", "--fw-medium", "--fw-semibold", "--fw-bold", "--lh-tight", "--lh-snug", "--lh-normal", "--lh-loose",
46
+ test("emits the typography variables", () => {
47
+ const required = ["--font-sans", "--font-mono", "--text-display", "--text-h2", "--text-h3", "--text-h4", "--text-body", "--text-sm", "--text-xs", "--fw-regular", "--fw-medium", "--fw-semibold", "--fw-bold", "--lh-tight", "--lh-snug", "--lh-normal", "--lh-loose",
50
48
  // A7-02 — letter-spacing scale.
51
49
  "--ls-tight", "--ls-normal", "--ls-wide"];
52
- for (var _i3 = 0, _required3 = required; _i3 < _required3.length; _i3++) {
53
- var v = _required3[_i3];
54
- expect(css).toContain("".concat(v, ":"));
50
+ for (const v of required) {
51
+ expect(css).toContain(`${v}:`);
55
52
  }
56
53
  });
57
54
 
@@ -72,50 +69,46 @@ describe("getCssVariables() — Batch 1 + 2 invariants", function () {
72
69
  * call site. Adding any of them is a Charter §02 amendment and must arrive
73
70
  * with its table entry, not via a failing consumer.
74
71
  */
75
- test("does NOT emit the four rejected phantom tokens (A7-02)", function () {
76
- for (var _i4 = 0, _arr = ["--border-subtle", "--r-xs", "--icon-sm", "--icon-xl"]; _i4 < _arr.length; _i4++) {
77
- var v = _arr[_i4];
78
- expect(css).not.toContain("".concat(v, ":"));
72
+ test("does NOT emit the four rejected phantom tokens (A7-02)", () => {
73
+ for (const v of ["--border-subtle", "--r-xs", "--icon-sm", "--icon-xl"]) {
74
+ expect(css).not.toContain(`${v}:`);
79
75
  }
80
76
  });
81
- test("emits the spacing grid (--s-1 through --s-10)", function () {
82
- for (var i = 1; i <= 10; i += 1) {
83
- expect(css).toContain("--s-".concat(i, ":"));
77
+ test("emits the spacing grid (--s-1 through --s-10)", () => {
78
+ for (let i = 1; i <= 10; i += 1) {
79
+ expect(css).toContain(`--s-${i}:`);
84
80
  }
85
81
  });
86
- test("emits the spacing aliases under --space-* prefix", function () {
87
- var aliases = ["xs", "sm", "md", "lg", "xl", "xxl"];
88
- for (var _i5 = 0, _aliases = aliases; _i5 < _aliases.length; _i5++) {
89
- var a = _aliases[_i5];
90
- expect(css).toContain("--space-".concat(a, ":"));
82
+ test("emits the spacing aliases under --space-* prefix", () => {
83
+ const aliases = ["xs", "sm", "md", "lg", "xl", "xxl"];
84
+ for (const a of aliases) {
85
+ expect(css).toContain(`--space-${a}:`);
91
86
  }
92
87
  });
93
- test("does NOT emit unprefixed alias names that would pollute the global CSS namespace", function () {
88
+ test("does NOT emit unprefixed alias names that would pollute the global CSS namespace", () => {
94
89
  // Bare --md / --lg / --xl would collide with consumer stylesheets.
95
90
  // Batch 2 explicitly partitioned spacing into numeric grid (--s-N)
96
91
  // and semantic aliases (--space-X) to prevent this.
97
92
  // Use word boundaries so we don't false-match --r-md, --space-md, etc.
98
- var polluters = [/[^\w-]--xs\s*:/, /[^\w-]--sm\s*:/, /[^\w-]--md\s*:/, /[^\w-]--lg\s*:/, /[^\w-]--xl\s*:/, /[^\w-]--xxl\s*:/];
99
- for (var _i6 = 0, _polluters = polluters; _i6 < _polluters.length; _i6++) {
100
- var re = _polluters[_i6];
93
+ const polluters = [/[^\w-]--xs\s*:/, /[^\w-]--sm\s*:/, /[^\w-]--md\s*:/, /[^\w-]--lg\s*:/, /[^\w-]--xl\s*:/, /[^\w-]--xxl\s*:/];
94
+ for (const re of polluters) {
101
95
  expect(css).not.toMatch(re);
102
96
  }
103
97
  });
104
- test("emits radius, shadow, motion, easing, layout, density", function () {
105
- var required = ["--r-sm", "--r-md", "--r-lg", "--r-xl", "--r-full", "--r-none", "--shadow-xs", "--shadow-sm", "--shadow-md", "--shadow-lg", "--shadow-focus", "--duration-fast", "--duration-base", "--duration-slow", "--easing-out", "--easing-in", "--easing-soft", "--sidebar-w", "--topbar-h", "--content-max", "--form-max", "--tactile-min", "--row-h", "--input-h", "--btn-h", "--text-fs"];
106
- for (var _i7 = 0, _required4 = required; _i7 < _required4.length; _i7++) {
107
- var v = _required4[_i7];
108
- expect(css).toContain("".concat(v, ":"));
98
+ test("emits radius, shadow, motion, easing, layout, density", () => {
99
+ const required = ["--r-sm", "--r-md", "--r-lg", "--r-xl", "--r-full", "--r-none", "--shadow-xs", "--shadow-sm", "--shadow-md", "--shadow-lg", "--shadow-focus", "--duration-fast", "--duration-base", "--duration-slow", "--easing-out", "--easing-in", "--easing-soft", "--sidebar-w", "--topbar-h", "--content-max", "--form-max", "--tactile-min", "--row-h", "--input-h", "--btn-h", "--text-fs"];
100
+ for (const v of required) {
101
+ expect(css).toContain(`${v}:`);
109
102
  }
110
103
  });
111
- test("emits z-index variables", function () {
104
+ test("emits z-index variables", () => {
112
105
  // Iterates the full zIndex object in cssVariables, so any
113
106
  // future zIndex slot (popover, snackbar, tooltip from Batch 1)
114
107
  // surfaces here without code change.
115
108
  expect(css).toMatch(/--z-modal\s*:/);
116
109
  expect(css).toMatch(/--z-sticky\s*:/);
117
110
  });
118
- test("emits the dark-mode override block with derived soft variants", function () {
111
+ test("emits the dark-mode override block with derived soft variants", () => {
119
112
  expect(css).toContain('[data-theme="dark"]');
120
113
  // Soft semantic fills are color-mix-derived in dark, not static hex
121
114
  // (Batch 2 contrast fix for WCAG 1.4.11 non-text on dark surfaces).
@@ -124,16 +117,16 @@ describe("getCssVariables() — Batch 1 + 2 invariants", function () {
124
117
  expect(css).toMatch(/--warning-soft:\s*color-mix/);
125
118
  expect(css).toMatch(/--info-soft:\s*color-mix/);
126
119
  });
127
- test("emits the compact density override block", function () {
120
+ test("emits the compact density override block", () => {
128
121
  expect(css).toContain('[data-density="compact"]');
129
122
  // Compact override shrinks the row/input/btn heights.
130
123
  expect(css).toMatch(/\[data-density="compact"\][\s\S]*--btn-h:/);
131
124
  });
132
- test("emits the collapsed-sidebar override", function () {
125
+ test("emits the collapsed-sidebar override", () => {
133
126
  expect(css).toContain('[data-nav-collapsed="true"]');
134
127
  });
135
- test("brand override propagates through resolveBrand", function () {
136
- var customCss = (0, _cssVariables.getCssVariables)({
128
+ test("brand override propagates through resolveBrand", () => {
129
+ const customCss = (0, _cssVariables.getCssVariables)({
137
130
  brand: {
138
131
  accent: "#FF0000"
139
132
  }
@@ -142,10 +135,10 @@ describe("getCssVariables() — Batch 1 + 2 invariants", function () {
142
135
  // Default also still emits its accent
143
136
  expect(css).toMatch(/--accent:\s*#[0-9a-fA-F]{3,8}/);
144
137
  });
145
- test("brand override does NOT pollute other brand fields when omitted", function () {
138
+ test("brand override does NOT pollute other brand fields when omitted", () => {
146
139
  // Partial brand override — accentSoft should fall back to default,
147
140
  // not to undefined or an empty string.
148
- var customCss = (0, _cssVariables.getCssVariables)({
141
+ const customCss = (0, _cssVariables.getCssVariables)({
149
142
  brand: {
150
143
  accent: "#FF0000"
151
144
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cssVariables.test.js","names":["_cssVariables","require","describe","css","beforeAll","getCssVariables","test","expect","toMatch","matches","match","toBeNull","not","required","_i","_required","length","v","toContain","concat","_i2","_required2","_i3","_required3","_i4","_arr","i","aliases","_i5","_aliases","a","polluters","_i6","_polluters","re","_i7","_required4","customCss","brand","accent"],"sources":["../../../src/lib/v2/__tests__/cssVariables.test.ts"],"sourcesContent":["import { getCssVariables } from \"../theme/cssVariables\";\r\n\r\n/**\r\n * Regression coverage for the v2 CSS variable emission.\r\n *\r\n * These invariants are established by Batch 1 (token refactor) and\r\n * Batch 2 (cssVariables refactor). A failure here means a future\r\n * change has either:\r\n * - re-introduced a deleted token (e.g. --fw-black),\r\n * - emitted an undefined value (the silent bug class that broke\r\n * KPICard and FormSection visually before Batch 6+7 caught it),\r\n * - dropped a critical variable downstream consumers rely on, or\r\n * - leaked an alias name (--md / --lg) into the global namespace.\r\n */\r\ndescribe(\"getCssVariables() — Batch 1 + 2 invariants\", () => {\r\n let css: string;\r\n beforeAll(() => {\r\n css = getCssVariables();\r\n });\r\n\r\n test(\"emits a :root block\", () => {\r\n expect(css).toMatch(/:root\\s*\\{/);\r\n });\r\n\r\n test(\"never emits ': undefined' values (the ghost-token bug class)\", () => {\r\n // Match `--anything: undefined;` with optional whitespace.\r\n // This catches the regression that produced --fw-black resolving\r\n // to undefined in :root after Batch 1 removed fontWeight.black.\r\n const matches = css.match(/--[\\w-]+\\s*:\\s*undefined\\b/g);\r\n expect(matches).toBeNull();\r\n });\r\n\r\n test(\"does NOT emit --fw-black (Batch 1 removed fontWeight.black)\", () => {\r\n expect(css).not.toMatch(/--fw-black/);\r\n });\r\n\r\n test(\"emits all critical brand + ink + surface variables\", () => {\r\n const required = [\r\n \"--accent\", \"--accent-soft\", \"--accent-hover\", \"--accent-fg\",\r\n \"--fg\", \"--fg-muted\", \"--fg-subtle\", \"--fg-inverse\",\r\n \"--bg\", \"--bg-elev\", \"--bg-subtle\", \"--bg-hover\", \"--surface\",\r\n \"--border\", \"--border-strong\",\r\n ];\r\n for (const v of required) {\r\n expect(css).toContain(`${v}:`);\r\n }\r\n });\r\n\r\n test(\"emits all semantic + status palette variables\", () => {\r\n const required = [\r\n \"--success\", \"--success-fg\", \"--success-soft\",\r\n \"--danger\", \"--danger-fg\", \"--danger-soft\",\r\n \"--warning\", \"--warning-fg\", \"--warning-soft\",\r\n \"--info\", \"--info-fg\", \"--info-soft\",\r\n \"--status-new-soft\", \"--status-new-fg\",\r\n \"--status-sent-soft\", \"--status-sent-fg\",\r\n \"--status-pending-soft\", \"--status-pending-fg\",\r\n \"--status-approved-soft\", \"--status-approved-fg\",\r\n \"--status-rejected-soft\", \"--status-rejected-fg\",\r\n \"--status-neutral-soft\", \"--status-neutral-fg\",\r\n ];\r\n for (const v of required) {\r\n expect(css).toContain(`${v}:`);\r\n }\r\n });\r\n\r\n test(\"emits the typography variables\", () => {\r\n const required = [\r\n \"--font-sans\", \"--font-mono\",\r\n \"--text-display\", \"--text-h2\", \"--text-h3\", \"--text-h4\",\r\n \"--text-body\", \"--text-sm\", \"--text-xs\",\r\n \"--fw-regular\", \"--fw-medium\", \"--fw-semibold\", \"--fw-bold\",\r\n \"--lh-tight\", \"--lh-snug\", \"--lh-normal\", \"--lh-loose\",\r\n // A7-02 — letter-spacing scale.\r\n \"--ls-tight\", \"--ls-normal\", \"--ls-wide\",\r\n ];\r\n for (const v of required) {\r\n expect(css).toContain(`${v}:`);\r\n }\r\n });\r\n\r\n /**\r\n * A7-02 regression guard — the PHANTOM TOKEN class.\r\n *\r\n * The ms-dfd-fe Area 7 audit found six token names referenced across two\r\n * certified modules that this emitter never emitted: --ls-tight, --ls-wide,\r\n * --border-subtle, --r-xs, --icon-sm, --icon-xl. Because every consumer wrote\r\n * `var(--x, <literal>)`, the literal was the ONLY thing that ever rendered —\r\n * a hard-coded magic value wearing a token's name, invisible to review and\r\n * undetectable by tsc (R-2.3 / R-AI.1).\r\n *\r\n * The two letter-spacing names had a real platform basis and are now emitted\r\n * (asserted above). The other four were local inventions with no basis in the\r\n * Charter's token tables; asserting their ABSENCE here stops someone\r\n * \"resolving\" a phantom reference by inventing the token instead of fixing the\r\n * call site. Adding any of them is a Charter §02 amendment and must arrive\r\n * with its table entry, not via a failing consumer.\r\n */\r\n test(\"does NOT emit the four rejected phantom tokens (A7-02)\", () => {\r\n for (const v of [\"--border-subtle\", \"--r-xs\", \"--icon-sm\", \"--icon-xl\"]) {\r\n expect(css).not.toContain(`${v}:`);\r\n }\r\n });\r\n\r\n test(\"emits the spacing grid (--s-1 through --s-10)\", () => {\r\n for (let i = 1; i <= 10; i += 1) {\r\n expect(css).toContain(`--s-${i}:`);\r\n }\r\n });\r\n\r\n test(\"emits the spacing aliases under --space-* prefix\", () => {\r\n const aliases = [\"xs\", \"sm\", \"md\", \"lg\", \"xl\", \"xxl\"];\r\n for (const a of aliases) {\r\n expect(css).toContain(`--space-${a}:`);\r\n }\r\n });\r\n\r\n test(\"does NOT emit unprefixed alias names that would pollute the global CSS namespace\", () => {\r\n // Bare --md / --lg / --xl would collide with consumer stylesheets.\r\n // Batch 2 explicitly partitioned spacing into numeric grid (--s-N)\r\n // and semantic aliases (--space-X) to prevent this.\r\n // Use word boundaries so we don't false-match --r-md, --space-md, etc.\r\n const polluters = [\r\n /[^\\w-]--xs\\s*:/,\r\n /[^\\w-]--sm\\s*:/,\r\n /[^\\w-]--md\\s*:/,\r\n /[^\\w-]--lg\\s*:/,\r\n /[^\\w-]--xl\\s*:/,\r\n /[^\\w-]--xxl\\s*:/,\r\n ];\r\n for (const re of polluters) {\r\n expect(css).not.toMatch(re);\r\n }\r\n });\r\n\r\n test(\"emits radius, shadow, motion, easing, layout, density\", () => {\r\n const required = [\r\n \"--r-sm\", \"--r-md\", \"--r-lg\", \"--r-xl\", \"--r-full\", \"--r-none\",\r\n \"--shadow-xs\", \"--shadow-sm\", \"--shadow-md\", \"--shadow-lg\", \"--shadow-focus\",\r\n \"--duration-fast\", \"--duration-base\", \"--duration-slow\",\r\n \"--easing-out\", \"--easing-in\", \"--easing-soft\",\r\n \"--sidebar-w\", \"--topbar-h\", \"--content-max\", \"--form-max\", \"--tactile-min\",\r\n \"--row-h\", \"--input-h\", \"--btn-h\", \"--text-fs\",\r\n ];\r\n for (const v of required) {\r\n expect(css).toContain(`${v}:`);\r\n }\r\n });\r\n\r\n test(\"emits z-index variables\", () => {\r\n // Iterates the full zIndex object in cssVariables, so any\r\n // future zIndex slot (popover, snackbar, tooltip from Batch 1)\r\n // surfaces here without code change.\r\n expect(css).toMatch(/--z-modal\\s*:/);\r\n expect(css).toMatch(/--z-sticky\\s*:/);\r\n });\r\n\r\n test(\"emits the dark-mode override block with derived soft variants\", () => {\r\n expect(css).toContain('[data-theme=\"dark\"]');\r\n // Soft semantic fills are color-mix-derived in dark, not static hex\r\n // (Batch 2 contrast fix for WCAG 1.4.11 non-text on dark surfaces).\r\n expect(css).toMatch(/--success-soft:\\s*color-mix/);\r\n expect(css).toMatch(/--danger-soft:\\s*color-mix/);\r\n expect(css).toMatch(/--warning-soft:\\s*color-mix/);\r\n expect(css).toMatch(/--info-soft:\\s*color-mix/);\r\n });\r\n\r\n test(\"emits the compact density override block\", () => {\r\n expect(css).toContain('[data-density=\"compact\"]');\r\n // Compact override shrinks the row/input/btn heights.\r\n expect(css).toMatch(/\\[data-density=\"compact\"\\][\\s\\S]*--btn-h:/);\r\n });\r\n\r\n test(\"emits the collapsed-sidebar override\", () => {\r\n expect(css).toContain('[data-nav-collapsed=\"true\"]');\r\n });\r\n\r\n test(\"brand override propagates through resolveBrand\", () => {\r\n const customCss = getCssVariables({ brand: { accent: \"#FF0000\" } });\r\n expect(customCss).toContain(\"--accent: #FF0000;\");\r\n // Default also still emits its accent\r\n expect(css).toMatch(/--accent:\\s*#[0-9a-fA-F]{3,8}/);\r\n });\r\n\r\n test(\"brand override does NOT pollute other brand fields when omitted\", () => {\r\n // Partial brand override — accentSoft should fall back to default,\r\n // not to undefined or an empty string.\r\n const customCss = getCssVariables({ brand: { accent: \"#FF0000\" } });\r\n expect(customCss).not.toMatch(/--accent-soft:\\s*undefined/);\r\n expect(customCss).not.toMatch(/--accent-soft:\\s*;/);\r\n expect(customCss).toMatch(/--accent-soft:\\s*\\S+/);\r\n });\r\n});\r\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"cssVariables.test.js","names":["_cssVariables","require","describe","css","beforeAll","getCssVariables","test","expect","toMatch","matches","match","toBeNull","not","required","v","toContain","i","aliases","a","polluters","re","customCss","brand","accent"],"sources":["../../../src/lib/v2/__tests__/cssVariables.test.ts"],"sourcesContent":["import { getCssVariables } from \"../theme/cssVariables\";\r\n\r\n/**\r\n * Regression coverage for the v2 CSS variable emission.\r\n *\r\n * These invariants are established by Batch 1 (token refactor) and\r\n * Batch 2 (cssVariables refactor). A failure here means a future\r\n * change has either:\r\n * - re-introduced a deleted token (e.g. --fw-black),\r\n * - emitted an undefined value (the silent bug class that broke\r\n * KPICard and FormSection visually before Batch 6+7 caught it),\r\n * - dropped a critical variable downstream consumers rely on, or\r\n * - leaked an alias name (--md / --lg) into the global namespace.\r\n */\r\ndescribe(\"getCssVariables() — Batch 1 + 2 invariants\", () => {\r\n let css: string;\r\n beforeAll(() => {\r\n css = getCssVariables();\r\n });\r\n\r\n test(\"emits a :root block\", () => {\r\n expect(css).toMatch(/:root\\s*\\{/);\r\n });\r\n\r\n test(\"never emits ': undefined' values (the ghost-token bug class)\", () => {\r\n // Match `--anything: undefined;` with optional whitespace.\r\n // This catches the regression that produced --fw-black resolving\r\n // to undefined in :root after Batch 1 removed fontWeight.black.\r\n const matches = css.match(/--[\\w-]+\\s*:\\s*undefined\\b/g);\r\n expect(matches).toBeNull();\r\n });\r\n\r\n test(\"does NOT emit --fw-black (Batch 1 removed fontWeight.black)\", () => {\r\n expect(css).not.toMatch(/--fw-black/);\r\n });\r\n\r\n test(\"emits all critical brand + ink + surface variables\", () => {\r\n const required = [\r\n \"--accent\", \"--accent-soft\", \"--accent-hover\", \"--accent-fg\",\r\n \"--fg\", \"--fg-muted\", \"--fg-subtle\", \"--fg-inverse\",\r\n \"--bg\", \"--bg-elev\", \"--bg-subtle\", \"--bg-hover\", \"--surface\",\r\n \"--border\", \"--border-strong\",\r\n ];\r\n for (const v of required) {\r\n expect(css).toContain(`${v}:`);\r\n }\r\n });\r\n\r\n test(\"emits all semantic + status palette variables\", () => {\r\n const required = [\r\n \"--success\", \"--success-fg\", \"--success-soft\",\r\n \"--danger\", \"--danger-fg\", \"--danger-soft\",\r\n \"--warning\", \"--warning-fg\", \"--warning-soft\",\r\n \"--info\", \"--info-fg\", \"--info-soft\",\r\n \"--status-new-soft\", \"--status-new-fg\",\r\n \"--status-sent-soft\", \"--status-sent-fg\",\r\n \"--status-pending-soft\", \"--status-pending-fg\",\r\n \"--status-approved-soft\", \"--status-approved-fg\",\r\n \"--status-rejected-soft\", \"--status-rejected-fg\",\r\n \"--status-neutral-soft\", \"--status-neutral-fg\",\r\n ];\r\n for (const v of required) {\r\n expect(css).toContain(`${v}:`);\r\n }\r\n });\r\n\r\n test(\"emits the typography variables\", () => {\r\n const required = [\r\n \"--font-sans\", \"--font-mono\",\r\n \"--text-display\", \"--text-h2\", \"--text-h3\", \"--text-h4\",\r\n \"--text-body\", \"--text-sm\", \"--text-xs\",\r\n \"--fw-regular\", \"--fw-medium\", \"--fw-semibold\", \"--fw-bold\",\r\n \"--lh-tight\", \"--lh-snug\", \"--lh-normal\", \"--lh-loose\",\r\n // A7-02 — letter-spacing scale.\r\n \"--ls-tight\", \"--ls-normal\", \"--ls-wide\",\r\n ];\r\n for (const v of required) {\r\n expect(css).toContain(`${v}:`);\r\n }\r\n });\r\n\r\n /**\r\n * A7-02 regression guard — the PHANTOM TOKEN class.\r\n *\r\n * The ms-dfd-fe Area 7 audit found six token names referenced across two\r\n * certified modules that this emitter never emitted: --ls-tight, --ls-wide,\r\n * --border-subtle, --r-xs, --icon-sm, --icon-xl. Because every consumer wrote\r\n * `var(--x, <literal>)`, the literal was the ONLY thing that ever rendered —\r\n * a hard-coded magic value wearing a token's name, invisible to review and\r\n * undetectable by tsc (R-2.3 / R-AI.1).\r\n *\r\n * The two letter-spacing names had a real platform basis and are now emitted\r\n * (asserted above). The other four were local inventions with no basis in the\r\n * Charter's token tables; asserting their ABSENCE here stops someone\r\n * \"resolving\" a phantom reference by inventing the token instead of fixing the\r\n * call site. Adding any of them is a Charter §02 amendment and must arrive\r\n * with its table entry, not via a failing consumer.\r\n */\r\n test(\"does NOT emit the four rejected phantom tokens (A7-02)\", () => {\r\n for (const v of [\"--border-subtle\", \"--r-xs\", \"--icon-sm\", \"--icon-xl\"]) {\r\n expect(css).not.toContain(`${v}:`);\r\n }\r\n });\r\n\r\n test(\"emits the spacing grid (--s-1 through --s-10)\", () => {\r\n for (let i = 1; i <= 10; i += 1) {\r\n expect(css).toContain(`--s-${i}:`);\r\n }\r\n });\r\n\r\n test(\"emits the spacing aliases under --space-* prefix\", () => {\r\n const aliases = [\"xs\", \"sm\", \"md\", \"lg\", \"xl\", \"xxl\"];\r\n for (const a of aliases) {\r\n expect(css).toContain(`--space-${a}:`);\r\n }\r\n });\r\n\r\n test(\"does NOT emit unprefixed alias names that would pollute the global CSS namespace\", () => {\r\n // Bare --md / --lg / --xl would collide with consumer stylesheets.\r\n // Batch 2 explicitly partitioned spacing into numeric grid (--s-N)\r\n // and semantic aliases (--space-X) to prevent this.\r\n // Use word boundaries so we don't false-match --r-md, --space-md, etc.\r\n const polluters = [\r\n /[^\\w-]--xs\\s*:/,\r\n /[^\\w-]--sm\\s*:/,\r\n /[^\\w-]--md\\s*:/,\r\n /[^\\w-]--lg\\s*:/,\r\n /[^\\w-]--xl\\s*:/,\r\n /[^\\w-]--xxl\\s*:/,\r\n ];\r\n for (const re of polluters) {\r\n expect(css).not.toMatch(re);\r\n }\r\n });\r\n\r\n test(\"emits radius, shadow, motion, easing, layout, density\", () => {\r\n const required = [\r\n \"--r-sm\", \"--r-md\", \"--r-lg\", \"--r-xl\", \"--r-full\", \"--r-none\",\r\n \"--shadow-xs\", \"--shadow-sm\", \"--shadow-md\", \"--shadow-lg\", \"--shadow-focus\",\r\n \"--duration-fast\", \"--duration-base\", \"--duration-slow\",\r\n \"--easing-out\", \"--easing-in\", \"--easing-soft\",\r\n \"--sidebar-w\", \"--topbar-h\", \"--content-max\", \"--form-max\", \"--tactile-min\",\r\n \"--row-h\", \"--input-h\", \"--btn-h\", \"--text-fs\",\r\n ];\r\n for (const v of required) {\r\n expect(css).toContain(`${v}:`);\r\n }\r\n });\r\n\r\n test(\"emits z-index variables\", () => {\r\n // Iterates the full zIndex object in cssVariables, so any\r\n // future zIndex slot (popover, snackbar, tooltip from Batch 1)\r\n // surfaces here without code change.\r\n expect(css).toMatch(/--z-modal\\s*:/);\r\n expect(css).toMatch(/--z-sticky\\s*:/);\r\n });\r\n\r\n test(\"emits the dark-mode override block with derived soft variants\", () => {\r\n expect(css).toContain('[data-theme=\"dark\"]');\r\n // Soft semantic fills are color-mix-derived in dark, not static hex\r\n // (Batch 2 contrast fix for WCAG 1.4.11 non-text on dark surfaces).\r\n expect(css).toMatch(/--success-soft:\\s*color-mix/);\r\n expect(css).toMatch(/--danger-soft:\\s*color-mix/);\r\n expect(css).toMatch(/--warning-soft:\\s*color-mix/);\r\n expect(css).toMatch(/--info-soft:\\s*color-mix/);\r\n });\r\n\r\n test(\"emits the compact density override block\", () => {\r\n expect(css).toContain('[data-density=\"compact\"]');\r\n // Compact override shrinks the row/input/btn heights.\r\n expect(css).toMatch(/\\[data-density=\"compact\"\\][\\s\\S]*--btn-h:/);\r\n });\r\n\r\n test(\"emits the collapsed-sidebar override\", () => {\r\n expect(css).toContain('[data-nav-collapsed=\"true\"]');\r\n });\r\n\r\n test(\"brand override propagates through resolveBrand\", () => {\r\n const customCss = getCssVariables({ brand: { accent: \"#FF0000\" } });\r\n expect(customCss).toContain(\"--accent: #FF0000;\");\r\n // Default also still emits its accent\r\n expect(css).toMatch(/--accent:\\s*#[0-9a-fA-F]{3,8}/);\r\n });\r\n\r\n test(\"brand override does NOT pollute other brand fields when omitted\", () => {\r\n // Partial brand override — accentSoft should fall back to default,\r\n // not to undefined or an empty string.\r\n const customCss = getCssVariables({ brand: { accent: \"#FF0000\" } });\r\n expect(customCss).not.toMatch(/--accent-soft:\\s*undefined/);\r\n expect(customCss).not.toMatch(/--accent-soft:\\s*;/);\r\n expect(customCss).toMatch(/--accent-soft:\\s*\\S+/);\r\n });\r\n});\r\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+
3
+ var _fileValidation = require("../utils/fileValidation");
4
+ /** The policy of the module this capability was raised from, verbatim. */
5
+ const DAAC = {
6
+ extensions: ["pdf", "png", "jpg", "jpeg", "doc", "docx"]
7
+ };
8
+ const file = (name, type = "") => new File(["contenu"], name, {
9
+ type
10
+ });
11
+ describe("isForbiddenExecutable", () => {
12
+ it("recognises executables, scripts and installers", () => {
13
+ for (const name of ["setup.exe", "run.bat", "x.ps1", "pkg.msi", "a.hta"]) {
14
+ expect((0, _fileValidation.isForbiddenExecutable)(file(name))).toBe(true);
15
+ }
16
+ });
17
+ it("is case-insensitive", () => {
18
+ expect((0, _fileValidation.isForbiddenExecutable)(file("SETUP.EXE"))).toBe(true);
19
+ });
20
+ it("leaves ordinary documents alone", () => {
21
+ expect((0, _fileValidation.isForbiddenExecutable)(file("titre.pdf"))).toBe(false);
22
+ });
23
+
24
+ /* Callers pass items straight out of a FileList; nothing may throw. */
25
+ it("tolerates a missing file", () => {
26
+ expect((0, _fileValidation.isForbiddenExecutable)(null)).toBe(false);
27
+ expect((0, _fileValidation.isForbiddenExecutable)(undefined)).toBe(false);
28
+ });
29
+ });
30
+ describe("getFileRejection", () => {
31
+ it("accepts a file the policy allows", () => {
32
+ expect((0, _fileValidation.getFileRejection)(file("titre.pdf", "application/pdf"), DAAC)).toBeNull();
33
+ expect((0, _fileValidation.isAcceptedFile)(file("scan.PNG", "image/png"), DAAC)).toBe(true);
34
+ });
35
+
36
+ /* THE ORDER IS THE POINT: a dangerous file is named as such, not reported as
37
+ * an unsupported type — those are not the same information for the user. */
38
+ it("refuses an executable BEFORE any type consideration", () => {
39
+ const rejection = (0, _fileValidation.getFileRejection)(file("setup.exe"), DAAC);
40
+ expect(rejection?.reason).toBe("executable");
41
+ expect(rejection?.message).toBe("Les fichiers exécutables, scripts et installeurs ne sont pas autorisés.");
42
+ });
43
+
44
+ /* The deny-list is the LIBRARY's, not the host's: a host cannot opt into
45
+ * accepting executables by listing the extension. */
46
+ it("refuses an executable even when the policy lists it", () => {
47
+ const reckless = {
48
+ extensions: ["pdf", "exe"]
49
+ };
50
+ expect((0, _fileValidation.getFileRejection)(file("setup.exe"), reckless)?.reason).toBe("executable");
51
+ });
52
+ it("refuses an extension outside the policy", () => {
53
+ const rejection = (0, _fileValidation.getFileRejection)(file("archive.zip"), DAAC);
54
+ expect(rejection?.reason).toBe("extension");
55
+ expect(rejection?.message).toBe("Types autorisés : PDF, PNG, JPG, JPEG, DOC, DOCX.");
56
+ });
57
+
58
+ /* "rapport" has NO extension; a bare split().pop() would read the whole name
59
+ * as one, and "rapport" is not in any allow-list, so the bug would hide. */
60
+ it("refuses a name with no extension", () => {
61
+ expect((0, _fileValidation.getFileRejection)(file("rapport"), DAAC)?.reason).toBe("extension");
62
+ });
63
+ it("refuses a MIME type that contradicts the extension", () => {
64
+ const rejection = (0, _fileValidation.getFileRejection)(file("titre.pdf", "text/html"), DAAC);
65
+ expect(rejection?.reason).toBe("mime");
66
+ });
67
+
68
+ /* Some browsers report no type at all, and the extension has just been
69
+ * checked against the host's list. */
70
+ it("accepts an empty MIME type", () => {
71
+ expect((0, _fileValidation.getFileRejection)(file("titre.pdf", ""), DAAC)).toBeNull();
72
+ });
73
+
74
+ /* WITHOUT THIS, A LEGITIMATE .docx IS REFUSED on some machines — and
75
+ * intermittently, which is the hardest kind of report to act on. */
76
+ it("tolerates application/octet-stream for Office documents", () => {
77
+ expect((0, _fileValidation.getFileRejection)(file("courrier.docx", "application/octet-stream"), DAAC)).toBeNull();
78
+ expect((0, _fileValidation.getFileRejection)(file("courrier.doc", "application/octet-stream"), DAAC)).toBeNull();
79
+ });
80
+ it("does NOT extend that tolerance to a PDF", () => {
81
+ expect((0, _fileValidation.getFileRejection)(file("titre.pdf", "application/octet-stream"), DAAC)?.reason).toBe("mime");
82
+ });
83
+
84
+ /* `image/jpg` is not a registered type; browsers send it anyway. A canonical
85
+ * one-type-per-extension table would reject a valid photo. */
86
+ it("accepts the unregistered image/jpg variant", () => {
87
+ expect((0, _fileValidation.getFileRejection)(file("photo.jpg", "image/jpg"), DAAC)).toBeNull();
88
+ });
89
+
90
+ /* The MIME table is a cross-check, not a second allow-list: a host adding a
91
+ * format to its policy must not be refused by a table it cannot see. */
92
+ it("accepts an allowed extension the MIME table does not know", () => {
93
+ const withDwg = {
94
+ extensions: ["dwg"]
95
+ };
96
+ expect((0, _fileValidation.getFileRejection)(file("plan.dwg", "application/acad"), withDwg)).toBeNull();
97
+ });
98
+ it("matches the policy case-insensitively on both sides", () => {
99
+ const upper = {
100
+ extensions: ["PDF"]
101
+ };
102
+ expect((0, _fileValidation.getFileRejection)(file("TITRE.Pdf", "application/pdf"), upper)).toBeNull();
103
+ });
104
+ it("accepts nothing when the policy lists nothing", () => {
105
+ expect((0, _fileValidation.getFileRejection)(file("titre.pdf"), {
106
+ extensions: []
107
+ })?.reason).toBe("extension");
108
+ });
109
+ it("uses host labels when given", () => {
110
+ const rejection = (0, _fileValidation.getFileRejection)(file("archive.zip"), {
111
+ extensions: ["pdf"],
112
+ labels: {
113
+ type: "Seuls les PDF sont acceptés."
114
+ }
115
+ });
116
+ expect(rejection?.message).toBe("Seuls les PDF sont acceptés.");
117
+ });
118
+ it("treats an absent file as refused rather than throwing", () => {
119
+ expect((0, _fileValidation.getFileRejection)(null, DAAC)?.reason).toBe("extension");
120
+ expect((0, _fileValidation.isAcceptedFile)(undefined, DAAC)).toBe(false);
121
+ });
122
+ });
123
+ describe("describeAcceptedTypes / toAcceptAttribute", () => {
124
+ /* Order is the HOST's — it lists its most common format first on purpose, and
125
+ * sorting here would silently reorder copy someone wrote deliberately. */
126
+ it("keeps the host's order", () => {
127
+ expect((0, _fileValidation.describeAcceptedTypes)(DAAC.extensions)).toBe("PDF, PNG, JPG, JPEG, DOC, DOCX.");
128
+ });
129
+ it("builds the accept attribute", () => {
130
+ expect((0, _fileValidation.toAcceptAttribute)(DAAC.extensions)).toBe(".pdf,.png,.jpg,.jpeg,.doc,.docx");
131
+ });
132
+ it("lowercases the accept attribute", () => {
133
+ expect((0, _fileValidation.toAcceptAttribute)(["PDF", "Docx"])).toBe(".pdf,.docx");
134
+ });
135
+ });
136
+ //# sourceMappingURL=fileValidation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileValidation.test.js","names":["_fileValidation","require","DAAC","extensions","file","name","type","File","describe","it","expect","isForbiddenExecutable","toBe","undefined","getFileRejection","toBeNull","isAcceptedFile","rejection","reason","message","reckless","withDwg","upper","labels","describeAcceptedTypes","toAcceptAttribute"],"sources":["../../../src/lib/v2/__tests__/fileValidation.test.ts"],"sourcesContent":["import {\r\n describeAcceptedTypes,\r\n getFileRejection,\r\n isAcceptedFile,\r\n isForbiddenExecutable,\r\n toAcceptAttribute,\r\n} from \"../utils/fileValidation\";\r\nimport type { FileAcceptPolicy } from \"../utils/fileValidation\";\r\n\r\n/** The policy of the module this capability was raised from, verbatim. */\r\nconst DAAC: FileAcceptPolicy = {\r\n extensions: [\"pdf\", \"png\", \"jpg\", \"jpeg\", \"doc\", \"docx\"],\r\n};\r\n\r\nconst file = (name: string, type = \"\"): File =>\r\n new File([\"contenu\"], name, { type });\r\n\r\ndescribe(\"isForbiddenExecutable\", () => {\r\n it(\"recognises executables, scripts and installers\", () => {\r\n for (const name of [\"setup.exe\", \"run.bat\", \"x.ps1\", \"pkg.msi\", \"a.hta\"]) {\r\n expect(isForbiddenExecutable(file(name))).toBe(true);\r\n }\r\n });\r\n\r\n it(\"is case-insensitive\", () => {\r\n expect(isForbiddenExecutable(file(\"SETUP.EXE\"))).toBe(true);\r\n });\r\n\r\n it(\"leaves ordinary documents alone\", () => {\r\n expect(isForbiddenExecutable(file(\"titre.pdf\"))).toBe(false);\r\n });\r\n\r\n /* Callers pass items straight out of a FileList; nothing may throw. */\r\n it(\"tolerates a missing file\", () => {\r\n expect(isForbiddenExecutable(null)).toBe(false);\r\n expect(isForbiddenExecutable(undefined)).toBe(false);\r\n });\r\n});\r\n\r\ndescribe(\"getFileRejection\", () => {\r\n it(\"accepts a file the policy allows\", () => {\r\n expect(getFileRejection(file(\"titre.pdf\", \"application/pdf\"), DAAC)).toBeNull();\r\n expect(isAcceptedFile(file(\"scan.PNG\", \"image/png\"), DAAC)).toBe(true);\r\n });\r\n\r\n /* THE ORDER IS THE POINT: a dangerous file is named as such, not reported as\r\n * an unsupported type — those are not the same information for the user. */\r\n it(\"refuses an executable BEFORE any type consideration\", () => {\r\n const rejection = getFileRejection(file(\"setup.exe\"), DAAC);\r\n expect(rejection?.reason).toBe(\"executable\");\r\n expect(rejection?.message).toBe(\r\n \"Les fichiers exécutables, scripts et installeurs ne sont pas autorisés.\"\r\n );\r\n });\r\n\r\n /* The deny-list is the LIBRARY's, not the host's: a host cannot opt into\r\n * accepting executables by listing the extension. */\r\n it(\"refuses an executable even when the policy lists it\", () => {\r\n const reckless: FileAcceptPolicy = { extensions: [\"pdf\", \"exe\"] };\r\n expect(getFileRejection(file(\"setup.exe\"), reckless)?.reason).toBe(\r\n \"executable\"\r\n );\r\n });\r\n\r\n it(\"refuses an extension outside the policy\", () => {\r\n const rejection = getFileRejection(file(\"archive.zip\"), DAAC);\r\n expect(rejection?.reason).toBe(\"extension\");\r\n expect(rejection?.message).toBe(\r\n \"Types autorisés : PDF, PNG, JPG, JPEG, DOC, DOCX.\"\r\n );\r\n });\r\n\r\n /* \"rapport\" has NO extension; a bare split().pop() would read the whole name\r\n * as one, and \"rapport\" is not in any allow-list, so the bug would hide. */\r\n it(\"refuses a name with no extension\", () => {\r\n expect(getFileRejection(file(\"rapport\"), DAAC)?.reason).toBe(\"extension\");\r\n });\r\n\r\n it(\"refuses a MIME type that contradicts the extension\", () => {\r\n const rejection = getFileRejection(file(\"titre.pdf\", \"text/html\"), DAAC);\r\n expect(rejection?.reason).toBe(\"mime\");\r\n });\r\n\r\n /* Some browsers report no type at all, and the extension has just been\r\n * checked against the host's list. */\r\n it(\"accepts an empty MIME type\", () => {\r\n expect(getFileRejection(file(\"titre.pdf\", \"\"), DAAC)).toBeNull();\r\n });\r\n\r\n /* WITHOUT THIS, A LEGITIMATE .docx IS REFUSED on some machines — and\r\n * intermittently, which is the hardest kind of report to act on. */\r\n it(\"tolerates application/octet-stream for Office documents\", () => {\r\n expect(\r\n getFileRejection(file(\"courrier.docx\", \"application/octet-stream\"), DAAC)\r\n ).toBeNull();\r\n expect(\r\n getFileRejection(file(\"courrier.doc\", \"application/octet-stream\"), DAAC)\r\n ).toBeNull();\r\n });\r\n\r\n it(\"does NOT extend that tolerance to a PDF\", () => {\r\n expect(\r\n getFileRejection(file(\"titre.pdf\", \"application/octet-stream\"), DAAC)\r\n ?.reason\r\n ).toBe(\"mime\");\r\n });\r\n\r\n /* `image/jpg` is not a registered type; browsers send it anyway. A canonical\r\n * one-type-per-extension table would reject a valid photo. */\r\n it(\"accepts the unregistered image/jpg variant\", () => {\r\n expect(getFileRejection(file(\"photo.jpg\", \"image/jpg\"), DAAC)).toBeNull();\r\n });\r\n\r\n /* The MIME table is a cross-check, not a second allow-list: a host adding a\r\n * format to its policy must not be refused by a table it cannot see. */\r\n it(\"accepts an allowed extension the MIME table does not know\", () => {\r\n const withDwg: FileAcceptPolicy = { extensions: [\"dwg\"] };\r\n expect(\r\n getFileRejection(file(\"plan.dwg\", \"application/acad\"), withDwg)\r\n ).toBeNull();\r\n });\r\n\r\n it(\"matches the policy case-insensitively on both sides\", () => {\r\n const upper: FileAcceptPolicy = { extensions: [\"PDF\"] };\r\n expect(getFileRejection(file(\"TITRE.Pdf\", \"application/pdf\"), upper)).toBeNull();\r\n });\r\n\r\n it(\"accepts nothing when the policy lists nothing\", () => {\r\n expect(getFileRejection(file(\"titre.pdf\"), { extensions: [] })?.reason).toBe(\r\n \"extension\"\r\n );\r\n });\r\n\r\n it(\"uses host labels when given\", () => {\r\n const rejection = getFileRejection(file(\"archive.zip\"), {\r\n extensions: [\"pdf\"],\r\n labels: { type: \"Seuls les PDF sont acceptés.\" },\r\n });\r\n expect(rejection?.message).toBe(\"Seuls les PDF sont acceptés.\");\r\n });\r\n\r\n it(\"treats an absent file as refused rather than throwing\", () => {\r\n expect(getFileRejection(null, DAAC)?.reason).toBe(\"extension\");\r\n expect(isAcceptedFile(undefined, DAAC)).toBe(false);\r\n });\r\n});\r\n\r\ndescribe(\"describeAcceptedTypes / toAcceptAttribute\", () => {\r\n /* Order is the HOST's — it lists its most common format first on purpose, and\r\n * sorting here would silently reorder copy someone wrote deliberately. */\r\n it(\"keeps the host's order\", () => {\r\n expect(describeAcceptedTypes(DAAC.extensions)).toBe(\r\n \"PDF, PNG, JPG, JPEG, DOC, DOCX.\"\r\n );\r\n });\r\n\r\n it(\"builds the accept attribute\", () => {\r\n expect(toAcceptAttribute(DAAC.extensions)).toBe(\r\n \".pdf,.png,.jpg,.jpeg,.doc,.docx\"\r\n );\r\n });\r\n\r\n it(\"lowercases the accept attribute\", () => {\r\n expect(toAcceptAttribute([\"PDF\", \"Docx\"])).toBe(\".pdf,.docx\");\r\n });\r\n});\r\n"],"mappings":"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","ignoreList":[]}