@cnamts/synapse 1.0.23 → 1.0.25

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 (574) hide show
  1. package/README.md +27 -5
  2. package/dist/AutocompleteFilter-D7qBuCAP.js +114 -0
  3. package/dist/AutocompleteFilter-Df9i5mAl.cjs +1 -0
  4. package/dist/DateFilter-BJD6FMev.cjs +1 -0
  5. package/dist/{DateFilter-Dc-gSGwk.js → DateFilter-BitMWrMU.js} +1 -1
  6. package/dist/{NumberFilter-vP38Wp6j.js → NumberFilter-BTLUxw0a.js} +3 -3
  7. package/dist/NumberFilter-DGCzCXzI.cjs +1 -0
  8. package/dist/{PeriodFilter-Ba1uYUnT.js → PeriodFilter-B5rUIPAC.js} +1 -1
  9. package/dist/PeriodFilter-DO_ecTZW.cjs +1 -0
  10. package/dist/SelectFilter-CGwcKWLm.cjs +1 -0
  11. package/dist/SelectFilter-l4QnRcuk.js +135 -0
  12. package/dist/TextFilter-B8nf7xoK.cjs +1 -0
  13. package/dist/{TextFilter-B84dpnoq.js → TextFilter-C9hj6Qrp.js} +7 -7
  14. package/dist/apLightTheme-CEK4iY3f.cjs +1 -0
  15. package/dist/apLightTheme-DnIM24Lv.js +950 -0
  16. package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +7022 -9616
  17. package/dist/components/Amelipro/AmeliproCarousel/AmeliproCarousel.d.ts +2 -2
  18. package/dist/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.d.ts +2 -2
  19. package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.d.ts +40 -40
  20. package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.d.ts +60 -60
  21. package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +7168 -9762
  22. package/dist/components/Amelipro/AmeliproStepper/AmeliproStepper.d.ts +2 -2
  23. package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +7501 -10095
  24. package/dist/components/Amelipro/AmeliproTextArea/AmeliproTextArea.d.ts +21 -21
  25. package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +41 -41
  26. package/dist/components/Amelipro/StructureMenu/StructureTabs/StructureTabs.d.ts +2 -2
  27. package/dist/components/CookiesSelection/CookiesInformation/CookiesInformation.d.ts +20 -498
  28. package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +117 -151
  29. package/dist/components/Customs/Selects/SyInputSelect/SyInputSelect.d.ts +5 -5
  30. package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +12 -16
  31. package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +8 -8
  32. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +31 -506
  33. package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +28 -506
  34. package/dist/components/Customs/SyTabs/SyTabs.d.ts +13 -11
  35. package/dist/components/Customs/SyTextField/SyTextField.d.ts +69 -89
  36. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +627 -791
  37. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +315 -412
  38. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +112 -160
  39. package/dist/components/DatePicker/composables/index.d.ts +1 -0
  40. package/dist/components/DatePicker/composables/useDatePickerFocusTrap.d.ts +11 -0
  41. package/dist/components/DatePicker/composables/useDatePickerState.d.ts +1 -0
  42. package/dist/components/DatePicker/composables/useDateTextField.d.ts +4 -4
  43. package/dist/components/DatePicker/composables/useDateValidation.d.ts +3 -3
  44. package/dist/components/DatePicker/composables/useInputBlurHandler.d.ts +2 -2
  45. package/dist/components/DatePicker/composables/useManualDateValidation.d.ts +2 -2
  46. package/dist/components/FileList/FileList.d.ts +6 -0
  47. package/dist/components/FilterSideBar/FilterSideBar.d.ts +2 -0
  48. package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +17 -17
  49. package/dist/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.d.ts +3 -3
  50. package/dist/components/HeaderToolbar/HeaderToolbar.d.ts +20 -28
  51. package/dist/components/LunarCalendar/useLunarCalendarValidation.d.ts +3 -3
  52. package/dist/components/MonthPicker/MonthPicker.d.ts +86 -127
  53. package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +85 -126
  54. package/dist/components/NirField/NirField.d.ts +202 -278
  55. package/dist/components/NirField/locales.d.ts +10 -10
  56. package/dist/components/NirField/useNirValidation.d.ts +64 -0
  57. package/dist/components/PasswordField/PasswordField.d.ts +8 -9
  58. package/dist/components/PeriodField/PeriodField.d.ts +1352 -1680
  59. package/dist/components/PhoneField/PhoneField.d.ts +88 -129
  60. package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +12 -12
  61. package/dist/components/SyTextArea/SyTextArea.d.ts +34 -14
  62. package/dist/components/SyTextArea/useDefaultValidationRules.d.ts +11 -0
  63. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +10 -6
  64. package/dist/components/Tables/SyTable/SyTable.d.ts +10 -6
  65. package/dist/components/Tables/common/SyTableFilter.d.ts +2 -3
  66. package/dist/components/Tables/common/SyTablePagination.d.ts +19 -19
  67. package/dist/components/Tables/common/TableHeader.d.ts +5 -0
  68. package/dist/components/Tables/common/filters/AutocompleteFilter.d.ts +120 -0
  69. package/dist/components/Tables/common/filters/locales.d.ts +0 -1
  70. package/dist/components/Tables/common/locales.d.ts +3 -0
  71. package/dist/components/Tables/common/types.d.ts +21 -3
  72. package/dist/components/Tables/common/useClickableTableRow.d.ts +17 -0
  73. package/dist/components/Tables/common/usePagination.d.ts +3 -1
  74. package/dist/components/Tables/common/usePinnedColumns.d.ts +31 -0
  75. package/dist/components/Tables/common/useTableHeaders.d.ts +2 -0
  76. package/dist/components/Tables/common/useTableRowCheckboxAccessibility.d.ts +5 -0
  77. package/dist/components/UploadWorkflow/UploadWorkflow.d.ts +7 -6
  78. package/dist/composables/date/useDatePickerAccessibility.d.ts +1 -1
  79. package/dist/composables/rules/useFieldValidation.d.ts +4 -4
  80. package/dist/composables/unifyValidation/documentationValidationProps.d.ts +230 -0
  81. package/dist/composables/unifyValidation/useCustomValidation.d.ts +8 -0
  82. package/dist/composables/unifyValidation/useValidation.d.ts +102 -0
  83. package/dist/composables/unifyValidation/useVuetifyValidation.d.ts +18 -0
  84. package/dist/composables/useFormFieldErrorHandling.d.ts +2 -2
  85. package/dist/composables/validation/useFormValidation.d.ts +11 -2
  86. package/dist/composables/validation/useValidation.d.ts +19 -9
  87. package/dist/design-system-v3.d.ts +2 -0
  88. package/dist/design-system-v3.js +186 -187
  89. package/dist/design-system-v3.umd.cjs +1 -1066
  90. package/dist/designTokens/tokens/amelipro/apColors.d.ts +10 -10
  91. package/dist/designTokens/tokens/amelipro/apColors2026.d.ts +1 -2
  92. package/dist/designTokens/tokens/amelipro/apContextual.d.ts +44 -0
  93. package/dist/designTokens/tokens/amelipro/apSemantic.d.ts +1 -1
  94. package/dist/designTokens/tokens/baseColors.d.ts +127 -0
  95. package/dist/designTokens/tokens/baseContextualTokens.d.ts +50 -0
  96. package/dist/designTokens/tokens/cnam/cnamColors.d.ts +10 -10
  97. package/dist/designTokens/tokens/cnam/cnamSemantic.d.ts +1 -1
  98. package/dist/designTokens/tokens/pa/paColors.d.ts +1 -166
  99. package/dist/designTokens/tokens/pa/paSemantic.d.ts +1 -1
  100. package/dist/designTokens/utils/buildColorClassMap.d.ts +12 -0
  101. package/dist/designTokens/utils/createFlattenTheme.d.ts +1 -3
  102. package/dist/designTokens/utils/index.d.ts +2 -2
  103. package/dist/main-ByDPHpae.cjs +1067 -0
  104. package/dist/main-Cpx8Co6H.js +38869 -0
  105. package/dist/main.d.ts +0 -1
  106. package/dist/synapse.css +1 -0
  107. package/dist/tooth-11-D3sLWv2n.cjs +1 -0
  108. package/dist/tooth-12-CXrLuH03.cjs +1 -0
  109. package/dist/tooth-13-BSfo5fpT.cjs +1 -0
  110. package/dist/tooth-14-DMzulx0h.cjs +1 -0
  111. package/dist/tooth-15-BKRFVi-9.cjs +1 -0
  112. package/dist/tooth-16-CpuxAbuM.cjs +1 -0
  113. package/dist/tooth-17-BPoahUdg.cjs +1 -0
  114. package/dist/tooth-18-DhHJz8sy.cjs +1 -0
  115. package/dist/tooth-21-Dgd5hn_X.cjs +1 -0
  116. package/dist/tooth-22-C2Tn19sB.cjs +1 -0
  117. package/dist/tooth-23-C9uaaSGb.cjs +1 -0
  118. package/dist/tooth-24-BrK9UGpf.cjs +1 -0
  119. package/dist/tooth-25-CE_EfGNp.cjs +1 -0
  120. package/dist/tooth-26-Ctv4i9Fy.cjs +1 -0
  121. package/dist/tooth-27-C5J7JkWM.cjs +1 -0
  122. package/dist/tooth-28-Z9oWqjo0.cjs +1 -0
  123. package/dist/tooth-31-BrYqmkTi.cjs +1 -0
  124. package/dist/tooth-32-BNNR0oCZ.cjs +1 -0
  125. package/dist/tooth-33-DuxvqO2J.cjs +1 -0
  126. package/dist/tooth-34-BCSCXMB6.cjs +1 -0
  127. package/dist/tooth-35-BLUXkX88.cjs +1 -0
  128. package/dist/tooth-36-IrKHYqlA.cjs +1 -0
  129. package/dist/tooth-37-BYqpdMwo.cjs +1 -0
  130. package/dist/tooth-38-B_eNXXdu.cjs +1 -0
  131. package/dist/tooth-41-Ddva4Ot8.cjs +1 -0
  132. package/dist/tooth-42-szcDqlM0.cjs +1 -0
  133. package/dist/tooth-43-B3ka6rQm.cjs +1 -0
  134. package/dist/tooth-44-CazyQucj.cjs +1 -0
  135. package/dist/tooth-45-B4HQtc8n.cjs +1 -0
  136. package/dist/tooth-46-BPM40gbG.cjs +1 -0
  137. package/dist/tooth-47-Dvr20dlh.cjs +1 -0
  138. package/dist/tooth-48-Bd8ljGsF.cjs +1 -0
  139. package/dist/tooth-51-OBpwCOF3.cjs +1 -0
  140. package/dist/tooth-52-aKxyHcmq.cjs +1 -0
  141. package/dist/tooth-53-vCwJjTOc.cjs +1 -0
  142. package/dist/tooth-54-DsWu2iFy.cjs +1 -0
  143. package/dist/tooth-55-BxC1X2Dn.cjs +1 -0
  144. package/dist/tooth-61-BbLvxMQi.cjs +1 -0
  145. package/dist/tooth-62-CmTkWczP.cjs +1 -0
  146. package/dist/tooth-63-DI7l_2qI.cjs +1 -0
  147. package/dist/tooth-64-B21sOsJh.cjs +1 -0
  148. package/dist/tooth-65-D2ZC2VEr.cjs +1 -0
  149. package/dist/tooth-71-D473PPO5.cjs +1 -0
  150. package/dist/tooth-72-Drh1wnNu.cjs +1 -0
  151. package/dist/tooth-73-DzlwYI23.cjs +1 -0
  152. package/dist/tooth-74-8aGvcZPg.cjs +1 -0
  153. package/dist/tooth-75-BFK7At_r.cjs +1 -0
  154. package/dist/tooth-81-BZmR-I0M.cjs +1 -0
  155. package/dist/tooth-82-euVfUUZV.cjs +1 -0
  156. package/dist/tooth-83-KV010j64.cjs +1 -0
  157. package/dist/tooth-84-BBg1RjhZ.cjs +1 -0
  158. package/dist/tooth-85-Cr-kc1wM.cjs +1 -0
  159. package/dist/utils/functions/classToHex.d.ts +1 -1
  160. package/dist/utils/functions/createHexResolver.d.ts +16 -0
  161. package/dist/vuetifyConfig.js +522 -0
  162. package/dist/vuetifyConfig.umd.cjs +1 -0
  163. package/package.json +37 -20
  164. package/src/assets/amelipro/apTokens2026.scss +5 -5
  165. package/src/assets/overrides/_breakpoints.scss +25 -0
  166. package/src/assets/overrides/_btns.scss +0 -8
  167. package/src/assets/overrides/_forms.scss +1 -3
  168. package/src/assets/overrides/_icons.scss +14 -10
  169. package/src/assets/overrides/_otp.scss +41 -0
  170. package/src/assets/overrides/_tables.scss +11 -20
  171. package/src/assets/overrides/_tooltips.scss +17 -7
  172. package/src/assets/overrides/_typography.scss +35 -47
  173. package/src/assets/overrides/_utilities.scss +43 -47
  174. package/src/assets/themes.scss +1 -0
  175. package/src/components/Amelipro/AmeliproAccordion/AmeliproAccordionTemplate/AmeliproAccordionTemplate.vue +20 -20
  176. package/src/components/Amelipro/AmeliproAccordionFrieze/AmeliproAccordionFrieze.vue +12 -14
  177. package/src/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.vue +4 -6
  178. package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResultTemplate/AmeliproAccordionResultTemplate.vue +5 -5
  179. package/src/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.vue +4 -6
  180. package/src/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.vue +4 -6
  181. package/src/components/Amelipro/AmeliproAutoCompleteField/__tests__/__snapshots__/AmeliproAutoCompleteField.spec.ts.snap +2 -2
  182. package/src/components/Amelipro/AmeliproBadge/AmeliproBadge.vue +4 -6
  183. package/src/components/Amelipro/AmeliproBreadcrumb/AmeliproBreadcrumb.vue +1 -3
  184. package/src/components/Amelipro/AmeliproBtn/AmeliproBtn.vue +4 -6
  185. package/src/components/Amelipro/AmeliproCallback/AmeliproCallback.vue +2 -2
  186. package/src/components/Amelipro/AmeliproCard/AmeliproCard.vue +31 -31
  187. package/src/components/Amelipro/AmeliproCarousel/AmeliproCarousel.vue +5 -7
  188. package/src/components/Amelipro/AmeliproCheckbox/AmeliproCheckbox.vue +13 -15
  189. package/src/components/Amelipro/AmeliproCheckboxGroup/AmeliproCheckboxGroup.vue +23 -23
  190. package/src/components/Amelipro/AmeliproChips/AmeliproChips.vue +1 -3
  191. package/src/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.vue +17 -12
  192. package/src/components/Amelipro/AmeliproClickableTile/tests/__snapshots__/AmeliproClickableTile.spec.ts.snap +2 -2
  193. package/src/components/Amelipro/AmeliproCopyBtn/AmeliproCopyBtn.vue +4 -6
  194. package/src/components/Amelipro/AmeliproCustomSelector/AmeliproCustomSelector.vue +13 -13
  195. package/src/components/Amelipro/AmeliproDentalChart/AmeliproDentalChart.vue +4 -2
  196. package/src/components/Amelipro/AmeliproDentalChart/AmeliproTooth/AmeliproTooth.vue +4 -4
  197. package/src/components/Amelipro/AmeliproDialog/AmeliproDialog.vue +5 -7
  198. package/src/components/Amelipro/AmeliproDisclosure/AmeliproDisclosure.vue +1 -3
  199. package/src/components/Amelipro/AmeliproErrorTemplate/AmeliproErrorTemplate.vue +2 -4
  200. package/src/components/Amelipro/AmeliproFilePreview/AmeliproFilePreview.vue +4 -6
  201. package/src/components/Amelipro/AmeliproFilters/AmeliproFilters.vue +13 -13
  202. package/src/components/Amelipro/AmeliproFirstLogin/AmeliproFirstLogin.vue +3 -5
  203. package/src/components/Amelipro/AmeliproFooter/AmeliproFooter.vue +1 -3
  204. package/src/components/Amelipro/AmeliproHeader/AmeliproHeader.vue +2 -4
  205. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBar.vue +1 -3
  206. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/AmeliproHeaderBrandSection.vue +20 -16
  207. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/__tests__/__snapshots__/AmeliproHeaderBrandSection.spec.ts.snap +2 -2
  208. package/src/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.vue +2 -4
  209. package/src/components/Amelipro/AmeliproIllustratedDataTile/AmeliproIllustratedDataTile.vue +5 -7
  210. package/src/components/Amelipro/AmeliproIllustratedRadioGroup/AmeliproIllustratedRadioGroup.vue +6 -8
  211. package/src/components/Amelipro/AmeliproMailTile/AmeliproMailTile.vue +14 -14
  212. package/src/components/Amelipro/AmeliproMenu/AmeliproMenu.vue +11 -13
  213. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproDropdownMenu/AmeliproDropdownMenu.vue +2 -4
  214. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproMessagingLayout.vue +8 -8
  215. package/src/components/Amelipro/AmeliproMultipleFoldingCard/AmeliproMultipleFoldingCard.vue +40 -40
  216. package/src/components/Amelipro/AmeliproNumberedCard/AmeliproNumberedCard.vue +27 -27
  217. package/src/components/Amelipro/AmeliproOnboarding/AmeliproOnboarding.vue +3 -5
  218. package/src/components/Amelipro/AmeliproPageLayout/AmeliproPageLayout.vue +2 -4
  219. package/src/components/Amelipro/AmeliproPagination/AmeliproPagination.vue +2 -4
  220. package/src/components/Amelipro/AmeliproPagination/AmeliproPaginationBtn/AmeliproPaginationBtn.vue +3 -5
  221. package/src/components/Amelipro/AmeliproPatientBanner/AmeliproPatientBanner.vue +1 -3
  222. package/src/components/Amelipro/AmeliproPatientLogged/AmeliproPatientLogged.vue +2 -4
  223. package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLogin.vue +4 -4
  224. package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLoginForm/AmeliproPatientLoginForm.vue +1 -3
  225. package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.vue +3 -5
  226. package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.vue +3 -5
  227. package/src/components/Amelipro/AmeliproRadioGroup/AmeliproRadioGroup.vue +23 -23
  228. package/src/components/Amelipro/AmeliproResultList/AmeliproResultList.vue +4 -6
  229. package/src/components/Amelipro/AmeliproSelect/AmeliproSelect.vue +12 -22
  230. package/src/components/Amelipro/AmeliproStateTile/AmeliproStateTile.vue +10 -12
  231. package/src/components/Amelipro/AmeliproStepper/AmeliproStepper.vue +17 -17
  232. package/src/components/Amelipro/AmeliproTable/AmeliproTable.vue +8 -10
  233. package/src/components/Amelipro/AmeliproTabs/AmeliproTabBtn/AmeliproTabBtn.vue +6 -8
  234. package/src/components/Amelipro/AmeliproTabs/AmeliproTabs.vue +4 -4
  235. package/src/components/Amelipro/AmeliproTextArea/AmeliproTextArea.vue +4 -6
  236. package/src/components/Amelipro/AmeliproTextArea/__tests__/__snapshots__/AmeliproTextArea.spec.ts.snap +2 -2
  237. package/src/components/Amelipro/AmeliproTextField/AmeliproTextField.vue +7 -9
  238. package/src/components/Amelipro/AmeliproTileBtn/AmeliproTileBtn.vue +3 -5
  239. package/src/components/Amelipro/AmeliproTooltips/AmeliproTooltips.vue +0 -2
  240. package/src/components/Amelipro/AmeliproUpload/AmeliproUpload.vue +6 -6
  241. package/src/components/Amelipro/ServiceMenu/ServiceMenu.vue +2 -2
  242. package/src/components/Amelipro/StructureMenu/StructureBtn/StructureBtn.vue +4 -4
  243. package/src/components/Amelipro/StructureMenu/StructureItem/StructureItem.vue +4 -6
  244. package/src/components/Amelipro/StructureMenu/StructureMenu.vue +2 -2
  245. package/src/components/Amelipro/StructureMenu/StructureTabs/StructureTabs.vue +2 -2
  246. package/src/components/Amelipro/UserMenu/UserMenu.vue +1 -3
  247. package/src/components/BackBtn/tests/BackBtn.visual.cy.ts +43 -0
  248. package/src/components/BackBtn/tests/__snapshots__/back-btn-custom-bg.snap.png +0 -0
  249. package/src/components/BackBtn/tests/__snapshots__/back-btn-dark-mode.snap.png +0 -0
  250. package/src/components/BackBtn/tests/__snapshots__/back-btn-default.snap.png +0 -0
  251. package/src/components/BackBtn/tests/__snapshots__/back-btn-no-icon.snap.png +0 -0
  252. package/src/components/Captcha/Captcha.vue +1 -3
  253. package/src/components/Captcha/accessibilite/Accessibility.mdx +86 -8
  254. package/src/components/Captcha/tests/__snapshots__/Captcha.spec.ts.snap +12 -12
  255. package/src/components/ChipList/ChipList.stories.ts +0 -15
  256. package/src/components/ChipList/ChipList.vue +19 -17
  257. package/src/components/ChipList/accessibilite/Accessibility.mdx +83 -10
  258. package/src/components/ChipList/tests/ChipList.a11y.spec.ts +41 -0
  259. package/src/components/CookiesSelection/CookiesInformation/CookiesInformation.vue +0 -2
  260. package/src/components/CopyBtn/CopyBtn.vue +1 -3
  261. package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.vue +17 -17
  262. package/src/components/Customs/Selects/SelectBtnField/accessibilite/Accessibility.mdx +0 -9
  263. package/src/components/Customs/Selects/SelectBtnField/tests/SelectBtnField.spec.ts +31 -0
  264. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +66 -0
  265. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +28 -7
  266. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.a11y.spec.ts +18 -0
  267. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +209 -0
  268. package/src/components/Customs/Selects/SyAutocomplete/utils/ariaManager.ts +14 -10
  269. package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.stories.ts +4 -4
  270. package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.vue +12 -15
  271. package/src/components/Customs/Selects/SyInputSelect/tests/SyInputSelect.spec.ts +10 -10
  272. package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +1 -39
  273. package/src/components/Customs/Selects/SySelect/SySelect.vue +274 -71
  274. package/src/components/Customs/Selects/SySelect/accessibilite/Accessibility.mdx +199 -269
  275. package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +89 -0
  276. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +6 -9
  277. package/src/components/Customs/SyCheckbox/SyCheckbox.mdx +5 -0
  278. package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +10 -16
  279. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +45 -11
  280. package/src/components/Customs/SyCheckbox/accessibilite/Accessibility.mdx +53 -3
  281. package/src/components/Customs/SyCheckbox/tests/SyCheckbox.a11y.spec.ts +134 -2
  282. package/src/components/Customs/SyForm/SyForm.stories.ts +31 -5
  283. package/src/components/Customs/SyPagination/SyPagination.vue +0 -2
  284. package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +4 -7
  285. package/src/components/Customs/SyTabs/SyTabs.mdx +0 -58
  286. package/src/components/Customs/SyTabs/SyTabs.stories.ts +32 -33
  287. package/src/components/Customs/SyTabs/SyTabs.vue +87 -67
  288. package/src/components/Customs/SyTabs/accessibilite/Accessibility.mdx +83 -23
  289. package/src/components/Customs/SyTabs/tests/SyTabs.a11y.spec.ts +88 -0
  290. package/src/components/Customs/SyTabs/tests/SyTabs.spec.ts +46 -1
  291. package/src/components/Customs/SyTextField/SyTextField.mdx +1 -1
  292. package/src/components/Customs/SyTextField/SyTextField.stories.ts +50 -68
  293. package/src/components/Customs/SyTextField/SyTextField.vue +156 -161
  294. package/src/components/Customs/SyTextField/tests/SyTextField.a11y.spec.ts +32 -0
  295. package/src/components/Customs/SyTextField/tests/SyTextField.spec.ts +120 -11
  296. package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +62 -58
  297. package/src/components/DatePicker/CalendarMode/DatePicker.vue +342 -237
  298. package/src/components/DatePicker/CalendarMode/accessibilite/Accessibility.mdx +82 -0
  299. package/src/components/DatePicker/CalendarMode/tests/DatePicker.a11y.spec.ts +141 -0
  300. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +2 -56
  301. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +215 -175
  302. package/src/components/DatePicker/ComplexDatePicker/accessibilite/Accessibility.mdx +76 -0
  303. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +33 -10
  304. package/src/components/DatePicker/DatePickerValidationExample/CalendarMode.stories.ts +8 -8
  305. package/src/components/DatePicker/DatePickerValidationExample/ComplexDatePicker.stories.ts +106 -8
  306. package/src/components/DatePicker/DatePickerValidationExample/DateTextInput.stories.ts +12 -11
  307. package/src/components/DatePicker/DatePickerValidationExample/MultiMode.stories.ts +12 -12
  308. package/src/components/DatePicker/DateTextInput/DateRange.stories.ts +0 -12
  309. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +71 -67
  310. package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +3 -0
  311. package/src/components/DatePicker/DateTextInput/accessibilite/Accessibility.mdx +66 -0
  312. package/src/components/DatePicker/DateTextInput/tests/DateTextInput.spec.ts +52 -1
  313. package/src/components/DatePicker/composables/index.ts +1 -0
  314. package/src/components/DatePicker/composables/tests/useCalendarKeyboardNavigation.spec.ts +109 -65
  315. package/src/components/DatePicker/composables/tests/useDatePickerFocusTrap.spec.ts +138 -0
  316. package/src/components/DatePicker/composables/tests/useDatePickerState.spec.ts +53 -0
  317. package/src/components/DatePicker/composables/tests/useDateValidation.spec.ts +74 -18
  318. package/src/components/DatePicker/composables/tests/useInputBlurHandler.spec.ts +39 -0
  319. package/src/components/DatePicker/composables/tests/useManualDateValidation.spec.ts +91 -0
  320. package/src/components/DatePicker/composables/useCalendarKeyboardNavigation.ts +442 -36
  321. package/src/components/DatePicker/composables/useDatePickerFocusTrap.ts +92 -0
  322. package/src/components/DatePicker/composables/useDatePickerState.ts +24 -0
  323. package/src/components/DatePicker/composables/useDateTextField.ts +6 -6
  324. package/src/components/DatePicker/composables/useDateValidation.ts +36 -35
  325. package/src/components/DatePicker/composables/useInputBlurHandler.ts +3 -3
  326. package/src/components/DatePicker/composables/useManualDateValidation.ts +6 -2
  327. package/src/components/DatePicker/composables/useMonthButtonCustomization.ts +9 -8
  328. package/src/components/DatePicker/playground/DatePickerHolidayRule.vue +1 -1
  329. package/src/components/DiacriticPicker/accessibilite/Accessibility.mdx +76 -8
  330. package/src/components/DialogBox/DialogBox.vue +3 -5
  331. package/src/components/DialogBox/tests/DialogBox.visual.cy.ts +76 -0
  332. package/src/components/DialogBox/tests/__snapshots__/dialog-box-custom-texts.snap.png +0 -0
  333. package/src/components/DialogBox/tests/__snapshots__/dialog-box-default.snap.png +0 -0
  334. package/src/components/DialogBox/tests/__snapshots__/dialog-box-no-actions.snap.png +0 -0
  335. package/src/components/FileList/FileList.vue +9 -2
  336. package/src/components/FileList/UploadItem/UploadItem.vue +11 -13
  337. package/src/components/FileList/tests/FileList.spec.ts +47 -0
  338. package/src/components/FileUpload/FileUpload.vue +3 -5
  339. package/src/components/FileUpload/FileUploadContent.vue +3 -5
  340. package/src/components/FilterInline/FilterInline.vue +1 -3
  341. package/src/components/FilterSideBar/FilterSideBar.mdx +44 -1
  342. package/src/components/FilterSideBar/FilterSideBar.stories.ts +105 -1
  343. package/src/components/FilterSideBar/FilterSideBar.vue +7 -0
  344. package/src/components/FilterSideBar/tests/FilterSideBar.a11y.spec.ts +54 -1
  345. package/src/components/FilterSideBar/tests/FilterSideBar.spec.ts +42 -0
  346. package/src/components/FooterBar/FooterBar.vue +9 -13
  347. package/src/components/FranceConnectBtn/FranceConnectBtn.vue +1 -1
  348. package/src/components/HeaderBar/HeaderBar.stories.ts +14 -2
  349. package/src/components/HeaderBar/HeaderBar.vue +2 -3
  350. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderBurgerMenu.vue +2 -3
  351. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.vue +2 -3
  352. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuSection/HeaderMenuSection.vue +0 -1
  353. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.vue +8 -9
  354. package/src/components/HeaderBar/HeaderBurgerMenu/menu.scss +0 -8
  355. package/src/components/HeaderBar/HeaderBurgerMenu/tests/HeaderBurgerMenu.visual.cy.ts +196 -0
  356. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated-submenu-open.snap.png +0 -0
  357. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated.snap.png +0 -0
  358. package/src/components/HeaderBar/HeaderLogo/HeaderLogo.vue +0 -1
  359. package/src/components/HeaderBar/HeaderMenuBtn/HeaderMenuBtn.vue +6 -7
  360. package/src/components/HeaderBar/tests/HeaderBar.visual.cy.ts +81 -0
  361. package/src/components/HeaderBar/tests/__snapshots__/header-bar-custom-width.snap.png +0 -0
  362. package/src/components/HeaderBar/tests/__snapshots__/header-bar-default.snap.png +0 -0
  363. package/src/components/HeaderBar/tests/__snapshots__/header-bar-no-sticky.snap.png +0 -0
  364. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-prepend.snap.png +0 -0
  365. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-side.snap.png +0 -0
  366. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-subtitle.snap.png +0 -0
  367. package/src/components/HeaderNavigationBar/HeaderNavigationBar.vue +12 -3
  368. package/src/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.vue +15 -8
  369. package/src/components/HeaderToolbar/HeaderToolbar.vue +6 -7
  370. package/src/components/LangBtn/LangBtn.vue +2 -4
  371. package/src/components/Logo/accessibilite/Accessibility.mdx +73 -11
  372. package/src/components/Logo/tests/Logo.visual.cy.ts +57 -0
  373. package/src/components/Logo/tests/__snapshots__/logo-avatar.snap.png +0 -0
  374. package/src/components/Logo/tests/__snapshots__/logo-dark.snap.png +0 -0
  375. package/src/components/Logo/tests/__snapshots__/logo-default.snap.png +0 -0
  376. package/src/components/Logo/tests/__snapshots__/logo-no-organism.snap.png +0 -0
  377. package/src/components/Logo/tests/__snapshots__/logo-no-signature.snap.png +0 -0
  378. package/src/components/Logo/tests/__snapshots__/logo-risque-pro.snap.png +0 -0
  379. package/src/components/LogoBrandSection/LogoBrandSection.vue +2 -2
  380. package/src/components/LogoBrandSection/accessibilite/Accessibility.mdx +85 -9
  381. package/src/components/LunarCalendar/tests/LunarCalendar.spec.ts +3 -1
  382. package/src/components/LunarCalendar/useLunarCalendarValidation.ts +4 -5
  383. package/src/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.vue +1 -1
  384. package/src/components/MonthPicker/tests/MonthPicker.spec.ts +2 -1
  385. package/src/components/MonthPicker/tests/__snapshots__/MonthPicker.spec.ts.snap +7 -7
  386. package/src/components/NirField/NirField.stories.ts +6 -2
  387. package/src/components/NirField/NirField.vue +67 -265
  388. package/src/components/NirField/accessibilite/Accessibility.mdx +102 -7
  389. package/src/components/NirField/locales.ts +1 -1
  390. package/src/components/NirField/tests/NirField.spec.ts +124 -0
  391. package/src/components/NirField/tests/useNirValidation.spec.ts +449 -0
  392. package/src/components/NirField/useNirValidation.ts +277 -0
  393. package/src/components/NotificationBar/Notification/Notification.vue +5 -7
  394. package/src/components/NotificationBar/NotificationBar.vue +1 -3
  395. package/src/components/PaginatedTable/PaginatedTable.vue +2 -3
  396. package/src/components/PaginatedTable/Pagination.vue +3 -5
  397. package/src/components/PasswordField/PasswordField.stories.ts +4 -4
  398. package/src/components/PasswordField/PasswordField.vue +26 -34
  399. package/src/components/PasswordField/tests/PasswordField.spec.ts +6 -3
  400. package/src/components/PeriodField/PeriodField.stories.ts +4 -4
  401. package/src/components/PeriodField/PeriodField.vue +57 -57
  402. package/src/components/PeriodField/__tests__/PeriodField.async.spec.ts +32 -0
  403. package/src/components/PeriodField/accessibilite/Accessibility.mdx +68 -8
  404. package/src/components/PeriodField/tests/PeriodField.spec.ts +28 -2
  405. package/src/components/PhoneField/PhoneField.vue +8 -9
  406. package/src/components/PhoneField/tests/PhoneField.spec.ts +1 -0
  407. package/src/components/RangeField/RangeField.vue +6 -0
  408. package/src/components/RangeField/RangeSlider/RangeSlider.vue +0 -2
  409. package/src/components/RangeField/RangeSlider/Tooltip/Tooltip.vue +1 -1
  410. package/src/components/RangeField/tests/RangeField.visual.cy.ts +65 -0
  411. package/src/components/RangeField/tests/__snapshots__/range-field-custom-bg.snap.png +0 -0
  412. package/src/components/RangeField/tests/__snapshots__/range-field-custom-range.snap.png +0 -0
  413. package/src/components/RangeField/tests/__snapshots__/range-field-default.snap.png +0 -0
  414. package/src/components/RangeField/tests/__snapshots__/range-field-step.snap.png +0 -0
  415. package/src/components/RangeField/tests/__snapshots__/range-field-with-label.snap.png +0 -0
  416. package/src/components/RatingPicker/EmotionPicker/EmotionPicker.vue +6 -8
  417. package/src/components/RatingPicker/StarsPicker/StarsPicker.vue +3 -5
  418. package/src/components/SearchListField/SearchListField.vue +0 -2
  419. package/src/components/SkipLink/SkipLink.vue +2 -4
  420. package/src/components/SocialMediaLinks/SocialMediaLinks.vue +6 -6
  421. package/src/components/SubHeader/SubHeader.vue +1 -1
  422. package/src/components/SyAlert/SyAlert.vue +7 -9
  423. package/src/components/SyAlert/tests/SyAlert.visual.cy.ts +46 -0
  424. package/src/components/SyAlert/tests/__snapshots__/sy-alert-closable.snap.png +0 -0
  425. package/src/components/SyAlert/tests/__snapshots__/sy-alert-error.snap.png +0 -0
  426. package/src/components/SyAlert/tests/__snapshots__/sy-alert-info.snap.png +0 -0
  427. package/src/components/SyAlert/tests/__snapshots__/sy-alert-success.snap.png +0 -0
  428. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-outlined.snap.png +0 -0
  429. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-tonal.snap.png +0 -0
  430. package/src/components/SyAlert/tests/__snapshots__/sy-alert-warning.snap.png +0 -0
  431. package/src/components/SyBtnMenu/SyBtnMenu.vue +2 -4
  432. package/src/components/SyTextArea/SyTextArea.stories.ts +138 -2
  433. package/src/components/SyTextArea/SyTextArea.vue +53 -23
  434. package/src/components/SyTextArea/tests/SyTextArea.spec.ts +126 -3
  435. package/src/components/SyTextArea/useDefaultValidationRules.ts +74 -0
  436. package/src/components/TableToolbar/TableToolbar.vue +6 -8
  437. package/src/components/Tables/SyServerTable/SyServerTable.mdx +25 -0
  438. package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +839 -1
  439. package/src/components/Tables/SyServerTable/SyServerTable.vue +154 -95
  440. package/src/components/Tables/SyServerTable/tests/SyServerTable.a11y.spec.ts +81 -0
  441. package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +390 -0
  442. package/src/components/Tables/SyTable/SyTable.mdx +25 -0
  443. package/src/components/Tables/SyTable/SyTable.stories.ts +556 -1
  444. package/src/components/Tables/SyTable/SyTable.vue +136 -60
  445. package/src/components/Tables/SyTable/tests/SyTable.a11y.spec.ts +79 -0
  446. package/src/components/Tables/SyTable/tests/SyTable.spec.ts +382 -0
  447. package/src/components/Tables/common/SyTableFilter.vue +49 -4
  448. package/src/components/Tables/common/SyTablePagination.vue +142 -19
  449. package/src/components/Tables/common/TableHeader.vue +45 -4
  450. package/src/components/Tables/common/filters/AutocompleteFilter.vue +160 -0
  451. package/src/components/Tables/common/filters/NumberFilter.vue +1 -1
  452. package/src/components/Tables/common/filters/SelectFilter.vue +11 -12
  453. package/src/components/Tables/common/filters/TextFilter.vue +1 -1
  454. package/src/components/Tables/common/filters/getFilterComponent.ts +8 -1
  455. package/src/components/Tables/common/filters/locales.ts +0 -1
  456. package/src/components/Tables/common/filters/tests/AutocompleteFilter.a11y.spec.ts +110 -0
  457. package/src/components/Tables/common/filters/tests/AutocompleteFilter.spec.ts +203 -0
  458. package/src/components/Tables/common/filters/tests/SelectFilter.a11y.spec.ts +104 -0
  459. package/src/components/Tables/common/filters/tests/SelectFilter.spec.ts +152 -16
  460. package/src/components/Tables/common/locales.ts +3 -0
  461. package/src/components/Tables/common/tableFilterUtils.ts +3 -0
  462. package/src/components/Tables/common/tableStyles.scss +60 -19
  463. package/src/components/Tables/common/tests/SyTablePagination.spec.ts +18 -0
  464. package/src/components/Tables/common/tests/TableHeader.spec.ts +39 -0
  465. package/src/components/Tables/common/tests/filterByRange.spec.ts +2 -1
  466. package/src/components/Tables/common/types.ts +15 -4
  467. package/src/components/Tables/common/useClickableTableRow.ts +103 -0
  468. package/src/components/Tables/common/usePagination.ts +13 -0
  469. package/src/components/Tables/common/usePinnedColumns.ts +237 -0
  470. package/src/components/Tables/common/useTableHeaders.ts +52 -30
  471. package/src/components/Tables/common/useTableRowCheckboxAccessibility.ts +41 -0
  472. package/src/components/UploadWorkflow/UploadWorkflow.vue +1 -0
  473. package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +23 -0
  474. package/src/components/UploadWorkflow/tests/__snapshots__/UploadWorkflow.spec.ts.snap +66 -0
  475. package/src/components/UploadWorkflow/useFileList.ts +3 -0
  476. package/src/components/UserMenuBtn/UserMenuBtn.vue +1 -3
  477. package/src/composables/date/tests/useDatePickerAccessibility.spec.ts +2 -6
  478. package/src/composables/date/useDatePickerAccessibility.ts +42 -207
  479. package/src/composables/rules/tests/useFieldValidation.spec.ts +120 -120
  480. package/src/composables/rules/useFieldValidation.ts +34 -17
  481. package/src/composables/unifyValidation/documentationValidationProps.ts +235 -0
  482. package/src/composables/unifyValidation/tests/useCustomValidation.spec.ts +601 -0
  483. package/src/composables/unifyValidation/tests/useValidation.spec.ts +2048 -0
  484. package/src/composables/unifyValidation/tests/useVuetifyValidation.spec.ts +184 -0
  485. package/src/composables/unifyValidation/useCustomValidation.ts +95 -0
  486. package/src/composables/unifyValidation/useValidation.ts +190 -0
  487. package/src/composables/unifyValidation/useVuetifyValidation.ts +54 -0
  488. package/src/composables/useFormFieldErrorHandling.ts +4 -7
  489. package/src/composables/validation/tests/useFormValidation.spec.ts +14 -0
  490. package/src/composables/validation/tests/useValidation.spec.ts +116 -21
  491. package/src/composables/validation/useFormValidation.ts +20 -13
  492. package/src/composables/validation/useValidatable.ts +8 -1
  493. package/src/composables/validation/useValidation.ts +151 -99
  494. package/src/composantsVuetify/Introduction.mdx +48 -0
  495. package/src/composantsVuetify/VBreadcrumbs/VBreadcrumbs.mdx +28 -0
  496. package/src/composantsVuetify/VBreadcrumbs/v-breadcrumbs.stories.ts +108 -0
  497. package/src/composantsVuetify/VBtn/VBtn.mdx +72 -0
  498. package/src/composantsVuetify/VBtn/v-btn.stories.ts +121 -0
  499. package/src/composantsVuetify/VOtpInput/VOtpInput.mdx +39 -0
  500. package/src/composantsVuetify/VOtpInput/v-otp-input.stories.ts +56 -0
  501. package/src/composantsVuetify/VSkeletonLoader/VSkeletonLoader.mdx +42 -0
  502. package/src/composantsVuetify/VSkeletonLoader/v-skeleton-loader.stories.ts +77 -0
  503. package/src/composantsVuetify/VSwitch/VSwitch.mdx +47 -0
  504. package/src/composantsVuetify/VSwitch/v-switch.stories.ts +166 -0
  505. package/src/composantsVuetify/VTooltip/VTooltip.mdx +32 -0
  506. package/src/composantsVuetify/VTooltip/v-tooltip.stories.ts +95 -0
  507. package/src/designTokens/tests/buildColorClassMap.spec.ts +31 -0
  508. package/src/designTokens/tests/generateScssTokens.spec.ts +12 -0
  509. package/src/designTokens/tests/themeUtils.spec.ts +53 -0
  510. package/src/designTokens/tokens/amelipro/apColors.ts +8 -130
  511. package/src/designTokens/tokens/amelipro/apColors2026.ts +3 -15
  512. package/src/designTokens/tokens/amelipro/apContextual.ts +55 -47
  513. package/src/designTokens/tokens/amelipro/apLightTheme.ts +1 -1
  514. package/src/designTokens/tokens/amelipro/apSemantic.ts +1 -1
  515. package/src/designTokens/tokens/baseColors.ts +129 -0
  516. package/src/designTokens/tokens/baseContextualTokens.ts +52 -0
  517. package/src/designTokens/tokens/cnam/cnamColors.ts +3 -125
  518. package/src/designTokens/tokens/cnam/cnamContextual.ts +4 -48
  519. package/src/designTokens/tokens/cnam/cnamLightTheme.ts +1 -1
  520. package/src/designTokens/tokens/cnam/cnamSemantic.ts +3 -3
  521. package/src/designTokens/tokens/pa/paColors.ts +2 -166
  522. package/src/designTokens/tokens/pa/paContextual.ts +3 -48
  523. package/src/designTokens/tokens/pa/paLightTheme.ts +1 -1
  524. package/src/designTokens/tokens/pa/paSemantic.ts +2 -2
  525. package/src/designTokens/utils/buildColorClassMap.ts +34 -0
  526. package/src/designTokens/utils/convertSemanticsToken.ts +8 -11
  527. package/src/designTokens/utils/createFlattenTheme.ts +15 -7
  528. package/src/designTokens/utils/index.ts +2 -2
  529. package/src/main.ts +0 -2
  530. package/src/stories/Accessibilite/AuditDesignSystem.mdx +0 -11
  531. package/src/stories/Accessibilite/DesignSystem/Avancement.mdx +433 -0
  532. package/src/stories/Accessibilite/DesignSystem/a11y-status.json +692 -0
  533. package/src/stories/Accessibilite/KitDePreAudit/Echantillonnage.mdx +8 -1
  534. package/src/stories/Accessibilite/KitDePreAudit/Introduction.mdx +51 -10
  535. package/src/stories/Accessibilite/KitDePreAudit/Outils/Introduction.mdx +16 -9
  536. package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +48 -58
  537. package/src/stories/Components/Components.stories.ts +113 -9
  538. package/src/stories/Demarrer/Accueil.stories.ts +3 -3
  539. package/src/stories/Demarrer/EnrichirLeDesignSystem.mdx +4 -9
  540. package/src/stories/Demarrer/EnrichirLeDesignSystem.stories.ts +28 -0
  541. package/src/stories/Demarrer/Releases.stories.ts +48 -5
  542. package/src/stories/DesignTokens/ColorDisplay.vue +6 -5
  543. package/src/stories/DesignTokens/ColorIntegrationExample.vue +2 -4
  544. package/src/stories/DesignTokens/colors.stories.ts +5 -6
  545. package/src/stories/GuideDuDev/Amelipro.mdx +15 -0
  546. package/src/stories/GuideDuDev/Amelipro.stories.ts +209 -0
  547. package/src/stories/GuideDuDev/CreateVuetifyInstance.mdx +95 -0
  548. package/src/stories/GuideDuDev/Theme.mdx +36 -26
  549. package/src/stories/GuideDuDev/moduleDeNotification.mdx +3 -2
  550. package/src/stories/GuideDuDev/vuetifyOptions.mdx +3 -3
  551. package/src/stories/styles/accessibility-guide.css +3 -3
  552. package/src/utils/functions/classToHex.ts +6 -34
  553. package/src/utils/functions/createHexResolver.ts +45 -0
  554. package/src/utils/functions/tests/classToHex.spec.ts +36 -0
  555. package/src/utils/functions/tests/convertToHex.spec.ts +31 -0
  556. package/src/utils/functions/tests/createHexResolver.spec.ts +66 -0
  557. package/src/utils/functions/tests/isCssColor.spec.ts +48 -0
  558. package/dist/SelectFilter-BioGT6Nn.js +0 -136
  559. package/dist/designTokens/utils/convertGaps.d.ts +0 -5
  560. package/dist/main-aLKwdMi1.js +0 -37886
  561. package/dist/style.css +0 -1
  562. package/src/assets/apTokens.scss +0 -343
  563. package/src/assets/overrides/_container.scss +0 -36
  564. package/src/assets/tokens.scss +0 -388
  565. package/src/components/DatePicker/Accessibilite.mdx +0 -14
  566. package/src/designTokens/apColors.md +0 -66
  567. package/src/designTokens/cnamColors.md +0 -193
  568. package/src/designTokens/paColors.md +0 -66
  569. package/src/designTokens/tokens/json/contextual-tokens.json +0 -156
  570. package/src/designTokens/tokens/json/primitives.json +0 -209
  571. package/src/designTokens/tokens/json/semantic.json +0 -120
  572. package/src/designTokens/utils/convertGaps.ts +0 -11
  573. package/src/stories/Accessibilite/Avancement/Avancement.mdx +0 -533
  574. package/src/stories/Accessibilite/Avancement/Avancement.stories.ts +0 -306
