@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,1029 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3'
2
+ import SyAutocomplete from '../SyAutocomplete.vue'
3
+ import SyForm from '../../../SyForm/SyForm.vue'
4
+ import { computed, ref, onMounted, nextTick } from 'vue'
5
+ import { fn } from '@storybook/test'
6
+ import { VBtn, VForm } from 'vuetify/components'
7
+
8
+ const meta: Meta<typeof SyAutocomplete> = {
9
+ title: 'Composants/Formulaires/Selects/SyAutocomplete/Validation',
10
+ component: SyAutocomplete,
11
+ parameters: {
12
+ layout: 'fullscreen',
13
+ },
14
+ args: {
15
+ 'onUpdate:modelValue': fn(),
16
+ },
17
+ } as Meta<typeof SyAutocomplete>
18
+
19
+ export default meta
20
+
21
+ type Story = StoryObj<typeof meta>
22
+
23
+ const items = [
24
+ { text: 'Option 1', value: '1' },
25
+ { text: 'Option 2', value: '2' },
26
+ { text: 'Option 3', value: '3' },
27
+ ]
28
+
29
+ export const WithError: Story = {
30
+ parameters: {
31
+ docs: {
32
+ description: {
33
+ story: '« Option 1 » est présélectionnée et déclenche une erreur bloquante au chargement.',
34
+ },
35
+ },
36
+ sourceCode: [
37
+ {
38
+ name: 'Template',
39
+ code: `
40
+ <template>
41
+ <SyAutocomplete
42
+ ref="autocompleteRef"
43
+ v-model="value"
44
+ :items="items"
45
+ label="Option"
46
+ :customRules="[
47
+ {
48
+ type: 'custom',
49
+ options: {
50
+ validate: (v) => v !== '1',
51
+ message: 'Option 1 n\\'est pas autorisée, choisissez Option 2 ou 3.'
52
+ }
53
+ }
54
+ ]"
55
+ />
56
+ </template>`,
57
+ },
58
+ {
59
+ name: 'Script',
60
+ code: `
61
+ <script setup lang="ts">
62
+ import { onMounted, ref } from 'vue'
63
+ import { SyAutocomplete } from '@cnamts/synapse'
64
+
65
+ const value = ref('1')
66
+ const items = [
67
+ { text: 'Option 1', value: '1' },
68
+ { text: 'Option 2', value: '2' },
69
+ { text: 'Option 3', value: '3' },
70
+ ]
71
+
72
+ const autocompleteRef = ref(null)
73
+
74
+ onMounted(() => {
75
+ autocompleteRef.value?.validateOnSubmit()
76
+ })
77
+ </script>`,
78
+ },
79
+ ],
80
+ },
81
+ args: {
82
+ 'items': items,
83
+ 'label': 'Option',
84
+ 'filter': false,
85
+ 'onUpdate:modelValue': fn(),
86
+ },
87
+ render: args => ({
88
+ components: { SyAutocomplete },
89
+ setup() {
90
+ const value = ref('1')
91
+ const autocompleteRef = ref<{ validateOnSubmit: () => Promise<boolean> } | null>(null)
92
+
93
+ onMounted(() => {
94
+ autocompleteRef.value?.validateOnSubmit()
95
+ })
96
+
97
+ return { args, value, autocompleteRef }
98
+ },
99
+ template: `
100
+ <div class="pa-4">
101
+ <SyAutocomplete
102
+ ref="autocompleteRef"
103
+ v-model="value"
104
+ v-bind="args"
105
+ :customRules="[
106
+ {
107
+ type: 'custom',
108
+ options: {
109
+ validate: (v) => v !== '1',
110
+ message: 'Option 1 n\\'est pas autorisée, choisissez Option 2 ou 3.'
111
+ }
112
+ }
113
+ ]"
114
+ />
115
+ </div>
116
+ `,
117
+ }),
118
+ }
119
+
120
+ export const WithWarning: Story = {
121
+ parameters: {
122
+ docs: {
123
+ description: {
124
+ story: '« Option 1 » est présélectionnée et déclenche un avertissement (non bloquant) au chargement.',
125
+ },
126
+ },
127
+ sourceCode: [
128
+ {
129
+ name: 'Template',
130
+ code: `
131
+ <template>
132
+ <SyAutocomplete
133
+ ref="autocompleteRef"
134
+ v-model="value"
135
+ :items="items"
136
+ label="Option"
137
+ :customWarningRules="[
138
+ {
139
+ type: 'custom',
140
+ options: {
141
+ validate: (v) => v !== '1',
142
+ warningMessage: 'Option 1 est dépréciée, préférez Option 2 ou 3.'
143
+ }
144
+ }
145
+ ]"
146
+ />
147
+ </template>`,
148
+ },
149
+ {
150
+ name: 'Script',
151
+ code: `
152
+ <script setup lang="ts">
153
+ import { onMounted, ref } from 'vue'
154
+ import { SyAutocomplete } from '@cnamts/synapse'
155
+
156
+ const value = ref('1')
157
+ const items = [
158
+ { text: 'Option 1', value: '1' },
159
+ { text: 'Option 2', value: '2' },
160
+ { text: 'Option 3', value: '3' },
161
+ ]
162
+
163
+ const autocompleteRef = ref(null)
164
+
165
+ onMounted(() => {
166
+ autocompleteRef.value?.validateOnSubmit()
167
+ })
168
+ </script>`,
169
+ },
170
+ ],
171
+ },
172
+ args: {
173
+ 'items': items,
174
+ 'label': 'Option',
175
+ 'filter': false,
176
+ 'onUpdate:modelValue': fn(),
177
+ },
178
+ render: args => ({
179
+ components: { SyAutocomplete },
180
+ setup() {
181
+ const value = ref('1')
182
+ const autocompleteRef = ref<{ validateOnSubmit: () => Promise<boolean> } | null>(null)
183
+
184
+ onMounted(() => {
185
+ autocompleteRef.value?.validateOnSubmit()
186
+ })
187
+
188
+ return { args, value, autocompleteRef }
189
+ },
190
+ template: `
191
+ <div class="pa-4">
192
+ <SyAutocomplete
193
+ ref="autocompleteRef"
194
+ v-model="value"
195
+ v-bind="args"
196
+ :customWarningRules="[
197
+ {
198
+ type: 'custom',
199
+ options: {
200
+ validate: (v) => v !== '1',
201
+ warningMessage: 'Option 1 est dépréciée, préférez Option 2 ou 3.'
202
+ }
203
+ }
204
+ ]"
205
+ />
206
+ </div>
207
+ `,
208
+ }),
209
+ }
210
+
211
+ export const WithSuccess: Story = {
212
+ parameters: {
213
+ docs: {
214
+ description: {
215
+ story: 'Une option est présélectionnée et déclenche la confirmation de succès au chargement.',
216
+ },
217
+ },
218
+ sourceCode: [
219
+ {
220
+ name: 'Template',
221
+ code: `
222
+ <template>
223
+ <SyAutocomplete
224
+ ref="autocompleteRef"
225
+ v-model="value"
226
+ :items="items"
227
+ label="Option"
228
+ show-success-messages
229
+ :customSuccessRules="[
230
+ {
231
+ type: 'custom',
232
+ options: {
233
+ validate: (v) => v !== null && v !== undefined,
234
+ successMessage: 'Option sélectionnée avec succès.'
235
+ }
236
+ }
237
+ ]"
238
+ />
239
+ </template>`,
240
+ },
241
+ {
242
+ name: 'Script',
243
+ code: `
244
+ <script setup lang="ts">
245
+ import { onMounted, ref } from 'vue'
246
+ import { SyAutocomplete } from '@cnamts/synapse'
247
+
248
+ const value = ref('1')
249
+ const items = [
250
+ { text: 'Option 1', value: '1' },
251
+ { text: 'Option 2', value: '2' },
252
+ { text: 'Option 3', value: '3' },
253
+ ]
254
+
255
+ const autocompleteRef = ref(null)
256
+
257
+ onMounted(() => {
258
+ autocompleteRef.value?.validateOnSubmit()
259
+ })
260
+ </script>`,
261
+ },
262
+ ],
263
+ },
264
+ args: {
265
+ 'items': items,
266
+ 'label': 'Option',
267
+ 'filter': false,
268
+ 'showSuccessMessages': true,
269
+ 'onUpdate:modelValue': fn(),
270
+ },
271
+ render: args => ({
272
+ components: { SyAutocomplete },
273
+ setup() {
274
+ const value = ref('1')
275
+ const autocompleteRef = ref<{ validateOnSubmit: () => Promise<boolean> } | null>(null)
276
+
277
+ onMounted(() => {
278
+ autocompleteRef.value?.validateOnSubmit()
279
+ })
280
+
281
+ return { args, value, autocompleteRef }
282
+ },
283
+ template: `
284
+ <div class="pa-4">
285
+ <SyAutocomplete
286
+ ref="autocompleteRef"
287
+ v-model="value"
288
+ v-bind="args"
289
+ :customSuccessRules="[
290
+ {
291
+ type: 'custom',
292
+ options: {
293
+ validate: (v) => v !== null && v !== undefined,
294
+ successMessage: 'Option sélectionnée avec succès.'
295
+ }
296
+ }
297
+ ]"
298
+ />
299
+ </div>
300
+ `,
301
+ }),
302
+ }
303
+
304
+ export const NoSuccessMessage: Story = {
305
+ parameters: {
306
+ docs: {
307
+ description: {
308
+ 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.',
309
+ },
310
+ },
311
+ sourceCode: [
312
+ {
313
+ name: 'Template',
314
+ code: `
315
+ <template>
316
+ <SyAutocomplete
317
+ ref="autocompleteRef"
318
+ v-model="value"
319
+ :items="items"
320
+ label="Option"
321
+ :show-success-messages="false"
322
+ :customSuccessRules="[
323
+ {
324
+ type: 'custom',
325
+ options: {
326
+ validate: (v) => v !== null && v !== undefined,
327
+ successMessage: 'Option sélectionnée avec succès.'
328
+ }
329
+ }
330
+ ]"
331
+ />
332
+ </template>`,
333
+ },
334
+ {
335
+ name: 'Script',
336
+ code: `
337
+ <script setup lang="ts">
338
+ import { onMounted, ref } from 'vue'
339
+ import { SyAutocomplete } from '@cnamts/synapse'
340
+
341
+ const value = ref('1')
342
+ const items = [
343
+ { text: 'Option 1', value: '1' },
344
+ { text: 'Option 2', value: '2' },
345
+ { text: 'Option 3', value: '3' },
346
+ ]
347
+
348
+ const autocompleteRef = ref(null)
349
+
350
+ onMounted(() => {
351
+ autocompleteRef.value?.validateOnSubmit()
352
+ })
353
+ </script>`,
354
+ },
355
+ ],
356
+ },
357
+ args: {
358
+ 'items': items,
359
+ 'label': 'Option',
360
+ 'filter': false,
361
+ 'showSuccessMessages': false,
362
+ 'onUpdate:modelValue': fn(),
363
+ },
364
+ render: args => ({
365
+ components: { SyAutocomplete },
366
+ setup() {
367
+ const value = ref('1')
368
+ const autocompleteRef = ref<{ validateOnSubmit: () => Promise<boolean> } | null>(null)
369
+
370
+ onMounted(() => {
371
+ autocompleteRef.value?.validateOnSubmit()
372
+ })
373
+
374
+ return { args, value, autocompleteRef }
375
+ },
376
+ template: `
377
+ <div class="pa-4">
378
+ <SyAutocomplete
379
+ ref="autocompleteRef"
380
+ v-model="value"
381
+ v-bind="args"
382
+ :customSuccessRules="[
383
+ {
384
+ type: 'custom',
385
+ options: {
386
+ validate: (v) => v !== null && v !== undefined,
387
+ successMessage: 'Option sélectionnée avec succès.'
388
+ }
389
+ }
390
+ ]"
391
+ />
392
+ </div>
393
+ `,
394
+ }),
395
+ }
396
+
397
+ export const NoValidateOnBlur: Story = {
398
+ parameters: {
399
+ docs: {
400
+ description: {
401
+ story: 'Dans cette story, une saisie, une sélection directe ou un blur garde le composant dans un état neutre. Seuls les boutons activent un scénario de validation visible.',
402
+ },
403
+ },
404
+ sourceCode: [
405
+ {
406
+ name: 'Template',
407
+ code: `
408
+ <template>
409
+ <div class="d-flex flex-column gap-4 pa-4">
410
+ <SyAutocomplete
411
+ ref="autocompleteRef"
412
+ :model-value="value"
413
+ :items="items"
414
+ label="Option"
415
+ :is-validate-on-blur="false"
416
+ :show-success-messages="true"
417
+ :custom-rules="customRules"
418
+ :custom-success-rules="customSuccessRules"
419
+ @update:model-value="handleManualChange"
420
+ />
421
+ <div class="d-flex gap-4 mt-2">
422
+ <VBtn color="primary" class="mr-1" @mousedown.prevent @click="applyButtonValue('1')">Définir une valeur invalide</VBtn>
423
+ <VBtn color="primary" class="mr-1" @mousedown.prevent @click="applyButtonValue('2')">Définir une valeur valide</VBtn>
424
+ <VBtn @mousedown.prevent @click="applyButtonValue(null)">Réinitialiser</VBtn>
425
+ </div>
426
+ </div>
427
+ </template>`,
428
+ },
429
+ {
430
+ name: 'Script',
431
+ code: `
432
+ <script setup lang="ts">
433
+ import { computed, nextTick, ref } from 'vue'
434
+ import { SyAutocomplete } from '@cnamts/synapse'
435
+ import { VBtn } from 'vuetify/components'
436
+
437
+ const value = ref<string | null>(null)
438
+ const autocompleteRef = ref(null)
439
+ const validationMode = ref('neutral')
440
+ const items = [
441
+ { text: 'Option 1', value: '1' },
442
+ { text: 'Option 2', value: '2' },
443
+ { text: 'Option 3', value: '3' },
444
+ ]
445
+
446
+ const customRules = computed(() => validationMode.value === 'invalid'
447
+ ? [{
448
+ type: 'custom',
449
+ options: {
450
+ validate: (v) => v !== '1',
451
+ message: "Option 1 n'est pas autorisée."
452
+ }
453
+ }]
454
+ : [])
455
+
456
+ const customSuccessRules = computed(() => {
457
+ if (validationMode.value === 'neutral') {
458
+ return [{
459
+ type: 'custom',
460
+ options: {
461
+ validate: () => false
462
+ }
463
+ }]
464
+ }
465
+
466
+ if (validationMode.value === 'valid') {
467
+ return [{
468
+ type: 'custom',
469
+ options: {
470
+ validate: (v) => v !== null && v !== undefined,
471
+ successMessage: 'Option sélectionnée avec succès.'
472
+ }
473
+ }]
474
+ }
475
+
476
+ return []
477
+ })
478
+
479
+ const handleManualChange = async (newValue) => {
480
+ validationMode.value = 'neutral'
481
+ value.value = newValue
482
+ await nextTick()
483
+ autocompleteRef.value?.clearValidation()
484
+ }
485
+
486
+ const applyButtonValue = async (newValue) => {
487
+ validationMode.value = newValue === '1' ? 'invalid' : newValue ? 'valid' : 'neutral'
488
+ value.value = newValue
489
+ await autocompleteRef.value?.validateOnSubmit()
490
+ }
491
+ </script>`,
492
+ },
493
+ ],
494
+ },
495
+ args: {
496
+ items,
497
+ label: 'Option',
498
+ isValidateOnBlur: false,
499
+ showSuccessMessages: true,
500
+ },
501
+ render: (args) => {
502
+ return {
503
+ components: { SyAutocomplete, VBtn },
504
+ setup() {
505
+ const value = ref<string | null>(null)
506
+ const autocompleteRef = ref<{ validateOnSubmit: () => Promise<boolean>, clearValidation: () => void } | null>(null)
507
+ const validationMode = ref<'neutral' | 'invalid' | 'valid'>('neutral')
508
+
509
+ const customRules = computed(() => validationMode.value === 'invalid'
510
+ ? [{
511
+ type: 'custom',
512
+ options: {
513
+ validate: (v: string | null) => v !== '1',
514
+ message: 'Option 1 n\'est pas autorisée.',
515
+ },
516
+ }]
517
+ : [])
518
+
519
+ const customSuccessRules = computed(() => {
520
+ if (validationMode.value === 'neutral') {
521
+ return [{
522
+ type: 'custom',
523
+ options: {
524
+ validate: () => false,
525
+ },
526
+ }]
527
+ }
528
+
529
+ if (validationMode.value === 'valid') {
530
+ return [{
531
+ type: 'custom',
532
+ options: {
533
+ validate: (v: string | null) => v !== null && v !== undefined,
534
+ successMessage: 'Option sélectionnée avec succès.',
535
+ },
536
+ }]
537
+ }
538
+
539
+ return []
540
+ })
541
+
542
+ const handleManualChange = async (newValue: string | null) => {
543
+ validationMode.value = 'neutral'
544
+ value.value = newValue
545
+ await nextTick()
546
+ autocompleteRef.value?.clearValidation()
547
+ }
548
+
549
+ const applyButtonValue = async (newValue: string | null) => {
550
+ validationMode.value = newValue === '1' ? 'invalid' : newValue ? 'valid' : 'neutral'
551
+ value.value = newValue
552
+ await autocompleteRef.value?.validateOnSubmit()
553
+ }
554
+
555
+ return { args, value, autocompleteRef, customRules, customSuccessRules, handleManualChange, applyButtonValue }
556
+ },
557
+ template: `
558
+ <div class="d-flex flex-column gap-4 pa-4">
559
+ <SyAutocomplete
560
+ ref="autocompleteRef"
561
+ :model-value="value"
562
+ v-bind="args"
563
+ :custom-rules="customRules"
564
+ :custom-success-rules="customSuccessRules"
565
+ @update:model-value="handleManualChange"
566
+ />
567
+ <div class="d-flex gap-4 mt-2">
568
+ <VBtn color="primary" class="mr-1" @mousedown.prevent @click="applyButtonValue('1')">Définir une valeur invalide</VBtn>
569
+ <VBtn color="primary" class="mr-1" @mousedown.prevent @click="applyButtonValue('2')">Définir une valeur valide</VBtn>
570
+ <VBtn @mousedown.prevent @click="applyButtonValue(null)">Réinitialiser</VBtn>
571
+ </div>
572
+ </div>
573
+ `,
574
+ }
575
+ },
576
+ }
577
+
578
+ export const DisableErrorHandling: Story = {
579
+ parameters: {
580
+ sourceCode: [
581
+ {
582
+ name: 'Template',
583
+ code: `
584
+ <template>
585
+ <div class="d-flex flex-column gap-4">
586
+ <SyAutocomplete
587
+ v-model="value1"
588
+ :items="items"
589
+ label="Avec validation interne (défaut)"
590
+ required
591
+ />
592
+
593
+ <SyAutocomplete
594
+ v-model="value2"
595
+ :items="items"
596
+ label="Validation interne désactivée"
597
+ required
598
+ disable-error-handling
599
+ />
600
+ </div>
601
+ </template>`,
602
+ },
603
+ {
604
+ name: 'Script',
605
+ code: `
606
+ <script setup lang="ts">
607
+ import { ref } from 'vue'
608
+ import { SyAutocomplete } from '@cnamts/synapse'
609
+
610
+ const items = [
611
+ { text: 'Option 1', value: '1' },
612
+ { text: 'Option 2', value: '2' },
613
+ { text: 'Option 3', value: '3' },
614
+ ]
615
+
616
+ const value1 = ref(null)
617
+ const value2 = ref(null)
618
+ </script>`,
619
+ },
620
+ ],
621
+ },
622
+ args: {
623
+ items,
624
+ },
625
+ render: (args) => {
626
+ return {
627
+ components: { SyAutocomplete },
628
+ setup() {
629
+ const value1 = ref(null)
630
+ const value2 = ref(null)
631
+ return { args, value1, value2 }
632
+ },
633
+ template: `
634
+ <div class="pa-4 d-flex flex-column" style="gap: 16px;">
635
+ <SyAutocomplete
636
+ v-model="value1"
637
+ v-bind="args"
638
+ label="Avec validation interne (défaut)"
639
+ required
640
+ />
641
+ <SyAutocomplete
642
+ v-model="value2"
643
+ v-bind="args"
644
+ label="Validation interne désactivée"
645
+ required
646
+ disable-error-handling
647
+ />
648
+ </div>
649
+ `,
650
+ }
651
+ },
652
+ }
653
+
654
+ export const SyFormValidation: Story = {
655
+ parameters: {
656
+ docs: {
657
+ description: {
658
+ story: 'Le champ requis ne montre l\'erreur qu\'après interaction (blur/submit), pas au mount.',
659
+ },
660
+ },
661
+ sourceCode: [
662
+ {
663
+ name: 'Template',
664
+ code: `
665
+ <template>
666
+ <SyForm @submit="onSubmit">
667
+ <SyAutocomplete
668
+ v-model="value"
669
+ :items="items"
670
+ label="Recherche obligatoire"
671
+ required
672
+ display-asterisk
673
+ class="mb-4"
674
+ />
675
+ <VBtn type="submit" color="primary">Soumettre</VBtn>
676
+ </SyForm>
677
+ </template>`,
678
+ },
679
+ {
680
+ name: 'Script',
681
+ code: `
682
+ <script setup lang="ts">
683
+ import { ref } from 'vue'
684
+ import { SyAutocomplete, SyForm } from '@cnamts/synapse'
685
+ import { VBtn } from 'vuetify/components'
686
+
687
+ const value = ref('')
688
+ const items = [
689
+ { text: 'Option 1', value: '1' },
690
+ { text: 'Option 2', value: '2' },
691
+ { text: 'Option 3', value: '3' }
692
+ ]
693
+
694
+ const onSubmit = (event) => {
695
+ if (event.isValid) {
696
+ alert('Formulaire valide : ' + JSON.stringify(value.value))
697
+ } else {
698
+ alert('Formulaire invalide : veuillez choisir une option.')
699
+ }
700
+ }
701
+ </script>`,
702
+ },
703
+ ],
704
+ },
705
+ args: {
706
+ items,
707
+ label: 'Recherche obligatoire',
708
+ required: true,
709
+ displayAsterisk: true,
710
+ },
711
+ render: (args) => {
712
+ return {
713
+ components: { SyAutocomplete, SyForm, VBtn },
714
+ setup() {
715
+ const value = ref('')
716
+
717
+ const onSubmit = (event: { isValid: boolean }) => {
718
+ if (event.isValid) {
719
+ alert(`Formulaire valide : ${JSON.stringify(value.value)}`)
720
+ }
721
+ else {
722
+ alert('Formulaire invalide : veuillez choisir une option.')
723
+ }
724
+ }
725
+
726
+ return { args, value, onSubmit }
727
+ },
728
+ template: `
729
+ <div class="pa-4">
730
+ <SyForm @submit="onSubmit">
731
+ <SyAutocomplete
732
+ v-model="value"
733
+ v-bind="args"
734
+ class="mb-4"
735
+ />
736
+ <VBtn type="submit" color="primary">Soumettre</VBtn>
737
+ </SyForm>
738
+ </div>
739
+ `,
740
+ }
741
+ },
742
+ }
743
+
744
+ export const VFormValidation: Story = {
745
+ parameters: {
746
+ docs: {
747
+ description: {
748
+ story: 'Intégration avec `VForm` natif Vuetify en conservant la validation Synapse. La soumission appelle `validateOnSubmit()` manuellement sur le champ pour déclencher la validation.',
749
+ },
750
+ },
751
+ sourceCode: [
752
+ {
753
+ name: 'Template',
754
+ code: `
755
+ <template>
756
+ <VForm @submit.prevent="onSubmit">
757
+ <SyAutocomplete
758
+ ref="autocompleteRef"
759
+ v-model="value"
760
+ :items="items"
761
+ label="Recherche obligatoire"
762
+ required
763
+ display-asterisk
764
+ class="mb-4"
765
+ />
766
+ <VBtn type="submit" color="primary">Soumettre</VBtn>
767
+ </VForm>
768
+ </template>`,
769
+ },
770
+ {
771
+ name: 'Script',
772
+ code: `
773
+ <script setup lang="ts">
774
+ import { ref } from 'vue'
775
+ import { SyAutocomplete } from '@cnamts/synapse'
776
+ import { VBtn, VForm } from 'vuetify/components'
777
+
778
+ const value = ref('')
779
+ const autocompleteRef = ref(null)
780
+ const items = [
781
+ { text: 'Option 1', value: '1' },
782
+ { text: 'Option 2', value: '2' },
783
+ { text: 'Option 3', value: '3' },
784
+ ]
785
+
786
+ async function onSubmit() {
787
+ const isValid = await autocompleteRef.value?.validateOnSubmit()
788
+ if (isValid) {
789
+ alert('Formulaire valide : ' + JSON.stringify(value.value))
790
+ } else {
791
+ alert('Formulaire invalide : veuillez choisir une option.')
792
+ }
793
+ }
794
+ </script>`,
795
+ },
796
+ ],
797
+ },
798
+ args: {
799
+ items,
800
+ label: 'Recherche obligatoire',
801
+ required: true,
802
+ displayAsterisk: true,
803
+ },
804
+ render: (args) => {
805
+ return {
806
+ components: { SyAutocomplete, VBtn, VForm },
807
+ setup() {
808
+ const value = ref('')
809
+ const autocompleteRef = ref<{ validateOnSubmit: () => Promise<boolean> } | null>(null)
810
+
811
+ async function onSubmit() {
812
+ const isValid = await autocompleteRef.value?.validateOnSubmit()
813
+ if (isValid) {
814
+ alert(`Formulaire valide : ${JSON.stringify(value.value)}`)
815
+ }
816
+ else {
817
+ alert('Formulaire invalide : veuillez choisir une option.')
818
+ }
819
+ }
820
+
821
+ return { args, value, autocompleteRef, onSubmit }
822
+ },
823
+ template: `
824
+ <div class="pa-4">
825
+ <VForm @submit.prevent="onSubmit">
826
+ <SyAutocomplete
827
+ ref="autocompleteRef"
828
+ v-model="value"
829
+ v-bind="args"
830
+ class="mb-4"
831
+ />
832
+ <VBtn type="submit" color="primary">Soumettre</VBtn>
833
+ </VForm>
834
+ </div>
835
+ `,
836
+ }
837
+ },
838
+ }
839
+
840
+ export const SyFormVuetifyValidation: Story = {
841
+ parameters: {
842
+ docs: {
843
+ description: {
844
+ 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. Soumettez le formulaire pour déclencher la validation.',
845
+ },
846
+ },
847
+ sourceCode: [
848
+ {
849
+ name: 'Template',
850
+ code: `
851
+ <template>
852
+ <SyForm @submit="onSubmit">
853
+ <SyAutocomplete
854
+ v-model="value"
855
+ :items="items"
856
+ label="Option"
857
+ use-vuetify-validation
858
+ :show-success-messages="false"
859
+ :rules="[v => !!v || 'Ce champ est requis']"
860
+ />
861
+ <VBtn type="submit" color="primary" class="mt-4">
862
+ Soumettre
863
+ </VBtn>
864
+ </SyForm>
865
+ </template>`,
866
+ },
867
+ {
868
+ name: 'Script',
869
+ code: `
870
+ <script setup lang="ts">
871
+ import { ref } from 'vue'
872
+ import { SyAutocomplete, SyForm } from '@cnamts/synapse'
873
+ import { VBtn } from 'vuetify/components'
874
+
875
+ const value = ref(null)
876
+ const items = [
877
+ { text: 'Option 1', value: '1' },
878
+ { text: 'Option 2', value: '2' },
879
+ { text: 'Option 3', value: '3' },
880
+ ]
881
+
882
+ function onSubmit(event: { isValid: boolean }) {
883
+ if (event.isValid) {
884
+ alert('Formulaire valide : ' + value.value)
885
+ } else {
886
+ alert('Formulaire invalide : veuillez choisir une option.')
887
+ }
888
+ }
889
+ </script>`,
890
+ },
891
+ ],
892
+ },
893
+ args: {
894
+ 'items': items,
895
+ 'label': 'Option',
896
+ 'useVuetifyValidation': true,
897
+ 'showSuccessMessages': false,
898
+ 'onUpdate:modelValue': fn(),
899
+ },
900
+ render: args => ({
901
+ components: { SyAutocomplete, SyForm, VBtn },
902
+ setup() {
903
+ const value = ref(null)
904
+
905
+ function onSubmit(event: { isValid: boolean }) {
906
+ if (event.isValid) {
907
+ alert(`Formulaire valide : ${value.value}`)
908
+ }
909
+ else {
910
+ alert('Formulaire invalide : veuillez choisir une option.')
911
+ }
912
+ }
913
+
914
+ return { args, value, onSubmit }
915
+ },
916
+ template: `
917
+ <div class="pa-4">
918
+ <SyForm @submit="onSubmit">
919
+ <SyAutocomplete
920
+ v-model="value"
921
+ v-bind="args"
922
+ :rules="[v => !!v || 'Ce champ est requis']"
923
+ />
924
+ <VBtn
925
+ type="submit"
926
+ color="primary"
927
+ class="mt-4"
928
+ >
929
+ Soumettre
930
+ </VBtn>
931
+ </SyForm>
932
+ </div>
933
+ `,
934
+ }),
935
+ }
936
+
937
+ export const VFormAndVuetifyValidation: Story = {
938
+ parameters: {
939
+ docs: {
940
+ description: {
941
+ story: 'Validation native Vuetify (`useVuetifyValidation`) intégrée dans un `VForm` natif (sans SyForm). La soumission du formulaire déclenche la validation via `form.validate()`.',
942
+ },
943
+ },
944
+ sourceCode: [
945
+ {
946
+ name: 'Template',
947
+ code: `
948
+ <template>
949
+ <VForm ref="formRef" @submit.prevent="onSubmit">
950
+ <SyAutocomplete
951
+ v-model="value"
952
+ :items="items"
953
+ label="Option"
954
+ use-vuetify-validation
955
+ :rules="[v => !!v || 'Ce champ est requis']"
956
+ />
957
+ <VBtn type="submit" color="primary" class="mt-4">
958
+ Soumettre
959
+ </VBtn>
960
+ </VForm>
961
+ </template>`,
962
+ },
963
+ {
964
+ name: 'Script',
965
+ code: `
966
+ <script setup lang="ts">
967
+ import { ref } from 'vue'
968
+ import { SyAutocomplete } from '@cnamts/synapse'
969
+ import { VBtn, VForm } from 'vuetify/components'
970
+
971
+ const value = ref(null)
972
+ const formRef = ref(null)
973
+ const items = [
974
+ { text: 'Option 1', value: '1' },
975
+ { text: 'Option 2', value: '2' },
976
+ { text: 'Option 3', value: '3' },
977
+ ]
978
+
979
+ async function onSubmit() {
980
+ const result = await formRef.value?.validate()
981
+ if (result?.valid) {
982
+ alert('Formulaire valide : ' + value.value)
983
+ }
984
+ }
985
+ </script>`,
986
+ },
987
+ ],
988
+ },
989
+ args: {
990
+ 'items': items,
991
+ 'label': 'Option',
992
+ 'useVuetifyValidation': true,
993
+ 'onUpdate:modelValue': fn(),
994
+ },
995
+ render: args => ({
996
+ components: { SyAutocomplete, VBtn, VForm },
997
+ setup() {
998
+ const value = ref(null)
999
+ const formRef = ref<InstanceType<typeof VForm> | null>(null)
1000
+
1001
+ async function onSubmit() {
1002
+ const result = await formRef.value?.validate()
1003
+ if (result?.valid) {
1004
+ alert(`Formulaire valide : ${value.value}`)
1005
+ }
1006
+ }
1007
+
1008
+ return { args, value, formRef, onSubmit }
1009
+ },
1010
+ template: `
1011
+ <div class="pa-4">
1012
+ <VForm ref="formRef" @submit.prevent="onSubmit">
1013
+ <SyAutocomplete
1014
+ v-model="value"
1015
+ v-bind="args"
1016
+ :rules="[v => !!v || 'Ce champ est requis']"
1017
+ />
1018
+ <VBtn
1019
+ type="submit"
1020
+ color="primary"
1021
+ class="mt-4"
1022
+ >
1023
+ Soumettre
1024
+ </VBtn>
1025
+ </VForm>
1026
+ </div>
1027
+ `,
1028
+ }),
1029
+ }