@cnamts/synapse 1.0.27 → 1.1.1

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 (621) hide show
  1. package/README.md +1 -1
  2. package/dist/{AutocompleteFilter-C9eLKyW8.js → AutocompleteFilter-CGF33skz.js} +3 -3
  3. package/dist/{DateFilter-y-GLkAkn.js → DateFilter-D7-MsKtx.js} +8 -8
  4. package/dist/{NumberFilter-DN6hIBS7.js → NumberFilter-bjQPPfsj.js} +1 -1
  5. package/dist/{PeriodFilter-MoUUp9qS.js → PeriodFilter-B3wJpK8-.js} +1 -1
  6. package/dist/{SelectFilter-bCbrdLmu.js → SelectFilter-BN6DbKAV.js} +1 -1
  7. package/dist/{TextFilter-CvjgEaoM.js → TextFilter-BffP0J2f.js} +4 -4
  8. package/dist/{apLightTheme2026-ug4Y23ns.js → apLightTheme2026-C4ygwMHC.js} +23 -22
  9. package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +10 -10
  10. package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.d.ts +4 -4
  11. package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.d.ts +6 -6
  12. package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +10 -10
  13. package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +10 -10
  14. package/dist/components/Amelipro/AmeliproTextArea/AmeliproTextArea.d.ts +4 -4
  15. package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +4 -4
  16. package/dist/components/Captcha/Captcha.d.ts +27 -16
  17. package/dist/components/Captcha/CaptchaForm.d.ts +29 -3
  18. package/dist/components/Captcha/types.d.ts +14 -0
  19. package/dist/components/Captcha/useCaptchaValidation.d.ts +37 -0
  20. package/dist/components/CookiesSelection/CookiesInformation/CookiesInformation.d.ts +2 -2
  21. package/dist/components/Customs/Selects/SelectBtnField/SelectBtnField.d.ts +33 -13
  22. package/dist/components/Customs/Selects/SelectBtnField/composables/useSelectBtnFieldValidation.d.ts +23 -0
  23. package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +85 -313
  24. package/dist/components/Customs/Selects/SyAutocomplete/composables/useSyAutocompleteValidation.d.ts +4 -4
  25. package/dist/components/Customs/Selects/SyInputSelect/SyInputSelect.d.ts +1 -1
  26. package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +9 -11
  27. package/dist/components/Customs/Selects/SySelect/composables/useSySelectValidation.d.ts +7 -7
  28. package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +18 -49
  29. package/dist/components/Customs/SyCheckBoxGroup/composables/useSyCheckBoxGroupValidation.d.ts +29 -0
  30. package/dist/components/Customs/SyCheckBoxGroup/types.d.ts +46 -0
  31. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +19 -54
  32. package/dist/components/Customs/SyCheckbox/composables/useSyCheckboxValidation.d.ts +27 -0
  33. package/dist/components/Customs/SyCheckbox/types.d.ts +49 -0
  34. package/dist/components/Customs/SyIcon/SyIcon.d.ts +77 -1
  35. package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +10 -10
  36. package/dist/components/Customs/SyTextField/FieldState.d.ts +5 -0
  37. package/dist/components/Customs/SyTextField/SyTextField.d.ts +19 -79
  38. package/dist/components/Customs/SyTextField/locales.d.ts +7 -0
  39. package/dist/components/Customs/SyTextField/types.d.ts +67 -4
  40. package/dist/components/Customs/SyTextField/useNumberField.d.ts +23 -0
  41. package/dist/components/Customs/SyTextField/useSyTextFieldValidation.d.ts +38 -0
  42. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +170 -622
  43. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +85 -311
  44. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +39 -152
  45. package/dist/components/DialogBox/DialogBox.d.ts +2 -0
  46. package/dist/components/DialogBox/locales.d.ts +1 -0
  47. package/dist/components/FilterInline/FilterInline.d.ts +3 -3
  48. package/dist/components/FilterSideBar/FilterSideBar.d.ts +8 -4
  49. package/dist/components/LunarCalendar/LunarCalendar.d.ts +43 -14
  50. package/dist/components/LunarCalendar/types.d.ts +35 -0
  51. package/dist/components/LunarCalendar/useLunarCalendarValidation.d.ts +11 -12
  52. package/dist/components/MonthPicker/MonthPicker.d.ts +72 -1860
  53. package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +21 -1846
  54. package/dist/components/MonthPicker/MonthPickerText/useTextField.d.ts +5 -0
  55. package/dist/components/MonthPicker/locales.d.ts +1 -0
  56. package/dist/components/MonthPicker/types.d.ts +11 -0
  57. package/dist/components/MonthPicker/useMonthPickerValidation.d.ts +37 -24
  58. package/dist/components/NirField/NirField.d.ts +96 -325
  59. package/dist/components/NirField/useNirValidation.d.ts +17 -25
  60. package/dist/components/PageContainer/PageContainer.d.ts +8 -0
  61. package/dist/components/PasswordField/PasswordField.d.ts +18 -37
  62. package/dist/components/PasswordField/locales.d.ts +2 -0
  63. package/dist/components/PasswordField/types.d.ts +16 -0
  64. package/dist/components/PasswordField/usePasswordFieldValidation.d.ts +38 -0
  65. package/dist/components/PeriodField/PeriodField.d.ts +349 -1253
  66. package/dist/components/PhoneField/PhoneField.d.ts +960 -2051
  67. package/dist/components/PhoneField/indicatifs.d.ts +715 -8
  68. package/dist/components/PhoneField/locales.d.ts +7 -0
  69. package/dist/components/PhoneField/types.d.ts +29 -0
  70. package/dist/components/PhoneField/usePhoneFieldValidation.d.ts +45 -0
  71. package/dist/components/PhoneField/usePhoneIndicatifs.d.ts +947 -0
  72. package/dist/components/SearchListField/SearchListField.d.ts +3 -3
  73. package/dist/components/SyTextArea/SyTextArea.d.ts +14 -11
  74. package/dist/components/SyTextArea/composables/useSyTextAreaValidation.d.ts +7 -7
  75. package/dist/components/Tables/common/SyTablePagination.d.ts +19 -20
  76. package/dist/composables/unifyValidation/documentationValidationProps.d.ts +2 -2
  77. package/dist/composables/unifyValidation/useValidation.d.ts +4 -13
  78. package/dist/composables/useFilterable/useFilterable.d.ts +1 -2
  79. package/dist/design-system-v3.js +19 -19
  80. package/dist/designTokens/tokens/amelipro/apLightTheme.d.ts +11 -10
  81. package/dist/designTokens/tokens/baseTokens.d.ts +18 -18
  82. package/dist/designTokens/tokens/cnam/cnamLightTheme.d.ts +10 -10
  83. package/dist/designTokens/tokens/pa/paLightTheme.d.ts +11 -10
  84. package/dist/designTokens/tokens/semanticTokens.d.ts +14 -14
  85. package/dist/{main-CI6Q9nmO.js → main-C4wAktOs.js} +14999 -14025
  86. package/dist/synapse.css +1 -1
  87. package/dist/vuetifyConfig.js +27 -25
  88. package/package.json +12 -11
  89. package/src/assets/compat/_legacy-tokens.scss +91 -0
  90. package/src/assets/overrides/_utilities.scss +23 -0
  91. package/src/components/Accordion/Accordion.stories.ts +121 -1
  92. package/src/components/Accordion/tests/Accordion.visual.cy.ts +44 -0
  93. package/src/components/Accordion/tests/__snapshots__/accordion-default.snap.png +0 -0
  94. package/src/components/Accordion/tests/__snapshots__/accordion-disabled-item.snap.png +0 -0
  95. package/src/components/Accordion/tests/__snapshots__/accordion-open-first.snap.png +0 -0
  96. package/src/components/BackBtn/BackBtn.mdx +1 -1
  97. package/src/components/BackBtn/tests/__snapshots__/back-btn-custom-bg.snap.png +0 -0
  98. package/src/components/BackBtn/tests/__snapshots__/back-btn-dark-mode.snap.png +0 -0
  99. package/src/components/BackBtn/tests/__snapshots__/back-btn-default.snap.png +0 -0
  100. package/src/components/BackBtn/tests/__snapshots__/back-btn-no-icon.snap.png +0 -0
  101. package/src/components/BackToTopBtn/BackToTopBtn.mdx +0 -1
  102. package/src/components/BackToTopBtn/tests/BackToTopBtn.visual.cy.ts +34 -0
  103. package/src/components/BackToTopBtn/tests/__snapshots__/back-to-top-btn-custom-nudge.snap.png +0 -0
  104. package/src/components/BackToTopBtn/tests/__snapshots__/back-to-top-btn-default.snap.png +0 -0
  105. package/src/components/Captcha/Captcha.stories.ts +134 -31
  106. package/src/components/Captcha/Captcha.vue +95 -28
  107. package/src/components/Captcha/CaptchaForm.vue +51 -22
  108. package/src/components/Captcha/tests/Captcha.focus.spec.ts +214 -0
  109. package/src/components/Captcha/tests/Captcha.spec.ts +233 -24
  110. package/src/components/Captcha/tests/Captcha.visual.cy.ts +45 -0
  111. package/src/components/Captcha/tests/CaptchaForm.spec.ts +82 -0
  112. package/src/components/Captcha/tests/__snapshots__/Captcha.spec.ts.snap +20 -42
  113. package/src/components/Captcha/tests/__snapshots__/captcha-audio-type.snap.png +0 -0
  114. package/src/components/Captcha/tests/__snapshots__/captcha-image-type.snap.png +0 -0
  115. package/src/components/Captcha/tests/__snapshots__/captcha-no-helpdesk.snap.png +0 -0
  116. package/src/components/Captcha/types.ts +15 -0
  117. package/src/components/Captcha/useCaptchaValidation.ts +87 -0
  118. package/src/components/Captcha/validation/validation.stories.ts +1194 -0
  119. package/src/components/ChipList/ChipList.mdx +0 -1
  120. package/src/components/ChipList/tests/ChipList.visual.cy.ts +46 -0
  121. package/src/components/ChipList/tests/__snapshots__/chip-list-default.snap.png +0 -0
  122. package/src/components/ChipList/tests/__snapshots__/chip-list-readonly.snap.png +0 -0
  123. package/src/components/ChipList/tests/__snapshots__/chip-list-state-icons.snap.png +0 -0
  124. package/src/components/CollapsibleList/CollapsibleList.mdx +0 -1
  125. package/src/components/CollapsibleList/tests/CollapsibleList.visual.cy.ts +33 -0
  126. package/src/components/CollapsibleList/tests/__snapshots__/collapsible-list-default.snap.png +0 -0
  127. package/src/components/CollapsibleList/tests/__snapshots__/collapsible-list-no-title.snap.png +0 -0
  128. package/src/components/ContextualMenu/tests/ContextualMenu.visual.cy.ts +35 -0
  129. package/src/components/ContextualMenu/tests/__snapshots__/contextual-menu-default.snap.png +0 -0
  130. package/src/components/ContextualMenu/tests/__snapshots__/contextual-menu-selected.snap.png +0 -0
  131. package/src/components/CookieBanner/CookieBanner.mdx +0 -1
  132. package/src/components/CookieBanner/tests/CookieBanner.visual.cy.ts +29 -0
  133. package/src/components/CookieBanner/tests/__snapshots__/cookie-banner-default.snap.png +0 -0
  134. package/src/components/CookieBanner/tests/__snapshots__/cookie-banner-with-items.snap.png +0 -0
  135. package/src/components/CookiesSelection/tests/CookiesSelection.visual.cy.ts +21 -0
  136. package/src/components/CookiesSelection/tests/__snapshots__/cookies-selection-default.snap.png +0 -0
  137. package/src/components/CopyBtn/CopyBtn.mdx +0 -1
  138. package/src/components/CopyBtn/tests/CopyBtn.visual.cy.ts +24 -0
  139. package/src/components/CopyBtn/tests/__snapshots__/copy-btn-default.snap.png +0 -0
  140. package/src/components/CopyBtn/tests/__snapshots__/copy-btn-no-tooltip.snap.png +0 -0
  141. package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.stories.ts +123 -439
  142. package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.vue +147 -41
  143. package/src/components/Customs/Selects/SelectBtnField/Validation/Validation.stories.ts +600 -0
  144. package/src/components/Customs/Selects/SelectBtnField/composables/useSelectBtnFieldValidation.ts +87 -0
  145. package/src/components/Customs/Selects/SelectBtnField/tests/SelectBtnField.spec.ts +402 -33
  146. package/src/components/Customs/Selects/SelectBtnField/tests/SelectBtnField.visual.cy.ts +60 -0
  147. package/src/components/Customs/Selects/SelectBtnField/tests/__snapshots__/SelectBtnField.spec.ts.snap +52 -38
  148. package/src/components/Customs/Selects/SelectBtnField/tests/__snapshots__/select-btn-field-default.snap.png +0 -0
  149. package/src/components/Customs/Selects/SelectBtnField/tests/__snapshots__/select-btn-field-inline.snap.png +0 -0
  150. package/src/components/Customs/Selects/SelectBtnField/tests/__snapshots__/select-btn-field-readonly.snap.png +0 -0
  151. package/src/components/Customs/Selects/SelectBtnField/tests/__snapshots__/select-btn-field-selected.snap.png +0 -0
  152. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +1 -1
  153. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +2 -0
  154. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.visual.cy.ts +63 -0
  155. package/src/components/Customs/Selects/SyAutocomplete/tests/__snapshots__/sy-autocomplete-default.snap.png +0 -0
  156. package/src/components/Customs/Selects/SyAutocomplete/tests/__snapshots__/sy-autocomplete-loading.snap.png +0 -0
  157. package/src/components/Customs/Selects/SyAutocomplete/tests/__snapshots__/sy-autocomplete-multiple.snap.png +0 -0
  158. package/src/components/Customs/Selects/SyAutocomplete/tests/__snapshots__/sy-autocomplete-with-value.snap.png +0 -0
  159. package/src/components/Customs/Selects/SyAutocomplete/validation/Validation.stories.ts +0 -93
  160. package/src/components/Customs/Selects/SyInputSelect/tests/SyInputSelect.visual.cy.ts +48 -0
  161. package/src/components/Customs/Selects/SyInputSelect/tests/__snapshots__/sy-input-select-default.snap.png +0 -0
  162. package/src/components/Customs/Selects/SyInputSelect/tests/__snapshots__/sy-input-select-required.snap.png +0 -0
  163. package/src/components/Customs/Selects/SyInputSelect/tests/__snapshots__/sy-input-select-with-value.snap.png +0 -0
  164. package/src/components/Customs/Selects/SySelect/SySelect.vue +22 -47
  165. package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +3 -3
  166. package/src/components/Customs/Selects/SySelect/tests/SySelect.visual.cy.ts +77 -0
  167. package/src/components/Customs/Selects/SySelect/tests/__snapshots__/sy-select-clearable.snap.png +0 -0
  168. package/src/components/Customs/Selects/SySelect/tests/__snapshots__/sy-select-default.snap.png +0 -0
  169. package/src/components/Customs/Selects/SySelect/tests/__snapshots__/sy-select-multiple-chips.snap.png +0 -0
  170. package/src/components/Customs/Selects/SySelect/tests/__snapshots__/sy-select-required.snap.png +0 -0
  171. package/src/components/Customs/Selects/SySelect/tests/__snapshots__/sy-select-with-value.snap.png +0 -0
  172. package/src/components/Customs/Selects/SySelect/validation/Validation.stories.ts +1 -92
  173. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.stories.ts +342 -162
  174. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +77 -129
  175. package/src/components/Customs/SyCheckBoxGroup/Validation/Validation.stories.ts +1008 -0
  176. package/src/components/Customs/SyCheckBoxGroup/composables/useSyCheckBoxGroupValidation.ts +107 -0
  177. package/src/components/Customs/SyCheckBoxGroup/tests/SyCheckBoxGroup.spec.ts +180 -7
  178. package/src/components/Customs/SyCheckBoxGroup/tests/SyCheckBoxGroup.visual.cy.ts +55 -0
  179. package/src/components/Customs/SyCheckBoxGroup/tests/__snapshots__/sy-checkbox-group-default.snap.png +0 -0
  180. package/src/components/Customs/SyCheckBoxGroup/tests/__snapshots__/sy-checkbox-group-disabled.snap.png +0 -0
  181. package/src/components/Customs/SyCheckBoxGroup/tests/__snapshots__/sy-checkbox-group-selected.snap.png +0 -0
  182. package/src/components/Customs/SyCheckBoxGroup/tests/__snapshots__/sy-checkbox-group-with-label.snap.png +0 -0
  183. package/src/components/Customs/SyCheckBoxGroup/types.ts +49 -0
  184. package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +41 -161
  185. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +71 -156
  186. package/src/components/Customs/SyCheckbox/Validation/Validation.stories.ts +654 -0
  187. package/src/components/Customs/SyCheckbox/composables/useSyCheckboxValidation.ts +105 -0
  188. package/src/components/Customs/SyCheckbox/tests/SyCheckbox.spec.ts +106 -0
  189. package/src/components/Customs/SyCheckbox/tests/SyCheckbox.visual.cy.ts +61 -0
  190. package/src/components/Customs/SyCheckbox/tests/__snapshots__/sy-checkbox-checked.snap.png +0 -0
  191. package/src/components/Customs/SyCheckbox/tests/__snapshots__/sy-checkbox-disabled.snap.png +0 -0
  192. package/src/components/Customs/SyCheckbox/tests/__snapshots__/sy-checkbox-indeterminate.snap.png +0 -0
  193. package/src/components/Customs/SyCheckbox/tests/__snapshots__/sy-checkbox-required.snap.png +0 -0
  194. package/src/components/Customs/SyCheckbox/tests/__snapshots__/sy-checkbox-unchecked.snap.png +0 -0
  195. package/src/components/Customs/SyCheckbox/tests/useSyCheckboxValidation.spec.ts +98 -0
  196. package/src/components/Customs/SyCheckbox/types.ts +51 -0
  197. package/src/components/Customs/SyIcon/SyIcon.vue +19 -1
  198. package/src/components/Customs/SyIcon/tests/SyIcon.visual.cy.ts +83 -0
  199. package/src/components/Customs/SyIcon/tests/__snapshots__/sy-icon-color-error.snap.png +0 -0
  200. package/src/components/Customs/SyIcon/tests/__snapshots__/sy-icon-decorative.snap.png +0 -0
  201. package/src/components/Customs/SyIcon/tests/__snapshots__/sy-icon-informative.snap.png +0 -0
  202. package/src/components/Customs/SyIcon/tests/__snapshots__/sy-icon-role-button.snap.png +0 -0
  203. package/src/components/Customs/SyIcon/tests/__snapshots__/sy-icon-size-large.snap.png +0 -0
  204. package/src/components/Customs/SyIconButton/tests/SyIconButton.visual.cy.ts +55 -0
  205. package/src/components/Customs/SyIconButton/tests/__snapshots__/sy-icon-button-default.snap.png +0 -0
  206. package/src/components/Customs/SyIconButton/tests/__snapshots__/sy-icon-button-disabled.snap.png +0 -0
  207. package/src/components/Customs/SyIconButton/tests/__snapshots__/sy-icon-button-error.snap.png +0 -0
  208. package/src/components/Customs/SyIconButton/tests/__snapshots__/sy-icon-button-large.snap.png +0 -0
  209. package/src/components/Customs/SyPagination/tests/SyPagination.visual.cy.ts +40 -0
  210. package/src/components/Customs/SyPagination/tests/__snapshots__/sy-pagination-first-page.snap.png +0 -0
  211. package/src/components/Customs/SyPagination/tests/__snapshots__/sy-pagination-middle-page.snap.png +0 -0
  212. package/src/components/Customs/SyPagination/tests/__snapshots__/sy-pagination-with-label.snap.png +0 -0
  213. package/src/components/Customs/SyRadioGroup/SyRadioGroup.stories.ts +0 -1
  214. package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +4 -3
  215. package/src/components/Customs/SyRadioGroup/composables/useSyRadioGroupValidation.ts +1 -1
  216. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-asterisk.snap.png +0 -0
  217. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-comfortable.snap.png +0 -0
  218. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-compact.snap.png +0 -0
  219. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-default.snap.png +0 -0
  220. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-disabled.snap.png +0 -0
  221. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-error.snap.png +0 -0
  222. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-no-details.snap.png +0 -0
  223. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-readonly.snap.png +0 -0
  224. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-selected.snap.png +0 -0
  225. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-success.snap.png +0 -0
  226. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-warning.snap.png +0 -0
  227. package/src/components/Customs/SyRadioGroup/validation/Validation.stories.ts +63 -27
  228. package/src/components/Customs/SyTabs/tests/SyTabs.visual.cy.ts +30 -0
  229. package/src/components/Customs/SyTabs/tests/__snapshots__/sy-tabs-default.snap.png +0 -0
  230. package/src/components/Customs/SyTabs/tests/__snapshots__/sy-tabs-second-active.snap.png +0 -0
  231. package/src/components/Customs/SyTextField/FieldState.vue +50 -0
  232. package/src/components/Customs/SyTextField/SyTextField.stories.ts +160 -778
  233. package/src/components/Customs/SyTextField/SyTextField.vue +178 -160
  234. package/src/components/Customs/SyTextField/Validation/Validation.stories.ts +1164 -0
  235. package/src/components/Customs/SyTextField/locales.ts +12 -0
  236. package/src/components/Customs/SyTextField/tests/SyTextField.spec.ts +174 -8
  237. package/src/components/Customs/SyTextField/tests/SyTextField.visual.cy.ts +116 -0
  238. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-clearable.snap.png +0 -0
  239. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-default.snap.png +0 -0
  240. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-number-disabled.snap.png +0 -0
  241. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-number-no-spinner.snap.png +0 -0
  242. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-number.snap.png +0 -0
  243. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-prepend-icon.snap.png +0 -0
  244. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-readonly.snap.png +0 -0
  245. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-required.snap.png +0 -0
  246. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-with-value.snap.png +0 -0
  247. package/src/components/Customs/SyTextField/types.ts +70 -0
  248. package/src/components/Customs/SyTextField/useNumberField.ts +93 -0
  249. package/src/components/Customs/SyTextField/useSyTextFieldValidation.ts +95 -0
  250. package/src/components/DataList/DataList.mdx +0 -1
  251. package/src/components/DataList/tests/DataList.visual.cy.ts +85 -0
  252. package/src/components/DataList/tests/__snapshots__/data-list-default.snap.png +0 -0
  253. package/src/components/DataList/tests/__snapshots__/data-list-loading.snap.png +0 -0
  254. package/src/components/DataList/tests/__snapshots__/data-list-row.snap.png +0 -0
  255. package/src/components/DataList/tests/__snapshots__/data-list-with-icons.snap.png +0 -0
  256. package/src/components/DataList/tests/__snapshots__/data-list-with-title.snap.png +0 -0
  257. package/src/components/DataListGroup/DataListGroup.mdx +0 -1
  258. package/src/components/DataListGroup/tests/DataListGroup.visual.cy.ts +51 -0
  259. package/src/components/DataListGroup/tests/__snapshots__/data-list-group-default.snap.png +0 -0
  260. package/src/components/DataListGroup/tests/__snapshots__/data-list-group-loading.snap.png +0 -0
  261. package/src/components/DataListItem/tests/DataListItem.visual.cy.ts +53 -0
  262. package/src/components/DataListItem/tests/__snapshots__/data-list-item-chip.snap.png +0 -0
  263. package/src/components/DataListItem/tests/__snapshots__/data-list-item-default.snap.png +0 -0
  264. package/src/components/DataListItem/tests/__snapshots__/data-list-item-placeholder.snap.png +0 -0
  265. package/src/components/DataListItem/tests/__snapshots__/data-list-item-row.snap.png +0 -0
  266. package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +1 -1
  267. package/src/components/DatePicker/CalendarMode/DatePicker.vue +7 -7
  268. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +1 -1
  269. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +7 -8
  270. package/src/components/DatePicker/DateTextInput/DateRange.stories.ts +1 -1
  271. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +2 -2
  272. package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +1 -1
  273. package/src/components/DatePicker/composables/tests/useTodayButton.spec.ts +10 -10
  274. package/src/components/DatePicker/composables/useCalendarKeyboardNavigation.ts +11 -2
  275. package/src/components/DeclarationAccessibilityPage/tests/DeclarationAccessibilityPage.visual.cy.ts +35 -0
  276. package/src/components/DeclarationAccessibilityPage/tests/__snapshots__/declaration-a11y-page-default.snap.png +0 -0
  277. package/src/components/DeclarationAccessibilityPage/tests/__snapshots__/declaration-a11y-page-full.snap.png +0 -0
  278. package/src/components/DiacriticPicker/DiacriticPicker.mdx +0 -1
  279. package/src/components/DiacriticPicker/tests/DiacriticPicker.visual.cy.ts +24 -0
  280. package/src/components/DiacriticPicker/tests/__snapshots__/diacritic-picker-custom-title.snap.png +0 -0
  281. package/src/components/DiacriticPicker/tests/__snapshots__/diacritic-picker-default.snap.png +0 -0
  282. package/src/components/DialogBox/DialogBox.mdx +0 -1
  283. package/src/components/DialogBox/DialogBox.stories.ts +399 -4
  284. package/src/components/DialogBox/DialogBox.vue +20 -0
  285. package/src/components/DialogBox/locales.ts +1 -0
  286. package/src/components/DialogBox/tests/DialogBox.spec.ts +73 -0
  287. package/src/components/DialogBox/tests/DialogBox.visual.cy.ts +24 -0
  288. package/src/components/DialogBox/tests/__snapshots__/dialog-box-custom-texts.snap.png +0 -0
  289. package/src/components/DialogBox/tests/__snapshots__/dialog-box-default.snap.png +0 -0
  290. package/src/components/DialogBox/tests/__snapshots__/dialog-box-no-actions.snap.png +0 -0
  291. package/src/components/DownloadBtn/tests/DownloadBtn.spec.ts +2 -2
  292. package/src/components/DownloadBtn/tests/DownloadBtn.visual.cy.ts +38 -0
  293. package/src/components/DownloadBtn/tests/__snapshots__/download-btn-dark.snap.png +0 -0
  294. package/src/components/DownloadBtn/tests/__snapshots__/download-btn-idle.snap.png +0 -0
  295. package/src/components/ErrorPage/ErrorPage.mdx +1 -1
  296. package/src/components/ErrorPage/tests/ErrorPage.visual.cy.ts +32 -0
  297. package/src/components/ErrorPage/tests/__snapshots__/error-page-custom.snap.png +0 -0
  298. package/src/components/ErrorPage/tests/__snapshots__/error-page-default.snap.png +0 -0
  299. package/src/components/ErrorPage/tests/__snapshots__/error-page-no-btn.snap.png +0 -0
  300. package/src/components/ExternalLinks/ExternalLinks.mdx +0 -1
  301. package/src/components/ExternalLinks/tests/ExternalLinks.visual.cy.ts +30 -0
  302. package/src/components/ExternalLinks/tests/__snapshots__/external-links-default.snap.png +0 -0
  303. package/src/components/ExternalLinks/tests/__snapshots__/external-links-fixed.snap.png +0 -0
  304. package/src/components/FileList/FileList.mdx +0 -1
  305. package/src/components/FileList/tests/FileList.visual.cy.ts +31 -0
  306. package/src/components/FileList/tests/__snapshots__/file-list-default.snap.png +0 -0
  307. package/src/components/FileList/tests/__snapshots__/file-list-with-delete.snap.png +0 -0
  308. package/src/components/FilePreview/accessibilite/Accessibility.mdx +86 -8
  309. package/src/components/FileUpload/tests/FileUpload.visual.cy.ts +36 -0
  310. package/src/components/FileUpload/tests/__snapshots__/file-upload-default.snap.png +0 -0
  311. package/src/components/FileUpload/tests/__snapshots__/file-upload-disabled.snap.png +0 -0
  312. package/src/components/FileUpload/tests/__snapshots__/file-upload-multiple.snap.png +0 -0
  313. package/src/components/FilterInline/FilterInline.mdx +0 -1
  314. package/src/components/FilterInline/FilterInline.stories.ts +2 -0
  315. package/src/components/FilterInline/FilterInline.vue +10 -5
  316. package/src/components/FilterInline/tests/FilterInline.visual.cy.ts +25 -0
  317. package/src/components/FilterInline/tests/__snapshots__/filter-inline-default.snap.png +0 -0
  318. package/src/components/FilterSideBar/FilterSideBar.mdx +8 -1
  319. package/src/components/FilterSideBar/FilterSideBar.stories.ts +136 -1
  320. package/src/components/FilterSideBar/FilterSideBar.vue +30 -8
  321. package/src/components/FilterSideBar/tests/FilterSideBar.spec.ts +55 -0
  322. package/src/components/FilterSideBar/tests/FilterSideBar.visual.cy.ts +37 -0
  323. package/src/components/FilterSideBar/tests/__snapshots__/filter-sidebar-default.snap.png +0 -0
  324. package/src/components/FilterSideBar/tests/__snapshots__/filter-sidebar-modale.snap.png +0 -0
  325. package/src/components/FooterBar/FooterBar.mdx +0 -1
  326. package/src/components/FooterBar/tests/FooterBar.visual.cy.ts +37 -0
  327. package/src/components/FooterBar/tests/__snapshots__/footer-bar-default.snap.png +0 -0
  328. package/src/components/FooterBar/tests/__snapshots__/footer-bar-no-logo.snap.png +0 -0
  329. package/src/components/FooterBar/tests/__snapshots__/footer-bar-no-social.snap.png +0 -0
  330. package/src/components/FooterBar/tests/__snapshots__/footer-bar-version.snap.png +0 -0
  331. package/src/components/FranceConnectBtn/FranceConnectBtn.mdx +0 -1
  332. package/src/components/FranceConnectBtn/tests/FranceConnectBtn.visual.cy.ts +38 -0
  333. package/src/components/FranceConnectBtn/tests/__snapshots__/france-connect-btn-dark.snap.png +0 -0
  334. package/src/components/FranceConnectBtn/tests/__snapshots__/france-connect-btn-default.snap.png +0 -0
  335. package/src/components/FranceConnectBtn/tests/__snapshots__/france-connect-btn-plus.snap.png +0 -0
  336. package/src/components/HeaderBar/HeaderBar.mdx +0 -1
  337. package/src/components/HeaderBar/HeaderBurgerMenu/tests/HeaderBurgerMenu.spec.ts +4 -4
  338. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated-submenu-open.snap.png +0 -0
  339. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated.snap.png +0 -0
  340. package/src/components/HeaderBar/tests/__snapshots__/header-bar-custom-width.snap.png +0 -0
  341. package/src/components/HeaderBar/tests/__snapshots__/header-bar-default.snap.png +0 -0
  342. package/src/components/HeaderBar/tests/__snapshots__/header-bar-no-sticky.snap.png +0 -0
  343. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-prepend.snap.png +0 -0
  344. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-side.snap.png +0 -0
  345. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-subtitle.snap.png +0 -0
  346. package/src/components/HeaderLoading/HeaderLoading.mdx +0 -1
  347. package/src/components/HeaderLoading/tests/HeaderLoading.visual.cy.ts +34 -0
  348. package/src/components/HeaderLoading/tests/__snapshots__/header-loading-custom-size.snap.png +0 -0
  349. package/src/components/HeaderLoading/tests/__snapshots__/header-loading-default.snap.png +0 -0
  350. package/src/components/HeaderLoading/tests/__snapshots__/header-loading-standalone.snap.png +0 -0
  351. package/src/components/HeaderNavigationBar/tests/HeaderNavigationBar.spec.ts +4 -4
  352. package/src/components/HeaderNavigationBar/tests/HeaderNavigationBar.visual.cy.ts +34 -0
  353. package/src/components/HeaderNavigationBar/tests/__snapshots__/header-navigation-bar-default.snap.png +0 -0
  354. package/src/components/HeaderNavigationBar/tests/__snapshots__/header-navigation-bar-subtitle.snap.png +0 -0
  355. package/src/components/HeaderToolbar/tests/HeaderToolbar.visual.cy.ts +25 -0
  356. package/src/components/HeaderToolbar/tests/__snapshots__/header-toolbar-custom.snap.png +0 -0
  357. package/src/components/HeaderToolbar/tests/__snapshots__/header-toolbar-default.snap.png +0 -0
  358. package/src/components/LangBtn/LangBtn.mdx +0 -1
  359. package/src/components/LangBtn/tests/LangBtn.visual.cy.ts +33 -0
  360. package/src/components/LangBtn/tests/__snapshots__/lang-btn-default.snap.png +0 -0
  361. package/src/components/LangBtn/tests/__snapshots__/lang-btn-english.snap.png +0 -0
  362. package/src/components/LangBtn/tests/__snapshots__/lang-btn-no-arrow.snap.png +0 -0
  363. package/src/components/Logo/Logo.mdx +1 -1
  364. package/src/components/Logo/tests/__snapshots__/logo-avatar.snap.png +0 -0
  365. package/src/components/Logo/tests/__snapshots__/logo-dark.snap.png +0 -0
  366. package/src/components/Logo/tests/__snapshots__/logo-default.snap.png +0 -0
  367. package/src/components/Logo/tests/__snapshots__/logo-no-organism.snap.png +0 -0
  368. package/src/components/Logo/tests/__snapshots__/logo-no-signature.snap.png +0 -0
  369. package/src/components/Logo/tests/__snapshots__/logo-risque-pro.snap.png +0 -0
  370. package/src/components/LogoBrandSection/tests/LogoBrandSection.visual.cy.ts +43 -0
  371. package/src/components/LogoBrandSection/tests/__snapshots__/logo-brand-section-default.snap.png +0 -0
  372. package/src/components/LogoBrandSection/tests/__snapshots__/logo-brand-section-mobile.snap.png +0 -0
  373. package/src/components/LogoBrandSection/tests/__snapshots__/logo-brand-section-reduced.snap.png +0 -0
  374. package/src/components/LogoBrandSection/tests/__snapshots__/logo-brand-section-with-title.snap.png +0 -0
  375. package/src/components/LunarCalendar/LunarCalendar.mdx +6 -9
  376. package/src/components/LunarCalendar/LunarCalendar.stories.ts +243 -46
  377. package/src/components/LunarCalendar/LunarCalendar.vue +61 -26
  378. package/src/components/LunarCalendar/Validation/Validation.stories.ts +717 -0
  379. package/src/components/LunarCalendar/tests/LunarCalendar.a11y.spec.ts +1 -1
  380. package/src/components/LunarCalendar/tests/LunarCalendar.spec.ts +197 -6
  381. package/src/components/LunarCalendar/tests/LunarCalendar.visual.cy.ts +36 -0
  382. package/src/components/LunarCalendar/tests/__snapshots__/lunar-calendar-default.snap.png +0 -0
  383. package/src/components/LunarCalendar/tests/__snapshots__/lunar-calendar-required.snap.png +0 -0
  384. package/src/components/LunarCalendar/tests/__snapshots__/lunar-calendar-with-value.snap.png +0 -0
  385. package/src/components/LunarCalendar/tests/useLunarCalendarValidation.spec.ts +287 -0
  386. package/src/components/LunarCalendar/types.ts +39 -0
  387. package/src/components/LunarCalendar/useLunarCalendarValidation.ts +115 -39
  388. package/src/components/MaintenancePage/tests/MaintenancePage.visual.cy.ts +22 -0
  389. package/src/components/MaintenancePage/tests/__snapshots__/maintenance-page-custom.snap.png +0 -0
  390. package/src/components/MaintenancePage/tests/__snapshots__/maintenance-page-default.snap.png +0 -0
  391. package/src/components/MonthPicker/MonthPicker.stories.ts +38 -281
  392. package/src/components/MonthPicker/MonthPicker.vue +66 -17
  393. package/src/components/MonthPicker/MonthPickerText/MonthPickerInput.vue +44 -20
  394. package/src/components/MonthPicker/MonthPickerText/useTextField.ts +5 -0
  395. package/src/components/MonthPicker/Validation/Validation.stories.ts +1117 -0
  396. package/src/components/MonthPicker/locales.ts +1 -0
  397. package/src/components/MonthPicker/tests/MonthPicker.spec.ts +353 -2
  398. package/src/components/MonthPicker/tests/MonthPicker.visual.cy.ts +37 -0
  399. package/src/components/MonthPicker/tests/__snapshots__/MonthPicker.spec.ts.snap +14 -8
  400. package/src/components/MonthPicker/tests/__snapshots__/month-picker-default.snap.png +0 -0
  401. package/src/components/MonthPicker/tests/__snapshots__/month-picker-disabled.snap.png +0 -0
  402. package/src/components/MonthPicker/tests/__snapshots__/month-picker-readonly.snap.png +0 -0
  403. package/src/components/MonthPicker/tests/__snapshots__/month-picker-with-value.snap.png +0 -0
  404. package/src/components/MonthPicker/types.ts +16 -0
  405. package/src/components/MonthPicker/useMonthPickerValidation.ts +64 -27
  406. package/src/components/NirField/NirField.mdx +120 -66
  407. package/src/components/NirField/NirField.stories.ts +256 -682
  408. package/src/components/NirField/NirField.vue +98 -32
  409. package/src/components/NirField/tests/NirField.spec.ts +135 -14
  410. package/src/components/NirField/tests/NirField.visual.cy.ts +28 -0
  411. package/src/components/NirField/tests/__snapshots__/nir-field-complex.snap.png +0 -0
  412. package/src/components/NirField/tests/__snapshots__/nir-field-default.snap.png +0 -0
  413. package/src/components/NirField/tests/__snapshots__/nir-field-with-key.snap.png +0 -0
  414. package/src/components/NirField/tests/useNirValidation.spec.ts +168 -0
  415. package/src/components/NirField/useNirValidation.ts +44 -19
  416. package/src/components/NirField/validation/Validation.stories.ts +866 -0
  417. package/src/components/NotFoundPage/tests/NotFoundPage.visual.cy.ts +28 -0
  418. package/src/components/NotFoundPage/tests/__snapshots__/NotFoundPage.spec.ts.snap +263 -245
  419. package/src/components/NotFoundPage/tests/__snapshots__/not-found-page-custom-btn.snap.png +0 -0
  420. package/src/components/NotFoundPage/tests/__snapshots__/not-found-page-default.snap.png +0 -0
  421. package/src/components/NotFoundPage/tests/__snapshots__/not-found-page-no-btn.snap.png +0 -0
  422. package/src/components/NotificationBar/NotificationBar.mdx +0 -1
  423. package/src/components/NotificationBar/tests/NotificationBar.visual.cy.ts +54 -0
  424. package/src/components/NotificationBar/tests/__snapshots__/notification-bar-bottom.snap.png +0 -0
  425. package/src/components/NotificationBar/tests/__snapshots__/notification-bar-info.snap.png +0 -0
  426. package/src/components/NotificationBar/tests/__snapshots__/notification-bar-multiple.snap.png +0 -0
  427. package/src/components/PageContainer/PageContainer.mdx +0 -1
  428. package/src/components/PageContainer/PageContainer.stories.ts +170 -2
  429. package/src/components/PageContainer/PageContainer.vue +63 -8
  430. package/src/components/PageContainer/tests/PageContainer.visual.cy.ts +33 -0
  431. package/src/components/PageContainer/tests/__snapshots__/PageContainer.spec.ts.snap +19 -11
  432. package/src/components/PageContainer/tests/__snapshots__/page-container-color.snap.png +0 -0
  433. package/src/components/PageContainer/tests/__snapshots__/page-container-default.snap.png +0 -0
  434. package/src/components/PageContainer/tests/__snapshots__/page-container-md.snap.png +0 -0
  435. package/src/components/PaginatedTable/PaginatedTable.mdx +0 -1
  436. package/src/components/PaginatedTable/accessibilite/Accessibility.mdx +99 -7
  437. package/src/components/PaginatedTable/tests/PaginatedTable.visual.cy.ts +41 -0
  438. package/src/components/PaginatedTable/tests/__snapshots__/paginated-table-default.snap.png +0 -0
  439. package/src/components/PaginatedTable/tests/__snapshots__/paginated-table-server.snap.png +0 -0
  440. package/src/components/PasswordField/PasswordField.mdx +5 -52
  441. package/src/components/PasswordField/PasswordField.stories.ts +74 -931
  442. package/src/components/PasswordField/PasswordField.vue +120 -191
  443. package/src/components/PasswordField/Validation/Validation.stories.ts +1295 -0
  444. package/src/components/PasswordField/locales.ts +2 -0
  445. package/src/components/PasswordField/tests/PasswordField.spec.ts +144 -106
  446. package/src/components/PasswordField/tests/PasswordField.visual.cy.ts +49 -0
  447. package/src/components/PasswordField/tests/__snapshots__/password-field-default.snap.png +0 -0
  448. package/src/components/PasswordField/tests/__snapshots__/password-field-disabled.snap.png +0 -0
  449. package/src/components/PasswordField/tests/__snapshots__/password-field-required.snap.png +0 -0
  450. package/src/components/PasswordField/tests/__snapshots__/password-field-underlined.snap.png +0 -0
  451. package/src/components/PasswordField/types.ts +17 -0
  452. package/src/components/PasswordField/usePasswordFieldValidation.ts +100 -0
  453. package/src/components/PeriodField/PeriodField.mdx +0 -1
  454. package/src/components/PeriodField/PeriodField.stories.ts +3 -1
  455. package/src/components/PeriodField/PeriodField.vue +1 -1
  456. package/src/components/PeriodField/tests/PeriodField.visual.cy.ts +39 -0
  457. package/src/components/PeriodField/tests/__snapshots__/period-field-default.snap.png +0 -0
  458. package/src/components/PeriodField/tests/__snapshots__/period-field-no-calendar.snap.png +0 -0
  459. package/src/components/PeriodField/tests/__snapshots__/period-field-required.snap.png +0 -0
  460. package/src/components/PeriodField/tests/__snapshots__/period-field-with-value.snap.png +0 -0
  461. package/src/components/PhoneField/PhoneField.mdx +2 -3
  462. package/src/components/PhoneField/PhoneField.stories.ts +227 -410
  463. package/src/components/PhoneField/PhoneField.vue +205 -439
  464. package/src/components/PhoneField/indicatifs.ts +1 -1
  465. package/src/components/PhoneField/locales.ts +7 -0
  466. package/src/components/PhoneField/tests/PhoneField.a11y.spec.ts +0 -1
  467. package/src/components/PhoneField/tests/PhoneField.spec.ts +518 -220
  468. package/src/components/PhoneField/tests/PhoneField.visual.cy.ts +28 -0
  469. package/src/components/PhoneField/tests/__snapshots__/phone-field-default.snap.png +0 -0
  470. package/src/components/PhoneField/tests/__snapshots__/phone-field-with-country-code.snap.png +0 -0
  471. package/src/components/PhoneField/tests/__snapshots__/phone-field-with-value.snap.png +0 -0
  472. package/src/components/PhoneField/types.ts +30 -0
  473. package/src/components/PhoneField/usePhoneFieldValidation.ts +119 -0
  474. package/src/components/PhoneField/usePhoneIndicatifs.ts +89 -0
  475. package/src/components/PhoneField/validation/validation.stories.ts +717 -0
  476. package/src/components/RangeField/RangeField.mdx +0 -1
  477. package/src/components/RangeField/tests/__snapshots__/range-field-custom-bg.snap.png +0 -0
  478. package/src/components/RangeField/tests/__snapshots__/range-field-custom-range.snap.png +0 -0
  479. package/src/components/RangeField/tests/__snapshots__/range-field-default.snap.png +0 -0
  480. package/src/components/RangeField/tests/__snapshots__/range-field-step.snap.png +0 -0
  481. package/src/components/RangeField/tests/__snapshots__/range-field-with-label.snap.png +0 -0
  482. package/src/components/RatingPicker/RatingPicker.mdx +0 -1
  483. package/src/components/RatingPicker/tests/RatingPicker.visual.cy.ts +52 -0
  484. package/src/components/RatingPicker/tests/__snapshots__/rating-picker-emotion.snap.png +0 -0
  485. package/src/components/RatingPicker/tests/__snapshots__/rating-picker-number.snap.png +0 -0
  486. package/src/components/RatingPicker/tests/__snapshots__/rating-picker-readonly.snap.png +0 -0
  487. package/src/components/RatingPicker/tests/__snapshots__/rating-picker-stars.snap.png +0 -0
  488. package/src/components/SearchListField/SearchListField.mdx +1 -1
  489. package/src/components/SearchListField/SearchListField.stories.ts +1 -1
  490. package/src/components/SearchListField/SearchListField.vue +9 -4
  491. package/src/components/SearchListField/tests/SearchListField.spec.ts +127 -0
  492. package/src/components/SearchListField/tests/SearchListField.visual.cy.ts +35 -0
  493. package/src/components/SearchListField/tests/__snapshots__/search-list-field-default.snap.png +0 -0
  494. package/src/components/SearchListField/tests/__snapshots__/search-list-field-with-selection.snap.png +0 -0
  495. package/src/components/SkipLink/tests/SkipLink.visual.cy.ts +16 -0
  496. package/src/components/SkipLink/tests/__snapshots__/skip-link-focused.snap.png +0 -0
  497. package/src/components/SocialMediaLinks/SocialMediaLinks.mdx +0 -1
  498. package/src/components/SocialMediaLinks/tests/SocialMediaLinks.visual.cy.ts +33 -0
  499. package/src/components/SocialMediaLinks/tests/__snapshots__/social-media-links-default.snap.png +0 -0
  500. package/src/components/SocialMediaLinks/tests/__snapshots__/social-media-links-no-native-heading.snap.png +0 -0
  501. package/src/components/StatusPage/StatusPage.vue +1 -0
  502. package/src/components/StatusPage/tests/StatusPage.visual.cy.ts +47 -0
  503. package/src/components/StatusPage/tests/__snapshots__/StatusPage.spec.ts.snap +248 -230
  504. package/src/components/StatusPage/tests/__snapshots__/status-page-default.snap.png +0 -0
  505. package/src/components/StatusPage/tests/__snapshots__/status-page-full.snap.png +0 -0
  506. package/src/components/StatusPage/tests/__snapshots__/status-page-no-btn.snap.png +0 -0
  507. package/src/components/SubHeader/SubHeader.mdx +5 -6
  508. package/src/components/SubHeader/tests/SubHeader.visual.cy.ts +48 -0
  509. package/src/components/SubHeader/tests/__snapshots__/sub-header-default.snap.png +0 -0
  510. package/src/components/SubHeader/tests/__snapshots__/sub-header-loading.snap.png +0 -0
  511. package/src/components/SubHeader/tests/__snapshots__/sub-header-no-back-btn.snap.png +0 -0
  512. package/src/components/SubHeader/tests/__snapshots__/sub-header-with-subtitle.snap.png +0 -0
  513. package/src/components/SyAlert/tests/__snapshots__/sy-alert-closable.snap.png +0 -0
  514. package/src/components/SyAlert/tests/__snapshots__/sy-alert-error.snap.png +0 -0
  515. package/src/components/SyAlert/tests/__snapshots__/sy-alert-info.snap.png +0 -0
  516. package/src/components/SyAlert/tests/__snapshots__/sy-alert-success.snap.png +0 -0
  517. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-outlined.snap.png +0 -0
  518. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-tonal.snap.png +0 -0
  519. package/src/components/SyAlert/tests/__snapshots__/sy-alert-warning.snap.png +0 -0
  520. package/src/components/SyHeading/tests/SyHeading.visual.cy.ts +33 -0
  521. package/src/components/SyHeading/tests/__snapshots__/sy-heading-level-1.snap.png +0 -0
  522. package/src/components/SyHeading/tests/__snapshots__/sy-heading-level-2.snap.png +0 -0
  523. package/src/components/SyHeading/tests/__snapshots__/sy-heading-level-3.snap.png +0 -0
  524. package/src/components/SyTextArea/SyTextArea.stories.ts +25 -0
  525. package/src/components/SyTextArea/SyTextArea.vue +7 -0
  526. package/src/components/SyTextArea/composables/useSyTextAreaValidation.ts +1 -1
  527. package/src/components/SyTextArea/tests/SyTextArea.a11y.spec.ts +18 -0
  528. package/src/components/SyTextArea/tests/SyTextArea.spec.ts +135 -1
  529. package/src/components/SyTextArea/tests/SyTextArea.visual.cy.ts +48 -0
  530. package/src/components/SyTextArea/tests/__snapshots__/sy-textarea-default.snap.png +0 -0
  531. package/src/components/SyTextArea/tests/__snapshots__/sy-textarea-filled.snap.png +0 -0
  532. package/src/components/SyTextArea/tests/__snapshots__/sy-textarea-required.snap.png +0 -0
  533. package/src/components/SyTextArea/tests/__snapshots__/sy-textarea-with-value.snap.png +0 -0
  534. package/src/components/SyTextArea/validation/Validation.stories.ts +6 -86
  535. package/src/components/TableToolbar/tests/TableToolbar.visual.cy.ts +49 -0
  536. package/src/components/TableToolbar/tests/__snapshots__/table-toolbar-default.snap.png +0 -0
  537. package/src/components/TableToolbar/tests/__snapshots__/table-toolbar-filtered.snap.png +0 -0
  538. package/src/components/TableToolbar/tests/__snapshots__/table-toolbar-loading.snap.png +0 -0
  539. package/src/components/TableToolbar/tests/__snapshots__/table-toolbar-with-add-btn.snap.png +0 -0
  540. package/src/components/Tables/SyServerTable/SyServerTable.vue +3 -3
  541. package/src/components/Tables/SyServerTable/accessibilite/Accessibility.mdx +114 -7
  542. package/src/components/Tables/SyServerTable/tests/SyServerTable.visual.cy.ts +58 -0
  543. package/src/components/Tables/SyServerTable/tests/__snapshots__/sy-server-table-default.snap.png +0 -0
  544. package/src/components/Tables/SyServerTable/tests/__snapshots__/sy-server-table-loading.snap.png +0 -0
  545. package/src/components/Tables/SyServerTable/tests/__snapshots__/sy-server-table-with-select.snap.png +0 -0
  546. package/src/components/Tables/SyTable/accessibilite/Accessibility.mdx +116 -7
  547. package/src/components/Tables/SyTable/tests/SyTable.visual.cy.ts +70 -0
  548. package/src/components/Tables/SyTable/tests/__snapshots__/sy-table-compact.snap.png +0 -0
  549. package/src/components/Tables/SyTable/tests/__snapshots__/sy-table-default.snap.png +0 -0
  550. package/src/components/Tables/SyTable/tests/__snapshots__/sy-table-striped.snap.png +0 -0
  551. package/src/components/Tables/SyTable/tests/__snapshots__/sy-table-with-select.snap.png +0 -0
  552. package/src/components/Tables/common/tableStyles.scss +4 -4
  553. package/src/components/Tables/common/tests/SyTableFilter.spec.ts +19 -13
  554. package/src/components/Tables/common/tests/filterByRange.spec.ts +23 -22
  555. package/src/components/ToolbarContainer/tests/ToolbarContainer.visual.cy.ts +34 -0
  556. package/src/components/ToolbarContainer/tests/__snapshots__/toolbar-container-default.snap.png +0 -0
  557. package/src/components/ToolbarContainer/tests/__snapshots__/toolbar-container-links.snap.png +0 -0
  558. package/src/components/UploadWorkflow/UploadWorkflow.mdx +0 -1
  559. package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +1 -2
  560. package/src/components/UploadWorkflow/tests/UploadWorkflow.visual.cy.ts +39 -0
  561. package/src/components/UploadWorkflow/tests/__snapshots__/upload-workflow-default.snap.png +0 -0
  562. package/src/components/UploadWorkflow/tests/__snapshots__/upload-workflow-with-title.snap.png +0 -0
  563. package/src/components/UserMenuBtn/UserMenuBtn.mdx +0 -1
  564. package/src/components/UserMenuBtn/UserMenuBtn.stories.ts +177 -0
  565. package/src/components/UserMenuBtn/tests/UserMenuBtn.visual.cy.ts +42 -0
  566. package/src/components/UserMenuBtn/tests/__snapshots__/user-menu-btn-default.snap.png +0 -0
  567. package/src/components/UserMenuBtn/tests/__snapshots__/user-menu-btn-no-logout.snap.png +0 -0
  568. package/src/components/UserMenuBtn/tests/__snapshots__/user-menu-btn-with-name.snap.png +0 -0
  569. package/src/composables/unifyValidation/documentationValidationProps.ts +2 -2
  570. package/src/composables/unifyValidation/tests/documentationValidationProps.spec.ts +2 -2
  571. package/src/composables/unifyValidation/tests/useValidation.spec.ts +13 -1
  572. package/src/composables/unifyValidation/useValidation.ts +41 -31
  573. package/src/composables/useFilterable/useFilterable.spec.ts +105 -142
  574. package/src/composables/useFilterable/useFilterable.ts +6 -17
  575. package/src/composables/useFormFieldErrorHandling.ts +1 -1
  576. package/src/composables/validation/tests/useFormValidation.spec.ts +11 -2
  577. package/src/composables/validation/tests/useValidatable.spec.ts +16 -6
  578. package/src/composables/validation/tests/useValidation.spec.ts +2 -2
  579. package/src/composables/validation/useValidation.ts +1 -1
  580. package/src/composantsVuetify/VCard/VCard.mdx +12 -0
  581. package/src/composantsVuetify/VCard/v-card.stories.ts +283 -1
  582. package/src/composantsVuetify/VCarousel/VCarousel.mdx +74 -0
  583. package/src/composantsVuetify/VCarousel/v-carousel.stories.ts +531 -0
  584. package/src/composantsVuetify/VNavigationDrawer/VNavgationDrawer.mdx +53 -0
  585. package/src/composantsVuetify/VNavigationDrawer/v-navigation-drawer.stories.ts +310 -0
  586. package/src/composantsVuetify/VSlideGroup/VSlideGroup.mdx +105 -0
  587. package/src/composantsVuetify/VSlideGroup/v-slide-group.stories.ts +463 -0
  588. package/src/composantsVuetify/VStepper/VStepper.mdx +56 -0
  589. package/src/composantsVuetify/VStepper/v-stepper.stories.ts +563 -0
  590. package/src/designTokens/tokens/amelipro/apLightTheme.ts +1 -0
  591. package/src/designTokens/tokens/amelipro/apSemantic.ts +1 -1
  592. package/src/designTokens/tokens/baseColors.ts +1 -1
  593. package/src/designTokens/tokens/baseTokens.ts +18 -18
  594. package/src/designTokens/tokens/pa/paLightTheme.ts +1 -0
  595. package/src/stories/Accessibilite/DesignSystem/a11y-status.json +1 -1
  596. package/src/stories/Components/Components.stories.ts +95 -11
  597. package/src/stories/Demarrer/Releases.stories.ts +59 -2
  598. package/src/stories/DesignTokens/Arrondis.mdx +1 -1
  599. package/src/stories/DesignTokens/Colors.mdx +2 -0
  600. package/src/stories/DesignTokens/Correspondances.mdx +219 -0
  601. package/src/stories/DesignTokens/UtiliserLesTokens.mdx +235 -0
  602. package/src/stories/DesignTokens/colors.stories.ts +582 -569
  603. package/src/stories/EcoConception/EcoBestPracticesDoc.vue +930 -0
  604. package/src/stories/EcoConception/EcoBestPratices.mdx +38 -0
  605. package/src/stories/EcoConception/Introduction.mdx +8 -1
  606. package/src/stories/EcoConception/datas/bonnes_pratiques_essentielles.json +1018 -0
  607. package/src/stories/EcoConception/ecoconception-best-practices.stories.ts +20 -0
  608. package/src/stories/GuideDuDev/Amelipro.mdx +9 -1
  609. package/src/stories/GuideDuDev/Amelipro.stories.ts +1023 -168
  610. package/src/stories/GuideDuDev/PortailAgent.stories.ts +0 -1
  611. package/src/utils/functions/deepCopy/index.ts +2 -3
  612. package/dist/components/Customs/SyCheckbox/locales.d.ts +0 -3
  613. package/dist/components/LunarCalendar/useLunarCalendarRules.d.ts +0 -5
  614. package/dist/components/PhoneField/tests/types.d.ts +0 -18
  615. package/dist/components/SyHeading/SyHeading.a11y.test.d.ts +0 -1
  616. package/dist/components/SyHeading/SyHeading.test.d.ts +0 -1
  617. package/src/components/Customs/SyCheckbox/locales.ts +0 -3
  618. package/src/components/Customs/SyTextField/types.d.ts +0 -4
  619. package/src/components/LunarCalendar/tests/useLunarCalendarRules.spec.ts +0 -184
  620. package/src/components/LunarCalendar/useLunarCalendarRules.ts +0 -96
  621. package/src/components/PhoneField/tests/types.d.ts +0 -19
