@cnamts/synapse 1.0.23 → 1.0.24

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 (292) hide show
  1. package/dist/AutocompleteFilter-BWLR3U7W.js +114 -0
  2. package/dist/AutocompleteFilter-D9jzRzAL.cjs +1 -0
  3. package/dist/{DateFilter-Dc-gSGwk.js → DateFilter-BpwFexzi.js} +1 -1
  4. package/dist/DateFilter-DTUl8hb1.cjs +1 -0
  5. package/dist/{NumberFilter-vP38Wp6j.js → NumberFilter-Bz_NTdX9.js} +3 -3
  6. package/dist/NumberFilter-MAEojdk0.cjs +1 -0
  7. package/dist/PeriodFilter-CC4WgIhl.cjs +1 -0
  8. package/dist/{PeriodFilter-Ba1uYUnT.js → PeriodFilter-DX_wy9g-.js} +1 -1
  9. package/dist/SelectFilter-BR3fvl-a.cjs +1 -0
  10. package/dist/SelectFilter-xqiPtPgX.js +135 -0
  11. package/dist/{TextFilter-B84dpnoq.js → TextFilter-BBl3JFqK.js} +7 -7
  12. package/dist/TextFilter-CCfYFl5F.cjs +1 -0
  13. package/dist/apLightTheme-CFSRrjv2.cjs +1 -0
  14. package/dist/apLightTheme-D1P4jcD0.js +1231 -0
  15. package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +7022 -9616
  16. package/dist/components/Amelipro/AmeliproCarousel/AmeliproCarousel.d.ts +2 -2
  17. package/dist/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.d.ts +2 -2
  18. package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.d.ts +40 -40
  19. package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.d.ts +60 -60
  20. package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +7168 -9762
  21. package/dist/components/Amelipro/AmeliproStepper/AmeliproStepper.d.ts +2 -2
  22. package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +7501 -10095
  23. package/dist/components/Amelipro/AmeliproTextArea/AmeliproTextArea.d.ts +21 -21
  24. package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +41 -41
  25. package/dist/components/Amelipro/StructureMenu/StructureTabs/StructureTabs.d.ts +2 -2
  26. package/dist/components/CookiesSelection/CookiesInformation/CookiesInformation.d.ts +20 -498
  27. package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +108 -146
  28. package/dist/components/Customs/Selects/SyInputSelect/SyInputSelect.d.ts +5 -5
  29. package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +12 -16
  30. package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +8 -8
  31. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +28 -506
  32. package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +28 -506
  33. package/dist/components/Customs/SyTextField/SyTextField.d.ts +65 -85
  34. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +627 -771
  35. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +315 -402
  36. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +112 -155
  37. package/dist/components/DatePicker/composables/index.d.ts +1 -0
  38. package/dist/components/DatePicker/composables/useDatePickerFocusTrap.d.ts +11 -0
  39. package/dist/components/DatePicker/composables/useDateTextField.d.ts +4 -4
  40. package/dist/components/DatePicker/composables/useDateValidation.d.ts +3 -3
  41. package/dist/components/DatePicker/composables/useInputBlurHandler.d.ts +2 -2
  42. package/dist/components/DatePicker/composables/useManualDateValidation.d.ts +2 -2
  43. package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +4 -4
  44. package/dist/components/HeaderToolbar/HeaderToolbar.d.ts +20 -28
  45. package/dist/components/LunarCalendar/useLunarCalendarValidation.d.ts +3 -3
  46. package/dist/components/MonthPicker/MonthPicker.d.ts +86 -122
  47. package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +85 -121
  48. package/dist/components/NirField/NirField.d.ts +206 -270
  49. package/dist/components/NirField/locales.d.ts +10 -10
  50. package/dist/components/NirField/useNirValidation.d.ts +64 -0
  51. package/dist/components/PasswordField/PasswordField.d.ts +8 -9
  52. package/dist/components/PeriodField/PeriodField.d.ts +1352 -1640
  53. package/dist/components/PhoneField/PhoneField.d.ts +88 -124
  54. package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +12 -12
  55. package/dist/components/SyTextArea/SyTextArea.d.ts +34 -14
  56. package/dist/components/SyTextArea/useDefaultValidationRules.d.ts +11 -0
  57. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +9 -6
  58. package/dist/components/Tables/SyTable/SyTable.d.ts +9 -6
  59. package/dist/components/Tables/common/SyTableFilter.d.ts +2 -3
  60. package/dist/components/Tables/common/SyTablePagination.d.ts +17 -19
  61. package/dist/components/Tables/common/filters/AutocompleteFilter.d.ts +120 -0
  62. package/dist/components/Tables/common/filters/locales.d.ts +0 -1
  63. package/dist/components/Tables/common/types.d.ts +19 -3
  64. package/dist/components/Tables/common/useClickableTableRow.d.ts +17 -0
  65. package/dist/components/Tables/common/usePagination.d.ts +3 -1
  66. package/dist/components/Tables/common/usePinnedColumns.d.ts +31 -0
  67. package/dist/components/Tables/common/useTableHeaders.d.ts +2 -0
  68. package/dist/components/Tables/common/useTableRowCheckboxAccessibility.d.ts +5 -0
  69. package/dist/components/UploadWorkflow/UploadWorkflow.d.ts +6 -6
  70. package/dist/composables/date/useDatePickerAccessibility.d.ts +1 -1
  71. package/dist/composables/rules/useFieldValidation.d.ts +4 -4
  72. package/dist/composables/unifyValidation/useCustomValidation.d.ts +8 -0
  73. package/dist/composables/unifyValidation/useValidation.d.ts +102 -0
  74. package/dist/composables/unifyValidation/useVuetifyValidation.d.ts +18 -0
  75. package/dist/composables/useFormFieldErrorHandling.d.ts +2 -2
  76. package/dist/composables/validation/useFormValidation.d.ts +11 -2
  77. package/dist/composables/validation/useValidation.d.ts +15 -9
  78. package/dist/design-system-v3.d.ts +2 -0
  79. package/dist/design-system-v3.js +186 -187
  80. package/dist/design-system-v3.umd.cjs +1 -1066
  81. package/dist/{main-aLKwdMi1.js → main-BtTqyn4z.js} +16434 -15672
  82. package/dist/main-C1e3eoxd.cjs +1067 -0
  83. package/dist/main.d.ts +0 -1
  84. package/dist/synapse.css +1 -0
  85. package/dist/tooth-11-D3sLWv2n.cjs +1 -0
  86. package/dist/tooth-12-CXrLuH03.cjs +1 -0
  87. package/dist/tooth-13-BSfo5fpT.cjs +1 -0
  88. package/dist/tooth-14-DMzulx0h.cjs +1 -0
  89. package/dist/tooth-15-BKRFVi-9.cjs +1 -0
  90. package/dist/tooth-16-CpuxAbuM.cjs +1 -0
  91. package/dist/tooth-17-BPoahUdg.cjs +1 -0
  92. package/dist/tooth-18-DhHJz8sy.cjs +1 -0
  93. package/dist/tooth-21-Dgd5hn_X.cjs +1 -0
  94. package/dist/tooth-22-C2Tn19sB.cjs +1 -0
  95. package/dist/tooth-23-C9uaaSGb.cjs +1 -0
  96. package/dist/tooth-24-BrK9UGpf.cjs +1 -0
  97. package/dist/tooth-25-CE_EfGNp.cjs +1 -0
  98. package/dist/tooth-26-Ctv4i9Fy.cjs +1 -0
  99. package/dist/tooth-27-C5J7JkWM.cjs +1 -0
  100. package/dist/tooth-28-Z9oWqjo0.cjs +1 -0
  101. package/dist/tooth-31-BrYqmkTi.cjs +1 -0
  102. package/dist/tooth-32-BNNR0oCZ.cjs +1 -0
  103. package/dist/tooth-33-DuxvqO2J.cjs +1 -0
  104. package/dist/tooth-34-BCSCXMB6.cjs +1 -0
  105. package/dist/tooth-35-BLUXkX88.cjs +1 -0
  106. package/dist/tooth-36-IrKHYqlA.cjs +1 -0
  107. package/dist/tooth-37-BYqpdMwo.cjs +1 -0
  108. package/dist/tooth-38-B_eNXXdu.cjs +1 -0
  109. package/dist/tooth-41-Ddva4Ot8.cjs +1 -0
  110. package/dist/tooth-42-szcDqlM0.cjs +1 -0
  111. package/dist/tooth-43-B3ka6rQm.cjs +1 -0
  112. package/dist/tooth-44-CazyQucj.cjs +1 -0
  113. package/dist/tooth-45-B4HQtc8n.cjs +1 -0
  114. package/dist/tooth-46-BPM40gbG.cjs +1 -0
  115. package/dist/tooth-47-Dvr20dlh.cjs +1 -0
  116. package/dist/tooth-48-Bd8ljGsF.cjs +1 -0
  117. package/dist/tooth-51-OBpwCOF3.cjs +1 -0
  118. package/dist/tooth-52-aKxyHcmq.cjs +1 -0
  119. package/dist/tooth-53-vCwJjTOc.cjs +1 -0
  120. package/dist/tooth-54-DsWu2iFy.cjs +1 -0
  121. package/dist/tooth-55-BxC1X2Dn.cjs +1 -0
  122. package/dist/tooth-61-BbLvxMQi.cjs +1 -0
  123. package/dist/tooth-62-CmTkWczP.cjs +1 -0
  124. package/dist/tooth-63-DI7l_2qI.cjs +1 -0
  125. package/dist/tooth-64-B21sOsJh.cjs +1 -0
  126. package/dist/tooth-65-D2ZC2VEr.cjs +1 -0
  127. package/dist/tooth-71-D473PPO5.cjs +1 -0
  128. package/dist/tooth-72-Drh1wnNu.cjs +1 -0
  129. package/dist/tooth-73-DzlwYI23.cjs +1 -0
  130. package/dist/tooth-74-8aGvcZPg.cjs +1 -0
  131. package/dist/tooth-75-BFK7At_r.cjs +1 -0
  132. package/dist/tooth-81-BZmR-I0M.cjs +1 -0
  133. package/dist/tooth-82-euVfUUZV.cjs +1 -0
  134. package/dist/tooth-83-KV010j64.cjs +1 -0
  135. package/dist/tooth-84-BBg1RjhZ.cjs +1 -0
  136. package/dist/tooth-85-Cr-kc1wM.cjs +1 -0
  137. package/dist/vuetifyConfig.js +561 -0
  138. package/dist/vuetifyConfig.umd.cjs +1 -0
  139. package/package.json +10 -4
  140. package/src/assets/overrides/_btns.scss +0 -6
  141. package/src/assets/overrides/_icons.scss +9 -1
  142. package/src/assets/overrides/_typography.scss +0 -10
  143. package/src/components/Amelipro/AmeliproAutoCompleteField/__tests__/__snapshots__/AmeliproAutoCompleteField.spec.ts.snap +2 -2
  144. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/__tests__/__snapshots__/AmeliproHeaderBrandSection.spec.ts.snap +1 -1
  145. package/src/components/Amelipro/AmeliproTextArea/__tests__/__snapshots__/AmeliproTextArea.spec.ts.snap +2 -2
  146. package/src/components/Captcha/accessibilite/Accessibility.mdx +86 -8
  147. package/src/components/Captcha/tests/__snapshots__/Captcha.spec.ts.snap +12 -12
  148. package/src/components/ChipList/ChipList.stories.ts +0 -15
  149. package/src/components/ChipList/ChipList.vue +5 -1
  150. package/src/components/ChipList/accessibilite/Accessibility.mdx +83 -10
  151. package/src/components/ChipList/tests/ChipList.a11y.spec.ts +41 -0
  152. package/src/components/Customs/Selects/SelectBtnField/accessibilite/Accessibility.mdx +0 -9
  153. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +22 -5
  154. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +143 -0
  155. package/src/components/Customs/Selects/SyAutocomplete/utils/ariaManager.ts +14 -10
  156. package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.stories.ts +4 -4
  157. package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.vue +8 -9
  158. package/src/components/Customs/Selects/SyInputSelect/tests/SyInputSelect.spec.ts +10 -10
  159. package/src/components/Customs/Selects/SySelect/SySelect.vue +14 -11
  160. package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +54 -0
  161. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +6 -9
  162. package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +10 -16
  163. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +16 -11
  164. package/src/components/Customs/SyCheckbox/accessibilite/Accessibility.mdx +35 -0
  165. package/src/components/Customs/SyCheckbox/tests/SyCheckbox.a11y.spec.ts +134 -2
  166. package/src/components/Customs/SyForm/SyForm.stories.ts +31 -5
  167. package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +4 -7
  168. package/src/components/Customs/SyTextField/SyTextField.mdx +1 -1
  169. package/src/components/Customs/SyTextField/SyTextField.stories.ts +29 -27
  170. package/src/components/Customs/SyTextField/SyTextField.vue +154 -157
  171. package/src/components/Customs/SyTextField/tests/SyTextField.a11y.spec.ts +32 -0
  172. package/src/components/Customs/SyTextField/tests/SyTextField.spec.ts +120 -11
  173. package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +62 -58
  174. package/src/components/DatePicker/CalendarMode/DatePicker.vue +330 -223
  175. package/src/components/DatePicker/CalendarMode/accessibilite/Accessibility.mdx +82 -0
  176. package/src/components/DatePicker/CalendarMode/tests/DatePicker.a11y.spec.ts +141 -0
  177. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +2 -56
  178. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +195 -159
  179. package/src/components/DatePicker/ComplexDatePicker/accessibilite/Accessibility.mdx +76 -0
  180. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +10 -10
  181. package/src/components/DatePicker/DatePickerValidationExample/CalendarMode.stories.ts +8 -8
  182. package/src/components/DatePicker/DatePickerValidationExample/ComplexDatePicker.stories.ts +106 -8
  183. package/src/components/DatePicker/DatePickerValidationExample/DateTextInput.stories.ts +12 -11
  184. package/src/components/DatePicker/DatePickerValidationExample/MultiMode.stories.ts +12 -12
  185. package/src/components/DatePicker/DateTextInput/DateRange.stories.ts +0 -12
  186. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +63 -57
  187. package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +3 -0
  188. package/src/components/DatePicker/DateTextInput/accessibilite/Accessibility.mdx +66 -0
  189. package/src/components/DatePicker/DateTextInput/tests/DateTextInput.spec.ts +52 -1
  190. package/src/components/DatePicker/composables/index.ts +1 -0
  191. package/src/components/DatePicker/composables/tests/useCalendarKeyboardNavigation.spec.ts +109 -65
  192. package/src/components/DatePicker/composables/tests/useDatePickerFocusTrap.spec.ts +138 -0
  193. package/src/components/DatePicker/composables/tests/useDateValidation.spec.ts +74 -18
  194. package/src/components/DatePicker/composables/tests/useInputBlurHandler.spec.ts +39 -0
  195. package/src/components/DatePicker/composables/tests/useManualDateValidation.spec.ts +91 -0
  196. package/src/components/DatePicker/composables/useCalendarKeyboardNavigation.ts +442 -36
  197. package/src/components/DatePicker/composables/useDatePickerFocusTrap.ts +92 -0
  198. package/src/components/DatePicker/composables/useDateTextField.ts +7 -6
  199. package/src/components/DatePicker/composables/useDateValidation.ts +36 -35
  200. package/src/components/DatePicker/composables/useInputBlurHandler.ts +3 -3
  201. package/src/components/DatePicker/composables/useManualDateValidation.ts +6 -2
  202. package/src/components/DiacriticPicker/accessibilite/Accessibility.mdx +76 -8
  203. package/src/components/HeaderBar/HeaderBar.stories.ts +14 -2
  204. package/src/components/Logo/accessibilite/Accessibility.mdx +73 -11
  205. package/src/components/LogoBrandSection/accessibilite/Accessibility.mdx +85 -9
  206. package/src/components/LunarCalendar/tests/LunarCalendar.spec.ts +3 -1
  207. package/src/components/LunarCalendar/useLunarCalendarValidation.ts +4 -5
  208. package/src/components/MonthPicker/tests/MonthPicker.spec.ts +2 -1
  209. package/src/components/MonthPicker/tests/__snapshots__/MonthPicker.spec.ts.snap +7 -7
  210. package/src/components/NirField/NirField.stories.ts +4 -0
  211. package/src/components/NirField/NirField.vue +64 -260
  212. package/src/components/NirField/accessibilite/Accessibility.mdx +2 -2
  213. package/src/components/NirField/locales.ts +1 -1
  214. package/src/components/NirField/tests/NirField.spec.ts +6 -0
  215. package/src/components/NirField/useNirValidation.ts +271 -0
  216. package/src/components/PasswordField/PasswordField.stories.ts +4 -4
  217. package/src/components/PasswordField/PasswordField.vue +18 -24
  218. package/src/components/PasswordField/tests/PasswordField.spec.ts +6 -3
  219. package/src/components/PeriodField/PeriodField.stories.ts +4 -4
  220. package/src/components/PeriodField/PeriodField.vue +57 -57
  221. package/src/components/PeriodField/__tests__/PeriodField.async.spec.ts +32 -0
  222. package/src/components/PeriodField/accessibilite/Accessibility.mdx +68 -8
  223. package/src/components/PeriodField/tests/PeriodField.spec.ts +28 -2
  224. package/src/components/PhoneField/PhoneField.vue +5 -6
  225. package/src/components/PhoneField/tests/PhoneField.spec.ts +1 -0
  226. package/src/components/RangeField/RangeField.vue +6 -0
  227. package/src/components/SyTextArea/SyTextArea.stories.ts +138 -2
  228. package/src/components/SyTextArea/SyTextArea.vue +53 -23
  229. package/src/components/SyTextArea/tests/SyTextArea.spec.ts +126 -3
  230. package/src/components/SyTextArea/useDefaultValidationRules.ts +74 -0
  231. package/src/components/Tables/SyServerTable/SyServerTable.mdx +25 -0
  232. package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +673 -1
  233. package/src/components/Tables/SyServerTable/SyServerTable.vue +148 -91
  234. package/src/components/Tables/SyServerTable/tests/SyServerTable.a11y.spec.ts +58 -0
  235. package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +122 -0
  236. package/src/components/Tables/SyTable/SyTable.mdx +25 -0
  237. package/src/components/Tables/SyTable/SyTable.stories.ts +452 -1
  238. package/src/components/Tables/SyTable/SyTable.vue +130 -56
  239. package/src/components/Tables/SyTable/tests/SyTable.a11y.spec.ts +57 -0
  240. package/src/components/Tables/SyTable/tests/SyTable.spec.ts +108 -0
  241. package/src/components/Tables/common/SyTableFilter.vue +22 -2
  242. package/src/components/Tables/common/TableHeader.vue +5 -1
  243. package/src/components/Tables/common/filters/AutocompleteFilter.vue +160 -0
  244. package/src/components/Tables/common/filters/NumberFilter.vue +1 -1
  245. package/src/components/Tables/common/filters/SelectFilter.vue +10 -11
  246. package/src/components/Tables/common/filters/TextFilter.vue +1 -1
  247. package/src/components/Tables/common/filters/getFilterComponent.ts +8 -1
  248. package/src/components/Tables/common/filters/locales.ts +0 -1
  249. package/src/components/Tables/common/filters/tests/AutocompleteFilter.a11y.spec.ts +110 -0
  250. package/src/components/Tables/common/filters/tests/AutocompleteFilter.spec.ts +203 -0
  251. package/src/components/Tables/common/filters/tests/SelectFilter.a11y.spec.ts +104 -0
  252. package/src/components/Tables/common/filters/tests/SelectFilter.spec.ts +152 -16
  253. package/src/components/Tables/common/tableFilterUtils.ts +3 -0
  254. package/src/components/Tables/common/tableStyles.scss +48 -4
  255. package/src/components/Tables/common/tests/filterByRange.spec.ts +2 -1
  256. package/src/components/Tables/common/types.ts +13 -4
  257. package/src/components/Tables/common/useClickableTableRow.ts +103 -0
  258. package/src/components/Tables/common/usePagination.ts +13 -0
  259. package/src/components/Tables/common/usePinnedColumns.ts +237 -0
  260. package/src/components/Tables/common/useTableHeaders.ts +3 -3
  261. package/src/components/Tables/common/useTableRowCheckboxAccessibility.ts +41 -0
  262. package/src/composables/date/tests/useDatePickerAccessibility.spec.ts +2 -6
  263. package/src/composables/date/useDatePickerAccessibility.ts +42 -207
  264. package/src/composables/rules/tests/useFieldValidation.spec.ts +120 -120
  265. package/src/composables/rules/useFieldValidation.ts +34 -17
  266. package/src/composables/unifyValidation/tests/useCustomValidation.spec.ts +601 -0
  267. package/src/composables/unifyValidation/tests/useValidation.spec.ts +2048 -0
  268. package/src/composables/unifyValidation/tests/useVuetifyValidation.spec.ts +184 -0
  269. package/src/composables/unifyValidation/useCustomValidation.ts +95 -0
  270. package/src/composables/unifyValidation/useValidation.ts +190 -0
  271. package/src/composables/unifyValidation/useVuetifyValidation.ts +54 -0
  272. package/src/composables/useFormFieldErrorHandling.ts +4 -7
  273. package/src/composables/validation/tests/useFormValidation.spec.ts +14 -0
  274. package/src/composables/validation/tests/useValidation.spec.ts +116 -21
  275. package/src/composables/validation/useFormValidation.ts +20 -13
  276. package/src/composables/validation/useValidatable.ts +8 -1
  277. package/src/composables/validation/useValidation.ts +135 -99
  278. package/src/composantsVuetify/Introduction.mdx +48 -0
  279. package/src/composantsVuetify/VBtn/VBtn.mdx +72 -0
  280. package/src/composantsVuetify/VBtn/v-btn.stories.ts +121 -0
  281. package/src/composantsVuetify/VTooltip/VTooltip.mdx +32 -0
  282. package/src/composantsVuetify/VTooltip/v-tooltip.stories.ts +95 -0
  283. package/src/designTokens/tokens/cnam/cnamSemantic.ts +2 -2
  284. package/src/main.ts +0 -2
  285. package/src/stories/Components/Components.stories.ts +74 -9
  286. package/src/stories/Demarrer/Accueil.stories.ts +3 -3
  287. package/src/stories/GuideDuDev/Amelipro.mdx +15 -0
  288. package/src/stories/GuideDuDev/Amelipro.stories.ts +209 -0
  289. package/src/stories/GuideDuDev/vuetifyOptions.mdx +3 -3
  290. package/dist/SelectFilter-BioGT6Nn.js +0 -136
  291. package/dist/style.css +0 -1
  292. package/src/components/DatePicker/Accessibilite.mdx +0 -14
