@portnet/ui 6.0.1 → 6.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1011) hide show
  1. package/CHANGELOG.md +737 -0
  2. package/dist/esm/index.js +90 -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 -39
  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 +146 -0
  17. package/dist/esm/v2/__tests__/FieldWidth.test.js.map +1 -0
  18. package/dist/esm/v2/__tests__/FileCard.test.js +18 -18
  19. package/dist/esm/v2/__tests__/FileCard.test.js.map +1 -1
  20. package/dist/esm/v2/__tests__/FormikCheckbox.test.js +173 -0
  21. package/dist/esm/v2/__tests__/FormikCheckbox.test.js.map +1 -0
  22. package/dist/esm/v2/__tests__/FormikDateTimePicker.test.js +236 -0
  23. package/dist/esm/v2/__tests__/FormikDateTimePicker.test.js.map +1 -0
  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 +299 -0
  27. package/dist/esm/v2/__tests__/FormikRadioGroup.test.js.map +1 -0
  28. package/dist/esm/v2/__tests__/MobileRowCard.test.js +44 -43
  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 -22
  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 +118 -90
  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 +210 -52
  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 +64 -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 +14 -4
  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 +26 -75
  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 +130 -0
  269. package/dist/esm/v2/patterns/FormikCheckbox.js.map +1 -0
  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 -66
  273. package/dist/esm/v2/patterns/FormikCombobox.js.map +1 -1
  274. package/dist/esm/v2/patterns/FormikDatePicker.js +51 -99
  275. package/dist/esm/v2/patterns/FormikDatePicker.js.map +1 -1
  276. package/dist/esm/v2/patterns/FormikDateTimePicker.js +136 -0
  277. package/dist/esm/v2/patterns/FormikDateTimePicker.js.map +1 -0
  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 -50
  285. package/dist/esm/v2/patterns/FormikInput.js.map +1 -1
  286. package/dist/esm/v2/patterns/FormikRadioGroup.js +129 -0
  287. package/dist/esm/v2/patterns/FormikRadioGroup.js.map +1 -0
  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 -84
  291. package/dist/esm/v2/patterns/FormikSelect.js.map +1 -1
  292. package/dist/esm/v2/patterns/FormikTextarea.js +30 -43
  293. package/dist/esm/v2/patterns/FormikTextarea.js.map +1 -1
  294. package/dist/esm/v2/patterns/KeyboardShortcutsHelp.js +64 -65
  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 +127 -0
  305. package/dist/esm/v2/patterns/RowFavoriteToggle.js.map +1 -0
  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 +72 -0
  319. package/dist/esm/v2/patterns/_pickerSerialisation.js.map +1 -0
  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 +235 -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 +203 -0
  345. package/dist/esm/v2/personalization/capabilities/gridPreferences.js.map +1 -0
  346. package/dist/esm/v2/personalization/capabilities/index.js +5 -0
  347. package/dist/esm/v2/personalization/capabilities/index.js.map +1 -1
  348. package/dist/esm/v2/personalization/capabilities/reviveSavedCriteria.js +119 -0
  349. package/dist/esm/v2/personalization/capabilities/reviveSavedCriteria.js.map +1 -0
  350. package/dist/esm/v2/personalization/capabilities/savedFilters.js +90 -98
  351. package/dist/esm/v2/personalization/capabilities/savedFilters.js.map +1 -1
  352. package/dist/esm/v2/personalization/createPersonalizationStore.js +78 -181
  353. package/dist/esm/v2/personalization/createPersonalizationStore.js.map +1 -1
  354. package/dist/esm/v2/personalization/index.js +35 -0
  355. package/dist/esm/v2/personalization/index.js.map +1 -1
  356. package/dist/esm/v2/personalization/personalizationContext.js +9 -9
  357. package/dist/esm/v2/personalization/personalizationContext.js.map +1 -1
  358. package/dist/esm/v2/personalization/schema.js +8 -9
  359. package/dist/esm/v2/personalization/schema.js.map +1 -1
  360. package/dist/esm/v2/referentiel/ReferentielProvider.js +27 -42
  361. package/dist/esm/v2/referentiel/ReferentielProvider.js.map +1 -1
  362. package/dist/esm/v2/referentiel/types.js +2 -0
  363. package/dist/esm/v2/referentiel/types.js.map +1 -0
  364. package/dist/esm/v2/referentiel/useReferentielClient.js +10 -11
  365. package/dist/esm/v2/referentiel/useReferentielClient.js.map +1 -1
  366. package/dist/esm/v2/referentiel/useReferentielOptions.js +60 -117
  367. package/dist/esm/v2/referentiel/useReferentielOptions.js.map +1 -1
  368. package/dist/esm/v2/referentiel/useReferentielSearch.js +37 -91
  369. package/dist/esm/v2/referentiel/useReferentielSearch.js.map +1 -1
  370. package/dist/esm/v2/theme/_brand.js +8 -24
  371. package/dist/esm/v2/theme/_brand.js.map +1 -1
  372. package/dist/esm/v2/theme/_brandSecondary.js +8 -24
  373. package/dist/esm/v2/theme/_brandSecondary.js.map +1 -1
  374. package/dist/esm/v2/theme/createPortnetTheme.js +51 -61
  375. package/dist/esm/v2/theme/createPortnetTheme.js.map +1 -1
  376. package/dist/esm/v2/theme/cssVariables.js +62 -69
  377. package/dist/esm/v2/theme/cssVariables.js.map +1 -1
  378. package/dist/esm/v2/theme/index.js +5 -5
  379. package/dist/esm/v2/theme/index.js.map +1 -1
  380. package/dist/esm/v2/tokens/breakpoints.js +14 -14
  381. package/dist/esm/v2/tokens/breakpoints.js.map +1 -1
  382. package/dist/esm/v2/tokens/chart.js +261 -0
  383. package/dist/esm/v2/tokens/chart.js.map +1 -0
  384. package/dist/esm/v2/tokens/colors.js +22 -22
  385. package/dist/esm/v2/tokens/colors.js.map +1 -1
  386. package/dist/esm/v2/tokens/density.js +62 -7
  387. package/dist/esm/v2/tokens/density.js.map +1 -1
  388. package/dist/esm/v2/tokens/index.js +49 -34
  389. package/dist/esm/v2/tokens/index.js.map +1 -1
  390. package/dist/esm/v2/tokens/motion.js +12 -20
  391. package/dist/esm/v2/tokens/motion.js.map +1 -1
  392. package/dist/esm/v2/tokens/radius.js +1 -1
  393. package/dist/esm/v2/tokens/radius.js.map +1 -1
  394. package/dist/esm/v2/tokens/shadows.js +6 -6
  395. package/dist/esm/v2/tokens/shadows.js.map +1 -1
  396. package/dist/esm/v2/tokens/spacing.js +2 -2
  397. package/dist/esm/v2/tokens/spacing.js.map +1 -1
  398. package/dist/esm/v2/tokens/state.js +1 -1
  399. package/dist/esm/v2/tokens/state.js.map +1 -1
  400. package/dist/esm/v2/tokens/statusPalette.js +17 -21
  401. package/dist/esm/v2/tokens/statusPalette.js.map +1 -1
  402. package/dist/esm/v2/tokens/tokens.json +6 -1
  403. package/dist/esm/v2/tokens/typography.js +13 -13
  404. package/dist/esm/v2/tokens/typography.js.map +1 -1
  405. package/dist/esm/v2/tokens/zIndex.js +1 -1
  406. package/dist/esm/v2/tokens/zIndex.js.map +1 -1
  407. package/dist/esm/v2/types/datagrid.js.map +1 -1
  408. package/dist/esm/v2/utils/apiError.js +16 -37
  409. package/dist/esm/v2/utils/apiError.js.map +1 -1
  410. package/dist/esm/v2/utils/contrast.js +31 -32
  411. package/dist/esm/v2/utils/contrast.js.map +1 -1
  412. package/dist/esm/v2/utils/cx.js +5 -25
  413. package/dist/esm/v2/utils/cx.js.map +1 -1
  414. package/dist/esm/v2/utils/fileDownload.js +23 -26
  415. package/dist/esm/v2/utils/fileDownload.js.map +1 -1
  416. package/dist/esm/v2/utils/fileValidation.js +209 -0
  417. package/dist/esm/v2/utils/fileValidation.js.map +1 -0
  418. package/dist/esm/v2/utils/fmtDate.js +111 -0
  419. package/dist/esm/v2/utils/fmtDate.js.map +1 -0
  420. package/dist/esm/v2/utils/fmtMoney.js +8 -10
  421. package/dist/esm/v2/utils/fmtMoney.js.map +1 -1
  422. package/dist/esm/v2/utils/formikErrors.js +78 -0
  423. package/dist/esm/v2/utils/formikErrors.js.map +1 -0
  424. package/dist/esm/v2/utils/index.js +35 -2
  425. package/dist/esm/v2/utils/index.js.map +1 -1
  426. package/dist/esm/v2/utils/mergeLabels.js +7 -12
  427. package/dist/esm/v2/utils/mergeLabels.js.map +1 -1
  428. package/dist/esm/v2/utils/networkStatus.js +12 -12
  429. package/dist/esm/v2/utils/networkStatus.js.map +1 -1
  430. package/dist/index.d.ts +9 -1
  431. package/dist/index.d.ts.map +1 -1
  432. package/dist/index.js +122 -47
  433. package/dist/index.js.map +1 -1
  434. package/dist/v2/__tests__/AppMain.test.js +133 -0
  435. package/dist/v2/__tests__/AppMain.test.js.map +1 -0
  436. package/dist/v2/__tests__/ChartFigure.test.js +183 -0
  437. package/dist/v2/__tests__/ChartFigure.test.js.map +1 -0
  438. package/dist/v2/__tests__/DataGridRowActionsPropagation.test.js +153 -0
  439. package/dist/v2/__tests__/DataGridRowActionsPropagation.test.js.map +1 -0
  440. package/dist/v2/__tests__/DrawerTactileTargets.test.js +94 -0
  441. package/dist/v2/__tests__/DrawerTactileTargets.test.js.map +1 -0
  442. package/dist/v2/__tests__/FieldError.test.js +98 -69
  443. package/dist/v2/__tests__/FieldError.test.js.map +1 -1
  444. package/dist/v2/__tests__/FieldNaming.test.js +161 -0
  445. package/dist/v2/__tests__/FieldNaming.test.js.map +1 -0
  446. package/dist/v2/__tests__/FieldWidth.test.js +148 -0
  447. package/dist/v2/__tests__/FieldWidth.test.js.map +1 -0
  448. package/dist/v2/__tests__/FileCard.test.js +45 -48
  449. package/dist/v2/__tests__/FileCard.test.js.map +1 -1
  450. package/dist/v2/__tests__/FormikCheckbox.test.js +175 -0
  451. package/dist/v2/__tests__/FormikCheckbox.test.js.map +1 -0
  452. package/dist/v2/__tests__/FormikDateTimePicker.test.js +237 -0
  453. package/dist/v2/__tests__/FormikDateTimePicker.test.js.map +1 -0
  454. package/dist/v2/__tests__/FormikDisplayWidth.test.js +102 -0
  455. package/dist/v2/__tests__/FormikDisplayWidth.test.js.map +1 -0
  456. package/dist/v2/__tests__/FormikRadioGroup.test.js +300 -0
  457. package/dist/v2/__tests__/FormikRadioGroup.test.js.map +1 -0
  458. package/dist/v2/__tests__/MobileRowCard.test.js +100 -102
  459. package/dist/v2/__tests__/MobileRowCard.test.js.map +1 -1
  460. package/dist/v2/__tests__/PreviewDrawer.test.js +169 -0
  461. package/dist/v2/__tests__/PreviewDrawer.test.js.map +1 -0
  462. package/dist/v2/__tests__/ReferentielFieldContainer.test.js +159 -0
  463. package/dist/v2/__tests__/ReferentielFieldContainer.test.js.map +1 -0
  464. package/dist/v2/__tests__/SectionErrorBoundary.test.js +53 -68
  465. package/dist/v2/__tests__/SectionErrorBoundary.test.js.map +1 -1
  466. package/dist/v2/__tests__/apiError.test.js +50 -69
  467. package/dist/v2/__tests__/apiError.test.js.map +1 -1
  468. package/dist/v2/__tests__/banned-patterns.test.js +42 -123
  469. package/dist/v2/__tests__/banned-patterns.test.js.map +1 -1
  470. package/dist/v2/__tests__/chart-palette.test.js +205 -0
  471. package/dist/v2/__tests__/chart-palette.test.js.map +1 -0
  472. package/dist/v2/__tests__/contrast-palette.test.js +42 -74
  473. package/dist/v2/__tests__/contrast-palette.test.js.map +1 -1
  474. package/dist/v2/__tests__/cssVariables.test.js +44 -51
  475. package/dist/v2/__tests__/cssVariables.test.js.map +1 -1
  476. package/dist/v2/__tests__/fileValidation.test.js +136 -0
  477. package/dist/v2/__tests__/fileValidation.test.js.map +1 -0
  478. package/dist/v2/__tests__/filterCriteria.test.js +324 -0
  479. package/dist/v2/__tests__/filterCriteria.test.js.map +1 -0
  480. package/dist/v2/__tests__/fmtDate.test.js +69 -0
  481. package/dist/v2/__tests__/fmtDate.test.js.map +1 -0
  482. package/dist/v2/__tests__/gap-leakage-refonte.test.js +221 -0
  483. package/dist/v2/__tests__/gap-leakage-refonte.test.js.map +1 -0
  484. package/dist/v2/__tests__/labels-merge.test.js +38 -46
  485. package/dist/v2/__tests__/labels-merge.test.js.map +1 -1
  486. package/dist/v2/__tests__/locale-fallback.test.js +47 -52
  487. package/dist/v2/__tests__/locale-fallback.test.js.map +1 -1
  488. package/dist/v2/__tests__/reviveSavedCriteria.test.js +144 -0
  489. package/dist/v2/__tests__/reviveSavedCriteria.test.js.map +1 -0
  490. package/dist/v2/__tests__/rowActions.test.js +186 -0
  491. package/dist/v2/__tests__/rowActions.test.js.map +1 -0
  492. package/dist/v2/__tests__/useFocusOnRouteChange.test.js +156 -0
  493. package/dist/v2/__tests__/useFocusOnRouteChange.test.js.map +1 -0
  494. package/dist/v2/__tests__/useFocusTrap.test.js +270 -407
  495. package/dist/v2/__tests__/useFocusTrap.test.js.map +1 -1
  496. package/dist/v2/__tests__/usePrefersReducedMotion.test.js +123 -0
  497. package/dist/v2/__tests__/usePrefersReducedMotion.test.js.map +1 -0
  498. package/dist/v2/components/Accordion.js +60 -82
  499. package/dist/v2/components/Accordion.js.map +1 -1
  500. package/dist/v2/components/ActionStrip.js +40 -52
  501. package/dist/v2/components/ActionStrip.js.map +1 -1
  502. package/dist/v2/components/Banner.js +42 -41
  503. package/dist/v2/components/Banner.js.map +1 -1
  504. package/dist/v2/components/Busy.js +22 -27
  505. package/dist/v2/components/Busy.js.map +1 -1
  506. package/dist/v2/components/Button.js +39 -50
  507. package/dist/v2/components/Button.js.map +1 -1
  508. package/dist/v2/components/CategoryTag.d.ts.map +1 -1
  509. package/dist/v2/components/CategoryTag.js +49 -32
  510. package/dist/v2/components/CategoryTag.js.map +1 -1
  511. package/dist/v2/components/Checkbox.js +39 -45
  512. package/dist/v2/components/Checkbox.js.map +1 -1
  513. package/dist/v2/components/Chip.js +29 -42
  514. package/dist/v2/components/Chip.js.map +1 -1
  515. package/dist/v2/components/Combobox.js +122 -144
  516. package/dist/v2/components/Combobox.js.map +1 -1
  517. package/dist/v2/components/CommandPalette.js +138 -225
  518. package/dist/v2/components/CommandPalette.js.map +1 -1
  519. package/dist/v2/components/ConfirmDialog.js +46 -56
  520. package/dist/v2/components/ConfirmDialog.js.map +1 -1
  521. package/dist/v2/components/DatePicker.js +81 -86
  522. package/dist/v2/components/DatePicker.js.map +1 -1
  523. package/dist/v2/components/DateRangePicker.js +77 -87
  524. package/dist/v2/components/DateRangePicker.js.map +1 -1
  525. package/dist/v2/components/DateTimePicker.d.ts.map +1 -1
  526. package/dist/v2/components/DateTimePicker.js +121 -95
  527. package/dist/v2/components/DateTimePicker.js.map +1 -1
  528. package/dist/v2/components/Drawer.d.ts.map +1 -1
  529. package/dist/v2/components/Drawer.js +93 -88
  530. package/dist/v2/components/Drawer.js.map +1 -1
  531. package/dist/v2/components/Dropzone.js +150 -196
  532. package/dist/v2/components/Dropzone.js.map +1 -1
  533. package/dist/v2/components/EmptyState.js +18 -20
  534. package/dist/v2/components/EmptyState.js.map +1 -1
  535. package/dist/v2/components/FavoriteToggle.js +28 -39
  536. package/dist/v2/components/FavoriteToggle.js.map +1 -1
  537. package/dist/v2/components/Field.d.ts +121 -5
  538. package/dist/v2/components/Field.d.ts.map +1 -1
  539. package/dist/v2/components/Field.js +221 -62
  540. package/dist/v2/components/Field.js.map +1 -1
  541. package/dist/v2/components/FieldError.js +18 -21
  542. package/dist/v2/components/FieldError.js.map +1 -1
  543. package/dist/v2/components/FieldHelp.js +40 -60
  544. package/dist/v2/components/FieldHelp.js.map +1 -1
  545. package/dist/v2/components/FileCard.js +27 -31
  546. package/dist/v2/components/FileCard.js.map +1 -1
  547. package/dist/v2/components/FilterTab.js +30 -38
  548. package/dist/v2/components/FilterTab.js.map +1 -1
  549. package/dist/v2/components/ForbiddenPage.d.ts +25 -1
  550. package/dist/v2/components/ForbiddenPage.d.ts.map +1 -1
  551. package/dist/v2/components/ForbiddenPage.js +37 -17
  552. package/dist/v2/components/ForbiddenPage.js.map +1 -1
  553. package/dist/v2/components/FormGrid.js +53 -59
  554. package/dist/v2/components/FormGrid.js.map +1 -1
  555. package/dist/v2/components/FormikDisplay.d.ts +50 -1
  556. package/dist/v2/components/FormikDisplay.d.ts.map +1 -1
  557. package/dist/v2/components/FormikDisplay.js +108 -33
  558. package/dist/v2/components/FormikDisplay.js.map +1 -1
  559. package/dist/v2/components/Input.d.ts +40 -0
  560. package/dist/v2/components/Input.d.ts.map +1 -1
  561. package/dist/v2/components/Input.js +81 -41
  562. package/dist/v2/components/Input.js.map +1 -1
  563. package/dist/v2/components/KPICard.js +57 -67
  564. package/dist/v2/components/KPICard.js.map +1 -1
  565. package/dist/v2/components/KPIStrip.js +16 -22
  566. package/dist/v2/components/KPIStrip.js.map +1 -1
  567. package/dist/v2/components/KV.js +25 -31
  568. package/dist/v2/components/KV.js.map +1 -1
  569. package/dist/v2/components/KVGrid.js +19 -26
  570. package/dist/v2/components/KVGrid.js.map +1 -1
  571. package/dist/v2/components/Layout.js +91 -120
  572. package/dist/v2/components/Layout.js.map +1 -1
  573. package/dist/v2/components/MobileRowCard.js +79 -91
  574. package/dist/v2/components/MobileRowCard.js.map +1 -1
  575. package/dist/v2/components/Modal.js +61 -69
  576. package/dist/v2/components/Modal.js.map +1 -1
  577. package/dist/v2/components/NetworkErrorPage.d.ts +19 -1
  578. package/dist/v2/components/NetworkErrorPage.d.ts.map +1 -1
  579. package/dist/v2/components/NetworkErrorPage.js +38 -21
  580. package/dist/v2/components/NetworkErrorPage.js.map +1 -1
  581. package/dist/v2/components/NotFoundPage.d.ts +17 -1
  582. package/dist/v2/components/NotFoundPage.d.ts.map +1 -1
  583. package/dist/v2/components/NotFoundPage.js +37 -18
  584. package/dist/v2/components/NotFoundPage.js.map +1 -1
  585. package/dist/v2/components/NumberInput.js +88 -118
  586. package/dist/v2/components/NumberInput.js.map +1 -1
  587. package/dist/v2/components/OverflowMenu.js +38 -56
  588. package/dist/v2/components/OverflowMenu.js.map +1 -1
  589. package/dist/v2/components/PdfViewer.js +34 -45
  590. package/dist/v2/components/PdfViewer.js.map +1 -1
  591. package/dist/v2/components/ProgressBar.js +42 -49
  592. package/dist/v2/components/ProgressBar.js.map +1 -1
  593. package/dist/v2/components/Radio.js +59 -67
  594. package/dist/v2/components/Radio.js.map +1 -1
  595. package/dist/v2/components/SectionErrorBoundary.js +90 -135
  596. package/dist/v2/components/SectionErrorBoundary.js.map +1 -1
  597. package/dist/v2/components/SectionHeader.js +34 -41
  598. package/dist/v2/components/SectionHeader.js.map +1 -1
  599. package/dist/v2/components/Segmented.js +69 -93
  600. package/dist/v2/components/Segmented.js.map +1 -1
  601. package/dist/v2/components/Select.d.ts +26 -2
  602. package/dist/v2/components/Select.d.ts.map +1 -1
  603. package/dist/v2/components/Select.js +120 -155
  604. package/dist/v2/components/Select.js.map +1 -1
  605. package/dist/v2/components/ServerErrorPage.d.ts +27 -1
  606. package/dist/v2/components/ServerErrorPage.d.ts.map +1 -1
  607. package/dist/v2/components/ServerErrorPage.js +37 -20
  608. package/dist/v2/components/ServerErrorPage.js.map +1 -1
  609. package/dist/v2/components/Skeleton.js +86 -100
  610. package/dist/v2/components/Skeleton.js.map +1 -1
  611. package/dist/v2/components/SkipLink.js +9 -12
  612. package/dist/v2/components/SkipLink.js.map +1 -1
  613. package/dist/v2/components/Spinner.js +16 -25
  614. package/dist/v2/components/Spinner.js.map +1 -1
  615. package/dist/v2/components/Status.js +18 -29
  616. package/dist/v2/components/Status.js.map +1 -1
  617. package/dist/v2/components/Stepper.js +80 -82
  618. package/dist/v2/components/Stepper.js.map +1 -1
  619. package/dist/v2/components/Surface.js +34 -49
  620. package/dist/v2/components/Surface.js.map +1 -1
  621. package/dist/v2/components/Switch.js +29 -37
  622. package/dist/v2/components/Switch.js.map +1 -1
  623. package/dist/v2/components/TabPanel.d.ts +17 -0
  624. package/dist/v2/components/TabPanel.d.ts.map +1 -0
  625. package/dist/v2/components/TabPanel.js +90 -0
  626. package/dist/v2/components/TabPanel.js.map +1 -0
  627. package/dist/v2/components/Tabs.d.ts +25 -0
  628. package/dist/v2/components/Tabs.d.ts.map +1 -1
  629. package/dist/v2/components/Tabs.js +53 -29
  630. package/dist/v2/components/Tabs.js.map +1 -1
  631. package/dist/v2/components/TelInput.js +80 -115
  632. package/dist/v2/components/TelInput.js.map +1 -1
  633. package/dist/v2/components/Textarea.js +26 -35
  634. package/dist/v2/components/Textarea.js.map +1 -1
  635. package/dist/v2/components/TimePicker.js +62 -74
  636. package/dist/v2/components/TimePicker.js.map +1 -1
  637. package/dist/v2/components/Toast.js +119 -174
  638. package/dist/v2/components/Toast.js.map +1 -1
  639. package/dist/v2/components/Tooltip.js +23 -38
  640. package/dist/v2/components/Tooltip.js.map +1 -1
  641. package/dist/v2/components/_ErrorPageBody.js +15 -16
  642. package/dist/v2/components/_ErrorPageBody.js.map +1 -1
  643. package/dist/v2/components/_pickerShared.js +5 -5
  644. package/dist/v2/components/_pickerShared.js.map +1 -1
  645. package/dist/v2/components/index.d.ts +67 -1
  646. package/dist/v2/components/index.d.ts.map +1 -1
  647. package/dist/v2/components/index.js +153 -136
  648. package/dist/v2/components/index.js.map +1 -1
  649. package/dist/v2/hooks/index.d.ts +65 -0
  650. package/dist/v2/hooks/index.d.ts.map +1 -1
  651. package/dist/v2/hooks/index.js +63 -24
  652. package/dist/v2/hooks/index.js.map +1 -1
  653. package/dist/v2/hooks/useAppliedFilters.d.ts +102 -0
  654. package/dist/v2/hooks/useAppliedFilters.d.ts.map +1 -0
  655. package/dist/v2/hooks/useAppliedFilters.js +117 -0
  656. package/dist/v2/hooks/useAppliedFilters.js.map +1 -0
  657. package/dist/v2/hooks/useDebouncedCallback.d.ts +64 -0
  658. package/dist/v2/hooks/useDebouncedCallback.d.ts.map +1 -0
  659. package/dist/v2/hooks/useDebouncedCallback.js +87 -0
  660. package/dist/v2/hooks/useDebouncedCallback.js.map +1 -0
  661. package/dist/v2/hooks/useDelayedFlag.js +6 -20
  662. package/dist/v2/hooks/useDelayedFlag.js.map +1 -1
  663. package/dist/v2/hooks/useDensity.d.ts.map +1 -1
  664. package/dist/v2/hooks/useDensity.js +14 -18
  665. package/dist/v2/hooks/useDensity.js.map +1 -1
  666. package/dist/v2/hooks/useFocusFirstError.js +26 -34
  667. package/dist/v2/hooks/useFocusFirstError.js.map +1 -1
  668. package/dist/v2/hooks/useFocusOnRouteChange.d.ts +65 -0
  669. package/dist/v2/hooks/useFocusOnRouteChange.d.ts.map +1 -0
  670. package/dist/v2/hooks/useFocusOnRouteChange.js +88 -0
  671. package/dist/v2/hooks/useFocusOnRouteChange.js.map +1 -0
  672. package/dist/v2/hooks/useFocusTrap.js +20 -24
  673. package/dist/v2/hooks/useFocusTrap.js.map +1 -1
  674. package/dist/v2/hooks/useFormAutoSave.d.ts +4 -4
  675. package/dist/v2/hooks/useFormAutoSave.d.ts.map +1 -1
  676. package/dist/v2/hooks/useFormAutoSave.js +39 -54
  677. package/dist/v2/hooks/useFormAutoSave.js.map +1 -1
  678. package/dist/v2/hooks/useFormCompletionProgress.d.ts +1 -1
  679. package/dist/v2/hooks/useFormCompletionProgress.d.ts.map +1 -1
  680. package/dist/v2/hooks/useFormCompletionProgress.js +33 -52
  681. package/dist/v2/hooks/useFormCompletionProgress.js.map +1 -1
  682. package/dist/v2/hooks/useKeyboardShortcuts.d.ts +25 -0
  683. package/dist/v2/hooks/useKeyboardShortcuts.d.ts.map +1 -0
  684. package/dist/v2/hooks/useKeyboardShortcuts.js +132 -0
  685. package/dist/v2/hooks/useKeyboardShortcuts.js.map +1 -0
  686. package/dist/v2/hooks/usePrefersReducedMotion.d.ts +56 -0
  687. package/dist/v2/hooks/usePrefersReducedMotion.d.ts.map +1 -0
  688. package/dist/v2/hooks/usePrefersReducedMotion.js +105 -0
  689. package/dist/v2/hooks/usePrefersReducedMotion.js.map +1 -0
  690. package/dist/v2/hooks/useResolvedDensity.js +5 -13
  691. package/dist/v2/hooks/useResolvedDensity.js.map +1 -1
  692. package/dist/v2/hooks/useSortedRows.js +4 -6
  693. package/dist/v2/hooks/useSortedRows.js.map +1 -1
  694. package/dist/v2/hooks/useTabLoading.js +7 -22
  695. package/dist/v2/hooks/useTabLoading.js.map +1 -1
  696. package/dist/v2/index.d.ts.map +1 -1
  697. package/dist/v2/index.js +143 -145
  698. package/dist/v2/index.js.map +1 -1
  699. package/dist/v2/modalContext.js +2 -2
  700. package/dist/v2/modalContext.js.map +1 -1
  701. package/dist/v2/models/favorite.d.ts +8 -9
  702. package/dist/v2/models/favorite.d.ts.map +1 -1
  703. package/dist/v2/models/favorite.js.map +1 -1
  704. package/dist/v2/models/index.js +4 -4
  705. package/dist/v2/models/index.js.map +1 -1
  706. package/dist/v2/models/personalization.d.ts +44 -48
  707. package/dist/v2/models/personalization.d.ts.map +1 -1
  708. package/dist/v2/models/personalization.js.map +1 -1
  709. package/dist/v2/models/referentiel.d.ts +32 -50
  710. package/dist/v2/models/referentiel.d.ts.map +1 -1
  711. package/dist/v2/models/referentiel.js.map +1 -1
  712. package/dist/v2/models/savedFilter.d.ts +8 -17
  713. package/dist/v2/models/savedFilter.d.ts.map +1 -1
  714. package/dist/v2/models/savedFilter.js.map +1 -1
  715. package/dist/v2/patterns/ActionBar.js +152 -187
  716. package/dist/v2/patterns/ActionBar.js.map +1 -1
  717. package/dist/v2/patterns/AppMain.d.ts +109 -0
  718. package/dist/v2/patterns/AppMain.d.ts.map +1 -0
  719. package/dist/v2/patterns/AppMain.js +115 -0
  720. package/dist/v2/patterns/AppMain.js.map +1 -0
  721. package/dist/v2/patterns/BulkActionBar.js +40 -42
  722. package/dist/v2/patterns/BulkActionBar.js.map +1 -1
  723. package/dist/v2/patterns/ChartFigure.d.ts +124 -0
  724. package/dist/v2/patterns/ChartFigure.d.ts.map +1 -0
  725. package/dist/v2/patterns/ChartFigure.js +159 -0
  726. package/dist/v2/patterns/ChartFigure.js.map +1 -0
  727. package/dist/v2/patterns/CollapsibleDataGrid.js +138 -174
  728. package/dist/v2/patterns/CollapsibleDataGrid.js.map +1 -1
  729. package/dist/v2/patterns/ColumnsToggle.js +60 -94
  730. package/dist/v2/patterns/ColumnsToggle.js.map +1 -1
  731. package/dist/v2/patterns/DataGrid.d.ts.map +1 -1
  732. package/dist/v2/patterns/DataGrid.js +262 -297
  733. package/dist/v2/patterns/DataGrid.js.map +1 -1
  734. package/dist/v2/patterns/DataGridSettingsMenu.d.ts +12 -0
  735. package/dist/v2/patterns/DataGridSettingsMenu.d.ts.map +1 -1
  736. package/dist/v2/patterns/DataGridSettingsMenu.js +104 -121
  737. package/dist/v2/patterns/DataGridSettingsMenu.js.map +1 -1
  738. package/dist/v2/patterns/DataGridToolbar.js +103 -106
  739. package/dist/v2/patterns/DataGridToolbar.js.map +1 -1
  740. package/dist/v2/patterns/DataGridVirtualized.js +179 -217
  741. package/dist/v2/patterns/DataGridVirtualized.js.map +1 -1
  742. package/dist/v2/patterns/DeleteResourceConfirmDialog.js +32 -35
  743. package/dist/v2/patterns/DeleteResourceConfirmDialog.js.map +1 -1
  744. package/dist/v2/patterns/DetailSplit.d.ts +87 -0
  745. package/dist/v2/patterns/DetailSplit.d.ts.map +1 -0
  746. package/dist/v2/patterns/DetailSplit.js +116 -0
  747. package/dist/v2/patterns/DetailSplit.js.map +1 -0
  748. package/dist/v2/patterns/FavoriteColumn.d.ts +9 -9
  749. package/dist/v2/patterns/FavoriteColumn.d.ts.map +1 -1
  750. package/dist/v2/patterns/FavoriteColumn.js +32 -80
  751. package/dist/v2/patterns/FavoriteColumn.js.map +1 -1
  752. package/dist/v2/patterns/FavoritesFilter.js +36 -44
  753. package/dist/v2/patterns/FavoritesFilter.js.map +1 -1
  754. package/dist/v2/patterns/FilterTabBar.d.ts +28 -0
  755. package/dist/v2/patterns/FilterTabBar.d.ts.map +1 -0
  756. package/dist/v2/patterns/FilterTabBar.js +120 -0
  757. package/dist/v2/patterns/FilterTabBar.js.map +1 -0
  758. package/dist/v2/patterns/FormErrorSummary.js +20 -23
  759. package/dist/v2/patterns/FormErrorSummary.js.map +1 -1
  760. package/dist/v2/patterns/FormPageShell.js +53 -50
  761. package/dist/v2/patterns/FormPageShell.js.map +1 -1
  762. package/dist/v2/patterns/FormSection.d.ts +8 -3
  763. package/dist/v2/patterns/FormSection.d.ts.map +1 -1
  764. package/dist/v2/patterns/FormSection.js +44 -51
  765. package/dist/v2/patterns/FormSection.js.map +1 -1
  766. package/dist/v2/patterns/FormikCheckbox.d.ts +77 -0
  767. package/dist/v2/patterns/FormikCheckbox.d.ts.map +1 -0
  768. package/dist/v2/patterns/FormikCheckbox.js +138 -0
  769. package/dist/v2/patterns/FormikCheckbox.js.map +1 -0
  770. package/dist/v2/patterns/FormikCheckboxGroup.d.ts +17 -1
  771. package/dist/v2/patterns/FormikCheckboxGroup.d.ts.map +1 -1
  772. package/dist/v2/patterns/FormikCheckboxGroup.js +62 -65
  773. package/dist/v2/patterns/FormikCheckboxGroup.js.map +1 -1
  774. package/dist/v2/patterns/FormikCombobox.d.ts +7 -1
  775. package/dist/v2/patterns/FormikCombobox.d.ts.map +1 -1
  776. package/dist/v2/patterns/FormikCombobox.js +55 -69
  777. package/dist/v2/patterns/FormikCombobox.js.map +1 -1
  778. package/dist/v2/patterns/FormikDatePicker.d.ts +13 -1
  779. package/dist/v2/patterns/FormikDatePicker.d.ts.map +1 -1
  780. package/dist/v2/patterns/FormikDatePicker.js +59 -106
  781. package/dist/v2/patterns/FormikDatePicker.js.map +1 -1
  782. package/dist/v2/patterns/FormikDateTimePicker.d.ts +111 -0
  783. package/dist/v2/patterns/FormikDateTimePicker.d.ts.map +1 -0
  784. package/dist/v2/patterns/FormikDateTimePicker.js +144 -0
  785. package/dist/v2/patterns/FormikDateTimePicker.js.map +1 -0
  786. package/dist/v2/patterns/FormikErrorFocus.js +25 -26
  787. package/dist/v2/patterns/FormikErrorFocus.js.map +1 -1
  788. package/dist/v2/patterns/FormikErrorSummary.d.ts +74 -0
  789. package/dist/v2/patterns/FormikErrorSummary.d.ts.map +1 -0
  790. package/dist/v2/patterns/FormikErrorSummary.js +97 -0
  791. package/dist/v2/patterns/FormikErrorSummary.js.map +1 -0
  792. package/dist/v2/patterns/FormikFile.d.ts +14 -1
  793. package/dist/v2/patterns/FormikFile.d.ts.map +1 -1
  794. package/dist/v2/patterns/FormikFile.js +99 -83
  795. package/dist/v2/patterns/FormikFile.js.map +1 -1
  796. package/dist/v2/patterns/FormikInput.d.ts +11 -1
  797. package/dist/v2/patterns/FormikInput.d.ts.map +1 -1
  798. package/dist/v2/patterns/FormikInput.js +45 -55
  799. package/dist/v2/patterns/FormikInput.js.map +1 -1
  800. package/dist/v2/patterns/FormikRadioGroup.d.ts +80 -0
  801. package/dist/v2/patterns/FormikRadioGroup.d.ts.map +1 -0
  802. package/dist/v2/patterns/FormikRadioGroup.js +137 -0
  803. package/dist/v2/patterns/FormikRadioGroup.js.map +1 -0
  804. package/dist/v2/patterns/FormikReferentielField.d.ts +12 -1
  805. package/dist/v2/patterns/FormikReferentielField.d.ts.map +1 -1
  806. package/dist/v2/patterns/FormikReferentielField.js +54 -64
  807. package/dist/v2/patterns/FormikReferentielField.js.map +1 -1
  808. package/dist/v2/patterns/FormikSelect.d.ts +9 -1
  809. package/dist/v2/patterns/FormikSelect.d.ts.map +1 -1
  810. package/dist/v2/patterns/FormikSelect.js +70 -89
  811. package/dist/v2/patterns/FormikSelect.js.map +1 -1
  812. package/dist/v2/patterns/FormikTextarea.d.ts +9 -1
  813. package/dist/v2/patterns/FormikTextarea.d.ts.map +1 -1
  814. package/dist/v2/patterns/FormikTextarea.js +35 -48
  815. package/dist/v2/patterns/FormikTextarea.js.map +1 -1
  816. package/dist/v2/patterns/KeyboardShortcutsHelp.d.ts +14 -1
  817. package/dist/v2/patterns/KeyboardShortcutsHelp.d.ts.map +1 -1
  818. package/dist/v2/patterns/KeyboardShortcutsHelp.js +71 -74
  819. package/dist/v2/patterns/KeyboardShortcutsHelp.js.map +1 -1
  820. package/dist/v2/patterns/NetworkErrorBanner.js +13 -16
  821. package/dist/v2/patterns/NetworkErrorBanner.js.map +1 -1
  822. package/dist/v2/patterns/PageContent.js +17 -20
  823. package/dist/v2/patterns/PageContent.js.map +1 -1
  824. package/dist/v2/patterns/PreviewDrawer.d.ts +49 -0
  825. package/dist/v2/patterns/PreviewDrawer.d.ts.map +1 -0
  826. package/dist/v2/patterns/PreviewDrawer.js +159 -0
  827. package/dist/v2/patterns/PreviewDrawer.js.map +1 -0
  828. package/dist/v2/patterns/ReferentielField.d.ts +86 -2
  829. package/dist/v2/patterns/ReferentielField.d.ts.map +1 -1
  830. package/dist/v2/patterns/ReferentielField.js +347 -327
  831. package/dist/v2/patterns/ReferentielField.js.map +1 -1
  832. package/dist/v2/patterns/RowFavoriteToggle.d.ts +98 -0
  833. package/dist/v2/patterns/RowFavoriteToggle.d.ts.map +1 -0
  834. package/dist/v2/patterns/RowFavoriteToggle.js +135 -0
  835. package/dist/v2/patterns/RowFavoriteToggle.js.map +1 -0
  836. package/dist/v2/patterns/SaveFilterDialog.js +50 -77
  837. package/dist/v2/patterns/SaveFilterDialog.js.map +1 -1
  838. package/dist/v2/patterns/SavedFiltersMenu.js +89 -107
  839. package/dist/v2/patterns/SavedFiltersMenu.js.map +1 -1
  840. package/dist/v2/patterns/SkeletonPageShell.js +122 -143
  841. package/dist/v2/patterns/SkeletonPageShell.js.map +1 -1
  842. package/dist/v2/patterns/SortableHeader.js +35 -57
  843. package/dist/v2/patterns/SortableHeader.js.map +1 -1
  844. package/dist/v2/patterns/Tour.js +121 -142
  845. package/dist/v2/patterns/Tour.js.map +1 -1
  846. package/dist/v2/patterns/_dataGridShared.d.ts.map +1 -1
  847. package/dist/v2/patterns/_dataGridShared.js +131 -147
  848. package/dist/v2/patterns/_dataGridShared.js.map +1 -1
  849. package/dist/v2/patterns/_pickerSerialisation.d.ts +44 -0
  850. package/dist/v2/patterns/_pickerSerialisation.d.ts.map +1 -0
  851. package/dist/v2/patterns/_pickerSerialisation.js +80 -0
  852. package/dist/v2/patterns/_pickerSerialisation.js.map +1 -0
  853. package/dist/v2/patterns/_sort.js +17 -33
  854. package/dist/v2/patterns/_sort.js.map +1 -1
  855. package/dist/v2/patterns/_useColumnReorder.js +124 -163
  856. package/dist/v2/patterns/_useColumnReorder.js.map +1 -1
  857. package/dist/v2/patterns/_useColumnResize.js +80 -99
  858. package/dist/v2/patterns/_useColumnResize.js.map +1 -1
  859. package/dist/v2/patterns/filterCriteria.d.ts +78 -0
  860. package/dist/v2/patterns/filterCriteria.d.ts.map +1 -0
  861. package/dist/v2/patterns/filterCriteria.js +110 -0
  862. package/dist/v2/patterns/filterCriteria.js.map +1 -0
  863. package/dist/v2/patterns/index.d.ts +247 -0
  864. package/dist/v2/patterns/index.d.ts.map +1 -1
  865. package/dist/v2/patterns/index.js +182 -70
  866. package/dist/v2/patterns/index.js.map +1 -1
  867. package/dist/v2/patterns/rowActions.d.ts +150 -0
  868. package/dist/v2/patterns/rowActions.d.ts.map +1 -0
  869. package/dist/v2/patterns/rowActions.js +232 -0
  870. package/dist/v2/patterns/rowActions.js.map +1 -0
  871. package/dist/v2/personalization/PersonalizationProvider.d.ts.map +1 -1
  872. package/dist/v2/personalization/PersonalizationProvider.js +57 -53
  873. package/dist/v2/personalization/PersonalizationProvider.js.map +1 -1
  874. package/dist/v2/personalization/adapters/_storageKey.js +5 -5
  875. package/dist/v2/personalization/adapters/_storageKey.js.map +1 -1
  876. package/dist/v2/personalization/adapters/createLocalStorageAdapter.js +25 -24
  877. package/dist/v2/personalization/adapters/createLocalStorageAdapter.js.map +1 -1
  878. package/dist/v2/personalization/adapters/createMemoryAdapter.js +14 -14
  879. package/dist/v2/personalization/adapters/createMemoryAdapter.js.map +1 -1
  880. package/dist/v2/personalization/adapters/index.js +5 -5
  881. package/dist/v2/personalization/adapters/index.js.map +1 -1
  882. package/dist/v2/personalization/capabilities/favorites.js +39 -62
  883. package/dist/v2/personalization/capabilities/favorites.js.map +1 -1
  884. package/dist/v2/personalization/capabilities/favoritesView.js +25 -37
  885. package/dist/v2/personalization/capabilities/favoritesView.js.map +1 -1
  886. package/dist/v2/personalization/capabilities/gridPreferences.d.ts +100 -0
  887. package/dist/v2/personalization/capabilities/gridPreferences.d.ts.map +1 -0
  888. package/dist/v2/personalization/capabilities/gridPreferences.js +210 -0
  889. package/dist/v2/personalization/capabilities/gridPreferences.js.map +1 -0
  890. package/dist/v2/personalization/capabilities/index.d.ts +6 -0
  891. package/dist/v2/personalization/capabilities/index.d.ts.map +1 -1
  892. package/dist/v2/personalization/capabilities/index.js +23 -10
  893. package/dist/v2/personalization/capabilities/index.js.map +1 -1
  894. package/dist/v2/personalization/capabilities/reviveSavedCriteria.d.ts +88 -0
  895. package/dist/v2/personalization/capabilities/reviveSavedCriteria.d.ts.map +1 -0
  896. package/dist/v2/personalization/capabilities/reviveSavedCriteria.js +126 -0
  897. package/dist/v2/personalization/capabilities/reviveSavedCriteria.js.map +1 -0
  898. package/dist/v2/personalization/capabilities/savedFilters.js +93 -100
  899. package/dist/v2/personalization/capabilities/savedFilters.js.map +1 -1
  900. package/dist/v2/personalization/createPersonalizationStore.d.ts.map +1 -1
  901. package/dist/v2/personalization/createPersonalizationStore.js +81 -182
  902. package/dist/v2/personalization/createPersonalizationStore.js.map +1 -1
  903. package/dist/v2/personalization/index.d.ts +34 -0
  904. package/dist/v2/personalization/index.d.ts.map +1 -1
  905. package/dist/v2/personalization/index.js +41 -21
  906. package/dist/v2/personalization/index.js.map +1 -1
  907. package/dist/v2/personalization/personalizationContext.js +10 -12
  908. package/dist/v2/personalization/personalizationContext.js.map +1 -1
  909. package/dist/v2/personalization/schema.js +8 -9
  910. package/dist/v2/personalization/schema.js.map +1 -1
  911. package/dist/v2/referentiel/ReferentielProvider.js +31 -45
  912. package/dist/v2/referentiel/ReferentielProvider.js.map +1 -1
  913. package/dist/v2/referentiel/index.js +11 -13
  914. package/dist/v2/referentiel/index.js.map +1 -1
  915. package/dist/v2/referentiel/types.d.ts +105 -0
  916. package/dist/v2/referentiel/types.d.ts.map +1 -0
  917. package/dist/v2/referentiel/types.js +6 -0
  918. package/dist/v2/referentiel/types.js.map +1 -0
  919. package/dist/v2/referentiel/useReferentielClient.js +13 -16
  920. package/dist/v2/referentiel/useReferentielClient.js.map +1 -1
  921. package/dist/v2/referentiel/useReferentielOptions.d.ts +7 -17
  922. package/dist/v2/referentiel/useReferentielOptions.d.ts.map +1 -1
  923. package/dist/v2/referentiel/useReferentielOptions.js +63 -120
  924. package/dist/v2/referentiel/useReferentielOptions.js.map +1 -1
  925. package/dist/v2/referentiel/useReferentielSearch.d.ts +7 -48
  926. package/dist/v2/referentiel/useReferentielSearch.d.ts.map +1 -1
  927. package/dist/v2/referentiel/useReferentielSearch.js +40 -95
  928. package/dist/v2/referentiel/useReferentielSearch.js.map +1 -1
  929. package/dist/v2/theme/_brand.js +12 -26
  930. package/dist/v2/theme/_brand.js.map +1 -1
  931. package/dist/v2/theme/_brandSecondary.js +12 -26
  932. package/dist/v2/theme/_brandSecondary.js.map +1 -1
  933. package/dist/v2/theme/createPortnetTheme.js +41 -49
  934. package/dist/v2/theme/createPortnetTheme.js.map +1 -1
  935. package/dist/v2/theme/cssVariables.d.ts +3 -3
  936. package/dist/v2/theme/cssVariables.d.ts.map +1 -1
  937. package/dist/v2/theme/cssVariables.js +65 -70
  938. package/dist/v2/theme/cssVariables.js.map +1 -1
  939. package/dist/v2/theme/index.js +10 -10
  940. package/dist/v2/theme/index.js.map +1 -1
  941. package/dist/v2/tokens/breakpoints.js +16 -16
  942. package/dist/v2/tokens/breakpoints.js.map +1 -1
  943. package/dist/v2/tokens/chart.d.ts +103 -0
  944. package/dist/v2/tokens/chart.d.ts.map +1 -0
  945. package/dist/v2/tokens/chart.js +270 -0
  946. package/dist/v2/tokens/chart.js.map +1 -0
  947. package/dist/v2/tokens/colors.js +24 -24
  948. package/dist/v2/tokens/colors.js.map +1 -1
  949. package/dist/v2/tokens/density.d.ts +104 -0
  950. package/dist/v2/tokens/density.d.ts.map +1 -1
  951. package/dist/v2/tokens/density.js +67 -12
  952. package/dist/v2/tokens/density.js.map +1 -1
  953. package/dist/v2/tokens/index.d.ts +50 -1
  954. package/dist/v2/tokens/index.d.ts.map +1 -1
  955. package/dist/v2/tokens/index.js +116 -68
  956. package/dist/v2/tokens/index.js.map +1 -1
  957. package/dist/v2/tokens/motion.js +16 -22
  958. package/dist/v2/tokens/motion.js.map +1 -1
  959. package/dist/v2/tokens/radius.js +3 -3
  960. package/dist/v2/tokens/radius.js.map +1 -1
  961. package/dist/v2/tokens/shadows.js +8 -8
  962. package/dist/v2/tokens/shadows.js.map +1 -1
  963. package/dist/v2/tokens/spacing.js +4 -4
  964. package/dist/v2/tokens/spacing.js.map +1 -1
  965. package/dist/v2/tokens/state.js +3 -3
  966. package/dist/v2/tokens/state.js.map +1 -1
  967. package/dist/v2/tokens/statusPalette.js +21 -23
  968. package/dist/v2/tokens/statusPalette.js.map +1 -1
  969. package/dist/v2/tokens/tokens.json +6 -1
  970. package/dist/v2/tokens/typography.js +15 -15
  971. package/dist/v2/tokens/typography.js.map +1 -1
  972. package/dist/v2/tokens/zIndex.js +3 -3
  973. package/dist/v2/tokens/zIndex.js.map +1 -1
  974. package/dist/v2/types/datagrid.d.ts +9 -1
  975. package/dist/v2/types/datagrid.d.ts.map +1 -1
  976. package/dist/v2/types/datagrid.js.map +1 -1
  977. package/dist/v2/types/index.js +2 -2
  978. package/dist/v2/types/index.js.map +1 -1
  979. package/dist/v2/utils/apiError.js +16 -37
  980. package/dist/v2/utils/apiError.js.map +1 -1
  981. package/dist/v2/utils/contrast.js +31 -32
  982. package/dist/v2/utils/contrast.js.map +1 -1
  983. package/dist/v2/utils/cx.js +7 -27
  984. package/dist/v2/utils/cx.js.map +1 -1
  985. package/dist/v2/utils/fileDownload.js +25 -28
  986. package/dist/v2/utils/fileDownload.js.map +1 -1
  987. package/dist/v2/utils/fileValidation.d.ts +116 -0
  988. package/dist/v2/utils/fileValidation.d.ts.map +1 -0
  989. package/dist/v2/utils/fileValidation.js +220 -0
  990. package/dist/v2/utils/fileValidation.js.map +1 -0
  991. package/dist/v2/utils/fmtDate.d.ts +103 -0
  992. package/dist/v2/utils/fmtDate.d.ts.map +1 -0
  993. package/dist/v2/utils/fmtDate.js +119 -0
  994. package/dist/v2/utils/fmtDate.js.map +1 -0
  995. package/dist/v2/utils/fmtMoney.d.ts +3 -3
  996. package/dist/v2/utils/fmtMoney.d.ts.map +1 -1
  997. package/dist/v2/utils/fmtMoney.js +9 -11
  998. package/dist/v2/utils/fmtMoney.js.map +1 -1
  999. package/dist/v2/utils/formikErrors.d.ts +67 -0
  1000. package/dist/v2/utils/formikErrors.d.ts.map +1 -0
  1001. package/dist/v2/utils/formikErrors.js +85 -0
  1002. package/dist/v2/utils/formikErrors.js.map +1 -0
  1003. package/dist/v2/utils/index.d.ts +5 -0
  1004. package/dist/v2/utils/index.d.ts.map +1 -1
  1005. package/dist/v2/utils/index.js +67 -18
  1006. package/dist/v2/utils/index.js.map +1 -1
  1007. package/dist/v2/utils/mergeLabels.js +9 -14
  1008. package/dist/v2/utils/mergeLabels.js.map +1 -1
  1009. package/dist/v2/utils/networkStatus.js +14 -14
  1010. package/dist/v2/utils/networkStatus.js.map +1 -1
  1011. package/package.json +26 -9