@@ -1,426 +1,161 @@
1
1
  <script lang="ts" setup>
2
- import { computed, ref, watch, nextTick } from 'vue'
3
- import type { PropType } from 'vue'
4
- import { mdiAlertOutline, mdiCheck, mdiInformation, mdiPhone } from '@mdi/js'
5
- import { indicatifs } from './indicatifs'
6
- import { Mask } from 'maska'
7
- import { locales } from './locales'
2
+ import { computed, ref, toRef, watch } from 'vue'
3
+ import { mdiPhone, mdiCloseCircle } from '@mdi/js'
4
+ import { locales as defaultLocales } from './locales'
8
5
  import SySelect from '@/components/Customs/Selects/SySelect/SySelect.vue'
9
6
  import SyTextField from '@/components/Customs/SyTextField/SyTextField.vue'
10
7
  import SyIcon from '@/components/Customs/SyIcon/SyIcon.vue'
11
- import { useValidation, type ValidationRule } from '@/composables/validation/useValidation'
12
- import { useValidatable } from '@/composables/validation/useValidatable'
13
-
14
- type DisplayFormat = 'code' | 'code-abbreviation' | 'code-country' | 'country' | 'abbreviation'
15
- type Indicatif = {
16
- code: string
17
- abbreviation: string
18
- country: string
19
- countryFr?: string
20
- mask?: string
21
- phoneLength: number
22
- }
23
-
24
- const props = defineProps({
25
- modelValue: { type: String, default: '' },
26
- // eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
27
- dialCodeModel: { type: [String, Object] as PropType<string | Record<string, any>>, default: '' },
28
- required: { type: Boolean, default: false },
29
- outlined: { type: Boolean, default: true },
30
- outlinedIndicatif: { type: Boolean, default: true },
31
- withCountryCode: { type: Boolean, default: false },
32
- countryCodeRequired: { type: Boolean, default: false },
33
- displayFormat: { type: String as PropType<DisplayFormat>, default: 'code' },
34
- customIndicatifs: { type: Array as PropType<Indicatif[]>, default: () => [] },
35
- useCustomIndicatifsOnly: { type: Boolean, default: false },
36
- isValidatedOnBlur: { type: Boolean, default: true },
37
- displayAsterisk: { type: Boolean, default: false },
38
- disableErrorHandling: { type: Boolean, default: false },
39
- showSuccessMessages: { type: Boolean, default: true },
40
- bgColor: { type: String, default: 'white' },
41
- readonly: { type: Boolean, default: false },
42
- disabled: { type: Boolean, default: false },
43
- helpText: { type: String, default: '' },
44
- autocompleteCountryCode: { type: String, default: 'tel-country-code' },
45
- autocompletePhone: { type: String, default: 'tel-national' },
46
- withoutFieldset: { type: Boolean, default: false },
47
- })
48
-
49
- const emit = defineEmits(['update:modelValue', 'update:selectedDialCode', 'change'])
50
-
51
- const phoneNumber = ref(props.modelValue || '')
52
- // eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
53
- const dialCode = ref<string | Record<string, any>>(props.dialCodeModel || '')
54
- // Force re-render of SySelect when needed (e.g., after reset)
55
- const dialSelectKey = ref(0)
56
- const counter = ref(10)
57
- const phoneMask = ref('## ## ## ## ##')
58
- const onBlur = ref(false)
59
-
60
- const buildDefaultMask = (length: number): string =>
61
- '#'.repeat(length || 10).replace(/(.{2})/g, '$1 ').trim()
62
-
63
- const toTrimmedDigits = (value: string, maxDigits: number): string => {
64
- return value.replace(/\D/g, '').slice(0, maxDigits)
65
- }
66
-
67
- // Cache the Mask instance — recreated only when phoneMask changes, not on every keystroke
68
- const maskInstance = computed(() => new Mask({ mask: phoneMask.value }))
69
- const applyMask = (digits: string): string => maskInstance.value.masked(digits)
70
-
71
- // phoneNumber is always masked, so this is just a stable public alias
72
- const computedValue = computed(() => phoneNumber.value)
73
-
74
- watch(() => props.modelValue, (newVal) => {
75
- if (newVal) {
76
- // Apply mask to incoming value to ensure consistent formatting
77
- const digits = toTrimmedDigits(newVal, counter.value)
78
- phoneNumber.value = applyMask(digits)
79
- }
80
- else {
81
- phoneNumber.value = ''
82
- }
83
- }, { immediate: true })
84
-
85
- const isIndicatifLike = (value: unknown): value is Indicatif => {
86
- return typeof value === 'object'
87
- && value !== null
88
- && 'code' in value
89
- && 'phoneLength' in value
90
- }
91
-
92
- watch(dialCode, async (newVal) => {
93
- // Storybook / composants parents peuvent fournir un objet indicatif "stale" (mask/phoneLength obsolètes).
94
- // On normalise donc TOUJOURS l'indicatif à partir de la liste dialCodeOptions
95
- const dialCodeValue = typeof newVal === 'object' && newVal !== null
96
- ? newVal.code
97
- : newVal
98
- const resolvedDialCode = dialCodeOptions.value.find(opt => opt.code === dialCodeValue)
99
- ?? (isIndicatifLike(newVal) ? newVal : null)
100
- const placeholdersCount = (resolvedDialCode?.mask?.match(/#/g) || []).length
101
- const normalizedDialCode = resolvedDialCode
102
- ? {
103
- ...resolvedDialCode,
104
- // Si le mask n'est pas cohérent avec phoneLength (ex: 10 placeholders mais phoneLength=9),
105
- // on reconstruit un mask de secours à partir de phoneLength.
106
- mask: resolvedDialCode.mask && placeholdersCount === resolvedDialCode.phoneLength
107
- ? resolvedDialCode.mask
108
- : buildDefaultMask(resolvedDialCode.phoneLength),
109
- }
110
- : null
111
-
112
- emit('update:selectedDialCode', normalizedDialCode ?? newVal)
113
-
114
- if (normalizedDialCode) {
115
- counter.value = normalizedDialCode.phoneLength || 10
116
- phoneMask.value = normalizedDialCode.mask || buildDefaultMask(normalizedDialCode.phoneLength)
117
- const digits = toTrimmedDigits(phoneNumber.value, counter.value)
118
- const maskedValue = applyMask(digits)
119
- phoneNumber.value = maskedValue
120
- emit('update:modelValue', maskedValue)
121
-
122
- await nextTick()
123
- await nextTick()
124
-
125
- // Le changement d'indicatif modifie les règles (longueur attendue), donc on revalide immédiatement
126
- // si une valeur est déjà saisie. Objectif: messages à jour sans nécessiter un nouveau blur.
127
- if (!shouldDisableErrorHandling.value && phoneNumber.value) {
128
- onBlur.value = true
129
- runValidation()
130
- }
131
- }
8
+ import { validationPropsDefaults } from '@/composables/unifyValidation/useValidation'
9
+ import type { PhoneFieldProps } from './types'
10
+ import { usePhoneIndicatifs } from './usePhoneIndicatifs'
11
+ import { vMaska } from 'maska/vue'
12
+ import { Mask } from 'maska'
13
+ import type { Indicatif } from './types'
14
+ import { usePhoneFieldValidation } from './usePhoneFieldValidation'
15
+ import FieldState from '@/components/Customs/SyTextField/FieldState.vue'
16
+
17
+ const props = withDefaults(defineProps<PhoneFieldProps>(), {
18
+ ...validationPropsDefaults,
19
+ modelValue: '',
20
+ dialCodeModel: '',
21
+ outlined: true,
22
+ withCountryCode: false,
23
+ displayFormat: 'code',
24
+ customIndicatifs: () => [],
25
+ useCustomIndicatifsOnly: false,
26
+ displayAsterisk: true,
27
+ bgColor: 'white',
28
+ helpText: '',
29
+ autocompleteCountryCode: 'tel-country-code',
30
+ autocompletePhone: 'tel-national',
31
+ withoutFieldset: false,
32
+ isClearable: false,
33
+ locales: () => defaultLocales,
132
34
  })
133
35
 
134
- /**
135
- * Calcule la position ajustée du curseur en tenant compte des espaces ajoutés par le masque
136
- * @param cursorPosition - Position originale du curseur
137
- * @param originalValue - Valeur avant application du masque
138
- * @param maskedValue - Valeur après application du masque
139
- * @returns Position ajustée du curseur
140
- */
141
- const calculateAdjustedPosition = (cursorPosition: number, originalValue: string, maskedValue: string): number => {
142
- // Compte combien de caractères non-espace se trouvent avant la position du curseur dans la valeur originale
143
- const digitsBeforeCursor = originalValue.substring(0, cursorPosition).replace(/\s/g, '').length
144
-
145
- // Parcours la valeur masquée pour trouver la position qui contient le même nombre de caractères non-espace
146
- let newPosition = 0
147
- let digitCount = 0
148
-
149
- for (let i = 0; i < maskedValue.length; i++) {
150
- if (maskedValue[i] !== ' ') {
151
- digitCount++
152
- }
153
-
154
- if (digitCount > digitsBeforeCursor) {
155
- break
156
- }
157
-
158
- newPosition = i + 1
159
- }
160
-
161
- return newPosition
162
- }
163
-
164
- const handlePhoneInput = (event: Event) => {
165
- const inputElement = event.target as HTMLInputElement
166
- const input = inputElement.value
167
-
168
- // Sauvegarder la position du curseur
169
- const cursorPosition = inputElement.selectionStart || 0
170
-
171
- // Appliquer le masque (en tronquant au nombre de chiffres attendu)
172
- const digits = toTrimmedDigits(input, counter.value)
173
- const maskedValue = applyMask(digits)
174
-
175
- // Mettre à jour la valeur
176
- phoneNumber.value = maskedValue
177
- emit('update:modelValue', maskedValue)
178
-
179
- // Restaurer la position du curseur sur le prochain cycle de rendu
180
- nextTick(() => {
181
- const adjustedPosition = calculateAdjustedPosition(cursorPosition, input, maskedValue)
182
- inputElement.setSelectionRange(adjustedPosition, adjustedPosition)
183
- })
184
- }
185
-
186
- const handlePhoneModelUpdate = (value: string | number | null) => {
187
- const digits = toTrimmedDigits(String(value ?? ''), counter.value)
188
- const maskedValue = applyMask(digits)
189
- phoneNumber.value = maskedValue
190
- emit('update:modelValue', maskedValue)
191
- }
192
-
193
- const handlePhoneKeydown = (event: KeyboardEvent) => {
194
- if (counter.value <= 0) return
195
- if (!event.key || !/\d/.test(event.key)) return
196
-
197
- const inputElement = event.target as HTMLInputElement | null
198
- const selectionStart = inputElement?.selectionStart ?? null
199
- const selectionEnd = inputElement?.selectionEnd ?? null
200
- const hasSelection
201
- = selectionStart !== null
202
- && selectionEnd !== null
203
- && selectionEnd > selectionStart
204
-
205
- const currentDigitsCount = phoneNumber.value.replace(/\D/g, '').length
206
- if (currentDigitsCount >= counter.value && !hasSelection) {
207
- event.preventDefault()
208
- }
209
- }
210
-
211
- const mergedDialCodes = computed(() =>
212
- props.useCustomIndicatifsOnly ? props.customIndicatifs : [...indicatifs, ...props.customIndicatifs],
213
- )
214
-
215
- const dialCodeOptions = computed(() =>
216
- mergedDialCodes.value.map(ind => ({
217
- ...ind,
218
- displayText: generateDisplayText(ind),
219
- plainDisplayText: generateDisplayText(ind, true),
220
- })),
36
+ const emits = defineEmits<{
37
+ 'update:modelValue': [value: string]
38
+ 'update:dialCodeModel': [value: Indicatif | string | undefined]
39
+ }>()
40
+
41
+ const phoneNumber = ref<string>(props.modelValue)
42
+ const { internalDialCode, dialCodeList } = usePhoneIndicatifs(
43
+ toRef(props, 'dialCodeModel'),
44
+ toRef(props, 'displayFormat'),
45
+ toRef(props, 'customIndicatifs'),
46
+ toRef(props, 'useCustomIndicatifsOnly'),
221
47
  )
222
48
 
223
- watch(() => props.readonly, () => {
224
- if (onBlur.value && !shouldDisableErrorHandling.value) {
225
- runValidation()
226
- }
49
+ watch (phoneNumber, (newVal) => {
50
+ emits('update:modelValue', newVal)
227
51
  })
228
52
 
229
- const getFranceDefault = () =>
230
- dialCodeOptions.value.find(opt => opt.code === '+33') ?? ''
231
-
232
- // Watcher pour initialiser dialCode à partir de props.dialCodeModel
233
- watch(() => props.dialCodeModel, (newVal) => {
234
- if (!newVal) {
235
- // Par défaut, pré-sélectionner la France (+33) quand l'indicatif est activé
236
- dialCode.value = props.withCountryCode ? getFranceDefault() : ''
237
- return
53
+ watch (() => props.modelValue, (newVal) => {
54
+ if (newVal !== phoneNumber.value) {
55
+ phoneNumber.value = newVal || ''
238
56
  }
239
-
240
- if (typeof newVal === 'object') {
241
- const matchingOption = dialCodeOptions.value.find(opt => opt.code === newVal.code)
242
- dialCode.value = matchingOption ?? newVal
243
- }
244
- else {
245
- dialCode.value = newVal
246
- }
247
- }, { immediate: true })
248
-
249
- function generateDisplayText(ind: Indicatif, plain = false): string {
250
- const countryName = ind.countryFr || ind.country
251
- const abbr = plain ? ind.abbreviation : `<abbr title="${countryName}">${ind.abbreviation}</abbr>`
252
- const format: Record<DisplayFormat, string> = {
253
- 'code': ind.code,
254
- 'code-abbreviation': `${ind.code} (${abbr})`,
255
- 'code-country': `${ind.code} ${countryName}`,
256
- 'country': countryName,
257
- 'abbreviation': abbr,
258
- }
259
- return format[props.displayFormat] ?? ind.code
260
- }
261
-
262
- const phoneFieldIdentifier = computed(() => props.withCountryCode
263
- ? locales.phoneNumberWithoutCountryLabel
264
- : locales.label,
265
- )
266
-
267
- const validationRules = computed<ValidationRule[]>(() => {
268
- const rules = [{
269
- type: 'exactLength',
270
- options: {
271
- length: counter.value,
272
- ignoreSpace: true,
273
- message: `Le numéro de téléphone doit contenir ${counter.value} chiffres.`,
274
- successMessage: `Le champ ${phoneFieldIdentifier.value} est valide.`,
275
- fieldIdentifier: phoneFieldIdentifier.value,
276
- },
277
- }] as ValidationRule[]
278
-
279
- if (props.required) {
280
- rules.unshift({
281
- type: 'required',
282
- options: {
283
- length: counter.value,
284
- ignoreSpace: true,
285
- message: `Le champ ${phoneFieldIdentifier.value} est requis.`,
286
- fieldIdentifier: phoneFieldIdentifier.value,
287
- },
288
- })
289
- }
290
-
291
- return rules
292
57
  })
293
58
 
294
- const shouldDisableErrorHandling = computed(() => props.disableErrorHandling || props.readonly)
295
-
296
- // When disabling error handling, immediately clear any existing validation state
297
- watch(shouldDisableErrorHandling, (disabled) => {
298
- if (disabled) {
299
- validation.clearValidation()
300
- }
59
+ watch (internalDialCode, (newVal) => {
60
+ emits('update:dialCodeModel', newVal)
301
61
  })
302
62
 
303
- const validation = useValidation({
304
- showSuccessMessages: props.showSuccessMessages,
305
- disableErrorHandling: shouldDisableErrorHandling.value,
306
- })
307
-
308
- const hasError = computed(() => !shouldDisableErrorHandling.value && validation.hasError.value)
309
- const hasWarning = computed(() => !shouldDisableErrorHandling.value && validation.hasWarning.value)
310
- const hasSuccess = computed(() =>
311
- !shouldDisableErrorHandling.value
312
- && !hasError.value
313
- && !hasWarning.value
314
- && validation.hasSuccess.value,
315
- )
316
-
317
- const iconColor = computed(() => {
318
- if (shouldDisableErrorHandling.value) return '#222324'
319
- if (hasError.value) return 'error'
320
- if (hasWarning.value) return 'warning'
321
- if (hasSuccess.value) return 'success'
322
- return '#222324'
323
- })
324
-
325
- const errors = computed(() => shouldDisableErrorHandling.value ? [] : validation.errors.value)
326
- const warnings = computed(() => shouldDisableErrorHandling.value ? [] : validation.warnings.value)
327
- const successes = computed(() =>
328
- shouldDisableErrorHandling.value || hasError.value || hasWarning.value
329
- ? []
330
- : validation.displaySuccesses.value,
331
- )
332
-
333
63
  const showHelpTextBelow = computed(() => !!props.helpText?.trim())
64
+ const focused = ref(false)
334
65
 
335
- const runValidation = async (): Promise<void> => {
336
- const cleanedValue = phoneNumber.value.replace(/\s/g, '')
337
- await validation.validateField(cleanedValue, validationRules.value)
338
- }
339
-
340
- function validateInputOnBlur() {
341
- emit('change', phoneNumber.value)
342
-
343
- if (!props.isValidatedOnBlur || shouldDisableErrorHandling.value) return
66
+ const {
67
+ errors,
68
+ warnings,
69
+ successes,
70
+ hasError,
71
+ hasWarning,
72
+ hasSuccess,
73
+ state,
74
+ iconColor,
75
+ validate,
76
+ clearValidation,
77
+ } = usePhoneFieldValidation({
78
+ modelValue: phoneNumber,
79
+ readonly: toRef(props, 'readonly'),
80
+ disabled: toRef(props, 'disabled'),
81
+ required: toRef(props, 'required'),
82
+ counter: computed(() => internalDialCode.value.phoneLength || 10),
83
+ phoneFieldIdentifier: computed(() => props.withCountryCode ? props.locales?.phoneNumberWithoutCountryLabel || 'Numéro de téléphone' : props.locales?.label || 'Téléphone'),
84
+ shouldDisableErrorHandling: computed(() => props.disableErrorHandling || props.readonly),
85
+ hasError: toRef(props, 'hasError'),
86
+ hasWarning: toRef(props, 'hasWarning'),
87
+ hasSuccess: toRef(props, 'hasSuccess'),
88
+ showSuccessMessages: toRef(props, 'showSuccessMessages'),
89
+ disableErrorHandling: toRef(props, 'disableErrorHandling'),
90
+ isValidateOnBlur: toRef(props, 'isValidateOnBlur'),
91
+ focused,
92
+ customRules: toRef(props, 'customRules'),
93
+ warningRules: toRef(props, 'customWarningRules'),
94
+ successRules: toRef(props, 'customSuccessRules'),
95
+ rules: toRef(props, 'rules'),
96
+ errorMessages: toRef(props, 'errorMessages'),
97
+ warningMessages: toRef(props, 'warningMessages'),
98
+ successMessages: toRef(props, 'successMessages'),
99
+ locales: toRef(props, 'locales'),
100
+ dialCode: internalDialCode,
101
+ withCountryCode: toRef(props, 'withCountryCode'),
102
+ })
344
103
 
345
- onBlur.value = true
346
- runValidation()
104
+ const validation = {
105
+ clearValidation,
106
+ errors,
107
+ warnings,
108
+ successes,
109
+ hasError,
110
+ hasWarning,
111
+ hasSuccess,
347
112
  }
348
113
 
349
- watch(phoneNumber, async (newValue) => {
350
- if (shouldDisableErrorHandling.value) return
114
+ const phoneMask = computed(() => internalDialCode.value.mask)
351
115
 
352
- if (!props.isValidatedOnBlur) {
353
- // Validation en temps réel (isValidatedOnBlur=false)
354
- const cleanedValue = newValue.replace(/\s/g, '')
355
- await validation.validateField(cleanedValue, validationRules.value)
356
- }
357
- else if (onBlur.value) {
358
- // Après un premier blur, effacer les erreurs pendant la frappe —
359
- // la revalidation se fera au prochain blur (comme SyTextField)
360
- validation.clearValidation()
361
- }
362
- })
116
+ // Rattrape l'autofill du navigateur : avec un champ indicatif séparé, le navigateur
117
+ // remplit `tel-national` sans le préfixe national « 0 » (ex. « 612345678 »). On le détecte
118
+ // via un saut du nombre de chiffres ( frappe au clavier) et on repréfixe « 0 ».
119
+ const maskInstance = computed(() => new Mask({ mask: phoneMask.value }))
120
+ const previousDigitCount = ref(0)
363
121
 
364
- watch(validationRules, () => {
365
- if (onBlur.value && !shouldDisableErrorHandling.value) {
366
- runValidation()
367
- }
368
- })
122
+ function handleNumberInput(event: Event) {
123
+ const target = event.target as HTMLInputElement | null
124
+ if (!target) return
369
125
 
370
- /**
371
- * Valide le champ lors de la soumission d'un formulaire
372
- * @returns Promise<boolean> - true si le champ est valide, false sinon
373
- */
374
- const validateOnSubmit = async (): Promise<boolean> => {
375
- if (shouldDisableErrorHandling.value) {
376
- return true
377
- }
126
+ const digits = target.value.replace(/\D/g, '')
127
+ const jumped = digits.length - previousDigitCount.value > 1
128
+ previousDigitCount.value = digits.length
378
129
 
379
- onBlur.value = true
380
- await runValidation()
381
-
382
- if (props.withCountryCode && props.countryCodeRequired && !dialCode.value) {
383
- validation.errors.value.push(`Le champ ${locales.indicatifLabel} est requis.`)
130
+ const expectedLength = internalDialCode.value.phoneLength || 10
131
+ if (props.withCountryCode && jumped && digits.length === expectedLength - 1 && !digits.startsWith('0')) {
132
+ const normalized = maskInstance.value.masked(`0${digits}`)
133
+ phoneNumber.value = normalized
134
+ previousDigitCount.value = expectedLength
384
135
  }
385
-
386
- return !validation.hasError.value
387
136
  }
388
137
 
389
- // Reset hook used by SyForm.reset() via useValidatable
390
- const reset = () => {
391
- // Reset interaction state and validation FIRST to avoid triggering watchers with errors
392
- onBlur.value = false
393
- validation.clearValidation()
138
+ const showClear = computed(() => {
139
+ if (!props.isClearable) return false
140
+ if (props.disabled) return false
141
+ return phoneNumber.value !== undefined && phoneNumber.value !== null && String(phoneNumber.value) !== ''
142
+ })
394
143
 
395
- // Clear content
144
+ function clearField() {
396
145
  phoneNumber.value = ''
397
- emit('update:modelValue', '')
398
-
399
- // Reset dial code : France par défaut si indicatif activé, sinon vide
400
- const defaultDialCode = props.withCountryCode ? getFranceDefault() : ''
401
- dialCode.value = defaultDialCode
402
- emit('update:selectedDialCode', defaultDialCode)
403
- counter.value = 10
404
- phoneMask.value = '## ## ## ## ##'
405
-
406
- // Force SySelect to be recreated to ensure internal classes are reset
407
- dialSelectKey.value++
146
+ clearValidation()
408
147
  }
409
148
 
410
- // Intégration avec le système de validation du formulaire
411
- useValidatable(validateOnSubmit, validation.clearValidation, reset)
412
-
413
149
  defineExpose({
414
- computedValue,
415
- dialCode,
416
- phoneMask,
417
- counter,
150
+ dialCodeList,
418
151
  hasError,
419
- phoneNumber,
420
- mergedDialCodes,
152
+ errors,
421
153
  validation,
422
- validateOnSubmit,
154
+ validateOnSubmit: validate,
155
+ phoneMask,
156
+ clearValidation,
423
157
  })
158
+
424
159
  </script>
425
160
 
426
161
  <template>
@@ -440,24 +175,20 @@
440
175
  class="phone-field-country"
441
176
  >
442
177
  <SySelect
443
- :key="dialSelectKey"
444
- v-model="dialCode"
445
- :items="dialCodeOptions"
178
+ v-model="internalDialCode"
179
+ :items="dialCodeList"
446
180
  :label="locales.indicatifLabel"
447
- :outlined="outlinedIndicatif"
448
- :required="countryCodeRequired"
449
- :aria-required="countryCodeRequired"
450
- :error="!!errors[1]"
451
- :error-messages="errors[1] ? [errors[1]] : []"
452
- :display-asterisk="displayAsterisk"
453
- :disable-error-handling="shouldDisableErrorHandling"
181
+ :outlined="props.outlined"
182
+ :aria-required="true"
183
+ :display-asterisk="props.displayAsterisk"
184
+ :disable-error-handling="props.disableErrorHandling || props.readonly"
185
+ :bg-color="props.bgColor"
186
+ :readonly="props.readonly"
187
+ :disabled="props.disabled"
188
+ :autocomplete="props.autocompleteCountryCode"
454
189
  :return-object="true"
455
- :bg-color="bgColor"
456
- :readonly="readonly"
457
- :disabled="disabled"
458
- :allow-html="displayFormat === 'code-abbreviation' || displayFormat === 'abbreviation'"
459
- :autocomplete="autocompleteCountryCode"
460
- class="custom-select mr-0 mr-sm-4"
190
+ :allow-html="true"
191
+ class="dial-code-select mr-0 mr-sm-4"
461
192
  text-key="displayText"
462
193
  plain-text-key="plainDisplayText"
463
194
  value-key="code"
@@ -465,25 +196,26 @@
465
196
  </div>
466
197
  <div class="phone-field-number">
467
198
  <SyTextField
468
- ref="phoneField"
469
- :model-value="phoneNumber"
470
- :counter="counter"
199
+ v-model="phoneNumber"
200
+ v-maska="internalDialCode.mask"
201
+ :counter="internalDialCode.phoneLength"
471
202
  :counter-value="(value: string) => value.replace(/\D/g, '').length"
472
203
  :label="withCountryCode ? locales.phoneNumberWithoutCountryLabel : locales.label"
473
- :required="required"
474
- :aria-required="required"
204
+ :required="props.required"
205
+ :aria-required="props.required"
475
206
  :error="hasError"
476
207
  :error-messages="errors"
477
208
  :warning-messages="warnings"
478
209
  :success-messages="successes"
479
210
  :show-success-messages="props.showSuccessMessages"
480
- :disable-error-handling="shouldDisableErrorHandling"
481
- :variant="outlined ? 'outlined' : 'underlined'"
482
- :display-asterisk="displayAsterisk"
483
- :readonly="readonly"
484
- :bg-color="bgColor"
485
- :disabled="disabled"
486
- :autocomplete="autocompletePhone"
211
+ :disable-error-handling="props.disableErrorHandling || props.readonly"
212
+ :variant="props.outlined ? 'outlined' : 'underlined'"
213
+ :display-asterisk="props.displayAsterisk"
214
+ :readonly="props.readonly"
215
+ :bg-color="props.bgColor"
216
+ :disabled="props.disabled"
217
+ :hide-details="props.hideDetails"
218
+ :autocomplete="props.autocompletePhone"
487
219
  :class="{
488
220
  'phone-field': true,
489
221
  'error-field': hasError,
@@ -492,30 +224,31 @@
492
224
  }"
493
225
  color="primary"
494
226
  type="tel"
495
- @blur="validateInputOnBlur"
496
- @update:model-value="handlePhoneModelUpdate"
497
- @input="handlePhoneInput"
498
- @keydown="handlePhoneKeydown"
227
+ @input="handleNumberInput"
228
+ @focus="focused = true"
229
+ @blur="focused = false"
499
230
  >
500
231
  <template #append-inner>
501
232
  <div class="d-flex align-center">
502
- <SyIcon
503
- v-if="hasError"
504
- color="error"
505
- :icon="mdiInformation"
506
- decorative
507
- />
508
- <SyIcon
509
- v-else-if="hasWarning"
510
- color="warning"
511
- :icon="mdiAlertOutline"
512
- decorative
513
- />
514
- <SyIcon
515
- v-else-if="hasSuccess"
516
- color="success"
517
- :icon="mdiCheck"
518
- decorative
233
+ <button
234
+ v-if="showClear"
235
+ type="button"
236
+ class="phone-field__clear-button mr-1"
237
+ :aria-label="props.label ? locales.clearButtonAriaLabelWithField(props.label) : locales.clearButtonAriaLabel"
238
+ :title="props.label ? locales.clearButtonTitleWithField(props.label) : locales.clearButtonTitle"
239
+ @click.stop="clearField"
240
+ @keydown.enter.stop
241
+ @keydown.space.stop
242
+ >
243
+ <SyIcon
244
+ class="phone-field__clear-icon"
245
+ :icon="mdiCloseCircle"
246
+ :decorative="true"
247
+ width="24"
248
+ />
249
+ </button>
250
+ <FieldState
251
+ :state="state"
519
252
  />
520
253
  <SyIcon
521
254
  class="ml-2"
@@ -598,7 +331,7 @@
598
331
  flex: 1 1 auto;
599
332
  }
600
333
 
601
- .custom-select {
334
+ .dial-code-select {
602
335
  margin-bottom: 0;
603
336
  min-width: 144px;
604
337
  }
@@ -621,7 +354,7 @@
621
354
  }
622
355
 
623
356
  .help-text-below {
624
- font-size: 0.75rem;
357
+ font-size: var(--v-fontSize-liensEtLibelles);
625
358
  line-height: 1.25rem;
626
359
  color: rgb(var(--v-theme-on-surface));
627
360
  opacity: 0.6;
@@ -630,4 +363,37 @@
630
363
  opacity: 0.38;
631
364
  }
632
365
  }
366
+
367
+ .phone-field__clear-button {
368
+ background: transparent;
369
+ border: none;
370
+ padding: 0;
371
+ cursor: pointer;
372
+ display: flex;
373
+ align-items: center;
374
+ justify-content: center;
375
+
376
+ .v-icon {
377
+ position: static;
378
+ }
379
+ }
380
+
381
+ .phone-field__clear-icon {
382
+ color: rgb(var(--v-theme-onSurface)) !important;
383
+ opacity: var(--v-medium-emphasis-opacity) !important;
384
+ }
385
+
386
+ /* Icône de validation (état) : atténuée à ~0.6 sur PhoneField */
387
+ .phone-field-number :deep(.field-state-icon .v-icon__svg) {
388
+ opacity: 0.6 !important;
389
+ }
390
+
391
+ /* …sauf en erreur, où l'icône reste à pleine opacité comme sur les autres composants */
392
+ .phone-field-number :deep(.error-icon .v-icon__svg) {
393
+ opacity: 1 !important;
394
+ }
395
+
396
+ :deep(.phone-field__clear-icon .v-icon__svg) {
397
+ fill: rgb(var(--v-theme-onSurface)) !important;
398
+ }
633
399
  </style>