@cnamts/synapse 1.0.25 → 1.0.27

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 (393) hide show
  1. package/dist/{AutocompleteFilter-D7qBuCAP.js → AutocompleteFilter-C9eLKyW8.js} +3 -3
  2. package/dist/{DateFilter-BitMWrMU.js → DateFilter-y-GLkAkn.js} +9 -9
  3. package/dist/{NumberFilter-BTLUxw0a.js → NumberFilter-DN6hIBS7.js} +1 -1
  4. package/dist/{PeriodFilter-B5rUIPAC.js → PeriodFilter-MoUUp9qS.js} +1 -1
  5. package/dist/{SelectFilter-l4QnRcuk.js → SelectFilter-bCbrdLmu.js} +1 -1
  6. package/dist/{TextFilter-C9hj6Qrp.js → TextFilter-CvjgEaoM.js} +4 -4
  7. package/dist/apLightTheme2026-ug4Y23ns.js +611 -0
  8. package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +2369 -351
  9. package/dist/components/Customs/Selects/SyAutocomplete/composables/useSyAutocompleteValidation.d.ts +18 -0
  10. package/dist/components/Customs/Selects/SyAutocomplete/utils/ariaManager.d.ts +1 -1
  11. package/dist/components/Customs/Selects/SyAutocomplete/utils/useKeyboardHandler.d.ts +3 -1
  12. package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +58 -288
  13. package/dist/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.d.ts +1 -0
  14. package/dist/components/Customs/Selects/SySelect/composables/useSySelectValidation.d.ts +15 -0
  15. package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +4 -3
  16. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +4 -3
  17. package/dist/components/Customs/SyIconButton/SyIconButton.d.ts +18 -0
  18. package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +20 -37
  19. package/dist/components/Customs/SyRadioGroup/composables/useSyRadioGroupValidation.d.ts +50 -0
  20. package/dist/components/Customs/SyTextField/SyTextField.d.ts +8 -10
  21. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +197 -185
  22. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +91 -82
  23. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +35 -32
  24. package/dist/components/DatePicker/composables/index.d.ts +1 -0
  25. package/dist/components/DatePicker/composables/useDatePickerState.d.ts +3 -3
  26. package/dist/components/DatePicker/composables/useDatePickerValidationBridge.d.ts +51 -0
  27. package/dist/components/DatePicker/composables/useDateTextField.d.ts +2 -2
  28. package/dist/components/DatePicker/composables/useInputBlurHandler.d.ts +2 -2
  29. package/dist/components/DatePicker/types.d.ts +1 -2
  30. package/dist/components/LunarCalendar/useLunarCalendarValidation.d.ts +1 -0
  31. package/dist/components/MonthPicker/MonthPicker.d.ts +24 -24
  32. package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +24 -24
  33. package/dist/components/NirField/NirField.d.ts +64 -60
  34. package/dist/components/NirField/useNirValidation.d.ts +6 -2
  35. package/dist/components/PasswordField/PasswordField.d.ts +3 -3
  36. package/dist/components/PeriodField/PeriodField.d.ts +338 -314
  37. package/dist/components/PhoneField/PhoneField.d.ts +34 -24
  38. package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +0 -3
  39. package/dist/components/RatingPicker/EmotionPicker/EmotionPicker.d.ts +3 -1
  40. package/dist/components/RatingPicker/NumberPicker/NumberPicker.d.ts +4 -3
  41. package/dist/components/RatingPicker/RatingPicker.d.ts +18 -5
  42. package/dist/components/RatingPicker/StarsPicker/StarsPicker.d.ts +3 -1
  43. package/dist/components/RatingPicker/useRatingFocus.d.ts +18 -0
  44. package/dist/components/SyTextArea/SyTextArea.d.ts +25 -15
  45. package/dist/components/SyTextArea/composables/useSyTextAreaValidation.d.ts +20 -0
  46. package/dist/components/SyTextArea/locales.d.ts +1 -0
  47. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +5 -4
  48. package/dist/components/Tables/SyTable/SyTable.d.ts +5 -4
  49. package/dist/components/Tables/common/SyTablePagination.d.ts +152 -364
  50. package/dist/components/Tables/common/TableHeader.d.ts +1 -1
  51. package/dist/components/Tables/common/filters/DateFilter.d.ts +4 -4
  52. package/dist/components/Tables/common/types.d.ts +2 -0
  53. package/dist/components/index.d.ts +1 -0
  54. package/dist/composables/date/useDateInitializationDayjs.d.ts +3 -1
  55. package/dist/composables/unifyValidation/documentationValidationProps.d.ts +160 -160
  56. package/dist/composables/unifyValidation/useCustomValidation.d.ts +3 -1
  57. package/dist/composables/unifyValidation/useValidation.d.ts +27 -19
  58. package/dist/composables/unifyValidation/useVuetifyValidation.d.ts +1 -1
  59. package/dist/composables/validation/useValidation.d.ts +1 -0
  60. package/dist/design-system-v3.js +81 -80
  61. package/dist/designTokens/tokens/amelipro/apContextual.d.ts +6 -6
  62. package/dist/designTokens/tokens/amelipro/apDarkTheme.d.ts +3 -1
  63. package/dist/designTokens/tokens/amelipro/apLightTheme.d.ts +53 -98
  64. package/dist/designTokens/tokens/baseContextualTokens.d.ts +0 -6
  65. package/dist/designTokens/tokens/baseTokens.d.ts +232 -0
  66. package/dist/designTokens/tokens/cnam/cnamContextual.d.ts +6 -6
  67. package/dist/designTokens/tokens/cnam/cnamDarkTheme.d.ts +1 -1
  68. package/dist/designTokens/tokens/cnam/cnamLightTheme.d.ts +57 -99
  69. package/dist/designTokens/tokens/pa/paContextual.d.ts +0 -6
  70. package/dist/designTokens/tokens/pa/paDarkTheme.d.ts +1 -1
  71. package/dist/designTokens/tokens/pa/paLightTheme.d.ts +53 -97
  72. package/dist/designTokens/tokens/pa/paSemantic.d.ts +1 -0
  73. package/dist/designTokens/tokens/semanticTokens.d.ts +112 -0
  74. package/dist/{main-Cpx8Co6H.js → main-CI6Q9nmO.js} +13843 -13478
  75. package/dist/synapse.css +1 -1
  76. package/dist/vuetifyConfig.js +208 -72
  77. package/package.json +10 -7
  78. package/src/assets/overrides/_icons.scss +5 -17
  79. package/src/assets/overrides/_otp.scss +4 -5
  80. package/src/assets/overrides/_typography.scss +2 -1
  81. package/src/assets/overrides/_utilities.scss +1 -42
  82. package/src/components/Accordion/Accordion.vue +2 -0
  83. package/src/components/ChipList/ChipList.vue +30 -18
  84. package/src/components/ChipList/tests/chipList.spec.ts +4 -4
  85. package/src/components/CookiesSelection/CookiesInformation/CookiesInformation.vue +2 -1
  86. package/src/components/CookiesSelection/CookiesSelection.vue +2 -1
  87. package/src/components/CopyBtn/CopyBtn.vue +9 -0
  88. package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.stories.ts +4 -0
  89. package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.vue +7 -6
  90. package/src/components/Customs/Selects/SelectBtnField/tests/SelectBtnField.spec.ts +223 -0
  91. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +283 -351
  92. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +183 -219
  93. package/src/components/Customs/Selects/SyAutocomplete/composables/useSyAutocompleteValidation.ts +101 -0
  94. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +761 -1
  95. package/src/components/Customs/Selects/SyAutocomplete/utils/ariaManager.ts +3 -1
  96. package/src/components/Customs/Selects/SyAutocomplete/utils/useKeyboardHandler.ts +79 -5
  97. package/src/components/Customs/Selects/SyAutocomplete/validation/Validation.stories.ts +1029 -0
  98. package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +52 -217
  99. package/src/components/Customs/Selects/SySelect/SySelect.vue +248 -236
  100. package/src/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.ts +3 -0
  101. package/src/components/Customs/Selects/SySelect/composables/useSySelectValidation.ts +64 -0
  102. package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +440 -5
  103. package/src/components/Customs/Selects/SySelect/validation/Validation.stories.ts +1026 -0
  104. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.stories.ts +18 -7
  105. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +5 -5
  106. package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +8 -8
  107. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +27 -6
  108. package/src/components/Customs/SyCheckbox/tests/SyCheckbox.spec.ts +1 -1
  109. package/src/components/Customs/SyIcon/accessibilite/Accessibility.mdx +0 -6
  110. package/src/components/Customs/SyIcon/utils/tests/iconUtils.spec.ts +107 -0
  111. package/src/components/Customs/SyRadioGroup/SyRadioGroup.mdx +2 -2
  112. package/src/components/Customs/SyRadioGroup/SyRadioGroup.stories.ts +395 -200
  113. package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +100 -127
  114. package/src/components/Customs/SyRadioGroup/composables/useSyRadioGroupValidation.ts +127 -0
  115. package/src/components/Customs/SyRadioGroup/tests/SyRadioGroup.a11y.spec.ts +93 -1
  116. package/src/components/Customs/SyRadioGroup/tests/SyRadioGroup.spec.ts +146 -9
  117. package/src/components/Customs/SyRadioGroup/tests/SyRadioGroup.visual.cy.ts +165 -0
  118. package/src/components/Customs/SyRadioGroup/validation/Validation.stories.ts +773 -0
  119. package/src/components/Customs/SyTabs/SyTabs.stories.ts +5 -5
  120. package/src/components/Customs/SyTabs/config.ts +3 -3
  121. package/src/components/Customs/SyTabs/tests/SyTabs.spec.ts +265 -0
  122. package/src/components/Customs/SyTabs/tests/useTabTransition.spec.ts +188 -0
  123. package/src/components/Customs/SyTextField/SyTextField.stories.ts +10 -29
  124. package/src/components/Customs/SyTextField/SyTextField.vue +52 -17
  125. package/src/components/DataList/DataList.stories.ts +1 -1
  126. package/src/components/DataListItem/tests/DataListItem.spec.ts +3 -1
  127. package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +1 -1
  128. package/src/components/DatePicker/CalendarMode/DatePicker.vue +52 -154
  129. package/src/components/DatePicker/CalendarMode/tests/DatePicker.coverage.spec.ts +156 -0
  130. package/src/components/DatePicker/CalendarMode/tests/DatePicker.spec.ts +495 -4
  131. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +1 -1
  132. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +55 -73
  133. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +207 -1
  134. package/src/components/DatePicker/ComplexDatePicker/tests/bridge-integration.regression.spec.ts +210 -0
  135. package/src/components/DatePicker/ComplexDatePicker/tests/calendar-navigation.regression.spec.ts +214 -0
  136. package/src/components/DatePicker/ComplexDatePicker/tests/validation-cross.regression.spec.ts +194 -0
  137. package/src/components/DatePicker/ComplexDatePicker/tests/validation-success-messages.regression.spec.ts +83 -0
  138. package/src/components/DatePicker/DatePickerValidationExample/DatePickerValidation.stories.ts +1 -1
  139. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +169 -60
  140. package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +1 -1
  141. package/src/components/DatePicker/DateTextInput/tests/DateTextInput.spec.ts +320 -0
  142. package/src/components/DatePicker/composables/index.ts +1 -0
  143. package/src/components/DatePicker/composables/tests/useCalendarKeyboardNavigation.spec.ts +360 -0
  144. package/src/components/DatePicker/composables/tests/useDatePickerValidationBridge.spec.ts +129 -0
  145. package/src/components/DatePicker/composables/useDatePickerState.ts +33 -14
  146. package/src/components/DatePicker/composables/useDatePickerValidationBridge.ts +205 -0
  147. package/src/components/DatePicker/composables/useDateRangeInput.ts +2 -1
  148. package/src/components/DatePicker/composables/useDateSelection.ts +2 -1
  149. package/src/components/DatePicker/composables/useDateTextField.ts +2 -2
  150. package/src/components/DatePicker/composables/useInputBlurHandler.ts +2 -2
  151. package/src/components/DatePicker/docExamples/BidirectionalComplexValidation.vue +1 -1
  152. package/src/components/DatePicker/docExamples/DatePickerBidirectionalValidation.vue +1 -1
  153. package/src/components/DatePicker/tests/exposed-methods.coverage.spec.ts +75 -0
  154. package/src/components/DatePicker/types.ts +1 -2
  155. package/src/components/DialogBox/DialogBox.stories.ts +8 -8
  156. package/src/components/DialogBox/DialogBox.vue +1 -1
  157. package/src/components/DialogBox/accessibilite/Accessibility.mdx +86 -22
  158. package/src/components/FileList/UploadItem/UploadItem.vue +4 -4
  159. package/src/components/FileUpload/FileUpload.vue +2 -2
  160. package/src/components/FileUpload/FileUploadContent.vue +1 -1
  161. package/src/components/FilterInline/FilterInline.mdx +2 -2
  162. package/src/components/FilterSideBar/FilterSideBar.stories.ts +1 -1
  163. package/src/components/FilterSideBar/FilterSideBar.vue +4 -3
  164. package/src/components/FooterBar/FooterBar.vue +7 -7
  165. package/src/components/FranceConnectBtn/FranceConnectBtn.vue +1 -1
  166. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.vue +2 -2
  167. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.vue +7 -7
  168. package/src/components/HeaderBar/HeaderMenuBtn/HeaderMenuBtn.vue +2 -2
  169. package/src/components/HeaderLoading/tests/HeaderLoading.spec.ts +87 -8
  170. package/src/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.vue +3 -3
  171. package/src/components/HeaderNavigationBar/HorizontalNavbar/tests/HorizontalNavbar.spec.ts +589 -0
  172. package/src/components/HeaderToolbar/tests/HeaderToolBar.spec.ts +153 -1
  173. package/src/components/HeaderToolbar/tests/useMobileRightMenu.spec.ts +258 -0
  174. package/src/components/LangBtn/LangBtn.vue +2 -1
  175. package/src/components/LogoBrandSection/tests/LogoBrandSection.spec.ts +2 -2
  176. package/src/components/LogoBrandSection/tests/__snapshots__/LogoBrandSection.spec.ts.snap +1 -1
  177. package/src/components/LunarCalendar/tests/useLunarCalendarRules.spec.ts +184 -0
  178. package/src/components/MonthPicker/MonthPickerVisual/MonthSelector.vue +3 -3
  179. package/src/components/MonthPicker/MonthPickerVisual/VisualPickerFooter.vue +1 -1
  180. package/src/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.vue +2 -2
  181. package/src/components/MonthPicker/MonthPickerVisual/YearSelector.vue +1 -1
  182. package/src/components/NirField/NirField.vue +3 -3
  183. package/src/components/NotificationBar/Notification/Notification.vue +12 -12
  184. package/src/components/NotificationBar/NotificationBar.stories.ts +8 -8
  185. package/src/components/PaginatedTable/PaginatedTable.vue +1 -1
  186. package/src/components/PaginatedTable/Pagination.vue +3 -3
  187. package/src/components/PasswordField/PasswordField.vue +15 -11
  188. package/src/components/PasswordField/tests/PasswordField.spec.ts +3 -3
  189. package/src/components/PhoneField/PhoneField.vue +4 -2
  190. package/src/components/RangeField/RangeSlider/RangeSlider.vue +11 -18
  191. package/src/components/RangeField/RangeSlider/Tooltip/Tooltip.vue +1 -1
  192. package/src/components/RatingPicker/EmotionPicker/EmotionPicker.vue +32 -48
  193. package/src/components/RatingPicker/EmotionPicker/tests/__snapshots__/EmotionPicker.spec.ts.snap +5 -0
  194. package/src/components/RatingPicker/NumberPicker/NumberPicker.vue +48 -53
  195. package/src/components/RatingPicker/NumberPicker/tests/NumberPicker.spec.ts +2 -1
  196. package/src/components/RatingPicker/NumberPicker/tests/__snapshots__/NumberPicker.spec.ts.snap +40 -13
  197. package/src/components/RatingPicker/RatingPicker.stories.ts +65 -88
  198. package/src/components/RatingPicker/RatingPicker.vue +71 -15
  199. package/src/components/RatingPicker/StarsPicker/StarsPicker.vue +28 -37
  200. package/src/components/RatingPicker/StarsPicker/tests/StarsPicker.spec.ts +1 -1
  201. package/src/components/RatingPicker/StarsPicker/tests/__snapshots__/StarsPicker.spec.ts.snap +5 -0
  202. package/src/components/RatingPicker/accessibilite/Accessibility.mdx +137 -9
  203. package/src/components/RatingPicker/tests/RatingPicker.a11y.spec.ts +123 -0
  204. package/src/components/RatingPicker/tests/RatingPicker.spec.ts +3 -2
  205. package/src/components/RatingPicker/tests/__snapshots__/RatingPicker.spec.ts.snap +40 -11
  206. package/src/components/RatingPicker/useRatingFocus.ts +97 -0
  207. package/src/components/StatusPage/tests/StatusPage.spec.ts +149 -0
  208. package/src/components/SubHeader/SubHeader.vue +1 -1
  209. package/src/components/SyAlert/SyAlert.vue +23 -23
  210. package/src/components/SyTextArea/SyTextArea.stories.ts +177 -131
  211. package/src/components/SyTextArea/SyTextArea.vue +257 -74
  212. package/src/components/SyTextArea/composables/useSyTextAreaValidation.ts +81 -0
  213. package/src/components/SyTextArea/locales.ts +1 -0
  214. package/src/components/SyTextArea/tests/SyTextArea.spec.ts +449 -1
  215. package/src/components/SyTextArea/useDefaultValidationRules.ts +2 -7
  216. package/src/components/SyTextArea/validation/Validation.stories.ts +856 -0
  217. package/src/components/TableToolbar/TableToolbar.vue +6 -6
  218. package/src/components/TableToolbar/accessibilite/Accessibility.mdx +81 -7
  219. package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +163 -0
  220. package/src/components/Tables/SyServerTable/SyServerTable.vue +3 -2
  221. package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +67 -0
  222. package/src/components/Tables/SyTable/SyTable.stories.ts +94 -0
  223. package/src/components/Tables/SyTable/SyTable.vue +3 -2
  224. package/src/components/Tables/SyTable/tests/SyTable.spec.ts +64 -0
  225. package/src/components/Tables/common/SyTableFilter.vue +4 -4
  226. package/src/components/Tables/common/SyTablePagination.vue +1 -0
  227. package/src/components/Tables/common/TableHeader.vue +3 -3
  228. package/src/components/Tables/common/filters/DateFilter.vue +2 -2
  229. package/src/components/Tables/common/filters/logics/tests/NumberFilterLogic.spec.ts +176 -0
  230. package/src/components/Tables/common/filters/logics/tests/SelectFilterLogic.spec.ts +111 -0
  231. package/src/components/Tables/common/tableStyles.scss +6 -6
  232. package/src/components/Tables/common/types.ts +2 -0
  233. package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +2 -0
  234. package/src/components/index.ts +1 -0
  235. package/src/composables/date/tests/useDateFormatDayjs.spec.ts +112 -0
  236. package/src/composables/date/tests/{useDateInitialization.spec.ts → useDateInitializationDayjs.spec.ts} +39 -3
  237. package/src/composables/date/tests/useHolidayDay.spec.ts +109 -0
  238. package/src/composables/date/useDateInitializationDayjs.ts +4 -1
  239. package/src/composables/rules/tests/useFieldValidation.spec.ts +374 -0
  240. package/src/composables/tests/useError.spec.ts +30 -0
  241. package/src/composables/tests/useFormFieldErrorHandling.spec.ts +234 -0
  242. package/src/composables/unifyValidation/documentationValidationProps.ts +12 -12
  243. package/src/composables/unifyValidation/tests/documentationValidationProps.spec.ts +177 -0
  244. package/src/composables/unifyValidation/tests/useCustomValidation.spec.ts +32 -1
  245. package/src/composables/unifyValidation/tests/useValidation.spec.ts +28 -2
  246. package/src/composables/unifyValidation/useCustomValidation.ts +34 -12
  247. package/src/composables/unifyValidation/useValidation.ts +55 -27
  248. package/src/composables/unifyValidation/useVuetifyValidation.ts +2 -2
  249. package/src/composables/useFilterable/useFilterable.spec.ts +42 -0
  250. package/src/composables/useFilterable/useFilterable.ts +11 -7
  251. package/src/composables/useFormFieldErrorHandling.ts +6 -3
  252. package/src/composables/validation/tests/useValidation.spec.ts +2 -2
  253. package/src/composables/validation/useValidation.ts +15 -3
  254. package/src/composantsVuetify/VBtn/VBtn.mdx +9 -39
  255. package/src/composantsVuetify/VBtn/v-btn.stories.ts +26 -86
  256. package/src/composantsVuetify/VCard/VCard.mdx +59 -0
  257. package/src/composantsVuetify/VCard/v-card.stories.ts +279 -0
  258. package/src/designTokens/tokens/amelipro/apColors2026.ts +1 -1
  259. package/src/designTokens/tokens/amelipro/apContextual.ts +6 -0
  260. package/src/designTokens/tokens/amelipro/apDarkTheme.ts +2 -2
  261. package/src/designTokens/tokens/amelipro/apLightTheme.ts +72 -100
  262. package/src/designTokens/tokens/amelipro/apSemantic.ts +1 -1
  263. package/src/designTokens/tokens/baseContextualTokens.ts +1 -6
  264. package/src/designTokens/tokens/baseTokens.ts +232 -0
  265. package/src/designTokens/tokens/cnam/cnamContextual.ts +6 -0
  266. package/src/designTokens/tokens/cnam/cnamDarkTheme.ts +2 -2
  267. package/src/designTokens/tokens/cnam/cnamLightTheme.ts +76 -101
  268. package/src/designTokens/tokens/pa/paDarkTheme.ts +2 -2
  269. package/src/designTokens/tokens/pa/paLightTheme.ts +73 -99
  270. package/src/designTokens/tokens/pa/paSemantic.ts +2 -0
  271. package/src/designTokens/tokens/semanticTokens.ts +114 -0
  272. package/src/stories/Accessibilite/Aculturation/SensibilisationAccessibilite.mdx +61 -91
  273. package/src/stories/Accessibilite/AuditDesignSystem.mdx +5 -8
  274. package/src/stories/Accessibilite/AuditEtContreAudit/Exemptions-derogations.mdx +1 -1
  275. package/src/stories/Accessibilite/AuditEtContreAudit/Introduction.mdx +11 -8
  276. package/src/stories/Accessibilite/AuditEtContreAudit/RGAA.mdx +6 -7
  277. package/src/stories/Accessibilite/Introduction.mdx +30 -30
  278. package/src/stories/Accessibilite/KitDePreAudit/Echantillonnage.mdx +168 -78
  279. package/src/stories/Accessibilite/KitDePreAudit/Introduction.mdx +13 -6
  280. package/src/stories/Accessibilite/KitDePreAudit/Outils/Introduction.mdx +66 -45
  281. package/src/stories/Accessibilite/KitDePreAudit/Outils/LecteursDEcran.mdx +23 -49
  282. package/src/stories/Accessibilite/KitDePreAudit/Outils/Tanaguru/FauxPositifs.stories.ts +6 -0
  283. package/src/stories/Accessibilite/KitDePreAudit/Outils/Tanaguru/Utilisation.mdx +7 -19
  284. package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +18 -20
  285. package/src/stories/Components/Components.stories.ts +59 -6
  286. package/src/stories/DesignTokens/ColorIntegrationExample.vue +2 -3
  287. package/src/stories/DesignTokens/Colors.mdx +6 -8
  288. package/src/stories/DesignTokens/colors.stories.ts +244 -1081
  289. package/src/utils/amelipro/toKebabCase/tests/toKebabCase.spec.ts +52 -0
  290. package/src/utils/formatNir/tests/formatNir.spec.ts +34 -0
  291. package/src/utils/tests/insertAt.spec.ts +44 -0
  292. package/dist/AutocompleteFilter-Df9i5mAl.cjs +0 -1
  293. package/dist/DateFilter-BJD6FMev.cjs +0 -1
  294. package/dist/NumberFilter-DGCzCXzI.cjs +0 -1
  295. package/dist/PeriodFilter-DO_ecTZW.cjs +0 -1
  296. package/dist/SelectFilter-CGwcKWLm.cjs +0 -1
  297. package/dist/TextFilter-B8nf7xoK.cjs +0 -1
  298. package/dist/apLightTheme-CEK4iY3f.cjs +0 -1
  299. package/dist/apLightTheme-DnIM24Lv.js +0 -950
  300. package/dist/composables/date/useDateFormat.d.ts +0 -26
  301. package/dist/composables/date/useDateInitialization.d.ts +0 -18
  302. package/dist/design-system-v3.umd.cjs +0 -1
  303. package/dist/main-ByDPHpae.cjs +0 -1067
  304. package/dist/tooth-11-D3sLWv2n.cjs +0 -1
  305. package/dist/tooth-12-CXrLuH03.cjs +0 -1
  306. package/dist/tooth-13-BSfo5fpT.cjs +0 -1
  307. package/dist/tooth-14-DMzulx0h.cjs +0 -1
  308. package/dist/tooth-15-BKRFVi-9.cjs +0 -1
  309. package/dist/tooth-16-CpuxAbuM.cjs +0 -1
  310. package/dist/tooth-17-BPoahUdg.cjs +0 -1
  311. package/dist/tooth-18-DhHJz8sy.cjs +0 -1
  312. package/dist/tooth-21-Dgd5hn_X.cjs +0 -1
  313. package/dist/tooth-22-C2Tn19sB.cjs +0 -1
  314. package/dist/tooth-23-C9uaaSGb.cjs +0 -1
  315. package/dist/tooth-24-BrK9UGpf.cjs +0 -1
  316. package/dist/tooth-25-CE_EfGNp.cjs +0 -1
  317. package/dist/tooth-26-Ctv4i9Fy.cjs +0 -1
  318. package/dist/tooth-27-C5J7JkWM.cjs +0 -1
  319. package/dist/tooth-28-Z9oWqjo0.cjs +0 -1
  320. package/dist/tooth-31-BrYqmkTi.cjs +0 -1
  321. package/dist/tooth-32-BNNR0oCZ.cjs +0 -1
  322. package/dist/tooth-33-DuxvqO2J.cjs +0 -1
  323. package/dist/tooth-34-BCSCXMB6.cjs +0 -1
  324. package/dist/tooth-35-BLUXkX88.cjs +0 -1
  325. package/dist/tooth-36-IrKHYqlA.cjs +0 -1
  326. package/dist/tooth-37-BYqpdMwo.cjs +0 -1
  327. package/dist/tooth-38-B_eNXXdu.cjs +0 -1
  328. package/dist/tooth-41-Ddva4Ot8.cjs +0 -1
  329. package/dist/tooth-42-szcDqlM0.cjs +0 -1
  330. package/dist/tooth-43-B3ka6rQm.cjs +0 -1
  331. package/dist/tooth-44-CazyQucj.cjs +0 -1
  332. package/dist/tooth-45-B4HQtc8n.cjs +0 -1
  333. package/dist/tooth-46-BPM40gbG.cjs +0 -1
  334. package/dist/tooth-47-Dvr20dlh.cjs +0 -1
  335. package/dist/tooth-48-Bd8ljGsF.cjs +0 -1
  336. package/dist/tooth-51-OBpwCOF3.cjs +0 -1
  337. package/dist/tooth-52-aKxyHcmq.cjs +0 -1
  338. package/dist/tooth-53-vCwJjTOc.cjs +0 -1
  339. package/dist/tooth-54-DsWu2iFy.cjs +0 -1
  340. package/dist/tooth-55-BxC1X2Dn.cjs +0 -1
  341. package/dist/tooth-61-BbLvxMQi.cjs +0 -1
  342. package/dist/tooth-62-CmTkWczP.cjs +0 -1
  343. package/dist/tooth-63-DI7l_2qI.cjs +0 -1
  344. package/dist/tooth-64-B21sOsJh.cjs +0 -1
  345. package/dist/tooth-65-D2ZC2VEr.cjs +0 -1
  346. package/dist/tooth-71-D473PPO5.cjs +0 -1
  347. package/dist/tooth-72-Drh1wnNu.cjs +0 -1
  348. package/dist/tooth-73-DzlwYI23.cjs +0 -1
  349. package/dist/tooth-74-8aGvcZPg.cjs +0 -1
  350. package/dist/tooth-75-BFK7At_r.cjs +0 -1
  351. package/dist/tooth-81-BZmR-I0M.cjs +0 -1
  352. package/dist/tooth-82-euVfUUZV.cjs +0 -1
  353. package/dist/tooth-83-KV010j64.cjs +0 -1
  354. package/dist/tooth-84-BBg1RjhZ.cjs +0 -1
  355. package/dist/tooth-85-Cr-kc1wM.cjs +0 -1
  356. package/dist/vuetifyConfig.umd.cjs +0 -1
  357. package/src/components/BackBtn/tests/__snapshots__/back-btn-custom-bg.snap.png +0 -0
  358. package/src/components/BackBtn/tests/__snapshots__/back-btn-dark-mode.snap.png +0 -0
  359. package/src/components/BackBtn/tests/__snapshots__/back-btn-default.snap.png +0 -0
  360. package/src/components/BackBtn/tests/__snapshots__/back-btn-no-icon.snap.png +0 -0
  361. package/src/components/DatePicker/CalendarMode/tests/DatePicker.events.spec.ts +0 -178
  362. package/src/components/DialogBox/tests/__snapshots__/dialog-box-custom-texts.snap.png +0 -0
  363. package/src/components/DialogBox/tests/__snapshots__/dialog-box-default.snap.png +0 -0
  364. package/src/components/DialogBox/tests/__snapshots__/dialog-box-no-actions.snap.png +0 -0
  365. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated-submenu-open.snap.png +0 -0
  366. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated.snap.png +0 -0
  367. package/src/components/HeaderBar/tests/__snapshots__/header-bar-custom-width.snap.png +0 -0
  368. package/src/components/HeaderBar/tests/__snapshots__/header-bar-default.snap.png +0 -0
  369. package/src/components/HeaderBar/tests/__snapshots__/header-bar-no-sticky.snap.png +0 -0
  370. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-prepend.snap.png +0 -0
  371. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-side.snap.png +0 -0
  372. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-subtitle.snap.png +0 -0
  373. package/src/components/Logo/tests/__snapshots__/logo-avatar.snap.png +0 -0
  374. package/src/components/Logo/tests/__snapshots__/logo-dark.snap.png +0 -0
  375. package/src/components/Logo/tests/__snapshots__/logo-default.snap.png +0 -0
  376. package/src/components/Logo/tests/__snapshots__/logo-no-organism.snap.png +0 -0
  377. package/src/components/Logo/tests/__snapshots__/logo-no-signature.snap.png +0 -0
  378. package/src/components/Logo/tests/__snapshots__/logo-risque-pro.snap.png +0 -0
  379. package/src/components/RangeField/tests/__snapshots__/range-field-custom-bg.snap.png +0 -0
  380. package/src/components/RangeField/tests/__snapshots__/range-field-custom-range.snap.png +0 -0
  381. package/src/components/RangeField/tests/__snapshots__/range-field-default.snap.png +0 -0
  382. package/src/components/RangeField/tests/__snapshots__/range-field-step.snap.png +0 -0
  383. package/src/components/RangeField/tests/__snapshots__/range-field-with-label.snap.png +0 -0
  384. package/src/components/SyAlert/tests/__snapshots__/sy-alert-closable.snap.png +0 -0
  385. package/src/components/SyAlert/tests/__snapshots__/sy-alert-error.snap.png +0 -0
  386. package/src/components/SyAlert/tests/__snapshots__/sy-alert-info.snap.png +0 -0
  387. package/src/components/SyAlert/tests/__snapshots__/sy-alert-success.snap.png +0 -0
  388. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-outlined.snap.png +0 -0
  389. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-tonal.snap.png +0 -0
  390. package/src/components/SyAlert/tests/__snapshots__/sy-alert-warning.snap.png +0 -0
  391. package/src/composables/date/tests/useDateFormat.spec.ts +0 -67
  392. package/src/composables/date/useDateFormat.ts +0 -110
  393. package/src/composables/date/useDateInitialization.ts +0 -92