@@ -1,4 +1,3 @@
1
- function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
2
1
  /**
3
2
  * WCAG 2.1 contrast utilities — Portnet UI v2
4
3
  *
@@ -17,13 +16,13 @@ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" =
17
16
  /* ── WCAG AA thresholds (exported for caller readability) ──────── */
18
17
 
19
18
  /** Normal text contrast ratio threshold (AA). */
20
- export var WCAG_AA_NORMAL = 4.5;
19
+ export const WCAG_AA_NORMAL = 4.5;
21
20
 
22
21
  /** Large text (≥ 18pt or ≥ 14pt bold) contrast ratio threshold (AA). */
23
- export var WCAG_AA_LARGE = 3.0;
22
+ export const WCAG_AA_LARGE = 3.0;
24
23
 
25
24
  /** UI components & graphical objects contrast ratio threshold (AA 1.4.11). */
26
- export var WCAG_AA_UI_NON_TEXT = 3.0;
25
+ export const WCAG_AA_UI_NON_TEXT = 3.0;
27
26
 
28
27
  /* ── Color parsing ───────────────────────── */
29
28
 
@@ -45,11 +44,11 @@ export var WCAG_AA_UI_NON_TEXT = 3.0;
45
44
  */
46
45
  export function parseColor(input) {
47
46
  if (typeof input !== "string") return null;
48
- var s = input.trim();
47
+ const s = input.trim();
49
48
 
50
49
  // Hex (3, 6, or 8 digits; alpha dropped if present)
51
- var hexMatch = s.match(/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/);
52
- var hex = hexMatch === null || hexMatch === void 0 ? void 0 : hexMatch[1];
50
+ const hexMatch = s.match(/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/);
51
+ const hex = hexMatch?.[1];
53
52
  if (hex) {
54
53
  if (hex.length === 3) {
55
54
  return {
@@ -67,17 +66,16 @@ export function parseColor(input) {
67
66
  }
68
67
 
69
68
  // rgb() / rgba() — alpha dropped
70
- var rgbMatch = s.match(/^rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})/);
69
+ const rgbMatch = s.match(/^rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})/);
71
70
  if (rgbMatch) {
72
- var _rgbMatch$, _rgbMatch$2, _rgbMatch$3;
73
- var r = parseInt((_rgbMatch$ = rgbMatch[1]) !== null && _rgbMatch$ !== void 0 ? _rgbMatch$ : "", 10);
74
- var g = parseInt((_rgbMatch$2 = rgbMatch[2]) !== null && _rgbMatch$2 !== void 0 ? _rgbMatch$2 : "", 10);
75
- var b = parseInt((_rgbMatch$3 = rgbMatch[3]) !== null && _rgbMatch$3 !== void 0 ? _rgbMatch$3 : "", 10);
71
+ const r = parseInt(rgbMatch[1] ?? "", 10);
72
+ const g = parseInt(rgbMatch[2] ?? "", 10);
73
+ const b = parseInt(rgbMatch[3] ?? "", 10);
76
74
  if (Number.isFinite(r) && r >= 0 && r <= 255 && Number.isFinite(g) && g >= 0 && g <= 255 && Number.isFinite(b) && b >= 0 && b <= 255) {
77
75
  return {
78
- r: r,
79
- g: g,
80
- b: b
76
+ r,
77
+ g,
78
+ b
81
79
  };
82
80
  }
83
81
  }
