@cnamts/synapse 1.0.27 → 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 (473) hide show
  1. package/README.md +1 -1
  2. package/dist/{AutocompleteFilter-C9eLKyW8.js → AutocompleteFilter-DXd4szWO.js} +3 -3
  3. package/dist/{DateFilter-y-GLkAkn.js → DateFilter-BD59Kgwf.js} +8 -8
  4. package/dist/{NumberFilter-DN6hIBS7.js → NumberFilter-BSMZE7uw.js} +1 -1
  5. package/dist/{PeriodFilter-MoUUp9qS.js → PeriodFilter-keUdSSk0.js} +1 -1
  6. package/dist/{SelectFilter-bCbrdLmu.js → SelectFilter-Dhvvwazl.js} +1 -1
  7. package/dist/{TextFilter-CvjgEaoM.js → TextFilter-CU8FpXz0.js} +4 -4
  8. package/dist/{apLightTheme2026-ug4Y23ns.js → apLightTheme2026-DbS7BPUf.js} +12 -11
  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 +85 -313
  18. package/dist/components/Customs/Selects/SyAutocomplete/composables/useSyAutocompleteValidation.d.ts +2 -2
  19. package/dist/components/Customs/Selects/SyInputSelect/SyInputSelect.d.ts +1 -1
  20. package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +9 -11
  21. package/dist/components/Customs/Selects/SySelect/composables/useSySelectValidation.d.ts +7 -7
  22. package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +3 -3
  23. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +5 -5
  24. package/dist/components/Customs/SyIcon/SyIcon.d.ts +77 -1
  25. package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +10 -10
  26. package/dist/components/Customs/SyTextField/SyTextField.d.ts +19 -79
  27. package/dist/components/Customs/SyTextField/locales.d.ts +7 -0
  28. package/dist/components/Customs/SyTextField/types.d.ts +67 -4
  29. package/dist/components/Customs/SyTextField/useNumberField.d.ts +23 -0
  30. package/dist/components/Customs/SyTextField/useSyTextFieldValidation.d.ts +38 -0
  31. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +170 -622
  32. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +85 -311
  33. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +39 -152
  34. package/dist/components/FilterInline/FilterInline.d.ts +3 -3
  35. package/dist/components/FilterSideBar/FilterSideBar.d.ts +4 -4
  36. package/dist/components/MonthPicker/MonthPicker.d.ts +37 -150
  37. package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +37 -150
  38. package/dist/components/NirField/NirField.d.ts +90 -321
  39. package/dist/components/NirField/useNirValidation.d.ts +10 -20
  40. package/dist/components/PasswordField/PasswordField.d.ts +20 -39
  41. package/dist/components/PasswordField/locales.d.ts +2 -0
  42. package/dist/components/PasswordField/types.d.ts +16 -0
  43. package/dist/components/PasswordField/usePasswordFieldValidation.d.ts +38 -0
  44. package/dist/components/PeriodField/PeriodField.d.ts +349 -1253
  45. package/dist/components/PhoneField/PhoneField.d.ts +37 -150
  46. package/dist/components/SearchListField/SearchListField.d.ts +3 -3
  47. package/dist/components/SyTextArea/SyTextArea.d.ts +14 -11
  48. package/dist/components/SyTextArea/composables/useSyTextAreaValidation.d.ts +7 -7
  49. package/dist/components/Tables/common/SyTablePagination.d.ts +19 -20
  50. package/dist/composables/unifyValidation/documentationValidationProps.d.ts +1 -1
  51. package/dist/composables/unifyValidation/useValidation.d.ts +1 -9
  52. package/dist/composables/useFilterable/useFilterable.d.ts +1 -2
  53. package/dist/design-system-v3.js +19 -19
  54. package/dist/designTokens/tokens/amelipro/apLightTheme.d.ts +1 -0
  55. package/dist/designTokens/tokens/pa/paLightTheme.d.ts +1 -0
  56. package/dist/{main-CI6Q9nmO.js → main-D8ryUoS5.js} +13605 -13358
  57. package/dist/synapse.css +1 -1
  58. package/dist/vuetifyConfig.js +27 -25
  59. package/package.json +6 -5
  60. package/src/components/Accordion/tests/Accordion.visual.cy.ts +44 -0
  61. package/src/components/Accordion/tests/__snapshots__/accordion-default.snap.png +0 -0
  62. package/src/components/Accordion/tests/__snapshots__/accordion-disabled-item.snap.png +0 -0
  63. package/src/components/Accordion/tests/__snapshots__/accordion-open-first.snap.png +0 -0
  64. package/src/components/BackBtn/tests/__snapshots__/back-btn-custom-bg.snap.png +0 -0
  65. package/src/components/BackBtn/tests/__snapshots__/back-btn-dark-mode.snap.png +0 -0
  66. package/src/components/BackBtn/tests/__snapshots__/back-btn-default.snap.png +0 -0
  67. package/src/components/BackBtn/tests/__snapshots__/back-btn-no-icon.snap.png +0 -0
  68. package/src/components/BackToTopBtn/tests/BackToTopBtn.visual.cy.ts +34 -0
  69. package/src/components/BackToTopBtn/tests/__snapshots__/back-to-top-btn-custom-nudge.snap.png +0 -0
  70. package/src/components/BackToTopBtn/tests/__snapshots__/back-to-top-btn-default.snap.png +0 -0
  71. package/src/components/Captcha/tests/Captcha.visual.cy.ts +45 -0
  72. package/src/components/Captcha/tests/__snapshots__/Captcha.spec.ts.snap +4 -0
  73. package/src/components/Captcha/tests/__snapshots__/captcha-audio-type.snap.png +0 -0
  74. package/src/components/Captcha/tests/__snapshots__/captcha-image-type.snap.png +0 -0
  75. package/src/components/Captcha/tests/__snapshots__/captcha-no-helpdesk.snap.png +0 -0
  76. package/src/components/ChipList/tests/ChipList.visual.cy.ts +46 -0
  77. package/src/components/ChipList/tests/__snapshots__/chip-list-default.snap.png +0 -0
  78. package/src/components/ChipList/tests/__snapshots__/chip-list-readonly.snap.png +0 -0
  79. package/src/components/ChipList/tests/__snapshots__/chip-list-state-icons.snap.png +0 -0
  80. package/src/components/CollapsibleList/tests/CollapsibleList.visual.cy.ts +33 -0
  81. package/src/components/CollapsibleList/tests/__snapshots__/collapsible-list-default.snap.png +0 -0
  82. package/src/components/CollapsibleList/tests/__snapshots__/collapsible-list-no-title.snap.png +0 -0
  83. package/src/components/ContextualMenu/tests/ContextualMenu.visual.cy.ts +35 -0
  84. package/src/components/ContextualMenu/tests/__snapshots__/contextual-menu-default.snap.png +0 -0
  85. package/src/components/ContextualMenu/tests/__snapshots__/contextual-menu-selected.snap.png +0 -0
  86. package/src/components/CookieBanner/tests/CookieBanner.visual.cy.ts +29 -0
  87. package/src/components/CookieBanner/tests/__snapshots__/cookie-banner-default.snap.png +0 -0
  88. package/src/components/CookieBanner/tests/__snapshots__/cookie-banner-with-items.snap.png +0 -0
  89. package/src/components/CookiesSelection/tests/CookiesSelection.visual.cy.ts +21 -0
  90. package/src/components/CookiesSelection/tests/__snapshots__/cookies-selection-default.snap.png +0 -0
  91. package/src/components/CopyBtn/tests/CopyBtn.visual.cy.ts +24 -0
  92. package/src/components/CopyBtn/tests/__snapshots__/copy-btn-default.snap.png +0 -0
  93. package/src/components/CopyBtn/tests/__snapshots__/copy-btn-no-tooltip.snap.png +0 -0
  94. package/src/components/Customs/Selects/SelectBtnField/tests/SelectBtnField.visual.cy.ts +60 -0
  95. package/src/components/Customs/Selects/SelectBtnField/tests/__snapshots__/select-btn-field-default.snap.png +0 -0
  96. package/src/components/Customs/Selects/SelectBtnField/tests/__snapshots__/select-btn-field-inline.snap.png +0 -0
  97. package/src/components/Customs/Selects/SelectBtnField/tests/__snapshots__/select-btn-field-readonly.snap.png +0 -0
  98. package/src/components/Customs/Selects/SelectBtnField/tests/__snapshots__/select-btn-field-selected.snap.png +0 -0
  99. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +1 -1
  100. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +2 -0
  101. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.visual.cy.ts +63 -0
  102. package/src/components/Customs/Selects/SyAutocomplete/tests/__snapshots__/sy-autocomplete-default.snap.png +0 -0
  103. package/src/components/Customs/Selects/SyAutocomplete/tests/__snapshots__/sy-autocomplete-loading.snap.png +0 -0
  104. package/src/components/Customs/Selects/SyAutocomplete/tests/__snapshots__/sy-autocomplete-multiple.snap.png +0 -0
  105. package/src/components/Customs/Selects/SyAutocomplete/tests/__snapshots__/sy-autocomplete-with-value.snap.png +0 -0
  106. package/src/components/Customs/Selects/SyAutocomplete/validation/Validation.stories.ts +0 -93
  107. package/src/components/Customs/Selects/SyInputSelect/tests/SyInputSelect.visual.cy.ts +48 -0
  108. package/src/components/Customs/Selects/SyInputSelect/tests/__snapshots__/sy-input-select-default.snap.png +0 -0
  109. package/src/components/Customs/Selects/SyInputSelect/tests/__snapshots__/sy-input-select-required.snap.png +0 -0
  110. package/src/components/Customs/Selects/SyInputSelect/tests/__snapshots__/sy-input-select-with-value.snap.png +0 -0
  111. package/src/components/Customs/Selects/SySelect/SySelect.vue +22 -47
  112. package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +3 -3
  113. package/src/components/Customs/Selects/SySelect/tests/SySelect.visual.cy.ts +77 -0
  114. package/src/components/Customs/Selects/SySelect/tests/__snapshots__/sy-select-clearable.snap.png +0 -0
  115. package/src/components/Customs/Selects/SySelect/tests/__snapshots__/sy-select-default.snap.png +0 -0
  116. package/src/components/Customs/Selects/SySelect/tests/__snapshots__/sy-select-multiple-chips.snap.png +0 -0
  117. package/src/components/Customs/Selects/SySelect/tests/__snapshots__/sy-select-required.snap.png +0 -0
  118. package/src/components/Customs/Selects/SySelect/tests/__snapshots__/sy-select-with-value.snap.png +0 -0
  119. package/src/components/Customs/Selects/SySelect/validation/Validation.stories.ts +1 -92
  120. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +1 -1
  121. package/src/components/Customs/SyCheckBoxGroup/tests/SyCheckBoxGroup.visual.cy.ts +55 -0
  122. package/src/components/Customs/SyCheckBoxGroup/tests/__snapshots__/sy-checkbox-group-default.snap.png +0 -0
  123. package/src/components/Customs/SyCheckBoxGroup/tests/__snapshots__/sy-checkbox-group-disabled.snap.png +0 -0
  124. package/src/components/Customs/SyCheckBoxGroup/tests/__snapshots__/sy-checkbox-group-selected.snap.png +0 -0
  125. package/src/components/Customs/SyCheckBoxGroup/tests/__snapshots__/sy-checkbox-group-with-label.snap.png +0 -0
  126. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +1 -9
  127. package/src/components/Customs/SyCheckbox/tests/SyCheckbox.visual.cy.ts +61 -0
  128. package/src/components/Customs/SyCheckbox/tests/__snapshots__/sy-checkbox-checked.snap.png +0 -0
  129. package/src/components/Customs/SyCheckbox/tests/__snapshots__/sy-checkbox-disabled.snap.png +0 -0
  130. package/src/components/Customs/SyCheckbox/tests/__snapshots__/sy-checkbox-indeterminate.snap.png +0 -0
  131. package/src/components/Customs/SyCheckbox/tests/__snapshots__/sy-checkbox-required.snap.png +0 -0
  132. package/src/components/Customs/SyCheckbox/tests/__snapshots__/sy-checkbox-unchecked.snap.png +0 -0
  133. package/src/components/Customs/SyIcon/SyIcon.vue +19 -1
  134. package/src/components/Customs/SyIcon/tests/SyIcon.visual.cy.ts +83 -0
  135. package/src/components/Customs/SyIcon/tests/__snapshots__/sy-icon-color-error.snap.png +0 -0
  136. package/src/components/Customs/SyIcon/tests/__snapshots__/sy-icon-decorative.snap.png +0 -0
  137. package/src/components/Customs/SyIcon/tests/__snapshots__/sy-icon-informative.snap.png +0 -0
  138. package/src/components/Customs/SyIcon/tests/__snapshots__/sy-icon-role-button.snap.png +0 -0
  139. package/src/components/Customs/SyIcon/tests/__snapshots__/sy-icon-size-large.snap.png +0 -0
  140. package/src/components/Customs/SyIconButton/tests/SyIconButton.visual.cy.ts +55 -0
  141. package/src/components/Customs/SyIconButton/tests/__snapshots__/sy-icon-button-default.snap.png +0 -0
  142. package/src/components/Customs/SyIconButton/tests/__snapshots__/sy-icon-button-disabled.snap.png +0 -0
  143. package/src/components/Customs/SyIconButton/tests/__snapshots__/sy-icon-button-error.snap.png +0 -0
  144. package/src/components/Customs/SyIconButton/tests/__snapshots__/sy-icon-button-large.snap.png +0 -0
  145. package/src/components/Customs/SyPagination/tests/SyPagination.visual.cy.ts +40 -0
  146. package/src/components/Customs/SyPagination/tests/__snapshots__/sy-pagination-first-page.snap.png +0 -0
  147. package/src/components/Customs/SyPagination/tests/__snapshots__/sy-pagination-middle-page.snap.png +0 -0
  148. package/src/components/Customs/SyPagination/tests/__snapshots__/sy-pagination-with-label.snap.png +0 -0
  149. package/src/components/Customs/SyRadioGroup/SyRadioGroup.stories.ts +0 -1
  150. package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +4 -3
  151. package/src/components/Customs/SyRadioGroup/composables/useSyRadioGroupValidation.ts +1 -1
  152. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-asterisk.snap.png +0 -0
  153. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-comfortable.snap.png +0 -0
  154. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-compact.snap.png +0 -0
  155. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-default.snap.png +0 -0
  156. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-disabled.snap.png +0 -0
  157. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-error.snap.png +0 -0
  158. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-no-details.snap.png +0 -0
  159. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-readonly.snap.png +0 -0
  160. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-selected.snap.png +0 -0
  161. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-success.snap.png +0 -0
  162. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-warning.snap.png +0 -0
  163. package/src/components/Customs/SyRadioGroup/validation/Validation.stories.ts +63 -27
  164. package/src/components/Customs/SyTabs/tests/SyTabs.visual.cy.ts +30 -0
  165. package/src/components/Customs/SyTabs/tests/__snapshots__/sy-tabs-default.snap.png +0 -0
  166. package/src/components/Customs/SyTabs/tests/__snapshots__/sy-tabs-second-active.snap.png +0 -0
  167. package/src/components/Customs/SyTextField/SyTextField.stories.ts +160 -778
  168. package/src/components/Customs/SyTextField/SyTextField.vue +168 -153
  169. package/src/components/Customs/SyTextField/Validation/Validation.stories.ts +1164 -0
  170. package/src/components/Customs/SyTextField/locales.ts +12 -0
  171. package/src/components/Customs/SyTextField/tests/SyTextField.spec.ts +174 -8
  172. package/src/components/Customs/SyTextField/tests/SyTextField.visual.cy.ts +116 -0
  173. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-clearable.snap.png +0 -0
  174. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-default.snap.png +0 -0
  175. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-number-disabled.snap.png +0 -0
  176. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-number-no-spinner.snap.png +0 -0
  177. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-number.snap.png +0 -0
  178. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-prepend-icon.snap.png +0 -0
  179. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-readonly.snap.png +0 -0
  180. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-required.snap.png +0 -0
  181. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-with-value.snap.png +0 -0
  182. package/src/components/Customs/SyTextField/types.ts +70 -0
  183. package/src/components/Customs/SyTextField/useNumberField.ts +93 -0
  184. package/src/components/Customs/SyTextField/useSyTextFieldValidation.ts +104 -0
  185. package/src/components/DataList/tests/DataList.visual.cy.ts +85 -0
  186. package/src/components/DataList/tests/__snapshots__/data-list-default.snap.png +0 -0
  187. package/src/components/DataList/tests/__snapshots__/data-list-loading.snap.png +0 -0
  188. package/src/components/DataList/tests/__snapshots__/data-list-row.snap.png +0 -0
  189. package/src/components/DataList/tests/__snapshots__/data-list-with-icons.snap.png +0 -0
  190. package/src/components/DataList/tests/__snapshots__/data-list-with-title.snap.png +0 -0
  191. package/src/components/DataListGroup/tests/DataListGroup.visual.cy.ts +51 -0
  192. package/src/components/DataListGroup/tests/__snapshots__/data-list-group-default.snap.png +0 -0
  193. package/src/components/DataListGroup/tests/__snapshots__/data-list-group-loading.snap.png +0 -0
  194. package/src/components/DataListItem/tests/DataListItem.visual.cy.ts +53 -0
  195. package/src/components/DataListItem/tests/__snapshots__/data-list-item-chip.snap.png +0 -0
  196. package/src/components/DataListItem/tests/__snapshots__/data-list-item-default.snap.png +0 -0
  197. package/src/components/DataListItem/tests/__snapshots__/data-list-item-placeholder.snap.png +0 -0
  198. package/src/components/DataListItem/tests/__snapshots__/data-list-item-row.snap.png +0 -0
  199. package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +1 -1
  200. package/src/components/DatePicker/CalendarMode/DatePicker.vue +7 -7
  201. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +1 -1
  202. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +7 -8
  203. package/src/components/DatePicker/DateTextInput/DateRange.stories.ts +1 -1
  204. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +2 -2
  205. package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +1 -1
  206. package/src/components/DatePicker/composables/tests/useTodayButton.spec.ts +10 -10
  207. package/src/components/DatePicker/composables/useCalendarKeyboardNavigation.ts +11 -2
  208. package/src/components/DeclarationAccessibilityPage/tests/DeclarationAccessibilityPage.visual.cy.ts +35 -0
  209. package/src/components/DeclarationAccessibilityPage/tests/__snapshots__/declaration-a11y-page-default.snap.png +0 -0
  210. package/src/components/DeclarationAccessibilityPage/tests/__snapshots__/declaration-a11y-page-full.snap.png +0 -0
  211. package/src/components/DiacriticPicker/tests/DiacriticPicker.visual.cy.ts +24 -0
  212. package/src/components/DiacriticPicker/tests/__snapshots__/diacritic-picker-custom-title.snap.png +0 -0
  213. package/src/components/DiacriticPicker/tests/__snapshots__/diacritic-picker-default.snap.png +0 -0
  214. package/src/components/DialogBox/tests/__snapshots__/dialog-box-custom-texts.snap.png +0 -0
  215. package/src/components/DialogBox/tests/__snapshots__/dialog-box-default.snap.png +0 -0
  216. package/src/components/DialogBox/tests/__snapshots__/dialog-box-no-actions.snap.png +0 -0
  217. package/src/components/DownloadBtn/tests/DownloadBtn.spec.ts +2 -2
  218. package/src/components/DownloadBtn/tests/DownloadBtn.visual.cy.ts +38 -0
  219. package/src/components/DownloadBtn/tests/__snapshots__/download-btn-dark.snap.png +0 -0
  220. package/src/components/DownloadBtn/tests/__snapshots__/download-btn-idle.snap.png +0 -0
  221. package/src/components/ErrorPage/tests/ErrorPage.visual.cy.ts +32 -0
  222. package/src/components/ErrorPage/tests/__snapshots__/error-page-custom.snap.png +0 -0
  223. package/src/components/ErrorPage/tests/__snapshots__/error-page-default.snap.png +0 -0
  224. package/src/components/ErrorPage/tests/__snapshots__/error-page-no-btn.snap.png +0 -0
  225. package/src/components/ExternalLinks/tests/ExternalLinks.visual.cy.ts +30 -0
  226. package/src/components/ExternalLinks/tests/__snapshots__/external-links-default.snap.png +0 -0
  227. package/src/components/ExternalLinks/tests/__snapshots__/external-links-fixed.snap.png +0 -0
  228. package/src/components/FileList/tests/FileList.visual.cy.ts +31 -0
  229. package/src/components/FileList/tests/__snapshots__/file-list-default.snap.png +0 -0
  230. package/src/components/FileList/tests/__snapshots__/file-list-with-delete.snap.png +0 -0
  231. package/src/components/FilePreview/accessibilite/Accessibility.mdx +86 -8
  232. package/src/components/FileUpload/tests/FileUpload.visual.cy.ts +36 -0
  233. package/src/components/FileUpload/tests/__snapshots__/file-upload-default.snap.png +0 -0
  234. package/src/components/FileUpload/tests/__snapshots__/file-upload-disabled.snap.png +0 -0
  235. package/src/components/FileUpload/tests/__snapshots__/file-upload-multiple.snap.png +0 -0
  236. package/src/components/FilterInline/FilterInline.stories.ts +2 -0
  237. package/src/components/FilterInline/FilterInline.vue +10 -5
  238. package/src/components/FilterInline/tests/FilterInline.visual.cy.ts +25 -0
  239. package/src/components/FilterInline/tests/__snapshots__/filter-inline-default.snap.png +0 -0
  240. package/src/components/FilterSideBar/FilterSideBar.stories.ts +4 -1
  241. package/src/components/FilterSideBar/FilterSideBar.vue +11 -6
  242. package/src/components/FilterSideBar/tests/FilterSideBar.visual.cy.ts +37 -0
  243. package/src/components/FilterSideBar/tests/__snapshots__/filter-sidebar-default.snap.png +0 -0
  244. package/src/components/FilterSideBar/tests/__snapshots__/filter-sidebar-modale.snap.png +0 -0
  245. package/src/components/FooterBar/tests/FooterBar.visual.cy.ts +37 -0
  246. package/src/components/FooterBar/tests/__snapshots__/footer-bar-default.snap.png +0 -0
  247. package/src/components/FooterBar/tests/__snapshots__/footer-bar-no-logo.snap.png +0 -0
  248. package/src/components/FooterBar/tests/__snapshots__/footer-bar-no-social.snap.png +0 -0
  249. package/src/components/FooterBar/tests/__snapshots__/footer-bar-version.snap.png +0 -0
  250. package/src/components/FranceConnectBtn/tests/FranceConnectBtn.visual.cy.ts +38 -0
  251. package/src/components/FranceConnectBtn/tests/__snapshots__/france-connect-btn-dark.snap.png +0 -0
  252. package/src/components/FranceConnectBtn/tests/__snapshots__/france-connect-btn-default.snap.png +0 -0
  253. package/src/components/FranceConnectBtn/tests/__snapshots__/france-connect-btn-plus.snap.png +0 -0
  254. package/src/components/HeaderBar/HeaderBurgerMenu/tests/HeaderBurgerMenu.spec.ts +4 -4
  255. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated-submenu-open.snap.png +0 -0
  256. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated.snap.png +0 -0
  257. package/src/components/HeaderBar/tests/__snapshots__/header-bar-custom-width.snap.png +0 -0
  258. package/src/components/HeaderBar/tests/__snapshots__/header-bar-default.snap.png +0 -0
  259. package/src/components/HeaderBar/tests/__snapshots__/header-bar-no-sticky.snap.png +0 -0
  260. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-prepend.snap.png +0 -0
  261. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-side.snap.png +0 -0
  262. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-subtitle.snap.png +0 -0
  263. package/src/components/HeaderLoading/tests/HeaderLoading.visual.cy.ts +34 -0
  264. package/src/components/HeaderLoading/tests/__snapshots__/header-loading-custom-size.snap.png +0 -0
  265. package/src/components/HeaderLoading/tests/__snapshots__/header-loading-default.snap.png +0 -0
  266. package/src/components/HeaderLoading/tests/__snapshots__/header-loading-standalone.snap.png +0 -0
  267. package/src/components/HeaderNavigationBar/tests/HeaderNavigationBar.spec.ts +4 -4
  268. package/src/components/HeaderNavigationBar/tests/HeaderNavigationBar.visual.cy.ts +34 -0
  269. package/src/components/HeaderNavigationBar/tests/__snapshots__/header-navigation-bar-default.snap.png +0 -0
  270. package/src/components/HeaderNavigationBar/tests/__snapshots__/header-navigation-bar-subtitle.snap.png +0 -0
  271. package/src/components/HeaderToolbar/tests/HeaderToolbar.visual.cy.ts +25 -0
  272. package/src/components/HeaderToolbar/tests/__snapshots__/header-toolbar-custom.snap.png +0 -0
  273. package/src/components/HeaderToolbar/tests/__snapshots__/header-toolbar-default.snap.png +0 -0
  274. package/src/components/LangBtn/tests/LangBtn.visual.cy.ts +33 -0
  275. package/src/components/LangBtn/tests/__snapshots__/lang-btn-default.snap.png +0 -0
  276. package/src/components/LangBtn/tests/__snapshots__/lang-btn-english.snap.png +0 -0
  277. package/src/components/LangBtn/tests/__snapshots__/lang-btn-no-arrow.snap.png +0 -0
  278. package/src/components/Logo/tests/__snapshots__/logo-avatar.snap.png +0 -0
  279. package/src/components/Logo/tests/__snapshots__/logo-dark.snap.png +0 -0
  280. package/src/components/Logo/tests/__snapshots__/logo-default.snap.png +0 -0
  281. package/src/components/Logo/tests/__snapshots__/logo-no-organism.snap.png +0 -0
  282. package/src/components/Logo/tests/__snapshots__/logo-no-signature.snap.png +0 -0
  283. package/src/components/Logo/tests/__snapshots__/logo-risque-pro.snap.png +0 -0
  284. package/src/components/LogoBrandSection/tests/LogoBrandSection.visual.cy.ts +43 -0
  285. package/src/components/LogoBrandSection/tests/__snapshots__/logo-brand-section-default.snap.png +0 -0
  286. package/src/components/LogoBrandSection/tests/__snapshots__/logo-brand-section-mobile.snap.png +0 -0
  287. package/src/components/LogoBrandSection/tests/__snapshots__/logo-brand-section-reduced.snap.png +0 -0
  288. package/src/components/LogoBrandSection/tests/__snapshots__/logo-brand-section-with-title.snap.png +0 -0
  289. package/src/components/LunarCalendar/tests/LunarCalendar.visual.cy.ts +36 -0
  290. package/src/components/LunarCalendar/tests/__snapshots__/lunar-calendar-default.snap.png +0 -0
  291. package/src/components/LunarCalendar/tests/__snapshots__/lunar-calendar-required.snap.png +0 -0
  292. package/src/components/LunarCalendar/tests/__snapshots__/lunar-calendar-with-value.snap.png +0 -0
  293. package/src/components/MaintenancePage/tests/MaintenancePage.visual.cy.ts +22 -0
  294. package/src/components/MaintenancePage/tests/__snapshots__/maintenance-page-custom.snap.png +0 -0
  295. package/src/components/MaintenancePage/tests/__snapshots__/maintenance-page-default.snap.png +0 -0
  296. package/src/components/MonthPicker/tests/MonthPicker.visual.cy.ts +37 -0
  297. package/src/components/MonthPicker/tests/__snapshots__/MonthPicker.spec.ts.snap +2 -0
  298. package/src/components/MonthPicker/tests/__snapshots__/month-picker-default.snap.png +0 -0
  299. package/src/components/MonthPicker/tests/__snapshots__/month-picker-disabled.snap.png +0 -0
  300. package/src/components/MonthPicker/tests/__snapshots__/month-picker-readonly.snap.png +0 -0
  301. package/src/components/MonthPicker/tests/__snapshots__/month-picker-with-value.snap.png +0 -0
  302. package/src/components/NirField/NirField.stories.ts +40 -682
  303. package/src/components/NirField/NirField.vue +98 -32
  304. package/src/components/NirField/tests/NirField.spec.ts +135 -14
  305. package/src/components/NirField/tests/NirField.visual.cy.ts +28 -0
  306. package/src/components/NirField/tests/__snapshots__/nir-field-complex.snap.png +0 -0
  307. package/src/components/NirField/tests/__snapshots__/nir-field-default.snap.png +0 -0
  308. package/src/components/NirField/tests/__snapshots__/nir-field-with-key.snap.png +0 -0
  309. package/src/components/NirField/tests/useNirValidation.spec.ts +168 -0
  310. package/src/components/NirField/useNirValidation.ts +28 -2
  311. package/src/components/NirField/validation/Validation.stories.ts +866 -0
  312. package/src/components/NotFoundPage/tests/NotFoundPage.visual.cy.ts +28 -0
  313. package/src/components/NotFoundPage/tests/__snapshots__/not-found-page-custom-btn.snap.png +0 -0
  314. package/src/components/NotFoundPage/tests/__snapshots__/not-found-page-default.snap.png +0 -0
  315. package/src/components/NotFoundPage/tests/__snapshots__/not-found-page-no-btn.snap.png +0 -0
  316. package/src/components/NotificationBar/tests/NotificationBar.visual.cy.ts +54 -0
  317. package/src/components/NotificationBar/tests/__snapshots__/notification-bar-bottom.snap.png +0 -0
  318. package/src/components/NotificationBar/tests/__snapshots__/notification-bar-info.snap.png +0 -0
  319. package/src/components/NotificationBar/tests/__snapshots__/notification-bar-multiple.snap.png +0 -0
  320. package/src/components/PageContainer/tests/PageContainer.visual.cy.ts +33 -0
  321. package/src/components/PageContainer/tests/__snapshots__/page-container-color.snap.png +0 -0
  322. package/src/components/PageContainer/tests/__snapshots__/page-container-default.snap.png +0 -0
  323. package/src/components/PageContainer/tests/__snapshots__/page-container-md.snap.png +0 -0
  324. package/src/components/PaginatedTable/accessibilite/Accessibility.mdx +99 -7
  325. package/src/components/PaginatedTable/tests/PaginatedTable.visual.cy.ts +41 -0
  326. package/src/components/PaginatedTable/tests/__snapshots__/paginated-table-default.snap.png +0 -0
  327. package/src/components/PaginatedTable/tests/__snapshots__/paginated-table-server.snap.png +0 -0
  328. package/src/components/PasswordField/PasswordField.mdx +5 -52
  329. package/src/components/PasswordField/PasswordField.stories.ts +74 -931
  330. package/src/components/PasswordField/PasswordField.vue +120 -191
  331. package/src/components/PasswordField/Validation/Validation.stories.ts +1295 -0
  332. package/src/components/PasswordField/locales.ts +2 -0
  333. package/src/components/PasswordField/tests/PasswordField.spec.ts +144 -106
  334. package/src/components/PasswordField/tests/PasswordField.visual.cy.ts +49 -0
  335. package/src/components/PasswordField/tests/__snapshots__/password-field-default.snap.png +0 -0
  336. package/src/components/PasswordField/tests/__snapshots__/password-field-disabled.snap.png +0 -0
  337. package/src/components/PasswordField/tests/__snapshots__/password-field-required.snap.png +0 -0
  338. package/src/components/PasswordField/tests/__snapshots__/password-field-underlined.snap.png +0 -0
  339. package/src/components/PasswordField/types.ts +17 -0
  340. package/src/components/PasswordField/usePasswordFieldValidation.ts +100 -0
  341. package/src/components/PeriodField/PeriodField.stories.ts +3 -1
  342. package/src/components/PeriodField/PeriodField.vue +1 -1
  343. package/src/components/PeriodField/tests/PeriodField.visual.cy.ts +39 -0
  344. package/src/components/PeriodField/tests/__snapshots__/period-field-default.snap.png +0 -0
  345. package/src/components/PeriodField/tests/__snapshots__/period-field-no-calendar.snap.png +0 -0
  346. package/src/components/PeriodField/tests/__snapshots__/period-field-required.snap.png +0 -0
  347. package/src/components/PeriodField/tests/__snapshots__/period-field-with-value.snap.png +0 -0
  348. package/src/components/PhoneField/PhoneField.vue +2 -2
  349. package/src/components/PhoneField/tests/PhoneField.spec.ts +1 -0
  350. package/src/components/PhoneField/tests/PhoneField.visual.cy.ts +28 -0
  351. package/src/components/PhoneField/tests/__snapshots__/phone-field-default.snap.png +0 -0
  352. package/src/components/PhoneField/tests/__snapshots__/phone-field-with-country-code.snap.png +0 -0
  353. package/src/components/PhoneField/tests/__snapshots__/phone-field-with-value.snap.png +0 -0
  354. package/src/components/RangeField/tests/__snapshots__/range-field-custom-bg.snap.png +0 -0
  355. package/src/components/RangeField/tests/__snapshots__/range-field-custom-range.snap.png +0 -0
  356. package/src/components/RangeField/tests/__snapshots__/range-field-default.snap.png +0 -0
  357. package/src/components/RangeField/tests/__snapshots__/range-field-step.snap.png +0 -0
  358. package/src/components/RangeField/tests/__snapshots__/range-field-with-label.snap.png +0 -0
  359. package/src/components/RatingPicker/tests/RatingPicker.visual.cy.ts +52 -0
  360. package/src/components/RatingPicker/tests/__snapshots__/rating-picker-emotion.snap.png +0 -0
  361. package/src/components/RatingPicker/tests/__snapshots__/rating-picker-number.snap.png +0 -0
  362. package/src/components/RatingPicker/tests/__snapshots__/rating-picker-readonly.snap.png +0 -0
  363. package/src/components/RatingPicker/tests/__snapshots__/rating-picker-stars.snap.png +0 -0
  364. package/src/components/SearchListField/SearchListField.mdx +1 -1
  365. package/src/components/SearchListField/SearchListField.stories.ts +1 -1
  366. package/src/components/SearchListField/SearchListField.vue +9 -4
  367. package/src/components/SearchListField/tests/SearchListField.spec.ts +127 -0
  368. package/src/components/SearchListField/tests/SearchListField.visual.cy.ts +35 -0
  369. package/src/components/SearchListField/tests/__snapshots__/search-list-field-default.snap.png +0 -0
  370. package/src/components/SearchListField/tests/__snapshots__/search-list-field-with-selection.snap.png +0 -0
  371. package/src/components/SkipLink/tests/SkipLink.visual.cy.ts +16 -0
  372. package/src/components/SkipLink/tests/__snapshots__/skip-link-focused.snap.png +0 -0
  373. package/src/components/SocialMediaLinks/tests/SocialMediaLinks.visual.cy.ts +33 -0
  374. package/src/components/SocialMediaLinks/tests/__snapshots__/social-media-links-default.snap.png +0 -0
  375. package/src/components/SocialMediaLinks/tests/__snapshots__/social-media-links-no-native-heading.snap.png +0 -0
  376. package/src/components/StatusPage/tests/StatusPage.visual.cy.ts +47 -0
  377. package/src/components/StatusPage/tests/__snapshots__/status-page-default.snap.png +0 -0
  378. package/src/components/StatusPage/tests/__snapshots__/status-page-full.snap.png +0 -0
  379. package/src/components/StatusPage/tests/__snapshots__/status-page-no-btn.snap.png +0 -0
  380. package/src/components/SubHeader/tests/SubHeader.visual.cy.ts +48 -0
  381. package/src/components/SubHeader/tests/__snapshots__/sub-header-default.snap.png +0 -0
  382. package/src/components/SubHeader/tests/__snapshots__/sub-header-loading.snap.png +0 -0
  383. package/src/components/SubHeader/tests/__snapshots__/sub-header-no-back-btn.snap.png +0 -0
  384. package/src/components/SubHeader/tests/__snapshots__/sub-header-with-subtitle.snap.png +0 -0
  385. package/src/components/SyAlert/tests/__snapshots__/sy-alert-closable.snap.png +0 -0
  386. package/src/components/SyAlert/tests/__snapshots__/sy-alert-error.snap.png +0 -0
  387. package/src/components/SyAlert/tests/__snapshots__/sy-alert-info.snap.png +0 -0
  388. package/src/components/SyAlert/tests/__snapshots__/sy-alert-success.snap.png +0 -0
  389. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-outlined.snap.png +0 -0
  390. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-tonal.snap.png +0 -0
  391. package/src/components/SyAlert/tests/__snapshots__/sy-alert-warning.snap.png +0 -0
  392. package/src/components/SyHeading/tests/SyHeading.visual.cy.ts +33 -0
  393. package/src/components/SyHeading/tests/__snapshots__/sy-heading-level-1.snap.png +0 -0
  394. package/src/components/SyHeading/tests/__snapshots__/sy-heading-level-2.snap.png +0 -0
  395. package/src/components/SyHeading/tests/__snapshots__/sy-heading-level-3.snap.png +0 -0
  396. package/src/components/SyTextArea/SyTextArea.stories.ts +25 -0
  397. package/src/components/SyTextArea/SyTextArea.vue +7 -0
  398. package/src/components/SyTextArea/composables/useSyTextAreaValidation.ts +1 -1
  399. package/src/components/SyTextArea/tests/SyTextArea.a11y.spec.ts +18 -0
  400. package/src/components/SyTextArea/tests/SyTextArea.spec.ts +135 -1
  401. package/src/components/SyTextArea/tests/SyTextArea.visual.cy.ts +48 -0
  402. package/src/components/SyTextArea/tests/__snapshots__/sy-textarea-default.snap.png +0 -0
  403. package/src/components/SyTextArea/tests/__snapshots__/sy-textarea-filled.snap.png +0 -0
  404. package/src/components/SyTextArea/tests/__snapshots__/sy-textarea-required.snap.png +0 -0
  405. package/src/components/SyTextArea/tests/__snapshots__/sy-textarea-with-value.snap.png +0 -0
  406. package/src/components/SyTextArea/validation/Validation.stories.ts +6 -86
  407. package/src/components/TableToolbar/tests/TableToolbar.visual.cy.ts +49 -0
  408. package/src/components/TableToolbar/tests/__snapshots__/table-toolbar-default.snap.png +0 -0
  409. package/src/components/TableToolbar/tests/__snapshots__/table-toolbar-filtered.snap.png +0 -0
  410. package/src/components/TableToolbar/tests/__snapshots__/table-toolbar-loading.snap.png +0 -0
  411. package/src/components/TableToolbar/tests/__snapshots__/table-toolbar-with-add-btn.snap.png +0 -0
  412. package/src/components/Tables/SyServerTable/SyServerTable.vue +3 -3
  413. package/src/components/Tables/SyServerTable/accessibilite/Accessibility.mdx +114 -7
  414. package/src/components/Tables/SyServerTable/tests/SyServerTable.visual.cy.ts +58 -0
  415. package/src/components/Tables/SyServerTable/tests/__snapshots__/sy-server-table-default.snap.png +0 -0
  416. package/src/components/Tables/SyServerTable/tests/__snapshots__/sy-server-table-loading.snap.png +0 -0
  417. package/src/components/Tables/SyServerTable/tests/__snapshots__/sy-server-table-with-select.snap.png +0 -0
  418. package/src/components/Tables/SyTable/accessibilite/Accessibility.mdx +116 -7
  419. package/src/components/Tables/SyTable/tests/SyTable.visual.cy.ts +70 -0
  420. package/src/components/Tables/SyTable/tests/__snapshots__/sy-table-compact.snap.png +0 -0
  421. package/src/components/Tables/SyTable/tests/__snapshots__/sy-table-default.snap.png +0 -0
  422. package/src/components/Tables/SyTable/tests/__snapshots__/sy-table-striped.snap.png +0 -0
  423. package/src/components/Tables/SyTable/tests/__snapshots__/sy-table-with-select.snap.png +0 -0
  424. package/src/components/Tables/common/tableStyles.scss +4 -4
  425. package/src/components/Tables/common/tests/SyTableFilter.spec.ts +8 -1
  426. package/src/components/Tables/common/tests/filterByRange.spec.ts +23 -22
  427. package/src/components/ToolbarContainer/tests/ToolbarContainer.visual.cy.ts +34 -0
  428. package/src/components/ToolbarContainer/tests/__snapshots__/toolbar-container-default.snap.png +0 -0
  429. package/src/components/ToolbarContainer/tests/__snapshots__/toolbar-container-links.snap.png +0 -0
  430. package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +1 -2
  431. package/src/components/UploadWorkflow/tests/UploadWorkflow.visual.cy.ts +39 -0
  432. package/src/components/UploadWorkflow/tests/__snapshots__/upload-workflow-default.snap.png +0 -0
  433. package/src/components/UploadWorkflow/tests/__snapshots__/upload-workflow-with-title.snap.png +0 -0
  434. package/src/components/UserMenuBtn/tests/UserMenuBtn.visual.cy.ts +42 -0
  435. package/src/components/UserMenuBtn/tests/__snapshots__/user-menu-btn-default.snap.png +0 -0
  436. package/src/components/UserMenuBtn/tests/__snapshots__/user-menu-btn-no-logout.snap.png +0 -0
  437. package/src/components/UserMenuBtn/tests/__snapshots__/user-menu-btn-with-name.snap.png +0 -0
  438. package/src/composables/unifyValidation/documentationValidationProps.ts +1 -1
  439. package/src/composables/unifyValidation/tests/documentationValidationProps.spec.ts +2 -2
  440. package/src/composables/unifyValidation/useValidation.ts +17 -11
  441. package/src/composables/useFilterable/useFilterable.spec.ts +105 -142
  442. package/src/composables/useFilterable/useFilterable.ts +6 -17
  443. package/src/composables/useFormFieldErrorHandling.ts +1 -1
  444. package/src/composables/validation/tests/useFormValidation.spec.ts +11 -2
  445. package/src/composables/validation/tests/useValidatable.spec.ts +16 -6
  446. package/src/composables/validation/tests/useValidation.spec.ts +2 -2
  447. package/src/composables/validation/useValidation.ts +1 -1
  448. package/src/composantsVuetify/VCard/VCard.mdx +8 -0
  449. package/src/composantsVuetify/VCard/v-card.stories.ts +191 -1
  450. package/src/composantsVuetify/VStepper/VStepper.mdx +56 -0
  451. package/src/composantsVuetify/VStepper/v-stepper.stories.ts +563 -0
  452. package/src/designTokens/tokens/amelipro/apLightTheme.ts +1 -0
  453. package/src/designTokens/tokens/amelipro/apSemantic.ts +1 -1
  454. package/src/designTokens/tokens/pa/paLightTheme.ts +1 -0
  455. package/src/stories/Accessibilite/DesignSystem/a11y-status.json +1 -1
  456. package/src/stories/Components/Components.stories.ts +61 -10
  457. package/src/stories/Demarrer/Releases.stories.ts +45 -2
  458. package/src/stories/DesignTokens/Colors.mdx +2 -0
  459. package/src/stories/DesignTokens/colors.stories.ts +13 -0
  460. package/src/stories/EcoConception/EcoBestPracticesDoc.vue +930 -0
  461. package/src/stories/EcoConception/EcoBestPratices.mdx +38 -0
  462. package/src/stories/EcoConception/Introduction.mdx +8 -1
  463. package/src/stories/EcoConception/datas/bonnes_pratiques_essentielles.json +1018 -0
  464. package/src/stories/EcoConception/ecoconception-best-practices.stories.ts +20 -0
  465. package/src/stories/GuideDuDev/Amelipro.mdx +9 -1
  466. package/src/stories/GuideDuDev/Amelipro.stories.ts +955 -168
  467. package/src/stories/GuideDuDev/PortailAgent.stories.ts +0 -1
  468. package/src/utils/functions/deepCopy/index.ts +2 -3
  469. package/dist/components/Customs/SyCheckbox/locales.d.ts +0 -3
  470. package/dist/components/SyHeading/SyHeading.a11y.test.d.ts +0 -1
  471. package/dist/components/SyHeading/SyHeading.test.d.ts +0 -1
  472. package/src/components/Customs/SyCheckbox/locales.ts +0 -3
  473. package/src/components/Customs/SyTextField/types.d.ts +0 -4
