@cnamts/synapse 1.0.26 → 1.1.0

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 (612) hide show
  1. package/README.md +1 -1
  2. package/dist/{AutocompleteFilter-BPR-a55G.js → AutocompleteFilter-DXd4szWO.js} +1 -1
  3. package/dist/{DateFilter-CknrJWs2.js → DateFilter-BD59Kgwf.js} +1 -1
  4. package/dist/{NumberFilter-DJ-yNlzv.js → NumberFilter-BSMZE7uw.js} +1 -1
  5. package/dist/{PeriodFilter-CiB5Oa9Z.js → PeriodFilter-keUdSSk0.js} +1 -1
  6. package/dist/{SelectFilter-EiafX97M.js → SelectFilter-Dhvvwazl.js} +1 -1
  7. package/dist/{TextFilter-BzOmpdxj.js → TextFilter-CU8FpXz0.js} +1 -1
  8. package/dist/apLightTheme2026-DbS7BPUf.js +612 -0
  9. package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +4 -4
  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 +4 -4
  13. package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +4 -4
  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/CookiesSelection/CookiesInformation/CookiesInformation.d.ts +2 -2
  17. package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +2275 -487
  18. package/dist/components/Customs/Selects/SyAutocomplete/composables/useSyAutocompleteValidation.d.ts +18 -0
  19. package/dist/components/Customs/Selects/SyAutocomplete/utils/ariaManager.d.ts +1 -1
  20. package/dist/components/Customs/Selects/SyAutocomplete/utils/useKeyboardHandler.d.ts +3 -1
  21. package/dist/components/Customs/Selects/SyInputSelect/SyInputSelect.d.ts +1 -1
  22. package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +12 -15
  23. package/dist/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.d.ts +1 -0
  24. package/dist/components/Customs/Selects/SySelect/composables/useSySelectValidation.d.ts +15 -0
  25. package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +4 -4
  26. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +6 -6
  27. package/dist/components/Customs/SyIcon/SyIcon.d.ts +77 -1
  28. package/dist/components/Customs/SyIconButton/SyIconButton.d.ts +18 -0
  29. package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +23 -41
  30. package/dist/components/Customs/SyRadioGroup/composables/useSyRadioGroupValidation.d.ts +50 -0
  31. package/dist/components/Customs/SyTextField/SyTextField.d.ts +20 -80
  32. package/dist/components/Customs/SyTextField/locales.d.ts +7 -0
  33. package/dist/components/Customs/SyTextField/types.d.ts +67 -4
  34. package/dist/components/Customs/SyTextField/useNumberField.d.ts +23 -0
  35. package/dist/components/Customs/SyTextField/useSyTextFieldValidation.d.ts +38 -0
  36. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +253 -694
  37. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +121 -339
  38. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +54 -164
  39. package/dist/components/DatePicker/composables/index.d.ts +1 -0
  40. package/dist/components/DatePicker/composables/useDatePickerValidationBridge.d.ts +51 -0
  41. package/dist/components/FilterInline/FilterInline.d.ts +3 -3
  42. package/dist/components/FilterSideBar/FilterSideBar.d.ts +4 -4
  43. package/dist/components/MonthPicker/MonthPicker.d.ts +49 -162
  44. package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +49 -162
  45. package/dist/components/NirField/NirField.d.ts +120 -351
  46. package/dist/components/NirField/useNirValidation.d.ts +10 -20
  47. package/dist/components/PasswordField/PasswordField.d.ts +21 -40
  48. package/dist/components/PasswordField/locales.d.ts +2 -0
  49. package/dist/components/PasswordField/types.d.ts +16 -0
  50. package/dist/components/PasswordField/usePasswordFieldValidation.d.ts +38 -0
  51. package/dist/components/PeriodField/PeriodField.d.ts +485 -1365
  52. package/dist/components/PhoneField/PhoneField.d.ts +49 -162
  53. package/dist/components/SearchListField/SearchListField.d.ts +3 -3
  54. package/dist/components/SyTextArea/SyTextArea.d.ts +30 -17
  55. package/dist/components/SyTextArea/composables/useSyTextAreaValidation.d.ts +20 -0
  56. package/dist/components/SyTextArea/locales.d.ts +1 -0
  57. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +1 -0
  58. package/dist/components/Tables/SyTable/SyTable.d.ts +1 -0
  59. package/dist/components/Tables/common/SyTablePagination.d.ts +33 -34
  60. package/dist/components/Tables/common/types.d.ts +2 -0
  61. package/dist/components/index.d.ts +1 -0
  62. package/dist/composables/unifyValidation/documentationValidationProps.d.ts +160 -160
  63. package/dist/composables/unifyValidation/useValidation.d.ts +17 -23
  64. package/dist/composables/useFilterable/useFilterable.d.ts +1 -2
  65. package/dist/design-system-v3.js +81 -80
  66. package/dist/designTokens/tokens/amelipro/apContextual.d.ts +6 -6
  67. package/dist/designTokens/tokens/amelipro/apDarkTheme.d.ts +3 -1
  68. package/dist/designTokens/tokens/amelipro/apLightTheme.d.ts +54 -100
  69. package/dist/designTokens/tokens/baseContextualTokens.d.ts +0 -6
  70. package/dist/designTokens/tokens/baseTokens.d.ts +232 -0
  71. package/dist/designTokens/tokens/cnam/cnamContextual.d.ts +6 -6
  72. package/dist/designTokens/tokens/cnam/cnamDarkTheme.d.ts +1 -1
  73. package/dist/designTokens/tokens/cnam/cnamLightTheme.d.ts +57 -101
  74. package/dist/designTokens/tokens/pa/paContextual.d.ts +0 -6
  75. package/dist/designTokens/tokens/pa/paDarkTheme.d.ts +1 -1
  76. package/dist/designTokens/tokens/pa/paLightTheme.d.ts +54 -97
  77. package/dist/designTokens/tokens/pa/paSemantic.d.ts +1 -0
  78. package/dist/designTokens/tokens/semanticTokens.d.ts +112 -0
  79. package/dist/main-D8ryUoS5.js +39481 -0
  80. package/dist/synapse.css +1 -1
  81. package/dist/vuetifyConfig.js +212 -74
  82. package/package.json +8 -5
  83. package/src/assets/overrides/_icons.scss +5 -4
  84. package/src/assets/overrides/_otp.scss +4 -4
  85. package/src/assets/overrides/_typography.scss +2 -1
  86. package/src/assets/overrides/_utilities.scss +1 -42
  87. package/src/components/Accordion/tests/Accordion.visual.cy.ts +44 -0
  88. package/src/components/Accordion/tests/__snapshots__/accordion-default.snap.png +0 -0
  89. package/src/components/Accordion/tests/__snapshots__/accordion-disabled-item.snap.png +0 -0
  90. package/src/components/Accordion/tests/__snapshots__/accordion-open-first.snap.png +0 -0
  91. package/src/components/BackBtn/tests/__snapshots__/back-btn-custom-bg.snap.png +0 -0
  92. package/src/components/BackBtn/tests/__snapshots__/back-btn-default.snap.png +0 -0
  93. package/src/components/BackBtn/tests/__snapshots__/back-btn-no-icon.snap.png +0 -0
  94. package/src/components/BackToTopBtn/tests/BackToTopBtn.visual.cy.ts +34 -0
  95. package/src/components/BackToTopBtn/tests/__snapshots__/back-to-top-btn-custom-nudge.snap.png +0 -0
  96. package/src/components/BackToTopBtn/tests/__snapshots__/back-to-top-btn-default.snap.png +0 -0
  97. package/src/components/Captcha/tests/Captcha.visual.cy.ts +45 -0
  98. package/src/components/Captcha/tests/__snapshots__/Captcha.spec.ts.snap +4 -0
  99. package/src/components/Captcha/tests/__snapshots__/captcha-audio-type.snap.png +0 -0
  100. package/src/components/Captcha/tests/__snapshots__/captcha-image-type.snap.png +0 -0
  101. package/src/components/Captcha/tests/__snapshots__/captcha-no-helpdesk.snap.png +0 -0
  102. package/src/components/ChipList/ChipList.vue +30 -18
  103. package/src/components/ChipList/tests/ChipList.visual.cy.ts +46 -0
  104. package/src/components/ChipList/tests/__snapshots__/chip-list-default.snap.png +0 -0
  105. package/src/components/ChipList/tests/__snapshots__/chip-list-readonly.snap.png +0 -0
  106. package/src/components/ChipList/tests/__snapshots__/chip-list-state-icons.snap.png +0 -0
  107. package/src/components/ChipList/tests/chipList.spec.ts +4 -4
  108. package/src/components/CollapsibleList/tests/CollapsibleList.visual.cy.ts +33 -0
  109. package/src/components/CollapsibleList/tests/__snapshots__/collapsible-list-default.snap.png +0 -0
  110. package/src/components/CollapsibleList/tests/__snapshots__/collapsible-list-no-title.snap.png +0 -0
  111. package/src/components/ContextualMenu/tests/ContextualMenu.visual.cy.ts +35 -0
  112. package/src/components/ContextualMenu/tests/__snapshots__/contextual-menu-default.snap.png +0 -0
  113. package/src/components/ContextualMenu/tests/__snapshots__/contextual-menu-selected.snap.png +0 -0
  114. package/src/components/CookieBanner/tests/CookieBanner.visual.cy.ts +29 -0
  115. package/src/components/CookieBanner/tests/__snapshots__/cookie-banner-default.snap.png +0 -0
  116. package/src/components/CookieBanner/tests/__snapshots__/cookie-banner-with-items.snap.png +0 -0
  117. package/src/components/CookiesSelection/tests/CookiesSelection.visual.cy.ts +21 -0
  118. package/src/components/CookiesSelection/tests/__snapshots__/cookies-selection-default.snap.png +0 -0
  119. package/src/components/CopyBtn/CopyBtn.vue +2 -2
  120. package/src/components/CopyBtn/tests/CopyBtn.visual.cy.ts +24 -0
  121. package/src/components/CopyBtn/tests/__snapshots__/copy-btn-default.snap.png +0 -0
  122. package/src/components/CopyBtn/tests/__snapshots__/copy-btn-no-tooltip.snap.png +0 -0
  123. package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.stories.ts +4 -0
  124. package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.vue +7 -6
  125. package/src/components/Customs/Selects/SelectBtnField/tests/SelectBtnField.spec.ts +223 -0
  126. package/src/components/Customs/Selects/SelectBtnField/tests/SelectBtnField.visual.cy.ts +60 -0
  127. package/src/components/Customs/Selects/SelectBtnField/tests/__snapshots__/select-btn-field-default.snap.png +0 -0
  128. package/src/components/Customs/Selects/SelectBtnField/tests/__snapshots__/select-btn-field-inline.snap.png +0 -0
  129. package/src/components/Customs/Selects/SelectBtnField/tests/__snapshots__/select-btn-field-readonly.snap.png +0 -0
  130. package/src/components/Customs/Selects/SelectBtnField/tests/__snapshots__/select-btn-field-selected.snap.png +0 -0
  131. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +283 -351
  132. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +183 -219
  133. package/src/components/Customs/Selects/SyAutocomplete/composables/useSyAutocompleteValidation.ts +101 -0
  134. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +763 -1
  135. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.visual.cy.ts +63 -0
  136. package/src/components/Customs/Selects/SyAutocomplete/tests/__snapshots__/sy-autocomplete-default.snap.png +0 -0
  137. package/src/components/Customs/Selects/SyAutocomplete/tests/__snapshots__/sy-autocomplete-loading.snap.png +0 -0
  138. package/src/components/Customs/Selects/SyAutocomplete/tests/__snapshots__/sy-autocomplete-multiple.snap.png +0 -0
  139. package/src/components/Customs/Selects/SyAutocomplete/tests/__snapshots__/sy-autocomplete-with-value.snap.png +0 -0
  140. package/src/components/Customs/Selects/SyAutocomplete/utils/ariaManager.ts +3 -1
  141. package/src/components/Customs/Selects/SyAutocomplete/utils/useKeyboardHandler.ts +79 -5
  142. package/src/components/Customs/Selects/SyAutocomplete/validation/Validation.stories.ts +936 -0
  143. package/src/components/Customs/Selects/SyInputSelect/tests/SyInputSelect.visual.cy.ts +48 -0
  144. package/src/components/Customs/Selects/SyInputSelect/tests/__snapshots__/sy-input-select-default.snap.png +0 -0
  145. package/src/components/Customs/Selects/SyInputSelect/tests/__snapshots__/sy-input-select-required.snap.png +0 -0
  146. package/src/components/Customs/Selects/SyInputSelect/tests/__snapshots__/sy-input-select-with-value.snap.png +0 -0
  147. package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +9 -491
  148. package/src/components/Customs/Selects/SySelect/SySelect.vue +68 -126
  149. package/src/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.ts +3 -0
  150. package/src/components/Customs/Selects/SySelect/composables/useSySelectValidation.ts +64 -0
  151. package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +199 -3
  152. package/src/components/Customs/Selects/SySelect/tests/SySelect.visual.cy.ts +77 -0
  153. package/src/components/Customs/Selects/SySelect/tests/__snapshots__/sy-select-clearable.snap.png +0 -0
  154. package/src/components/Customs/Selects/SySelect/tests/__snapshots__/sy-select-default.snap.png +0 -0
  155. package/src/components/Customs/Selects/SySelect/tests/__snapshots__/sy-select-multiple-chips.snap.png +0 -0
  156. package/src/components/Customs/Selects/SySelect/tests/__snapshots__/sy-select-required.snap.png +0 -0
  157. package/src/components/Customs/Selects/SySelect/tests/__snapshots__/sy-select-with-value.snap.png +0 -0
  158. package/src/components/Customs/Selects/SySelect/validation/Validation.stories.ts +935 -0
  159. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.stories.ts +18 -7
  160. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +3 -3
  161. package/src/components/Customs/SyCheckBoxGroup/tests/SyCheckBoxGroup.visual.cy.ts +55 -0
  162. package/src/components/Customs/SyCheckBoxGroup/tests/__snapshots__/sy-checkbox-group-default.snap.png +0 -0
  163. package/src/components/Customs/SyCheckBoxGroup/tests/__snapshots__/sy-checkbox-group-disabled.snap.png +0 -0
  164. package/src/components/Customs/SyCheckBoxGroup/tests/__snapshots__/sy-checkbox-group-selected.snap.png +0 -0
  165. package/src/components/Customs/SyCheckBoxGroup/tests/__snapshots__/sy-checkbox-group-with-label.snap.png +0 -0
  166. package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +8 -8
  167. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +9 -17
  168. package/src/components/Customs/SyCheckbox/tests/SyCheckbox.spec.ts +1 -1
  169. package/src/components/Customs/SyCheckbox/tests/SyCheckbox.visual.cy.ts +61 -0
  170. package/src/components/Customs/SyCheckbox/tests/__snapshots__/sy-checkbox-checked.snap.png +0 -0
  171. package/src/components/Customs/SyCheckbox/tests/__snapshots__/sy-checkbox-disabled.snap.png +0 -0
  172. package/src/components/Customs/SyCheckbox/tests/__snapshots__/sy-checkbox-indeterminate.snap.png +0 -0
  173. package/src/components/Customs/SyCheckbox/tests/__snapshots__/sy-checkbox-required.snap.png +0 -0
  174. package/src/components/Customs/SyCheckbox/tests/__snapshots__/sy-checkbox-unchecked.snap.png +0 -0
  175. package/src/components/Customs/SyIcon/SyIcon.vue +19 -1
  176. package/src/components/Customs/SyIcon/accessibilite/Accessibility.mdx +0 -6
  177. package/src/components/Customs/SyIcon/tests/SyIcon.visual.cy.ts +83 -0
  178. package/src/components/Customs/SyIcon/tests/__snapshots__/sy-icon-color-error.snap.png +0 -0
  179. package/src/components/Customs/SyIcon/tests/__snapshots__/sy-icon-decorative.snap.png +0 -0
  180. package/src/components/Customs/SyIcon/tests/__snapshots__/sy-icon-informative.snap.png +0 -0
  181. package/src/components/Customs/SyIcon/tests/__snapshots__/sy-icon-role-button.snap.png +0 -0
  182. package/src/components/Customs/SyIcon/tests/__snapshots__/sy-icon-size-large.snap.png +0 -0
  183. package/src/components/Customs/SyIcon/utils/tests/iconUtils.spec.ts +107 -0
  184. package/src/components/Customs/SyIconButton/tests/SyIconButton.visual.cy.ts +55 -0
  185. package/src/components/Customs/SyIconButton/tests/__snapshots__/sy-icon-button-default.snap.png +0 -0
  186. package/src/components/Customs/SyIconButton/tests/__snapshots__/sy-icon-button-disabled.snap.png +0 -0
  187. package/src/components/Customs/SyIconButton/tests/__snapshots__/sy-icon-button-error.snap.png +0 -0
  188. package/src/components/Customs/SyIconButton/tests/__snapshots__/sy-icon-button-large.snap.png +0 -0
  189. package/src/components/Customs/SyPagination/tests/SyPagination.visual.cy.ts +40 -0
  190. package/src/components/Customs/SyPagination/tests/__snapshots__/sy-pagination-first-page.snap.png +0 -0
  191. package/src/components/Customs/SyPagination/tests/__snapshots__/sy-pagination-middle-page.snap.png +0 -0
  192. package/src/components/Customs/SyPagination/tests/__snapshots__/sy-pagination-with-label.snap.png +0 -0
  193. package/src/components/Customs/SyRadioGroup/SyRadioGroup.mdx +2 -2
  194. package/src/components/Customs/SyRadioGroup/SyRadioGroup.stories.ts +395 -201
  195. package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +83 -127
  196. package/src/components/Customs/SyRadioGroup/composables/useSyRadioGroupValidation.ts +127 -0
  197. package/src/components/Customs/SyRadioGroup/tests/SyRadioGroup.a11y.spec.ts +93 -1
  198. package/src/components/Customs/SyRadioGroup/tests/SyRadioGroup.spec.ts +146 -9
  199. package/src/components/Customs/SyRadioGroup/tests/SyRadioGroup.visual.cy.ts +165 -0
  200. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-asterisk.snap.png +0 -0
  201. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-comfortable.snap.png +0 -0
  202. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-compact.snap.png +0 -0
  203. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-default.snap.png +0 -0
  204. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-disabled.snap.png +0 -0
  205. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-error.snap.png +0 -0
  206. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-no-details.snap.png +0 -0
  207. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-readonly.snap.png +0 -0
  208. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-selected.snap.png +0 -0
  209. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-success.snap.png +0 -0
  210. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-warning.snap.png +0 -0
  211. package/src/components/Customs/SyRadioGroup/validation/Validation.stories.ts +809 -0
  212. package/src/components/Customs/SyTabs/config.ts +3 -3
  213. package/src/components/Customs/SyTabs/tests/SyTabs.spec.ts +265 -0
  214. package/src/components/Customs/SyTabs/tests/SyTabs.visual.cy.ts +30 -0
  215. package/src/components/Customs/SyTabs/tests/__snapshots__/sy-tabs-default.snap.png +0 -0
  216. package/src/components/Customs/SyTabs/tests/__snapshots__/sy-tabs-second-active.snap.png +0 -0
  217. package/src/components/Customs/SyTabs/tests/useTabTransition.spec.ts +188 -0
  218. package/src/components/Customs/SyTextField/SyTextField.stories.ts +166 -803
  219. package/src/components/Customs/SyTextField/SyTextField.vue +191 -168
  220. package/src/components/Customs/SyTextField/Validation/Validation.stories.ts +1164 -0
  221. package/src/components/Customs/SyTextField/locales.ts +12 -0
  222. package/src/components/Customs/SyTextField/tests/SyTextField.spec.ts +174 -8
  223. package/src/components/Customs/SyTextField/tests/SyTextField.visual.cy.ts +116 -0
  224. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-clearable.snap.png +0 -0
  225. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-default.snap.png +0 -0
  226. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-number-disabled.snap.png +0 -0
  227. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-number-no-spinner.snap.png +0 -0
  228. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-number.snap.png +0 -0
  229. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-prepend-icon.snap.png +0 -0
  230. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-readonly.snap.png +0 -0
  231. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-required.snap.png +0 -0
  232. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-with-value.snap.png +0 -0
  233. package/src/components/Customs/SyTextField/types.ts +70 -0
  234. package/src/components/Customs/SyTextField/useNumberField.ts +93 -0
  235. package/src/components/Customs/SyTextField/useSyTextFieldValidation.ts +104 -0
  236. package/src/components/DataList/DataList.stories.ts +1 -1
  237. package/src/components/DataList/tests/DataList.visual.cy.ts +85 -0
  238. package/src/components/DataList/tests/__snapshots__/data-list-default.snap.png +0 -0
  239. package/src/components/DataList/tests/__snapshots__/data-list-loading.snap.png +0 -0
  240. package/src/components/DataList/tests/__snapshots__/data-list-row.snap.png +0 -0
  241. package/src/components/DataList/tests/__snapshots__/data-list-with-icons.snap.png +0 -0
  242. package/src/components/DataList/tests/__snapshots__/data-list-with-title.snap.png +0 -0
  243. package/src/components/DataListGroup/tests/DataListGroup.visual.cy.ts +51 -0
  244. package/src/components/DataListGroup/tests/__snapshots__/data-list-group-default.snap.png +0 -0
  245. package/src/components/DataListGroup/tests/__snapshots__/data-list-group-loading.snap.png +0 -0
  246. package/src/components/DataListItem/tests/DataListItem.spec.ts +3 -1
  247. package/src/components/DataListItem/tests/DataListItem.visual.cy.ts +53 -0
  248. package/src/components/DataListItem/tests/__snapshots__/data-list-item-chip.snap.png +0 -0
  249. package/src/components/DataListItem/tests/__snapshots__/data-list-item-default.snap.png +0 -0
  250. package/src/components/DataListItem/tests/__snapshots__/data-list-item-placeholder.snap.png +0 -0
  251. package/src/components/DataListItem/tests/__snapshots__/data-list-item-row.snap.png +0 -0
  252. package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +1 -1
  253. package/src/components/DatePicker/CalendarMode/DatePicker.vue +43 -148
  254. package/src/components/DatePicker/CalendarMode/tests/DatePicker.coverage.spec.ts +156 -0
  255. package/src/components/DatePicker/CalendarMode/tests/DatePicker.spec.ts +495 -4
  256. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +1 -1
  257. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +51 -71
  258. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +206 -0
  259. package/src/components/DatePicker/ComplexDatePicker/tests/bridge-integration.regression.spec.ts +210 -0
  260. package/src/components/DatePicker/ComplexDatePicker/tests/calendar-navigation.regression.spec.ts +214 -0
  261. package/src/components/DatePicker/ComplexDatePicker/tests/validation-cross.regression.spec.ts +194 -0
  262. package/src/components/DatePicker/ComplexDatePicker/tests/validation-success-messages.regression.spec.ts +83 -0
  263. package/src/components/DatePicker/DateTextInput/DateRange.stories.ts +1 -1
  264. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +131 -56
  265. package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +1 -1
  266. package/src/components/DatePicker/DateTextInput/tests/DateTextInput.spec.ts +320 -0
  267. package/src/components/DatePicker/composables/index.ts +1 -0
  268. package/src/components/DatePicker/composables/tests/useCalendarKeyboardNavigation.spec.ts +360 -0
  269. package/src/components/DatePicker/composables/tests/useDatePickerValidationBridge.spec.ts +129 -0
  270. package/src/components/DatePicker/composables/tests/useTodayButton.spec.ts +10 -10
  271. package/src/components/DatePicker/composables/useCalendarKeyboardNavigation.ts +11 -2
  272. package/src/components/DatePicker/composables/useDatePickerValidationBridge.ts +205 -0
  273. package/src/components/DatePicker/docExamples/BidirectionalComplexValidation.vue +1 -1
  274. package/src/components/DatePicker/docExamples/DatePickerBidirectionalValidation.vue +1 -1
  275. package/src/components/DatePicker/tests/exposed-methods.coverage.spec.ts +75 -0
  276. package/src/components/DeclarationAccessibilityPage/tests/DeclarationAccessibilityPage.visual.cy.ts +35 -0
  277. package/src/components/DeclarationAccessibilityPage/tests/__snapshots__/declaration-a11y-page-default.snap.png +0 -0
  278. package/src/components/DeclarationAccessibilityPage/tests/__snapshots__/declaration-a11y-page-full.snap.png +0 -0
  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.vue +1 -1
  283. package/src/components/DialogBox/tests/__snapshots__/dialog-box-custom-texts.snap.png +0 -0
  284. package/src/components/DialogBox/tests/__snapshots__/dialog-box-default.snap.png +0 -0
  285. package/src/components/DialogBox/tests/__snapshots__/dialog-box-no-actions.snap.png +0 -0
  286. package/src/components/DownloadBtn/tests/DownloadBtn.spec.ts +2 -2
  287. package/src/components/DownloadBtn/tests/DownloadBtn.visual.cy.ts +38 -0
  288. package/src/components/DownloadBtn/tests/__snapshots__/download-btn-dark.snap.png +0 -0
  289. package/src/components/DownloadBtn/tests/__snapshots__/download-btn-idle.snap.png +0 -0
  290. package/src/components/ErrorPage/tests/ErrorPage.visual.cy.ts +32 -0
  291. package/src/components/ErrorPage/tests/__snapshots__/error-page-custom.snap.png +0 -0
  292. package/src/components/ErrorPage/tests/__snapshots__/error-page-default.snap.png +0 -0
  293. package/src/components/ErrorPage/tests/__snapshots__/error-page-no-btn.snap.png +0 -0
  294. package/src/components/ExternalLinks/tests/ExternalLinks.visual.cy.ts +30 -0
  295. package/src/components/ExternalLinks/tests/__snapshots__/external-links-default.snap.png +0 -0
  296. package/src/components/ExternalLinks/tests/__snapshots__/external-links-fixed.snap.png +0 -0
  297. package/src/components/FileList/UploadItem/UploadItem.vue +4 -4
  298. package/src/components/FileList/tests/FileList.visual.cy.ts +31 -0
  299. package/src/components/FileList/tests/__snapshots__/file-list-default.snap.png +0 -0
  300. package/src/components/FileList/tests/__snapshots__/file-list-with-delete.snap.png +0 -0
  301. package/src/components/FilePreview/accessibilite/Accessibility.mdx +86 -8
  302. package/src/components/FileUpload/FileUpload.vue +2 -2
  303. package/src/components/FileUpload/FileUploadContent.vue +1 -1
  304. package/src/components/FileUpload/tests/FileUpload.visual.cy.ts +36 -0
  305. package/src/components/FileUpload/tests/__snapshots__/file-upload-default.snap.png +0 -0
  306. package/src/components/FileUpload/tests/__snapshots__/file-upload-disabled.snap.png +0 -0
  307. package/src/components/FileUpload/tests/__snapshots__/file-upload-multiple.snap.png +0 -0
  308. package/src/components/FilterInline/FilterInline.mdx +2 -2
  309. package/src/components/FilterInline/FilterInline.stories.ts +2 -0
  310. package/src/components/FilterInline/FilterInline.vue +10 -5
  311. package/src/components/FilterInline/tests/FilterInline.visual.cy.ts +25 -0
  312. package/src/components/FilterInline/tests/__snapshots__/filter-inline-default.snap.png +0 -0
  313. package/src/components/FilterSideBar/FilterSideBar.stories.ts +5 -2
  314. package/src/components/FilterSideBar/FilterSideBar.vue +13 -8
  315. package/src/components/FilterSideBar/tests/FilterSideBar.visual.cy.ts +37 -0
  316. package/src/components/FilterSideBar/tests/__snapshots__/filter-sidebar-default.snap.png +0 -0
  317. package/src/components/FilterSideBar/tests/__snapshots__/filter-sidebar-modale.snap.png +0 -0
  318. package/src/components/FooterBar/FooterBar.vue +7 -7
  319. package/src/components/FooterBar/tests/FooterBar.visual.cy.ts +37 -0
  320. package/src/components/FooterBar/tests/__snapshots__/footer-bar-default.snap.png +0 -0
  321. package/src/components/FooterBar/tests/__snapshots__/footer-bar-no-logo.snap.png +0 -0
  322. package/src/components/FooterBar/tests/__snapshots__/footer-bar-no-social.snap.png +0 -0
  323. package/src/components/FooterBar/tests/__snapshots__/footer-bar-version.snap.png +0 -0
  324. package/src/components/FranceConnectBtn/FranceConnectBtn.vue +1 -1
  325. package/src/components/FranceConnectBtn/tests/FranceConnectBtn.visual.cy.ts +38 -0
  326. package/src/components/FranceConnectBtn/tests/__snapshots__/france-connect-btn-dark.snap.png +0 -0
  327. package/src/components/FranceConnectBtn/tests/__snapshots__/france-connect-btn-default.snap.png +0 -0
  328. package/src/components/FranceConnectBtn/tests/__snapshots__/france-connect-btn-plus.snap.png +0 -0
  329. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.vue +2 -2
  330. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.vue +7 -7
  331. package/src/components/HeaderBar/HeaderBurgerMenu/tests/HeaderBurgerMenu.spec.ts +4 -4
  332. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated-submenu-open.snap.png +0 -0
  333. package/src/components/HeaderBar/HeaderMenuBtn/HeaderMenuBtn.vue +2 -2
  334. package/src/components/HeaderBar/tests/__snapshots__/header-bar-custom-width.snap.png +0 -0
  335. package/src/components/HeaderBar/tests/__snapshots__/header-bar-default.snap.png +0 -0
  336. package/src/components/HeaderBar/tests/__snapshots__/header-bar-no-sticky.snap.png +0 -0
  337. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-prepend.snap.png +0 -0
  338. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-side.snap.png +0 -0
  339. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-subtitle.snap.png +0 -0
  340. package/src/components/HeaderLoading/tests/HeaderLoading.spec.ts +87 -8
  341. package/src/components/HeaderLoading/tests/HeaderLoading.visual.cy.ts +34 -0
  342. package/src/components/HeaderLoading/tests/__snapshots__/header-loading-custom-size.snap.png +0 -0
  343. package/src/components/HeaderLoading/tests/__snapshots__/header-loading-default.snap.png +0 -0
  344. package/src/components/HeaderLoading/tests/__snapshots__/header-loading-standalone.snap.png +0 -0
  345. package/src/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.vue +3 -3
  346. package/src/components/HeaderNavigationBar/HorizontalNavbar/tests/HorizontalNavbar.spec.ts +589 -0
  347. package/src/components/HeaderNavigationBar/tests/HeaderNavigationBar.spec.ts +4 -4
  348. package/src/components/HeaderNavigationBar/tests/HeaderNavigationBar.visual.cy.ts +34 -0
  349. package/src/components/HeaderNavigationBar/tests/__snapshots__/header-navigation-bar-default.snap.png +0 -0
  350. package/src/components/HeaderNavigationBar/tests/__snapshots__/header-navigation-bar-subtitle.snap.png +0 -0
  351. package/src/components/HeaderToolbar/tests/HeaderToolBar.spec.ts +153 -1
  352. package/src/components/HeaderToolbar/tests/HeaderToolbar.visual.cy.ts +25 -0
  353. package/src/components/HeaderToolbar/tests/__snapshots__/header-toolbar-custom.snap.png +0 -0
  354. package/src/components/HeaderToolbar/tests/__snapshots__/header-toolbar-default.snap.png +0 -0
  355. package/src/components/HeaderToolbar/tests/useMobileRightMenu.spec.ts +258 -0
  356. package/src/components/LangBtn/tests/LangBtn.visual.cy.ts +33 -0
  357. package/src/components/LangBtn/tests/__snapshots__/lang-btn-default.snap.png +0 -0
  358. package/src/components/LangBtn/tests/__snapshots__/lang-btn-english.snap.png +0 -0
  359. package/src/components/LangBtn/tests/__snapshots__/lang-btn-no-arrow.snap.png +0 -0
  360. package/src/components/Logo/tests/__snapshots__/logo-avatar.snap.png +0 -0
  361. package/src/components/Logo/tests/__snapshots__/logo-default.snap.png +0 -0
  362. package/src/components/Logo/tests/__snapshots__/logo-no-organism.snap.png +0 -0
  363. package/src/components/Logo/tests/__snapshots__/logo-no-signature.snap.png +0 -0
  364. package/src/components/Logo/tests/__snapshots__/logo-risque-pro.snap.png +0 -0
  365. package/src/components/LogoBrandSection/tests/LogoBrandSection.spec.ts +2 -2
  366. package/src/components/LogoBrandSection/tests/LogoBrandSection.visual.cy.ts +43 -0
  367. package/src/components/LogoBrandSection/tests/__snapshots__/LogoBrandSection.spec.ts.snap +1 -1
  368. package/src/components/LogoBrandSection/tests/__snapshots__/logo-brand-section-default.snap.png +0 -0
  369. package/src/components/LogoBrandSection/tests/__snapshots__/logo-brand-section-mobile.snap.png +0 -0
  370. package/src/components/LogoBrandSection/tests/__snapshots__/logo-brand-section-reduced.snap.png +0 -0
  371. package/src/components/LogoBrandSection/tests/__snapshots__/logo-brand-section-with-title.snap.png +0 -0
  372. package/src/components/LunarCalendar/tests/LunarCalendar.visual.cy.ts +36 -0
  373. package/src/components/LunarCalendar/tests/__snapshots__/lunar-calendar-default.snap.png +0 -0
  374. package/src/components/LunarCalendar/tests/__snapshots__/lunar-calendar-required.snap.png +0 -0
  375. package/src/components/LunarCalendar/tests/__snapshots__/lunar-calendar-with-value.snap.png +0 -0
  376. package/src/components/LunarCalendar/tests/useLunarCalendarRules.spec.ts +184 -0
  377. package/src/components/MaintenancePage/tests/MaintenancePage.visual.cy.ts +22 -0
  378. package/src/components/MaintenancePage/tests/__snapshots__/maintenance-page-custom.snap.png +0 -0
  379. package/src/components/MaintenancePage/tests/__snapshots__/maintenance-page-default.snap.png +0 -0
  380. package/src/components/MonthPicker/MonthPickerVisual/MonthSelector.vue +3 -3
  381. package/src/components/MonthPicker/MonthPickerVisual/VisualPickerFooter.vue +1 -1
  382. package/src/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.vue +2 -2
  383. package/src/components/MonthPicker/MonthPickerVisual/YearSelector.vue +1 -1
  384. package/src/components/MonthPicker/tests/MonthPicker.visual.cy.ts +37 -0
  385. package/src/components/MonthPicker/tests/__snapshots__/MonthPicker.spec.ts.snap +2 -0
  386. package/src/components/MonthPicker/tests/__snapshots__/month-picker-default.snap.png +0 -0
  387. package/src/components/MonthPicker/tests/__snapshots__/month-picker-disabled.snap.png +0 -0
  388. package/src/components/MonthPicker/tests/__snapshots__/month-picker-readonly.snap.png +0 -0
  389. package/src/components/MonthPicker/tests/__snapshots__/month-picker-with-value.snap.png +0 -0
  390. package/src/components/NirField/NirField.stories.ts +40 -682
  391. package/src/components/NirField/NirField.vue +101 -35
  392. package/src/components/NirField/tests/NirField.spec.ts +135 -14
  393. package/src/components/NirField/tests/NirField.visual.cy.ts +28 -0
  394. package/src/components/NirField/tests/__snapshots__/nir-field-complex.snap.png +0 -0
  395. package/src/components/NirField/tests/__snapshots__/nir-field-default.snap.png +0 -0
  396. package/src/components/NirField/tests/__snapshots__/nir-field-with-key.snap.png +0 -0
  397. package/src/components/NirField/tests/useNirValidation.spec.ts +168 -0
  398. package/src/components/NirField/useNirValidation.ts +28 -2
  399. package/src/components/NirField/validation/Validation.stories.ts +866 -0
  400. package/src/components/NotFoundPage/tests/NotFoundPage.visual.cy.ts +28 -0
  401. package/src/components/NotFoundPage/tests/__snapshots__/not-found-page-custom-btn.snap.png +0 -0
  402. package/src/components/NotFoundPage/tests/__snapshots__/not-found-page-default.snap.png +0 -0
  403. package/src/components/NotFoundPage/tests/__snapshots__/not-found-page-no-btn.snap.png +0 -0
  404. package/src/components/NotificationBar/Notification/Notification.vue +12 -12
  405. package/src/components/NotificationBar/NotificationBar.stories.ts +8 -8
  406. package/src/components/NotificationBar/tests/NotificationBar.visual.cy.ts +54 -0
  407. package/src/components/NotificationBar/tests/__snapshots__/notification-bar-bottom.snap.png +0 -0
  408. package/src/components/NotificationBar/tests/__snapshots__/notification-bar-info.snap.png +0 -0
  409. package/src/components/NotificationBar/tests/__snapshots__/notification-bar-multiple.snap.png +0 -0
  410. package/src/components/PageContainer/tests/PageContainer.visual.cy.ts +33 -0
  411. package/src/components/PageContainer/tests/__snapshots__/page-container-color.snap.png +0 -0
  412. package/src/components/PageContainer/tests/__snapshots__/page-container-default.snap.png +0 -0
  413. package/src/components/PageContainer/tests/__snapshots__/page-container-md.snap.png +0 -0
  414. package/src/components/PaginatedTable/Pagination.vue +2 -2
  415. package/src/components/PaginatedTable/accessibilite/Accessibility.mdx +99 -7
  416. package/src/components/PaginatedTable/tests/PaginatedTable.visual.cy.ts +41 -0
  417. package/src/components/PaginatedTable/tests/__snapshots__/paginated-table-default.snap.png +0 -0
  418. package/src/components/PaginatedTable/tests/__snapshots__/paginated-table-server.snap.png +0 -0
  419. package/src/components/PasswordField/PasswordField.mdx +5 -52
  420. package/src/components/PasswordField/PasswordField.stories.ts +74 -931
  421. package/src/components/PasswordField/PasswordField.vue +128 -199
  422. package/src/components/PasswordField/Validation/Validation.stories.ts +1295 -0
  423. package/src/components/PasswordField/locales.ts +2 -0
  424. package/src/components/PasswordField/tests/PasswordField.spec.ts +147 -109
  425. package/src/components/PasswordField/tests/PasswordField.visual.cy.ts +49 -0
  426. package/src/components/PasswordField/tests/__snapshots__/password-field-default.snap.png +0 -0
  427. package/src/components/PasswordField/tests/__snapshots__/password-field-disabled.snap.png +0 -0
  428. package/src/components/PasswordField/tests/__snapshots__/password-field-required.snap.png +0 -0
  429. package/src/components/PasswordField/tests/__snapshots__/password-field-underlined.snap.png +0 -0
  430. package/src/components/PasswordField/types.ts +17 -0
  431. package/src/components/PasswordField/usePasswordFieldValidation.ts +100 -0
  432. package/src/components/PeriodField/PeriodField.stories.ts +3 -1
  433. package/src/components/PeriodField/PeriodField.vue +1 -1
  434. package/src/components/PeriodField/tests/PeriodField.visual.cy.ts +39 -0
  435. package/src/components/PeriodField/tests/__snapshots__/period-field-default.snap.png +0 -0
  436. package/src/components/PeriodField/tests/__snapshots__/period-field-no-calendar.snap.png +0 -0
  437. package/src/components/PeriodField/tests/__snapshots__/period-field-required.snap.png +0 -0
  438. package/src/components/PeriodField/tests/__snapshots__/period-field-with-value.snap.png +0 -0
  439. package/src/components/PhoneField/PhoneField.vue +2 -2
  440. package/src/components/PhoneField/tests/PhoneField.spec.ts +1 -0
  441. package/src/components/PhoneField/tests/PhoneField.visual.cy.ts +28 -0
  442. package/src/components/PhoneField/tests/__snapshots__/phone-field-default.snap.png +0 -0
  443. package/src/components/PhoneField/tests/__snapshots__/phone-field-with-country-code.snap.png +0 -0
  444. package/src/components/PhoneField/tests/__snapshots__/phone-field-with-value.snap.png +0 -0
  445. package/src/components/RangeField/RangeSlider/RangeSlider.vue +2 -2
  446. package/src/components/RangeField/RangeSlider/Tooltip/Tooltip.vue +1 -1
  447. package/src/components/RangeField/tests/__snapshots__/range-field-custom-bg.snap.png +0 -0
  448. package/src/components/RangeField/tests/__snapshots__/range-field-custom-range.snap.png +0 -0
  449. package/src/components/RangeField/tests/__snapshots__/range-field-default.snap.png +0 -0
  450. package/src/components/RangeField/tests/__snapshots__/range-field-step.snap.png +0 -0
  451. package/src/components/RangeField/tests/__snapshots__/range-field-with-label.snap.png +0 -0
  452. package/src/components/RatingPicker/tests/RatingPicker.visual.cy.ts +52 -0
  453. package/src/components/RatingPicker/tests/__snapshots__/rating-picker-emotion.snap.png +0 -0
  454. package/src/components/RatingPicker/tests/__snapshots__/rating-picker-number.snap.png +0 -0
  455. package/src/components/RatingPicker/tests/__snapshots__/rating-picker-readonly.snap.png +0 -0
  456. package/src/components/RatingPicker/tests/__snapshots__/rating-picker-stars.snap.png +0 -0
  457. package/src/components/SearchListField/SearchListField.mdx +1 -1
  458. package/src/components/SearchListField/SearchListField.stories.ts +1 -1
  459. package/src/components/SearchListField/SearchListField.vue +9 -4
  460. package/src/components/SearchListField/tests/SearchListField.spec.ts +127 -0
  461. package/src/components/SearchListField/tests/SearchListField.visual.cy.ts +35 -0
  462. package/src/components/SearchListField/tests/__snapshots__/search-list-field-default.snap.png +0 -0
  463. package/src/components/SearchListField/tests/__snapshots__/search-list-field-with-selection.snap.png +0 -0
  464. package/src/components/SkipLink/tests/SkipLink.visual.cy.ts +16 -0
  465. package/src/components/SkipLink/tests/__snapshots__/skip-link-focused.snap.png +0 -0
  466. package/src/components/SocialMediaLinks/tests/SocialMediaLinks.visual.cy.ts +33 -0
  467. package/src/components/SocialMediaLinks/tests/__snapshots__/social-media-links-default.snap.png +0 -0
  468. package/src/components/SocialMediaLinks/tests/__snapshots__/social-media-links-no-native-heading.snap.png +0 -0
  469. package/src/components/StatusPage/tests/StatusPage.spec.ts +149 -0
  470. package/src/components/StatusPage/tests/StatusPage.visual.cy.ts +47 -0
  471. package/src/components/StatusPage/tests/__snapshots__/status-page-default.snap.png +0 -0
  472. package/src/components/StatusPage/tests/__snapshots__/status-page-full.snap.png +0 -0
  473. package/src/components/StatusPage/tests/__snapshots__/status-page-no-btn.snap.png +0 -0
  474. package/src/components/SubHeader/SubHeader.vue +1 -1
  475. package/src/components/SubHeader/tests/SubHeader.visual.cy.ts +48 -0
  476. package/src/components/SubHeader/tests/__snapshots__/sub-header-default.snap.png +0 -0
  477. package/src/components/SubHeader/tests/__snapshots__/sub-header-loading.snap.png +0 -0
  478. package/src/components/SubHeader/tests/__snapshots__/sub-header-no-back-btn.snap.png +0 -0
  479. package/src/components/SubHeader/tests/__snapshots__/sub-header-with-subtitle.snap.png +0 -0
  480. package/src/components/SyAlert/SyAlert.vue +23 -23
  481. package/src/components/SyAlert/tests/__snapshots__/sy-alert-closable.snap.png +0 -0
  482. package/src/components/SyAlert/tests/__snapshots__/sy-alert-error.snap.png +0 -0
  483. package/src/components/SyAlert/tests/__snapshots__/sy-alert-info.snap.png +0 -0
  484. package/src/components/SyAlert/tests/__snapshots__/sy-alert-success.snap.png +0 -0
  485. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-outlined.snap.png +0 -0
  486. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-tonal.snap.png +0 -0
  487. package/src/components/SyAlert/tests/__snapshots__/sy-alert-warning.snap.png +0 -0
  488. package/src/components/SyHeading/tests/SyHeading.visual.cy.ts +33 -0
  489. package/src/components/SyHeading/tests/__snapshots__/sy-heading-level-1.snap.png +0 -0
  490. package/src/components/SyHeading/tests/__snapshots__/sy-heading-level-2.snap.png +0 -0
  491. package/src/components/SyHeading/tests/__snapshots__/sy-heading-level-3.snap.png +0 -0
  492. package/src/components/SyTextArea/SyTextArea.stories.ts +202 -131
  493. package/src/components/SyTextArea/SyTextArea.vue +242 -83
  494. package/src/components/SyTextArea/composables/useSyTextAreaValidation.ts +81 -0
  495. package/src/components/SyTextArea/locales.ts +1 -0
  496. package/src/components/SyTextArea/tests/SyTextArea.a11y.spec.ts +18 -0
  497. package/src/components/SyTextArea/tests/SyTextArea.spec.ts +583 -1
  498. package/src/components/SyTextArea/tests/SyTextArea.visual.cy.ts +48 -0
  499. package/src/components/SyTextArea/tests/__snapshots__/sy-textarea-default.snap.png +0 -0
  500. package/src/components/SyTextArea/tests/__snapshots__/sy-textarea-filled.snap.png +0 -0
  501. package/src/components/SyTextArea/tests/__snapshots__/sy-textarea-required.snap.png +0 -0
  502. package/src/components/SyTextArea/tests/__snapshots__/sy-textarea-with-value.snap.png +0 -0
  503. package/src/components/SyTextArea/useDefaultValidationRules.ts +2 -7
  504. package/src/components/SyTextArea/validation/Validation.stories.ts +776 -0
  505. package/src/components/TableToolbar/TableToolbar.vue +6 -6
  506. package/src/components/TableToolbar/accessibilite/Accessibility.mdx +81 -7
  507. package/src/components/TableToolbar/tests/TableToolbar.visual.cy.ts +49 -0
  508. package/src/components/TableToolbar/tests/__snapshots__/table-toolbar-default.snap.png +0 -0
  509. package/src/components/TableToolbar/tests/__snapshots__/table-toolbar-filtered.snap.png +0 -0
  510. package/src/components/TableToolbar/tests/__snapshots__/table-toolbar-loading.snap.png +0 -0
  511. package/src/components/TableToolbar/tests/__snapshots__/table-toolbar-with-add-btn.snap.png +0 -0
  512. package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +163 -0
  513. package/src/components/Tables/SyServerTable/SyServerTable.vue +5 -4
  514. package/src/components/Tables/SyServerTable/accessibilite/Accessibility.mdx +114 -7
  515. package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +67 -0
  516. package/src/components/Tables/SyServerTable/tests/SyServerTable.visual.cy.ts +58 -0
  517. package/src/components/Tables/SyServerTable/tests/__snapshots__/sy-server-table-default.snap.png +0 -0
  518. package/src/components/Tables/SyServerTable/tests/__snapshots__/sy-server-table-loading.snap.png +0 -0
  519. package/src/components/Tables/SyServerTable/tests/__snapshots__/sy-server-table-with-select.snap.png +0 -0
  520. package/src/components/Tables/SyTable/SyTable.stories.ts +94 -0
  521. package/src/components/Tables/SyTable/SyTable.vue +2 -1
  522. package/src/components/Tables/SyTable/accessibilite/Accessibility.mdx +116 -7
  523. package/src/components/Tables/SyTable/tests/SyTable.spec.ts +64 -0
  524. package/src/components/Tables/SyTable/tests/SyTable.visual.cy.ts +70 -0
  525. package/src/components/Tables/SyTable/tests/__snapshots__/sy-table-compact.snap.png +0 -0
  526. package/src/components/Tables/SyTable/tests/__snapshots__/sy-table-default.snap.png +0 -0
  527. package/src/components/Tables/SyTable/tests/__snapshots__/sy-table-striped.snap.png +0 -0
  528. package/src/components/Tables/SyTable/tests/__snapshots__/sy-table-with-select.snap.png +0 -0
  529. package/src/components/Tables/common/TableHeader.vue +2 -2
  530. package/src/components/Tables/common/filters/logics/tests/NumberFilterLogic.spec.ts +176 -0
  531. package/src/components/Tables/common/filters/logics/tests/SelectFilterLogic.spec.ts +111 -0
  532. package/src/components/Tables/common/tableStyles.scss +10 -10
  533. package/src/components/Tables/common/tests/SyTableFilter.spec.ts +8 -1
  534. package/src/components/Tables/common/tests/filterByRange.spec.ts +23 -22
  535. package/src/components/Tables/common/types.ts +2 -0
  536. package/src/components/ToolbarContainer/tests/ToolbarContainer.visual.cy.ts +34 -0
  537. package/src/components/ToolbarContainer/tests/__snapshots__/toolbar-container-default.snap.png +0 -0
  538. package/src/components/ToolbarContainer/tests/__snapshots__/toolbar-container-links.snap.png +0 -0
  539. package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +3 -2
  540. package/src/components/UploadWorkflow/tests/UploadWorkflow.visual.cy.ts +39 -0
  541. package/src/components/UploadWorkflow/tests/__snapshots__/upload-workflow-default.snap.png +0 -0
  542. package/src/components/UploadWorkflow/tests/__snapshots__/upload-workflow-with-title.snap.png +0 -0
  543. package/src/components/UserMenuBtn/tests/UserMenuBtn.visual.cy.ts +42 -0
  544. package/src/components/UserMenuBtn/tests/__snapshots__/user-menu-btn-default.snap.png +0 -0
  545. package/src/components/UserMenuBtn/tests/__snapshots__/user-menu-btn-no-logout.snap.png +0 -0
  546. package/src/components/UserMenuBtn/tests/__snapshots__/user-menu-btn-with-name.snap.png +0 -0
  547. package/src/components/index.ts +1 -0
  548. package/src/composables/date/tests/useDateFormatDayjs.spec.ts +31 -0
  549. package/src/composables/date/tests/useHolidayDay.spec.ts +109 -0
  550. package/src/composables/rules/tests/useFieldValidation.spec.ts +374 -0
  551. package/src/composables/tests/useError.spec.ts +30 -0
  552. package/src/composables/tests/useFormFieldErrorHandling.spec.ts +234 -0
  553. package/src/composables/unifyValidation/documentationValidationProps.ts +6 -6
  554. package/src/composables/unifyValidation/tests/documentationValidationProps.spec.ts +177 -0
  555. package/src/composables/unifyValidation/tests/useCustomValidation.spec.ts +30 -0
  556. package/src/composables/unifyValidation/tests/useValidation.spec.ts +6 -2
  557. package/src/composables/unifyValidation/useCustomValidation.ts +19 -9
  558. package/src/composables/unifyValidation/useValidation.ts +35 -32
  559. package/src/composables/useFilterable/useFilterable.spec.ts +139 -134
  560. package/src/composables/useFilterable/useFilterable.ts +17 -24
  561. package/src/composables/useFormFieldErrorHandling.ts +3 -3
  562. package/src/composables/validation/tests/useFormValidation.spec.ts +11 -2
  563. package/src/composables/validation/tests/useValidatable.spec.ts +16 -6
  564. package/src/composables/validation/tests/useValidation.spec.ts +2 -2
  565. package/src/composables/validation/useValidation.ts +1 -1
  566. package/src/composantsVuetify/VBtn/VBtn.mdx +9 -39
  567. package/src/composantsVuetify/VBtn/v-btn.stories.ts +26 -86
  568. package/src/composantsVuetify/VCard/VCard.mdx +8 -0
  569. package/src/composantsVuetify/VCard/v-card.stories.ts +191 -1
  570. package/src/composantsVuetify/VStepper/VStepper.mdx +56 -0
  571. package/src/composantsVuetify/VStepper/v-stepper.stories.ts +563 -0
  572. package/src/designTokens/tokens/amelipro/apContextual.ts +6 -0
  573. package/src/designTokens/tokens/amelipro/apDarkTheme.ts +2 -2
  574. package/src/designTokens/tokens/amelipro/apLightTheme.ts +73 -103
  575. package/src/designTokens/tokens/amelipro/apSemantic.ts +2 -2
  576. package/src/designTokens/tokens/baseContextualTokens.ts +1 -6
  577. package/src/designTokens/tokens/baseTokens.ts +232 -0
  578. package/src/designTokens/tokens/cnam/cnamContextual.ts +6 -0
  579. package/src/designTokens/tokens/cnam/cnamDarkTheme.ts +2 -2
  580. package/src/designTokens/tokens/cnam/cnamLightTheme.ts +76 -104
  581. package/src/designTokens/tokens/pa/paDarkTheme.ts +2 -2
  582. package/src/designTokens/tokens/pa/paLightTheme.ts +74 -99
  583. package/src/designTokens/tokens/pa/paSemantic.ts +2 -0
  584. package/src/designTokens/tokens/semanticTokens.ts +114 -0
  585. package/src/stories/Accessibilite/DesignSystem/a11y-status.json +1 -1
  586. package/src/stories/Components/Components.stories.ts +68 -13
  587. package/src/stories/Demarrer/Releases.stories.ts +45 -2
  588. package/src/stories/DesignTokens/ColorIntegrationExample.vue +2 -3
  589. package/src/stories/DesignTokens/Colors.mdx +8 -8
  590. package/src/stories/DesignTokens/colors.stories.ts +257 -1081
  591. package/src/stories/EcoConception/EcoBestPracticesDoc.vue +930 -0
  592. package/src/stories/EcoConception/EcoBestPratices.mdx +38 -0
  593. package/src/stories/EcoConception/Introduction.mdx +8 -1
  594. package/src/stories/EcoConception/datas/bonnes_pratiques_essentielles.json +1018 -0
  595. package/src/stories/EcoConception/ecoconception-best-practices.stories.ts +20 -0
  596. package/src/stories/GuideDuDev/Amelipro.mdx +9 -1
  597. package/src/stories/GuideDuDev/Amelipro.stories.ts +955 -168
  598. package/src/stories/GuideDuDev/PortailAgent.stories.ts +0 -1
  599. package/src/utils/amelipro/toKebabCase/tests/toKebabCase.spec.ts +52 -0
  600. package/src/utils/formatNir/tests/formatNir.spec.ts +34 -0
  601. package/src/utils/functions/deepCopy/index.ts +2 -3
  602. package/src/utils/tests/insertAt.spec.ts +44 -0
  603. package/dist/apLightTheme-DS0Uy44H.js +0 -954
  604. package/dist/components/Customs/SyCheckbox/locales.d.ts +0 -3
  605. package/dist/components/RatingPicker/tests/RatingPicker.a11y.spect.d.ts +0 -1
  606. package/dist/components/SyHeading/SyHeading.a11y.test.d.ts +0 -1
  607. package/dist/components/SyHeading/SyHeading.test.d.ts +0 -1
  608. package/dist/main-BsJ9ec3i.js +0 -38954
  609. package/src/components/Customs/SyCheckbox/locales.ts +0 -3
  610. package/src/components/Customs/SyTextField/types.d.ts +0 -4
  611. package/src/components/DatePicker/CalendarMode/tests/DatePicker.events.spec.ts +0 -178
  612. /package/src/components/RatingPicker/tests/{RatingPicker.a11y.spect.ts → RatingPicker.a11y.spec.ts} +0 -0