@@ -14,7 +14,10 @@ dayjs.extend(timezone)
14
14
  dayjs.locale('fr')
15
15
 
16
16
  // Types
17
- export type DateValue = string | [string, string] | null
17
+ export type DateModelValue = string | [string, string] | null
18
+
19
+ /** @deprecated Utilisez DateModelValue à la place */
20
+ export type DateValue = DateModelValue
18
21
  export type DateInput = string | string[] | null | object
19
22
 
20
23
  /**
@@ -44,6 +44,38 @@ describe('useFieldValidation', () => {
44
44
  expect(await rule(null)).toEqual({ error: 'This field is required.' })
45
45
  })
46
46
 
47
+ it('should validate required rule with warning mode', async () => {
48
+ const rules = generateRules([{ type: 'required', options: { isWarning: true, warningMessage: 'Warning: field required.' } }])
49
+ const rule = rules[0]!
50
+
51
+ expect(await rule('')).toEqual({ warning: 'Warning: field required.' })
52
+ expect(await rule('value')).toEqual({ success: 'Le champ est valide.' })
53
+ })
54
+
55
+ it('should use fieldIdentifier in error messages', async () => {
56
+ const rules = generateRules([{
57
+ type: 'required',
58
+ options: { fieldIdentifier: 'l\'email du destinataire' },
59
+ }])
60
+ const rule = rules[0]!
61
+
62
+ expect(await rule('')).toEqual({ error: 'Vous devez renseigner l\'email du destinataire.' })
63
+ })
64
+
65
+ it('should use default error message when no message provided', async () => {
66
+ const rules = generateRules([{ type: 'required', options: { fieldName: 'Nom' } }])
67
+ const rule = rules[0]!
68
+
69
+ expect(await rule('')).toEqual({ error: 'Vous devez renseigner Nom.' })
70
+ })
71
+
72
+ it('should use default warning message when no warningMessage provided', async () => {
73
+ const rules = generateRules([{ type: 'min', options: { value: 5, isWarning: true } }])
74
+ const rule = rules[0]!
75
+
76
+ expect(await rule(3)).toHaveProperty('warning')
77
+ })
78
+
47
79
  it('should validate min rule', async () => {
48
80
  const rules = generateRules([{ type: 'min', options: { value: 5, message: 'Value must be at least 5.' } }])
49
81
  const rule = rules[0]!
@@ -64,6 +96,26 @@ describe('useFieldValidation', () => {
64
96
  expect(await rule('')).toEqual({}) // Empty string should be ignored
65
97
  })
66
98
 
99
+ it('should validate min and max rules with warning mode', async () => {
100
+ const minRule = generateRules([{ type: 'min', options: { value: 5, isWarning: true } }])[0]!
101
+ const maxRule = generateRules([{ type: 'max', options: { value: 10, isWarning: true } }])[0]!
102
+
103
+ expect(await minRule(3)).toHaveProperty('warning')
104
+ expect(await maxRule(15)).toHaveProperty('warning')
105
+ })
106
+
107
+ it('should handle non-number values for min and max rules', async () => {
108
+ const minRule = generateRules([{ type: 'min', options: { value: 5, message: 'Min error.' } }])[0]!
109
+ const maxRule = generateRules([{ type: 'max', options: { value: 10, message: 'Max error.' } }])[0]!
110
+
111
+ // Test avec des strings (typeof value !== 'number' est true, donc la condition échoue)
112
+ expect(await minRule('not-a-number')).toEqual({ error: 'Min error.' })
113
+ expect(await maxRule('not-a-number')).toEqual({ error: 'Max error.' })
114
+ // Test avec des objets
115
+ expect(await minRule({})).toEqual({ error: 'Min error.' })
116
+ expect(await maxRule({})).toEqual({ error: 'Max error.' })
117
+ })
118
+
67
119
  it('should validate minLength rule', async () => {
68
120
  const rules = generateRules([{ type: 'minLength', options: { length: 5, message: 'Minimum length is 5.' } }])
69
121
  const rule = rules[0]!
@@ -74,6 +126,32 @@ describe('useFieldValidation', () => {
74
126
  expect(await rule('')).toEqual({}) // Empty string should be ignored
75
127
  })
76
128
 
129
+ it('should validate minLength and maxLength with warning mode', async () => {
130
+ const minLenRule = generateRules([{ type: 'minLength', options: { length: 5, isWarning: true } }])[0]!
131
+ const maxLenRule = generateRules([{ type: 'maxLength', options: { length: 5, isWarning: true } }])[0]!
132
+
133
+ expect(await minLenRule('1234')).toHaveProperty('warning')
134
+ expect(await maxLenRule('123456')).toHaveProperty('warning')
135
+ })
136
+
137
+ it('should handle non-string values for string-based rules', async () => {
138
+ const minLenRule = generateRules([{ type: 'minLength', options: { length: 5, message: 'MinLength error.' } }])[0]!
139
+ const maxLenRule = generateRules([{ type: 'maxLength', options: { length: 5, message: 'MaxLength error.' } }])[0]!
140
+ const exactLenRule = generateRules([{ type: 'exactLength', options: { length: 5, message: 'ExactLength error.' } }])[0]!
141
+ const emailRule = generateRules([{ type: 'email', options: { message: 'Email error.' } }])[0]!
142
+ const patternRule = generateRules([{ type: 'matchPattern', options: { pattern: /^[a-z]+$/, message: 'Pattern error.' } }])[0]!
143
+
144
+ // Test avec des nombres (typeof value !== 'string' est true)
145
+ expect(await minLenRule(12345)).toEqual({ error: 'MinLength error.' })
146
+ expect(await maxLenRule(12345)).toEqual({ error: 'MaxLength error.' })
147
+ expect(await exactLenRule(12345)).toEqual({ error: 'ExactLength error.' })
148
+ expect(await emailRule(12345)).toEqual({ error: 'Email error.' })
149
+ expect(await patternRule(12345)).toEqual({ error: 'Pattern error.' })
150
+ // Test avec des objets
151
+ expect(await minLenRule({})).toEqual({ error: 'MinLength error.' })
152
+ expect(await emailRule({})).toEqual({ error: 'Email error.' })
153
+ })
154
+
77
155
  it('should validate minLength rule with ignoreSpace option', async () => {
78
156
  const rules = generateRules([{
79
157
  type: 'minLength',
@@ -140,6 +218,14 @@ describe('useFieldValidation', () => {
140
218
  expect(await rule('1 2 3 4 5')).toEqual({ success: 'Le champ est valide.' }) // Length without spaces is 5
141
219
  })
142
220
 
221
+ it('should validate exactLength and matchPattern with warning mode', async () => {
222
+ const exactLenRule = generateRules([{ type: 'exactLength', options: { length: 5, isWarning: true } }])[0]!
223
+ const patternRule = generateRules([{ type: 'matchPattern', options: { pattern: /^[a-z]+$/, isWarning: true } }])[0]!
224
+
225
+ expect(await exactLenRule('1234')).toHaveProperty('warning')
226
+ expect(await patternRule('ABC')).toHaveProperty('warning')
227
+ })
228
+
143
229
  it('should validate email rule', async () => {
144
230
  // Vérifions d'abord que la regex EMAIL_REGEXP fonctionne comme prévu
145
231
  expect(EMAIL_REGEXP.test('invalid-email')).toBe(false)
@@ -156,6 +242,13 @@ describe('useFieldValidation', () => {
156
242
  expect(await rule('')).toEqual({}) // Empty string should be ignored
157
243
  })
158
244
 
245
+ it('should validate email rule with warning mode', async () => {
246
+ const emailRule = generateRules([{ type: 'email', options: { isWarning: true, warningMessage: 'Invalid email warning.' } }])[0]!
247
+
248
+ expect(await emailRule('invalid')).toEqual({ warning: 'Invalid email warning.' })
249
+ expect(await emailRule('test@example.com')).toEqual({ success: 'Le champ est valide.' })
250
+ })
251
+
159
252
  it('should validate matchPattern rule', async () => {
160
253
  const rules = generateRules([{
161
254
  type: 'matchPattern',
@@ -183,6 +276,10 @@ describe('useFieldValidation', () => {
183
276
  // 13 janvier 2023 est un vendredi (jour 5)
184
277
  expect(await rule(new Date(2023, 0, 13))).toEqual({ success: 'Le champ est valide.' })
185
278
  expect(await rule('')).toEqual({}) // Empty string should be ignored
279
+ expect(await rule(null)).toEqual({}) // Null should be ignored
280
+ expect(await rule(undefined)).toEqual({}) // Undefined should be ignored
281
+ // Test avec une date invalide (string qui ne parse pas)
282
+ expect(await rule('invalid-date-string')).toEqual({ error: 'Date invalide' })
186
283
  })
187
284
 
188
285
  it('should validate notBeforeToday rule', async () => {
@@ -199,6 +296,10 @@ describe('useFieldValidation', () => {
199
296
  // 16 janvier 2023 est après aujourd'hui
200
297
  expect(await rule(new Date(2023, 0, 16))).toEqual({ success: 'Le champ est valide.' })
201
298
  expect(await rule('')).toEqual({}) // Empty string should be ignored
299
+ expect(await rule(null)).toEqual({}) // Null should be ignored
300
+ expect(await rule(undefined)).toEqual({}) // Undefined should be ignored
301
+ // Test avec une date invalide (string qui ne parse pas)
302
+ expect(await rule('not-a-valid-date')).toEqual({ error: 'Date invalide' })
202
303
  })
203
304
 
204
305
  it('should validate notAfterToday rule', async () => {
@@ -215,6 +316,29 @@ describe('useFieldValidation', () => {
215
316
  // 14 janvier 2023 est avant aujourd'hui
216
317
  expect(await rule(new Date(2023, 0, 14))).toEqual({ success: 'Le champ est valide.' })
217
318
  expect(await rule('')).toEqual({}) // Empty string should be ignored
319
+ expect(await rule(null)).toEqual({}) // Null should be ignored
320
+ expect(await rule(undefined)).toEqual({}) // Undefined should be ignored
321
+ // Test avec une date invalide (string qui ne parse pas)
322
+ expect(await rule('bad-date-format')).toEqual({ error: 'Date invalide' })
323
+ })
324
+
325
+ it('should validate date rules with warning mode', async () => {
326
+ const notWeekendRule = generateRules([{
327
+ type: 'notWeekend',
328
+ options: { isWarning: true, warningMessage: 'Weekend warning.' },
329
+ }])[0]!
330
+ const notBeforeTodayRule = generateRules([{
331
+ type: 'notBeforeToday',
332
+ options: { isWarning: true, warningMessage: 'Before today warning.' },
333
+ }])[0]!
334
+ const notAfterTodayRule = generateRules([{
335
+ type: 'notAfterToday',
336
+ options: { isWarning: true, warningMessage: 'After today warning.' },
337
+ }])[0]!
338
+
339
+ expect(await notWeekendRule(new Date(2023, 0, 15))).toEqual({ warning: 'Weekend warning.' })
340
+ expect(await notBeforeTodayRule(new Date(2023, 0, 14))).toEqual({ warning: 'Before today warning.' })
341
+ expect(await notAfterTodayRule(new Date(2023, 0, 16))).toEqual({ warning: 'After today warning.' })
218
342
  })
219
343
 
220
344
  it('should test parseDate function directly', () => {
@@ -296,6 +420,37 @@ describe('useFieldValidation', () => {
296
420
  options: { date: undefined as unknown as string, message: 'Date cannot be before reference date.' },
297
421
  }])[0]!
298
422
  expect(await ruleWithUndefinedDate(new Date())).toEqual({})
423
+ // Test avec valeur null/undefined
424
+ expect(await rule(null)).toEqual({}) // Null should be ignored
425
+ expect(await rule(undefined)).toEqual({}) // Undefined should be ignored
426
+ // Test avec une date de référence invalide (string qui ne parse pas)
427
+ const ruleWithInvalidRefDate = generateRules([{
428
+ type: 'notBeforeDate',
429
+ options: { date: 'invalid-date', message: 'Date cannot be before reference date.' },
430
+ }])[0]!
431
+ expect(await ruleWithInvalidRefDate(new Date())).toEqual({ error: 'Date de référence invalide' })
432
+ })
433
+
434
+ it('should validate notBeforeDate and notAfterDate with warning mode', async () => {
435
+ const notBeforeDateRule = generateRules([{
436
+ type: 'notBeforeDate',
437
+ options: {
438
+ date: '10/01/2023',
439
+ isWarning: true,
440
+ warningMessage: 'Date before ref warning.',
441
+ },
442
+ }])[0]!
443
+ const notAfterDateRule = generateRules([{
444
+ type: 'notAfterDate',
445
+ options: {
446
+ date: '20/01/2023',
447
+ isWarning: true,
448
+ warningMessage: 'Date after ref warning.',
449
+ },
450
+ }])[0]!
451
+
452
+ expect(await notBeforeDateRule(new Date(2023, 0, 9))).toEqual({ warning: 'Date before ref warning.' })
453
+ expect(await notAfterDateRule(new Date(2023, 0, 21))).toEqual({ warning: 'Date after ref warning.' })
299
454
  })
300
455
 
301
456
  it('should throw when date reference is not a string in notBeforeDate rule', async () => {
@@ -348,6 +503,15 @@ describe('useFieldValidation', () => {
348
503
  options: { date: undefined as unknown as string, message: 'Date cannot be after reference date.' },
349
504
  }])[0]!
350
505
  expect(await ruleWithUndefinedDate(new Date())).toEqual({})
506
+ // Test avec valeur null/undefined
507
+ expect(await rule(null)).toEqual({}) // Null should be ignored
508
+ expect(await rule(undefined)).toEqual({}) // Undefined should be ignored
509
+ // Test avec une date de référence invalide (string qui ne parse pas)
510
+ const ruleWithInvalidRefDate = generateRules([{
511
+ type: 'notAfterDate',
512
+ options: { date: 'invalid-date', message: 'Date cannot be after reference date.' },
513
+ }])[0]!
514
+ expect(await ruleWithInvalidRefDate(new Date())).toEqual({ error: 'Date de référence invalide' })
351
515
  })
352
516
 
353
517
  it('should throw when date reference is not a string in notAfterDate rule', async () => {
@@ -400,6 +564,29 @@ describe('useFieldValidation', () => {
400
564
  options: { date: undefined as unknown as string, message: 'Date must be exactly the reference date.' },
401
565
  }])[0]!
402
566
  expect(await ruleWithUndefinedDate(new Date())).toEqual({})
567
+ // Test avec valeur null/undefined
568
+ expect(await rule(null)).toEqual({}) // Null should be ignored
569
+ expect(await rule(undefined)).toEqual({}) // Undefined should be ignored
570
+ // Test avec une date de référence invalide (string qui ne parse pas)
571
+ const ruleWithInvalidRefDate = generateRules([{
572
+ type: 'dateExact',
573
+ options: { date: 'invalid-date', message: 'Date must be exactly the reference date.' },
574
+ }])[0]!
575
+ expect(await ruleWithInvalidRefDate(new Date())).toEqual({ error: 'Date de référence invalide' })
576
+ })
577
+
578
+ it('should validate dateExact with warning mode', async () => {
579
+ const dateExactRule = generateRules([{
580
+ type: 'dateExact',
581
+ options: {
582
+ date: '15/01/2023',
583
+ isWarning: true,
584
+ warningMessage: 'Not exact date warning.',
585
+ },
586
+ }])[0]!
587
+
588
+ expect(await dateExactRule(new Date(2023, 0, 14))).toEqual({ warning: 'Not exact date warning.' })
589
+ expect(await dateExactRule(new Date(2023, 0, 15))).toEqual({ success: 'Le champ est valide.' })
403
590
  })
404
591
 
405
592
  it('should throw when date reference is not a string in dateExact rule', async () => {
@@ -434,6 +621,165 @@ describe('useFieldValidation', () => {
434
621
  expect(await customMessageRule('invalid')).toEqual({ error: 'Custom error message' })
435
622
  })
436
623
 
624
+ it('should validate custom rule with async function', async () => {
625
+ // Test avec une fonction async (Promise)
626
+ const asyncRule = generateRules([{
627
+ type: 'custom',
628
+ options: {
629
+ validate: async (value: unknown) => {
630
+ await new Promise(resolve => setTimeout(resolve, 10))
631
+ return value === 'async-valid'
632
+ },
633
+ message: 'Async validation failed.',
634
+ },
635
+ }])[0]!
636
+
637
+ expect(await asyncRule('invalid')).toEqual({ error: 'Async validation failed.' })
638
+ expect(await asyncRule('async-valid')).toEqual({ success: 'Le champ est valide.' })
639
+ })
640
+
641
+ it('should handle custom rule async function returning string message', async () => {
642
+ const asyncStringRule = generateRules([{
643
+ type: 'custom',
644
+ options: {
645
+ validate: async (value: unknown) => {
646
+ await new Promise(resolve => setTimeout(resolve, 10))
647
+ return value === 'valid' ? true : 'Custom async error'
648
+ },
649
+ },
650
+ }])[0]!
651
+
652
+ expect(await asyncStringRule('invalid')).toEqual({ error: 'Custom async error' })
653
+ expect(await asyncStringRule('valid')).toEqual({ success: 'Le champ est valide.' })
654
+ })
655
+
656
+ it('should handle custom rule async function throwing error', async () => {
657
+ const asyncErrorRule = generateRules([{
658
+ type: 'custom',
659
+ options: {
660
+ validate: async () => {
661
+ throw new Error('Async error message')
662
+ },
663
+ // Pas de message défini pour que l'erreur soit capturée
664
+ },
665
+ }])[0]!
666
+
667
+ expect(await asyncErrorRule('any')).toEqual({ error: 'Async error message' })
668
+ })
669
+
670
+ it('should handle custom rule with warning and async function', async () => {
671
+ const asyncWarningRule = generateRules([{
672
+ type: 'custom',
673
+ options: {
674
+ validate: async (value: unknown) => {
675
+ await new Promise(resolve => setTimeout(resolve, 10))
676
+ return value === 'warning' ? 'Warning message' : true
677
+ },
678
+ isWarning: true,
679
+ },
680
+ }])[0]!
681
+
682
+ expect(await asyncWarningRule('warning')).toEqual({ warning: 'Warning message' })
683
+ expect(await asyncWarningRule('valid')).toEqual({ success: 'Le champ est valide.' })
684
+ })
685
+
686
+ it('should handle custom rule without validate function in error mode', async () => {
687
+ // Test sans validate et isWarning=false (branche error par défaut)
688
+ const noValidateErrorRule = generateRules([{
689
+ type: 'custom',
690
+ options: { message: 'No validate function provided.' },
691
+ }])[0]!
692
+
693
+ expect(await noValidateErrorRule('any')).toEqual({ error: 'No validate function provided.' })
694
+ })
695
+
696
+ it('should handle custom rule without validate function with default error message', async () => {
697
+ // Test sans validate ni message (branche baseMessages.error)
698
+ const noValidateDefaultRule = generateRules([{
699
+ type: 'custom',
700
+ options: { fieldName: 'TestField' },
701
+ }])[0]!
702
+
703
+ expect(await noValidateDefaultRule('any')).toHaveProperty('error')
704
+ })
705
+
706
+ it('should handle custom rule without validate function in warning mode', async () => {
707
+ const noValidateWarningRule = generateRules([{
708
+ type: 'custom',
709
+ options: {
710
+ warningMessage: 'Warning: no validation.',
711
+ isWarning: true,
712
+ },
713
+ }])[0]!
714
+
715
+ expect(await noValidateWarningRule('any')).toEqual({ warning: 'Warning: no validation.' })
716
+ })
717
+
718
+ it('should handle custom rule returning false with warning', async () => {
719
+ const falseWarningRule = generateRules([{
720
+ type: 'custom',
721
+ options: {
722
+ validate: () => false,
723
+ isWarning: true,
724
+ warningMessage: 'Custom warning for false.',
725
+ },
726
+ }])[0]!
727
+
728
+ expect(await falseWarningRule('any')).toEqual({ warning: 'Custom warning for false.' })
729
+ })
730
+
731
+ it('should handle custom rule returning false with default warning', async () => {
732
+ // Test res === false avec isWarning=true mais sans warningMessage (branche baseMessages.warning)
733
+ const falseDefaultWarningRule = generateRules([{
734
+ type: 'custom',
735
+ options: {
736
+ validate: () => false,
737
+ isWarning: true,
738
+ fieldName: 'TestField',
739
+ },
740
+ }])[0]!
741
+
742
+ expect(await falseDefaultWarningRule('any')).toHaveProperty('warning')
743
+ })
744
+
745
+ it('should handle custom rule async error with warningMessage', async () => {
746
+ const asyncErrorWarningRule = generateRules([{
747
+ type: 'custom',
748
+ options: {
749
+ validate: async () => { throw new Error('Thrown error') },
750
+ isWarning: true,
751
+ warningMessage: 'Caught async warning.',
752
+ },
753
+ }])[0]!
754
+
755
+ expect(await asyncErrorWarningRule('any')).toEqual({ warning: 'Caught async warning.' })
756
+ })
757
+
758
+ it('should handle async error that is not an Error instance', async () => {
759
+ // Test où err n'est pas une instance de Error (branche String(err))
760
+ const asyncNonErrorRule = generateRules([{
761
+ type: 'custom',
762
+ options: {
763
+ validate: async () => { throw 'String error message' },
764
+ },
765
+ }])[0]!
766
+
767
+ expect(await asyncNonErrorRule('any')).toEqual({ error: 'String error message' })
768
+ })
769
+
770
+ it('should handle custom rule returning string with warning', async () => {
771
+ // Test typeof res === 'string' avec isWarning=true
772
+ const stringWarningRule = generateRules([{
773
+ type: 'custom',
774
+ options: {
775
+ validate: () => 'Custom warning string',
776
+ isWarning: true,
777
+ },
778
+ }])[0]!
779
+
780
+ expect(await stringWarningRule('any')).toEqual({ warning: 'Custom warning string' })
781
+ })
782
+
437
783
  it('should handle warning mode instead of error', async () => {
438
784
  const rules = generateRules([{
439
785
  type: 'required',
@@ -498,4 +844,32 @@ describe('useFieldValidation', () => {
498
844
 
499
845
  expect(await rule('any value')).toEqual({ error: 'La règle spécifiée pour ce champ n\'existe pas.' })
500
846
  })
847
+
848
+ it('should validate isHolidayDay rule', async () => {
849
+ const rules = generateRules([{
850
+ type: 'isHolidayDay',
851
+ options: { message: 'Date cannot be a holiday.' },
852
+ }])
853
+ const rule = rules[0]!
854
+
855
+ // Test avec une date valide (pas un jour férié)
856
+ expect(await rule(new Date(2023, 0, 13))).toEqual({ success: 'Le champ est valide.' })
857
+ // Test avec null/undefined/empty
858
+ expect(await rule(null)).toEqual({}) // Null should be ignored
859
+ expect(await rule(undefined)).toEqual({}) // Undefined should be ignored
860
+ expect(await rule('')).toEqual({}) // Empty string should be ignored
861
+ // Test avec une date invalide
862
+ expect(await rule('invalid-date')).toEqual({ error: 'Date invalide' })
863
+ })
864
+
865
+ it('should validate isHolidayDay with warning mode', async () => {
866
+ const holidayRule = generateRules([{
867
+ type: 'isHolidayDay',
868
+ options: { isWarning: true, warningMessage: 'Holiday warning.' },
869
+ }])[0]!
870
+
871
+ // Le 1er janvier 2023 est un jour férié
872
+ expect(await holidayRule(new Date(2023, 0, 1))).toEqual({ warning: 'Holiday warning.' })
873
+ expect(await holidayRule(new Date(2023, 0, 13))).toEqual({ success: 'Le champ est valide.' })
874
+ })
501
875
  })
@@ -0,0 +1,30 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { useError } from '../useError'
3
+
4
+ describe('useError', () => {
5
+ it('retourne un objet avec la méthode propError', () => {
6
+ const { propError } = useError()
7
+ expect(typeof propError).toBe('function')
8
+ })
9
+
10
+ it('propError lève une Error avec le message fourni', () => {
11
+ const { propError } = useError()
12
+ expect(() => propError('message d\'erreur')).toThrow('message d\'erreur')
13
+ })
14
+
15
+ it('propError lève une instance de Error', () => {
16
+ const { propError } = useError()
17
+ expect(() => propError('test')).toThrowError(Error)
18
+ })
19
+
20
+ it('propError lève une erreur avec un message vide si chaîne vide', () => {
21
+ const { propError } = useError()
22
+ expect(() => propError('')).toThrow('')
23
+ })
24
+
25
+ it('chaque appel à useError retourne une nouvelle instance indépendante', () => {
26
+ const a = useError()
27
+ const b = useError()
28
+ expect(a.propError).not.toBe(b.propError)
29
+ })
30
+ })