@@ -88,7 +86,7 @@ export function parseColor(input) {
88
86
 
89
87
  /** sRGB channel → linear-light conversion per WCAG 2.1. */
90
88
  function srgbChannelToLinear(c) {
91
- var cs = c / 255;
89
+ const cs = c / 255;
92
90
  return cs <= 0.03928 ? cs / 12.92 : Math.pow((cs + 0.055) / 1.055, 2.4);
93
91
  }
94
92
 
@@ -98,14 +96,16 @@ function srgbChannelToLinear(c) {
98
96
  * Returns a number in 0..1, or null if input is invalid.
99
97
  */
100
98
  export function relativeLuminance(rgb) {
101
- if (!rgb || _typeof(rgb) !== "object") return null;
102
- var r = rgb.r,
103
- g = rgb.g,
104
- b = rgb.b;
99
+ if (!rgb || typeof rgb !== "object") return null;
100
+ const {
101
+ r,
102
+ g,
103
+ b
104
+ } = rgb;
105
105
  if (!Number.isFinite(r) || !Number.isFinite(g) || !Number.isFinite(b)) return null;
106
- var R = srgbChannelToLinear(r);
107
- var G = srgbChannelToLinear(g);
108
- var B = srgbChannelToLinear(b);
106
+ const R = srgbChannelToLinear(r);
107
+ const G = srgbChannelToLinear(g);
108
+ const B = srgbChannelToLinear(b);
109
109
  return 0.2126 * R + 0.7152 * G + 0.0722 * B;
110
110
  }
111
111
 
@@ -117,13 +117,13 @@ export function relativeLuminance(rgb) {
117
117
  * [1.0, 21.0], or null if either input is unparseable.
118
118
  */
119
119
  export function contrastRatio(c1, c2) {
120
- var rgb1 = typeof c1 === "string" ? parseColor(c1) : c1;
121
- var rgb2 = typeof c2 === "string" ? parseColor(c2) : c2;
122
- var L1 = relativeLuminance(rgb1);
123
- var L2 = relativeLuminance(rgb2);
120
+ const rgb1 = typeof c1 === "string" ? parseColor(c1) : c1;
121
+ const rgb2 = typeof c2 === "string" ? parseColor(c2) : c2;
122
+ const L1 = relativeLuminance(rgb1);
123
+ const L2 = relativeLuminance(rgb2);
124
124
  if (L1 == null || L2 == null) return null;
125
- var lighter = Math.max(L1, L2);
126
- var darker = Math.min(L1, L2);
125
+ const lighter = Math.max(L1, L2);
126
+ const darker = Math.min(L1, L2);
127
127
  return (lighter + 0.05) / (darker + 0.05);
128
128
  }
129
129
 
@@ -136,10 +136,9 @@ export function contrastRatio(c1, c2) {
136
136
  * `level` accepts "normal" | "large" | "ui". Unknown levels default
137
137
  * to the strictest threshold.
138
138
  */
139
- export function passesContrast(ratio) {
140
- var level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "normal";
139
+ export function passesContrast(ratio, level = "normal") {
141
140
  if (ratio == null || !Number.isFinite(ratio)) return false;
142
- var threshold;
141
+ let threshold;
143
142
  switch (level) {
144
143
  case "large":
145
144
  threshold = WCAG_AA_LARGE;
@@ -1 +1 @@
1
- {"version":3,"file":"contrast.js","names":["WCAG_AA_NORMAL","WCAG_AA_LARGE","WCAG_AA_UI_NON_TEXT","parseColor","input","s","trim","hexMatch","match","hex","length","r","parseInt","charAt","g","b","slice","rgbMatch","_rgbMatch$","_rgbMatch$2","_rgbMatch$3","Number","isFinite","srgbChannelToLinear","c","cs","Math","pow","relativeLuminance","rgb","_typeof","R","G","B","contrastRatio","c1","c2","rgb1","rgb2","L1","L2","lighter","max","darker","min","passesContrast","ratio","level","arguments","undefined","threshold"],"sources":["../../../../src/lib/v2/utils/contrast.ts"],"sourcesContent":["/**\r\n * WCAG 2.1 contrast utilities — Portnet UI v2\r\n *\r\n * Reference: https://www.w3.org/TR/WCAG21/#dfn-contrast-ratio\r\n *\r\n * Pure functions, framework-agnostic, no deps. Reusable by any\r\n * host module that needs to validate a runtime brand override\r\n * against WCAG 1.4.3 AA (typical scenario: a host-shell event\r\n * injects a tenant brand and the consumer wants to dev-warn when\r\n * the resulting accent/foreground pair drops below 4.5:1).\r\n *\r\n * Also used by the dark-mode work (F29) to audit dual-mode token\r\n * pairs and by Storybook contrast stories.\r\n */\r\n\r\n/* ── WCAG AA thresholds (exported for caller readability) ──────── */\r\n\r\n/** Normal text contrast ratio threshold (AA). */\r\nexport const WCAG_AA_NORMAL = 4.5;\r\n\r\n/** Large text (≥ 18pt or ≥ 14pt bold) contrast ratio threshold (AA). */\r\nexport const WCAG_AA_LARGE = 3.0;\r\n\r\n/** UI components & graphical objects contrast ratio threshold (AA 1.4.11). */\r\nexport const WCAG_AA_UI_NON_TEXT = 3.0;\r\n\r\n/* ── Color parsing ───────────────────────── */\r\n\r\ntype RGB = { r: number; g: number; b: number };\r\n\r\n/**\r\n * Parse a CSS color string into an { r, g, b } object with 0..255\r\n * channels. Returns null for unparseable input.\r\n *\r\n * Supported formats:\r\n * - \"#RGB\" (3-digit hex shorthand)\r\n * - \"#RRGGBB\" (6-digit hex)\r\n * - \"#RRGGBBAA\" (8-digit hex; alpha channel is dropped)\r\n * - \"rgb(r, g, b)\"\r\n * - \"rgba(r, g, b, a)\" (alpha dropped)\r\n *\r\n * HSL / HWB / LAB / named-colors are NOT supported — the v2 token\r\n * surface and observed host-shell brand payloads are always hex\r\n * or rgb(). A wider parser can be swapped in later without\r\n * changing the public API of this function.\r\n */\r\nexport function parseColor(input: unknown): RGB | null {\r\n if (typeof input !== \"string\") return null;\r\n const s = input.trim();\r\n\r\n // Hex (3, 6, or 8 digits; alpha dropped if present)\r\n const hexMatch = s.match(/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/);\r\n const hex = hexMatch?.[1];\r\n if (hex) {\r\n if (hex.length === 3) {\r\n return {\r\n r: parseInt(hex.charAt(0) + hex.charAt(0), 16),\r\n g: parseInt(hex.charAt(1) + hex.charAt(1), 16),\r\n b: parseInt(hex.charAt(2) + hex.charAt(2), 16),\r\n };\r\n }\r\n // 6 or 8 digit — first 6 chars are RGB\r\n return {\r\n r: parseInt(hex.slice(0, 2), 16),\r\n g: parseInt(hex.slice(2, 4), 16),\r\n b: parseInt(hex.slice(4, 6), 16),\r\n };\r\n }\r\n\r\n // rgb() / rgba() — alpha dropped\r\n const rgbMatch = s.match(\r\n /^rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})/\r\n );\r\n if (rgbMatch) {\r\n const r = parseInt(rgbMatch[1] ?? \"\", 10);\r\n const g = parseInt(rgbMatch[2] ?? \"\", 10);\r\n const b = parseInt(rgbMatch[3] ?? \"\", 10);\r\n if (\r\n Number.isFinite(r) && r >= 0 && r <= 255 &&\r\n Number.isFinite(g) && g >= 0 && g <= 255 &&\r\n Number.isFinite(b) && b >= 0 && b <= 255\r\n ) {\r\n return { r, g, b };\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/* ── Luminance & ratio ───────────────────── */\r\n\r\n/** sRGB channel → linear-light conversion per WCAG 2.1. */\r\nfunction srgbChannelToLinear(c: number): number {\r\n const cs = c / 255;\r\n return cs <= 0.03928 ? cs / 12.92 : Math.pow((cs + 0.055) / 1.055, 2.4);\r\n}\r\n\r\n/**\r\n * Compute relative luminance of an sRGB color per WCAG 2.1.\r\n * Accepts an { r, g, b } object (channels in 0..255).\r\n * Returns a number in 0..1, or null if input is invalid.\r\n */\r\nexport function relativeLuminance(rgb: RGB | null | undefined): number | null {\r\n if (!rgb || typeof rgb !== \"object\") return null;\r\n const { r, g, b } = rgb;\r\n if (\r\n !Number.isFinite(r) || !Number.isFinite(g) || !Number.isFinite(b)\r\n ) return null;\r\n const R = srgbChannelToLinear(r);\r\n const G = srgbChannelToLinear(g);\r\n const B = srgbChannelToLinear(b);\r\n return 0.2126 * R + 0.7152 * G + 0.0722 * B;\r\n}\r\n\r\n/**\r\n * WCAG contrast ratio between two colors.\r\n *\r\n * Accepts either CSS color strings (parsed via parseColor) or\r\n * already-parsed { r, g, b } objects. Returns a number in\r\n * [1.0, 21.0], or null if either input is unparseable.\r\n */\r\nexport function contrastRatio(\r\n c1: string | RGB,\r\n c2: string | RGB\r\n): number | null {\r\n const rgb1 = typeof c1 === \"string\" ? parseColor(c1) : c1;\r\n const rgb2 = typeof c2 === \"string\" ? parseColor(c2) : c2;\r\n const L1 = relativeLuminance(rgb1);\r\n const L2 = relativeLuminance(rgb2);\r\n if (L1 == null || L2 == null) return null;\r\n const lighter = Math.max(L1, L2);\r\n const darker = Math.min(L1, L2);\r\n return (lighter + 0.05) / (darker + 0.05);\r\n}\r\n\r\n/**\r\n * Verdict helper — `passesContrast(ratio, \"normal\")` returns true\r\n * if the ratio meets the requested WCAG AA threshold. Returns\r\n * false on null ratios so callers can treat unparseable inputs as\r\n * failures.\r\n *\r\n * `level` accepts \"normal\" | \"large\" | \"ui\". Unknown levels default\r\n * to the strictest threshold.\r\n */\r\nexport function passesContrast(\r\n ratio: number | null | undefined,\r\n level: \"normal\" | \"large\" | \"ui\" = \"normal\"\r\n): boolean {\r\n if (ratio == null || !Number.isFinite(ratio)) return false;\r\n let threshold: number;\r\n switch (level) {\r\n case \"large\":\r\n threshold = WCAG_AA_LARGE;\r\n break;\r\n case \"ui\":\r\n threshold = WCAG_AA_UI_NON_TEXT;\r\n break;\r\n case \"normal\":\r\n default:\r\n threshold = WCAG_AA_NORMAL;\r\n break;\r\n }\r\n return ratio >= threshold;\r\n}\r\n"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,OAAO,IAAMA,cAAc,GAAG,GAAG;;AAEjC;AACA,OAAO,IAAMC,aAAa,GAAG,GAAG;;AAEhC;AACA,OAAO,IAAMC,mBAAmB,GAAG,GAAG;;AAEtC;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,UAAUA,CAACC,KAAc,EAAc;EACrD,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE,OAAO,IAAI;EAC1C,IAAMC,CAAC,GAAGD,KAAK,CAACE,IAAI,CAAC,CAAC;;EAEtB;EACA,IAAMC,QAAQ,GAAGF,CAAC,CAACG,KAAK,CAAC,mDAAmD,CAAC;EAC7E,IAAMC,GAAG,GAAGF,QAAQ,aAARA,QAAQ,uBAARA,QAAQ,CAAG,CAAC,CAAC;EACzB,IAAIE,GAAG,EAAE;IACP,IAAIA,GAAG,CAACC,MAAM,KAAK,CAAC,EAAE;MACpB,OAAO;QACLC,CAAC,EAAEC,QAAQ,CAACH,GAAG,CAACI,MAAM,CAAC,CAAC,CAAC,GAAGJ,GAAG,CAACI,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC9CC,CAAC,EAAEF,QAAQ,CAACH,GAAG,CAACI,MAAM,CAAC,CAAC,CAAC,GAAGJ,GAAG,CAACI,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC9CE,CAAC,EAAEH,QAAQ,CAACH,GAAG,CAACI,MAAM,CAAC,CAAC,CAAC,GAAGJ,GAAG,CAACI,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;MAC/C,CAAC;IACH;IACA;IACA,OAAO;MACLF,CAAC,EAAEC,QAAQ,CAACH,GAAG,CAACO,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;MAChCF,CAAC,EAAEF,QAAQ,CAACH,GAAG,CAACO,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;MAChCD,CAAC,EAAEH,QAAQ,CAACH,GAAG,CAACO,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;IACjC,CAAC;EACH;;EAEA;EACA,IAAMC,QAAQ,GAAGZ,CAAC,CAACG,KAAK,CACtB,sDACF,CAAC;EACD,IAAIS,QAAQ,EAAE;IAAA,IAAAC,UAAA,EAAAC,WAAA,EAAAC,WAAA;IACZ,IAAMT,CAAC,GAAGC,QAAQ,EAAAM,UAAA,GAACD,QAAQ,CAAC,CAAC,CAAC,cAAAC,UAAA,cAAAA,UAAA,GAAI,EAAE,EAAE,EAAE,CAAC;IACzC,IAAMJ,CAAC,GAAGF,QAAQ,EAAAO,WAAA,GAACF,QAAQ,CAAC,CAAC,CAAC,cAAAE,WAAA,cAAAA,WAAA,GAAI,EAAE,EAAE,EAAE,CAAC;IACzC,IAAMJ,CAAC,GAAGH,QAAQ,EAAAQ,WAAA,GAACH,QAAQ,CAAC,CAAC,CAAC,cAAAG,WAAA,cAAAA,WAAA,GAAI,EAAE,EAAE,EAAE,CAAC;IACzC,IACEC,MAAM,CAACC,QAAQ,CAACX,CAAC,CAAC,IAAIA,CAAC,IAAI,CAAC,IAAIA,CAAC,IAAI,GAAG,IACxCU,MAAM,CAACC,QAAQ,CAACR,CAAC,CAAC,IAAIA,CAAC,IAAI,CAAC,IAAIA,CAAC,IAAI,GAAG,IACxCO,MAAM,CAACC,QAAQ,CAACP,CAAC,CAAC,IAAIA,CAAC,IAAI,CAAC,IAAIA,CAAC,IAAI,GAAG,EACxC;MACA,OAAO;QAAEJ,CAAC,EAADA,CAAC;QAAEG,CAAC,EAADA,CAAC;QAAEC,CAAC,EAADA;MAAE,CAAC;IACpB;EACF;EAEA,OAAO,IAAI;AACb;;AAEA;;AAEA;AACA,SAASQ,mBAAmBA,CAACC,CAAS,EAAU;EAC9C,IAAMC,EAAE,GAAGD,CAAC,GAAG,GAAG;EAClB,OAAOC,EAAE,IAAI,OAAO,GAAGA,EAAE,GAAG,KAAK,GAAGC,IAAI,CAACC,GAAG,CAAC,CAACF,EAAE,GAAG,KAAK,IAAI,KAAK,EAAE,GAAG,CAAC;AACzE;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASG,iBAAiBA,CAACC,GAA2B,EAAiB;EAC5E,IAAI,CAACA,GAAG,IAAIC,OAAA,CAAOD,GAAG,MAAK,QAAQ,EAAE,OAAO,IAAI;EAChD,IAAQlB,CAAC,GAAWkB,GAAG,CAAflB,CAAC;IAAEG,CAAC,GAAQe,GAAG,CAAZf,CAAC;IAAEC,CAAC,GAAKc,GAAG,CAATd,CAAC;EACf,IACE,CAACM,MAAM,CAACC,QAAQ,CAACX,CAAC,CAAC,IAAI,CAACU,MAAM,CAACC,QAAQ,CAACR,CAAC,CAAC,IAAI,CAACO,MAAM,CAACC,QAAQ,CAACP,CAAC,CAAC,EACjE,OAAO,IAAI;EACb,IAAMgB,CAAC,GAAGR,mBAAmB,CAACZ,CAAC,CAAC;EAChC,IAAMqB,CAAC,GAAGT,mBAAmB,CAACT,CAAC,CAAC;EAChC,IAAMmB,CAAC,GAAGV,mBAAmB,CAACR,CAAC,CAAC;EAChC,OAAO,MAAM,GAAGgB,CAAC,GAAG,MAAM,GAAGC,CAAC,GAAG,MAAM,GAAGC,CAAC;AAC7C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,aAAaA,CAC3BC,EAAgB,EAChBC,EAAgB,EACD;EACf,IAAMC,IAAI,GAAG,OAAOF,EAAE,KAAK,QAAQ,GAAGhC,UAAU,CAACgC,EAAE,CAAC,GAAGA,EAAE;EACzD,IAAMG,IAAI,GAAG,OAAOF,EAAE,KAAK,QAAQ,GAAGjC,UAAU,CAACiC,EAAE,CAAC,GAAGA,EAAE;EACzD,IAAMG,EAAE,GAAGX,iBAAiB,CAACS,IAAI,CAAC;EAClC,IAAMG,EAAE,GAAGZ,iBAAiB,CAACU,IAAI,CAAC;EAClC,IAAIC,EAAE,IAAI,IAAI,IAAIC,EAAE,IAAI,IAAI,EAAE,OAAO,IAAI;EACzC,IAAMC,OAAO,GAAGf,IAAI,CAACgB,GAAG,CAACH,EAAE,EAAEC,EAAE,CAAC;EAChC,IAAMG,MAAM,GAAIjB,IAAI,CAACkB,GAAG,CAACL,EAAE,EAAEC,EAAE,CAAC;EAChC,OAAO,CAACC,OAAO,GAAG,IAAI,KAAKE,MAAM,GAAG,IAAI,CAAC;AAC3C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASE,cAAcA,CAC5BC,KAAgC,EAEvB;EAAA,IADTC,KAAgC,GAAAC,SAAA,CAAAtC,MAAA,QAAAsC,SAAA,QAAAC,SAAA,GAAAD,SAAA,MAAG,QAAQ;EAE3C,IAAIF,KAAK,IAAI,IAAI,IAAI,CAACzB,MAAM,CAACC,QAAQ,CAACwB,KAAK,CAAC,EAAE,OAAO,KAAK;EAC1D,IAAII,SAAiB;EACrB,QAAQH,KAAK;IACX,KAAK,OAAO;MACVG,SAAS,GAAGjD,aAAa;MACzB;IACF,KAAK,IAAI;MACPiD,SAAS,GAAGhD,mBAAmB;MAC/B;IACF,KAAK,QAAQ;IACb;MACEgD,SAAS,GAAGlD,cAAc;MAC1B;EACJ;EACA,OAAO8C,KAAK,IAAII,SAAS;AAC3B","ignoreList":[]}
1
+ {"version":3,"file":"contrast.js","names":["WCAG_AA_NORMAL","WCAG_AA_LARGE","WCAG_AA_UI_NON_TEXT","parseColor","input","s","trim","hexMatch","match","hex","length","r","parseInt","charAt","g","b","slice","rgbMatch","Number","isFinite","srgbChannelToLinear","c","cs","Math","pow","relativeLuminance","rgb","R","G","B","contrastRatio","c1","c2","rgb1","rgb2","L1","L2","lighter","max","darker","min","passesContrast","ratio","level","threshold"],"sources":["../../../../src/lib/v2/utils/contrast.ts"],"sourcesContent":["/**\r\n * WCAG 2.1 contrast utilities — Portnet UI v2\r\n *\r\n * Reference: https://www.w3.org/TR/WCAG21/#dfn-contrast-ratio\r\n *\r\n * Pure functions, framework-agnostic, no deps. Reusable by any\r\n * host module that needs to validate a runtime brand override\r\n * against WCAG 1.4.3 AA (typical scenario: a host-shell event\r\n * injects a tenant brand and the consumer wants to dev-warn when\r\n * the resulting accent/foreground pair drops below 4.5:1).\r\n *\r\n * Also used by the dark-mode work (F29) to audit dual-mode token\r\n * pairs and by Storybook contrast stories.\r\n */\r\n\r\n/* ── WCAG AA thresholds (exported for caller readability) ──────── */\r\n\r\n/** Normal text contrast ratio threshold (AA). */\r\nexport const WCAG_AA_NORMAL = 4.5;\r\n\r\n/** Large text (≥ 18pt or ≥ 14pt bold) contrast ratio threshold (AA). */\r\nexport const WCAG_AA_LARGE = 3.0;\r\n\r\n/** UI components & graphical objects contrast ratio threshold (AA 1.4.11). */\r\nexport const WCAG_AA_UI_NON_TEXT = 3.0;\r\n\r\n/* ── Color parsing ───────────────────────── */\r\n\r\ntype RGB = { r: number; g: number; b: number };\r\n\r\n/**\r\n * Parse a CSS color string into an { r, g, b } object with 0..255\r\n * channels. Returns null for unparseable input.\r\n *\r\n * Supported formats:\r\n * - \"#RGB\" (3-digit hex shorthand)\r\n * - \"#RRGGBB\" (6-digit hex)\r\n * - \"#RRGGBBAA\" (8-digit hex; alpha channel is dropped)\r\n * - \"rgb(r, g, b)\"\r\n * - \"rgba(r, g, b, a)\" (alpha dropped)\r\n *\r\n * HSL / HWB / LAB / named-colors are NOT supported — the v2 token\r\n * surface and observed host-shell brand payloads are always hex\r\n * or rgb(). A wider parser can be swapped in later without\r\n * changing the public API of this function.\r\n */\r\nexport function parseColor(input: unknown): RGB | null {\r\n if (typeof input !== \"string\") return null;\r\n const s = input.trim();\r\n\r\n // Hex (3, 6, or 8 digits; alpha dropped if present)\r\n const hexMatch = s.match(/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/);\r\n const hex = hexMatch?.[1];\r\n if (hex) {\r\n if (hex.length === 3) {\r\n return {\r\n r: parseInt(hex.charAt(0) + hex.charAt(0), 16),\r\n g: parseInt(hex.charAt(1) + hex.charAt(1), 16),\r\n b: parseInt(hex.charAt(2) + hex.charAt(2), 16),\r\n };\r\n }\r\n // 6 or 8 digit — first 6 chars are RGB\r\n return {\r\n r: parseInt(hex.slice(0, 2), 16),\r\n g: parseInt(hex.slice(2, 4), 16),\r\n b: parseInt(hex.slice(4, 6), 16),\r\n };\r\n }\r\n\r\n // rgb() / rgba() — alpha dropped\r\n const rgbMatch = s.match(\r\n /^rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})/\r\n );\r\n if (rgbMatch) {\r\n const r = parseInt(rgbMatch[1] ?? \"\", 10);\r\n const g = parseInt(rgbMatch[2] ?? \"\", 10);\r\n const b = parseInt(rgbMatch[3] ?? \"\", 10);\r\n if (\r\n Number.isFinite(r) && r >= 0 && r <= 255 &&\r\n Number.isFinite(g) && g >= 0 && g <= 255 &&\r\n Number.isFinite(b) && b >= 0 && b <= 255\r\n ) {\r\n return { r, g, b };\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/* ── Luminance & ratio ───────────────────── */\r\n\r\n/** sRGB channel → linear-light conversion per WCAG 2.1. */\r\nfunction srgbChannelToLinear(c: number): number {\r\n const cs = c / 255;\r\n return cs <= 0.03928 ? cs / 12.92 : Math.pow((cs + 0.055) / 1.055, 2.4);\r\n}\r\n\r\n/**\r\n * Compute relative luminance of an sRGB color per WCAG 2.1.\r\n * Accepts an { r, g, b } object (channels in 0..255).\r\n * Returns a number in 0..1, or null if input is invalid.\r\n */\r\nexport function relativeLuminance(rgb: RGB | null | undefined): number | null {\r\n if (!rgb || typeof rgb !== \"object\") return null;\r\n const { r, g, b } = rgb;\r\n if (\r\n !Number.isFinite(r) || !Number.isFinite(g) || !Number.isFinite(b)\r\n ) return null;\r\n const R = srgbChannelToLinear(r);\r\n const G = srgbChannelToLinear(g);\r\n const B = srgbChannelToLinear(b);\r\n return 0.2126 * R + 0.7152 * G + 0.0722 * B;\r\n}\r\n\r\n/**\r\n * WCAG contrast ratio between two colors.\r\n *\r\n * Accepts either CSS color strings (parsed via parseColor) or\r\n * already-parsed { r, g, b } objects. Returns a number in\r\n * [1.0, 21.0], or null if either input is unparseable.\r\n */\r\nexport function contrastRatio(\r\n c1: string | RGB,\r\n c2: string | RGB\r\n): number | null {\r\n const rgb1 = typeof c1 === \"string\" ? parseColor(c1) : c1;\r\n const rgb2 = typeof c2 === \"string\" ? parseColor(c2) : c2;\r\n const L1 = relativeLuminance(rgb1);\r\n const L2 = relativeLuminance(rgb2);\r\n if (L1 == null || L2 == null) return null;\r\n const lighter = Math.max(L1, L2);\r\n const darker = Math.min(L1, L2);\r\n return (lighter + 0.05) / (darker + 0.05);\r\n}\r\n\r\n/**\r\n * Verdict helper — `passesContrast(ratio, \"normal\")` returns true\r\n * if the ratio meets the requested WCAG AA threshold. Returns\r\n * false on null ratios so callers can treat unparseable inputs as\r\n * failures.\r\n *\r\n * `level` accepts \"normal\" | \"large\" | \"ui\". Unknown levels default\r\n * to the strictest threshold.\r\n */\r\nexport function passesContrast(\r\n ratio: number | null | undefined,\r\n level: \"normal\" | \"large\" | \"ui\" = \"normal\"\r\n): boolean {\r\n if (ratio == null || !Number.isFinite(ratio)) return false;\r\n let threshold: number;\r\n switch (level) {\r\n case \"large\":\r\n threshold = WCAG_AA_LARGE;\r\n break;\r\n case \"ui\":\r\n threshold = WCAG_AA_UI_NON_TEXT;\r\n break;\r\n case \"normal\":\r\n default:\r\n threshold = WCAG_AA_NORMAL;\r\n break;\r\n }\r\n return ratio >= threshold;\r\n}\r\n"],"mappings":"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","ignoreList":[]}
@@ -1,35 +1,15 @@
1
- function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
2
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
- function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0) { ; } } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i["return"] && (_r = _i["return"](), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
4
- function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
5
- function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
6
- function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
7
- function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
8
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
9
- function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
10
- function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
11
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
12
1
  /**
13
2
  * cx — minimal classnames composer
14
3
  *
15
4
  * cx("a", cond && "b", { "c": isC }) → "a b c"
16
5
  */
17
6
 
18
- export function cx() {
19
- var out = [];
20
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
21
- args[_key] = arguments[_key];
22
- }
23
- for (var _i = 0, _args = args; _i < _args.length; _i++) {
24
- var a = _args[_i];
7
+ export function cx(...args) {
8
+ const out = [];
9
+ for (const a of args) {
25
10
  if (!a) continue;
26
- if (typeof a === "string" || typeof a === "number") out.push(String(a));else if (Array.isArray(a)) out.push(cx.apply(void 0, _toConsumableArray(a)));else if (_typeof(a) === "object") {
27
- for (var _i2 = 0, _Object$entries = Object.entries(a); _i2 < _Object$entries.length; _i2++) {
28
- var _Object$entries$_i = _slicedToArray(_Object$entries[_i2], 2),
29
- k = _Object$entries$_i[0],
30
- v = _Object$entries$_i[1];
31
- if (v) out.push(k);
32
- }
11
+ if (typeof a === "string" || typeof a === "number") out.push(String(a));else if (Array.isArray(a)) out.push(cx(...a));else if (typeof a === "object") {
12
+ for (const [k, v] of Object.entries(a)) if (v) out.push(k);
33
13
  }
34
14
  }
35
15
  return out.join(" ");
@@ -1 +1 @@
1
- {"version":3,"file":"cx.js","names":["cx","out","_len","arguments","length","args","Array","_key","_i","_args","a","push","String","isArray","apply","_toConsumableArray","_typeof","_i2","_Object$entries","Object","entries","_Object$entries$_i","_slicedToArray","k","v","join"],"sources":["../../../../src/lib/v2/utils/cx.ts"],"sourcesContent":["/**\r\n * cx — minimal classnames composer\r\n *\r\n * cx(\"a\", cond && \"b\", { \"c\": isC }) → \"a b c\"\r\n */\r\ntype ClassValue =\r\n | string\r\n | number\r\n | null\r\n | undefined\r\n | boolean\r\n | ClassValue[]\r\n | Record<string, unknown>;\r\n\r\nexport function cx(...args: ClassValue[]): string {\r\n const out: string[] = [];\r\n for (const a of args) {\r\n if (!a) continue;\r\n if (typeof a === \"string\" || typeof a === \"number\") out.push(String(a));\r\n else if (Array.isArray(a)) out.push(cx(...a));\r\n else if (typeof a === \"object\") {\r\n for (const [k, v] of Object.entries(a)) if (v) out.push(k);\r\n }\r\n }\r\n return out.join(\" \");\r\n}\r\n\r\nexport default cx;\r\n"],"mappings":";;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;;AAUA,OAAO,SAASA,EAAEA,CAAA,EAAgC;EAChD,IAAMC,GAAa,GAAG,EAAE;EAAC,SAAAC,IAAA,GAAAC,SAAA,CAAAC,MAAA,EADLC,IAAI,OAAAC,KAAA,CAAAJ,IAAA,GAAAK,IAAA,MAAAA,IAAA,GAAAL,IAAA,EAAAK,IAAA;IAAJF,IAAI,CAAAE,IAAA,IAAAJ,SAAA,CAAAI,IAAA;EAAA;EAExB,SAAAC,EAAA,MAAAC,KAAA,GAAgBJ,IAAI,EAAAG,EAAA,GAAAC,KAAA,CAAAL,MAAA,EAAAI,EAAA,IAAE;IAAjB,IAAME,CAAC,GAAAD,KAAA,CAAAD,EAAA;IACV,IAAI,CAACE,CAAC,EAAE;IACR,IAAI,OAAOA,CAAC,KAAK,QAAQ,IAAI,OAAOA,CAAC,KAAK,QAAQ,EAAET,GAAG,CAACU,IAAI,CAACC,MAAM,CAACF,CAAC,CAAC,CAAC,CAAC,KACnE,IAAIJ,KAAK,CAACO,OAAO,CAACH,CAAC,CAAC,EAAET,GAAG,CAACU,IAAI,CAACX,EAAE,CAAAc,KAAA,SAAAC,kBAAA,CAAIL,CAAC,EAAC,CAAC,CAAC,KACzC,IAAIM,OAAA,CAAON,CAAC,MAAK,QAAQ,EAAE;MAC9B,SAAAO,GAAA,MAAAC,eAAA,GAAqBC,MAAM,CAACC,OAAO,CAACV,CAAC,CAAC,EAAAO,GAAA,GAAAC,eAAA,CAAAd,MAAA,EAAAa,GAAA;QAAjC,IAAAI,kBAAA,GAAAC,cAAA,CAAAJ,eAAA,CAAAD,GAAA;UAAOM,CAAC,GAAAF,kBAAA;UAAEG,CAAC,GAAAH,kBAAA;QAAwB,IAAIG,CAAC,EAAEvB,GAAG,CAACU,IAAI,CAACY,CAAC,CAAC;MAAC;IAC7D;EACF;EACA,OAAOtB,GAAG,CAACwB,IAAI,CAAC,GAAG,CAAC;AACtB;AAEA,eAAezB,EAAE","ignoreList":[]}
1
+ {"version":3,"file":"cx.js","names":["cx","args","out","a","push","String","Array","isArray","k","v","Object","entries","join"],"sources":["../../../../src/lib/v2/utils/cx.ts"],"sourcesContent":["/**\r\n * cx — minimal classnames composer\r\n *\r\n * cx(\"a\", cond && \"b\", { \"c\": isC }) → \"a b c\"\r\n */\r\ntype ClassValue =\r\n | string\r\n | number\r\n | null\r\n | undefined\r\n | boolean\r\n | ClassValue[]\r\n | Record<string, unknown>;\r\n\r\nexport function cx(...args: ClassValue[]): string {\r\n const out: string[] = [];\r\n for (const a of args) {\r\n if (!a) continue;\r\n if (typeof a === \"string\" || typeof a === \"number\") out.push(String(a));\r\n else if (Array.isArray(a)) out.push(cx(...a));\r\n else if (typeof a === \"object\") {\r\n for (const [k, v] of Object.entries(a)) if (v) out.push(k);\r\n }\r\n }\r\n return out.join(\" \");\r\n}\r\n\r\nexport default cx;\r\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;;AAUA,OAAO,SAASA,EAAEA,CAAC,GAAGC,IAAkB,EAAU;EAChD,MAAMC,GAAa,GAAG,EAAE;EACxB,KAAK,MAAMC,CAAC,IAAIF,IAAI,EAAE;IACpB,IAAI,CAACE,CAAC,EAAE;IACR,IAAI,OAAOA,CAAC,KAAK,QAAQ,IAAI,OAAOA,CAAC,KAAK,QAAQ,EAAED,GAAG,CAACE,IAAI,CAACC,MAAM,CAACF,CAAC,CAAC,CAAC,CAAC,KACnE,IAAIG,KAAK,CAACC,OAAO,CAACJ,CAAC,CAAC,EAAED,GAAG,CAACE,IAAI,CAACJ,EAAE,CAAC,GAAGG,CAAC,CAAC,CAAC,CAAC,KACzC,IAAI,OAAOA,CAAC,KAAK,QAAQ,EAAE;MAC9B,KAAK,MAAM,CAACK,CAAC,EAAEC,CAAC,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACR,CAAC,CAAC,EAAE,IAAIM,CAAC,EAAEP,GAAG,CAACE,IAAI,CAACI,CAAC,CAAC;IAC5D;EACF;EACA,OAAON,GAAG,CAACU,IAAI,CAAC,GAAG,CAAC;AACtB;AAEA,eAAeZ,EAAE","ignoreList":[]}
@@ -27,7 +27,7 @@
27
27
  * browser download the file rather than attempt to render it — the safe
28
28
  * default for an unknown payload.
29
29
  */
30
- var MIME_TYPES = Object.freeze({
30
+ const MIME_TYPES = Object.freeze({
31
31
  // Documents
32
32
  pdf: "application/pdf",
33
33
  doc: "application/msword",
@@ -56,8 +56,7 @@ var MIME_TYPES = Object.freeze({
56
56
  * @returns The mapped MIME type, or "application/octet-stream".
57
57
  */
58
58
  export function getMimeType(extension) {
59
- var _MIME_TYPES$extension;
60
- return (_MIME_TYPES$extension = MIME_TYPES[extension.toLowerCase()]) !== null && _MIME_TYPES$extension !== void 0 ? _MIME_TYPES$extension : "application/octet-stream";
59
+ return MIME_TYPES[extension.toLowerCase()] ?? "application/octet-stream";
61
60
  }
62
61
 
63
62
  /**
@@ -81,15 +80,15 @@ export function downloadBase64File(base64Data, fileName, extension) {
81
80
  if (typeof document === "undefined" || typeof atob === "undefined") {
82
81
  return false;
83
82
  }
84
- var url = null;
85
- var link = null;
83
+ let url = null;
84
+ let link = null;
86
85
  try {
87
- var binary = atob(base64Data);
88
- var bytes = new Uint8Array(binary.length);
89
- for (var i = 0; i < binary.length; i += 1) {
86
+ const binary = atob(base64Data);
87
+ const bytes = new Uint8Array(binary.length);
88
+ for (let i = 0; i < binary.length; i += 1) {
90
89
  bytes[i] = binary.charCodeAt(i);
91
90
  }
92
- var blob = new Blob([bytes], {
91
+ const blob = new Blob([bytes], {
93
92
  type: getMimeType(extension)
94
93
  });
95
94
  url = URL.createObjectURL(blob);
@@ -120,7 +119,7 @@ export function downloadBase64File(base64Data, fileName, extension) {
120
119
  * revoking early shows the user a blank tab, while being late costs one
121
120
  * short-lived blob.
122
121
  */
123
- var PREVIEW_REVOKE_DELAY_MS = 60000;
122
+ const PREVIEW_REVOKE_DELAY_MS = 60_000;
124
123
 
125
124
  /**
126
125
  * Decode a base64 payload and open it in a new tab for preview.
@@ -150,22 +149,20 @@ export function openBase64FileInTab(base64Data, extension) {
150
149
  if (typeof window === "undefined" || typeof atob === "undefined") {
151
150
  return false;
152
151
  }
153
- var url = null;
152
+ let url = null;
154
153
  try {
155
- var binary = atob(base64Data);
156
- var bytes = new Uint8Array(binary.length);
157
- for (var i = 0; i < binary.length; i += 1) {
154
+ const binary = atob(base64Data);
155
+ const bytes = new Uint8Array(binary.length);
156
+ for (let i = 0; i < binary.length; i += 1) {
158
157
  bytes[i] = binary.charCodeAt(i);
159
158
  }
160
- var blob = new Blob([bytes], {
159
+ const blob = new Blob([bytes], {
161
160
  type: getMimeType(extension)
162
161
  });
163
162
  url = URL.createObjectURL(blob);
164
163
  window.open(url, "_blank", "noopener,noreferrer");
165
- var revokeTarget = url;
166
- window.setTimeout(function () {
167
- return URL.revokeObjectURL(revokeTarget);
168
- }, PREVIEW_REVOKE_DELAY_MS);
164
+ const revokeTarget = url;
165
+ window.setTimeout(() => URL.revokeObjectURL(revokeTarget), PREVIEW_REVOKE_DELAY_MS);
169
166
  return true;
170
167
  } catch (error) {
171
168
  // Revoke straight away here: nothing consumed the URL on this path.
@@ -197,8 +194,8 @@ export function downloadBlobFile(blob, fileName) {
197
194
  if (typeof document === "undefined" || typeof URL === "undefined") {
198
195
  return false;
199
196
  }
200
- var url = null;
201
- var link = null;
197
+ let url = null;
198
+ let link = null;
202
199
  try {
203
200
  url = URL.createObjectURL(blob);
204
201
  link = document.createElement("a");
@@ -216,11 +213,11 @@ export function downloadBlobFile(blob, fileName) {
216
213
  if (url) URL.revokeObjectURL(url);
217
214
  }
218
215
  }
219
- var fileDownloadApi = {
220
- getMimeType: getMimeType,
221
- downloadBase64File: downloadBase64File,
222
- openBase64FileInTab: openBase64FileInTab,
223
- downloadBlobFile: downloadBlobFile
216
+ const fileDownloadApi = {
217
+ getMimeType,
218
+ downloadBase64File,
219
+ openBase64FileInTab,
220
+ downloadBlobFile
224
221
  };
225
222
  export default fileDownloadApi;
226
223
  //# sourceMappingURL=fileDownload.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fileDownload.js","names":["MIME_TYPES","Object","freeze","pdf","doc","docx","xls","xlsx","csv","txt","png","jpg","jpeg","gif","bmp","webp","svg","ico","tiff","tif","getMimeType","extension","_MIME_TYPES$extension","toLowerCase","downloadBase64File","base64Data","fileName","document","atob","url","link","binary","bytes","Uint8Array","length","i","charCodeAt","blob","Blob","type","URL","createObjectURL","createElement","href","download","body","appendChild","click","error","console","parentNode","removeChild","revokeObjectURL","PREVIEW_REVOKE_DELAY_MS","openBase64FileInTab","window","open","revokeTarget","setTimeout","downloadBlobFile","fileDownloadApi"],"sources":["../../../../src/lib/v2/utils/fileDownload.ts"],"sourcesContent":["/**\r\n * File download utilities — Portnet UI v2\r\n *\r\n * Turns a base64 payload from the API into a browser download. Every GU\r\n * module that lets a user retrieve an attached document needs this, and\r\n * before this file each one carried its own copy of the same\r\n * atob → Uint8Array → Blob → anchor sequence plus its own MIME map.\r\n *\r\n * DEPENDENCY-FREE ON PURPOSE. Multi-file (zip) bundling is deliberately NOT\r\n * here: it needs a zip library, and making that a hard dependency of the\r\n * design system would put it in every module's bundle against the\r\n * R-8.2 budget (180 KB gz initial JS) for a capability only\r\n * document-heavy modules use. If it is promoted later it belongs behind an\r\n * OPTIONAL peer dependency, the way PdfViewer sits behind pdfjs-dist and\r\n * @react-pdf-viewer/* in peerDependenciesMeta.\r\n *\r\n * Charter ref: §09.3 — the caller owns the user-facing message; these\r\n * return a boolean rather than throwing so a failure surfaces as copy\r\n * (R-4.4) instead of an unhandled rejection.\r\n */\r\n\r\n/**\r\n * Extension → MIME type for the formats the platform accepts as\r\n * attachments.\r\n *\r\n * Anything unmapped resolves to application/octet-stream, which makes the\r\n * browser download the file rather than attempt to render it — the safe\r\n * default for an unknown payload.\r\n */\r\nconst MIME_TYPES: Readonly<Record<string, string>> = Object.freeze({\r\n // Documents\r\n pdf: \"application/pdf\",\r\n doc: \"application/msword\",\r\n docx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\r\n xls: \"application/vnd.ms-excel\",\r\n xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\r\n csv: \"text/csv\",\r\n txt: \"text/plain\",\r\n\r\n // Images\r\n png: \"image/png\",\r\n jpg: \"image/jpeg\",\r\n jpeg: \"image/jpeg\",\r\n gif: \"image/gif\",\r\n bmp: \"image/bmp\",\r\n webp: \"image/webp\",\r\n svg: \"image/svg+xml\",\r\n ico: \"image/x-icon\",\r\n tiff: \"image/tiff\",\r\n tif: \"image/tiff\",\r\n});\r\n\r\n/**\r\n * Resolve the MIME type for a file extension.\r\n *\r\n * @param extension - Extension WITHOUT a leading dot. Case-insensitive.\r\n * @returns The mapped MIME type, or \"application/octet-stream\".\r\n */\r\nexport function getMimeType(extension: string): string {\r\n return MIME_TYPES[extension.toLowerCase()] ?? \"application/octet-stream\";\r\n}\r\n\r\n/**\r\n * Decode a base64 payload and hand it to the browser as a download.\r\n *\r\n * @param base64Data - Base64 WITHOUT a `data:` prefix, as the getFile /\r\n * downloadFile endpoints return it.\r\n * @param fileName - Filename offered to the user. The extension is NOT\r\n * appended automatically; pass it already suffixed if\r\n * you want one.\r\n * @param extension - Used only to resolve the Blob's MIME type.\r\n * @returns true on success; false if decoding failed or there is no DOM.\r\n *\r\n * @example\r\n * const ok = downloadBase64File(body.content, body.fileName, body.extension);\r\n * if (!ok) toast(\"Le téléchargement a échoué. Veuillez réessayer.\", \"error\");\r\n */\r\nexport function downloadBase64File(\r\n base64Data: string,\r\n fileName: string,\r\n extension: string,\r\n): boolean {\r\n // Guarded rather than assumed: this runs in jsdom under test and could be\r\n // reached during SSR. The host modules' copies of this threw in both.\r\n if (typeof document === \"undefined\" || typeof atob === \"undefined\") {\r\n return false;\r\n }\r\n\r\n let url: string | null = null;\r\n let link: HTMLAnchorElement | null = null;\r\n\r\n try {\r\n const binary = atob(base64Data);\r\n const bytes = new Uint8Array(binary.length);\r\n for (let i = 0; i < binary.length; i += 1) {\r\n bytes[i] = binary.charCodeAt(i);\r\n }\r\n\r\n const blob = new Blob([bytes], { type: getMimeType(extension) });\r\n\r\n url = URL.createObjectURL(blob);\r\n link = document.createElement(\"a\");\r\n link.href = url;\r\n link.download = fileName;\r\n document.body.appendChild(link);\r\n link.click();\r\n return true;\r\n } catch (error) {\r\n // eslint-disable-next-line no-console\r\n console.error(\"[@portnet/ui] downloadBase64File failed:\", error);\r\n return false;\r\n } finally {\r\n // finally, not the happy path: the host copies leaked both the anchor\r\n // and the object URL whenever click() or appendChild threw.\r\n if (link && link.parentNode) link.parentNode.removeChild(link);\r\n if (url) URL.revokeObjectURL(url);\r\n }\r\n}\r\n\r\n/**\r\n * Delay before revoking a preview's object URL.\r\n *\r\n * It CANNOT be revoked synchronously: the newly opened tab still has to fetch\r\n * the blob. There is no portable \"that tab finished loading\" signal for a blob\r\n * URL, so a timeout is the only cross-browser option. Deliberately generous:\r\n * revoking early shows the user a blank tab, while being late costs one\r\n * short-lived blob.\r\n */\r\nconst PREVIEW_REVOKE_DELAY_MS = 60_000;\r\n\r\n/**\r\n * Decode a base64 payload and open it in a new tab for preview.\r\n *\r\n * Companion to downloadBase64File: every document-bearing GU module offers a\r\n * « Visualiser » action next to « Télécharger », and each carried its own copy of\r\n * this atob -> Uint8Array -> Blob -> window.open sequence. NONE of those copies\r\n * revoked the object URL, so every preview leaked a blob for the lifetime of the\r\n * page.\r\n *\r\n * RETURN VALUE — read this before relying on it. `window.open` returns null BY\r\n * SPECIFICATION when \"noopener\" is set, so a blocked popup is indistinguishable\r\n * from a successful one. `true` therefore means \"decoded and the open call was\r\n * issued without throwing\" — NOT \"the tab is on screen\". Do not use it to claim\r\n * success to the user; use `false` to report a genuine failure (bad payload, no\r\n * DOM). Dropping \"noopener\" would make blocked-popup detection possible but\r\n * would hand the opened tab a window.opener reference — not a trade worth making\r\n * for a diagnostic.\r\n *\r\n * @param base64Data - Base64 WITHOUT a `data:` prefix.\r\n * @param extension - Resolves the Blob MIME type. Required for inline\r\n * rendering: with the wrong type the browser downloads the\r\n * file instead of displaying it.\r\n * @returns false if there is no DOM or the payload could not be decoded.\r\n */\r\nexport function openBase64FileInTab(base64Data: string, extension: string): boolean {\r\n if (typeof window === \"undefined\" || typeof atob === \"undefined\") {\r\n return false;\r\n }\r\n let url: string | null = null;\r\n try {\r\n const binary = atob(base64Data);\r\n const bytes = new Uint8Array(binary.length);\r\n for (let i = 0; i < binary.length; i += 1) {\r\n bytes[i] = binary.charCodeAt(i);\r\n }\r\n const blob = new Blob([bytes], { type: getMimeType(extension) });\r\n url = URL.createObjectURL(blob);\r\n window.open(url, \"_blank\", \"noopener,noreferrer\");\r\n const revokeTarget = url;\r\n window.setTimeout(() => URL.revokeObjectURL(revokeTarget), PREVIEW_REVOKE_DELAY_MS);\r\n return true;\r\n } catch (error) {\r\n // Revoke straight away here: nothing consumed the URL on this path.\r\n if (url) URL.revokeObjectURL(url);\r\n // eslint-disable-next-line no-console\r\n console.error(\"[@portnet/ui] openBase64FileInTab failed:\", error);\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Hand an already-materialised Blob to the browser as a download.\r\n *\r\n * Companion to downloadBase64File for endpoints that return a binary body\r\n * directly (axios `responseType: \"blob\"`) instead of base64 — Excel exports,\r\n * server-generated PDFs. Host modules built the anchor by hand for this too,\r\n * and every copy found so far never revoked the object URL.\r\n *\r\n * Revoked synchronously in `finally`, unlike openBase64FileInTab: a download is\r\n * snapshotted by the browser at click() time, so nothing needs the URL\r\n * afterwards — only a preview in another tab does.\r\n *\r\n * @param blob - The payload. Its own `type` is used as-is; no MIME lookup,\r\n * the server already declared it.\r\n * @param fileName - Filename offered to the user, extension included.\r\n * @returns true on success; false if there is no DOM.\r\n */\r\nexport function downloadBlobFile(blob: Blob, fileName: string): boolean {\r\n if (typeof document === \"undefined\" || typeof URL === \"undefined\") {\r\n return false;\r\n }\r\n let url: string | null = null;\r\n let link: HTMLAnchorElement | null = null;\r\n try {\r\n url = URL.createObjectURL(blob);\r\n link = document.createElement(\"a\");\r\n link.href = url;\r\n link.download = fileName;\r\n document.body.appendChild(link);\r\n link.click();\r\n return true;\r\n } catch (error) {\r\n // eslint-disable-next-line no-console\r\n console.error(\"[@portnet/ui] downloadBlobFile failed:\", error);\r\n return false;\r\n } finally {\r\n if (link && link.parentNode) link.parentNode.removeChild(link);\r\n if (url) URL.revokeObjectURL(url);\r\n }\r\n}\r\n\r\nconst fileDownloadApi = {\r\n getMimeType,\r\n downloadBase64File,\r\n openBase64FileInTab,\r\n downloadBlobFile,\r\n};\r\nexport default fileDownloadApi;\r\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAMA,UAA4C,GAAGC,MAAM,CAACC,MAAM,CAAC;EACjE;EACAC,GAAG,EAAE,iBAAiB;EACtBC,GAAG,EAAE,oBAAoB;EACzBC,IAAI,EAAE,yEAAyE;EAC/EC,GAAG,EAAE,0BAA0B;EAC/BC,IAAI,EAAE,mEAAmE;EACzEC,GAAG,EAAE,UAAU;EACfC,GAAG,EAAE,YAAY;EAEjB;EACAC,GAAG,EAAE,WAAW;EAChBC,GAAG,EAAE,YAAY;EACjBC,IAAI,EAAE,YAAY;EAClBC,GAAG,EAAE,WAAW;EAChBC,GAAG,EAAE,WAAW;EAChBC,IAAI,EAAE,YAAY;EAClBC,GAAG,EAAE,eAAe;EACpBC,GAAG,EAAE,cAAc;EACnBC,IAAI,EAAE,YAAY;EAClBC,GAAG,EAAE;AACP,CAAC,CAAC;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,WAAWA,CAACC,SAAiB,EAAU;EAAA,IAAAC,qBAAA;EACrD,QAAAA,qBAAA,GAAOtB,UAAU,CAACqB,SAAS,CAACE,WAAW,CAAC,CAAC,CAAC,cAAAD,qBAAA,cAAAA,qBAAA,GAAI,0BAA0B;AAC1E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASE,kBAAkBA,CAChCC,UAAkB,EAClBC,QAAgB,EAChBL,SAAiB,EACR;EACT;EACA;EACA,IAAI,OAAOM,QAAQ,KAAK,WAAW,IAAI,OAAOC,IAAI,KAAK,WAAW,EAAE;IAClE,OAAO,KAAK;EACd;EAEA,IAAIC,GAAkB,GAAG,IAAI;EAC7B,IAAIC,IAA8B,GAAG,IAAI;EAEzC,IAAI;IACF,IAAMC,MAAM,GAAGH,IAAI,CAACH,UAAU,CAAC;IAC/B,IAAMO,KAAK,GAAG,IAAIC,UAAU,CAACF,MAAM,CAACG,MAAM,CAAC;IAC3C,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGJ,MAAM,CAACG,MAAM,EAAEC,CAAC,IAAI,CAAC,EAAE;MACzCH,KAAK,CAACG,CAAC,CAAC,GAAGJ,MAAM,CAACK,UAAU,CAACD,CAAC,CAAC;IACjC;IAEA,IAAME,IAAI,GAAG,IAAIC,IAAI,CAAC,CAACN,KAAK,CAAC,EAAE;MAAEO,IAAI,EAAEnB,WAAW,CAACC,SAAS;IAAE,CAAC,CAAC;IAEhEQ,GAAG,GAAGW,GAAG,CAACC,eAAe,CAACJ,IAAI,CAAC;IAC/BP,IAAI,GAAGH,QAAQ,CAACe,aAAa,CAAC,GAAG,CAAC;IAClCZ,IAAI,CAACa,IAAI,GAAGd,GAAG;IACfC,IAAI,CAACc,QAAQ,GAAGlB,QAAQ;IACxBC,QAAQ,CAACkB,IAAI,CAACC,WAAW,CAAChB,IAAI,CAAC;IAC/BA,IAAI,CAACiB,KAAK,CAAC,CAAC;IACZ,OAAO,IAAI;EACb,CAAC,CAAC,OAAOC,KAAK,EAAE;IACd;IACAC,OAAO,CAACD,KAAK,CAAC,0CAA0C,EAAEA,KAAK,CAAC;IAChE,OAAO,KAAK;EACd,CAAC,SAAS;IACR;IACA;IACA,IAAIlB,IAAI,IAAIA,IAAI,CAACoB,UAAU,EAAEpB,IAAI,CAACoB,UAAU,CAACC,WAAW,CAACrB,IAAI,CAAC;IAC9D,IAAID,GAAG,EAAEW,GAAG,CAACY,eAAe,CAACvB,GAAG,CAAC;EACnC;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAMwB,uBAAuB,GAAG,KAAM;;AAEtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,mBAAmBA,CAAC7B,UAAkB,EAAEJ,SAAiB,EAAW;EAClF,IAAI,OAAOkC,MAAM,KAAK,WAAW,IAAI,OAAO3B,IAAI,KAAK,WAAW,EAAE;IAChE,OAAO,KAAK;EACd;EACA,IAAIC,GAAkB,GAAG,IAAI;EAC7B,IAAI;IACF,IAAME,MAAM,GAAGH,IAAI,CAACH,UAAU,CAAC;IAC/B,IAAMO,KAAK,GAAG,IAAIC,UAAU,CAACF,MAAM,CAACG,MAAM,CAAC;IAC3C,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGJ,MAAM,CAACG,MAAM,EAAEC,CAAC,IAAI,CAAC,EAAE;MACzCH,KAAK,CAACG,CAAC,CAAC,GAAGJ,MAAM,CAACK,UAAU,CAACD,CAAC,CAAC;IACjC;IACA,IAAME,IAAI,GAAG,IAAIC,IAAI,CAAC,CAACN,KAAK,CAAC,EAAE;MAAEO,IAAI,EAAEnB,WAAW,CAACC,SAAS;IAAE,CAAC,CAAC;IAChEQ,GAAG,GAAGW,GAAG,CAACC,eAAe,CAACJ,IAAI,CAAC;IAC/BkB,MAAM,CAACC,IAAI,CAAC3B,GAAG,EAAE,QAAQ,EAAE,qBAAqB,CAAC;IACjD,IAAM4B,YAAY,GAAG5B,GAAG;IACxB0B,MAAM,CAACG,UAAU,CAAC;MAAA,OAAMlB,GAAG,CAACY,eAAe,CAACK,YAAY,CAAC;IAAA,GAAEJ,uBAAuB,CAAC;IACnF,OAAO,IAAI;EACb,CAAC,CAAC,OAAOL,KAAK,EAAE;IACd;IACA,IAAInB,GAAG,EAAEW,GAAG,CAACY,eAAe,CAACvB,GAAG,CAAC;IACjC;IACAoB,OAAO,CAACD,KAAK,CAAC,2CAA2C,EAAEA,KAAK,CAAC;IACjE,OAAO,KAAK;EACd;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASW,gBAAgBA,CAACtB,IAAU,EAAEX,QAAgB,EAAW;EACtE,IAAI,OAAOC,QAAQ,KAAK,WAAW,IAAI,OAAOa,GAAG,KAAK,WAAW,EAAE;IACjE,OAAO,KAAK;EACd;EACA,IAAIX,GAAkB,GAAG,IAAI;EAC7B,IAAIC,IAA8B,GAAG,IAAI;EACzC,IAAI;IACFD,GAAG,GAAGW,GAAG,CAACC,eAAe,CAACJ,IAAI,CAAC;IAC/BP,IAAI,GAAGH,QAAQ,CAACe,aAAa,CAAC,GAAG,CAAC;IAClCZ,IAAI,CAACa,IAAI,GAAGd,GAAG;IACfC,IAAI,CAACc,QAAQ,GAAGlB,QAAQ;IACxBC,QAAQ,CAACkB,IAAI,CAACC,WAAW,CAAChB,IAAI,CAAC;IAC/BA,IAAI,CAACiB,KAAK,CAAC,CAAC;IACZ,OAAO,IAAI;EACb,CAAC,CAAC,OAAOC,KAAK,EAAE;IACd;IACAC,OAAO,CAACD,KAAK,CAAC,wCAAwC,EAAEA,KAAK,CAAC;IAC9D,OAAO,KAAK;EACd,CAAC,SAAS;IACR,IAAIlB,IAAI,IAAIA,IAAI,CAACoB,UAAU,EAAEpB,IAAI,CAACoB,UAAU,CAACC,WAAW,CAACrB,IAAI,CAAC;IAC9D,IAAID,GAAG,EAAEW,GAAG,CAACY,eAAe,CAACvB,GAAG,CAAC;EACnC;AACF;AAEA,IAAM+B,eAAe,GAAG;EACtBxC,WAAW,EAAXA,WAAW;EACXI,kBAAkB,EAAlBA,kBAAkB;EAClB8B,mBAAmB,EAAnBA,mBAAmB;EACnBK,gBAAgB,EAAhBA;AACF,CAAC;AACD,eAAeC,eAAe","ignoreList":[]}
1
+ {"version":3,"file":"fileDownload.js","names":["MIME_TYPES","Object","freeze","pdf","doc","docx","xls","xlsx","csv","txt","png","jpg","jpeg","gif","bmp","webp","svg","ico","tiff","tif","getMimeType","extension","toLowerCase","downloadBase64File","base64Data","fileName","document","atob","url","link","binary","bytes","Uint8Array","length","i","charCodeAt","blob","Blob","type","URL","createObjectURL","createElement","href","download","body","appendChild","click","error","console","parentNode","removeChild","revokeObjectURL","PREVIEW_REVOKE_DELAY_MS","openBase64FileInTab","window","open","revokeTarget","setTimeout","downloadBlobFile","fileDownloadApi"],"sources":["../../../../src/lib/v2/utils/fileDownload.ts"],"sourcesContent":["/**\r\n * File download utilities — Portnet UI v2\r\n *\r\n * Turns a base64 payload from the API into a browser download. Every GU\r\n * module that lets a user retrieve an attached document needs this, and\r\n * before this file each one carried its own copy of the same\r\n * atob → Uint8Array → Blob → anchor sequence plus its own MIME map.\r\n *\r\n * DEPENDENCY-FREE ON PURPOSE. Multi-file (zip) bundling is deliberately NOT\r\n * here: it needs a zip library, and making that a hard dependency of the\r\n * design system would put it in every module's bundle against the\r\n * R-8.2 budget (180 KB gz initial JS) for a capability only\r\n * document-heavy modules use. If it is promoted later it belongs behind an\r\n * OPTIONAL peer dependency, the way PdfViewer sits behind pdfjs-dist and\r\n * @react-pdf-viewer/* in peerDependenciesMeta.\r\n *\r\n * Charter ref: §09.3 — the caller owns the user-facing message; these\r\n * return a boolean rather than throwing so a failure surfaces as copy\r\n * (R-4.4) instead of an unhandled rejection.\r\n */\r\n\r\n/**\r\n * Extension → MIME type for the formats the platform accepts as\r\n * attachments.\r\n *\r\n * Anything unmapped resolves to application/octet-stream, which makes the\r\n * browser download the file rather than attempt to render it — the safe\r\n * default for an unknown payload.\r\n */\r\nconst MIME_TYPES: Readonly<Record<string, string>> = Object.freeze({\r\n // Documents\r\n pdf: \"application/pdf\",\r\n doc: \"application/msword\",\r\n docx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\r\n xls: \"application/vnd.ms-excel\",\r\n xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\r\n csv: \"text/csv\",\r\n txt: \"text/plain\",\r\n\r\n // Images\r\n png: \"image/png\",\r\n jpg: \"image/jpeg\",\r\n jpeg: \"image/jpeg\",\r\n gif: \"image/gif\",\r\n bmp: \"image/bmp\",\r\n webp: \"image/webp\",\r\n svg: \"image/svg+xml\",\r\n ico: \"image/x-icon\",\r\n tiff: \"image/tiff\",\r\n tif: \"image/tiff\",\r\n});\r\n\r\n/**\r\n * Resolve the MIME type for a file extension.\r\n *\r\n * @param extension - Extension WITHOUT a leading dot. Case-insensitive.\r\n * @returns The mapped MIME type, or \"application/octet-stream\".\r\n */\r\nexport function getMimeType(extension: string): string {\r\n return MIME_TYPES[extension.toLowerCase()] ?? \"application/octet-stream\";\r\n}\r\n\r\n/**\r\n * Decode a base64 payload and hand it to the browser as a download.\r\n *\r\n * @param base64Data - Base64 WITHOUT a `data:` prefix, as the getFile /\r\n * downloadFile endpoints return it.\r\n * @param fileName - Filename offered to the user. The extension is NOT\r\n * appended automatically; pass it already suffixed if\r\n * you want one.\r\n * @param extension - Used only to resolve the Blob's MIME type.\r\n * @returns true on success; false if decoding failed or there is no DOM.\r\n *\r\n * @example\r\n * const ok = downloadBase64File(body.content, body.fileName, body.extension);\r\n * if (!ok) toast(\"Le téléchargement a échoué. Veuillez réessayer.\", \"error\");\r\n */\r\nexport function downloadBase64File(\r\n base64Data: string,\r\n fileName: string,\r\n extension: string,\r\n): boolean {\r\n // Guarded rather than assumed: this runs in jsdom under test and could be\r\n // reached during SSR. The host modules' copies of this threw in both.\r\n if (typeof document === \"undefined\" || typeof atob === \"undefined\") {\r\n return false;\r\n }\r\n\r\n let url: string | null = null;\r\n let link: HTMLAnchorElement | null = null;\r\n\r\n try {\r\n const binary = atob(base64Data);\r\n const bytes = new Uint8Array(binary.length);\r\n for (let i = 0; i < binary.length; i += 1) {\r\n bytes[i] = binary.charCodeAt(i);\r\n }\r\n\r\n const blob = new Blob([bytes], { type: getMimeType(extension) });\r\n\r\n url = URL.createObjectURL(blob);\r\n link = document.createElement(\"a\");\r\n link.href = url;\r\n link.download = fileName;\r\n document.body.appendChild(link);\r\n link.click();\r\n return true;\r\n } catch (error) {\r\n // eslint-disable-next-line no-console\r\n console.error(\"[@portnet/ui] downloadBase64File failed:\", error);\r\n return false;\r\n } finally {\r\n // finally, not the happy path: the host copies leaked both the anchor\r\n // and the object URL whenever click() or appendChild threw.\r\n if (link && link.parentNode) link.parentNode.removeChild(link);\r\n if (url) URL.revokeObjectURL(url);\r\n }\r\n}\r\n\r\n/**\r\n * Delay before revoking a preview's object URL.\r\n *\r\n * It CANNOT be revoked synchronously: the newly opened tab still has to fetch\r\n * the blob. There is no portable \"that tab finished loading\" signal for a blob\r\n * URL, so a timeout is the only cross-browser option. Deliberately generous:\r\n * revoking early shows the user a blank tab, while being late costs one\r\n * short-lived blob.\r\n */\r\nconst PREVIEW_REVOKE_DELAY_MS = 60_000;\r\n\r\n/**\r\n * Decode a base64 payload and open it in a new tab for preview.\r\n *\r\n * Companion to downloadBase64File: every document-bearing GU module offers a\r\n * « Visualiser » action next to « Télécharger », and each carried its own copy of\r\n * this atob -> Uint8Array -> Blob -> window.open sequence. NONE of those copies\r\n * revoked the object URL, so every preview leaked a blob for the lifetime of the\r\n * page.\r\n *\r\n * RETURN VALUE — read this before relying on it. `window.open` returns null BY\r\n * SPECIFICATION when \"noopener\" is set, so a blocked popup is indistinguishable\r\n * from a successful one. `true` therefore means \"decoded and the open call was\r\n * issued without throwing\" — NOT \"the tab is on screen\". Do not use it to claim\r\n * success to the user; use `false` to report a genuine failure (bad payload, no\r\n * DOM). Dropping \"noopener\" would make blocked-popup detection possible but\r\n * would hand the opened tab a window.opener reference — not a trade worth making\r\n * for a diagnostic.\r\n *\r\n * @param base64Data - Base64 WITHOUT a `data:` prefix.\r\n * @param extension - Resolves the Blob MIME type. Required for inline\r\n * rendering: with the wrong type the browser downloads the\r\n * file instead of displaying it.\r\n * @returns false if there is no DOM or the payload could not be decoded.\r\n */\r\nexport function openBase64FileInTab(base64Data: string, extension: string): boolean {\r\n if (typeof window === \"undefined\" || typeof atob === \"undefined\") {\r\n return false;\r\n }\r\n let url: string | null = null;\r\n try {\r\n const binary = atob(base64Data);\r\n const bytes = new Uint8Array(binary.length);\r\n for (let i = 0; i < binary.length; i += 1) {\r\n bytes[i] = binary.charCodeAt(i);\r\n }\r\n const blob = new Blob([bytes], { type: getMimeType(extension) });\r\n url = URL.createObjectURL(blob);\r\n window.open(url, \"_blank\", \"noopener,noreferrer\");\r\n const revokeTarget = url;\r\n window.setTimeout(() => URL.revokeObjectURL(revokeTarget), PREVIEW_REVOKE_DELAY_MS);\r\n return true;\r\n } catch (error) {\r\n // Revoke straight away here: nothing consumed the URL on this path.\r\n if (url) URL.revokeObjectURL(url);\r\n // eslint-disable-next-line no-console\r\n console.error(\"[@portnet/ui] openBase64FileInTab failed:\", error);\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Hand an already-materialised Blob to the browser as a download.\r\n *\r\n * Companion to downloadBase64File for endpoints that return a binary body\r\n * directly (axios `responseType: \"blob\"`) instead of base64 — Excel exports,\r\n * server-generated PDFs. Host modules built the anchor by hand for this too,\r\n * and every copy found so far never revoked the object URL.\r\n *\r\n * Revoked synchronously in `finally`, unlike openBase64FileInTab: a download is\r\n * snapshotted by the browser at click() time, so nothing needs the URL\r\n * afterwards — only a preview in another tab does.\r\n *\r\n * @param blob - The payload. Its own `type` is used as-is; no MIME lookup,\r\n * the server already declared it.\r\n * @param fileName - Filename offered to the user, extension included.\r\n * @returns true on success; false if there is no DOM.\r\n */\r\nexport function downloadBlobFile(blob: Blob, fileName: string): boolean {\r\n if (typeof document === \"undefined\" || typeof URL === \"undefined\") {\r\n return false;\r\n }\r\n let url: string | null = null;\r\n let link: HTMLAnchorElement | null = null;\r\n try {\r\n url = URL.createObjectURL(blob);\r\n link = document.createElement(\"a\");\r\n link.href = url;\r\n link.download = fileName;\r\n document.body.appendChild(link);\r\n link.click();\r\n return true;\r\n } catch (error) {\r\n // eslint-disable-next-line no-console\r\n console.error(\"[@portnet/ui] downloadBlobFile failed:\", error);\r\n return false;\r\n } finally {\r\n if (link && link.parentNode) link.parentNode.removeChild(link);\r\n if (url) URL.revokeObjectURL(url);\r\n }\r\n}\r\n\r\nconst fileDownloadApi = {\r\n getMimeType,\r\n downloadBase64File,\r\n openBase64FileInTab,\r\n downloadBlobFile,\r\n};\r\nexport default fileDownloadApi;\r\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,209 @@
1
+ /**
2
+ * fileValidation — is this file allowed to be uploaded?
3
+ *
4
+ * const POLICY = { extensions: ["pdf", "png", "jpg", "jpeg", "doc", "docx"] };
5
+ *
6
+ * const rejection = getFileRejection(file, POLICY);
7
+ * if (rejection) toast(rejection.message, "error");
8
+ *
9
+ * <Dropzone accept={toAcceptAttribute(POLICY.extensions)} … />
10
+ *
11
+ * ─────────────────────────────────────────────────────────────────────────────
12
+ * WHY THIS BELONGS IN THE LIBRARY (capability gap G-52)
13
+ *
14
+ * `Dropzone` takes an `accept` attribute and reports `DropzoneRejection`, but it
15
+ * validates nothing: the browser's `accept` is a FILE-PICKER FILTER, not a
16
+ * control. It is trivially bypassed — drag and drop ignores it, and so does
17
+ * "All files" in the picker on most platforms. So the library asked every host
18
+ * to decide, itself, whether a dropped file is acceptable, and every host wrote:
19
+ *
20
+ * - an extension allow-list (business policy — rightly theirs), AND
21
+ * - a deny-list of executables and scripts, AND
22
+ * - an extension↔MIME cross-check with its browser tolerances.
23
+ *
24
+ * The last two are NOT business policy. They are one security decision, and a
25
+ * security decision copied into every module is a security decision that WILL
26
+ * drift: the day a file type has to be added to the deny-list, nobody can say
27
+ * which of the fifteen GU modules received it. Worse, divergence here is
28
+ * SILENT — a module missing an entry looks exactly like a module that has it,
29
+ * until something gets uploaded.
30
+ *
31
+ * So the split this file draws: the HOST owns which extensions its business
32
+ * accepts; the LIBRARY owns the executable deny-list and the MIME cross-check.
33
+ *
34
+ * Raised from `autorisation-admis-pour-conforme-fe` (Area 5), which carried a
35
+ * 21-entry executable deny-list and a six-extension MIME table locally.
36
+ *
37
+ * NOT A SUBSTITUTE FOR SERVER-SIDE VALIDATION, and this must stay written down:
38
+ * everything here runs in a browser the user controls. Its purpose is to give a
39
+ * CLEAR, IMMEDIATE reason (R-4.1, R-4.4) instead of a server rejection after a
40
+ * full upload. The back-end remains the authority.
41
+ * ─────────────────────────────────────────────────────────────────────────────
42
+ */
43
+
44
+ /**
45
+ * Executables, scripts and installers — refused whatever the host's policy says.
46
+ *
47
+ * Checked FIRST, and the order carries meaning: a `.exe` gets a message naming
48
+ * it as a dangerous file, not a vague "unsupported type", because those are not
49
+ * the same information for the person at the screen.
50
+ *
51
+ * Windows-centric because GU workstations are: PE binaries, the cmd/PowerShell
52
+ * script families, installer packages, and the HTML-application and
53
+ * control-panel shims that are executable despite innocuous extensions.
54
+ */
55
+ const EXECUTABLE_EXTENSIONS = new Set(["exe", "dll", "bat", "cmd", "com", "pif", "scr", "msi", "msu", "msp", "vbs", "vbe", "jse", "wsf", "wsh", "ps1", "psm1", "psc1", "cpl", "msc", "hta"]);
56
+
57
+ /**
58
+ * Accepted MIME types per extension.
59
+ *
60
+ * DELIBERATELY NOT `getMimeType` from ./fileDownload, though both map
61
+ * extensions to MIME types. That one answers "what type should I stamp on this
62
+ * Blob" — ONE canonical value. This one answers "what types may a browser
63
+ * plausibly report for this extension" — a SET, including variants no canonical
64
+ * table would contain (`image/jpg` is not a registered type, and browsers send
65
+ * it anyway). Collapsing the two would reject valid files.
66
+ */
67
+ const MIME_BY_EXTENSION = Object.freeze({
68
+ pdf: ["application/pdf"],
69
+ png: ["image/png"],
70
+ jpg: ["image/jpeg", "image/jpg"],
71
+ jpeg: ["image/jpeg", "image/jpg"],
72
+ gif: ["image/gif"],
73
+ webp: ["image/webp"],
74
+ tif: ["image/tiff"],
75
+ tiff: ["image/tiff"],
76
+ txt: ["text/plain"],
77
+ csv: ["text/csv", "application/csv", "text/plain"],
78
+ doc: ["application/msword"],
79
+ docx: ["application/vnd.openxmlformats-officedocument.wordprocessingml.document"],
80
+ xls: ["application/vnd.ms-excel"],
81
+ xlsx: ["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],
82
+ ppt: ["application/vnd.ms-powerpoint"],
83
+ pptx: ["application/vnd.openxmlformats-officedocument.presentationml.presentation"]
84
+ });
85
+
86
+ /**
87
+ * Extensions whose reported MIME type cannot be trusted, so
88
+ * `application/octet-stream` is tolerated for them.
89
+ *
90
+ * WITHOUT THIS TOLERANCE A LEGITIMATE `.docx` IS REFUSED on some machines —
91
+ * Office documents are frequently reported as `application/octet-stream`
92
+ * depending on browser and OS, and the refusal would be INTERMITTENT, which is
93
+ * the hardest kind to diagnose from a support ticket. The extension has already
94
+ * been checked against the host's allow-list at that point, so the tolerance
95
+ * does not widen what is accepted, only what is believed.
96
+ */
97
+ const UNRELIABLE_MIME_EXTENSIONS = new Set(["doc", "docx", "xls", "xlsx", "ppt", "pptx", "csv"]);
98
+
99
+ /** Why a file was refused. `reason` is for branching and logs, not for display. */
100
+
101
+ const DEFAULT_EXECUTABLE_MESSAGE = "Les fichiers exécutables, scripts et installeurs ne sont pas autorisés.";
102
+
103
+ /** Lowercased extension of a file name, or `""` when there is none. */
104
+ const extensionOf = fileName => {
105
+ if (!fileName) return "";
106
+ const parts = fileName.split(".");
107
+ /* A name with no dot has no extension: "rapport" must not be read as having
108
+ extension "rapport", which a bare `pop()` would do. */
109
+ if (parts.length < 2) return "";
110
+ return (parts[parts.length - 1] ?? "").toLowerCase();
111
+ };
112
+
113
+ /**
114
+ * Human list of the accepted types — "PDF, PNG, JPG, JPEG, DOC, DOCX."
115
+ *
116
+ * Order is the host's: the list is read by a person, and a host lists its most
117
+ * common format first for a reason. Sorting it here would silently reorder
118
+ * copy the host wrote deliberately.
119
+ */
120
+ export function describeAcceptedTypes(extensions) {
121
+ return `${extensions.map(ext => ext.toUpperCase()).join(", ")}.`;
122
+ }
123
+
124
+ /**
125
+ * The `accept` attribute for an input or `Dropzone` — ".pdf,.png,.jpg".
126
+ *
127
+ * A picker filter, never a control: see the note on server-side validation in
128
+ * the file header.
129
+ */
130
+ export function toAcceptAttribute(extensions) {
131
+ return extensions.map(ext => `.${ext.toLowerCase()}`).join(",");
132
+ }
133
+
134
+ /**
135
+ * Is this an executable, a script or an installer?
136
+ *
137
+ * Exported on its own because a host may want to refuse those EARLIER than its
138
+ * own policy check — on a bulk drop, for instance, where one dangerous file
139
+ * should stop the whole batch rather than be listed among type mismatches.
140
+ *
141
+ * Permissive parameter type on purpose: callers routinely pass an item pulled
142
+ * out of a `FileList` without having checked it.
143
+ */
144
+ export function isForbiddenExecutable(file) {
145
+ const ext = extensionOf(file?.name);
146
+ return ext !== "" && EXECUTABLE_EXTENSIONS.has(ext);
147
+ }
148
+
149
+ /** Does the file satisfy `policy` (and the library's own deny-list)? */
150
+ export function isAcceptedFile(file, policy) {
151
+ return getFileRejection(file, policy) === null;
152
+ }
153
+
154
+ /**
155
+ * Why this file cannot be uploaded, or `null` when it can.
156
+ *
157
+ * Order of checks is load-bearing:
158
+ * 1. executable / script / installer — named as such;
159
+ * 2. extension against the host's allow-list;
160
+ * 3. reported MIME type against the extension.
161
+ *
162
+ * MIME RULES, both deliberate: an EMPTY type is accepted (some browsers report
163
+ * none, and the extension has just been checked), and `application/octet-stream`
164
+ * is accepted for the extensions listed in `UNRELIABLE_MIME_EXTENSIONS`. An
165
+ * extension with no entry in the MIME table is accepted on its extension alone
166
+ * — the table is a cross-check, not a second allow-list, and a host adding a
167
+ * format to its policy must not have it refused by a table it cannot see.
168
+ */
169
+ export function getFileRejection(file, policy) {
170
+ const executableMessage = policy.labels?.executable ?? DEFAULT_EXECUTABLE_MESSAGE;
171
+ const typeMessage = policy.labels?.type ?? `Types autorisés : ${describeAcceptedTypes(policy.extensions)}`;
172
+ if (isForbiddenExecutable(file)) {
173
+ return {
174
+ reason: "executable",
175
+ message: executableMessage
176
+ };
177
+ }
178
+ const ext = extensionOf(file?.name);
179
+ if (ext === "") return {
180
+ reason: "extension",
181
+ message: typeMessage
182
+ };
183
+ const accepted = policy.extensions.some(allowed => allowed.toLowerCase() === ext);
184
+ if (!accepted) return {
185
+ reason: "extension",
186
+ message: typeMessage
187
+ };
188
+ const mime = (file?.type ?? "").trim().toLowerCase();
189
+ if (mime === "") return null;
190
+ if (mime === "application/octet-stream" && UNRELIABLE_MIME_EXTENSIONS.has(ext)) {
191
+ return null;
192
+ }
193
+ const expected = MIME_BY_EXTENSION[ext];
194
+ if (expected === undefined) return null;
195
+ if (expected.includes(mime)) return null;
196
+ return {
197
+ reason: "mime",
198
+ message: typeMessage
199
+ };
200
+ }
201
+ const fileValidationApi = {
202
+ isForbiddenExecutable,
203
+ isAcceptedFile,
204
+ getFileRejection,
205
+ describeAcceptedTypes,
206
+ toAcceptAttribute
207
+ };
208
+ export default fileValidationApi;
209
+ //# sourceMappingURL=fileValidation.js.map