@@ -1,12 +1,72 @@
1
- import { Meta, Story } from '@storybook/addon-docs';
2
- import * as Stories from '../PeriodField.stories.ts';
3
- import '@/stories/styles/shared.css';
1
+ import { Meta, Story } from '@storybook/addon-docs'
2
+ import * as Stories from '../PeriodField.stories.ts'
3
+ import AccessibilityIcon from '@/common/imgs/accessibility-svgrepo-com.svg'
4
+ import '@/stories/styles/shared.css'
5
+ import {
6
+ AccessibilityGuideLayout,
7
+ CriteriaSection,
8
+ CriteriaCard,
9
+ DemoSection,
10
+ BestPracticesSection,
11
+ ResourcesSection,
12
+ } from '@/stories/accessibility/AccessibilityGuideLayout.mdx'
4
13
 
5
14
  <Meta of={Stories} />
6
15
 
7
- <div className="header">
8
- <h1>Accessibilité</h1>
9
- <p>Cette page sera bientôt disponible</p>
10
- </div>
16
+ <AccessibilityGuideLayout
17
+ componentName="PeriodField"
18
+ iconSrc={AccessibilityIcon}
19
+ >
20
+ <CriteriaSection>
21
+ <CriteriaCard title="Structure sémantique" icon="🔍">
22
+ <ul>
23
+ <li><strong>Rôles</strong> : Deux inputs avec <code>aria-required</code> synchronisé quand <code>required</code>.</li>
24
+ <li><strong>Association</strong> : Labels natifs pour chaque champ (date de début/fin) avec placeholders distinctifs "Début"/"Fin".</li>
25
+ <li><strong>Descriptions</strong> : <code>aria-describedby</code> relie aides contextuelles, messages de validation croisée (début ≤ fin).</li>
26
+ <li><strong>États</strong> : <code>aria-invalid</code>, <code>aria-disabled</code>, <code>aria-readonly</code> sur chaque champ indiquent validation et props.</li>
27
+ </ul>
28
+ </CriteriaCard>
11
29
 
