@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
@@ -29,7 +29,7 @@ export const useDateValidation = (options: {
29
29
  // Fonctions de validation
30
30
  clearValidation: () => void
31
31
  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Règles personnalisées
32
- validateField: (value: any, rules?: any[], warningRules?: any[]) => ValidationResult
32
+ validateField: (value: any, rules?: any[], warningRules?: any[]) => ValidationResult | Promise<ValidationResult>
33
33
 
34
34
  // Références aux messages
35
35
  errors: Ref<string[]>
@@ -60,7 +60,7 @@ export const useDateValidation = (options: {
60
60
  * @param forceValidation - Force la validation même si isUpdatingFromInternal est vrai
61
61
  * @returns Résultat de la validation
62
62
  */
63
- const validateDates = (forceValidation = false): ValidationResult => {
63
+ const validateDates = (forceValidation = false): ValidationResult | Promise<ValidationResult> => {
64
64
  const currentCustomRules = unref(customRules)
65
65
  const currentCustomWarningRules = unref(customWarningRules)
66
66
 
@@ -152,64 +152,65 @@ export const useDateValidation = (options: {
152
152
  ? selectedDates.value.filter(Boolean) // Filtrer les valeurs null
153
153
  : [selectedDates.value]
154
154
 
155
- let isValid = true
156
-
157
- // Valider chaque date
158
- if (shouldDisplayErrors) {
159
- datesToValidate.forEach((date) => {
160
- if (!date) return // Ignorer les dates null
161
-
162
- const result = validateField(
163
- date,
164
- currentCustomRules,
165
- currentCustomWarningRules,
166
- )
167
- if (result.hasError) {
168
- isValid = false
169
- }
170
- })
155
+ const finalizeValidation = (isValid: boolean): ValidationResult => {
156
+ let finalIsValid = isValid
171
157
 
172
158
  // Vérifier la validité de la plage de dates si en mode plage
173
159
  if (displayRange && Array.isArray(selectedDates.value) && selectedDates.value.length >= 2) {
174
- // Récupérer les dates de début et de fin
175
160
  const startDate = selectedDates.value[0]
176
161
  const endDate = selectedDates.value[selectedDates.value.length - 1]
177
162
 
178
- // Vérifier si les deux dates sont présentes et si la plage est valide
179
163
  if (startDate && endDate && startDate.getTime() > endDate.getTime()) {
180
- // La date de fin est antérieure à la date de début
181
164
  const rangeError = DATE_PICKER_MESSAGES.ERROR_END_BEFORE_START
182
165
  if (!errors.value.includes(rangeError)) {
183
166
  errors.value.push(rangeError)
184
- isValid = false
167
+ finalIsValid = false
185
168
  }
186
169
  }
187
- // Utiliser également la validation du composable useDateRangeValidation
188
170
  else if (!currentRangeIsValid.value) {
189
171
  const rangeError = getRangeValidationError.value
190
172
  if (rangeError && !errors.value.includes(rangeError)) {
191
173
  errors.value.push(rangeError)
192
- isValid = false
174
+ finalIsValid = false
193
175
  }
194
176
  }
195
177
  }
196
178
 
197
- // Dédoublonner les messages (au cas où plusieurs dates auraient les mêmes messages)
198
179
  errors.value = [...new Set(errors.value)]
199
180
  warnings.value = [...new Set(warnings.value)]
200
181
  successes.value = [...new Set(successes.value)]
182
+
183
+ return {
184
+ hasError: !finalIsValid,
185
+ hasWarning: warnings.value.length > 0,
186
+ hasSuccess: successes.value.length > 0 && finalIsValid && warnings.value.length === 0,
187
+ state: {
188
+ errors: errors.value,
189
+ warnings: warnings.value,
190
+ successes: successes.value,
191
+ },
192
+ }
201
193
  }
202
194
 
203
- return {
204
- hasError: !isValid,
205
- hasWarning: warnings.value.length > 0,
206
- hasSuccess: successes.value.length > 0 && isValid && warnings.value.length === 0,
207
- state: {
208
- errors: errors.value,
209
- warnings: warnings.value,
210
- successes: successes.value,
211
- },
195
+ if (!shouldDisplayErrors) {
196
+ return finalizeValidation(true)
212
197
  }
198
+
199
+ const validationResults = datesToValidate
200
+ .filter(Boolean)
201
+ .map(date => validateField(date, currentCustomRules, currentCustomWarningRules))
202
+
203
+ if (validationResults.some(result => result instanceof Promise)) {
204
+ return Promise
205
+ .all(validationResults.map(result => Promise.resolve(result)))
206
+ .then((resolvedResults) => {
207
+ const hasError = resolvedResults.some(result => result.hasError)
208
+ return finalizeValidation(!hasError)
209
+ })
210
+ }
211
+
212
+ const hasError = (validationResults as ValidationResult[]).some(result => result.hasError)
213
+ return finalizeValidation(!hasError)
213
214
  }
214
215
 
215
216
  /**
@@ -217,7 +218,7 @@ export const useDateValidation = (options: {
217
218
  *
218
219
  * @returns Résultat de la validation
219
220
  */
220
- const validateOnSubmit = (): ValidationResult => {
221
+ const validateOnSubmit = (): ValidationResult | Promise<ValidationResult> => {
221
222
  return validateDates(true)
222
223
  }
223
224
 
@@ -28,7 +28,7 @@ export const useInputBlurHandler = (options: {
28
28
  parseDate: (dateStr: string, format: string) => Date | null
29
29
  formatDate: (date: Date, format: string) => string
30
30
  updateModel: (value: DateValue) => void
31
- validateManualInput: (value: string) => boolean
31
+ validateManualInput: (value: string) => boolean | Promise<boolean>
32
32
 
33
33
  // Émetteurs d'événements
34
34
  emitBlur: () => void
@@ -54,7 +54,7 @@ export const useInputBlurHandler = (options: {
54
54
  /**
55
55
  * Gère la perte de focus du champ de saisie de date
56
56
  */
57
- const handleInputBlur = () => {
57
+ const handleInputBlur = async () => {
58
58
  // Émettre l'événement blur
59
59
  emitBlur()
60
60
 
@@ -155,7 +155,7 @@ export const useInputBlurHandler = (options: {
155
155
  // Note: La vérification du type string a déjà été faite plus haut
156
156
  // et on retourne si ce n'est pas une chaîne, donc ici displayFormattedDate.value est forcément une chaîne
157
157
  if (displayFormattedDate.value) {
158
- validateManualInput(displayFormattedDate.value || '')
158
+ await Promise.resolve(validateManualInput(displayFormattedDate.value || ''))
159
159
  }
160
160
  }
161
161
 
@@ -31,7 +31,7 @@ export const useManualDateValidation = (options: {
31
31
  validateDateFormat: (dateStr: string) => { isValid: boolean, message: string }
32
32
  isDateComplete: (value: string) => boolean
33
33
  parseDate: (dateStr: string, format: string) => Date | null
34
- validateField: (value: unknown, rules?: CustomRule[], warningRules?: CustomRule[]) => ValidationResult
34
+ validateField: (value: unknown, rules?: CustomRule[], warningRules?: CustomRule[]) => ValidationResult | Promise<ValidationResult>
35
35
  }) => {
36
36
  const {
37
37
  format,
@@ -57,7 +57,7 @@ export const useManualDateValidation = (options: {
57
57
  * @param value - Chaîne de date à valider
58
58
  * @returns Booléen indiquant si la saisie est valide
59
59
  */
60
- const validateManualInput = (value: string): boolean => {
60
+ const validateManualInput = (value: string): boolean | Promise<boolean> => {
61
61
  // Réinitialiser la validation
62
62
  clearValidation()
63
63
 
@@ -129,6 +129,10 @@ export const useManualDateValidation = (options: {
129
129
  safeWarningRules,
130
130
  )
131
131
 
132
+ if (result instanceof Promise) {
133
+ return result.then(resolvedResult => !resolvedResult.hasError)
134
+ }
135
+
132
136
  return !result.hasError
133
137
  }
134
138
 
@@ -1,10 +1,78 @@
1
- import { Meta, Story } from '@storybook/addon-docs';
2
- import * as DiacriticPicker from '../DiacriticPicker.stories';
3
- import '@/stories/styles/shared.css';
1
+ import { Meta, Story } from '@storybook/blocks';
2
+ import * as DiacriticPickerStories from '../DiacriticPicker.stories';
3
+ import AccessibilityIcon from '@/common/imgs/accessibility-svgrepo-com.svg';
4
+ import {
5
+ AccessibilityGuideLayout,
6
+ CriteriaSection,
7
+ CriteriaCard,
8
+ DemoSection,
9
+ BestPracticesSection,
10
+ ResourcesSection,
11
+ AuditSection,
12
+ } from '@/stories/accessibility/AccessibilityGuideLayout.mdx';
4
13
 
5
- <Meta of={DiacriticPicker} />
14
+ <Meta of={DiacriticPickerStories} />
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="DiacriticPicker"
18
+ iconSrc={AccessibilityIcon}
19
+ apgHref="https://www.w3.org/WAI/ARIA/apg/patterns/dialogmodal/"
20
+ >
21
+ <CriteriaSection>
22
+ <CriteriaCard icon="🔍" title="Structure sémantique et rôles ARIA">
23
+ <ul>
24
+ <li><strong>Bouton déclencheur</strong> : Utilise <code>aria-controls</code> et <code>aria-haspopup="dialog"</code> pour indiquer la relation avec le dialogue.</li>
25
+ <li><strong>État du dialogue</strong> : <code>aria-expanded</code> reflète l'état d'ouverture/fermeture du dialogue.</li>
26
+ <li><strong>Rôle du dialogue</strong> : <code>role="dialog"</code> et <code>aria-modal="true"</code> sur le VDialog.</li>
27
+ <li><strong>Labellisation</strong> : <code>aria-labelledby</code> lie le dialogue au bouton déclencheur.</li>
28
+ <li><strong>Groupes de caractères</strong> : Utilisation de <code>role="group"</code> avec <code>aria-label</code> pour organiser les caractères minuscules et majuscules.</li>
29
+ </ul>
30
+ </CriteriaCard>
31
+
32
+ <CriteriaCard icon="⌨️" title="Navigation clavier et focus">
33
+ <ul>
34
+ <li><strong>Gestion du focus</strong> : Le focus retourne automatiquement au champ après insertion d'un caractère.</li>
35
+ <li><strong>Position du curseur</strong> : Maintien et restauration précise de la position du curseur après insertion.</li>
36
+ <li><strong>Focus trap</strong> : <code>retain-focus="false"</code> sur le VDialog.</li>
37
+ </ul>
38
+ </CriteriaCard>
39
+
40
+ <CriteriaCard icon="🎨" title="Styles et contrastes">
41
+ <ul>
42
+ <li><strong>Dialogue</strong> : Fond <code>grey-lighten-2</code> sur le VCard.</li>
43
+ <li><strong>Boutons du dialogue</strong> : Taille "small" avec classe <code>ma-1</code>.</li>
44
+ </ul>
45
+ </CriteriaCard>
46
+
47
+ <CriteriaCard icon="🔧" title="Accessibilité du champ associé">
48
+ <ul>
49
+ <li><strong>Labellisation automatique</strong> : Ajout de <code>aria-label</code> si le champ n'a ni <code>aria-label</code> ni <code>aria-labelledby</code>.</li>
50
+ <li><strong>Détection du champ</strong> : Recherche automatique des inputs/textarea dans le slot via <code>getNativeInput()</code>.</li>
51
+ <li><strong>Wrapper</strong> : Conteneur avec <code>role="textbox"</code> et <code>tabindex="0"</code>.</li>
52
+ </ul>
53
+ </CriteriaCard>
54
+ </CriteriaSection>
55
+
56
+ <DemoSection componentName="DiacriticPicker">
57
+ <Story of={DiacriticPickerStories.Default} />
58
+ </DemoSection>
59
+
60
+ <BestPracticesSection>
61
+ <ul>
62
+ <li>Fournissez un <code>inputAriaLabel</code> descriptif si le champ n'a pas de label visible.</li>
63
+ <li>Personnalisez <code>btnTitle</code> pour refléter les caractères utilisés.</li>
64
+ <li>Adaptez la liste des <code>diacritics</code> selon les besoins linguistiques.</li>
65
+ <li>Vérifiez que les caractères affichés dans <code>btnTitle</code> sont inclus dans la liste <code>diacritics</code>.</li>
66
+ </ul>
67
+ </BestPracticesSection>
68
+
69
+ <ResourcesSection>
70
+ <ul>
71
+ <li><a href="https://www.w3.org/WAI/ARIA/apg/patterns/dialogmodal/" target="_blank" rel="noopener noreferrer">Guide des pratiques WAI-ARIA : Dialogues modaux</a></li>
72
+ <li><a href="https://www.w3.org/WAI/WCAG21/Understanding/keyboard-operation.html" target="_blank" rel="noopener noreferrer">WCAG : Opération au clavier</a></li>
73
+ <li><a href="https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#7.1" target="_blank" rel="noopener noreferrer">RGAA : Consultation par navigation clavier</a></li>
74
+ <li><a href="https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#11.9" target="_blank" rel="noopener noreferrer">RGAA : Structuration de l'information</a></li>
75
+ <li><a href="https://www.w3.org/WAI/ARIA/apg/patterns/button/" target="_blank" rel="noopener noreferrer">Guide des pratiques WAI-ARIA : Boutons</a></li>
76
+ </ul>
77
+ </ResourcesSection>
78
+ </AccessibilityGuideLayout>
@@ -8,6 +8,8 @@ import SubHeader from '../SubHeader/SubHeader.vue'
8
8
  import UserMenuBtn from '../UserMenuBtn/UserMenuBtn.vue'
9
9
  import HeaderBar from './HeaderBar.vue'
10
10
  import SyIcon from '../Customs/SyIcon/SyIcon.vue'
11
+ import { useTheme } from 'vuetify'
12
+ import { addons } from '@storybook/manager-api'
11
13
 
12
14
  const meta = {
13
15
  title: 'Composants/Structure/HeaderBar',
@@ -805,12 +807,22 @@ export const AppendSlot: Story = {
805
807
  return {
806
808
  components: { HeaderBar },
807
809
  setup() {
808
- return { args }
810
+ const theme = useTheme()
811
+ const channel = addons.getChannel()
812
+ channel.on('storybook-theme-change', (theme) => {
813
+ theme.name.value = theme
814
+ })
815
+ return { args, HeaderBar, theme }
809
816
  },
810
817
  template: `
811
818
  <HeaderBar v-bind="args">
812
819
  <template #append>
813
- <div style="max-width: 1712px; margin: 0 auto; height: 26px; background-color: #0c419a;" class="pl-md-14 pl-4 text-white">
820
+ <div v-if="['ap', 'ap2026'].includes(theme.name.value)" style="max-width: 1712px; margin: 0 auto; min-height: 48px; background-color: #0084B2; display: flex; align-items: center; justify-content: center;" class="text-white">
821
+ <div>
822
+ TITRE DU SERVICE
823
+ </div>
824
+ </div>
825
+ <div v-else style="max-width: 1712px; margin: 0 auto; height: 26px; background-color: #0c419a;" class="pl-md-14 pl-4 text-white">
814
826
  <div>
815
827
  contenu
816
828
  </div>
@@ -1,17 +1,79 @@
1
- import { Meta, Story } from '@storybook/addon-docs';
2
- import * as Stories from '../Logo.stories.ts';
3
- import '@/stories/styles/shared.css';
1
+ import { Meta, Story } from '@storybook/blocks';
2
+ import * as LogoStories from '../Logo.stories';
3
+ import AccessibilityIcon from '@/common/imgs/accessibility-svgrepo-com.svg';
4
+ import {
5
+ AccessibilityGuideLayout,
6
+ CriteriaSection,
7
+ CriteriaCard,
8
+ DemoSection,
9
+ BestPracticesSection,
10
+ ResourcesSection,
11
+ AuditSection,
12
+ } from '@/stories/accessibility/AccessibilityGuideLayout.mdx';
4
13
 
5
- <Meta of={Stories} />
14
+ <Meta of={LogoStories} />
6
15
 
7
- <div className="header">
8
- <h1>Accessibilité</h1>
9
- </div>
16
+ <AccessibilityGuideLayout
17
+ componentName="Logo"
18
+ iconSrc={AccessibilityIcon}
19
+ >
20
+ <AuditSection>
21
+ <div>Rapport d'audit manuel : <a href="/audits/Logo.xlsx" style={{ color: '#0C41BD' }}>Voir le rapport</a></div>
22
+ <div style={{ color: 'grey', fontSize: '14px', marginTop: '0px' }}>
23
+ Aucune correction nécessaire.
24
+ </div>
25
+ </AuditSection>
26
+
27
+ <CriteriaSection>
28
+ <CriteriaCard icon="🏷️" title="Structure sémantique et rôles">
29
+ <ul>
30
+ <li><strong>Rôle image</strong> : Utilise <code>role="img"</code> sur l'élément SVG.</li>
31
+ <li><strong>Focus</strong> : <code>focusable="false"</code> pour éviter le focus sur le SVG.</li>
32
+ <li><strong>Labellisation</strong> : <code>aria-label</code> avec label calculé automatiquement ou personnalisé.</li>
33
+ <li><strong>Avatar</strong> : <code>aria-hidden="true"</code> quand <code>avatar=true</code>.</li>
34
+ <li><strong>Éléments décoratifs</strong> : <code>aria-hidden="true"</code> et <code>role="presentation"</code> sur les groupes de texte.</li>
35
+ </ul>
36
+ </CriteriaCard>
10
37
 
38
+ <CriteriaCard icon="📝" title="Gestion du label">
39
+ <ul>
40
+ <li><strong>Label personnalisé</strong> : Prop <code>ariaLabel</code> prioritaire sur le calcul automatique.</li>
41
+ <li><strong>Label avatar</strong> : Chaîne vide pour les avatars (illustration décorative).</li>
42
+ <li><strong>Label calculé</strong> : Construction dynamique avec organism, assurance maladie, signature selon les props.</li>
43
+ <li><strong>Risque pro</strong> : Label spécifique quand <code>risquePro=true</code>.</li>
44
+ </ul>
45
+ </CriteriaCard>
11
46
 
12
- <div class="mt-2">
13
- <p>Rapport d’audit manuel : <a href="/audits/Logo.xlsx" style={{ color:'#0C41BD' }}>Voir le rapport</a></p>
14
- <p style={{ color: 'grey', fontSize: '14px', marginTop: '0px' }}>Aucune correction nécéssaire.</p>
15
- </div>
47
+ <CriteriaCard icon="🎨" title="Styles et adaptation">
48
+ <ul>
49
+ <li><strong>Couleur</strong> : Adaptation automatique avec <code>dark</code> (blanc/sombre).</li>
50
+ <li><strong>Dimensions</strong> : Mapping selon taille et mode avatar.</li>
51
+ <li><strong>ViewBox</strong> : Ajustement dynamique selon les éléments affichés.</li>
52
+ </ul>
53
+ </CriteriaCard>
54
+ </CriteriaSection>
16
55
 
56
+ <DemoSection componentName="Logo">
57
+ <Story of={LogoStories.Default} />
58
+ </DemoSection>
17
59
 
60
+ <BestPracticesSection>
61
+ <ul>
62
+ <li>Utilisez <code>avatar=true</code> pour les logos décoratifs sans signification sémantique.</li>
63
+ <li>Fournissez un <code>ariaLabel</code> personnalisé pour les contextes spécifiques.</li>
64
+ <li>Adaptez la taille avec <code>size</code> selon le contexte d'utilisation.</li>
65
+ <li>Utilisez <code>dark=true</code> sur les fonds sombres pour maintenir le contraste.</li>
66
+ <li>Cachez la signature (<code>hideSignature</code>) dans les espaces contraints.</li>
67
+ <li>Cachez l'organisme (<code>hideOrganism</code>) si le contexte est déjà clair.</li>
68
+ </ul>
69
+ </BestPracticesSection>
70
+
71
+ <ResourcesSection>
72
+ <ul>
73
+ <li><a href="https://www.w3.org/WAI/WCAG21/Understanding/non-text-content.html" target="_blank" rel="noopener noreferrer">WCAG : Contenu non textuel</a></li>
74
+ <li><a href="https://www.w3.org/WAI/ARIA/apg/patterns/img/" target="_blank" rel="noopener noreferrer">Guide des pratiques WAI-ARIA : Images</a></li>
75
+ <li><a href="https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#1.2" target="_blank" rel="noopener noreferrer">RGAA : Images décoratives</a></li>
76
+ <li><a href="https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#1.3" target="_blank" rel="noopener noreferrer">RGAA : Images porteuses d'informations</a></li>
77
+ </ul>
78
+ </ResourcesSection>
79
+ </AccessibilityGuideLayout>
@@ -1,12 +1,88 @@
1
- import { Meta, Story } from '@storybook/addon-docs';
2
- import * as Stories from '../LogoBrandSection.stories.ts';
3
- import '@/stories/styles/shared.css';
1
+ import { Meta, Story } from '@storybook/blocks';
2
+ import * as LogoBrandSectionStories from '../LogoBrandSection.stories';
3
+ import AccessibilityIcon from '@/common/imgs/accessibility-svgrepo-com.svg';
4
+ import {
5
+ AccessibilityGuideLayout,
6
+ CriteriaSection,
7
+ CriteriaCard,
8
+ DemoSection,
9
+ BestPracticesSection,
10
+ ResourcesSection,
11
+ AuditSection,
12
+ } from '@/stories/accessibility/AccessibilityGuideLayout.mdx';
4
13
 
5
- <Meta of={Stories} />
14
+ <Meta of={LogoBrandSectionStories} />
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="LogoBrandSection"
18
+ iconSrc={AccessibilityIcon}
19
+ >
20
+ <AuditSection>
21
+ <div>Rapport d'audit manuel : <a href="/audits/LogoBrandSection.xlsx" style={{ color: '#0C41BD' }}>Voir le rapport</a></div>
22
+ <div style={{ color: 'grey', fontSize: '14px', marginTop: '0px' }}>
23
+ Aucune correction nécessaire.
24
+ </div>
25
+ </AuditSection>
26
+
27
+ <CriteriaSection>
28
+ <CriteriaCard icon="🔗" title="Liens et navigation">
29
+ <ul>
30
+ <li><strong>Composant dynamique</strong> : Détecte automatiquement <code>router-link</code>, <code>&lt;a&gt;</code> ou <code>&lt;div&gt;</code> selon <code>homeLink</code>.</li>
31
+ <li><strong>Label du lien principal</strong> : <code>ariaLabel</code> concaténé avec " Retour vers accueil du site".</li>
32
+ <li><strong>Label du logo secondaire</strong> : Calculé avec <code>homeLinkPrefix</code> et <code>alt</code> du logo.</li>
33
+ <li><strong>Lien secondaire</strong> : Uniquement pour les thèmes <code>ameli-pro</code> et <code>ameli</code>.</li>
34
+ </ul>
35
+ </CriteriaCard>
11
36
 
12
- <br />
37
+ <CriteriaCard icon="📝" title="Structure sémantique et titres">
38
+ <ul>
39
+ <li><strong>Titre principal</strong> : Utilise <code>SyHeading</code> avec <code>headingLevelTitle</code> (1-6).</li>
40
+ <li><strong>Sous-titre</strong> : Utilise <code>SyHeading</code> avec <code>headingLevelSubtitle</code> (1-4).</li>
41
+ <li><strong>Contenu conditionnel</strong> : Affichage du sous-titre uniquement si titre présent et non-mobile.</li>
42
+ <li><strong>Texte structuré</strong> : Support des titres avec <code>text</code> et <code>highlight</code>.</li>
43
+ </ul>
44
+ </CriteriaCard>
45
+
46
+ <CriteriaCard icon="🎨" title="Éléments décoratifs et styles">
47
+ <ul>
48
+ <li><strong>Séparateur SVG</strong> : <code>focusable="false"</code> et <code>aria-hidden="true"</code>.</li>
49
+ <li><strong>Couleur du séparateur</strong> : Adaptée selon le thème (secondaire, primaire, #cd545b).</li>
50
+ <li><strong>Dimensions adaptatives</strong> : Responsive selon <code>mobileVersion</code> et présence logo secondaire.</li>
51
+ <li><strong>Logo principal</strong> : Props transmises au composant Logo (avatar, taille, signature).</li>
52
+ </ul>
53
+ </CriteriaCard>
54
+
55
+ <CriteriaCard icon="🖼️" title="Images et logos secondaires">
56
+ <ul>
57
+ <li><strong>Logo secondaire</strong> : Balise <code>&lt;img&gt;</code> avec attribut <code>alt</code> descriptif.</li>
58
+ <li><strong>Mapping des thèmes</strong> : Association automatique du logo selon <code>secondaryLogoMapping</code>.</li>
59
+ <li><strong>Avatar conditionnel</strong> : Mode avatar si <code>reduceLogo</code> et logo secondaire présent.</li>
60
+ </ul>
61
+ </CriteriaCard>
62
+ </CriteriaSection>
63
+
64
+ <DemoSection componentName="LogoBrandSection">
65
+ <Story of={LogoBrandSectionStories.Default} />
66
+ </DemoSection>
67
+
68
+ <BestPracticesSection>
69
+ <ul>
70
+ <li>Fournissez toujours un <code>homeLink.ariaLabel</code> descriptif pour le lien vers l'accueil.</li>
71
+ <li>Choisissez des niveaux de titres cohérents avec la hiérarchie de votre page.</li>
72
+ <li>Utilisez <code>mobileVersion</code> pour adapter l'affichage sur petits écrans.</li>
73
+ <li>Activez <code>reduceLogo</code> dans les espaces contraints ou avec logo secondaire.</li>
74
+ <li>Vérifiez que les <code>serviceTitle</code> et <code>serviceSubTitle</code> sont pertinents pour le contexte.</li>
75
+ <li>Testez les différents thèmes pour vous assurer que les contrastes sont maintenus.</li>
76
+ </ul>
77
+ </BestPracticesSection>
78
+
79
+ <ResourcesSection>
80
+ <ul>
81
+ <li><a href="https://www.w3.org/WAI/WCAG21/Understanding/non-text-content.html" target="_blank" rel="noopener noreferrer">WCAG : Contenu non textuel</a></li>
82
+ <li><a href="https://www.w3.org/WAI/WCAG21/Understanding/headings-and-labels.html" target="_blank" rel="noopener noreferrer">WCAG : Titres et étiquettes</a></li>
83
+ <li><a href="https://www.w3.org/WAI/ARIA/apg/patterns/link/" target="_blank" rel="noopener noreferrer">Guide des pratiques WAI-ARIA : Liens</a></li>
84
+ <li><a href="https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#9.1" target="_blank" rel="noopener noreferrer">RGAA : Structuration de l'information</a></li>
85
+ <li><a href="https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#12.6" target="_blank" rel="noopener noreferrer">RGAA : Liens</a></li>
86
+ </ul>
87
+ </ResourcesSection>
88
+ </AccessibilityGuideLayout>
@@ -1,6 +1,6 @@
1
1
  import { describe, expect, it } from 'vitest'
2
2
  import LunarCalendar from '../LunarCalendar.vue'
3
- import { mount } from '@vue/test-utils'
3
+ import { flushPromises, mount } from '@vue/test-utils'
4
4
 
5
5
  describe('LunarCalendar', () => {
6
6
  it('renders correctly', () => {
@@ -56,6 +56,7 @@ describe('LunarCalendar', () => {
56
56
  const input = wrapper.find('input')
57
57
  await input.setValue('10/19/1995')
58
58
  await input.trigger('blur')
59
+ await flushPromises()
59
60
 
60
61
  expect(wrapper.html()).toContain('L\'année doit être supérieure ou égale à 1996.')
61
62
  })
@@ -72,6 +73,7 @@ describe('LunarCalendar', () => {
72
73
  const input = wrapper.find('input')
73
74
  await input.setValue('10/19/1995')
74
75
  await input.trigger('blur')
76
+ await flushPromises()
75
77
 
76
78
  expect(wrapper.html()).toContain('L\'année doit être inférieure ou égale à 1994.')
77
79
  })
@@ -20,13 +20,12 @@ export function useLunarCalendarValidation(
20
20
  )
21
21
 
22
22
  const validation = useValidation({
23
- customRules: rules.value,
24
23
  showSuccessMessages: successMessage !== undefined,
25
24
  fieldIdentifier: toValue(label),
26
25
  })
27
26
 
28
- function validateOnSubmit() {
29
- const result = validation.validateField(
27
+ async function validateOnSubmit() {
28
+ const result = await validation.validateField(
30
29
  modelValue.value,
31
30
  rules.value,
32
31
  )
@@ -36,8 +35,8 @@ export function useLunarCalendarValidation(
36
35
 
37
36
  useValidatable(validateOnSubmit, validation.clearValidation)
38
37
 
39
- function validate() {
40
- return validation.validateField(
38
+ async function validate() {
39
+ return await validation.validateField(
41
40
  modelValue.value,
42
41
  rules.value,
43
42
  )
@@ -1,4 +1,4 @@
1
- import { mount } from '@vue/test-utils'
1
+ import { flushPromises, mount } from '@vue/test-utils'
2
2
  import { describe, afterEach, expect, it, vi } from 'vitest'
3
3
  import MonthPicker from '../MonthPicker.vue'
4
4
  import { nextTick } from 'vue'
@@ -1238,6 +1238,7 @@ describe('mounthpicker', () => {
1238
1238
 
1239
1239
  const yearButton = wrapper.findComponent({ name: 'YearSelector' }).find('.year-2025')
1240
1240
  await yearButton.trigger('click')
1241
+ await flushPromises()
1241
1242
 
1242
1243
  expect(wrapper.find('.v-field--error').exists()).toBe(true)
1243
1244
  expect(wrapper.find('.v-input__details').text()).toBe('The year must be 2026 or later.')
@@ -2169,7 +2169,7 @@ exports[`mounthpicker > should open the menu when clicking on the input 1`] = `
2169
2169
  <div class="visual-picker-header">
2170
2170
  <div
2171
2171
  class="visual-picker-header__title"
2172
- id="v-3-title"
2172
+ id="v-4-title"
2173
2173
  >
2174
2174
  Sélectionner un mois
2175
2175
  </div>
@@ -2439,20 +2439,20 @@ exports[`mounthpicker > should render mounthpicker 1`] = `
2439
2439
  v-field-label
2440
2440
  v-label
2441
2441
  "
2442
- id="input-v-1-label"
2442
+ id="input-v-2-label"
2443
2443
  >
2444
2444
  <!---->
2445
2445
  Début du projet
2446
2446
  </label>
2447
2447
  <!---->
2448
2448
  <input
2449
- aria-describedby="input-v-1-messages"
2449
+ aria-describedby="input-v-2-messages"
2450
2450
  aria-label="Début du projet"
2451
- aria-labelledby="input-v-1-label"
2451
+ aria-labelledby="input-v-2-label"
2452
2452
  autocomplete="off"
2453
2453
  class="v-field__input"
2454
2454
  direction="horizontal"
2455
- id="input-v-1"
2455
+ id="input-v-2"
2456
2456
  size="1"
2457
2457
  title="Début du projet"
2458
2458
  type="text"
@@ -2477,7 +2477,7 @@ exports[`mounthpicker > should render mounthpicker 1`] = `
2477
2477
  v-field-label--floating
2478
2478
  v-label
2479
2479
  "
2480
- for="input-v-1"
2480
+ for="input-v-2"
2481
2481
  >
2482
2482
  <!---->
2483
2483
  Début du projet
@@ -2521,7 +2521,7 @@ exports[`mounthpicker > should render mounthpicker 1`] = `
2521
2521
  <div
2522
2522
  aria-live="polite"
2523
2523
  class="v-input__details"
2524
- id="input-v-1-messages"
2524
+ id="input-v-2-messages"
2525
2525
  role="alert"
2526
2526
  >
2527
2527
  <transition-group-stub
@@ -1332,6 +1332,10 @@ export const WithCustomLocale: Story = {
1332
1332
  required: true,
1333
1333
  showSuccessMessages: true,
1334
1334
  customLocale: {
1335
+ numberLabel: 'Numéro de sécurité sociale',
1336
+ keyLabel: 'Clé',
1337
+ numberHint: '',
1338
+ keyHint: '',
1335
1339
  errorRequiredNumber: 'Veuillez renseigner votre numéro de sécurité sociale (13 caractères).',
1336
1340
  errorInvalidNumber: 'Format NIR non reconnu, merci de vérifier.',
1337
1341
  errorRequiredKey: 'La clé (2 chiffres) est requise.',