@cnamts/synapse 1.0.25 → 1.0.27

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 (393) hide show
  1. package/dist/{AutocompleteFilter-D7qBuCAP.js → AutocompleteFilter-C9eLKyW8.js} +3 -3
  2. package/dist/{DateFilter-BitMWrMU.js → DateFilter-y-GLkAkn.js} +9 -9
  3. package/dist/{NumberFilter-BTLUxw0a.js → NumberFilter-DN6hIBS7.js} +1 -1
  4. package/dist/{PeriodFilter-B5rUIPAC.js → PeriodFilter-MoUUp9qS.js} +1 -1
  5. package/dist/{SelectFilter-l4QnRcuk.js → SelectFilter-bCbrdLmu.js} +1 -1
  6. package/dist/{TextFilter-C9hj6Qrp.js → TextFilter-CvjgEaoM.js} +4 -4
  7. package/dist/apLightTheme2026-ug4Y23ns.js +611 -0
  8. package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +2369 -351
  9. package/dist/components/Customs/Selects/SyAutocomplete/composables/useSyAutocompleteValidation.d.ts +18 -0
  10. package/dist/components/Customs/Selects/SyAutocomplete/utils/ariaManager.d.ts +1 -1
  11. package/dist/components/Customs/Selects/SyAutocomplete/utils/useKeyboardHandler.d.ts +3 -1
  12. package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +58 -288
  13. package/dist/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.d.ts +1 -0
  14. package/dist/components/Customs/Selects/SySelect/composables/useSySelectValidation.d.ts +15 -0
  15. package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +4 -3
  16. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +4 -3
  17. package/dist/components/Customs/SyIconButton/SyIconButton.d.ts +18 -0
  18. package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +20 -37
  19. package/dist/components/Customs/SyRadioGroup/composables/useSyRadioGroupValidation.d.ts +50 -0
  20. package/dist/components/Customs/SyTextField/SyTextField.d.ts +8 -10
  21. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +197 -185
  22. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +91 -82
  23. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +35 -32
  24. package/dist/components/DatePicker/composables/index.d.ts +1 -0
  25. package/dist/components/DatePicker/composables/useDatePickerState.d.ts +3 -3
  26. package/dist/components/DatePicker/composables/useDatePickerValidationBridge.d.ts +51 -0
  27. package/dist/components/DatePicker/composables/useDateTextField.d.ts +2 -2
  28. package/dist/components/DatePicker/composables/useInputBlurHandler.d.ts +2 -2
  29. package/dist/components/DatePicker/types.d.ts +1 -2
  30. package/dist/components/LunarCalendar/useLunarCalendarValidation.d.ts +1 -0
  31. package/dist/components/MonthPicker/MonthPicker.d.ts +24 -24
  32. package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +24 -24
  33. package/dist/components/NirField/NirField.d.ts +64 -60
  34. package/dist/components/NirField/useNirValidation.d.ts +6 -2
  35. package/dist/components/PasswordField/PasswordField.d.ts +3 -3
  36. package/dist/components/PeriodField/PeriodField.d.ts +338 -314
  37. package/dist/components/PhoneField/PhoneField.d.ts +34 -24
  38. package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +0 -3
  39. package/dist/components/RatingPicker/EmotionPicker/EmotionPicker.d.ts +3 -1
  40. package/dist/components/RatingPicker/NumberPicker/NumberPicker.d.ts +4 -3
  41. package/dist/components/RatingPicker/RatingPicker.d.ts +18 -5
  42. package/dist/components/RatingPicker/StarsPicker/StarsPicker.d.ts +3 -1
  43. package/dist/components/RatingPicker/useRatingFocus.d.ts +18 -0
  44. package/dist/components/SyTextArea/SyTextArea.d.ts +25 -15
  45. package/dist/components/SyTextArea/composables/useSyTextAreaValidation.d.ts +20 -0
  46. package/dist/components/SyTextArea/locales.d.ts +1 -0
  47. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +5 -4
  48. package/dist/components/Tables/SyTable/SyTable.d.ts +5 -4
  49. package/dist/components/Tables/common/SyTablePagination.d.ts +152 -364
  50. package/dist/components/Tables/common/TableHeader.d.ts +1 -1
  51. package/dist/components/Tables/common/filters/DateFilter.d.ts +4 -4
  52. package/dist/components/Tables/common/types.d.ts +2 -0
  53. package/dist/components/index.d.ts +1 -0
  54. package/dist/composables/date/useDateInitializationDayjs.d.ts +3 -1
  55. package/dist/composables/unifyValidation/documentationValidationProps.d.ts +160 -160
  56. package/dist/composables/unifyValidation/useCustomValidation.d.ts +3 -1
  57. package/dist/composables/unifyValidation/useValidation.d.ts +27 -19
  58. package/dist/composables/unifyValidation/useVuetifyValidation.d.ts +1 -1
  59. package/dist/composables/validation/useValidation.d.ts +1 -0
  60. package/dist/design-system-v3.js +81 -80
  61. package/dist/designTokens/tokens/amelipro/apContextual.d.ts +6 -6
  62. package/dist/designTokens/tokens/amelipro/apDarkTheme.d.ts +3 -1
  63. package/dist/designTokens/tokens/amelipro/apLightTheme.d.ts +53 -98
  64. package/dist/designTokens/tokens/baseContextualTokens.d.ts +0 -6
  65. package/dist/designTokens/tokens/baseTokens.d.ts +232 -0
  66. package/dist/designTokens/tokens/cnam/cnamContextual.d.ts +6 -6
  67. package/dist/designTokens/tokens/cnam/cnamDarkTheme.d.ts +1 -1
  68. package/dist/designTokens/tokens/cnam/cnamLightTheme.d.ts +57 -99
  69. package/dist/designTokens/tokens/pa/paContextual.d.ts +0 -6
  70. package/dist/designTokens/tokens/pa/paDarkTheme.d.ts +1 -1
  71. package/dist/designTokens/tokens/pa/paLightTheme.d.ts +53 -97
  72. package/dist/designTokens/tokens/pa/paSemantic.d.ts +1 -0
  73. package/dist/designTokens/tokens/semanticTokens.d.ts +112 -0
  74. package/dist/{main-Cpx8Co6H.js → main-CI6Q9nmO.js} +13843 -13478
  75. package/dist/synapse.css +1 -1
  76. package/dist/vuetifyConfig.js +208 -72
  77. package/package.json +10 -7
  78. package/src/assets/overrides/_icons.scss +5 -17
  79. package/src/assets/overrides/_otp.scss +4 -5
  80. package/src/assets/overrides/_typography.scss +2 -1
  81. package/src/assets/overrides/_utilities.scss +1 -42
  82. package/src/components/Accordion/Accordion.vue +2 -0
  83. package/src/components/ChipList/ChipList.vue +30 -18
  84. package/src/components/ChipList/tests/chipList.spec.ts +4 -4
  85. package/src/components/CookiesSelection/CookiesInformation/CookiesInformation.vue +2 -1
  86. package/src/components/CookiesSelection/CookiesSelection.vue +2 -1
  87. package/src/components/CopyBtn/CopyBtn.vue +9 -0
  88. package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.stories.ts +4 -0
  89. package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.vue +7 -6
  90. package/src/components/Customs/Selects/SelectBtnField/tests/SelectBtnField.spec.ts +223 -0
  91. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +283 -351
  92. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +183 -219
  93. package/src/components/Customs/Selects/SyAutocomplete/composables/useSyAutocompleteValidation.ts +101 -0
  94. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +761 -1
  95. package/src/components/Customs/Selects/SyAutocomplete/utils/ariaManager.ts +3 -1
  96. package/src/components/Customs/Selects/SyAutocomplete/utils/useKeyboardHandler.ts +79 -5
  97. package/src/components/Customs/Selects/SyAutocomplete/validation/Validation.stories.ts +1029 -0
  98. package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +52 -217
  99. package/src/components/Customs/Selects/SySelect/SySelect.vue +248 -236
  100. package/src/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.ts +3 -0
  101. package/src/components/Customs/Selects/SySelect/composables/useSySelectValidation.ts +64 -0
  102. package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +440 -5
  103. package/src/components/Customs/Selects/SySelect/validation/Validation.stories.ts +1026 -0
  104. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.stories.ts +18 -7
  105. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +5 -5
  106. package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +8 -8
  107. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +27 -6
  108. package/src/components/Customs/SyCheckbox/tests/SyCheckbox.spec.ts +1 -1
  109. package/src/components/Customs/SyIcon/accessibilite/Accessibility.mdx +0 -6
  110. package/src/components/Customs/SyIcon/utils/tests/iconUtils.spec.ts +107 -0
  111. package/src/components/Customs/SyRadioGroup/SyRadioGroup.mdx +2 -2
  112. package/src/components/Customs/SyRadioGroup/SyRadioGroup.stories.ts +395 -200
  113. package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +100 -127
  114. package/src/components/Customs/SyRadioGroup/composables/useSyRadioGroupValidation.ts +127 -0
  115. package/src/components/Customs/SyRadioGroup/tests/SyRadioGroup.a11y.spec.ts +93 -1
  116. package/src/components/Customs/SyRadioGroup/tests/SyRadioGroup.spec.ts +146 -9
  117. package/src/components/Customs/SyRadioGroup/tests/SyRadioGroup.visual.cy.ts +165 -0
  118. package/src/components/Customs/SyRadioGroup/validation/Validation.stories.ts +773 -0
  119. package/src/components/Customs/SyTabs/SyTabs.stories.ts +5 -5
  120. package/src/components/Customs/SyTabs/config.ts +3 -3
  121. package/src/components/Customs/SyTabs/tests/SyTabs.spec.ts +265 -0
  122. package/src/components/Customs/SyTabs/tests/useTabTransition.spec.ts +188 -0
  123. package/src/components/Customs/SyTextField/SyTextField.stories.ts +10 -29
  124. package/src/components/Customs/SyTextField/SyTextField.vue +52 -17
  125. package/src/components/DataList/DataList.stories.ts +1 -1
  126. package/src/components/DataListItem/tests/DataListItem.spec.ts +3 -1
  127. package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +1 -1
  128. package/src/components/DatePicker/CalendarMode/DatePicker.vue +52 -154
  129. package/src/components/DatePicker/CalendarMode/tests/DatePicker.coverage.spec.ts +156 -0
  130. package/src/components/DatePicker/CalendarMode/tests/DatePicker.spec.ts +495 -4
  131. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +1 -1
  132. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +55 -73
  133. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +207 -1
  134. package/src/components/DatePicker/ComplexDatePicker/tests/bridge-integration.regression.spec.ts +210 -0
  135. package/src/components/DatePicker/ComplexDatePicker/tests/calendar-navigation.regression.spec.ts +214 -0
  136. package/src/components/DatePicker/ComplexDatePicker/tests/validation-cross.regression.spec.ts +194 -0
  137. package/src/components/DatePicker/ComplexDatePicker/tests/validation-success-messages.regression.spec.ts +83 -0
  138. package/src/components/DatePicker/DatePickerValidationExample/DatePickerValidation.stories.ts +1 -1
  139. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +169 -60
  140. package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +1 -1
  141. package/src/components/DatePicker/DateTextInput/tests/DateTextInput.spec.ts +320 -0
  142. package/src/components/DatePicker/composables/index.ts +1 -0
  143. package/src/components/DatePicker/composables/tests/useCalendarKeyboardNavigation.spec.ts +360 -0
  144. package/src/components/DatePicker/composables/tests/useDatePickerValidationBridge.spec.ts +129 -0
  145. package/src/components/DatePicker/composables/useDatePickerState.ts +33 -14
  146. package/src/components/DatePicker/composables/useDatePickerValidationBridge.ts +205 -0
  147. package/src/components/DatePicker/composables/useDateRangeInput.ts +2 -1
  148. package/src/components/DatePicker/composables/useDateSelection.ts +2 -1
  149. package/src/components/DatePicker/composables/useDateTextField.ts +2 -2
  150. package/src/components/DatePicker/composables/useInputBlurHandler.ts +2 -2
  151. package/src/components/DatePicker/docExamples/BidirectionalComplexValidation.vue +1 -1
  152. package/src/components/DatePicker/docExamples/DatePickerBidirectionalValidation.vue +1 -1
  153. package/src/components/DatePicker/tests/exposed-methods.coverage.spec.ts +75 -0
  154. package/src/components/DatePicker/types.ts +1 -2
  155. package/src/components/DialogBox/DialogBox.stories.ts +8 -8
  156. package/src/components/DialogBox/DialogBox.vue +1 -1
  157. package/src/components/DialogBox/accessibilite/Accessibility.mdx +86 -22
  158. package/src/components/FileList/UploadItem/UploadItem.vue +4 -4
  159. package/src/components/FileUpload/FileUpload.vue +2 -2
  160. package/src/components/FileUpload/FileUploadContent.vue +1 -1
  161. package/src/components/FilterInline/FilterInline.mdx +2 -2
  162. package/src/components/FilterSideBar/FilterSideBar.stories.ts +1 -1
  163. package/src/components/FilterSideBar/FilterSideBar.vue +4 -3
  164. package/src/components/FooterBar/FooterBar.vue +7 -7
  165. package/src/components/FranceConnectBtn/FranceConnectBtn.vue +1 -1
  166. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.vue +2 -2
  167. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.vue +7 -7
  168. package/src/components/HeaderBar/HeaderMenuBtn/HeaderMenuBtn.vue +2 -2
  169. package/src/components/HeaderLoading/tests/HeaderLoading.spec.ts +87 -8
  170. package/src/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.vue +3 -3
  171. package/src/components/HeaderNavigationBar/HorizontalNavbar/tests/HorizontalNavbar.spec.ts +589 -0
  172. package/src/components/HeaderToolbar/tests/HeaderToolBar.spec.ts +153 -1
  173. package/src/components/HeaderToolbar/tests/useMobileRightMenu.spec.ts +258 -0
  174. package/src/components/LangBtn/LangBtn.vue +2 -1
  175. package/src/components/LogoBrandSection/tests/LogoBrandSection.spec.ts +2 -2
  176. package/src/components/LogoBrandSection/tests/__snapshots__/LogoBrandSection.spec.ts.snap +1 -1
  177. package/src/components/LunarCalendar/tests/useLunarCalendarRules.spec.ts +184 -0
  178. package/src/components/MonthPicker/MonthPickerVisual/MonthSelector.vue +3 -3
  179. package/src/components/MonthPicker/MonthPickerVisual/VisualPickerFooter.vue +1 -1
  180. package/src/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.vue +2 -2
  181. package/src/components/MonthPicker/MonthPickerVisual/YearSelector.vue +1 -1
  182. package/src/components/NirField/NirField.vue +3 -3
  183. package/src/components/NotificationBar/Notification/Notification.vue +12 -12
  184. package/src/components/NotificationBar/NotificationBar.stories.ts +8 -8
  185. package/src/components/PaginatedTable/PaginatedTable.vue +1 -1
  186. package/src/components/PaginatedTable/Pagination.vue +3 -3
  187. package/src/components/PasswordField/PasswordField.vue +15 -11
  188. package/src/components/PasswordField/tests/PasswordField.spec.ts +3 -3
  189. package/src/components/PhoneField/PhoneField.vue +4 -2
  190. package/src/components/RangeField/RangeSlider/RangeSlider.vue +11 -18
  191. package/src/components/RangeField/RangeSlider/Tooltip/Tooltip.vue +1 -1
  192. package/src/components/RatingPicker/EmotionPicker/EmotionPicker.vue +32 -48
  193. package/src/components/RatingPicker/EmotionPicker/tests/__snapshots__/EmotionPicker.spec.ts.snap +5 -0
  194. package/src/components/RatingPicker/NumberPicker/NumberPicker.vue +48 -53
  195. package/src/components/RatingPicker/NumberPicker/tests/NumberPicker.spec.ts +2 -1
  196. package/src/components/RatingPicker/NumberPicker/tests/__snapshots__/NumberPicker.spec.ts.snap +40 -13
  197. package/src/components/RatingPicker/RatingPicker.stories.ts +65 -88
  198. package/src/components/RatingPicker/RatingPicker.vue +71 -15
  199. package/src/components/RatingPicker/StarsPicker/StarsPicker.vue +28 -37
  200. package/src/components/RatingPicker/StarsPicker/tests/StarsPicker.spec.ts +1 -1
  201. package/src/components/RatingPicker/StarsPicker/tests/__snapshots__/StarsPicker.spec.ts.snap +5 -0
  202. package/src/components/RatingPicker/accessibilite/Accessibility.mdx +137 -9
  203. package/src/components/RatingPicker/tests/RatingPicker.a11y.spec.ts +123 -0
  204. package/src/components/RatingPicker/tests/RatingPicker.spec.ts +3 -2
  205. package/src/components/RatingPicker/tests/__snapshots__/RatingPicker.spec.ts.snap +40 -11
  206. package/src/components/RatingPicker/useRatingFocus.ts +97 -0
  207. package/src/components/StatusPage/tests/StatusPage.spec.ts +149 -0
  208. package/src/components/SubHeader/SubHeader.vue +1 -1
  209. package/src/components/SyAlert/SyAlert.vue +23 -23
  210. package/src/components/SyTextArea/SyTextArea.stories.ts +177 -131
  211. package/src/components/SyTextArea/SyTextArea.vue +257 -74
  212. package/src/components/SyTextArea/composables/useSyTextAreaValidation.ts +81 -0
  213. package/src/components/SyTextArea/locales.ts +1 -0
  214. package/src/components/SyTextArea/tests/SyTextArea.spec.ts +449 -1
  215. package/src/components/SyTextArea/useDefaultValidationRules.ts +2 -7
  216. package/src/components/SyTextArea/validation/Validation.stories.ts +856 -0
  217. package/src/components/TableToolbar/TableToolbar.vue +6 -6
  218. package/src/components/TableToolbar/accessibilite/Accessibility.mdx +81 -7
  219. package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +163 -0
  220. package/src/components/Tables/SyServerTable/SyServerTable.vue +3 -2
  221. package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +67 -0
  222. package/src/components/Tables/SyTable/SyTable.stories.ts +94 -0
  223. package/src/components/Tables/SyTable/SyTable.vue +3 -2
  224. package/src/components/Tables/SyTable/tests/SyTable.spec.ts +64 -0
  225. package/src/components/Tables/common/SyTableFilter.vue +4 -4
  226. package/src/components/Tables/common/SyTablePagination.vue +1 -0
  227. package/src/components/Tables/common/TableHeader.vue +3 -3
  228. package/src/components/Tables/common/filters/DateFilter.vue +2 -2
  229. package/src/components/Tables/common/filters/logics/tests/NumberFilterLogic.spec.ts +176 -0
  230. package/src/components/Tables/common/filters/logics/tests/SelectFilterLogic.spec.ts +111 -0
  231. package/src/components/Tables/common/tableStyles.scss +6 -6
  232. package/src/components/Tables/common/types.ts +2 -0
  233. package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +2 -0
  234. package/src/components/index.ts +1 -0
  235. package/src/composables/date/tests/useDateFormatDayjs.spec.ts +112 -0
  236. package/src/composables/date/tests/{useDateInitialization.spec.ts → useDateInitializationDayjs.spec.ts} +39 -3
  237. package/src/composables/date/tests/useHolidayDay.spec.ts +109 -0
  238. package/src/composables/date/useDateInitializationDayjs.ts +4 -1
  239. package/src/composables/rules/tests/useFieldValidation.spec.ts +374 -0
  240. package/src/composables/tests/useError.spec.ts +30 -0
  241. package/src/composables/tests/useFormFieldErrorHandling.spec.ts +234 -0
  242. package/src/composables/unifyValidation/documentationValidationProps.ts +12 -12
  243. package/src/composables/unifyValidation/tests/documentationValidationProps.spec.ts +177 -0
  244. package/src/composables/unifyValidation/tests/useCustomValidation.spec.ts +32 -1
  245. package/src/composables/unifyValidation/tests/useValidation.spec.ts +28 -2
  246. package/src/composables/unifyValidation/useCustomValidation.ts +34 -12
  247. package/src/composables/unifyValidation/useValidation.ts +55 -27
  248. package/src/composables/unifyValidation/useVuetifyValidation.ts +2 -2
  249. package/src/composables/useFilterable/useFilterable.spec.ts +42 -0
  250. package/src/composables/useFilterable/useFilterable.ts +11 -7
  251. package/src/composables/useFormFieldErrorHandling.ts +6 -3
  252. package/src/composables/validation/tests/useValidation.spec.ts +2 -2
  253. package/src/composables/validation/useValidation.ts +15 -3
  254. package/src/composantsVuetify/VBtn/VBtn.mdx +9 -39
  255. package/src/composantsVuetify/VBtn/v-btn.stories.ts +26 -86
  256. package/src/composantsVuetify/VCard/VCard.mdx +59 -0
  257. package/src/composantsVuetify/VCard/v-card.stories.ts +279 -0
  258. package/src/designTokens/tokens/amelipro/apColors2026.ts +1 -1
  259. package/src/designTokens/tokens/amelipro/apContextual.ts +6 -0
  260. package/src/designTokens/tokens/amelipro/apDarkTheme.ts +2 -2
  261. package/src/designTokens/tokens/amelipro/apLightTheme.ts +72 -100
  262. package/src/designTokens/tokens/amelipro/apSemantic.ts +1 -1
  263. package/src/designTokens/tokens/baseContextualTokens.ts +1 -6
  264. package/src/designTokens/tokens/baseTokens.ts +232 -0
  265. package/src/designTokens/tokens/cnam/cnamContextual.ts +6 -0
  266. package/src/designTokens/tokens/cnam/cnamDarkTheme.ts +2 -2
  267. package/src/designTokens/tokens/cnam/cnamLightTheme.ts +76 -101
  268. package/src/designTokens/tokens/pa/paDarkTheme.ts +2 -2
  269. package/src/designTokens/tokens/pa/paLightTheme.ts +73 -99
  270. package/src/designTokens/tokens/pa/paSemantic.ts +2 -0
  271. package/src/designTokens/tokens/semanticTokens.ts +114 -0
  272. package/src/stories/Accessibilite/Aculturation/SensibilisationAccessibilite.mdx +61 -91
  273. package/src/stories/Accessibilite/AuditDesignSystem.mdx +5 -8
  274. package/src/stories/Accessibilite/AuditEtContreAudit/Exemptions-derogations.mdx +1 -1
  275. package/src/stories/Accessibilite/AuditEtContreAudit/Introduction.mdx +11 -8
  276. package/src/stories/Accessibilite/AuditEtContreAudit/RGAA.mdx +6 -7
  277. package/src/stories/Accessibilite/Introduction.mdx +30 -30
  278. package/src/stories/Accessibilite/KitDePreAudit/Echantillonnage.mdx +168 -78
  279. package/src/stories/Accessibilite/KitDePreAudit/Introduction.mdx +13 -6
  280. package/src/stories/Accessibilite/KitDePreAudit/Outils/Introduction.mdx +66 -45
  281. package/src/stories/Accessibilite/KitDePreAudit/Outils/LecteursDEcran.mdx +23 -49
  282. package/src/stories/Accessibilite/KitDePreAudit/Outils/Tanaguru/FauxPositifs.stories.ts +6 -0
  283. package/src/stories/Accessibilite/KitDePreAudit/Outils/Tanaguru/Utilisation.mdx +7 -19
  284. package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +18 -20
  285. package/src/stories/Components/Components.stories.ts +59 -6
  286. package/src/stories/DesignTokens/ColorIntegrationExample.vue +2 -3
  287. package/src/stories/DesignTokens/Colors.mdx +6 -8
  288. package/src/stories/DesignTokens/colors.stories.ts +244 -1081
  289. package/src/utils/amelipro/toKebabCase/tests/toKebabCase.spec.ts +52 -0
  290. package/src/utils/formatNir/tests/formatNir.spec.ts +34 -0
  291. package/src/utils/tests/insertAt.spec.ts +44 -0
  292. package/dist/AutocompleteFilter-Df9i5mAl.cjs +0 -1
  293. package/dist/DateFilter-BJD6FMev.cjs +0 -1
  294. package/dist/NumberFilter-DGCzCXzI.cjs +0 -1
  295. package/dist/PeriodFilter-DO_ecTZW.cjs +0 -1
  296. package/dist/SelectFilter-CGwcKWLm.cjs +0 -1
  297. package/dist/TextFilter-B8nf7xoK.cjs +0 -1
  298. package/dist/apLightTheme-CEK4iY3f.cjs +0 -1
  299. package/dist/apLightTheme-DnIM24Lv.js +0 -950
  300. package/dist/composables/date/useDateFormat.d.ts +0 -26
  301. package/dist/composables/date/useDateInitialization.d.ts +0 -18
  302. package/dist/design-system-v3.umd.cjs +0 -1
  303. package/dist/main-ByDPHpae.cjs +0 -1067
  304. package/dist/tooth-11-D3sLWv2n.cjs +0 -1
  305. package/dist/tooth-12-CXrLuH03.cjs +0 -1
  306. package/dist/tooth-13-BSfo5fpT.cjs +0 -1
  307. package/dist/tooth-14-DMzulx0h.cjs +0 -1
  308. package/dist/tooth-15-BKRFVi-9.cjs +0 -1
  309. package/dist/tooth-16-CpuxAbuM.cjs +0 -1
  310. package/dist/tooth-17-BPoahUdg.cjs +0 -1
  311. package/dist/tooth-18-DhHJz8sy.cjs +0 -1
  312. package/dist/tooth-21-Dgd5hn_X.cjs +0 -1
  313. package/dist/tooth-22-C2Tn19sB.cjs +0 -1
  314. package/dist/tooth-23-C9uaaSGb.cjs +0 -1
  315. package/dist/tooth-24-BrK9UGpf.cjs +0 -1
  316. package/dist/tooth-25-CE_EfGNp.cjs +0 -1
  317. package/dist/tooth-26-Ctv4i9Fy.cjs +0 -1
  318. package/dist/tooth-27-C5J7JkWM.cjs +0 -1
  319. package/dist/tooth-28-Z9oWqjo0.cjs +0 -1
  320. package/dist/tooth-31-BrYqmkTi.cjs +0 -1
  321. package/dist/tooth-32-BNNR0oCZ.cjs +0 -1
  322. package/dist/tooth-33-DuxvqO2J.cjs +0 -1
  323. package/dist/tooth-34-BCSCXMB6.cjs +0 -1
  324. package/dist/tooth-35-BLUXkX88.cjs +0 -1
  325. package/dist/tooth-36-IrKHYqlA.cjs +0 -1
  326. package/dist/tooth-37-BYqpdMwo.cjs +0 -1
  327. package/dist/tooth-38-B_eNXXdu.cjs +0 -1
  328. package/dist/tooth-41-Ddva4Ot8.cjs +0 -1
  329. package/dist/tooth-42-szcDqlM0.cjs +0 -1
  330. package/dist/tooth-43-B3ka6rQm.cjs +0 -1
  331. package/dist/tooth-44-CazyQucj.cjs +0 -1
  332. package/dist/tooth-45-B4HQtc8n.cjs +0 -1
  333. package/dist/tooth-46-BPM40gbG.cjs +0 -1
  334. package/dist/tooth-47-Dvr20dlh.cjs +0 -1
  335. package/dist/tooth-48-Bd8ljGsF.cjs +0 -1
  336. package/dist/tooth-51-OBpwCOF3.cjs +0 -1
  337. package/dist/tooth-52-aKxyHcmq.cjs +0 -1
  338. package/dist/tooth-53-vCwJjTOc.cjs +0 -1
  339. package/dist/tooth-54-DsWu2iFy.cjs +0 -1
  340. package/dist/tooth-55-BxC1X2Dn.cjs +0 -1
  341. package/dist/tooth-61-BbLvxMQi.cjs +0 -1
  342. package/dist/tooth-62-CmTkWczP.cjs +0 -1
  343. package/dist/tooth-63-DI7l_2qI.cjs +0 -1
  344. package/dist/tooth-64-B21sOsJh.cjs +0 -1
  345. package/dist/tooth-65-D2ZC2VEr.cjs +0 -1
  346. package/dist/tooth-71-D473PPO5.cjs +0 -1
  347. package/dist/tooth-72-Drh1wnNu.cjs +0 -1
  348. package/dist/tooth-73-DzlwYI23.cjs +0 -1
  349. package/dist/tooth-74-8aGvcZPg.cjs +0 -1
  350. package/dist/tooth-75-BFK7At_r.cjs +0 -1
  351. package/dist/tooth-81-BZmR-I0M.cjs +0 -1
  352. package/dist/tooth-82-euVfUUZV.cjs +0 -1
  353. package/dist/tooth-83-KV010j64.cjs +0 -1
  354. package/dist/tooth-84-BBg1RjhZ.cjs +0 -1
  355. package/dist/tooth-85-Cr-kc1wM.cjs +0 -1
  356. package/dist/vuetifyConfig.umd.cjs +0 -1
  357. package/src/components/BackBtn/tests/__snapshots__/back-btn-custom-bg.snap.png +0 -0
  358. package/src/components/BackBtn/tests/__snapshots__/back-btn-dark-mode.snap.png +0 -0
  359. package/src/components/BackBtn/tests/__snapshots__/back-btn-default.snap.png +0 -0
  360. package/src/components/BackBtn/tests/__snapshots__/back-btn-no-icon.snap.png +0 -0
  361. package/src/components/DatePicker/CalendarMode/tests/DatePicker.events.spec.ts +0 -178
  362. package/src/components/DialogBox/tests/__snapshots__/dialog-box-custom-texts.snap.png +0 -0
  363. package/src/components/DialogBox/tests/__snapshots__/dialog-box-default.snap.png +0 -0
  364. package/src/components/DialogBox/tests/__snapshots__/dialog-box-no-actions.snap.png +0 -0
  365. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated-submenu-open.snap.png +0 -0
  366. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated.snap.png +0 -0
  367. package/src/components/HeaderBar/tests/__snapshots__/header-bar-custom-width.snap.png +0 -0
  368. package/src/components/HeaderBar/tests/__snapshots__/header-bar-default.snap.png +0 -0
  369. package/src/components/HeaderBar/tests/__snapshots__/header-bar-no-sticky.snap.png +0 -0
  370. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-prepend.snap.png +0 -0
  371. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-side.snap.png +0 -0
  372. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-subtitle.snap.png +0 -0
  373. package/src/components/Logo/tests/__snapshots__/logo-avatar.snap.png +0 -0
  374. package/src/components/Logo/tests/__snapshots__/logo-dark.snap.png +0 -0
  375. package/src/components/Logo/tests/__snapshots__/logo-default.snap.png +0 -0
  376. package/src/components/Logo/tests/__snapshots__/logo-no-organism.snap.png +0 -0
  377. package/src/components/Logo/tests/__snapshots__/logo-no-signature.snap.png +0 -0
  378. package/src/components/Logo/tests/__snapshots__/logo-risque-pro.snap.png +0 -0
  379. package/src/components/RangeField/tests/__snapshots__/range-field-custom-bg.snap.png +0 -0
  380. package/src/components/RangeField/tests/__snapshots__/range-field-custom-range.snap.png +0 -0
  381. package/src/components/RangeField/tests/__snapshots__/range-field-default.snap.png +0 -0
  382. package/src/components/RangeField/tests/__snapshots__/range-field-step.snap.png +0 -0
  383. package/src/components/RangeField/tests/__snapshots__/range-field-with-label.snap.png +0 -0
  384. package/src/components/SyAlert/tests/__snapshots__/sy-alert-closable.snap.png +0 -0
  385. package/src/components/SyAlert/tests/__snapshots__/sy-alert-error.snap.png +0 -0
  386. package/src/components/SyAlert/tests/__snapshots__/sy-alert-info.snap.png +0 -0
  387. package/src/components/SyAlert/tests/__snapshots__/sy-alert-success.snap.png +0 -0
  388. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-outlined.snap.png +0 -0
  389. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-tonal.snap.png +0 -0
  390. package/src/components/SyAlert/tests/__snapshots__/sy-alert-warning.snap.png +0 -0
  391. package/src/composables/date/tests/useDateFormat.spec.ts +0 -67
  392. package/src/composables/date/useDateFormat.ts +0 -110
  393. package/src/composables/date/useDateInitialization.ts +0 -92