@@ -5,6 +5,7 @@
5
5
  import { locales } from './locales'
6
6
  import { useValidation } from '@/composables/unifyValidation/useValidation'
7
7
  import { useNirValidation, type NirValidationProps } from './useNirValidation'
8
+ import { useValidatable } from '@/composables/validation/useValidatable'
8
9
 
9
10
  const props = withDefaults(defineProps<{
10
11
  modelValue?: string | undefined | null
@@ -12,6 +13,7 @@
12
13
  numberLabel?: string
13
14
  keyLabel?: string
14
15
  displayKey?: boolean
16
+ helpText?: string
15
17
  nirTooltip?: string
16
18
  keyTooltip?: string
17
19
  nirTooltipPosition?: 'prepend' | 'append'
@@ -40,6 +42,7 @@
40
42
  numberLabel: 'Numéro de sécurité sociale',
41
43
  keyLabel: 'Clé de validation',
42
44
  displayKey: true,
45
+ helpText: '',
43
46
  nirTooltip: undefined,
44
47
  keyRules: () => [],
45
48
  keyTooltip: undefined,
@@ -52,7 +55,7 @@
52
55
  customNumberWarningRules: () => [],
53
56
  customKeyWarningRules: () => [],
54
57
  customRulesPrecedence: false,
55
- showSuccessMessages: true,
58
+ showSuccessMessages: false,
56
59
  width: '100%',
57
60
  bgColor: 'white',
58
61
  disabled: false,
@@ -71,9 +74,17 @@
71
74
  persistentPlaceholder: false,
72
75
  disableErrorHandling: false,
73
76
  numberRules: () => [],
77
+ useVuetifyValidation: false,
74
78
  nirType: 'simple',
75
79
  withoutFieldset: false,
76
80
  customLocale: () => locales,
81
+ errorMessages: null,
82
+ warningMessages: null,
83
+ successMessages: null,
84
+ hasError: false,
85
+ hasWarning: false,
86
+ hasSuccess: false,
87
+ maxErrors: 1,
77
88
  })