12
- <br />
30
+ <CriteriaCard title="Saisie et clavier" icon="⌨️">
31
+ <ul>
32
+ <li><strong>Tab</strong> : Navigation séquentielle entre les deux champs sans piège de focus.</li>
33
+ <li><strong>Masque automatique</strong> : Formatage automatique des séparateurs sans bloquer la saisie ni les raccourcis clavier.</li>
34
+ <li><strong>Raccourcis</strong> : <kbd>Ctrl/C</kbd> fonctionnel sur chaque champ.</li>
35
+ <li><strong>Calendrier optionnel</strong> : Icône calendrier active un DatePicker accessible avec navigation clavier complète.</li>
36
+ <li><strong>Lecture seule</strong> : Désactive validation et effacement, icônes décoratives non interactives.</li>
37
+ </ul>
38
+ </CriteriaCard>
39
+
40
+ <CriteriaCard title="Validation croisée" icon="📣">
41
+ <ul>
42
+ <li><strong>Cohérence période</strong> : Validation automatique que début ≤ fin avec messages d'erreur croisés.</li>
43
+ <li><strong>Champs requis</strong> : Si required, les deux champs doivent être remplis ou aucun (logique flexible).</li>
44
+ <li><strong>Messages contextualisés</strong> : Erreurs/avertissements/succès sous chaque champ (associés via <code>aria-describedby</code>).</li>
45
+ <li><strong>Validation personnalisée</strong> : <code>customRules</code> / <code>customWarningRules</code> par champ.</li>
46
+ </ul>
47
+ </CriteriaCard>
48
+
49
+ <CriteriaCard title="Calendrier intégré" icon="📅">
50
+ <ul>
51
+ <li><strong>Icône accessible</strong> : Bouton avec <code>aria-label</code> explicite ("Ouvrir le calendrier"). Les attributs <code>aria-expanded</code> et <code>aria-haspopup</code> ne sont pas appliqués directement sur les champs textes pour respecter leur rôle natif.</li>
52
+ <li><strong>Navigation calendrier</strong> : Flèches, Home/End, PageUp/Down, Entrée/Espace pour sélectionner dates.</li>
53
+ <li><strong>Focus management</strong> : Retour automatique au champ après sélection dans calendrier.</li>
54
+ <li><strong>Format cohérent</strong> : Date sélectionnée respecte le format configuré (DD/MM/YYYY par défaut).</li>
55
+ </ul>
56
+ </CriteriaCard>
57
+ </CriteriaSection>
58
+
59
+ <DemoSection title="Période par défaut">
60
+ <Story of={Stories.Default} />
61
+ </DemoSection>
62
+
63
+
64
+ <BestPracticesSection>
65
+ - Utiliser des placeholders distinctifs ("Début"/"Fin") et des labels clairs pour chaque champ.
66
+ - Afficher un hint persistant expliquant le format attendu et la logique de validation croisée.
67
+ - En mode requis, clarifier que les deux champs doivent être remplis ou aucun selon le cas d'usage.
68
+ - Conserver l'icône calendrier décorative mais non interactive en mode lecture seule ou désactivé.
69
+ - Avec validation personnalisée, synchroniser les messages entre les deux champs pour cohérence.
70
+ - Tester la navigation clavier entre les champs et l'interaction calendrier si activé.
71
+ </BestPracticesSection>
72
+ </AccessibilityGuideLayout>
@@ -1,6 +1,6 @@
1
- import { DOMWrapper, mount, VueWrapper } from '@vue/test-utils'
1
+ import { DOMWrapper, flushPromises, mount, VueWrapper } from '@vue/test-utils'
2
2
  import { describe, it, expect } from 'vitest'