@@ -0,0 +1,856 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3'
2
+ import SyTextArea from '../SyTextArea.vue'
3
+ import SyForm from '../../Customs/SyForm/SyForm.vue'
4
+ import { ref, onMounted, nextTick } from 'vue'
5
+ import { fn } from '@storybook/test'
6
+ import { VBtn, VForm } from 'vuetify/components'
7
+
8
+ const meta: Meta<typeof SyTextArea> = {
9
+ title: 'Composants/Formulaires/SyTextArea/Validation',
10
+ component: SyTextArea,
11
+ parameters: {
12
+ layout: 'fullscreen',
13
+ },
14
+ args: {
15
+ 'onUpdate:modelValue': fn(),
16
+ },
17
+ } as Meta<typeof SyTextArea>
18
+
19
+ export default meta
20
+
21
+ type Story = StoryObj<typeof meta>
22
+
23
+ export const WithError: Story = {
24
+ parameters: {
25
+ docs: {
26
+ description: {
27
+ story: 'Un message prédéfini est présélectionné et déclenche une erreur bloquante au chargement.',
28
+ },
29
+ },
30
+ sourceCode: [
31
+ {
32
+ name: 'Template',
33
+ code: `
34
+ <template>
35
+ <SyTextArea
36
+ ref="textAreaRef"
37
+ v-model="value"
38
+ label="Description"
39
+ :custom-rules="[
40
+ {
41
+ type: 'custom',
42
+ options: {
43
+ validate: (v) => v.length <= 20,
44
+ message: 'Le texte ne doit pas dépasser 20 caractères.'
45
+ }
46
+ }
47
+ ]"
48
+ />
49
+ </template>`,
50
+ },
51
+ {
52
+ name: 'Script',
53
+ code: `
54
+ <script setup lang="ts">
55
+ import { onMounted, ref } from 'vue'
56
+ import { SyTextArea } from '@cnamts/synapse'
57
+
58
+ const value = ref('Ce texte est trop long et provoque une erreur.')
59
+ const textAreaRef = ref(null)
60
+
61
+ onMounted(() => {
62
+ textAreaRef.value?.validateOnSubmit()
63
+ })
64
+ </script>`,
65
+ },
66
+ ],
67
+ },
68
+ args: {
69
+ 'label': 'Description',
70
+ 'onUpdate:modelValue': fn(),
71
+ },
72
+ render: args => ({
73
+ components: { SyTextArea },
74
+ setup() {
75
+ const value = ref('Ce texte est trop long et provoque une erreur.')
76
+ const textAreaRef = ref<{ validateOnSubmit: () => Promise<boolean> } | null>(null)
77
+
78
+ onMounted(() => {
79
+ textAreaRef.value?.validateOnSubmit()
80
+ })
81
+
82
+ return { args, value, textAreaRef }
83
+ },
84
+ template: `
85
+ <div class="pa-4">
86
+ <SyTextArea
87
+ ref="textAreaRef"
88
+ v-model="value"
89
+ v-bind="args"
90
+ :custom-rules="[
91
+ {
92
+ type: 'custom',
93
+ options: {
94
+ validate: (v) => v.length <= 20,
95
+ message: 'Le texte ne doit pas dépasser 20 caractères.'
96
+ }
97
+ }
98
+ ]"
99
+ />
100
+ </div>
101
+ `,
102
+ }),
103
+ }
104
+
105
+ export const WithWarning: Story = {
106
+ parameters: {
107
+ docs: {
108
+ description: {
109
+ story: 'Les règles d\'alerte (`customWarningRules`) sont non bloquantes : le formulaire peut être soumis même si elles échouent.',
110
+ },
111
+ },
112
+ sourceCode: [
113
+ {
114
+ name: 'Template',
115
+ code: `
116
+ <template>
117
+ <SyTextArea
118
+ ref="textAreaRef"
119
+ v-model="value"
120
+ label="Observations"
121
+ :custom-warning-rules="[
122
+ {
123
+ type: 'custom',
124
+ options: {
125
+ validate: (v) => v.length >= 10,
126
+ warningMessage: 'Pour une meilleure description, saisissez au moins 10 caractères.'
127
+ }
128
+ }
129
+ ]"
130
+ />
131
+ </template>`,
132
+ },
133
+ ],
134
+ },
135
+ args: {
136
+ 'label': 'Observations',
137
+ 'onUpdate:modelValue': fn(),
138
+ },
139
+ render: args => ({
140
+ components: { SyTextArea },
141
+ setup() {
142
+ const value = ref('Court.')
143
+ const textAreaRef = ref<{ validateOnSubmit: () => Promise<boolean> } | null>(null)
144
+
145
+ onMounted(() => {
146
+ textAreaRef.value?.validateOnSubmit()
147
+ })
148
+
149
+ return { args, value, textAreaRef }
150
+ },
151
+ template: `
152
+ <div class="pa-4">
153
+ <SyTextArea
154
+ ref="textAreaRef"
155
+ v-model="value"
156
+ v-bind="args"
157
+ :custom-warning-rules="[
158
+ {
159
+ type: 'custom',
160
+ options: {
161
+ validate: (v) => v.length >= 10,
162
+ warningMessage: 'Pour une meilleure description, saisissez au moins 10 caractères.'
163
+ }
164
+ }
165
+ ]"
166
+ />
167
+ </div>
168
+ `,
169
+ }),
170
+ }
171
+
172
+ export const WithSuccess: Story = {
173
+ parameters: {
174
+ docs: {
175
+ description: {
176
+ story: 'Les règles de succès (`customSuccessRules`) affichent un message positif quand la valeur est valide.',
177
+ },
178
+ },
179
+ sourceCode: [
180
+ {
181
+ name: 'Template',
182
+ code: `
183
+ <template>
184
+ <SyTextArea
185
+ ref="textAreaRef"
186
+ v-model="value"
187
+ label="Commentaire"
188
+ show-success-messages
189
+ :custom-success-rules="[
190
+ {
191
+ type: 'custom',
192
+ options: {
193
+ validate: (v) => v.length >= 20,
194
+ successMessage: 'Description suffisamment détaillée.'
195
+ }
196
+ }
197
+ ]"
198
+ />
199
+ </template>`,
200
+ },
201
+ ],
202
+ },
203
+ args: {
204
+ 'label': 'Commentaire',
205
+ 'showSuccessMessages': true,
206
+ 'onUpdate:modelValue': fn(),
207
+ },
208
+ render: args => ({
209
+ components: { SyTextArea },
210
+ setup() {
211
+ const value = ref('Voici une description bien détaillée du problème rencontré.')
212
+ const textAreaRef = ref<{ validateOnSubmit: () => Promise<boolean> } | null>(null)
213
+
214
+ onMounted(() => {
215
+ textAreaRef.value?.validateOnSubmit()
216
+ })
217
+
218
+ return { args, value, textAreaRef }
219
+ },
220
+ template: `
221
+ <div class="pa-4">
222
+ <SyTextArea
223
+ ref="textAreaRef"
224
+ v-model="value"
225
+ v-bind="args"
226
+ :custom-success-rules="[
227
+ {
228
+ type: 'custom',
229
+ options: {
230
+ validate: (v) => v.length >= 20,
231
+ successMessage: 'Description suffisamment détaillée.'
232
+ }
233
+ }
234
+ ]"
235
+ />
236
+ </div>
237
+ `,
238
+ }),
239
+ }
240
+
241
+ export const NoSuccessMessage: Story = {
242
+ parameters: {
243
+ docs: {
244
+ description: {
245
+ story: 'Avec `showSuccessMessages: false`, l\'état visuel de succès reste actif (bordure verte, icône) mais le message texte n\'est pas affiché. Utile quand un retour positif silencieux est suffisant.',
246
+ },
247
+ },
248
+ sourceCode: [
249
+ {
250
+ name: 'Template',
251
+ code: `
252
+ <template>
253
+ <SyTextArea
254
+ ref="textAreaRef"
255
+ v-model="value"
256
+ label="Commentaire"
257
+ :show-success-messages="false"
258
+ :custom-success-rules="[
259
+ {
260
+ type: 'custom',
261
+ options: {
262
+ validate: (v) => v.length >= 20,
263
+ successMessage: 'Description suffisamment détaillée.'
264
+ }
265
+ }
266
+ ]"
267
+ />
268
+ </template>`,
269
+ },
270
+ {
271
+ name: 'Script',
272
+ code: `
273
+ <script setup lang="ts">
274
+ import { onMounted, ref } from 'vue'
275
+ import { SyTextArea } from '@cnamts/synapse'
276
+
277
+ const value = ref('Voici une description bien détaillée du problème rencontré.')
278
+ const textAreaRef = ref(null)
279
+
280
+ onMounted(() => {
281
+ textAreaRef.value?.validateOnSubmit()
282
+ })
283
+ </script>`,
284
+ },
285
+ ],
286
+ },
287
+ args: {
288
+ 'label': 'Commentaire',
289
+ 'showSuccessMessages': false,
290
+ 'onUpdate:modelValue': fn(),
291
+ },
292
+ render: args => ({
293
+ components: { SyTextArea },
294
+ setup() {
295
+ const value = ref('Voici une description bien détaillée du problème rencontré.')
296
+ const textAreaRef = ref<{ validateOnSubmit: () => Promise<boolean> } | null>(null)
297
+
298
+ onMounted(() => {
299
+ textAreaRef.value?.validateOnSubmit()
300
+ })
301
+
302
+ return { args, value, textAreaRef }
303
+ },
304
+ template: `
305
+ <div class="pa-4">
306
+ <SyTextArea
307
+ ref="textAreaRef"
308
+ v-model="value"
309
+ v-bind="args"
310
+ :custom-success-rules="[
311
+ {
312
+ type: 'custom',
313
+ options: {
314
+ validate: (v) => v.length >= 20,
315
+ successMessage: 'Description suffisamment détaillée.'
316
+ }
317
+ }
318
+ ]"
319
+ />
320
+ </div>
321
+ `,
322
+ }),
323
+ }
324
+
325
+ export const NoValidateOnBlur: Story = {
326
+ parameters: {
327
+ docs: {
328
+ description: {
329
+ story: 'Avec `isValidateOnBlur: false`, la validation se déclenche **immédiatement** dès que la valeur change. Dans cette story, l\'état de validation est volontairement conservé uniquement pour les changements déclenchés par les boutons. Une saisie directe dans le textarea met donc à jour la valeur, puis réinitialise aussitôt les messages et l\'état visuel.',
330
+ },
331
+ },
332
+ sourceCode: [
333
+ {
334
+ name: 'Template',
335
+ code: `
336
+ <template>
337
+ <div class="d-flex flex-column gap-4 pa-4">
338
+ <SyTextArea
339
+ ref="textAreaRef"
340
+ :model-value="value"
341
+ label="Description"
342
+ :is-validate-on-blur="false"
343
+ :custom-rules="[{
344
+ type: 'custom',
345
+ options: {
346
+ validate: (v) => v !== 'Contenu interdit',
347
+ message: 'Le contenu « Contenu interdit » n\\'est pas autorisé.'
348
+ }
349
+ }]"
350
+ @update:model-value="handleManualChange"
351
+ />
352
+ <div class="d-flex gap-4 mt-2">
353
+ <VBtn color="primary" class="mr-1" @mousedown.prevent @click="applyButtonValue('Contenu interdit')">Définir une valeur invalide</VBtn>
354
+ <VBtn color="primary" class="mr-1" @mousedown.prevent @click="applyButtonValue('Contenu valide')">Définir une valeur valide</VBtn>
355
+ <VBtn @mousedown.prevent @click="applyButtonValue('')">Réinitialiser</VBtn>
356
+ </div>
357
+ </div>
358
+ </template>`,
359
+ },
360
+ {
361
+ name: 'Script',
362
+ code: `
363
+ <script setup lang="ts">
364
+ import { nextTick, ref } from 'vue'
365
+ import { SyTextArea } from '@cnamts/synapse'
366
+ import { VBtn } from 'vuetify/components'
367
+
368
+ const value = ref('')
369
+ const textAreaRef = ref(null)
370
+ const isButtonDrivenChange = ref(false)
371
+
372
+ const handleManualChange = async (newValue) => {
373
+ value.value = newValue
374
+ if (isButtonDrivenChange.value) {
375
+ isButtonDrivenChange.value = false
376
+ return
377
+ }
378
+ await nextTick()
379
+ textAreaRef.value?.clearValidation()
380
+ }
381
+
382
+ const applyButtonValue = (newValue) => {
383
+ isButtonDrivenChange.value = true
384
+ value.value = newValue
385
+ }
386
+ </script>`,
387
+ },
388
+ ],
389
+ },
390
+ args: {
391
+ 'label': 'Description',
392
+ 'isValidateOnBlur': false,
393
+ 'onUpdate:modelValue': fn(),
394
+ },
395
+ render: args => ({
396
+ components: { SyTextArea, VBtn },
397
+ setup() {
398
+ const value = ref('')
399
+ const textAreaRef = ref<{ clearValidation: () => void } | null>(null)
400
+ const isButtonDrivenChange = ref(false)
401
+
402
+ const handleManualChange = async (newValue: string) => {
403
+ value.value = newValue
404
+ if (isButtonDrivenChange.value) {
405
+ isButtonDrivenChange.value = false
406
+ return
407
+ }
408
+ await nextTick()
409
+ textAreaRef.value?.clearValidation()
410
+ }
411
+
412
+ const applyButtonValue = (newValue: string) => {
413
+ isButtonDrivenChange.value = true
414
+ value.value = newValue
415
+ }
416
+
417
+ return { args, value, textAreaRef, handleManualChange, applyButtonValue }
418
+ },
419
+ template: `
420
+ <div class="d-flex flex-column gap-4 pa-4">
421
+ <SyTextArea
422
+ ref="textAreaRef"
423
+ :model-value="value"
424
+ v-bind="args"
425
+ :custom-rules="[{
426
+ type: 'custom',
427
+ options: {
428
+ validate: (v) => v !== 'Contenu interdit',
429
+ message: 'Le contenu « Contenu interdit » n\\'est pas autorisé.'
430
+ }
431
+ }]"
432
+ @update:model-value="handleManualChange"
433
+ />
434
+ <div class="d-flex gap-4 mt-2">
435
+ <VBtn color="primary" class="mr-1" @mousedown.prevent @click="applyButtonValue('Contenu interdit')">Définir une valeur invalide</VBtn>
436
+ <VBtn color="primary" class="mr-1" @mousedown.prevent @click="applyButtonValue('Contenu valide')">Définir une valeur valide</VBtn>
437
+ <VBtn @mousedown.prevent @click="applyButtonValue('')">Réinitialiser</VBtn>
438
+ </div>
439
+ </div>
440
+ `,
441
+ }),
442
+ }
443
+
444
+ export const DisableErrorHandling: Story = {
445
+ parameters: {
446
+ docs: {
447
+ description: {
448
+ story: 'Avec `disableErrorHandling: true`, les messages d\'erreur ne sont pas affichés même si des règles échouent. L\'état visuel reste inchangé.',
449
+ },
450
+ },
451
+ },
452
+ render: () => ({
453
+ components: { SyTextArea },
454
+ setup() {
455
+ const valueWithHandling = ref('')
456
+ const valueWithout = ref('')
457
+
458
+ const customRules = [
459
+ {
460
+ type: 'required',
461
+ options: {},
462
+ },
463
+ ]
464
+
465
+ const textAreaRef1 = ref<{ validateOnSubmit: () => Promise<boolean> } | null>(null)
466
+ const textAreaRef2 = ref<{ validateOnSubmit: () => Promise<boolean> } | null>(null)
467
+
468
+ onMounted(async () => {
469
+ await nextTick()
470
+ textAreaRef1.value?.validateOnSubmit()
471
+ textAreaRef2.value?.validateOnSubmit()
472
+ })
473
+
474
+ return { valueWithHandling, valueWithout, customRules, textAreaRef1, textAreaRef2 }
475
+ },
476
+ template: `
477
+ <div class="pa-4 d-flex flex-column gap-6">
478
+ <div>
479
+ <p class="text-subtitle-2 mb-2">Avec gestion des erreurs (défaut)</p>
480
+ <SyTextArea
481
+ ref="textAreaRef1"
482
+ v-model="valueWithHandling"
483
+ label="Description"
484
+ :custom-rules="customRules"
485
+ />
486
+ </div>
487
+ <div>
488
+ <p class="text-subtitle-2 mb-2">Sans gestion des erreurs (disableErrorHandling)</p>
489
+ <SyTextArea
490
+ ref="textAreaRef2"
491
+ v-model="valueWithout"
492
+ label="Description"
493
+ :custom-rules="customRules"
494
+ disable-error-handling
495
+ />
496
+ </div>
497
+ </div>
498
+ `,
499
+ }),
500
+ }
501
+
502
+ export const SyFormValidation: Story = {
503
+ parameters: {
504
+ docs: {
505
+ description: {
506
+ story: 'Le composant s\'enregistre automatiquement auprès de `SyForm` via `useValidatable`. Le champ reste neutre au chargement, puis la soumission déclenche la validation.',
507
+ },
508
+ },
509
+ sourceCode: [
510
+ {
511
+ name: 'Template',
512
+ code: `
513
+ <template>
514
+ <SyForm @submit="onSubmit">
515
+ <SyTextArea
516
+ v-model="value"
517
+ label="Description obligatoire"
518
+ required
519
+ display-asterisk
520
+ class="mb-4"
521
+ />
522
+ <VBtn type="submit" color="primary">Soumettre</VBtn>
523
+ </SyForm>
524
+ </template>`,
525
+ },
526
+ {
527
+ name: 'Script',
528
+ code: `
529
+ <script setup lang="ts">
530
+ import { ref } from 'vue'
531
+ import { SyTextArea, SyForm } from '@cnamts/synapse'
532
+ import { VBtn } from 'vuetify/components'
533
+
534
+ const value = ref('')
535
+
536
+ function onSubmit(event: { isValid: boolean }) {
537
+ if (event.isValid) {
538
+ alert('Formulaire valide : ' + value.value)
539
+ } else {
540
+ alert('Formulaire invalide.')
541
+ }
542
+ }
543
+ </script>`,
544
+ },
545
+ ],
546
+ },
547
+ args: {
548
+ 'label': 'Description obligatoire',
549
+ 'required': true,
550
+ 'displayAsterisk': true,
551
+ 'onUpdate:modelValue': fn(),
552
+ },
553
+ render: args => ({
554
+ components: { SyTextArea, SyForm, VBtn },
555
+ setup() {
556
+ const value = ref('')
557
+
558
+ function onSubmit(event: { isValid: boolean }) {
559
+ if (event.isValid) {
560
+ alert(`Formulaire valide : ${value.value}`)
561
+ }
562
+ else {
563
+ alert('Formulaire invalide.')
564
+ }
565
+ }
566
+
567
+ return { args, value, onSubmit }
568
+ },
569
+ template: `
570
+ <div class="pa-4">
571
+ <SyForm @submit="onSubmit">
572
+ <SyTextArea
573
+ v-model="value"
574
+ label="Description obligatoire"
575
+ :required="true"
576
+ :display-asterisk="true"
577
+ class="mb-4"
578
+ />
579
+ <VBtn type="submit" color="primary">Soumettre</VBtn>
580
+ </SyForm>
581
+ </div>
582
+ `,
583
+ }),
584
+ }
585
+
586
+ export const VFormValidation: Story = {
587
+ parameters: {
588
+ docs: {
589
+ description: {
590
+ story: 'Intégration avec `VForm` natif Vuetify en conservant la validation Synapse. Le formulaire est rendu avec `novalidate` pour désactiver la validation HTML native du `textarea`. Le champ reste neutre au chargement, puis la soumission appelle `validateOnSubmit()` manuellement.',
591
+ },
592
+ },
593
+ sourceCode: [
594
+ {
595
+ name: 'Template',
596
+ code: `
597
+ <template>
598
+ <VForm novalidate @submit.prevent="onSubmit">
599
+ <SyTextArea
600
+ ref="textAreaRef"
601
+ v-model="value"
602
+ label="Description obligatoire"
603
+ required
604
+ display-asterisk
605
+ class="mb-4"
606
+ />
607
+ <VBtn type="submit" color="primary">Soumettre</VBtn>
608
+ </VForm>
609
+ </template>`,
610
+ },
611
+ {
612
+ name: 'Script',
613
+ code: `
614
+ <script setup lang="ts">
615
+ import { ref } from 'vue'
616
+ import { SyTextArea } from '@cnamts/synapse'
617
+ import { VBtn, VForm } from 'vuetify/components'
618
+
619
+ const value = ref('')
620
+ const textAreaRef = ref(null)
621
+
622
+ async function onSubmit() {
623
+ const isValid = await textAreaRef.value?.validateOnSubmit()
624
+ if (isValid) {
625
+ alert('Formulaire valide : ' + value.value)
626
+ } else {
627
+ alert('Formulaire invalide.')
628
+ }
629
+ }
630
+ </script>`,
631
+ },
632
+ ],
633
+ },
634
+ args: {
635
+ 'label': 'Description obligatoire',
636
+ 'required': true,
637
+ 'displayAsterisk': true,
638
+ 'onUpdate:modelValue': fn(),
639
+ },
640
+ render: args => ({
641
+ components: { SyTextArea, VBtn, VForm },
642
+ setup() {
643
+ const value = ref('')
644
+ const textAreaRef = ref<{ validateOnSubmit: () => Promise<boolean> } | null>(null)
645
+
646
+ async function onSubmit() {
647
+ const isValid = await textAreaRef.value?.validateOnSubmit()
648
+ if (isValid) {
649
+ alert(`Formulaire valide : ${value.value}`)
650
+ }
651
+ else {
652
+ alert('Formulaire invalide.')
653
+ }
654
+ }
655
+
656
+ return { args, value, textAreaRef, onSubmit }
657
+ },
658
+ template: `
659
+ <div class="pa-4">
660
+ <VForm novalidate @submit.prevent="onSubmit">
661
+ <SyTextArea
662
+ ref="textAreaRef"
663
+ v-model="value"
664
+ label="Description obligatoire"
665
+ :required="true"
666
+ :display-asterisk="true"
667
+ class="mb-4"
668
+ />
669
+ <VBtn type="submit" color="primary">Soumettre</VBtn>
670
+ </VForm>
671
+ </div>
672
+ `,
673
+ }),
674
+ }
675
+
676
+ export const SyFormVuetifyValidation: Story = {
677
+ parameters: {
678
+ docs: {
679
+ description: {
680
+ story: 'Validation native Vuetify (`useVuetifyValidation`) intégrée dans `SyForm`. Les règles sont définies au format Vuetify : des fonctions retournant `true` ou un message d\'erreur.',
681
+ },
682
+ },
683
+ sourceCode: [
684
+ {
685
+ name: 'Template',
686
+ code: `
687
+ <template>
688
+ <SyForm @submit="onSubmit">
689
+ <SyTextArea
690
+ v-model="value"
691
+ label="Description"
692
+ use-vuetify-validation
693
+ validate-on="submit"
694
+ :show-success-messages="false"
695
+ :rules="[v => !!v || 'Ce champ est requis']"
696
+ class="mb-4"
697
+ />
698
+ <VBtn type="submit" color="primary">Soumettre</VBtn>
699
+ </SyForm>
700
+ </template>`,
701
+ },
702
+ {
703
+ name: 'Script',
704
+ code: `
705
+ <script setup lang="ts">
706
+ import { ref } from 'vue'
707
+ import { SyTextArea, SyForm } from '@cnamts/synapse'
708
+ import { VBtn } from 'vuetify/components'
709
+
710
+ const value = ref('')
711
+
712
+ function onSubmit(event: { isValid: boolean }) {
713
+ if (event.isValid) {
714
+ alert('Formulaire valide : ' + value.value)
715
+ } else {
716
+ alert('Formulaire invalide.')
717
+ }
718
+ }
719
+ </script>`,
720
+ },
721
+ ],
722
+ },
723
+ args: {
724
+ 'label': 'Description',
725
+ 'useVuetifyValidation': true,
726
+ 'validateOn': 'submit',
727
+ 'showSuccessMessages': false,
728
+ 'onUpdate:modelValue': fn(),
729
+ },
730
+ render: args => ({
731
+ components: { SyTextArea, SyForm, VBtn },
732
+ setup() {
733
+ const value = ref('')
734
+ const rules = [
735
+ (v: string) => !!v || 'Ce champ est requis',
736
+ ]
737
+
738
+ function onSubmit(event: { isValid: boolean }) {
739
+ if (event.isValid) {
740
+ alert(`Formulaire valide : ${value.value}`)
741
+ }
742
+ else {
743
+ alert('Formulaire invalide.')
744
+ }
745
+ }
746
+
747
+ return { args, value, rules, onSubmit }
748
+ },
749
+ template: `
750
+ <div class="pa-4">
751
+ <SyForm @submit="onSubmit">
752
+ <SyTextArea
753
+ v-model="value"
754
+ v-bind="args"
755
+ :rules="rules"
756
+ class="mb-4"
757
+ />
758
+ <VBtn type="submit" color="primary">Soumettre</VBtn>
759
+ </SyForm>
760
+ </div>
761
+ `,
762
+ }),
763
+ }
764
+
765
+ export const VFormVuetifyValidation: Story = {
766
+ parameters: {
767
+ docs: {
768
+ description: {
769
+ story: 'Validation native Vuetify (`useVuetifyValidation`) intégrée dans `VForm`. Les règles sont définies au format Vuetify : des fonctions retournant `true` ou un message d\'erreur.',
770
+ },
771
+ },
772
+ sourceCode: [
773
+ {
774
+ name: 'Template',
775
+ code: `
776
+ <template>
777
+ <VForm ref="form" @submit.prevent="onSubmit">
778
+ <SyTextArea
779
+ v-model="value"
780
+ label="Description"
781
+ use-vuetify-validation
782
+ validate-on="submit"
783
+ :show-success-messages="false"
784
+ :rules="[v => !!v || 'Ce champ est requis']"
785
+ class="mb-4"
786
+ />
787
+ <VBtn type="submit" color="primary">Soumettre</VBtn>
788
+ </VForm>
789
+ </template>`,
790
+ },
791
+ {
792
+ name: 'Script',
793
+ code: `
794
+ <script setup lang="ts">
795
+ import { ref } from 'vue'
796
+ import { SyTextArea } from '@cnamts/synapse'
797
+ import { VBtn, VForm } from 'vuetify/components'
798
+
799
+ const value = ref('')
800
+ const form = ref<InstanceType<typeof VForm> | null>(null)
801
+
802
+ async function onSubmit() {
803
+ const { valid } = await form.value?.validate() || { valid: false }
804
+ if (valid) {
805
+ alert('Formulaire valide : ' + value.value)
806
+ } else {
807
+ alert('Formulaire invalide.')
808
+ }
809
+ }
810
+ </script>`,
811
+ },
812
+ ],
813
+ },
814
+ args: {
815
+ 'label': 'Description',
816
+ 'useVuetifyValidation': true,
817
+ 'validateOn': 'submit',
818
+ 'showSuccessMessages': false,
819
+ 'onUpdate:modelValue': fn(),
820
+ },
821
+ render: args => ({
822
+ components: { SyTextArea, VBtn, VForm },
823
+ setup() {
824
+ const value = ref('')
825
+ const form = ref<InstanceType<typeof VForm> | null>(null)
826
+ const rules = [
827
+ (v: string) => !!v || 'Ce champ est requis',
828
+ ]
829
+
830
+ async function onSubmit() {
831
+ const { valid } = await form.value?.validate() || { valid: false }
832
+ if (valid) {
833
+ alert(`Formulaire valide : ${value.value}`)
834
+ }
835
+ else {
836
+ alert('Formulaire invalide.')
837
+ }
838
+ }
839
+
840
+ return { args, value, form, rules, onSubmit }
841
+ },
842
+ template: `
843
+ <div class="pa-4">
844
+ <VForm ref="form" @submit.prevent="onSubmit">
845
+ <SyTextArea
846
+ v-model="value"
847
+ v-bind="args"
848
+ :rules="rules"
849
+ class="mb-4"
850
+ />
851
+ <VBtn type="submit" color="primary">Soumettre</VBtn>
852
+ </VForm>
853
+ </div>
854
+ `,
855
+ }),
856
+ }