78
89
 
79
90
  const emit = defineEmits(['update:modelValue'])
@@ -173,35 +184,6 @@
173
184
  }
174
185
  })
175
186
 
176
- // Synchronisation avec modelValue
177
- watch(modelValueRef, (newValue) => {
178
- // Ignorer les mises à jour internes pour éviter les boucles infinies
179
- if (isInternalUpdate.value) return
180
-
181
- if (newValue === undefined || newValue === null) {
182
- numberValue.value = ''
183
- keyValue.value = ''
184
- return
185
- }
186
- if (newValue.length === 15) {
187
- const number = newValue.slice(0, -2)
188
- const key = newValue.slice(-2)
189
- numberValue.value = number
190
- keyValue.value = key
191
- }
192
- if (newValue.length === 14) {
193
- const number = newValue.slice(0, -1)
194
- const key = newValue.slice(-1)
195
- numberValue.value = number
196
- keyValue.value = key
197
- }
198
- if (newValue.length <= 13) {
199
- const number = newValue
200
- numberValue.value = number
201
- keyValue.value = ''
202
- }
203
- }, { immediate: true })
204
-
205
187
  // Émission de la valeur
206
188
  const emitValue = () => {
207
189
  const number = unmaskedNumberValue.value
@@ -228,6 +210,7 @@
228
210
  keyValidation,
229
211
  validateFields,
230
212
  hasFieldErrors,
213
+ clearValidation,
231
214
  } = useNirValidation(
232
215
  numberValue,
233
216
  keyValue,
@@ -255,12 +238,59 @@
255
238
  toRef(props, 'useVuetifyValidation'),
256
239
  toRef(props, 'numberRules'),
257
240
  toRef(props, 'keyRules'),
241
+ toRef(props, 'errorMessages'),
242
+ toRef(props, 'warningMessages'),
243
+ toRef(props, 'successMessages'),
244
+ toRef(props, 'hasError'),
245
+ toRef(props, 'hasWarning'),
246
+ toRef(props, 'hasSuccess'),
247
+ toRef(props, 'maxErrors'),
258
248
  )