3
- import type { ComponentPublicInstance } from 'vue'
3
+ import { nextTick, type ComponentPublicInstance } from 'vue'
4
4
 
5
5
  import PeriodField from '../PeriodField.vue'
6
6
  import DatePicker from '@/components/DatePicker/CalendarMode/DatePicker.vue'
@@ -116,6 +116,32 @@ describe('PeriodField.vue', () => {
116
116
  expect(wrapper.vm.isValid).toBe(false)
117
117
  })
118
118
 
119
+ it('shows error when from date is after to date when updated', async () => {
120
+ const wrapper = mount(PeriodField, {
121
+ props: {
122
+ modelValue: { from: '2024-01-01', to: '2024-01-31' },
123
+ },
124
+ })
125
+
126
+ // Find both DatePicker components
127
+ const datePickers = wrapper.findAllComponents({ name: 'DatePicker' })
128
+ expect(datePickers.length).toBe(2)
129
+
130
+ const fromInput = datePickers[0]!.find('input')
131
+ await fromInput.setValue('15/01/2024')
132
+ await fromInput.trigger('blur')
133
+ await flushPromises()
134
+
135
+ const toInput = datePickers[1]!.find('input')
136
+ await toInput.setValue('10/01/2024')
137
+ await toInput.trigger('blur')
138
+ await flushPromises()
139
+ await nextTick()
140
+
141
+ expect(datePickers[0]?.text()).toContain('date de début ne peut pas être supérieure à la date de fin')
142
+ expect(datePickers[1]?.text()).toContain('La date de fin ne peut pas être inférieure à la date de début')
143
+ })
144
+
119
145
  it('validates when required and both dates are missing', async () => {
120
146
  const wrapper = mount(PeriodField, {
121
147
  props: {
@@ -300,7 +300,6 @@
300
300
  })
301
301
 
302
302
  const validation = useValidation({
303
- customRules: validationRules.value,
304
303
  showSuccessMessages: true,
305
304
  disableErrorHandling: shouldDisableErrorHandling.value,
306
305
  })
@@ -332,9 +331,9 @@
332
331
 
333
332
  const showHelpTextBelow = computed(() => !!props.helpText?.trim())
334
333
 
335
- const runValidation = (): void => {
334
+ const runValidation = async (): Promise<void> => {
336
335
  const cleanedValue = phoneNumber.value.replace(/\s/g, '')
337
- validation.validateField(cleanedValue, validationRules.value)
336
+ await validation.validateField(cleanedValue, validationRules.value)
338
337
  }
339
338
 
340
339
  function validateInputOnBlur() {
@@ -346,13 +345,13 @@
346
345
  runValidation()
347
346
  }
348
347
 
349
- watch(phoneNumber, (newValue) => {
348
+ watch(phoneNumber, async (newValue) => {
350
349
  if (shouldDisableErrorHandling.value) return
351
350
 
352
351
  if (!props.isValidatedOnBlur) {
353
352
  // Validation en temps réel (isValidatedOnBlur=false)
354
353
  const cleanedValue = newValue.replace(/\s/g, '')
355
- validation.validateField(cleanedValue, validationRules.value)
354
+ await validation.validateField(cleanedValue, validationRules.value)
356
355
  }
357
356
  else if (onBlur.value) {
358
357
  // Après un premier blur, effacer les erreurs pendant la frappe —
@@ -377,7 +376,7 @@
377
376
  }
378
377
 
379
378
  onBlur.value = true
380
- runValidation()
379
+ await runValidation()
381
380
 
382
381
  if (props.withCountryCode && props.countryCodeRequired && !dialCode.value) {
383
382
  validation.errors.value.push(`Le champ ${locales.indicatifLabel} est requis.`)
@@ -310,6 +310,7 @@ describe('PhoneField', () => {
310
310
  })
311
311
 
312
312
  const result = await wrapper.vm.validateOnSubmit()
313
+ console.log('Validation result:', result)
313
314
 
314
315
  expect(result).toBe(false)
315
316
  expect(wrapper.vm.hasError).toBe(true)
@@ -171,3 +171,9 @@
171
171
  </div>
172
172
  </component>
173
173
  </template>
174
+
175
+ <style lang="scss">
176
+ .sy-range-field .sy-textfield-container {
177
+ flex: 1;
178
+ }
179
+ </style>
@@ -9,11 +9,11 @@ const meta = {
9
9
  parameters: {
10
10
  docs: {
11
11
  controls: {
12
- exclude: ['rules', 'validateOn', 'update:modelValue', 'onUpdate:modelValue'],
12
+ exclude: ['validateOn', 'update:modelValue', 'onUpdate:modelValue'],
13
13
  },
14
14
  },
15
15
  controls: {
16
- exclude: ['rules', 'validateOn', 'onUpdate:modelValue'],
16
+ exclude: ['validateOn', 'onUpdate:modelValue'],
17
17
  },
18
18
  },
19
19
  argTypes: {
@@ -89,6 +89,142 @@ const meta = {
89
89
  table: {
90
90
  type: { summary: 'boolean' },
91
91
  defaultValue: { summary: 'false' },
92
+ category: 'validation',
93
+ },
94
+ },
95
+ rules: {
96
+ control: { type: 'object' },
97
+ description: 'Règles de validation Vuetify (mode useVuetifyValidation=true)',
98
+ table: {
99
+ type: { summary: 'Array<(value: string) => boolean | string>' },
100
+ defaultValue: { summary: '[]' },
101
+ category: 'validation',
102
+ },
103
+ },
104
+ useVuetifyValidation: {
105
+ control: { type: 'boolean' },
106
+ description: 'Active la validation Vuetify (sinon validation unifiée customRules)',
107
+ table: {
108
+ type: { summary: 'boolean' },
109
+ defaultValue: { summary: 'false' },
110
+ category: 'validation',
111
+ },
112
+ },
113
+ isValidateOnBlur: {
114
+ control: { type: 'boolean' },
115
+ description: 'Déclenche la validation au blur (sinon à la saisie)',
116
+ table: {
117
+ type: { summary: 'boolean' },
118
+ defaultValue: { summary: 'true' },
119
+ category: 'validation',
120
+ },
121
+ },
122
+ disableErrorHandling: {
123
+ control: { type: 'boolean' },
124
+ description: 'Désactive la gestion des messages d\'erreur/alerte/succès',
125
+ table: {
126
+ type: { summary: 'boolean' },
127
+ defaultValue: { summary: 'false' },
128
+ category: 'validation',
129
+ },
130
+ },
131
+ showSuccessMessages: {
132
+ control: { type: 'boolean' },
133
+ description: 'Affiche les messages de succès',
134
+ table: {
135
+ type: { summary: 'boolean' },
136
+ defaultValue: { summary: 'true' },
137
+ category: 'validation',
138
+ },
139
+ },
140
+ customRules: {
141
+ control: { type: 'object' },
142
+ description: 'Règles d\'erreur pour le mode validation unifiée',
143
+ table: {
144
+ type: { summary: 'ValidationRule[]' },
145
+ defaultValue: { summary: '[]' },
146
+ category: 'validation',
147
+ },
148
+ },
149
+ customWarningRules: {
150
+ control: { type: 'object' },
151
+ description: 'Règles d\'alerte pour le mode validation unifiée',
152
+ table: {
153
+ type: { summary: 'ValidationRule[]' },
154
+ defaultValue: { summary: '[]' },
155
+ category: 'validation',
156
+ },
157
+ },
158
+ customSuccessRules: {
159
+ control: { type: 'object' },
160
+ description: 'Règles de succès pour le mode validation unifiée',
161
+ table: {
162
+ type: { summary: 'ValidationRule[]' },
163
+ defaultValue: { summary: '[]' },
164
+ category: 'validation',
165
+ },
166
+ },
167
+ errorMessages: {
168
+ control: { type: 'object' },
169
+ description: 'Messages d\'erreur externes ajoutés au résultat de validation',
170
+ table: {
171
+ type: { summary: 'string[] | null' },
172
+ defaultValue: { summary: 'null' },
173
+ category: 'validation',
174
+ },
175
+ },
176
+ warningMessages: {
177
+ control: { type: 'object' },
178
+ description: 'Messages d\'alerte externes ajoutés au résultat de validation',
179
+ table: {
180
+ type: { summary: 'string[] | null' },
181
+ defaultValue: { summary: 'null' },
182
+ category: 'validation',
183
+ },
184
+ },
185
+ successMessages: {
186
+ control: { type: 'object' },
187
+ description: 'Messages de succès externes ajoutés au résultat de validation',
188
+ table: {
189
+ type: { summary: 'string[] | null' },
190
+ defaultValue: { summary: 'null' },
191
+ category: 'validation',
192
+ },
193
+ },
194
+ hasError: {
195
+ control: { type: 'boolean' },
196
+ description: 'Force l\'état erreur',
197
+ table: {
198
+ type: { summary: 'boolean' },
199
+ defaultValue: { summary: 'false' },
200
+ category: 'validation',
201
+ },
202
+ },
203
+ hasWarning: {
204
+ control: { type: 'boolean' },
205
+ description: 'Force l\'état alerte',
206
+ table: {
207
+ type: { summary: 'boolean' },
208
+ defaultValue: { summary: 'false' },
209
+ category: 'validation',
210
+ },
211
+ },
212
+ hasSuccess: {
213
+ control: { type: 'boolean' },
214
+ description: 'Force l\'état succès',
215
+ table: {
216
+ type: { summary: 'boolean' },
217
+ defaultValue: { summary: 'false' },
218
+ category: 'validation',
219
+ },
220
+ },
221
+ maxErrors: {
222
+ control: { type: 'number' },
223
+ description: 'Nombre maximum de messages d\'erreur affichés',
224
+ table: {
225
+ type: { summary: 'number' },
226
+ defaultValue: { summary: '1' },
227
+ category: 'validation',
92
228
  },
93
229
  },
94
230
  },
@@ -1,10 +1,10 @@
1
1
  <script setup lang="ts">
2
2
  import { computed, ref, toRef, watch } from 'vue'
3
3
  import type { VTextarea } from 'vuetify/components'
4
- import { locales } from './locales'
5
4
  import useTextActions from './useTextActions'
6
-
7
- type Rule = (value: string) => boolean | string
5
+ import { useDefaultValidationRules, type TextareaRule as Rule } from './useDefaultValidationRules'
6
+ import { useValidation, validationPropsDefaults, type FieldValidationProps } from '@/composables/unifyValidation/useValidation'
7
+ import type { ValidationRule as SyValidationRule } from '@/composables/validation/useValidation'
8
8
 
9
9
  const props = withDefaults(defineProps<{
10
10
  modelValue?: string
@@ -20,12 +20,11 @@
20
20
  color?: string
21
21
  label: string
22
22
  bgColor?: string
23
- }>(), {
23
+ } & FieldValidationProps>(), {
24
24
  modelValue: '',
25
25
  trim: false,
26
26
  replaceTabs: undefined,
27
27
  rules: () => [],
28
- required: false,
29
28
  maxLines: undefined,
30
29
  autoWrap: undefined,
31
30
  normalize: false,
@@ -33,6 +32,7 @@
33
32
  variant: 'outlined',
34
33
  color: 'primary',
35
34
  bgColor: 'white',
35
+ ...validationPropsDefaults,
36
36
  })
37
37
 
38
38
  const emits = defineEmits<{
@@ -41,6 +41,7 @@
41
41
 
42
42
  const textAreaRef = ref<VTextarea | null>(null)
43
43
  const hasInteracted = ref(false)
44
+ const focused = ref(false)
44
45
 
45
46
  const internalValue = ref(props.modelValue)
46
47
  watch(
@@ -87,25 +88,48 @@
87
88
  internalValue.value = value
88
89
  }
89
90
 
90
- const internalRules = computed<Rule[]>(() => {
91
- const internalRules: Rule[] = []
91
+ const { vuetifyRules: defaultVuetifyRules, customRules: defaultCustomRules } = useDefaultValidationRules({
92
+ required: toRef(props, 'required'),
93
+ maxLines: toRef(props, 'maxLines'),
94
+ hasInteracted,
95
+ })
92
96
 
93
- internalRules.push((value: string) => {
94
- if (props.required && hasInteracted.value && !value) {
95
- return locales.required
96
- }
97
- return true
98
- })
97
+ const mergedCustomRules = computed<SyValidationRule[]>(() => [
98
+ ...defaultCustomRules.value,
99
+ ...(props.customRules || []),
100
+ ])
99
101
 
100
- internalRules.push((value: string) => {
101
- const lines = value.split('\n').length
102
- if (lines > (props.maxLines as number)) {
103
- return locales.maxLines(props.maxLines as number)
104
- }
105
- return true
106
- })
102
+ const mergedVuetifyRules = computed<Rule[]>(() => [
103
+ ...(props.rules || []),
104
+ ...defaultVuetifyRules.value,
105
+ ])
106
+
107
+ const { validate, errors, warnings, successes, hasError, hasWarning, hasSuccess } = useValidation({
108
+ modelValue: internalValue,
109
+ readonly: toRef(props, 'readonly'),
110
+ disabled: toRef(props, 'disabled'),
111
+ required: toRef(props, 'required'),
112
+ isValidateOnBlur: toRef(props, 'isValidateOnBlur'),
113
+ showSuccessMessages: toRef(props, 'showSuccessMessages'),
114
+ disableErrorHandling: toRef(props, 'disableErrorHandling'),
115
+ useVuetifyValidation: toRef(props, 'useVuetifyValidation'),
116
+ label: toRef(props, 'label'),
117
+ rules: mergedVuetifyRules,
118
+ customRules: mergedCustomRules,
119
+ customWarningRules: toRef(props, 'customWarningRules'),
120
+ customSuccessRules: toRef(props, 'customSuccessRules'),
121
+ errorMessages: toRef(props, 'errorMessages'),
122
+ warningMessages: toRef(props, 'warningMessages'),
123
+ successMessages: toRef(props, 'successMessages'),
124
+ hasErrorProp: toRef(props, 'hasError'),
125
+ hasWarningProp: toRef(props, 'hasWarning'),
126
+ hasSuccessProp: toRef(props, 'hasSuccess'),
127
+ maxErrors: toRef(props, 'maxErrors'),
128
+ focused,
129
+ })
107
130
 
108
- return internalRules
131
+ defineExpose({
132
+ validateOnSubmit: validate,
109
133
  })
110
134
 
111
135
  </script>
@@ -117,13 +141,19 @@
117
141
  :variant="variant"
118
142
  :color="color"
119
143
  :bg-color="props.bgColor"
144
+ :error="hasError"
145
+ :error-messages="errors"
146
+ :messages="hasError ? errors : (hasWarning ? warnings : (hasSuccess && props.showSuccessMessages ? successes : []))"
147
+ :max-errors="props.maxErrors"
148
+ :disabled="props.disabled"
149
+ :readonly="props.readonly"
120
150
  :validate-on="validateOn"
121
- :rules="[...props.rules, ...internalRules]"
151
+ :rules="props.useVuetifyValidation ? mergedVuetifyRules : undefined"
122
152
  :label="label"
123
153
  :aria-label="label"
124
154
  :required="required"
125
155
  :aria-required="required ? 'true' : undefined"
126
156
  @update:model-value="execValueChange"
127
- @update:focused="(e: boolean) => !e ? execBlurChange() : null"
157
+ @update:focused="(e: boolean) => { focused = e; if (!e) execBlurChange() }"
128
158
  />
129
159
  </template>
@@ -1,6 +1,5 @@
1
1
  import { it, describe, expect } from 'vitest'
2
- import { mount } from '@vue/test-utils'
3
- import { nextTick } from 'vue'
2
+ import { flushPromises, mount } from '@vue/test-utils'
4
3
  import SyTextArea from '../SyTextArea.vue'
5
4
 
6
5
  describe('SyTextArea', () => {
@@ -126,11 +125,16 @@ describe('SyTextArea', () => {
126
125
  },
127
126
  })
128
127
  const textarea = wrapper.find('textarea')
128
+ await textarea.trigger('focus')
129
129
  await textarea.setValue('content\ncontent\ncontent\ncontent\ncontent\ncontent')
130
+ await textarea.trigger('blur')
131
+
130
132
  expect(wrapper.text()).toContain('Ce champ ne peut pas dépasser 5 lignes')
131
133
 
134
+ await textarea.trigger('focus')
132
135
  await textarea.setValue('content\ncontent\ncontent\ncontent\ncontent')
133
- await nextTick()
136
+ await textarea.trigger('blur')
137
+
134
138
  expect(wrapper.text()).not.toContain('Ce champ ne peut pas dépasser 5 lignes')
135
139
  })
136
140
 
@@ -201,4 +205,123 @@ describe('SyTextArea', () => {
201
205
 
202
206
  expect(textarea.element.value).toBe('new value')
203
207
  })
208
+
209
+ it('shows custom error from customRules in custom validation mode', async () => {
210
+ const wrapper = mount(SyTextArea, {
211
+ props: {
212
+ modelValue: '',
213
+ label: 'Description des symptomes',
214
+ isValidateOnBlur: false,
215
+ customRules: [
216
+ {
217
+ type: 'custom',
218
+ options: {
219
+ validate: (value: string) => value.includes('ok'),
220
+ message: 'Le texte doit contenir ok',
221
+ },
222
+ },
223
+ ],
224
+ },
225
+ })
226
+
227
+ const textarea = wrapper.find('textarea')
228
+ await textarea.trigger('focus')
229
+ await textarea.setValue('test')
230
+ await textarea.trigger('blur')
231
+ await flushPromises()
232
+
233
+ const isValid = await (wrapper.vm as { validateOnSubmit: () => Promise<boolean> }).validateOnSubmit()
234
+ expect(isValid).toBe(false)
235
+ })
236
+
237
+ it('shows vuetify rule error when useVuetifyValidation is true', async () => {
238
+ const wrapper = mount(SyTextArea, {
239
+ props: {
240
+ modelValue: '',
241
+ label: 'Description des symptomes',
242
+ useVuetifyValidation: true,
243
+ rules: [
244
+ (value: string) => value.includes('ok') || 'Erreur Vuetify personnalisée',
245
+ ],
246
+ },
247
+ })
248
+
249
+ const textarea = wrapper.find('textarea')
250
+ await textarea.trigger('focus')
251
+ await textarea.setValue('test')
252
+ await textarea.trigger('blur')
253
+ await flushPromises()
254
+
255
+ expect(wrapper.text()).toContain('Erreur Vuetify personnalisée')
256
+ })
257
+
258
+ it('shows custom warning from customWarningRules in custom validation mode', async () => {
259
+ const wrapper = mount(SyTextArea, {
260
+ props: {
261
+ modelValue: '',
262
+ label: 'Description des symptomes',
263
+ isValidateOnBlur: false,
264
+ customRules: [
265
+ {
266
+ type: 'custom',
267
+ options: {
268
+ validate: () => true,
269
+ },
270
+ },
271
+ ],
272
+ customWarningRules: [
273
+ {
274
+ type: 'custom',
275
+ options: {
276
+ warningMessage: 'Avertissement personnalisé',
277
+ validate: () => false,
278
+ },
279
+ },
280
+ ],
281
+ },
282
+ })
283
+
284
+ const textarea = wrapper.find('textarea')
285
+ await textarea.trigger('focus')
286
+ await textarea.setValue('valeur')
287
+ await textarea.trigger('blur')
288
+ await flushPromises()
289
+
290
+ expect(wrapper.text()).toContain('Avertissement personnalisé')
291
+ })
292
+
293
+ it('shows custom success from customSuccessRules in custom validation mode', async () => {
294
+ const wrapper = mount(SyTextArea, {
295
+ props: {
296
+ modelValue: '',
297
+ label: 'Description des symptomes',
298
+ isValidateOnBlur: false,
299
+ customRules: [
300
+ {
301
+ type: 'custom',
302
+ options: {
303
+ validate: () => true,
304
+ },
305
+ },
306
+ ],
307
+ customSuccessRules: [
308
+ {
309
+ type: 'custom',
310
+ options: {
311
+ successMessage: 'Succès personnalisé',
312
+ validate: () => true,
313
+ },
314
+ },
315
+ ],
316
+ },
317
+ })
318
+
319
+ const textarea = wrapper.find('textarea')
320
+ await textarea.trigger('focus')
321
+ await textarea.setValue('valeur')
322
+ await textarea.trigger('blur')
323
+ await flushPromises()
324
+
325
+ expect(wrapper.text()).toContain('Succès personnalisé')
326
+ })
204
327
  })