@@ -0,0 +1,1164 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3'
2
+ import { ref, watch, onMounted } from 'vue'
3
+ import { VBtn, VForm } from 'vuetify/components'
4
+ import SyTextField from '@/components/Customs/SyTextField/SyTextField.vue'
5
+ import { fn } from '@storybook/test'
6
+ import SyForm from '@/components/Customs/SyForm/SyForm.vue'
7
+ import { getValidationDocumentation } from '@/composables/unifyValidation/documentationValidationProps'
8
+ import type { FieldValidationProps } from '@/composables/unifyValidation/useValidation'
9
+
10
+ const meta = {
11
+ title: 'Composants/Formulaires/SyTextField/Validation',
12
+ component: SyTextField,
13
+ decorators: [
14
+ () => ({
15
+ template: '<div style="padding: 20px;"><story/></div>',
16
+ }),
17
+ ],
18
+ parameters: {
19
+ layout: 'fullscreen',
20
+ docs: {
21
+ description: {
22
+ component: `Exemples de validation pour le composant SyTextField`,
23
+ },
24
+ },
25
+ },
26
+ argTypes: {
27
+ ...getValidationDocumentation('string'),
28
+ modelValue: {
29
+ control: 'text',
30
+ description: 'Valeur du champ texte',
31
+ },
32
+ label: {
33
+ control: 'text',
34
+ description: 'Libellé du champ',
35
+ },
36
+ },
37
+ args: {
38
+ 'modelValue': '',
39
+ 'label': 'Nom',
40
+ 'required': false,
41
+ 'errorMessages': null,
42
+ 'warningMessages': null,
43
+ 'successMessages': null,
44
+ 'readonly': false,
45
+ 'disabled': false,
46
+ 'customRules': [],
47
+ 'customWarningRules': [],
48
+ 'customSuccessRules': [],
49
+ 'isValidateOnBlur': true,
50
+ 'onUpdate:modelValue': fn(),
51
+ },
52
+ } as Meta<typeof SyTextField>
53
+
54
+ export default meta
55
+
56
+ type Story = StoryObj<FieldValidationProps>
57
+
58
+ export const WithError: Story = {
59
+ parameters: {
60
+ a11y: {
61
+ disable: true,
62
+ },
63
+ sourceCode: [
64
+ {
65
+ name: 'Template',
66
+ code: `
67
+ <template>
68
+ <SyTextField
69
+ v-model="value"
70
+ label="Adresse email"
71
+ :custom-rules="customRules"
72
+ />
73
+ </template>
74
+ `,
75
+ },
76
+ {
77
+ name: 'Script',
78
+ code: `
79
+ <script setup lang="ts">
80
+ import { ref } from 'vue'
81
+ import { SyTextField } from '@cnamts/synapse'
82
+
83
+ const value = ref('not-an-email')
84
+
85
+ const customRules = [
86
+ {
87
+ type: 'custom',
88
+ options: {
89
+ validate: (value: string) => {
90
+ const valid = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)
91
+ if (!valid) {
92
+ return false
93
+ }
94
+ return true
95
+ },
96
+ message: 'L\\'adresse email est invalide.',
97
+ fieldIdentifier: 'email',
98
+ },
99
+ },
100
+ ]
101
+ </script>
102
+ `,
103
+ },
104
+ ],
105
+ },
106
+ args: {
107
+ label: 'Adresse email',
108
+ modelValue: 'not-an-email',
109
+ customRules: [
110
+ {
111
+ type: 'custom',
112
+ options: {
113
+ validate: (value: string) => {
114
+ const valid = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)
115
+ if (!valid) {
116
+ return 'L\'adresse email est invalide.'
117
+ }
118
+ return true
119
+ },
120
+ fieldIdentifier: 'email',
121
+ },
122
+ },
123
+ ],
124
+ },
125
+ render: args => ({
126
+ components: { SyTextField },
127
+ setup() {
128
+ const value = ref(args.modelValue)
129
+ const fieldRef = ref<{ validateOnSubmit: () => Promise<boolean> } | null>(null)
130
+ watch(() => args.modelValue, (newValue) => {
131
+ value.value = newValue
132
+ })
133
+ onMounted(() => {
134
+ fieldRef.value?.validateOnSubmit()
135
+ })
136
+ return { args, value, fieldRef }
137
+ },
138
+ template: `
139
+ <div class="pa-4">
140
+ <SyTextField ref="fieldRef" v-bind="args" v-model="value" />
141
+ </div>
142
+ `,
143
+ }),
144
+ }
145
+
146
+ export const WithWarning: Story = {
147
+ parameters: {
148
+ a11y: {
149
+ disable: true,
150
+ },
151
+ sourceCode: [
152
+ {
153
+ name: 'Template',
154
+ code: `
155
+ <template>
156
+ <SyTextField
157
+ v-model="value"
158
+ label="Nom d'utilisateur"
159
+ :custom-warning-rules="customWarningRules"
160
+ />
161
+ </template>
162
+ `,
163
+ },
164
+ {
165
+ name: 'Script',
166
+ code: `
167
+ <script setup lang="ts">
168
+ import { ref } from 'vue'
169
+ import { SyTextField } from '@cnamts/synapse'
170
+
171
+ const value = ref('ab')
172
+
173
+ const customWarningRules = [
174
+ {
175
+ type: 'custom',
176
+ options: {
177
+ validate: (value: string) => value.length >= 3,
178
+ warningMessage: 'Le nom d\\'utilisateur est très court (moins de 3 caractères).',
179
+ fieldIdentifier: 'username',
180
+ },
181
+ },
182
+ ]
183
+ </script>
184
+ `,
185
+ },
186
+ ],
187
+ },
188
+ args: {
189
+ label: 'Nom d\'utilisateur',
190
+ modelValue: 'ab',
191
+ customWarningRules: [
192
+ {
193
+ type: 'custom',
194
+ options: {
195
+ validate: (value: string) => value.length >= 3,
196
+ warningMessage: 'Le nom d\'utilisateur est très court (moins de 3 caractères).',
197
+ fieldIdentifier: 'username',
198
+ },
199
+ },
200
+ ],
201
+ },
202
+ render: args => ({
203
+ components: { SyTextField },
204
+ setup() {
205
+ const value = ref(args.modelValue)
206
+ const fieldRef = ref<{ validateOnSubmit: () => Promise<boolean> } | null>(null)
207
+ watch(() => args.modelValue, (newValue) => {
208
+ value.value = newValue
209
+ })
210
+ onMounted(() => {
211
+ fieldRef.value?.validateOnSubmit()
212
+ })
213
+ return { args, value, fieldRef }
214
+ },
215
+ template: `
216
+ <div class="pa-4">
217
+ <SyTextField ref="fieldRef" v-bind="args" v-model="value" />
218
+ </div>
219
+ `,
220
+ }),
221
+ }
222
+
223
+ export const WithSuccess: Story = {
224
+ parameters: {
225
+ a11y: {
226
+ disable: true,
227
+ },
228
+ sourceCode: [
229
+ {
230
+ name: 'Template',
231
+ code: `
232
+ <template>
233
+ <SyTextField
234
+ v-model="value"
235
+ label="Adresse email"
236
+ :custom-success-rules="customSuccessRules"
237
+ />
238
+ </template>
239
+ `,
240
+ },
241
+ {
242
+ name: 'Script',
243
+ code: `
244
+ <script setup lang="ts">
245
+ import { ref } from 'vue'
246
+ import { SyTextField } from '@cnamts/synapse'
247
+
248
+ const value = ref('exemple@domaine.fr')
249
+
250
+ const customSuccessRules = [
251
+ {
252
+ type: 'custom',
253
+ options: {
254
+ validate: (value: string) => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value),
255
+ successMessage: 'L\\'adresse email est valide.',
256
+ fieldIdentifier: 'email',
257
+ },
258
+ },
259
+ ]
260
+ </script>
261
+ `,
262
+ },
263
+ ],
264
+ },
265
+ args: {
266
+ label: 'Adresse email',
267
+ modelValue: 'exemple@domaine.fr',
268
+ showSuccessMessages: true,
269
+ customSuccessRules: [
270
+ {
271
+ type: 'custom',
272
+ options: {
273
+ validate: (value: string) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value),
274
+ successMessage: 'L\'adresse email est valide.',
275
+ fieldIdentifier: 'email',
276
+ },
277
+ },
278
+ ],
279
+ },
280
+ render: args => ({
281
+ components: { SyTextField },
282
+ setup() {
283
+ const value = ref(args.modelValue)
284
+ const fieldRef = ref<{ validateOnSubmit: () => Promise<boolean> } | null>(null)
285
+ watch(() => args.modelValue, (newValue) => {
286
+ value.value = newValue
287
+ })
288
+ onMounted(() => {
289
+ fieldRef.value?.validateOnSubmit()
290
+ })
291
+ return { args, value, fieldRef }
292
+ },
293
+ template: `
294
+ <div class="pa-4">
295
+ <SyTextField ref="fieldRef" v-bind="args" v-model="value" />
296
+ </div>
297
+ `,
298
+ }),
299
+ }
300
+
301
+ export const WithCustomRules: Story = {
302
+ parameters: {
303
+ a11y: {
304
+ disable: true,
305
+ },
306
+ sourceCode: [
307
+ {
308
+ name: 'Template',
309
+ code: `
310
+ <template>
311
+ <SyTextField
312
+ v-model="value"
313
+ label="Mot de passe"
314
+ type="password"
315
+ required
316
+ :custom-rules="customRules"
317
+ />
318
+ </template>
319
+ `,
320
+ },
321
+ {
322
+ name: 'Script',
323
+ code: `
324
+ <script setup lang="ts">
325
+ import { ref } from 'vue'
326
+ import { SyTextField } from '@cnamts/synapse'
327
+
328
+ const value = ref('')
329
+
330
+ const customRules = [
331
+ {
332
+ type: 'custom',
333
+ options: {
334
+ validate: (value: string) => {
335
+ if (value.length < 8) return false
336
+ return true
337
+ },
338
+ message: 'Le mot de passe doit contenir au moins 8 caractères.',
339
+ fieldIdentifier: 'password',
340
+ },
341
+ },
342
+ {
343
+ type: 'custom',
344
+ options: {
345
+ validate: (value: string) => {
346
+ if (!/[A-Z]/.test(value)) return false
347
+ return true
348
+ },
349
+ message: 'Le mot de passe doit contenir au moins une majuscule.',
350
+ fieldIdentifier: 'password',
351
+ },
352
+ },
353
+ ]
354
+ </script>
355
+ `,
356
+ },
357
+ ],
358
+ },
359
+ render: args => ({
360
+ components: { SyTextField },
361
+ setup() {
362
+ const value = ref(args.modelValue)
363
+ watch(() => args.modelValue, (newValue) => {
364
+ value.value = newValue
365
+ })
366
+
367
+ const customRules = [
368
+ {
369
+ type: 'custom',
370
+ options: {
371
+ validate: (value: string) => {
372
+ if (value.length < 8) return false
373
+ return true
374
+ },
375
+ message: 'Le mot de passe doit contenir au moins 8 caractères.',
376
+ fieldIdentifier: 'password',
377
+ },
378
+ },
379
+ {
380
+ type: 'custom',
381
+ options: {
382
+ validate: (value: string) => {
383
+ if (!/[A-Z]/.test(value)) return false
384
+ return true
385
+ },
386
+ message: 'Le mot de passe doit contenir au moins une majuscule.',
387
+ fieldIdentifier: 'password',
388
+ },
389
+ },
390
+ ]
391
+
392
+ return { args, value, customRules }
393
+ },
394
+ template: `
395
+ <SyTextField
396
+ v-bind="args"
397
+ v-model="value"
398
+ label="Mot de passe"
399
+ type="password"
400
+ required
401
+ :custom-rules="customRules"
402
+ width="400px"
403
+ />
404
+ `,
405
+ }),
406
+ }
407
+
408
+ export const DisableErrorHandling: Story = {
409
+ parameters: {
410
+ a11y: {
411
+ disable: true,
412
+ },
413
+ docs: {
414
+ description: {
415
+ story: `
416
+ ### Désactivation de la gestion des erreurs
417
+
418
+ Cette story illustre l'utilisation de la propriété \`disableErrorHandling\` qui permet de désactiver complètement
419
+ la gestion et l'affichage des erreurs dans un champ, même si des règles de validation sont définies.
420
+ `,
421
+ },
422
+ },
423
+ sourceCode: [
424
+ {
425
+ name: 'Template',
426
+ code: `<template>
427
+ <!-- Champ avec validation normale -->
428
+ <SyTextField
429
+ v-model="value1"
430
+ label="Avec validation"
431
+ required
432
+ :custom-rules="customRules"
433
+ />
434
+
435
+ <!-- Champ avec gestion d'erreurs désactivée -->
436
+ <SyTextField
437
+ v-model="value2"
438
+ label="Sans gestion d'erreurs"
439
+ required
440
+ disable-error-handling
441
+ :custom-rules="customRules"
442
+ />
443
+ </template>`,
444
+ },
445
+ ],
446
+ },
447
+ render: () => ({
448
+ components: { SyTextField },
449
+ setup() {
450
+ const value1 = ref('')
451
+ const value2 = ref('')
452
+
453
+ const customRules = [
454
+ {
455
+ type: 'custom',
456
+ options: {
457
+ validate: (value: string) => {
458
+ if (!value || value.trim().length === 0) {
459
+ return false
460
+ }
461
+ return true
462
+ },
463
+ message: 'Ce champ est requis.',
464
+ fieldIdentifier: 'field',
465
+ },
466
+ },
467
+ ]
468
+
469
+ return { value1, value2, customRules }
470
+ },
471
+ template: `
472
+ <div>
473
+ <p class="mb-4">Cette démonstration compare un SyTextField standard et un avec <code>disableErrorHandling=true</code>.</p>
474
+
475
+ <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 24px; margin-bottom: 16px;">
476
+ <div>
477
+ <p class="text-subtitle-2 mb-2">Validation normale</p>
478
+ <SyTextField
479
+ v-model="value1"
480
+ label="Nom"
481
+ required
482
+ :custom-rules="customRules"
483
+ />
484
+ </div>
485
+
486
+ <div>
487
+ <p class="text-subtitle-2 mb-2">Sans gestion d'erreurs</p>
488
+ <SyTextField
489
+ v-model="value2"
490
+ label="Nom"
491
+ required
492
+ disable-error-handling
493
+ :custom-rules="customRules"
494
+ />
495
+ </div>
496
+ </div>
497
+
498
+ <div class="mt-4 text-body-2">
499
+ <p>Instructions :</p>
500
+ <ol>
501
+ <li class="ml-4">Cliquez dans un champ puis en dehors pour déclencher la validation</li>
502
+ <li class="ml-4">Le champ de gauche affichera une erreur requise, mais pas celui de droite</li>
503
+ </ol>
504
+ </div>
505
+ </div>
506
+ `,
507
+ }),
508
+ }
509
+
510
+ /**
511
+ * Validation déclenchée à chaque frappe (isValidateOnBlur: false).
512
+ */
513
+ export const ValidateOnInput: Story = {
514
+ parameters: {
515
+ docs: {
516
+ description: {
517
+ story: `
518
+ ### Validation à la saisie
519
+
520
+ Lorsque \`isValidateOnBlur\` vaut \`false\`, la validation se déclenche à chaque modification
521
+ de la valeur plutôt qu'à la perte de focus. Utile pour un retour immédiat à l'utilisateur.
522
+ `,
523
+ },
524
+ },
525
+ sourceCode: [
526
+ {
527
+ name: 'Template',
528
+ code: `<template>
529
+ <SyTextField
530
+ v-model="value"
531
+ label="Adresse email"
532
+ required
533
+ :is-validate-on-blur="false"
534
+ :custom-rules="[
535
+ {
536
+ type: 'custom',
537
+ options: {
538
+ message: 'L\\'adresse email est invalide.',
539
+ validate: (value) => /^[^\\\\s@]+@[^\\\\s@]+\\\\.[^\\\\s@]+$/.test(value),
540
+ },
541
+ },
542
+ ]"
543
+ show-success-messages
544
+ />
545
+ </template>`,
546
+ },
547
+ {
548
+ name: 'Script',
549
+ code: `<script setup lang="ts">
550
+ import { ref } from 'vue'
551
+ import { SyTextField } from '@cnamts/synapse'
552
+
553
+ const value = ref('')
554
+ </script>`,
555
+ },
556
+ ],
557
+ },
558
+ render: args => ({
559
+ components: { SyTextField },
560
+ setup() {
561
+ const value = ref(args.modelValue)
562
+ watch(() => args.modelValue, (newValue) => {
563
+ value.value = newValue
564
+ })
565
+ return { args, value }
566
+ },
567
+ template: `
568
+ <div>
569
+ <p class="mb-4">La validation se déclenche à chaque frappe (<code>isValidateOnBlur="false"</code>).</p>
570
+ <SyTextField
571
+ v-model="value"
572
+ label="Adresse email"
573
+ required
574
+ :is-validate-on-blur="false"
575
+ :custom-rules="[
576
+ {
577
+ type: 'custom',
578
+ options: {
579
+ message: 'L\\'adresse email est invalide.',
580
+ validate: (value) => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value),
581
+ },
582
+ },
583
+ ]"
584
+ show-success-messages
585
+ width="400px"
586
+ />
587
+ </div>
588
+ `,
589
+ }),
590
+ }
591
+
592
+ /**
593
+ * Messages de validation injectés directement par le parent (errorMessages, warningMessages, successMessages).
594
+ */
595
+ export const ExternalMessages: Story = {
596
+ parameters: {
597
+ docs: {
598
+ description: {
599
+ story: `
600
+ ### Messages externes
601
+
602
+ Les props \`errorMessages\`, \`warningMessages\` et \`successMessages\` permettent d'injecter
603
+ des messages depuis le parent sans déclencher de règle de validation.
604
+ `,
605
+ },
606
+ },
607
+ sourceCode: [
608
+ {
609
+ name: 'Template',
610
+ code: `<template>
611
+ <SyTextField
612
+ v-model="value"
613
+ label="Nom"
614
+ :show-success-messages="true"
615
+ :error-messages="errorMessages"
616
+ :warning-messages="warningMessages"
617
+ :success-messages="successMessages"
618
+ />
619
+ <div class="mt-4">
620
+ <VBtn @click="setError">Simuler une erreur</VBtn>
621
+ <VBtn @click="setWarning" class="ml-2">Simuler un avertissement</VBtn>
622
+ <VBtn @click="setSuccess" class="ml-2">Simuler un succès</VBtn>
623
+ <VBtn @click="reset" class="ml-2">Réinitialiser</VBtn>
624
+ </div>
625
+ </template>`,
626
+ },
627
+ {
628
+ name: 'Script',
629
+ code: `<script setup lang="ts">
630
+ import { ref } from 'vue'
631
+ import { SyTextField } from '@cnamts/synapse'
632
+
633
+ const value = ref('')
634
+ const errorMessages = ref<string[] | null>(null)
635
+ const warningMessages = ref<string[] | null>(null)
636
+ const successMessages = ref<string[] | null>(null)
637
+
638
+ function setError() {
639
+ errorMessages.value = ['Ce nom est déjà utilisé']
640
+ warningMessages.value = null
641
+ successMessages.value = null
642
+ }
643
+ function setWarning() {
644
+ errorMessages.value = null
645
+ warningMessages.value = ['Ce nom ressemble à un nom générique']
646
+ successMessages.value = null
647
+ }
648
+ function setSuccess() {
649
+ errorMessages.value = null
650
+ warningMessages.value = null
651
+ successMessages.value = ['Nom accepté par le serveur']
652
+ }
653
+ function reset() {
654
+ errorMessages.value = null
655
+ warningMessages.value = null
656
+ successMessages.value = null
657
+ }
658
+ </script>`,
659
+ },
660
+ ],
661
+ },
662
+ args: {
663
+ showSuccessMessages: true,
664
+ },
665
+ render: args => ({
666
+ components: { SyTextField, VBtn },
667
+ setup() {
668
+ const value = ref(args.modelValue)
669
+ watch(() => args.modelValue, (newValue) => {
670
+ value.value = newValue
671
+ })
672
+ const errorMessages = ref<string[] | null>(null)
673
+ const warningMessages = ref<string[] | null>(null)
674
+ const successMessages = ref<string[] | null>(null)
675
+
676
+ function setError() {
677
+ errorMessages.value = ['Ce nom est déjà utilisé']
678
+ warningMessages.value = null
679
+ successMessages.value = null
680
+ }
681
+ function setWarning() {
682
+ errorMessages.value = null
683
+ warningMessages.value = ['Ce nom ressemble à un nom générique']
684
+ successMessages.value = null
685
+ }
686
+ function setSuccess() {
687
+ errorMessages.value = null
688
+ warningMessages.value = null
689
+ successMessages.value = ['Nom accepté par le serveur']
690
+ }
691
+ function reset() {
692
+ errorMessages.value = null
693
+ warningMessages.value = null
694
+ successMessages.value = null
695
+ }
696
+
697
+ return { args, value, errorMessages, warningMessages, successMessages, setError, setWarning, setSuccess, reset }
698
+ },
699
+ template: `
700
+ <div>
701
+ <p class="mb-4">
702
+ Les messages ci-dessous sont injectés par le parent sans déclencher de règle de validation.
703
+ </p>
704
+ <SyTextField
705
+ v-model="value"
706
+ label="Nom"
707
+ :show-success-messages="true"
708
+ :error-messages="errorMessages"
709
+ :warning-messages="warningMessages"
710
+ :success-messages="successMessages"
711
+ width="400px"
712
+ />
713
+ <div class="mt-4 d-flex flex-wrap ga-2 pa-2">
714
+ <VBtn color="error" @click="setError">Simuler une erreur</VBtn>
715
+ <VBtn color="warning" @click="setWarning">Simuler un avertissement</VBtn>
716
+ <VBtn color="success" @click="setSuccess">Simuler un succès</VBtn>
717
+ <VBtn color="black" @click="reset">Réinitialiser</VBtn>
718
+ </div>
719
+ </div>
720
+ `,
721
+ }),
722
+ }
723
+
724
+ export const VFormVuetifyValidation: Story = {
725
+ parameters: {
726
+ docs: {
727
+ description: {
728
+ story: `
729
+ ### Validation de style Vuetify
730
+
731
+ En passant \`useVuetifyValidation="true"\`, le composant délègue la validation à Vuetify.
732
+ Les règles sont de simples fonctions qui retournent \`true\` si la valeur est valide,
733
+ ou un message d'erreur (chaîne de caractères) sinon — exactement comme avec la prop \`rules\`
734
+ native de Vuetify.
735
+ `,
736
+ },
737
+ },
738
+ sourceCode: [
739
+ {
740
+ name: 'Template',
741
+ code: `<template>
742
+ <VForm @submit.prevent="handleSubmit">
743
+ <SyTextField
744
+ v-model="value"
745
+ label="Adresse email"
746
+ :use-vuetify-validation="true"
747
+ :rules="rules"
748
+ required
749
+ :is-validate-on-blur="true"
750
+ />
751
+ <div class="mt-4">
752
+ <VBtn type="submit" color="primary">Valider</VBtn>
753
+ </div>
754
+ </VForm>
755
+ </template>`,
756
+ },
757
+ {
758
+ name: 'Script',
759
+ code: `<script setup lang="ts">
760
+ import { ref } from 'vue'
761
+ import { SyTextField } from '@cnamts/synapse'
762
+
763
+ const value = ref('')
764
+
765
+ const rules = [
766
+ (value: string) => !!value || 'Ce champ est requis',
767
+ (value: string) => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value) || 'L\\'adresse email est invalide',
768
+ ]
769
+
770
+ async function handleSubmit(e) {
771
+ alert((await e).valid ? 'Valeur valide !' : 'Veuillez corriger les erreurs.')
772
+ }
773
+ </script>`,
774
+ },
775
+ ],
776
+ },
777
+ render: args => ({
778
+ components: { SyTextField, VBtn, VForm },
779
+ setup() {
780
+ const value = ref(args.modelValue)
781
+ watch(() => args.modelValue, (newValue) => {
782
+ value.value = newValue
783
+ })
784
+
785
+ const rules = [
786
+ (value: string) => !!value || 'Ce champ est requis',
787
+ (value: string) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value) || 'L\'adresse email est invalide',
788
+ ]
789
+
790
+ async function handleSubmit(e: Promise<{ valid: boolean }>) {
791
+ const result = await e
792
+ alert(result.valid ? 'Valeur valide !' : 'Veuillez corriger les erreurs.')
793
+ }
794
+
795
+ return { args, value, rules, handleSubmit }
796
+ },
797
+ template: `
798
+ <div>
799
+ <p class="mb-4">
800
+ Les règles sont des fonctions Vuetify natives <code>(value) => true | 'message'</code>.
801
+ Cliquez sur <strong>Valider</strong> ou quittez le champ pour déclencher la validation.
802
+ </p>
803
+ <VForm @submit.prevent="handleSubmit">
804
+ <SyTextField
805
+ v-model="value"
806
+ label="Adresse email"
807
+ :use-vuetify-validation="true"
808
+ :rules="rules"
809
+ :is-validate-on-blur="true"
810
+ width="400px"
811
+ />
812
+ <div class="mt-4">
813
+ <VBtn type="submit" color="primary">Valider</VBtn>
814
+ </div>
815
+ </VForm>
816
+ </div>
817
+ `,
818
+ }),
819
+ }
820
+
821
+ export const SyFormValidation: Story = {
822
+ parameters: {
823
+ sourceCode: [
824
+ {
825
+ name: 'Template',
826
+ code: `<template>
827
+ <SyForm @submit="handleSubmit">
828
+ <SyTextField
829
+ v-model="value"
830
+ label="Adresse email"
831
+ :custom-rules="customRules"
832
+ required
833
+ />
834
+ <div class="mt-4">
835
+ <VBtn type="submit" color="primary">Valider</VBtn>
836
+ </div>
837
+ </SyForm>
838
+ </template>`,
839
+ },
840
+ {
841
+ name: 'Script',
842
+ code: `<script setup lang="ts">
843
+ import { ref } from 'vue'
844
+ import { SyTextField, SyForm } from '@cnamts/synapse'
845
+
846
+ const value = ref('')
847
+
848
+ const customRules = [
849
+ {
850
+ type: 'custom',
851
+ options: {
852
+ validate: (value: string) => {
853
+ if (!value || !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) {
854
+ return false
855
+ }
856
+ return true
857
+ },
858
+ message: 'L\\'adresse email est invalide.',
859
+ fieldIdentifier: 'email',
860
+ },
861
+ },
862
+ ]
863
+
864
+ function handleSubmit(e) {
865
+ const isValid = e.isValid
866
+ alert(isValid ? 'Valeur valide !' : 'Veuillez corriger les erreurs.')
867
+ }
868
+ </script>`,
869
+ },
870
+ ],
871
+ },
872
+ render: args => ({
873
+ components: { SyTextField, VBtn, SyForm },
874
+ setup() {
875
+ const value = ref(args.modelValue)
876
+ watch(() => args.modelValue, (newValue) => {
877
+ value.value = newValue
878
+ })
879
+
880
+ const customRules = [
881
+ {
882
+ type: 'custom',
883
+ options: {
884
+ validate: (value: string) => {
885
+ if (!value || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)) {
886
+ return false
887
+ }
888
+ return true
889
+ },
890
+ message: 'L\'adresse email est invalide.',
891
+ fieldIdentifier: 'email',
892
+ },
893
+ },
894
+ ]
895
+
896
+ function handleSubmit(e: { isValid: boolean }) {
897
+ const isValid = e.isValid
898
+ alert(isValid ? 'Valeur valide !' : 'Veuillez corriger les erreurs.')
899
+ }
900
+
901
+ return { args, value, customRules, handleSubmit }
902
+ },
903
+ template: `
904
+ <div>
905
+ <SyForm @submit="handleSubmit">
906
+ <SyTextField
907
+ v-bind="args"
908
+ v-model="value"
909
+ label="Adresse email"
910
+ :custom-rules="customRules"
911
+ width="400px"
912
+ required
913
+ />
914
+ <div class="mt-4">
915
+ <VBtn type="submit" color="primary">Valider</VBtn>
916
+ </div>
917
+ </SyForm>
918
+ </div>
919
+ `,
920
+ }),
921
+ }
922
+
923
+ export const SyFormVuetifyValidation: Story = {
924
+ parameters: {
925
+ sourceCode: [
926
+ {
927
+ name: 'Template',
928
+ code: `<template>
929
+ <SyForm @submit="handleSubmit">
930
+ <SyTextField
931
+ v-model="value"
932
+ label="Adresse email"
933
+ :use-vuetify-validation="true"
934
+ :rules="vuetifyRules"
935
+ />
936
+ <div class="mt-4">
937
+ <VBtn type="submit" color="primary">Valider</VBtn>
938
+ </div>
939
+ </SyForm>
940
+ </template>`,
941
+ },
942
+ {
943
+ name: 'Script',
944
+ code: `<script setup lang="ts">
945
+ import { ref } from 'vue'
946
+ import { SyTextField, SyForm } from '@cnamts/synapse'
947
+
948
+ const value = ref('')
949
+
950
+ const vuetifyRules = [
951
+ (value: string) => !!value || 'Ce champ est requis',
952
+ (value: string) => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value) || 'L\\'adresse email est invalide',
953
+ ]
954
+
955
+ function handleSubmit(e) {
956
+ const isValid = e.isValid
957
+ alert(isValid ? 'Valeur valide !' : 'Veuillez corriger les erreurs.')
958
+ }
959
+ </script>`,
960
+ },
961
+ ],
962
+ },
963
+ render: args => ({
964
+ components: { SyTextField, VBtn, SyForm },
965
+ setup() {
966
+ const value = ref(args.modelValue)
967
+ watch(() => args.modelValue, (newValue) => {
968
+ value.value = newValue
969
+ })
970
+
971
+ const vuetifyRules = [
972
+ (value: string) => !!value || 'Ce champ est requis',
973
+ (value: string) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value) || 'L\'adresse email est invalide',
974
+ ]
975
+
976
+ function handleSubmit(e: { isValid: boolean }) {
977
+ const isValid = e.isValid
978
+ alert(isValid ? 'Valeur valide !' : 'Veuillez corriger les erreurs.')
979
+ }
980
+
981
+ return { args, value, vuetifyRules, handleSubmit }
982
+ },
983
+ template: `
984
+ <div>
985
+ <SyForm @submit="handleSubmit">
986
+ <SyTextField
987
+ v-bind="args"
988
+ v-model="value"
989
+ label="Adresse email"
990
+ :use-vuetify-validation="true"
991
+ :rules="vuetifyRules"
992
+ width="400px"
993
+ />
994
+ <div class="mt-4">
995
+ <VBtn type="submit" color="primary">Valider</VBtn>
996
+ </div>
997
+ </SyForm>
998
+ </div>
999
+ `,
1000
+ }),
1001
+ }
1002
+
1003
+ export const VFormValidation: Story = {
1004
+ parameters: {
1005
+ sourceCode: [
1006
+ {
1007
+ name: 'Template',
1008
+ code: `<template>
1009
+ <VForm @submit.prevent="handleSubmit">
1010
+ <SyTextField
1011
+ ref="textFieldRef"
1012
+ v-model="value"
1013
+ label="Adresse email"
1014
+ :custom-rules="[
1015
+ {
1016
+ type: 'custom',
1017
+ options: {
1018
+ validate: (value) => !!value && /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value),
1019
+ message: 'L\\'adresse email est invalide.',
1020
+ fieldIdentifier: 'email',
1021
+ },
1022
+ },
1023
+ ]"
1024
+ required
1025
+ />
1026
+ <VBtn type="submit" color="primary" class="mt-4">Valider</VBtn>
1027
+ </VForm>
1028
+ </template>`,
1029
+ },
1030
+ {
1031
+ name: 'Script',
1032
+ code: `<script setup lang="ts">
1033
+ import { ref } from 'vue'
1034
+ import { SyTextField } from '@cnamts/synapse'
1035
+ import { VBtn, VForm } from 'vuetify/components'
1036
+
1037
+ const value = ref('')
1038
+ const textFieldRef = ref()
1039
+
1040
+ async function handleSubmit() {
1041
+ if (textFieldRef.value) {
1042
+ const result = await textFieldRef.value.validateOnSubmit()
1043
+ alert(result ? 'Valeur valide !' : 'Veuillez corriger les erreurs.')
1044
+ }
1045
+ }
1046
+ </script>`,
1047
+ },
1048
+ ],
1049
+ },
1050
+ render: args => ({
1051
+ components: { SyTextField, VBtn, VForm },
1052
+ setup() {
1053
+ const value = ref(args.modelValue)
1054
+ watch(() => args.modelValue, (newValue) => {
1055
+ value.value = newValue
1056
+ })
1057
+ const textFieldRef = ref()
1058
+
1059
+ async function handleSubmit() {
1060
+ if (textFieldRef.value) {
1061
+ const result = await textFieldRef.value.validateOnSubmit()
1062
+ alert(result ? 'Valeur valide !' : 'Veuillez corriger les erreurs.')
1063
+ }
1064
+ }
1065
+
1066
+ return { args, value, textFieldRef, handleSubmit }
1067
+ },
1068
+ template: `
1069
+ <div>
1070
+ <p>Il faut privilégier l'utilisation de <code>SyForm</code> pour bénéficier de intégration.</p>
1071
+ <VForm @submit.prevent="handleSubmit">
1072
+ <SyTextField
1073
+ v-bind="args"
1074
+ ref="textFieldRef"
1075
+ v-model="value"
1076
+ label="Adresse email"
1077
+ :custom-rules="[
1078
+ {
1079
+ type: 'custom',
1080
+ options: {
1081
+ validate: (value) => !!value && /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value),
1082
+ message: 'L\\'adresse email est invalide.',
1083
+ fieldIdentifier: 'email',
1084
+ },
1085
+ },
1086
+ ]"
1087
+ required
1088
+ width="400px"
1089
+ />
1090
+ <VBtn type="submit" color="primary" class="mt-4">Valider</VBtn>
1091
+ </VForm>
1092
+ </div>
1093
+ `,
1094
+ }),
1095
+ }
1096
+
1097
+ export const EmailValidation: Story = {
1098
+ parameters: {
1099
+ docs: {
1100
+ description: {
1101
+ story: `
1102
+ ### Validation d'email
1103
+
1104
+ Cette story montre un cas d'usage courant : la validation d'une adresse email. Le champ :
1105
+ - Est requis
1106
+ - Vérifie le format de l'email
1107
+ - Affiche un message de succès quand l'email est valide
1108
+ `,
1109
+ },
1110
+ },
1111
+ sourceCode: [
1112
+ {
1113
+ name: 'Template',
1114
+ code: `<SyTextField
1115
+ v-model="value"
1116
+ autocomplete="email"
1117
+ label="Email"
1118
+ helpText="Format attendu : nom@domaine.fr"
1119
+ required
1120
+ :customRules="[
1121
+ {
1122
+ type: 'email',
1123
+ options: {
1124
+ message: 'L\\'email n\\'est pas valide',
1125
+ successMessage: 'L\\'email est valide'
1126
+ }
1127
+ }
1128
+ ]"
1129
+ showSuccessMessages
1130
+ />`,
1131
+ },
1132
+ ],
1133
+ },
1134
+ render: args => ({
1135
+ components: { SyTextField },
1136
+ setup() {
1137
+ const value = ref(args.modelValue)
1138
+ watch(() => args.modelValue, (newValue) => {
1139
+ value.value = newValue
1140
+ })
1141
+ return { args, value }
1142
+ },
1143
+ template: `
1144
+ <SyTextField
1145
+ v-bind="args"
1146
+ v-model="value"
1147
+ label="Email"
1148
+ helpText="Format attendu : nom@domaine.fr"
1149
+ autocomplete="email"
1150
+ required
1151
+ :customRules="[
1152
+ {
1153
+ type: 'email',
1154
+ options: {
1155
+ message: 'L\\'email n\\'est pas valide',
1156
+ successMessage: 'L\\'email est valide'
1157
+ }
1158
+ }
1159
+ ]"
1160
+ showSuccessMessages
1161
+ />
1162
+ `,
1163
+ }),
1164
+ }