@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 +1 @@
1
- {"version":3,"file":"MobileRowCard.test.js","names":["React","render","screen","fireEvent","MobileRowCard","jsx","_jsx","describe","test","title","subtitle","meta","expect","getByText","toBeInTheDocument","undefined","queryByText","not","_render","rerender","toHaveAttribute","children","queryByTitle","kv","label","value","getAllByText","toHaveLength","fallback","chips","_render2","actions","queryByRole","divider","onClick","actionsAriaLabel","getByRole","name","onCardClick","jest","fn","leading","click","toHaveBeenCalledTimes","onAction","trailing","toHaveBeenCalled","onCardKeyDown","onKeyDown","keyDown","key","visualiser","kebab","compareDocumentPosition","Node","DOCUMENT_POSITION_FOLLOWING","toBeTruthy"],"sources":["../../../../src/lib/v2/__tests__/MobileRowCard.test.tsx"],"sourcesContent":["import \"@testing-library/jest-dom\";\r\nimport * as React from \"react\";\r\nimport { render, screen, fireEvent } from \"@testing-library/react\";\r\nimport MobileRowCard from \"../components/MobileRowCard\";\r\n\r\n/**\r\n * MobileRowCard — slot contract tests.\r\n *\r\n * WHY THIS FILE EXISTS\r\n * --------------------\r\n * §10.3 R-G.6 MUST — \"Snapshot Storybook + tests Jest/Testing-Library\" — was\r\n * unmet for THREE props added to this component across successive module\r\n * audits: `kv` and `leading` (ms-dfd-fe Area 5), then `trailing`\r\n * (ms-dfd-fe/ms-ti-fe A5-01). Each was shipped as \"additive, backward\r\n * compatible\", which is true and is not the same thing as verified. This\r\n * component is consumed by ten mobile-card sites across two certified modules,\r\n * so a silent change to any slot's behaviour regresses all of them at once.\r\n *\r\n * The PROPAGATION ASYMMETRY (see below) is the single most important thing\r\n * here. It is deliberate, it is counter-intuitive, and nothing but a test\r\n * stops a future reader from \"tidying\" it into consistency and breaking every\r\n * favourite-star and picker-button site in the fleet.\r\n *\r\n * NOT COVERED — and deliberately so: R-G.3 MUST (light + dark + compact +\r\n * responsive at 320/375/414) is a VISUAL contract. jsdom computes no layout,\r\n * so asserting it here would produce tests that pass while the cards are\r\n * broken on a phone — worse than no coverage, because it would look like\r\n * coverage. R-G.3 needs a browser (Storybook + visual regression) and remains\r\n * open for all three props.\r\n */\r\ndescribe(\"MobileRowCard — slot rendering\", () => {\r\n test(\"renders title, subtitle and meta, omitting lines with no content\", () => {\r\n render(\r\n <MobileRowCard\r\n title=\"2025-IM-0042\"\r\n subtitle=\"SOFRANE SA\"\r\n meta={[\"12/05/2026\", \"3 pièces\"]}\r\n />\r\n );\r\n\r\n expect(screen.getByText(\"2025-IM-0042\")).toBeInTheDocument();\r\n expect(screen.getByText(\"SOFRANE SA\")).toBeInTheDocument();\r\n // meta joins with \" · \" into a single node\r\n expect(screen.getByText(\"12/05/2026 · 3 pièces\")).toBeInTheDocument();\r\n });\r\n\r\n test(\"meta drops null / empty entries rather than rendering stray separators\", () => {\r\n render(<MobileRowCard title=\"X\" meta={[\"Émise 01/01/2026\", null, \"\", undefined]} />);\r\n expect(screen.getByText(\"Émise 01/01/2026\")).toBeInTheDocument();\r\n expect(screen.queryByText(/·/)).not.toBeInTheDocument();\r\n });\r\n\r\n test(\"a string title gets a native tooltip; a node title does not stringify\", () => {\r\n const { rerender } = render(<MobileRowCard title=\"Long reference\" />);\r\n expect(screen.getByText(\"Long reference\")).toHaveAttribute(\"title\", \"Long reference\");\r\n\r\n rerender(<MobileRowCard title={<span>Node title</span>} />);\r\n expect(screen.getByText(\"Node title\")).toBeInTheDocument();\r\n /* The regression guarded here: wrapping a node yielded title=\"[object\r\n * Object]\". Asserted with queryByTitle rather than `.closest(\"[title]\")`\r\n * so it stays a Testing-Library query (testing-library/no-node-access).\r\n * `/./` = \"no element carries ANY non-empty title\", which is a STRONGER\r\n * assertion than the ancestor walk it replaces: MobileRowCard sets a title\r\n * attribute in exactly two places (the title Box and the subtitle Box) and\r\n * only when the value is a string, so with a node title and no subtitle the\r\n * whole tree must be title-less. */\r\n expect(screen.queryByTitle(/./)).not.toBeInTheDocument();\r\n });\r\n});\r\n\r\ndescribe(\"MobileRowCard — kv slot\", () => {\r\n test(\"renders each pair as a KV label/value unit\", () => {\r\n render(\r\n <MobileRowCard\r\n title=\"ref\"\r\n kv={[\r\n { label: \"Catégorie\", value: \"CONTINGENT\" },\r\n { label: \"Importateur\", value: \"SOFRANE SA\" },\r\n ]}\r\n />\r\n );\r\n\r\n expect(screen.getByText(\"Catégorie\")).toBeInTheDocument();\r\n expect(screen.getByText(\"CONTINGENT\")).toBeInTheDocument();\r\n expect(screen.getByText(\"Importateur\")).toBeInTheDocument();\r\n expect(screen.getByText(\"SOFRANE SA\")).toBeInTheDocument();\r\n });\r\n\r\n test(\"an empty value KEEPS the pair and shows KV's own em-dash placeholder\", () => {\r\n // This is why every consuming site could drop its `?? \\\"-\\\"`: KV owns the\r\n // placeholder. Losing this behaviour would silently reintroduce ten local\r\n // fallbacks across the fleet.\r\n render(\r\n <MobileRowCard\r\n title=\"ref\"\r\n kv={[\r\n { label: \"Bureau douanier\", value: undefined },\r\n { label: \"Marchandise\", value: \"\" },\r\n { label: \"Devise\", value: null },\r\n ]}\r\n />\r\n );\r\n\r\n expect(screen.getByText(\"Bureau douanier\")).toBeInTheDocument();\r\n expect(screen.getByText(\"Marchandise\")).toBeInTheDocument();\r\n expect(screen.getByText(\"Devise\")).toBeInTheDocument();\r\n expect(screen.getAllByText(\"—\")).toHaveLength(3);\r\n });\r\n\r\n test(\"a custom fallback overrides the em dash\", () => {\r\n render(\r\n <MobileRowCard title=\"ref\" kv={[{ label: \"Banque\", fallback: \"Non assignée\" }]} />\r\n );\r\n expect(screen.getByText(\"Non assignée\")).toBeInTheDocument();\r\n });\r\n\r\n test(\"pairs with no label are DROPPED (KV would emit a dangling aria-labelledby)\", () => {\r\n render(\r\n <MobileRowCard\r\n title=\"ref\"\r\n kv={[\r\n { label: \"\", value: \"orphan-empty\" },\r\n // `label` is required but its type (ReactNode) admits undefined, so\r\n // this is type-valid and exercises the runtime `!= null` guard.\r\n { label: undefined, value: \"orphan-missing\" },\r\n { label: \"Kept\", value: \"kept-value\" },\r\n ]}\r\n />\r\n );\r\n\r\n expect(screen.queryByText(\"orphan-empty\")).not.toBeInTheDocument();\r\n expect(screen.queryByText(\"orphan-missing\")).not.toBeInTheDocument();\r\n expect(screen.getByText(\"kept-value\")).toBeInTheDocument();\r\n });\r\n});\r\n\r\ndescribe(\"MobileRowCard — chips slot\", () => {\r\n test(\"renders chip nodes and filters falsy entries\", () => {\r\n render(\r\n <MobileRowCard\r\n title=\"ref\"\r\n chips={[<span key=\"a\">Approuvé</span>, null, false, <span key=\"b\">CO</span>]}\r\n />\r\n );\r\n expect(screen.getByText(\"Approuvé\")).toBeInTheDocument();\r\n expect(screen.getByText(\"CO\")).toBeInTheDocument();\r\n });\r\n});\r\n\r\ndescribe(\"MobileRowCard — actions (kebab)\", () => {\r\n test(\"kebab renders only when at least one non-divider action exists\", () => {\r\n const { rerender } = render(<MobileRowCard title=\"ref\" actions={[]} />);\r\n expect(screen.queryByRole(\"button\")).not.toBeInTheDocument();\r\n\r\n rerender(<MobileRowCard title=\"ref\" actions={[{ divider: true }]} />);\r\n expect(screen.queryByRole(\"button\")).not.toBeInTheDocument();\r\n\r\n rerender(\r\n <MobileRowCard\r\n title=\"ref\"\r\n actions={[{ label: \"Détail\", onClick: () => {} }]}\r\n actionsAriaLabel=\"Actions pour 2025-IM-0042\"\r\n />\r\n );\r\n expect(\r\n screen.getByRole(\"button\", { name: \"Actions pour 2025-IM-0042\" })\r\n ).toBeInTheDocument();\r\n });\r\n});\r\n\r\n/**\r\n * THE PROPAGATION CONTRACT — the reason this file matters most.\r\n *\r\n * DataGrid's mobile-card wrapper makes the whole card the click target\r\n * (role=button + onRowClick). Two slots therefore behave DIFFERENTLY on\r\n * purpose:\r\n *\r\n * leading — does NOT stop propagation. A decorative node (icon, avatar)\r\n * should still open the row like the rest of the card. Interactive\r\n * leading content is responsible for stopping propagation itself,\r\n * exactly as DataGrid's own FavoriteCell does. Get this wrong and\r\n * a tap both toggles the favourite star AND opens the drawer.\r\n *\r\n * trailing — DOES stop propagation (it shares the kebab's wrapper). Its\r\n * declared purpose is interactive actions, and a tap that both\r\n * fires the action and opens the row is the more damaging default.\r\n *\r\n * Making these two consistent — in either direction — is a breaking change for\r\n * the ten sites that depend on them.\r\n */\r\ndescribe(\"MobileRowCard — propagation asymmetry (deliberate)\", () => {\r\n test(\"leading does NOT stop click propagation to the card\", () => {\r\n const onCardClick = jest.fn();\r\n render(\r\n <div onClick={onCardClick}>\r\n <MobileRowCard title=\"ref\" leading={<span>star</span>} />\r\n </div>\r\n );\r\n\r\n fireEvent.click(screen.getByText(\"star\"));\r\n expect(onCardClick).toHaveBeenCalledTimes(1);\r\n });\r\n\r\n test(\"trailing DOES stop click propagation to the card\", () => {\r\n const onCardClick = jest.fn();\r\n const onAction = jest.fn();\r\n render(\r\n <div onClick={onCardClick}>\r\n <MobileRowCard\r\n title=\"ref\"\r\n trailing={<button onClick={onAction}>Choisir</button>}\r\n />\r\n </div>\r\n );\r\n\r\n fireEvent.click(screen.getByRole(\"button\", { name: \"Choisir\" }));\r\n expect(onAction).toHaveBeenCalledTimes(1);\r\n expect(onCardClick).not.toHaveBeenCalled();\r\n });\r\n\r\n test(\"trailing stops keydown propagation too (keyboard parity)\", () => {\r\n const onCardKeyDown = jest.fn();\r\n render(\r\n <div onKeyDown={onCardKeyDown}>\r\n <MobileRowCard title=\"ref\" trailing={<button>Choisir</button>} />\r\n </div>\r\n );\r\n\r\n fireEvent.keyDown(screen.getByRole(\"button\", { name: \"Choisir\" }), { key: \"Enter\" });\r\n expect(onCardKeyDown).not.toHaveBeenCalled();\r\n });\r\n\r\n test(\"opening the kebab does not fire the card click\", () => {\r\n const onCardClick = jest.fn();\r\n render(\r\n <div onClick={onCardClick}>\r\n <MobileRowCard title=\"ref\" actions={[{ label: \"Détail\", onClick: () => {} }]} />\r\n </div>\r\n );\r\n\r\n fireEvent.click(screen.getByRole(\"button\", { name: \"Plus d'actions\" }));\r\n expect(onCardClick).not.toHaveBeenCalled();\r\n });\r\n});\r\n\r\ndescribe(\"MobileRowCard — header composition\", () => {\r\n test(\"trailing and the kebab coexist, trailing first\", () => {\r\n render(\r\n <MobileRowCard\r\n title=\"ref\"\r\n trailing={<button>Visualiser</button>}\r\n actions={[{ label: \"Supprimer\", onClick: () => {} }]}\r\n actionsAriaLabel=\"Autres actions\"\r\n />\r\n );\r\n\r\n const visualiser = screen.getByRole(\"button\", { name: \"Visualiser\" });\r\n const kebab = screen.getByRole(\"button\", { name: \"Autres actions\" });\r\n expect(visualiser).toBeInTheDocument();\r\n expect(kebab).toBeInTheDocument();\r\n\r\n // Document order: trailing precedes the kebab in the header end cluster.\r\n expect(\r\n visualiser.compareDocumentPosition(kebab) & Node.DOCUMENT_POSITION_FOLLOWING\r\n ).toBeTruthy();\r\n });\r\n\r\n test(\"a card with ONLY trailing still renders its header\", () => {\r\n // Regression guard: hasHeader must include hasTrailing, otherwise a\r\n // title-less picker card would drop its action entirely.\r\n render(<MobileRowCard trailing={<button>Choisir</button>} />);\r\n expect(screen.getByRole(\"button\", { name: \"Choisir\" })).toBeInTheDocument();\r\n });\r\n\r\n test(\"a card with ONLY leading still renders its header\", () => {\r\n render(<MobileRowCard leading={<span>star</span>} />);\r\n expect(screen.getByText(\"star\")).toBeInTheDocument();\r\n });\r\n\r\n test(\"no props renders no header and does not throw\", () => {\r\n /* `render` not throwing IS the second half of this assertion. The button\r\n * check uses screen.queryByRole rather than container.querySelector\r\n * (testing-library/no-container + no-node-access), matching the idiom the\r\n * kebab test above already uses. */\r\n render(<MobileRowCard />);\r\n expect(screen.queryByRole(\"button\")).not.toBeInTheDocument();\r\n });\r\n});\r\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"MobileRowCard.test.js","names":["render","screen","fireEvent","MobileRowCard","jsx","_jsx","describe","test","title","subtitle","meta","expect","getByText","toBeInTheDocument","undefined","queryByText","not","rerender","toHaveAttribute","children","queryByTitle","kv","label","value","getAllByText","toHaveLength","fallback","chips","actions","queryByRole","divider","onClick","actionsAriaLabel","getByRole","name","onCardClick","jest","fn","leading","click","toHaveBeenCalledTimes","onAction","trailing","toHaveBeenCalled","onCardKeyDown","onKeyDown","keyDown","key","visualiser","kebab","compareDocumentPosition","Node","DOCUMENT_POSITION_FOLLOWING","toBeTruthy"],"sources":["../../../../src/lib/v2/__tests__/MobileRowCard.test.tsx"],"sourcesContent":["import \"@testing-library/jest-dom\";\r\nimport { render, screen, fireEvent } from \"@testing-library/react\";\r\nimport MobileRowCard from \"../components/MobileRowCard\";\r\n\r\n/**\r\n * MobileRowCard — slot contract tests.\r\n *\r\n * WHY THIS FILE EXISTS\r\n * --------------------\r\n * §10.3 R-G.6 MUST — \"Snapshot Storybook + tests Jest/Testing-Library\" — was\r\n * unmet for THREE props added to this component across successive module\r\n * audits: `kv` and `leading` (ms-dfd-fe Area 5), then `trailing`\r\n * (ms-dfd-fe/ms-ti-fe A5-01). Each was shipped as \"additive, backward\r\n * compatible\", which is true and is not the same thing as verified. This\r\n * component is consumed by ten mobile-card sites across two certified modules,\r\n * so a silent change to any slot's behaviour regresses all of them at once.\r\n *\r\n * The PROPAGATION ASYMMETRY (see below) is the single most important thing\r\n * here. It is deliberate, it is counter-intuitive, and nothing but a test\r\n * stops a future reader from \"tidying\" it into consistency and breaking every\r\n * favourite-star and picker-button site in the fleet.\r\n *\r\n * NOT COVERED — and deliberately so: R-G.3 MUST (light + dark + compact +\r\n * responsive at 320/375/414) is a VISUAL contract. jsdom computes no layout,\r\n * so asserting it here would produce tests that pass while the cards are\r\n * broken on a phone — worse than no coverage, because it would look like\r\n * coverage. R-G.3 needs a browser (Storybook + visual regression) and remains\r\n * open for all three props.\r\n */\r\ndescribe(\"MobileRowCard — slot rendering\", () => {\r\n test(\"renders title, subtitle and meta, omitting lines with no content\", () => {\r\n render(\r\n <MobileRowCard\r\n title=\"2025-IM-0042\"\r\n subtitle=\"SOFRANE SA\"\r\n meta={[\"12/05/2026\", \"3 pièces\"]}\r\n />\r\n );\r\n\r\n expect(screen.getByText(\"2025-IM-0042\")).toBeInTheDocument();\r\n expect(screen.getByText(\"SOFRANE SA\")).toBeInTheDocument();\r\n // meta joins with \" · \" into a single node\r\n expect(screen.getByText(\"12/05/2026 · 3 pièces\")).toBeInTheDocument();\r\n });\r\n\r\n test(\"meta drops null / empty entries rather than rendering stray separators\", () => {\r\n render(<MobileRowCard title=\"X\" meta={[\"Émise 01/01/2026\", null, \"\", undefined]} />);\r\n expect(screen.getByText(\"Émise 01/01/2026\")).toBeInTheDocument();\r\n expect(screen.queryByText(/·/)).not.toBeInTheDocument();\r\n });\r\n\r\n test(\"a string title gets a native tooltip; a node title does not stringify\", () => {\r\n const { rerender } = render(<MobileRowCard title=\"Long reference\" />);\r\n expect(screen.getByText(\"Long reference\")).toHaveAttribute(\"title\", \"Long reference\");\r\n\r\n rerender(<MobileRowCard title={<span>Node title</span>} />);\r\n expect(screen.getByText(\"Node title\")).toBeInTheDocument();\r\n /* The regression guarded here: wrapping a node yielded title=\"[object\r\n * Object]\". Asserted with queryByTitle rather than `.closest(\"[title]\")`\r\n * so it stays a Testing-Library query (testing-library/no-node-access).\r\n * `/./` = \"no element carries ANY non-empty title\", which is a STRONGER\r\n * assertion than the ancestor walk it replaces: MobileRowCard sets a title\r\n * attribute in exactly two places (the title Box and the subtitle Box) and\r\n * only when the value is a string, so with a node title and no subtitle the\r\n * whole tree must be title-less. */\r\n expect(screen.queryByTitle(/./)).not.toBeInTheDocument();\r\n });\r\n});\r\n\r\ndescribe(\"MobileRowCard — kv slot\", () => {\r\n test(\"renders each pair as a KV label/value unit\", () => {\r\n render(\r\n <MobileRowCard\r\n title=\"ref\"\r\n kv={[\r\n { label: \"Catégorie\", value: \"CONTINGENT\" },\r\n { label: \"Importateur\", value: \"SOFRANE SA\" },\r\n ]}\r\n />\r\n );\r\n\r\n expect(screen.getByText(\"Catégorie\")).toBeInTheDocument();\r\n expect(screen.getByText(\"CONTINGENT\")).toBeInTheDocument();\r\n expect(screen.getByText(\"Importateur\")).toBeInTheDocument();\r\n expect(screen.getByText(\"SOFRANE SA\")).toBeInTheDocument();\r\n });\r\n\r\n test(\"an empty value KEEPS the pair and shows KV's own em-dash placeholder\", () => {\r\n // This is why every consuming site could drop its `?? \\\"-\\\"`: KV owns the\r\n // placeholder. Losing this behaviour would silently reintroduce ten local\r\n // fallbacks across the fleet.\r\n render(\r\n <MobileRowCard\r\n title=\"ref\"\r\n kv={[\r\n { label: \"Bureau douanier\", value: undefined },\r\n { label: \"Marchandise\", value: \"\" },\r\n { label: \"Devise\", value: null },\r\n ]}\r\n />\r\n );\r\n\r\n expect(screen.getByText(\"Bureau douanier\")).toBeInTheDocument();\r\n expect(screen.getByText(\"Marchandise\")).toBeInTheDocument();\r\n expect(screen.getByText(\"Devise\")).toBeInTheDocument();\r\n expect(screen.getAllByText(\"—\")).toHaveLength(3);\r\n });\r\n\r\n test(\"a custom fallback overrides the em dash\", () => {\r\n render(\r\n <MobileRowCard title=\"ref\" kv={[{ label: \"Banque\", fallback: \"Non assignée\" }]} />\r\n );\r\n expect(screen.getByText(\"Non assignée\")).toBeInTheDocument();\r\n });\r\n\r\n test(\"pairs with no label are DROPPED (KV would emit a dangling aria-labelledby)\", () => {\r\n render(\r\n <MobileRowCard\r\n title=\"ref\"\r\n kv={[\r\n { label: \"\", value: \"orphan-empty\" },\r\n // `label` is required but its type (ReactNode) admits undefined, so\r\n // this is type-valid and exercises the runtime `!= null` guard.\r\n { label: undefined, value: \"orphan-missing\" },\r\n { label: \"Kept\", value: \"kept-value\" },\r\n ]}\r\n />\r\n );\r\n\r\n expect(screen.queryByText(\"orphan-empty\")).not.toBeInTheDocument();\r\n expect(screen.queryByText(\"orphan-missing\")).not.toBeInTheDocument();\r\n expect(screen.getByText(\"kept-value\")).toBeInTheDocument();\r\n });\r\n});\r\n\r\ndescribe(\"MobileRowCard — chips slot\", () => {\r\n test(\"renders chip nodes and filters falsy entries\", () => {\r\n render(\r\n <MobileRowCard\r\n title=\"ref\"\r\n chips={[<span key=\"a\">Approuvé</span>, null, false, <span key=\"b\">CO</span>]}\r\n />\r\n );\r\n expect(screen.getByText(\"Approuvé\")).toBeInTheDocument();\r\n expect(screen.getByText(\"CO\")).toBeInTheDocument();\r\n });\r\n});\r\n\r\ndescribe(\"MobileRowCard — actions (kebab)\", () => {\r\n test(\"kebab renders only when at least one non-divider action exists\", () => {\r\n const { rerender } = render(<MobileRowCard title=\"ref\" actions={[]} />);\r\n expect(screen.queryByRole(\"button\")).not.toBeInTheDocument();\r\n\r\n rerender(<MobileRowCard title=\"ref\" actions={[{ divider: true }]} />);\r\n expect(screen.queryByRole(\"button\")).not.toBeInTheDocument();\r\n\r\n rerender(\r\n <MobileRowCard\r\n title=\"ref\"\r\n actions={[{ label: \"Détail\", onClick: () => {} }]}\r\n actionsAriaLabel=\"Actions pour 2025-IM-0042\"\r\n />\r\n );\r\n expect(\r\n screen.getByRole(\"button\", { name: \"Actions pour 2025-IM-0042\" })\r\n ).toBeInTheDocument();\r\n });\r\n});\r\n\r\n/**\r\n * THE PROPAGATION CONTRACT — the reason this file matters most.\r\n *\r\n * DataGrid's mobile-card wrapper makes the whole card the click target\r\n * (role=button + onRowClick). Two slots therefore behave DIFFERENTLY on\r\n * purpose:\r\n *\r\n * leading — does NOT stop propagation. A decorative node (icon, avatar)\r\n * should still open the row like the rest of the card. Interactive\r\n * leading content is responsible for stopping propagation itself,\r\n * exactly as DataGrid's own FavoriteCell does. Get this wrong and\r\n * a tap both toggles the favourite star AND opens the drawer.\r\n *\r\n * trailing — DOES stop propagation (it shares the kebab's wrapper). Its\r\n * declared purpose is interactive actions, and a tap that both\r\n * fires the action and opens the row is the more damaging default.\r\n *\r\n * Making these two consistent — in either direction — is a breaking change for\r\n * the ten sites that depend on them.\r\n */\r\ndescribe(\"MobileRowCard — propagation asymmetry (deliberate)\", () => {\r\n test(\"leading does NOT stop click propagation to the card\", () => {\r\n const onCardClick = jest.fn();\r\n render(\r\n <div onClick={onCardClick}>\r\n <MobileRowCard title=\"ref\" leading={<span>star</span>} />\r\n </div>\r\n );\r\n\r\n fireEvent.click(screen.getByText(\"star\"));\r\n expect(onCardClick).toHaveBeenCalledTimes(1);\r\n });\r\n\r\n test(\"trailing DOES stop click propagation to the card\", () => {\r\n const onCardClick = jest.fn();\r\n const onAction = jest.fn();\r\n render(\r\n <div onClick={onCardClick}>\r\n <MobileRowCard\r\n title=\"ref\"\r\n trailing={<button onClick={onAction}>Choisir</button>}\r\n />\r\n </div>\r\n );\r\n\r\n fireEvent.click(screen.getByRole(\"button\", { name: \"Choisir\" }));\r\n expect(onAction).toHaveBeenCalledTimes(1);\r\n expect(onCardClick).not.toHaveBeenCalled();\r\n });\r\n\r\n test(\"trailing stops keydown propagation too (keyboard parity)\", () => {\r\n const onCardKeyDown = jest.fn();\r\n render(\r\n <div onKeyDown={onCardKeyDown}>\r\n <MobileRowCard title=\"ref\" trailing={<button>Choisir</button>} />\r\n </div>\r\n );\r\n\r\n fireEvent.keyDown(screen.getByRole(\"button\", { name: \"Choisir\" }), { key: \"Enter\" });\r\n expect(onCardKeyDown).not.toHaveBeenCalled();\r\n });\r\n\r\n test(\"opening the kebab does not fire the card click\", () => {\r\n const onCardClick = jest.fn();\r\n render(\r\n <div onClick={onCardClick}>\r\n <MobileRowCard title=\"ref\" actions={[{ label: \"Détail\", onClick: () => {} }]} />\r\n </div>\r\n );\r\n\r\n fireEvent.click(screen.getByRole(\"button\", { name: \"Plus d'actions\" }));\r\n expect(onCardClick).not.toHaveBeenCalled();\r\n });\r\n});\r\n\r\ndescribe(\"MobileRowCard — header composition\", () => {\r\n test(\"trailing and the kebab coexist, trailing first\", () => {\r\n render(\r\n <MobileRowCard\r\n title=\"ref\"\r\n trailing={<button>Visualiser</button>}\r\n actions={[{ label: \"Supprimer\", onClick: () => {} }]}\r\n actionsAriaLabel=\"Autres actions\"\r\n />\r\n );\r\n\r\n const visualiser = screen.getByRole(\"button\", { name: \"Visualiser\" });\r\n const kebab = screen.getByRole(\"button\", { name: \"Autres actions\" });\r\n expect(visualiser).toBeInTheDocument();\r\n expect(kebab).toBeInTheDocument();\r\n\r\n // Document order: trailing precedes the kebab in the header end cluster.\r\n expect(\r\n visualiser.compareDocumentPosition(kebab) & Node.DOCUMENT_POSITION_FOLLOWING\r\n ).toBeTruthy();\r\n });\r\n\r\n test(\"a card with ONLY trailing still renders its header\", () => {\r\n // Regression guard: hasHeader must include hasTrailing, otherwise a\r\n // title-less picker card would drop its action entirely.\r\n render(<MobileRowCard trailing={<button>Choisir</button>} />);\r\n expect(screen.getByRole(\"button\", { name: \"Choisir\" })).toBeInTheDocument();\r\n });\r\n\r\n test(\"a card with ONLY leading still renders its header\", () => {\r\n render(<MobileRowCard leading={<span>star</span>} />);\r\n expect(screen.getByText(\"star\")).toBeInTheDocument();\r\n });\r\n\r\n test(\"no props renders no header and does not throw\", () => {\r\n /* `render` not throwing IS the second half of this assertion. The button\r\n * check uses screen.queryByRole rather than container.querySelector\r\n * (testing-library/no-container + no-node-access), matching the idiom the\r\n * kebab test above already uses. */\r\n render(<MobileRowCard />);\r\n expect(screen.queryByRole(\"button\")).not.toBeInTheDocument();\r\n });\r\n});\r\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * @jest-environment jsdom
3
+ */
4
+ import "@testing-library/jest-dom";
5
+ import { render, screen } from "@testing-library/react";
6
+ import PreviewDrawer from "../patterns/PreviewDrawer";
7
+
8
+ /**
9
+ * PreviewDrawer (G-40) — promoted from `refonte-frontend` (Area 5).
10
+ *
11
+ * The assertions below are the CONTRACT the promotion rests on, not a render
12
+ * smoke test. Each one pins a decision the module's local ancestor had got
13
+ * wrong or had had to document as a hazard.
14
+ */
15
+ import { jsx as _jsx } from "react/jsx-runtime";
16
+ const LIGNE = {
17
+ id: 1,
18
+ reference: "2025-IM-0042"
19
+ };
20
+ describe("PreviewDrawer", () => {
21
+ test("renders nothing without a row, so hosts can mount it unconditionally", () => {
22
+ render(/*#__PURE__*/_jsx(PreviewDrawer, {
23
+ open: true,
24
+ row: null,
25
+ subtitle: "D\xE9claration"
26
+ }));
27
+ expect(screen.queryByRole("dialog")).not.toBeInTheDocument();
28
+ });
29
+ test("renders the summary sheet as label/value pairs", () => {
30
+ render(/*#__PURE__*/_jsx(PreviewDrawer, {
31
+ open: true,
32
+ row: LIGNE,
33
+ title: "2025-IM-0042",
34
+ subtitle: "D\xE9claration",
35
+ items: [{
36
+ label: "Importateur",
37
+ value: "SOFRANE SA"
38
+ }, {
39
+ label: "Référence",
40
+ value: "2025-IM-0042",
41
+ mono: true
42
+ }]
43
+ }));
44
+ expect(screen.getByText("Importateur")).toBeInTheDocument();
45
+ expect(screen.getByText("SOFRANE SA")).toBeInTheDocument();
46
+ });
47
+
48
+ /**
49
+ * THE DEFAULT THE ANCESTOR COULD NOT SAFELY HAVE. A generic drawer that
50
+ * computed its title from one business type's fields needed
51
+ * `as unknown as DemandeRow` to do it. Here a missing title degrades to a
52
+ * neutral fallback and nothing is asserted about the row's shape.
53
+ */
54
+ test("falls back to a neutral title rather than reading the row", () => {
55
+ render(/*#__PURE__*/_jsx(PreviewDrawer, {
56
+ open: true,
57
+ row: LIGNE,
58
+ subtitle: "D\xE9claration"
59
+ }));
60
+ expect(screen.getByRole("heading", {
61
+ level: 2,
62
+ name: "Détail"
63
+ })).toBeInTheDocument();
64
+ });
65
+ test("no open action unless the host supplies onOpenItem", () => {
66
+ render(/*#__PURE__*/_jsx(PreviewDrawer, {
67
+ open: true,
68
+ row: LIGNE,
69
+ subtitle: "D\xE9claration"
70
+ }));
71
+ expect(screen.queryByRole("button", {
72
+ name: "Consulter"
73
+ })).not.toBeInTheDocument();
74
+ });
75
+ test("the open action is rendered, and labelled by the host", () => {
76
+ render(/*#__PURE__*/_jsx(PreviewDrawer, {
77
+ open: true,
78
+ row: LIGNE,
79
+ subtitle: "D\xE9claration",
80
+ onOpenItem: jest.fn(),
81
+ labels: {
82
+ open: "Consulter la demande"
83
+ }
84
+ }));
85
+ expect(screen.getByRole("button", {
86
+ name: "Consulter la demande"
87
+ })).toBeInTheDocument();
88
+ });
89
+
90
+ /**
91
+ * `canOpenItem` defaults to ALLOWED, deliberately: this component knows no
92
+ * business status, so a masking rule it invented would be worse than none.
93
+ */
94
+ test("canOpenItem gates the open action, and defaults to allowed", () => {
95
+ const {
96
+ unmount
97
+ } = render(/*#__PURE__*/_jsx(PreviewDrawer, {
98
+ open: true,
99
+ row: LIGNE,
100
+ subtitle: "D\xE9claration",
101
+ onOpenItem: jest.fn(),
102
+ canOpenItem: () => false
103
+ }));
104
+ expect(screen.queryByRole("button", {
105
+ name: "Consulter"
106
+ })).not.toBeInTheDocument();
107
+ unmount();
108
+ render(/*#__PURE__*/_jsx(PreviewDrawer, {
109
+ open: true,
110
+ row: LIGNE,
111
+ subtitle: "D\xE9claration",
112
+ onOpenItem: jest.fn()
113
+ }));
114
+ expect(screen.getByRole("button", {
115
+ name: "Consulter"
116
+ })).toBeInTheDocument();
117
+ });
118
+ test("children render under the summary sheet", () => {
119
+ render(/*#__PURE__*/_jsx(PreviewDrawer, {
120
+ open: true,
121
+ row: LIGNE,
122
+ subtitle: "D\xE9claration",
123
+ items: [{
124
+ label: "Importateur",
125
+ value: "SOFRANE SA"
126
+ }],
127
+ children: /*#__PURE__*/_jsx("p", {
128
+ children: "Pi\xE8ces jointes"
129
+ })
130
+ }));
131
+ expect(screen.getByText("Pièces jointes")).toBeInTheDocument();
132
+ });
133
+
134
+ /**
135
+ * Item navigation stays opt-in at this level too: `Drawer` renders the
136
+ * prev/next cluster only when a handler is wired (its own D-A10.2 note), and
137
+ * a preview that navigates must still show the cluster DISABLED on a
138
+ * single-row result set — which is why presence of the handler, not of
139
+ * `hasPrev`, is what matters.
140
+ */
141
+ test("no navigation cluster unless a handler is wired", () => {
142
+ const {
143
+ unmount
144
+ } = render(/*#__PURE__*/_jsx(PreviewDrawer, {
145
+ open: true,
146
+ row: LIGNE,
147
+ subtitle: "D\xE9claration"
148
+ }));
149
+ expect(screen.queryByRole("button", {
150
+ name: "Suivant"
151
+ })).not.toBeInTheDocument();
152
+ unmount();
153
+ render(/*#__PURE__*/_jsx(PreviewDrawer, {
154
+ open: true,
155
+ row: LIGNE,
156
+ subtitle: "D\xE9claration",
157
+ onNext: jest.fn(),
158
+ hasNext: false
159
+ }));
160
+ expect(screen.getByRole("button", {
161
+ name: "Suivant"
162
+ })).toBeDisabled();
163
+ });
164
+ });
165
+ //# sourceMappingURL=PreviewDrawer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PreviewDrawer.test.js","names":["render","screen","PreviewDrawer","jsx","_jsx","LIGNE","id","reference","describe","test","open","row","subtitle","expect","queryByRole","not","toBeInTheDocument","title","items","label","value","mono","getByText","getByRole","level","name","onOpenItem","jest","fn","labels","unmount","canOpenItem","children","onNext","hasNext","toBeDisabled"],"sources":["../../../../src/lib/v2/__tests__/PreviewDrawer.test.tsx"],"sourcesContent":["/**\r\n * @jest-environment jsdom\r\n */\r\nimport \"@testing-library/jest-dom\";\r\nimport { render, screen } from \"@testing-library/react\";\r\nimport PreviewDrawer from \"../patterns/PreviewDrawer\";\r\n\r\n/**\r\n * PreviewDrawer (G-40) — promoted from `refonte-frontend` (Area 5).\r\n *\r\n * The assertions below are the CONTRACT the promotion rests on, not a render\r\n * smoke test. Each one pins a decision the module's local ancestor had got\r\n * wrong or had had to document as a hazard.\r\n */\r\n\r\ninterface Ligne {\r\n id: number;\r\n reference: string;\r\n}\r\n\r\nconst LIGNE: Ligne = { id: 1, reference: \"2025-IM-0042\" };\r\n\r\ndescribe(\"PreviewDrawer\", () => {\r\n test(\"renders nothing without a row, so hosts can mount it unconditionally\", () => {\r\n render(<PreviewDrawer<Ligne> open row={null} subtitle=\"Déclaration\" />);\r\n expect(screen.queryByRole(\"dialog\")).not.toBeInTheDocument();\r\n });\r\n\r\n test(\"renders the summary sheet as label/value pairs\", () => {\r\n render(\r\n <PreviewDrawer<Ligne>\r\n open\r\n row={LIGNE}\r\n title=\"2025-IM-0042\"\r\n subtitle=\"Déclaration\"\r\n items={[\r\n { label: \"Importateur\", value: \"SOFRANE SA\" },\r\n { label: \"Référence\", value: \"2025-IM-0042\", mono: true },\r\n ]}\r\n />\r\n );\r\n expect(screen.getByText(\"Importateur\")).toBeInTheDocument();\r\n expect(screen.getByText(\"SOFRANE SA\")).toBeInTheDocument();\r\n });\r\n\r\n /**\r\n * THE DEFAULT THE ANCESTOR COULD NOT SAFELY HAVE. A generic drawer that\r\n * computed its title from one business type's fields needed\r\n * `as unknown as DemandeRow` to do it. Here a missing title degrades to a\r\n * neutral fallback and nothing is asserted about the row's shape.\r\n */\r\n test(\"falls back to a neutral title rather than reading the row\", () => {\r\n render(<PreviewDrawer<Ligne> open row={LIGNE} subtitle=\"Déclaration\" />);\r\n expect(\r\n screen.getByRole(\"heading\", { level: 2, name: \"Détail\" })\r\n ).toBeInTheDocument();\r\n });\r\n\r\n test(\"no open action unless the host supplies onOpenItem\", () => {\r\n render(<PreviewDrawer<Ligne> open row={LIGNE} subtitle=\"Déclaration\" />);\r\n expect(screen.queryByRole(\"button\", { name: \"Consulter\" })).not.toBeInTheDocument();\r\n });\r\n\r\n test(\"the open action is rendered, and labelled by the host\", () => {\r\n render(\r\n <PreviewDrawer<Ligne>\r\n open\r\n row={LIGNE}\r\n subtitle=\"Déclaration\"\r\n onOpenItem={jest.fn()}\r\n labels={{ open: \"Consulter la demande\" }}\r\n />\r\n );\r\n expect(\r\n screen.getByRole(\"button\", { name: \"Consulter la demande\" })\r\n ).toBeInTheDocument();\r\n });\r\n\r\n /**\r\n * `canOpenItem` defaults to ALLOWED, deliberately: this component knows no\r\n * business status, so a masking rule it invented would be worse than none.\r\n */\r\n test(\"canOpenItem gates the open action, and defaults to allowed\", () => {\r\n const { unmount } = render(\r\n <PreviewDrawer<Ligne>\r\n open\r\n row={LIGNE}\r\n subtitle=\"Déclaration\"\r\n onOpenItem={jest.fn()}\r\n canOpenItem={() => false}\r\n />\r\n );\r\n expect(screen.queryByRole(\"button\", { name: \"Consulter\" })).not.toBeInTheDocument();\r\n unmount();\r\n\r\n render(\r\n <PreviewDrawer<Ligne> open row={LIGNE} subtitle=\"Déclaration\" onOpenItem={jest.fn()} />\r\n );\r\n expect(screen.getByRole(\"button\", { name: \"Consulter\" })).toBeInTheDocument();\r\n });\r\n\r\n test(\"children render under the summary sheet\", () => {\r\n render(\r\n <PreviewDrawer<Ligne>\r\n open\r\n row={LIGNE}\r\n subtitle=\"Déclaration\"\r\n items={[{ label: \"Importateur\", value: \"SOFRANE SA\" }]}\r\n >\r\n <p>Pièces jointes</p>\r\n </PreviewDrawer>\r\n );\r\n expect(screen.getByText(\"Pièces jointes\")).toBeInTheDocument();\r\n });\r\n\r\n /**\r\n * Item navigation stays opt-in at this level too: `Drawer` renders the\r\n * prev/next cluster only when a handler is wired (its own D-A10.2 note), and\r\n * a preview that navigates must still show the cluster DISABLED on a\r\n * single-row result set — which is why presence of the handler, not of\r\n * `hasPrev`, is what matters.\r\n */\r\n test(\"no navigation cluster unless a handler is wired\", () => {\r\n const { unmount } = render(\r\n <PreviewDrawer<Ligne> open row={LIGNE} subtitle=\"Déclaration\" />\r\n );\r\n expect(screen.queryByRole(\"button\", { name: \"Suivant\" })).not.toBeInTheDocument();\r\n unmount();\r\n\r\n render(\r\n <PreviewDrawer<Ligne>\r\n open\r\n row={LIGNE}\r\n subtitle=\"Déclaration\"\r\n onNext={jest.fn()}\r\n hasNext={false}\r\n />\r\n );\r\n expect(screen.getByRole(\"button\", { name: \"Suivant\" })).toBeDisabled();\r\n });\r\n});\r\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,156 @@
1
+ import "@testing-library/jest-dom";
2
+ import { render, screen, waitFor } from "@testing-library/react";
3
+ import userEvent from "@testing-library/user-event";
4
+ import ReferentielField from "../patterns/ReferentielField";
5
+
6
+ /**
7
+ * ReferentielField — `container="drawer"` (S-1) et `searchOnOpen` (S-2).
8
+ *
9
+ * CE QUE CE FICHIER PROTÈGE
10
+ * -------------------------
11
+ * Ces deux capacités ont été ajoutées pour débloquer l'adoption du pattern par
12
+ * des hôtes qui ne pouvaient pas l'utiliser :
13
+ *
14
+ * S-1 — R-M.5 impose un `Drawer` au-delà de 3 champs ou pour du contenu
15
+ * défilable long, ce qu'est un sélecteur à critères + grille paginée.
16
+ * Le conteneur était en dur.
17
+ * S-2 — certaines populations sont courtes et connues (les mandatants d'un
18
+ * transitaire), et la réponse attendue à l'ouverture est la LISTE, pas
19
+ * un formulaire vide.
20
+ *
21
+ * L'assertion centrale n'est pas que la recherche initiale part — c'est
22
+ * qu'elle part UNE SEULE FOIS. `runSearch` dépend de `draft`, donc un effet
23
+ * naïf repartirait à chaque frappe dans un critère : le sélecteur émettrait une
24
+ * requête par caractère, ce que le bouton « Rechercher » existe précisément
25
+ * pour éviter. La garde est un `ref`, et c'est elle que le troisième test
26
+ * exerce.
27
+ *
28
+ * Le corps est UNE expression partagée par les deux conteneurs, donc les tests
29
+ * de contenu ci-dessous valent pour les deux branches par construction. Ce
30
+ * fichier vérifie que la branche drawer rend bien ce corps — pas les internes
31
+ * de `Drawer`, qui ont leurs propres tests.
32
+ */
33
+ import { jsx as _jsx } from "react/jsx-runtime";
34
+ const LIGNES = [{
35
+ id: 1,
36
+ code: "7108",
37
+ description: "Or sous formes brutes"
38
+ }];
39
+ const COLONNES = [{
40
+ key: "code",
41
+ header: "Code"
42
+ }, {
43
+ key: "description",
44
+ header: "Description"
45
+ }];
46
+ const CRITERES = [{
47
+ name: "code",
48
+ label: "Code"
49
+ }];
50
+ function renderPicker(options) {
51
+ return render(/*#__PURE__*/_jsx(ReferentielField, {
52
+ value: null,
53
+ onChange: () => {},
54
+ search: options.search,
55
+ columns: COLONNES,
56
+ criteria: CRITERES,
57
+ title: "Rechercher un code",
58
+ ...(options.container !== undefined ? {
59
+ container: options.container
60
+ } : {}),
61
+ ...(options.searchOnOpen !== undefined ? {
62
+ searchOnOpen: options.searchOnOpen
63
+ } : {})
64
+ }));
65
+ }
66
+
67
+ /** Ouvre le sélecteur par son trigger (un Input en lecture seule). */
68
+ async function ouvrir() {
69
+ await userEvent.click(screen.getByRole("textbox"));
70
+ }
71
+ describe("ReferentielField — conteneur drawer (S-1)", () => {
72
+ test("rend le corps du sélecteur dans la branche drawer", async () => {
73
+ const search = jest.fn(() => ({
74
+ items: LIGNES,
75
+ total: 1
76
+ }));
77
+ renderPicker({
78
+ container: "drawer",
79
+ searchOnOpen: true,
80
+ search
81
+ });
82
+ await ouvrir();
83
+
84
+ /* Le critère ET la ligne de résultat : c'est le corps commun, pas un
85
+ * détail de `Drawer`. Si la branche ne rendait pas `pickerBody`, ces deux
86
+ * assertions tomberaient. */
87
+ expect(await screen.findByText("Or sous formes brutes")).toBeInTheDocument();
88
+ expect(screen.getByLabelText(/Code/)).toBeInTheDocument();
89
+ });
90
+ test("le défaut reste la modale — aucun appelant existant ne change", async () => {
91
+ const search = jest.fn(() => ({
92
+ items: LIGNES,
93
+ total: 1
94
+ }));
95
+ renderPicker({
96
+ searchOnOpen: true,
97
+ search
98
+ });
99
+ await ouvrir();
100
+ expect(await screen.findByText("Or sous formes brutes")).toBeInTheDocument();
101
+ });
102
+ });
103
+ describe("ReferentielField — searchOnOpen (S-2)", () => {
104
+ test("cherche à vide dès l'ouverture", async () => {
105
+ const search = jest.fn(() => ({
106
+ items: LIGNES,
107
+ total: 1
108
+ }));
109
+ renderPicker({
110
+ searchOnOpen: true,
111
+ search
112
+ });
113
+ await ouvrir();
114
+ await waitFor(() => expect(search).toHaveBeenCalledTimes(1));
115
+ /* À vide : c'est tout l'objet de la prop — la liste, pas un formulaire. */
116
+ expect(search).toHaveBeenCalledWith(expect.objectContaining({
117
+ criteria: {
118
+ code: ""
119
+ },
120
+ page: 1
121
+ }));
122
+ });
123
+ test("ne cherche pas à l'ouverture quand la prop est absente", async () => {
124
+ const search = jest.fn(() => ({
125
+ items: LIGNES,
126
+ total: 1
127
+ }));
128
+ renderPicker({
129
+ search
130
+ });
131
+ await ouvrir();
132
+
133
+ /* L'état « Aucune recherche » reste le comportement par défaut : la prop
134
+ * est un opt-in, pas un changement de contrat. */
135
+ expect(search).not.toHaveBeenCalled();
136
+ });
137
+ test("UNE SEULE recherche par ouverture, même en saisissant un critère", async () => {
138
+ const search = jest.fn(() => ({
139
+ items: LIGNES,
140
+ total: 1
141
+ }));
142
+ renderPicker({
143
+ searchOnOpen: true,
144
+ search
145
+ });
146
+ await ouvrir();
147
+ await waitFor(() => expect(search).toHaveBeenCalledTimes(1));
148
+
149
+ /* LE test de ce fichier. `runSearch` dépend de `draft` : sans la garde par
150
+ * `ref`, l'effet d'ouverture repartirait à chaque frappe et le sélecteur
151
+ * émettrait une requête par caractère. */
152
+ await userEvent.type(screen.getByLabelText(/Code/), "710");
153
+ expect(search).toHaveBeenCalledTimes(1);
154
+ });
155
+ });
156
+ //# sourceMappingURL=ReferentielFieldContainer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReferentielFieldContainer.test.js","names":["render","screen","waitFor","userEvent","ReferentielField","jsx","_jsx","LIGNES","id","code","description","COLONNES","key","header","CRITERES","name","label","renderPicker","options","value","onChange","search","columns","criteria","title","container","undefined","searchOnOpen","ouvrir","click","getByRole","describe","test","jest","fn","items","total","expect","findByText","toBeInTheDocument","getByLabelText","toHaveBeenCalledTimes","toHaveBeenCalledWith","objectContaining","page","not","toHaveBeenCalled","type"],"sources":["../../../../src/lib/v2/__tests__/ReferentielFieldContainer.test.tsx"],"sourcesContent":["import \"@testing-library/jest-dom\";\r\nimport { render, screen, waitFor } from \"@testing-library/react\";\r\nimport userEvent from \"@testing-library/user-event\";\r\nimport ReferentielField from \"../patterns/ReferentielField\";\r\nimport type { ReferentielSearchResult } from \"../patterns/ReferentielField\";\r\n\r\n/**\r\n * ReferentielField — `container=\"drawer\"` (S-1) et `searchOnOpen` (S-2).\r\n *\r\n * CE QUE CE FICHIER PROTÈGE\r\n * -------------------------\r\n * Ces deux capacités ont été ajoutées pour débloquer l'adoption du pattern par\r\n * des hôtes qui ne pouvaient pas l'utiliser :\r\n *\r\n * S-1 — R-M.5 impose un `Drawer` au-delà de 3 champs ou pour du contenu\r\n * défilable long, ce qu'est un sélecteur à critères + grille paginée.\r\n * Le conteneur était en dur.\r\n * S-2 — certaines populations sont courtes et connues (les mandatants d'un\r\n * transitaire), et la réponse attendue à l'ouverture est la LISTE, pas\r\n * un formulaire vide.\r\n *\r\n * L'assertion centrale n'est pas que la recherche initiale part — c'est\r\n * qu'elle part UNE SEULE FOIS. `runSearch` dépend de `draft`, donc un effet\r\n * naïf repartirait à chaque frappe dans un critère : le sélecteur émettrait une\r\n * requête par caractère, ce que le bouton « Rechercher » existe précisément\r\n * pour éviter. La garde est un `ref`, et c'est elle que le troisième test\r\n * exerce.\r\n *\r\n * Le corps est UNE expression partagée par les deux conteneurs, donc les tests\r\n * de contenu ci-dessous valent pour les deux branches par construction. Ce\r\n * fichier vérifie que la branche drawer rend bien ce corps — pas les internes\r\n * de `Drawer`, qui ont leurs propres tests.\r\n */\r\n\r\ninterface Ligne {\r\n id: number;\r\n code: string;\r\n description: string;\r\n}\r\n\r\nconst LIGNES: Ligne[] = [\r\n { id: 1, code: \"7108\", description: \"Or sous formes brutes\" },\r\n];\r\n\r\nconst COLONNES = [\r\n { key: \"code\", header: \"Code\" },\r\n { key: \"description\", header: \"Description\" },\r\n];\r\n\r\nconst CRITERES = [{ name: \"code\", label: \"Code\" }];\r\n\r\nfunction renderPicker(options: {\r\n container?: \"modal\" | \"drawer\";\r\n searchOnOpen?: boolean;\r\n search: () => ReferentielSearchResult<Ligne>;\r\n}) {\r\n return render(\r\n <ReferentielField<Ligne>\r\n value={null}\r\n onChange={() => {}}\r\n search={options.search}\r\n columns={COLONNES}\r\n criteria={CRITERES}\r\n title=\"Rechercher un code\"\r\n {...(options.container !== undefined\r\n ? { container: options.container }\r\n : {})}\r\n {...(options.searchOnOpen !== undefined\r\n ? { searchOnOpen: options.searchOnOpen }\r\n : {})}\r\n />\r\n );\r\n}\r\n\r\n/** Ouvre le sélecteur par son trigger (un Input en lecture seule). */\r\nasync function ouvrir(): Promise<void> {\r\n await userEvent.click(screen.getByRole(\"textbox\"));\r\n}\r\n\r\ndescribe(\"ReferentielField — conteneur drawer (S-1)\", () => {\r\n test(\"rend le corps du sélecteur dans la branche drawer\", async () => {\r\n const search = jest.fn(() => ({ items: LIGNES, total: 1 }));\r\n renderPicker({ container: \"drawer\", searchOnOpen: true, search });\r\n\r\n await ouvrir();\r\n\r\n /* Le critère ET la ligne de résultat : c'est le corps commun, pas un\r\n * détail de `Drawer`. Si la branche ne rendait pas `pickerBody`, ces deux\r\n * assertions tomberaient. */\r\n expect(await screen.findByText(\"Or sous formes brutes\")).toBeInTheDocument();\r\n expect(screen.getByLabelText(/Code/)).toBeInTheDocument();\r\n });\r\n\r\n test(\"le défaut reste la modale — aucun appelant existant ne change\", async () => {\r\n const search = jest.fn(() => ({ items: LIGNES, total: 1 }));\r\n renderPicker({ searchOnOpen: true, search });\r\n\r\n await ouvrir();\r\n\r\n expect(await screen.findByText(\"Or sous formes brutes\")).toBeInTheDocument();\r\n });\r\n});\r\n\r\ndescribe(\"ReferentielField — searchOnOpen (S-2)\", () => {\r\n test(\"cherche à vide dès l'ouverture\", async () => {\r\n const search = jest.fn(() => ({ items: LIGNES, total: 1 }));\r\n renderPicker({ searchOnOpen: true, search });\r\n\r\n await ouvrir();\r\n\r\n await waitFor(() => expect(search).toHaveBeenCalledTimes(1));\r\n /* À vide : c'est tout l'objet de la prop — la liste, pas un formulaire. */\r\n expect(search).toHaveBeenCalledWith(\r\n expect.objectContaining({ criteria: { code: \"\" }, page: 1 })\r\n );\r\n });\r\n\r\n test(\"ne cherche pas à l'ouverture quand la prop est absente\", async () => {\r\n const search = jest.fn(() => ({ items: LIGNES, total: 1 }));\r\n renderPicker({ search });\r\n\r\n await ouvrir();\r\n\r\n /* L'état « Aucune recherche » reste le comportement par défaut : la prop\r\n * est un opt-in, pas un changement de contrat. */\r\n expect(search).not.toHaveBeenCalled();\r\n });\r\n\r\n test(\"UNE SEULE recherche par ouverture, même en saisissant un critère\", async () => {\r\n const search = jest.fn(() => ({ items: LIGNES, total: 1 }));\r\n renderPicker({ searchOnOpen: true, search });\r\n\r\n await ouvrir();\r\n await waitFor(() => expect(search).toHaveBeenCalledTimes(1));\r\n\r\n /* LE test de ce fichier. `runSearch` dépend de `draft` : sans la garde par\r\n * `ref`, l'effet d'ouverture repartirait à chaque frappe et le sélecteur\r\n * émettrait une requête par caractère. */\r\n await userEvent.type(screen.getByLabelText(/Code/), \"710\");\r\n\r\n expect(search).toHaveBeenCalledTimes(1);\r\n });\r\n});\r\n"],"mappings":"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","ignoreList":[]}