259
249
 
250
+ // Synchronisation avec modelValue — placé après useNirValidation pour éviter le TDZ sur clearValidation
251
+ watch(modelValueRef, (newValue) => {
252
+ if (isInternalUpdate.value) return
253
+
254
+ if (newValue === undefined || newValue === null) {
255
+ numberValue.value = ''
256
+ keyValue.value = ''
257
+ clearValidation()
258
+ return
259
+ }
260
+ if (newValue.length === 15) {
261
+ const number = newValue.slice(0, -2)
262
+ const key = newValue.slice(-2)
263
+ numberValue.value = number
264
+ keyValue.value = key
265
+ }
266
+ if (newValue.length === 14) {
267
+ const number = newValue.slice(0, -1)
268
+ const key = newValue.slice(-1)
269
+ numberValue.value = number
270
+ keyValue.value = key
271
+ }
272
+ if (newValue.length <= 13) {
273
+ const number = newValue
274
+ numberValue.value = number
275
+ keyValue.value = ''
276
+ }
277
+ }, { immediate: true })
278
+
260
279
  const validateOnSubmit = () => {
261
280
  return validateFields(true)
262
281
  }
263
282
 
283
+ useValidatable(validateOnSubmit, clearValidation)
284
+
285
+ const hasMessages = computed(() => {
286
+ if (props.disableErrorHandling) return false
287
+ return hasFieldErrors.value
288
+ || numberValidation.hasWarning.value
289
+ || keyValidation.hasWarning.value
290
+ || (numberValidation.hasSuccess.value && props.showSuccessMessages)
291
+ || (keyValidation.hasSuccess.value && props.showSuccessMessages)
292
+ })
293
+
264
294
  // Propriétés calculées pour les attributs ARIA et les états d'erreur