@@ -67,6 +67,7 @@ describe('NirField.vue', () => {
67
67
  })
68
68
 
69
69
  it('displays error message for invalid NIR length', async () => {
70
+ await wrapper.find('.number-field input').trigger('focus')
70
71
  await wrapper.find('.number-field input').setValue('123')
71
72
  await wrapper.vm.$nextTick()
72
73
  await wrapper.find('.number-field input').trigger('blur')
@@ -76,6 +77,7 @@ describe('NirField.vue', () => {
76
77
  })
77
78
 
78
79
  it('validates the NIR field successfully', async () => {
80
+ await wrapper.find('.number-field input').trigger('focus')
79
81
  await wrapper.find('.number-field input').setValue('2940375120005')
80
82
  await wrapper.vm.$nextTick()
81
83
  await wrapper.find('.number-field input').trigger('blur')
@@ -87,6 +89,7 @@ describe('NirField.vue', () => {
87
89
  it('displays error message for invalid key length', async () => {
88
90
  await wrapper.find('.number-field input').setValue('2940375120005')
89
91
  await wrapper.vm.$nextTick()
92
+ await wrapper.find('.key-field input').trigger('focus')
90
93
  await wrapper.find('.key-field input').setValue('1')
91
94
  await wrapper.vm.$nextTick()
92
95
  await wrapper.find('.key-field input').trigger('blur')
@@ -98,6 +101,7 @@ describe('NirField.vue', () => {
98
101
  it('validates the key field successfully', async () => {
99
102
  await wrapper.find('.number-field input').setValue('2940375120005')
100
103
  await wrapper.vm.$nextTick()
104
+ await wrapper.find('.key-field input').trigger('focus')
101
105
  await wrapper.find('.key-field input').setValue('91')
102
106
  await wrapper.vm.$nextTick()
103
107
  await wrapper.find('.key-field input').trigger('blur')
@@ -149,6 +153,7 @@ describe('NirField.vue', () => {
149
153
 
150
154
  const customWrapper = mount(NirField, {
151
155
  props: {
156
+ label: 'NIR Field with custom key validation',
152
157
  modelValue: undefined,
153
158
  customKeyRules,
154
159
  showSuccessMessages: true,
@@ -164,6 +169,7 @@ describe('NirField.vue', () => {
164
169
  const numberField = customWrapper.find('.number-field input')
165
170
  const keyField = customWrapper.find('.key-field input')
166
171
  await numberField.setValue('2940375120005')
172
+ await keyField.trigger('focus')
167
173
  await keyField.setValue('91')
168
174
  await keyField.trigger('blur')
169
175
  await customWrapper.vm.$nextTick()
@@ -365,6 +371,124 @@ describe('NirField.vue', () => {
365
371
  })
366
372
  })
367
373
 
374
+ describe('Configuration UI et UX', () => {
375
+ it('applies disabled state to both inputs', async () => {
376
+ await wrapper.setProps({ disabled: true })
377
+ await wrapper.vm.$nextTick()
378
+ await flushPromises()
379
+
380
+ const numberInput = wrapper.find('.number-field input')
381
+ const keyInput = wrapper.find('.key-field input')
382
+
383
+ expect(numberInput.attributes('disabled')).toBeDefined()
384
+ expect(keyInput.attributes('disabled')).toBeDefined()
385
+ })
386
+
387
+ it('applies readonly state to both inputs', async () => {
388
+ await wrapper.setProps({ readonly: true })
389
+ await wrapper.vm.$nextTick()
390
+ await flushPromises()
391
+
392
+ const numberInput = wrapper.find('.number-field input')
393
+ const keyInput = wrapper.find('.key-field input')
394
+
395
+ expect(numberInput.attributes('readonly')).toBeDefined()
396
+ expect(keyInput.attributes('readonly')).toBeDefined()
397
+ })
398
+
399
+ it('respects showSuccessMessages prop', async () => {
400
+ // Par défaut, showSuccessMessages = true
401
+ await wrapper.setProps({ showSuccessMessages: true })
402
+
403
+ // On ne peut pas tester facilement le DOM de VMessages dans ce contexte jsdom avec Vuetify
404
+ // On vérifie donc que la prop showSuccessMessages est bien transmise aux éléments enfants
405
+ // internes si applicable, ou que le comportement conditionnel est correctement câblé.
406
+ // La prop showSuccessMessages est utilisée dans v-show="numberValidation.hasSuccess.value && showSuccessMessages"
407
+
408
+ // Pour tester que Vue applique bien la condition, on vérifie l'état de notre wrapper
409
+ expect(wrapper.props('showSuccessMessages')).toBe(true)
410
+
411
+ // Avec showSuccessMessages = false
412
+ await wrapper.setProps({ showSuccessMessages: false })
413
+ await wrapper.vm.$nextTick()
414
+ await flushPromises()
415
+
416
+ expect(wrapper.props('showSuccessMessages')).toBe(false)
417
+
418
+ // On vérifie également que l'attribut est passé aux sous-composants s'ils l'utilisent
419
+ const textFields = wrapper.findAllComponents({ name: 'SyTextField' })
420
+ // SyTextField a showSuccessMessages false en dur dans NirField
421
+ expect(textFields[0]?.props('showSuccessMessages')).toBe(false)
422
+ })
423
+
424
+ it('respects disableErrorHandling prop', async () => {
425
+ await wrapper.setProps({ disableErrorHandling: true })
426
+
427
+ const numberField = wrapper.find('.number-field input')
428
+ await numberField.setValue('123') // Invalid NIR
429
+ await numberField.trigger('blur')
430
+ await wrapper.vm.$nextTick()
431
+ await flushPromises()
432
+
433
+ // La validation a lieu, mais disableErrorHandling est appliqué
434
+ const numberTextField = wrapper.findComponent({ name: 'SyTextField' })
435
+ expect(numberTextField.props('disableErrorHandling')).toBe(true)
436
+ })
437
+
438
+ it('renders tooltips correctly when provided', async () => {
439
+ const nirTooltip = 'Tooltip NIR'
440
+ const keyTooltip = 'Tooltip Clé'
441
+ await wrapper.setProps({
442
+ nirTooltip,
443
+ keyTooltip,
444
+ })
445
+ await wrapper.vm.$nextTick()
446
+ await flushPromises()
447
+
448
+ // Les tooltips sont passés aux SyTextField en tant que props 'appendTooltip' (par défaut)
449
+ const textFields = wrapper.findAllComponents({ name: 'SyTextField' })
450
+
451
+ expect(textFields[0]?.props('appendTooltip')).toBe(nirTooltip)
452
+ expect(textFields[1]?.props('appendTooltip')).toBe(keyTooltip)
453
+ })
454
+
455
+ it('renders asterisks correctly when displayAsterisk is true AND required is true', async () => {
456
+ // L'astérisque n'est affiché que si required = true ET displayAsterisk = true
457
+ await wrapper.setProps({ required: true, displayAsterisk: true, numberLabel: 'Numéro', keyLabel: 'Clé' })
458
+ await wrapper.vm.$nextTick()
459
+ await flushPromises()
460
+
461
+ // Dans NirField.vue, l'astérisque est ajouté directement à la string 'label'
462
+ // transmise aux composants enfants
463
+ const textFields = wrapper.findAllComponents({ name: 'SyTextField' })
464
+ expect(textFields[0]?.props('label')).toBe('Numéro *')
465
+ expect(textFields[1]?.props('label')).toBe('Clé *')
466
+
467
+ // Si on désactive l'astérisque
468
+ await wrapper.setProps({ displayAsterisk: false })
469
+ await wrapper.vm.$nextTick()
470
+ await flushPromises()
471
+
472
+ expect(textFields[0]?.props('label')).toBe('Numéro')
473
+ expect(textFields[1]?.props('label')).toBe('Clé')
474
+ })
475
+
476
+ it('removes fieldset when withoutFieldset is true', async () => {
477
+ // Par défaut, le fieldset est présent quand displayKey est true
478
+ expect(wrapper.find('fieldset').exists()).toBe(true)
479
+
480
+ await wrapper.setProps({ withoutFieldset: true })
481
+ await wrapper.vm.$nextTick()
482
+ await flushPromises()
483
+
484
+ // Le fieldset ne doit plus être présent
485
+ expect(wrapper.find('fieldset').exists()).toBe(false)
486
+ // Mais les champs doivent toujours être là
487
+ expect(wrapper.find('.number-field').exists()).toBe(true)
488
+ expect(wrapper.find('.key-field').exists()).toBe(true)
489
+ })
490
+ })
491
+
368
492
  describe('Cursor position preservation when displayKey=false', () => {
369
493
  let wrapperWithoutKey: ReturnType<typeof mount<typeof NirField>>
370
494
 
@@ -0,0 +1,449 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'
2
+ import { mount } from '@vue/test-utils'
3
+ import NirField from '../NirField.vue'
4
+ import { locales } from '../locales'
5
+ import { useValidation } from '@/composables/unifyValidation/useValidation'
6
+
7
+ describe('useNirValidation via NirField component', () => {
8
+ let wrapper: ReturnType<typeof mount<typeof NirField & {
9
+ numberValidation: ReturnType<typeof useValidation>
10
+ keyValidation: ReturnType<typeof useValidation>
11
+ validateOnSubmit: () => Promise<boolean>
12
+ }>>
13
+ let activeWrappers: ReturnType<typeof mount>[] = []
14
+
15
+ async function flushPromises() {
16
+ return new Promise(resolve => setTimeout(resolve, 0))
17
+ }
18
+
19
+ const createWrapper = async (props = {}) => {
20
+ const w = mount(NirField, {
21
+ props: {
22
+ modelValue: undefined,
23
+ ...props,
24
+ },
25
+ })
26
+ activeWrappers.push(w)
27
+ await w.vm.$nextTick()
28
+ await flushPromises()
29
+ return w
30
+ }
31
+
32
+ beforeEach(() => {
33
+ activeWrappers = []
34
+ })
35
+
36
+ afterEach(async () => {
37
+ await flushPromises()
38
+ for (const w of activeWrappers) {
39
+ if (w && typeof w.unmount === 'function') {
40
+ w.unmount()
41
+ await flushPromises()
42
+ }
43
+ }
44
+ activeWrappers = []
45
+ })
46
+
47
+ it('ne devrait pas afficher d\'erreurs custom si useVuetifyValidation est vrai', async () => {
48
+ wrapper = await createWrapper({ useVuetifyValidation: true, required: true })
49
+
50
+ await wrapper.find('.number-field input').trigger('focus')
51
+ await wrapper.find('.number-field input').trigger('blur')
52
+ await wrapper.vm.$nextTick()
53
+ await flushPromises()
54
+
55
+ // Les règles custom ne sont pas appliquées, donc le système de validation custom ne remonte pas d'erreur
56
+ expect(wrapper.vm.numberValidation.errors.value).toEqual([])
57
+ })
58
+
59
+ it('devrait afficher une erreur required si le champ est vide et required est vrai', async () => {
60
+ wrapper = await createWrapper({ required: true })
61
+
62
+ await wrapper.find('.number-field input').trigger('focus')
63
+ await wrapper.find('.number-field input').trigger('blur')
64
+ await wrapper.vm.$nextTick()
65
+ await flushPromises()
66
+
67
+ expect(wrapper.vm.numberValidation.errors.value).toContain(locales.errorRequiredNumber)
68
+
69
+ await wrapper.find('.key-field input').trigger('focus')
70
+ await wrapper.find('.key-field input').trigger('blur')
71
+ await wrapper.vm.$nextTick()
72
+ await flushPromises()
73
+
74
+ expect(wrapper.vm.keyValidation.errors.value).toContain(locales.errorRequiredKey)
75
+ })
76
+
77
+ it('devrait valider correctement le NIR (valide et invalide)', async () => {
78
+ wrapper = await createWrapper()
79
+
80
+ const numberInput = wrapper.find('.number-field input')
81
+
82
+ // Test invalide (trop court)
83
+ await numberInput.trigger('focus')
84
+ await numberInput.setValue('123456789012')
85
+ await numberInput.trigger('blur')
86
+ await wrapper.vm.$nextTick()
87
+ await flushPromises()
88
+ expect(wrapper.vm.numberValidation.errors.value).toContain(locales.errorInvalidNumber)
89
+
90
+ // Test invalide (mauvais NIR - sexe 0 invalide)
91
+ await numberInput.trigger('focus')
92
+ await numberInput.setValue('0000000000000')
93
+ await numberInput.trigger('blur')
94
+ await wrapper.vm.$nextTick()
95
+ await flushPromises()
96
+ expect(wrapper.vm.numberValidation.errors.value).toContain(locales.errorInvalidNumber)
97
+
98
+ // Test valide
99
+ await numberInput.trigger('focus')
100
+ await numberInput.setValue('2940375120005')
101
+ await numberInput.trigger('blur')
102
+ await wrapper.vm.$nextTick()
103
+ await flushPromises()
104
+ expect(wrapper.vm.numberValidation.errors.value).toEqual([])
105
+ })
106
+
107
+ it('devrait valider correctement la clé', async () => {
108
+ wrapper = await createWrapper()
109
+
110
+ const numberInput = wrapper.find('.number-field input')
111
+ const keyInput = wrapper.find('.key-field input')
112
+
113
+ // Remplissons d'abord le NIR
114
+ await numberInput.setValue('2940375120005')
115
+ await wrapper.vm.$nextTick()
116
+ await flushPromises()
117
+
118
+ // Test clé invalide
119
+ await keyInput.trigger('focus')
120
+ await keyInput.setValue('90')
121
+ await keyInput.trigger('blur')
122
+ await wrapper.vm.$nextTick()
123
+ await flushPromises()
124
+ expect(wrapper.vm.keyValidation.errors.value).toContain(locales.errorInvalidKey)
125
+
126
+ // Test clé valide (clé attendue pour 2940375120005 est 91)
127
+ await keyInput.trigger('focus')
128
+ await keyInput.setValue('91')
129
+ await keyInput.trigger('blur')
130
+ await wrapper.vm.$nextTick()
131
+ await flushPromises()
132
+ expect(wrapper.vm.keyValidation.errors.value).toEqual([])
133
+ })
134
+
135
+ it('devrait appliquer la précédence des règles customNumberRules si customRulesPrecedence est vrai', async () => {
136
+ const customMessage = 'Erreur custom en premier'
137
+ const customRule1 = {
138
+ type: 'custom',
139
+ options: {
140
+ validate: () => customMessage,
141
+ message: customMessage,
142
+ },
143
+ }
144
+
145
+ wrapper = await createWrapper({
146
+ customRulesPrecedence: true,
147
+ customNumberRules: [customRule1],
148
+ })
149
+
150
+ const numberInput = wrapper.find('.number-field input')
151
+ await numberInput.trigger('focus')
152
+ await numberInput.setValue('0000000000000') // Valeur invalide selon checkNIR
153
+ await numberInput.trigger('blur')
154
+ await wrapper.vm.$nextTick()
155
+ await flushPromises()
156
+
157
+ // Comme la règle custom a la précédence, c'est son erreur qui s'affiche en premier
158
+ // (useValidation s'arrête à la première erreur)
159
+ expect(wrapper.vm.numberValidation.errors.value[0]).toBe(customMessage)
160
+ })
161
+
162
+ it('devrait appliquer les règles customNumberRules à la fin si customRulesPrecedence est faux', async () => {
163
+ const customMessage = 'Erreur custom en dernier'
164
+ const customRule1 = {
165
+ type: 'custom',
166
+ options: {
167
+ validate: () => customMessage,
168
+ message: customMessage,
169
+ },
170
+ }
171
+
172
+ wrapper = await createWrapper({
173
+ customRulesPrecedence: false,
174
+ customNumberRules: [customRule1],
175
+ })
176
+
177
+ const numberInput = wrapper.find('.number-field input')
178
+ await numberInput.trigger('focus')
179
+ await numberInput.setValue('0000000000000') // Valeur invalide selon checkNIR
180
+ await numberInput.trigger('blur')
181
+ await wrapper.vm.$nextTick()
182
+ await flushPromises()
183
+
184
+ // L'erreur par défaut checkNIR s'affiche en premier (useValidation s'arrête à la première)
185
+ expect(wrapper.vm.numberValidation.errors.value[0]).toBe(locales.errorInvalidNumber)
186
+ })
187
+
188
+ it('devrait utiliser customKeyRules et masquer la règle par défaut si elle a validate', async () => {
189
+ const customMessage = 'Clé custom invalide'
190
+ const customKeyRule = {
191
+ type: 'custom',
192
+ options: {
193
+ validate: () => customMessage,
194
+ message: customMessage,
195
+ },
196
+ }
197
+
198
+ wrapper = await createWrapper({
199
+ customKeyRules: [customKeyRule],
200
+ })
201
+
202
+ const keyInput = wrapper.find('.key-field input')
203
+ await keyInput.trigger('focus')
204
+ await keyInput.setValue('91')
205
+ await keyInput.trigger('blur')
206
+ await wrapper.vm.$nextTick()
207
+ await flushPromises()
208
+
209
+ // Seule la règle custom est appliquée (et elle retourne une erreur)
210
+ expect(wrapper.vm.keyValidation.errors.value[0]).toBe(customMessage)
211
+ })
212
+
213
+ it('devrait valider correctement les deux champs lors de l\'appel à validateOnSubmit()', async () => {
214
+ wrapper = await createWrapper()
215
+
216
+ // Set valid values
217
+ await wrapper.find('.number-field input').setValue('2940375120005')
218
+ await wrapper.find('.key-field input').setValue('91')
219
+ await wrapper.vm.$nextTick()
220
+ await flushPromises()
221
+
222
+ const isValid = await wrapper.vm.validateOnSubmit()
223
+ expect(isValid).toBe(true)
224
+
225
+ // Si on a des valeurs invalides
226
+ await wrapper.find('.key-field input').setValue('90')
227
+ await wrapper.vm.$nextTick()
228
+ await flushPromises()
229
+
230
+ const isInvalid = await wrapper.vm.validateOnSubmit()
231
+ expect(isInvalid).toBe(false)
232
+ })
233
+
234
+ it('devrait valider correctement un NIR avec un département corse (2A / 2B)', async () => {
235
+ wrapper = await createWrapper()
236
+
237
+ const numberInput = wrapper.find('.number-field input')
238
+ const keyInput = wrapper.find('.key-field input')
239
+
240
+ // Corsica suttana
241
+ // 1 90 01 2A 001 001 (remplace 2A par 19 -> 1900119001001)
242
+ // 1900119001001 % 97 = 41 -> Clé attendue: 97 - 41 = 56
243
+ await numberInput.trigger('focus')
244
+ await numberInput.setValue('190012A001001')
245
+ await numberInput.trigger('blur')
246
+
247
+ await keyInput.trigger('focus')
248
+ await keyInput.setValue('56')
249
+ await keyInput.trigger('blur')
250
+
251
+ await wrapper.vm.$nextTick()
252
+ await flushPromises()
253
+
254
+ expect(wrapper.vm.numberValidation.errors.value).toEqual([])
255
+ expect(wrapper.vm.keyValidation.errors.value).toEqual([])
256
+
257
+ // Corsica suprana
258
+ // 1 90 01 2B 001 001 (remplace 2B par 18 -> 1900118001001)
259
+ // 1900118001001 % 97 = 14 -> Clé attendue: 97 - 14 = 83
260
+ await numberInput.trigger('focus')
261
+ await numberInput.setValue('190012B001001')
262
+ await numberInput.trigger('blur')
263
+
264
+ await keyInput.trigger('focus')
265
+ await keyInput.setValue('83')
266
+ await keyInput.trigger('blur')
267
+
268
+ await wrapper.vm.$nextTick()
269
+ await flushPromises()
270
+
271
+ expect(wrapper.vm.numberValidation.errors.value).toEqual([])
272
+ expect(wrapper.vm.keyValidation.errors.value).toEqual([])
273
+ })
274
+
275
+ it('devrait appliquer des règles différentes selon le nirType (simple vs complexe)', async () => {
276
+ // Le mois '50' est valide pour 'simple' (accepte de 20 à 99 pour le mois)
277
+ // mais invalide pour 'complexe' (n'accepte que jusqu'à 42 pour les pseudo-mois)
278
+ // Format: S AA MM DDD C C C
279
+ // Homme (1), 90, mois 50, corse 2A, 001, 001
280
+ const invalidComplexNir = '190502A001001'
281
+
282
+ // Par défaut, nirType est 'simple' donc le NIR doit être valide
283
+ wrapper = await createWrapper()
284
+ let numberInput = wrapper.find('.number-field input')
285
+
286
+ await numberInput.trigger('focus')
287
+ await numberInput.setValue(invalidComplexNir)
288
+ await numberInput.trigger('blur')
289
+ await wrapper.vm.$nextTick()
290
+ await flushPromises()
291
+
292
+ expect(wrapper.vm.numberValidation.errors.value).toEqual([])
293
+
294
+ // On change le type à 'complexe', le NIR devient invalide
295
+ wrapper = await createWrapper({ nirType: 'complexe' })
296
+ numberInput = wrapper.find('.number-field input')
297
+
298
+ await numberInput.trigger('focus')
299
+ await numberInput.setValue(invalidComplexNir)
300
+ await numberInput.trigger('blur')
301
+ await wrapper.vm.$nextTick()
302
+ await flushPromises()
303
+
304
+ expect(wrapper.vm.numberValidation.errors.value).toContain(locales.errorInvalidNumber)
305
+ })
306
+
307
+ it('ne devrait appliquer les customWarningRules que si la longueur est complète', async () => {
308
+ const numberWarning = 'Attention numéro'
309
+ const keyWarning = 'Attention clé'
310
+
311
+ wrapper = await createWrapper({
312
+ customNumberWarningRules: [{ type: 'custom', options: { validate: () => numberWarning, message: numberWarning } }],
313
+ customKeyWarningRules: [{ type: 'custom', options: { validate: () => keyWarning, message: keyWarning } }],
314
+ })
315
+
316
+ const numberInput = wrapper.find('.number-field input')
317
+ const keyInput = wrapper.find('.key-field input')
318
+
319
+ // Saisie partielle du numéro
320
+ await numberInput.trigger('focus')
321
+ await numberInput.setValue('123456789012') // 12 caractères
322
+ await numberInput.trigger('blur')
323
+ await wrapper.vm.$nextTick()
324
+ await flushPromises()
325
+
326
+ // Le warning n'est pas appliqué car < 13 caractères
327
+ expect(wrapper.vm.numberValidation.warnings.value).toEqual([])
328
+
329
+ // Saisie complète du numéro
330
+ await numberInput.trigger('focus')
331
+ await numberInput.setValue('1234567890123') // 13 caractères
332
+ await numberInput.trigger('blur')
333
+ await wrapper.vm.$nextTick()
334
+ await flushPromises()
335
+
336
+ expect(wrapper.vm.numberValidation.warnings.value).toContain(numberWarning)
337
+
338
+ // Saisie partielle de la clé
339
+ await keyInput.trigger('focus')
340
+ await keyInput.setValue('9') // 1 caractère
341
+ await keyInput.trigger('blur')
342
+ await wrapper.vm.$nextTick()
343
+ await flushPromises()
344
+
345
+ // Le warning n'est pas appliqué car < 2 caractères
346
+ expect(wrapper.vm.keyValidation.warnings.value).toEqual([])
347
+
348
+ // Saisie complète de la clé (le numéro doit être aussi complet pour valider la clé et déclencher le watch)
349
+ await numberInput.trigger('focus')
350
+ await numberInput.setValue('2940375120005') // on s'assure d'avoir un NIR valide
351
+ await numberInput.trigger('blur')
352
+ await wrapper.vm.$nextTick()
353
+ await flushPromises()
354
+
355
+ await keyInput.trigger('focus')
356
+ await keyInput.setValue('91') // 2 caractères (clé valide)
357
+ await keyInput.trigger('blur')
358
+ await wrapper.vm.$nextTick()
359
+ await flushPromises()
360
+
361
+ // Validation explicite pour forcer l'évaluation
362
+ await wrapper.vm.keyValidation.validate()
363
+ await wrapper.vm.$nextTick()
364
+ await flushPromises()
365
+
366
+ expect(wrapper.vm.keyValidation.warnings.value).toContain(keyWarning)
367
+ })
368
+
369
+ it('devrait mettre le focus sur le champ en erreur lors d\'une validation globale', async () => {
370
+ wrapper = await createWrapper({ required: true })
371
+
372
+ // Espionner le focus sur les inputs natifs
373
+ const numberInputEl = wrapper.find('.number-field input').element as HTMLInputElement
374
+ const keyInputEl = wrapper.find('.key-field input').element as HTMLInputElement
375
+
376
+ const numberFocusSpy = vi.spyOn(numberInputEl, 'focus')
377
+ const keyFocusSpy = vi.spyOn(keyInputEl, 'focus')
378
+
379
+ // Les champs sont vides, donc number sera en erreur en premier
380
+ await wrapper.vm.validateOnSubmit()
381
+ await wrapper.vm.$nextTick()
382
+ await flushPromises()
383
+
384
+ expect(numberFocusSpy).toHaveBeenCalled()
385
+ expect(keyFocusSpy).not.toHaveBeenCalled()
386
+
387
+ // On remplit le NIR mais la clé est vide (ou invalide)
388
+ numberFocusSpy.mockClear()
389
+ keyFocusSpy.mockClear()
390
+
391
+ await wrapper.find('.number-field input').setValue('2940375120005')
392
+ await wrapper.vm.$nextTick()
393
+ await flushPromises()
394
+
395
+ await wrapper.vm.validateOnSubmit()
396
+ await wrapper.vm.$nextTick()
397
+ await flushPromises()
398
+
399
+ expect(numberFocusSpy).not.toHaveBeenCalled()
400
+ expect(keyFocusSpy).toHaveBeenCalled()
401
+ })
402
+
403
+ it('ne devrait pas valider la clé lorsque displayKey est à false', async () => {
404
+ wrapper = await createWrapper({ displayKey: false, required: true })
405
+
406
+ const numberInput = wrapper.find('.number-field input')
407
+
408
+ // Saisir un NIR valide
409
+ await numberInput.trigger('focus')
410
+ await numberInput.setValue('2940375120005')
411
+ await numberInput.trigger('blur')
412
+ await wrapper.vm.$nextTick()
413
+ await flushPromises()
414
+
415
+ // Le champ numéro ne doit pas avoir d'erreur
416
+ expect(wrapper.vm.numberValidation.errors.value).toEqual([])
417
+
418
+ // La validation de la clé ne doit pas s'appliquer (pas de règles)
419
+ expect(wrapper.vm.keyValidation.errors.value).toEqual([])
420
+
421
+ // La validation globale doit réussir même sans clé
422
+ const isValid = await wrapper.vm.validateOnSubmit()
423
+ expect(isValid).toBe(true)
424
+
425
+ // hasFieldErrors doit être false car seule la validation du numéro compte
426
+ // On accède à hasFieldErrors via le composant car il est exposé par useNirValidation
427
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- deso
428
+ const componentInstance = wrapper.vm as any
429
+ expect(componentInstance.hasFieldErrors).toBe(false)
430
+ })
431
+
432
+ it('devrait ignorer les erreurs de clé lors de la validation globale lorsque displayKey est à false', async () => {
433
+ wrapper = await createWrapper({ displayKey: false })
434
+
435
+ const numberInput = wrapper.find('.number-field input')
436
+
437
+ // Saisir un NIR valide
438
+ await numberInput.trigger('focus')
439
+ await numberInput.setValue('2940375120005')
440
+ await numberInput.trigger('blur')
441
+ await wrapper.vm.$nextTick()
442
+ await flushPromises()
443
+
444
+ // Même si la clé n'est pas affichée, on vérifie que la validation globale ignore bien les erreurs de clé
445
+ // (simuler une erreur de clé qui ne devrait pas impacter la validation)
446
+ const isValid = await wrapper.vm.validateOnSubmit()
447
+ expect(isValid).toBe(true)
448
+ })
449
+ })