265
295
  const ariaRequired = computed(() => props.required ? 'true' : undefined)
266
296
  const ariaInvalidNumber = computed(() => hasFieldErrors.value ? 'true' : undefined)
@@ -339,12 +369,14 @@
339
369
 
340
370
  defineExpose({
341
371
  validateOnSubmit,
372
+ clearValidation,
342
373
  numberMask,
343
374
  keyMask,
344
375
  numberValidation,
345
376
  keyValidation,
346
377
  } satisfies {
347
378
  validateOnSubmit: () => Promise<boolean>
379
+ clearValidation: () => void
348
380
  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
349
381
  numberMask: { mask: string, preProcess: (value: string) => string, tokens: Record<string, any> }
350
382
  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
@@ -390,7 +422,7 @@
390
422
  :hide-spin-buttons="props.hideSpinButtons"
391
423
  :placeholder="props.placeholder"
392
424
  :readonly="props.readonly"
393
- :clearable="props.clearable"
425
+ :is-clearable="props.clearable"
394
426
  :counter="props.counter"
395
427
  :hint="props.numberHint || locales.numberHint"
396
428
  :persistent-hint="props.persistentHint"
@@ -428,7 +460,7 @@
428
460
  :hide-spin-buttons="props.hideSpinButtons"
429
461
  :placeholder="props.placeholder"
430
462
  :readonly="props.readonly"
431
- :clearable="props.clearable"
463
+ :is-clearable="props.clearable"
432
464
  :counter="props.counter"
433
465
  :hint="props.keyHint || locales.keyHint"
434
466
  :persistent-hint="props.persistentHint"
@@ -448,6 +480,13 @@
448
480
  @input="handleKeyInput"
449
481
  />
450
482
  </div>
483
+ <div
484
+ v-if="helpText && !hasMessages && !hideDetails"
485
+ class="sy-nir-help-text"
486
+ style="flex: 1 0 100%;"
487
+ >
488
+ {{ helpText }}
489
+ </div>
451
490
  <div
452
491
  class="sy-messages"
453
492
  style="flex: 1 0 100%;"
@@ -513,6 +552,13 @@
513
552
  />
514
553
  </div>
515
554
  </div>
555
+ <div
556
+ v-if="helpText && hasMessages && !hideDetails"
557
+ class="sy-nir-help-text"
558
+ style="flex: 1 0 100%;"
559
+ >
560
+ {{ helpText }}
561
+ </div>
516
562
  </component>
517
563
  </template>
518
564
 
@@ -566,6 +612,17 @@
566
612
  width: 100%;
567
613
  }
568
614
 
615
+ /* La zone de détails interne des champs ne sert qu'au hint au focus : on ne réserve
616
+ pas d'espace vide sous l'input (helpText/messages NirField gérés à part), pour coller
617
+ le helpText au champ comme SySelect. Elle grandit naturellement si un hint s'affiche au focus. */
618
+ .nir-field :deep(.v-input__details) {
619
+ min-height: 0 !important;
620
+ }
621
+
622
+ .nir-field :deep(.v-input__details .v-messages) {
623
+ min-height: 0;
624
+ }
625
+
569
626
  .key-field {
570
627
  min-width: 110px;
571
628
  flex-wrap: wrap;
@@ -592,18 +649,27 @@
592
649
  padding-bottom: 6px;
593
650
  }
594
651
 
652
+ .sy-nir-help-text {
653
+ font-size: var(--v-fontSize-liensEtLibelles);
654
+ font-weight: 400;
655
+ letter-spacing: 0.0333em;
656
+ line-height: 16px;
657
+ padding-inline: 16px;
658
+ color: rgba(var(--v-theme-onSurface), var(--v-medium-emphasis-opacity));
659
+ }
660
+
595
661
  .sy-number-errors,
596
662
  .sy-key-errors {
597
- color: rgb(var(--v-theme-textError));
663
+ color: rgb(var(--v-theme-error));
598
664
  }
599
665
 
600
666
  .sy-number-warnings,
601
667
  .sy-key-warnings {
602
- color: rgb(var(--v-theme-textWarning));
668
+ color: rgb(var(--v-theme-onWarningVariant));
603
669
  }
604
670
 
605
671
  .sy-number-success,
606
672
  .sy-key-success {
607
- color: rgb(var(--v-theme-textSuccess));
673
+ color: rgb(var(--v-theme-onSuccessVariant));
608
674
  }
609
675
  </style>
@@ -397,28 +397,15 @@ describe('NirField.vue', () => {
397
397
  })
398
398
 
399
399
  it('respects showSuccessMessages prop', async () => {
400
- // Par défaut, showSuccessMessages = true
400
+ // Par défaut, showSuccessMessages = false
401
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
402
  expect(wrapper.props('showSuccessMessages')).toBe(true)
410
403
 
411
- // Avec showSuccessMessages = false
412
404
  await wrapper.setProps({ showSuccessMessages: false })
413
405
  await wrapper.vm.$nextTick()
414
406
  await flushPromises()
415
407
 
416
408
  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
409
  })
423
410
 
424
411
  it('respects disableErrorHandling prop', async () => {
@@ -452,6 +439,23 @@ describe('NirField.vue', () => {
452
439
  expect(textFields[1]?.props('appendTooltip')).toBe(keyTooltip)
453
440
  })
454
441
 
442
+ it('affiche les hints internes (numberHint/keyHint) quand persistentHint est true', async () => {
443
+ const w = mount(NirField, {
444
+ props: {
445
+ label: 'Identifiant',
446
+ numberHint: 'Indice numéro',
447
+ keyHint: 'Indice clé',
448
+ persistentHint: true,
449
+ },
450
+ })
451
+ activeWrappers.push(w)
452
+ await w.vm.$nextTick()
453
+ await flushPromises()
454
+
455
+ expect(w.text()).toContain('Indice numéro')
456
+ expect(w.text()).toContain('Indice clé')
457
+ })
458
+
455
459
  it('renders asterisks correctly when displayAsterisk is true AND required is true', async () => {
456
460
  // L'astérisque n'est affiché que si required = true ET displayAsterisk = true
457
461
  await wrapper.setProps({ required: true, displayAsterisk: true, numberLabel: 'Numéro', keyLabel: 'Clé' })
@@ -622,4 +626,121 @@ describe('NirField.vue', () => {
622
626
  focusSpy.mockRestore()
623
627
  })
624
628
  })
629
+
630
+ describe('helpText', () => {
631
+ it('affiche le helpText quand aucun message de validation', async () => {
632
+ const w = mount(NirField, { props: { label: 'Identifiant', helpText: 'Saisissez le NIR' } })
633
+ activeWrappers.push(w)
634
+ await w.vm.$nextTick()
635
+ await flushPromises()
636
+
637
+ const help = w.find('.sy-nir-help-text')
638
+ expect(help.exists()).toBe(true)
639
+ expect(help.text()).toBe('Saisissez le NIR')
640
+ })
641
+
642
+ it('n\'affiche pas le helpText quand hideDetails est true', async () => {
643
+ const w = mount(NirField, { props: { label: 'Identifiant', helpText: 'Saisissez le NIR', hideDetails: true } })
644
+ activeWrappers.push(w)
645
+ await w.vm.$nextTick()
646
+ await flushPromises()
647
+
648
+ expect(w.find('.sy-nir-help-text').exists()).toBe(false)
649
+ })
650
+
651
+ it('affiche toujours le helpText lorsqu\'une erreur est présente', async () => {
652
+ const w = mount(NirField, { props: { label: 'Identifiant', helpText: 'Saisissez le NIR', required: true } })
653
+ activeWrappers.push(w)
654
+ await w.vm.$nextTick()
655
+ await flushPromises()
656
+
657
+ // Déclenche l'erreur "requis" (champ vide)
658
+ await w.vm.validateOnSubmit()
659
+ await w.vm.$nextTick()
660
+ await flushPromises()
661
+
662
+ const help = w.find('.sy-nir-help-text')
663
+ expect(help.exists()).toBe(true)
664
+ expect(help.text()).toBe('Saisissez le NIR')
665
+ })
666
+ })
667
+
668
+ describe('clearable', () => {
669
+ it('affiche le bouton clear quand clearable et qu\'il y a une valeur', async () => {
670
+ const w = mount(NirField, { props: { label: 'Identifiant', clearable: true } })
671
+ activeWrappers.push(w)
672
+ await w.find('.number-field input').setValue('2940375120005')
673
+ await w.vm.$nextTick()
674
+ await flushPromises()
675
+
676
+ expect(w.find('.number-field .sy-text-field__clear').exists()).toBe(true)
677
+ })
678
+
679
+ it('n\'affiche pas le bouton clear quand clearable est false', async () => {
680
+ const w = mount(NirField, { props: { label: 'Identifiant', clearable: false } })
681
+ activeWrappers.push(w)
682
+ await w.find('.number-field input').setValue('2940375120005')
683
+ await w.vm.$nextTick()
684
+ await flushPromises()
685
+
686
+ expect(w.find('.number-field .sy-text-field__clear').exists()).toBe(false)
687
+ })
688
+
689
+ it('vide le champ au clic sur le bouton clear', async () => {
690
+ const w = mount(NirField, { props: { label: 'Identifiant', clearable: true } })
691
+ activeWrappers.push(w)
692
+ const numberInput = w.find('.number-field input')
693
+ await numberInput.setValue('2940375120005')
694
+ await w.vm.$nextTick()
695
+ await flushPromises()
696
+
697
+ await w.find('.number-field .sy-text-field__clear').trigger('click')
698
+ await w.vm.$nextTick()
699
+ await flushPromises()
700
+
701
+ expect((numberInput.element as HTMLInputElement).value).toBe('')
702
+ })
703
+ })
704
+
705
+ describe('validation Vuetify (numberRules / keyRules)', () => {
706
+ const numberRules = [(v: string) => (!!v && v.replace(/\s/g, '').length === 13) || 'Le numéro doit contenir 13 chiffres']
707
+ const keyRules = [(v: string) => (!!v && v.replace(/\s/g, '').length === 2) || 'La clé doit contenir 2 chiffres']
708
+
709
+ it('applique numberRules : un NIR partiel est invalide', async () => {
710
+ const w = mount(NirField, { props: { label: 'Identifiant', useVuetifyValidation: true, numberRules, keyRules } })
711
+ activeWrappers.push(w)
712
+ await w.find('.number-field input').setValue('12345')
713
+ await w.vm.$nextTick()
714
+ await flushPromises()
715
+
716
+ const isValid = await w.vm.validateOnSubmit()
717
+ await flushPromises()
718
+ expect(isValid).toBe(false)
719
+ })
720
+
721
+ it('applique keyRules : une clé vide invalide même si le numéro est complet', async () => {
722
+ const w = mount(NirField, { props: { label: 'Identifiant', useVuetifyValidation: true, numberRules, keyRules } })
723
+ activeWrappers.push(w)
724
+ await w.find('.number-field input').setValue('2940375120005')
725
+ await w.vm.$nextTick()
726
+ await flushPromises()
727
+
728
+ const isValid = await w.vm.validateOnSubmit()
729
+ await flushPromises()
730
+ expect(isValid).toBe(false)
731
+ })
732
+
733
+ it('valide quand le numéro (13 chiffres) et la clé (2 chiffres) respectent les règles', async () => {
734
+ const w = mount(NirField, { props: { label: 'Identifiant', useVuetifyValidation: true, numberRules, keyRules } })
735
+ activeWrappers.push(w)
736
+ await w.find('.number-field input').setValue('2940375120005')
737
+ await w.find('.key-field input').setValue('05')
738
+ await w.vm.$nextTick()
739
+ await flushPromises()
740
+
741
+ const isValid = await w.vm.validateOnSubmit()
742
+ await flushPromises()
743
+ expect(isValid).toBe(true)
744
+ })
745
+ })
625
746
  })
@@ -0,0 +1,28 @@
1
+ import NirField from '../NirField.vue'
2
+
3
+ describe('NirField - Visual regression tests', () => {
4
+ it('displays the NIR field by default', () => {
5
+ cy.mountWithVuetify(NirField)
6
+
7
+ cy.get('.v-application').should('be.visible')
8
+ cy.matchImageSnapshot('nir-field-default', cy.get('.v-application'))
9
+ })
10
+
11
+ it('displays the NIR field with key display', () => {
12
+ cy.mountWithVuetify(NirField, {
13
+ props: { displayKey: true },
14
+ })
15
+
16
+ cy.get('.v-application').should('be.visible')
17
+ cy.matchImageSnapshot('nir-field-with-key', cy.get('.v-application'))
18
+ })
19
+
20
+ it('displays the NIR field in complex mode', () => {
21
+ cy.mountWithVuetify(NirField, {
22
+ props: { nirType: 'complexe' },
23
+ })
24
+
25
+ cy.get('.v-application').should('be.visible')
26
+ cy.matchImageSnapshot('nir-field-complex', cy.get('.v-application'))
27
+ })
28
+ })
@@ -446,4 +446,172 @@ describe('useNirValidation via NirField component', () => {
446
446
  const isValid = await wrapper.vm.validateOnSubmit()
447
447
  expect(isValid).toBe(true)
448
448
  })
449
+
450
+ it('ne devrait afficher aucune erreur ni état quand disableErrorHandling est vrai', async () => {
451
+ wrapper = await createWrapper({ required: true, disableErrorHandling: true })
452
+
453
+ await wrapper.find('.number-field input').trigger('focus')
454
+ await wrapper.find('.number-field input').trigger('blur')
455
+ await wrapper.vm.$nextTick()
456
+ await flushPromises()
457
+
458
+ expect(wrapper.vm.numberValidation.errors.value).toEqual([])
459
+ expect(wrapper.vm.numberValidation.hasError.value).toBe(false)
460
+
461
+ await wrapper.find('.key-field input').trigger('focus')
462
+ await wrapper.find('.key-field input').trigger('blur')
463
+ await wrapper.vm.$nextTick()
464
+ await flushPromises()
465
+
466
+ expect(wrapper.vm.keyValidation.errors.value).toEqual([])
467
+ expect(wrapper.vm.keyValidation.hasError.value).toBe(false)
468
+ })
469
+
470
+ it('devrait valider à chaque changement de valeur quand isValidateOnBlur est faux', async () => {
471
+ wrapper = await createWrapper({ required: true, isValidateOnBlur: false })
472
+
473
+ const numberInput = wrapper.find('.number-field input')
474
+
475
+ // Saisie d'une valeur invalide sans blur
476
+ await numberInput.setValue('123')
477
+ await wrapper.vm.$nextTick()
478
+ await flushPromises()
479
+
480
+ // L'erreur doit apparaître immédiatement, sans blur
481
+ expect(wrapper.vm.numberValidation.errors.value).toContain(locales.errorInvalidNumber)
482
+
483
+ // Correction vers une valeur valide
484
+ await numberInput.setValue('2940375120005')
485
+ await wrapper.vm.$nextTick()
486
+ await flushPromises()
487
+
488
+ expect(wrapper.vm.numberValidation.errors.value).toEqual([])
489
+ })
490
+
491
+ it('devrait afficher les errorMessages injectés depuis le parent', async () => {
492
+ const injectedError = 'Erreur injectée depuis le parent'
493
+ wrapper = await createWrapper({ errorMessages: [injectedError] })
494
+
495
+ await wrapper.vm.$nextTick()
496
+ await flushPromises()
497
+
498
+ // L'état d'erreur doit refléter le message injecté sans déclencher de validation
499
+ expect(wrapper.vm.numberValidation.hasError.value).toBe(true)
500
+ expect(wrapper.vm.numberValidation.errors.value).toContain(injectedError)
501
+ })
502
+
503
+ it('devrait réinitialiser la validation quand modelValue passe à null ou undefined', async () => {
504
+ // Partir d'un NIR invalide pour avoir une erreur
505
+ wrapper = await createWrapper({ required: true, modelValue: '199012345678' })
506
+
507
+ await wrapper.vm.validateOnSubmit()
508
+ await wrapper.vm.$nextTick()
509
+ await flushPromises()
510
+
511
+ expect(wrapper.vm.numberValidation.errors.value.length).toBeGreaterThan(0)
512
+
513
+ // Remettre modelValue à undefined simule un reset depuis le parent
514
+ await wrapper.setProps({ modelValue: undefined })
515
+ await wrapper.vm.$nextTick()
516
+ await flushPromises()
517
+
518
+ expect(wrapper.vm.numberValidation.errors.value).toEqual([])
519
+ expect(wrapper.vm.keyValidation.errors.value).toEqual([])
520
+ })
521
+
522
+ it('devrait afficher les warningMessages injectés depuis le parent', async () => {
523
+ const injectedWarning = 'Avertissement injecté depuis le parent'
524
+ wrapper = await createWrapper({ warningMessages: [injectedWarning] })
525
+
526
+ await wrapper.vm.$nextTick()
527
+ await flushPromises()
528
+
529
+ expect(wrapper.vm.numberValidation.hasWarning.value).toBe(true)
530
+ expect(wrapper.vm.numberValidation.warnings.value).toContain(injectedWarning)
531
+ })
532
+
533
+ it('devrait afficher les successMessages injectés depuis le parent', async () => {
534
+ const injectedSuccess = 'Succès injecté depuis le parent'
535
+ wrapper = await createWrapper({ successMessages: [injectedSuccess], showSuccessMessages: true })
536
+
537
+ await wrapper.vm.$nextTick()
538
+ await flushPromises()
539
+
540
+ expect(wrapper.vm.numberValidation.hasSuccess.value).toBe(true)
541
+ expect(wrapper.vm.numberValidation.successes.value).toContain(injectedSuccess)
542
+ })
543
+
544
+ it('devrait refléter l\'état d\'avertissement forcé via la prop hasWarning', async () => {
545
+ wrapper = await createWrapper({ hasWarning: true })
546
+
547
+ expect(wrapper.vm.numberValidation.hasWarning.value).toBe(true)
548
+ })
549
+
550
+ it('devrait refléter l\'état de succès forcé via la prop hasSuccess', async () => {
551
+ wrapper = await createWrapper({ hasSuccess: true })
552
+
553
+ expect(wrapper.vm.numberValidation.hasSuccess.value).toBe(true)
554
+ })
555
+
556
+ it('devrait retourner false sur validateOnSubmit quand le champ est requis et vide', async () => {
557
+ wrapper = await createWrapper({ required: true })
558
+
559
+ const isValid = await wrapper.vm.validateOnSubmit()
560
+ await wrapper.vm.$nextTick()
561
+ await flushPromises()
562
+
563
+ expect(isValid).toBe(false)
564
+ expect(wrapper.vm.numberValidation.hasError.value).toBe(true)
565
+ })
566
+
567
+ it('devrait retourner false sur validateOnSubmit quand le NIR est invalide', async () => {
568
+ wrapper = await createWrapper({ required: true })
569
+ await wrapper.find('.number-field input').setValue('1234567890123') // 13 chiffres mais NIR invalide
570
+ await wrapper.vm.$nextTick()
571
+ await flushPromises()
572
+
573
+ const isValid = await wrapper.vm.validateOnSubmit()
574
+ await wrapper.vm.$nextTick()
575
+ await flushPromises()
576
+
577
+ expect(isValid).toBe(false)
578
+ })
579
+
580
+ it('devrait plafonner le nombre d\'erreurs affichées via maxErrors', async () => {
581
+ const failingRules = [
582
+ { type: 'custom', options: { validate: () => false, message: 'Erreur custom 1' } },
583
+ { type: 'custom', options: { validate: () => false, message: 'Erreur custom 2' } },
584
+ ]
585
+
586
+ const limited = await createWrapper({ customNumberRules: failingRules, maxErrors: 1, modelValue: '199012345678' })
587
+ await limited.vm.validateOnSubmit()
588
+ await limited.vm.$nextTick()
589
+ await flushPromises()
590
+ expect(limited.vm.numberValidation.errors.value.length).toBe(1)
591
+
592
+ const extended = await createWrapper({ customNumberRules: failingRules, maxErrors: 5, modelValue: '199012345678' })
593
+ await extended.vm.validateOnSubmit()
594
+ await extended.vm.$nextTick()
595
+ await flushPromises()
596
+ expect(extended.vm.numberValidation.errors.value.length).toBeGreaterThan(1)
597
+ })
598
+
599
+ it('ne devrait pas bloquer la soumission à cause d\'un avertissement (warning non bloquant)', async () => {
600
+ const warningMessage = 'Avertissement non bloquant'
601
+ // NIR complet et valide (13 chiffres) + clé valide, avec une règle d'avertissement qui se déclenche
602
+ wrapper = await createWrapper({
603
+ modelValue: '294037512000591',
604
+ customNumberWarningRules: [{ type: 'custom', options: { validate: () => warningMessage, message: warningMessage } }],
605
+ })
606
+ await wrapper.vm.$nextTick()
607
+ await flushPromises()
608
+
609
+ const isValid = await wrapper.vm.validateOnSubmit()
610
+ await wrapper.vm.$nextTick()
611
+ await flushPromises()
612
+
613
+ expect(wrapper.vm.numberValidation.hasWarning.value).toBe(true)
614
+ expect(wrapper.vm.numberValidation.hasError.value).toBe(false)
615
+ expect(isValid).toBe(true)
616
+ })
449
617
  })