@cnamts/synapse 1.0.24 → 1.0.25

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 (367) hide show
  1. package/README.md +27 -5
  2. package/dist/{AutocompleteFilter-BWLR3U7W.js → AutocompleteFilter-D7qBuCAP.js} +1 -1
  3. package/dist/{AutocompleteFilter-D9jzRzAL.cjs → AutocompleteFilter-Df9i5mAl.cjs} +1 -1
  4. package/dist/{DateFilter-DTUl8hb1.cjs → DateFilter-BJD6FMev.cjs} +1 -1
  5. package/dist/{DateFilter-BpwFexzi.js → DateFilter-BitMWrMU.js} +1 -1
  6. package/dist/{NumberFilter-Bz_NTdX9.js → NumberFilter-BTLUxw0a.js} +1 -1
  7. package/dist/{NumberFilter-MAEojdk0.cjs → NumberFilter-DGCzCXzI.cjs} +1 -1
  8. package/dist/{PeriodFilter-DX_wy9g-.js → PeriodFilter-B5rUIPAC.js} +1 -1
  9. package/dist/{PeriodFilter-CC4WgIhl.cjs → PeriodFilter-DO_ecTZW.cjs} +1 -1
  10. package/dist/{SelectFilter-BR3fvl-a.cjs → SelectFilter-CGwcKWLm.cjs} +1 -1
  11. package/dist/{SelectFilter-xqiPtPgX.js → SelectFilter-l4QnRcuk.js} +2 -2
  12. package/dist/{TextFilter-CCfYFl5F.cjs → TextFilter-B8nf7xoK.cjs} +1 -1
  13. package/dist/{TextFilter-BBl3JFqK.js → TextFilter-C9hj6Qrp.js} +1 -1
  14. package/dist/apLightTheme-CEK4iY3f.cjs +1 -0
  15. package/dist/{apLightTheme-D1P4jcD0.js → apLightTheme-DnIM24Lv.js} +441 -722
  16. package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +10 -6
  17. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +3 -0
  18. package/dist/components/Customs/SyTabs/SyTabs.d.ts +13 -11
  19. package/dist/components/Customs/SyTextField/SyTextField.d.ts +4 -4
  20. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +4 -24
  21. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +2 -12
  22. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +1 -6
  23. package/dist/components/DatePicker/composables/useDatePickerState.d.ts +1 -0
  24. package/dist/components/FileList/FileList.d.ts +6 -0
  25. package/dist/components/FilterSideBar/FilterSideBar.d.ts +2 -0
  26. package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +13 -13
  27. package/dist/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.d.ts +3 -3
  28. package/dist/components/MonthPicker/MonthPicker.d.ts +1 -6
  29. package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +1 -6
  30. package/dist/components/NirField/NirField.d.ts +4 -16
  31. package/dist/components/PeriodField/PeriodField.d.ts +8 -48
  32. package/dist/components/PhoneField/PhoneField.d.ts +1 -6
  33. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +1 -0
  34. package/dist/components/Tables/SyTable/SyTable.d.ts +1 -0
  35. package/dist/components/Tables/common/SyTablePagination.d.ts +2 -0
  36. package/dist/components/Tables/common/TableHeader.d.ts +5 -0
  37. package/dist/components/Tables/common/locales.d.ts +3 -0
  38. package/dist/components/Tables/common/types.d.ts +2 -0
  39. package/dist/components/UploadWorkflow/UploadWorkflow.d.ts +1 -0
  40. package/dist/composables/unifyValidation/documentationValidationProps.d.ts +230 -0
  41. package/dist/composables/validation/useValidation.d.ts +5 -1
  42. package/dist/design-system-v3.js +2 -2
  43. package/dist/design-system-v3.umd.cjs +1 -1
  44. package/dist/designTokens/tokens/amelipro/apColors.d.ts +10 -10
  45. package/dist/designTokens/tokens/amelipro/apColors2026.d.ts +1 -2
  46. package/dist/designTokens/tokens/amelipro/apContextual.d.ts +44 -0
  47. package/dist/designTokens/tokens/amelipro/apSemantic.d.ts +1 -1
  48. package/dist/designTokens/tokens/baseColors.d.ts +127 -0
  49. package/dist/designTokens/tokens/baseContextualTokens.d.ts +50 -0
  50. package/dist/designTokens/tokens/cnam/cnamColors.d.ts +10 -10
  51. package/dist/designTokens/tokens/cnam/cnamSemantic.d.ts +1 -1
  52. package/dist/designTokens/tokens/pa/paColors.d.ts +1 -166
  53. package/dist/designTokens/tokens/pa/paSemantic.d.ts +1 -1
  54. package/dist/designTokens/utils/buildColorClassMap.d.ts +12 -0
  55. package/dist/designTokens/utils/createFlattenTheme.d.ts +1 -3
  56. package/dist/designTokens/utils/index.d.ts +2 -2
  57. package/dist/main-ByDPHpae.cjs +1067 -0
  58. package/dist/main-Cpx8Co6H.js +38869 -0
  59. package/dist/synapse.css +1 -1
  60. package/dist/utils/functions/classToHex.d.ts +1 -1
  61. package/dist/utils/functions/createHexResolver.d.ts +16 -0
  62. package/dist/vuetifyConfig.js +113 -152
  63. package/dist/vuetifyConfig.umd.cjs +1 -1
  64. package/package.json +29 -18
  65. package/src/assets/amelipro/apTokens2026.scss +5 -5
  66. package/src/assets/overrides/_breakpoints.scss +25 -0
  67. package/src/assets/overrides/_btns.scss +0 -2
  68. package/src/assets/overrides/_forms.scss +1 -3
  69. package/src/assets/overrides/_icons.scss +7 -11
  70. package/src/assets/overrides/_otp.scss +41 -0
  71. package/src/assets/overrides/_tables.scss +11 -20
  72. package/src/assets/overrides/_tooltips.scss +17 -7
  73. package/src/assets/overrides/_typography.scss +35 -37
  74. package/src/assets/overrides/_utilities.scss +43 -47
  75. package/src/assets/themes.scss +1 -0
  76. package/src/components/Amelipro/AmeliproAccordion/AmeliproAccordionTemplate/AmeliproAccordionTemplate.vue +20 -20
  77. package/src/components/Amelipro/AmeliproAccordionFrieze/AmeliproAccordionFrieze.vue +12 -14
  78. package/src/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.vue +4 -6
  79. package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResultTemplate/AmeliproAccordionResultTemplate.vue +5 -5
  80. package/src/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.vue +4 -6
  81. package/src/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.vue +4 -6
  82. package/src/components/Amelipro/AmeliproBadge/AmeliproBadge.vue +4 -6
  83. package/src/components/Amelipro/AmeliproBreadcrumb/AmeliproBreadcrumb.vue +1 -3
  84. package/src/components/Amelipro/AmeliproBtn/AmeliproBtn.vue +4 -6
  85. package/src/components/Amelipro/AmeliproCallback/AmeliproCallback.vue +2 -2
  86. package/src/components/Amelipro/AmeliproCard/AmeliproCard.vue +31 -31
  87. package/src/components/Amelipro/AmeliproCarousel/AmeliproCarousel.vue +5 -7
  88. package/src/components/Amelipro/AmeliproCheckbox/AmeliproCheckbox.vue +13 -15
  89. package/src/components/Amelipro/AmeliproCheckboxGroup/AmeliproCheckboxGroup.vue +23 -23
  90. package/src/components/Amelipro/AmeliproChips/AmeliproChips.vue +1 -3
  91. package/src/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.vue +17 -12
  92. package/src/components/Amelipro/AmeliproClickableTile/tests/__snapshots__/AmeliproClickableTile.spec.ts.snap +2 -2
  93. package/src/components/Amelipro/AmeliproCopyBtn/AmeliproCopyBtn.vue +4 -6
  94. package/src/components/Amelipro/AmeliproCustomSelector/AmeliproCustomSelector.vue +13 -13
  95. package/src/components/Amelipro/AmeliproDentalChart/AmeliproDentalChart.vue +4 -2
  96. package/src/components/Amelipro/AmeliproDentalChart/AmeliproTooth/AmeliproTooth.vue +4 -4
  97. package/src/components/Amelipro/AmeliproDialog/AmeliproDialog.vue +5 -7
  98. package/src/components/Amelipro/AmeliproDisclosure/AmeliproDisclosure.vue +1 -3
  99. package/src/components/Amelipro/AmeliproErrorTemplate/AmeliproErrorTemplate.vue +2 -4
  100. package/src/components/Amelipro/AmeliproFilePreview/AmeliproFilePreview.vue +4 -6
  101. package/src/components/Amelipro/AmeliproFilters/AmeliproFilters.vue +13 -13
  102. package/src/components/Amelipro/AmeliproFirstLogin/AmeliproFirstLogin.vue +3 -5
  103. package/src/components/Amelipro/AmeliproFooter/AmeliproFooter.vue +1 -3
  104. package/src/components/Amelipro/AmeliproHeader/AmeliproHeader.vue +2 -4
  105. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBar.vue +1 -3
  106. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/AmeliproHeaderBrandSection.vue +20 -16
  107. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/__tests__/__snapshots__/AmeliproHeaderBrandSection.spec.ts.snap +1 -1
  108. package/src/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.vue +2 -4
  109. package/src/components/Amelipro/AmeliproIllustratedDataTile/AmeliproIllustratedDataTile.vue +5 -7
  110. package/src/components/Amelipro/AmeliproIllustratedRadioGroup/AmeliproIllustratedRadioGroup.vue +6 -8
  111. package/src/components/Amelipro/AmeliproMailTile/AmeliproMailTile.vue +14 -14
  112. package/src/components/Amelipro/AmeliproMenu/AmeliproMenu.vue +11 -13
  113. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproDropdownMenu/AmeliproDropdownMenu.vue +2 -4
  114. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproMessagingLayout.vue +8 -8
  115. package/src/components/Amelipro/AmeliproMultipleFoldingCard/AmeliproMultipleFoldingCard.vue +40 -40
  116. package/src/components/Amelipro/AmeliproNumberedCard/AmeliproNumberedCard.vue +27 -27
  117. package/src/components/Amelipro/AmeliproOnboarding/AmeliproOnboarding.vue +3 -5
  118. package/src/components/Amelipro/AmeliproPageLayout/AmeliproPageLayout.vue +2 -4
  119. package/src/components/Amelipro/AmeliproPagination/AmeliproPagination.vue +2 -4
  120. package/src/components/Amelipro/AmeliproPagination/AmeliproPaginationBtn/AmeliproPaginationBtn.vue +3 -5
  121. package/src/components/Amelipro/AmeliproPatientBanner/AmeliproPatientBanner.vue +1 -3
  122. package/src/components/Amelipro/AmeliproPatientLogged/AmeliproPatientLogged.vue +2 -4
  123. package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLogin.vue +4 -4
  124. package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLoginForm/AmeliproPatientLoginForm.vue +1 -3
  125. package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.vue +3 -5
  126. package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.vue +3 -5
  127. package/src/components/Amelipro/AmeliproRadioGroup/AmeliproRadioGroup.vue +23 -23
  128. package/src/components/Amelipro/AmeliproResultList/AmeliproResultList.vue +4 -6
  129. package/src/components/Amelipro/AmeliproSelect/AmeliproSelect.vue +12 -22
  130. package/src/components/Amelipro/AmeliproStateTile/AmeliproStateTile.vue +10 -12
  131. package/src/components/Amelipro/AmeliproStepper/AmeliproStepper.vue +17 -17
  132. package/src/components/Amelipro/AmeliproTable/AmeliproTable.vue +8 -10
  133. package/src/components/Amelipro/AmeliproTabs/AmeliproTabBtn/AmeliproTabBtn.vue +6 -8
  134. package/src/components/Amelipro/AmeliproTabs/AmeliproTabs.vue +4 -4
  135. package/src/components/Amelipro/AmeliproTextArea/AmeliproTextArea.vue +4 -6
  136. package/src/components/Amelipro/AmeliproTextField/AmeliproTextField.vue +7 -9
  137. package/src/components/Amelipro/AmeliproTileBtn/AmeliproTileBtn.vue +3 -5
  138. package/src/components/Amelipro/AmeliproTooltips/AmeliproTooltips.vue +0 -2
  139. package/src/components/Amelipro/AmeliproUpload/AmeliproUpload.vue +6 -6
  140. package/src/components/Amelipro/ServiceMenu/ServiceMenu.vue +2 -2
  141. package/src/components/Amelipro/StructureMenu/StructureBtn/StructureBtn.vue +4 -4
  142. package/src/components/Amelipro/StructureMenu/StructureItem/StructureItem.vue +4 -6
  143. package/src/components/Amelipro/StructureMenu/StructureMenu.vue +2 -2
  144. package/src/components/Amelipro/StructureMenu/StructureTabs/StructureTabs.vue +2 -2
  145. package/src/components/Amelipro/UserMenu/UserMenu.vue +1 -3
  146. package/src/components/BackBtn/tests/BackBtn.visual.cy.ts +43 -0
  147. package/src/components/BackBtn/tests/__snapshots__/back-btn-custom-bg.snap.png +0 -0
  148. package/src/components/BackBtn/tests/__snapshots__/back-btn-dark-mode.snap.png +0 -0
  149. package/src/components/BackBtn/tests/__snapshots__/back-btn-default.snap.png +0 -0
  150. package/src/components/BackBtn/tests/__snapshots__/back-btn-no-icon.snap.png +0 -0
  151. package/src/components/Captcha/Captcha.vue +1 -3
  152. package/src/components/ChipList/ChipList.vue +14 -16
  153. package/src/components/CookiesSelection/CookiesInformation/CookiesInformation.vue +0 -2
  154. package/src/components/CopyBtn/CopyBtn.vue +1 -3
  155. package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.vue +17 -17
  156. package/src/components/Customs/Selects/SelectBtnField/tests/SelectBtnField.spec.ts +31 -0
  157. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +66 -0
  158. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +7 -3
  159. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.a11y.spec.ts +18 -0
  160. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +66 -0
  161. package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.vue +4 -6
  162. package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +1 -39
  163. package/src/components/Customs/Selects/SySelect/SySelect.vue +263 -63
  164. package/src/components/Customs/Selects/SySelect/accessibilite/Accessibility.mdx +199 -269
  165. package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +35 -0
  166. package/src/components/Customs/SyCheckbox/SyCheckbox.mdx +5 -0
  167. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +29 -0
  168. package/src/components/Customs/SyCheckbox/accessibilite/Accessibility.mdx +18 -3
  169. package/src/components/Customs/SyPagination/SyPagination.vue +0 -2
  170. package/src/components/Customs/SyTabs/SyTabs.mdx +0 -58
  171. package/src/components/Customs/SyTabs/SyTabs.stories.ts +32 -33
  172. package/src/components/Customs/SyTabs/SyTabs.vue +87 -67
  173. package/src/components/Customs/SyTabs/accessibilite/Accessibility.mdx +83 -23
  174. package/src/components/Customs/SyTabs/tests/SyTabs.a11y.spec.ts +88 -0
  175. package/src/components/Customs/SyTabs/tests/SyTabs.spec.ts +46 -1
  176. package/src/components/Customs/SyTextField/SyTextField.stories.ts +21 -41
  177. package/src/components/Customs/SyTextField/SyTextField.vue +4 -6
  178. package/src/components/DatePicker/CalendarMode/DatePicker.vue +12 -14
  179. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +20 -16
  180. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +23 -0
  181. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +8 -10
  182. package/src/components/DatePicker/composables/tests/useDatePickerState.spec.ts +53 -0
  183. package/src/components/DatePicker/composables/useDatePickerState.ts +24 -0
  184. package/src/components/DatePicker/composables/useDateTextField.ts +0 -1
  185. package/src/components/DatePicker/composables/useMonthButtonCustomization.ts +9 -8
  186. package/src/components/DatePicker/playground/DatePickerHolidayRule.vue +1 -1
  187. package/src/components/DialogBox/DialogBox.vue +3 -5
  188. package/src/components/DialogBox/tests/DialogBox.visual.cy.ts +76 -0
  189. package/src/components/DialogBox/tests/__snapshots__/dialog-box-custom-texts.snap.png +0 -0
  190. package/src/components/DialogBox/tests/__snapshots__/dialog-box-default.snap.png +0 -0
  191. package/src/components/DialogBox/tests/__snapshots__/dialog-box-no-actions.snap.png +0 -0
  192. package/src/components/FileList/FileList.vue +9 -2
  193. package/src/components/FileList/UploadItem/UploadItem.vue +11 -13
  194. package/src/components/FileList/tests/FileList.spec.ts +47 -0
  195. package/src/components/FileUpload/FileUpload.vue +3 -5
  196. package/src/components/FileUpload/FileUploadContent.vue +3 -5
  197. package/src/components/FilterInline/FilterInline.vue +1 -3
  198. package/src/components/FilterSideBar/FilterSideBar.mdx +44 -1
  199. package/src/components/FilterSideBar/FilterSideBar.stories.ts +105 -1
  200. package/src/components/FilterSideBar/FilterSideBar.vue +7 -0
  201. package/src/components/FilterSideBar/tests/FilterSideBar.a11y.spec.ts +54 -1
  202. package/src/components/FilterSideBar/tests/FilterSideBar.spec.ts +42 -0
  203. package/src/components/FooterBar/FooterBar.vue +9 -13
  204. package/src/components/FranceConnectBtn/FranceConnectBtn.vue +1 -1
  205. package/src/components/HeaderBar/HeaderBar.vue +2 -3
  206. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderBurgerMenu.vue +2 -3
  207. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.vue +2 -3
  208. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuSection/HeaderMenuSection.vue +0 -1
  209. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.vue +8 -9
  210. package/src/components/HeaderBar/HeaderBurgerMenu/menu.scss +0 -8
  211. package/src/components/HeaderBar/HeaderBurgerMenu/tests/HeaderBurgerMenu.visual.cy.ts +196 -0
  212. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated-submenu-open.snap.png +0 -0
  213. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated.snap.png +0 -0
  214. package/src/components/HeaderBar/HeaderLogo/HeaderLogo.vue +0 -1
  215. package/src/components/HeaderBar/HeaderMenuBtn/HeaderMenuBtn.vue +6 -7
  216. package/src/components/HeaderBar/tests/HeaderBar.visual.cy.ts +81 -0
  217. package/src/components/HeaderBar/tests/__snapshots__/header-bar-custom-width.snap.png +0 -0
  218. package/src/components/HeaderBar/tests/__snapshots__/header-bar-default.snap.png +0 -0
  219. package/src/components/HeaderBar/tests/__snapshots__/header-bar-no-sticky.snap.png +0 -0
  220. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-prepend.snap.png +0 -0
  221. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-side.snap.png +0 -0
  222. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-subtitle.snap.png +0 -0
  223. package/src/components/HeaderNavigationBar/HeaderNavigationBar.vue +12 -3
  224. package/src/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.vue +15 -8
  225. package/src/components/HeaderToolbar/HeaderToolbar.vue +6 -7
  226. package/src/components/LangBtn/LangBtn.vue +2 -4
  227. package/src/components/Logo/tests/Logo.visual.cy.ts +57 -0
  228. package/src/components/Logo/tests/__snapshots__/logo-avatar.snap.png +0 -0
  229. package/src/components/Logo/tests/__snapshots__/logo-dark.snap.png +0 -0
  230. package/src/components/Logo/tests/__snapshots__/logo-default.snap.png +0 -0
  231. package/src/components/Logo/tests/__snapshots__/logo-no-organism.snap.png +0 -0
  232. package/src/components/Logo/tests/__snapshots__/logo-no-signature.snap.png +0 -0
  233. package/src/components/Logo/tests/__snapshots__/logo-risque-pro.snap.png +0 -0
  234. package/src/components/LogoBrandSection/LogoBrandSection.vue +2 -2
  235. package/src/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.vue +1 -1
  236. package/src/components/NirField/NirField.stories.ts +2 -2
  237. package/src/components/NirField/NirField.vue +3 -5
  238. package/src/components/NirField/accessibilite/Accessibility.mdx +100 -5
  239. package/src/components/NirField/tests/NirField.spec.ts +118 -0
  240. package/src/components/NirField/tests/useNirValidation.spec.ts +449 -0
  241. package/src/components/NirField/useNirValidation.ts +38 -32
  242. package/src/components/NotificationBar/Notification/Notification.vue +5 -7
  243. package/src/components/NotificationBar/NotificationBar.vue +1 -3
  244. package/src/components/PaginatedTable/PaginatedTable.vue +2 -3
  245. package/src/components/PaginatedTable/Pagination.vue +3 -5
  246. package/src/components/PasswordField/PasswordField.vue +8 -10
  247. package/src/components/PhoneField/PhoneField.vue +3 -3
  248. package/src/components/RangeField/RangeSlider/RangeSlider.vue +0 -2
  249. package/src/components/RangeField/RangeSlider/Tooltip/Tooltip.vue +1 -1
  250. package/src/components/RangeField/tests/RangeField.visual.cy.ts +65 -0
  251. package/src/components/RangeField/tests/__snapshots__/range-field-custom-bg.snap.png +0 -0
  252. package/src/components/RangeField/tests/__snapshots__/range-field-custom-range.snap.png +0 -0
  253. package/src/components/RangeField/tests/__snapshots__/range-field-default.snap.png +0 -0
  254. package/src/components/RangeField/tests/__snapshots__/range-field-step.snap.png +0 -0
  255. package/src/components/RangeField/tests/__snapshots__/range-field-with-label.snap.png +0 -0
  256. package/src/components/RatingPicker/EmotionPicker/EmotionPicker.vue +6 -8
  257. package/src/components/RatingPicker/StarsPicker/StarsPicker.vue +3 -5
  258. package/src/components/SearchListField/SearchListField.vue +0 -2
  259. package/src/components/SkipLink/SkipLink.vue +2 -4
  260. package/src/components/SocialMediaLinks/SocialMediaLinks.vue +6 -6
  261. package/src/components/SubHeader/SubHeader.vue +1 -1
  262. package/src/components/SyAlert/SyAlert.vue +7 -9
  263. package/src/components/SyAlert/tests/SyAlert.visual.cy.ts +46 -0
  264. package/src/components/SyAlert/tests/__snapshots__/sy-alert-closable.snap.png +0 -0
  265. package/src/components/SyAlert/tests/__snapshots__/sy-alert-error.snap.png +0 -0
  266. package/src/components/SyAlert/tests/__snapshots__/sy-alert-info.snap.png +0 -0
  267. package/src/components/SyAlert/tests/__snapshots__/sy-alert-success.snap.png +0 -0
  268. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-outlined.snap.png +0 -0
  269. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-tonal.snap.png +0 -0
  270. package/src/components/SyAlert/tests/__snapshots__/sy-alert-warning.snap.png +0 -0
  271. package/src/components/SyBtnMenu/SyBtnMenu.vue +2 -4
  272. package/src/components/TableToolbar/TableToolbar.vue +6 -8
  273. package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +166 -0
  274. package/src/components/Tables/SyServerTable/SyServerTable.vue +9 -7
  275. package/src/components/Tables/SyServerTable/tests/SyServerTable.a11y.spec.ts +23 -0
  276. package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +268 -0
  277. package/src/components/Tables/SyTable/SyTable.stories.ts +104 -0
  278. package/src/components/Tables/SyTable/SyTable.vue +9 -7
  279. package/src/components/Tables/SyTable/tests/SyTable.a11y.spec.ts +22 -0
  280. package/src/components/Tables/SyTable/tests/SyTable.spec.ts +274 -0
  281. package/src/components/Tables/common/SyTableFilter.vue +27 -2
  282. package/src/components/Tables/common/SyTablePagination.vue +142 -19
  283. package/src/components/Tables/common/TableHeader.vue +40 -3
  284. package/src/components/Tables/common/filters/SelectFilter.vue +1 -1
  285. package/src/components/Tables/common/locales.ts +3 -0
  286. package/src/components/Tables/common/tableStyles.scss +16 -19
  287. package/src/components/Tables/common/tests/SyTablePagination.spec.ts +18 -0
  288. package/src/components/Tables/common/tests/TableHeader.spec.ts +39 -0
  289. package/src/components/Tables/common/types.ts +2 -0
  290. package/src/components/Tables/common/useTableHeaders.ts +49 -27
  291. package/src/components/UploadWorkflow/UploadWorkflow.vue +1 -0
  292. package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +23 -0
  293. package/src/components/UploadWorkflow/tests/__snapshots__/UploadWorkflow.spec.ts.snap +66 -0
  294. package/src/components/UploadWorkflow/useFileList.ts +3 -0
  295. package/src/components/UserMenuBtn/UserMenuBtn.vue +1 -3
  296. package/src/composables/unifyValidation/documentationValidationProps.ts +235 -0
  297. package/src/composables/validation/useValidation.ts +17 -1
  298. package/src/composantsVuetify/VBreadcrumbs/VBreadcrumbs.mdx +28 -0
  299. package/src/composantsVuetify/VBreadcrumbs/v-breadcrumbs.stories.ts +108 -0
  300. package/src/composantsVuetify/VOtpInput/VOtpInput.mdx +39 -0
  301. package/src/composantsVuetify/VOtpInput/v-otp-input.stories.ts +56 -0
  302. package/src/composantsVuetify/VSkeletonLoader/VSkeletonLoader.mdx +42 -0
  303. package/src/composantsVuetify/VSkeletonLoader/v-skeleton-loader.stories.ts +77 -0
  304. package/src/composantsVuetify/VSwitch/VSwitch.mdx +47 -0
  305. package/src/composantsVuetify/VSwitch/v-switch.stories.ts +166 -0
  306. package/src/designTokens/tests/buildColorClassMap.spec.ts +31 -0
  307. package/src/designTokens/tests/generateScssTokens.spec.ts +12 -0
  308. package/src/designTokens/tests/themeUtils.spec.ts +53 -0
  309. package/src/designTokens/tokens/amelipro/apColors.ts +8 -130
  310. package/src/designTokens/tokens/amelipro/apColors2026.ts +3 -15
  311. package/src/designTokens/tokens/amelipro/apContextual.ts +55 -47
  312. package/src/designTokens/tokens/amelipro/apLightTheme.ts +1 -1
  313. package/src/designTokens/tokens/amelipro/apSemantic.ts +1 -1
  314. package/src/designTokens/tokens/baseColors.ts +129 -0
  315. package/src/designTokens/tokens/baseContextualTokens.ts +52 -0
  316. package/src/designTokens/tokens/cnam/cnamColors.ts +3 -125
  317. package/src/designTokens/tokens/cnam/cnamContextual.ts +4 -48
  318. package/src/designTokens/tokens/cnam/cnamLightTheme.ts +1 -1
  319. package/src/designTokens/tokens/cnam/cnamSemantic.ts +1 -1
  320. package/src/designTokens/tokens/pa/paColors.ts +2 -166
  321. package/src/designTokens/tokens/pa/paContextual.ts +3 -48
  322. package/src/designTokens/tokens/pa/paLightTheme.ts +1 -1
  323. package/src/designTokens/tokens/pa/paSemantic.ts +2 -2
  324. package/src/designTokens/utils/buildColorClassMap.ts +34 -0
  325. package/src/designTokens/utils/convertSemanticsToken.ts +8 -11
  326. package/src/designTokens/utils/createFlattenTheme.ts +15 -7
  327. package/src/designTokens/utils/index.ts +2 -2
  328. package/src/stories/Accessibilite/AuditDesignSystem.mdx +0 -11
  329. package/src/stories/Accessibilite/DesignSystem/Avancement.mdx +433 -0
  330. package/src/stories/Accessibilite/DesignSystem/a11y-status.json +692 -0
  331. package/src/stories/Accessibilite/KitDePreAudit/Echantillonnage.mdx +8 -1
  332. package/src/stories/Accessibilite/KitDePreAudit/Introduction.mdx +51 -10
  333. package/src/stories/Accessibilite/KitDePreAudit/Outils/Introduction.mdx +16 -9
  334. package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +48 -58
  335. package/src/stories/Components/Components.stories.ts +40 -1
  336. package/src/stories/Demarrer/EnrichirLeDesignSystem.mdx +4 -9
  337. package/src/stories/Demarrer/EnrichirLeDesignSystem.stories.ts +28 -0
  338. package/src/stories/Demarrer/Releases.stories.ts +48 -5
  339. package/src/stories/DesignTokens/ColorDisplay.vue +6 -5
  340. package/src/stories/DesignTokens/ColorIntegrationExample.vue +2 -4
  341. package/src/stories/DesignTokens/colors.stories.ts +5 -6
  342. package/src/stories/GuideDuDev/CreateVuetifyInstance.mdx +95 -0
  343. package/src/stories/GuideDuDev/Theme.mdx +36 -26
  344. package/src/stories/GuideDuDev/moduleDeNotification.mdx +3 -2
  345. package/src/stories/styles/accessibility-guide.css +3 -3
  346. package/src/utils/functions/classToHex.ts +6 -34
  347. package/src/utils/functions/createHexResolver.ts +45 -0
  348. package/src/utils/functions/tests/classToHex.spec.ts +36 -0
  349. package/src/utils/functions/tests/convertToHex.spec.ts +31 -0
  350. package/src/utils/functions/tests/createHexResolver.spec.ts +66 -0
  351. package/src/utils/functions/tests/isCssColor.spec.ts +48 -0
  352. package/dist/apLightTheme-CFSRrjv2.cjs +0 -1
  353. package/dist/designTokens/utils/convertGaps.d.ts +0 -5
  354. package/dist/main-BtTqyn4z.js +0 -38648
  355. package/dist/main-C1e3eoxd.cjs +0 -1067
  356. package/src/assets/apTokens.scss +0 -343
  357. package/src/assets/overrides/_container.scss +0 -36
  358. package/src/assets/tokens.scss +0 -388
  359. package/src/designTokens/apColors.md +0 -66
  360. package/src/designTokens/cnamColors.md +0 -193
  361. package/src/designTokens/paColors.md +0 -66
  362. package/src/designTokens/tokens/json/contextual-tokens.json +0 -156
  363. package/src/designTokens/tokens/json/primitives.json +0 -209
  364. package/src/designTokens/tokens/json/semantic.json +0 -120
  365. package/src/designTokens/utils/convertGaps.ts +0 -11
  366. package/src/stories/Accessibilite/Avancement/Avancement.mdx +0 -533
  367. package/src/stories/Accessibilite/Avancement/Avancement.stories.ts +0 -306
@@ -370,14 +370,12 @@
370
370
  </template>
371
371
 
372
372
  <style lang="scss" scoped>
373
- @use '@/assets/amelipro/apTokens2026' as apTokens;
374
-
375
373
  .amelipro-tile-btn {
376
374
  position: relative;
377
375
  display: flex;
378
376
  flex-direction: column;
379
- background-color: apTokens.$ap-white;
380
- border-radius: 0.5rem;
377
+ background-color: rgb(var(--v-theme-surface));
378
+ border-radius: var(--v-ap-inputRadius);
381
379
  white-space: normal;
382
380
  }
383
381
 
@@ -398,7 +396,7 @@
398
396
  }
399
397
 
400
398
  &:focus {
401
- outline: 1px dotted apTokens.$ap-grey-darken1;
399
+ outline: 1px dotted rgb(var(--v-theme-ap-grey-darken-1));
402
400
  }
403
401
 
404
402
  & :deep(.v-btn__content) {
@@ -114,8 +114,6 @@
114
114
  </template>
115
115
 
116
116
  <style lang="scss" scoped>
117
- @use '@/assets/amelipro/apTokens2026' as apTokens;
118
-
119
117
  .v-btn {
120
118
  &.tooltip-btn {
121
119
  width: 1.85em !important;
@@ -643,14 +643,14 @@
643
643
  </template>
644
644
 
645
645
  <style lang="scss" scoped>
646
- @use '@/assets/amelipro/apTokens2026' as apTokens;
646
+ @use '@/assets/overrides/breakpoints' as bp;
647
647
 
648
648
  .amelipro-upload {
649
- padding: apTokens.$card-padding-tablet;
650
- border-radius: apTokens.$card-radius;
649
+ padding: var(--v-ap-cardPaddingDesktop);
650
+ border-radius: var(--v-ap-btnRadius);
651
651
 
652
- @media #{apTokens.$media-only-xs} {
653
- padding: apTokens.$card-padding-mobile;
652
+ @media #{bp.$down-xs} {
653
+ padding: var(--v-ap-cardPaddingMobile);
654
654
  }
655
655
  }
656
656
 
@@ -687,7 +687,7 @@
687
687
  }
688
688
 
689
689
  & :deep(.label-outline) {
690
- outline: 1px dotted apTokens.$ap-grey-darken1;
690
+ outline: 1px dotted rgb(var(--v-theme-ap-grey-darken-1));
691
691
  }
692
692
 
693
693
  & :deep(.v-input__control) {
@@ -174,7 +174,7 @@
174
174
  </template>
175
175
 
176
176
  <style lang="scss" scoped>
177
- @use '@/assets/amelipro/apTokens2026' as apTokens;
177
+ @use '@/assets/overrides/breakpoints' as bp;
178
178
 
179
179
  :deep(.v-overlay__content) {
180
180
  top: 40px;
@@ -183,7 +183,7 @@
183
183
  z-index: 8;
184
184
  border-radius: 4px;
185
185
 
186
- @media #{apTokens.$media-up-md} {
186
+ @media #{bp.$up-md} {
187
187
  left: -800px;
188
188
  }
189
189
  }
@@ -52,7 +52,7 @@
52
52
  </template>
53
53
 
54
54
  <style lang="scss" scoped>
55
- @use '@/assets/amelipro/apTokens2026' as apTokens;
55
+ @use '@/assets/overrides/breakpoints' as bp;
56
56
 
57
57
  .v-btn {
58
58
  letter-spacing: unset;
@@ -74,10 +74,10 @@
74
74
  }
75
75
 
76
76
  &:focus {
77
- outline: 1px dotted apTokens.$ap-grey-darken1;
77
+ outline: 1px dotted rgb(var(--v-theme-ap-grey-darken-1));
78
78
  }
79
79
 
80
- @media #{apTokens.$media-only-xs} {
80
+ @media #{bp.$down-xs} {
81
81
  margin-bottom: 8px;
82
82
  width: 100% !important;
83
83
  }
@@ -87,7 +87,7 @@
87
87
  opacity: 1 !important;
88
88
 
89
89
  :deep(.v-btn__content) {
90
- color: apTokens.$ap-grey !important;
90
+ color: rgb(var(--v-theme-ap-grey)) !important;
91
91
  }
92
92
  }
93
93
  </style>
@@ -107,8 +107,6 @@
107
107
  </template>
108
108
 
109
109
  <style lang="scss" scoped>
110
- @use '@/assets/amelipro/apTokens2026' as apTokens;
111
-
112
110
  input {
113
111
  position: absolute;
114
112
  width: 0;
@@ -122,17 +120,17 @@ input {
122
120
 
123
121
  .hover-style {
124
122
  &:hover {
125
- background-color: apTokens.$ap-blue-lighten3 !important;
123
+ background-color: rgb(var(--v-theme-ap-blue-lighten-3)) !important;
126
124
  }
127
125
  }
128
126
 
129
127
  .selected-border {
130
- border: 1px solid apTokens.$ap-blue;
128
+ border: 1px solid rgb(var(--v-theme-ap-blue));
131
129
  }
132
130
 
133
131
  .structure {
134
- font-size: apTokens.$font-size-xs;
135
- color: apTokens.$ap-grey-darken1;
132
+ font-size: var(--v-ap-fontSizeXs);
133
+ color: rgb(var(--v-theme-ap-grey-darken-1));
136
134
 
137
135
  .name {
138
136
  font-weight: 600;
@@ -227,7 +227,7 @@
227
227
  </template>
228
228
 
229
229
  <style lang="scss" scoped>
230
- @use '@/assets/amelipro/apTokens2026' as apTokens;
230
+ @use '@/assets/overrides/breakpoints' as bp;
231
231
 
232
232
  .v-input.amelipro-switch {
233
233
  margin-top: 0;
@@ -237,7 +237,7 @@
237
237
  width: 50% !important;
238
238
  max-width: 50% !important;
239
239
 
240
- @media #{apTokens.$media-down-md} {
240
+ @media #{bp.$down-sm} {
241
241
  width: 100% !important;
242
242
  max-width: 100% !important;
243
243
  }
@@ -177,10 +177,10 @@
177
177
  </template>
178
178
 
179
179
  <style lang="scss" scoped>
180
- @use '@/assets/amelipro/apTokens2026' as apTokens;
180
+ @use '@/assets/overrides/breakpoints' as bp;
181
181
 
182
182
  .tabs-btn-wrapper {
183
- @media #{apTokens.$media-only-xs} {
183
+ @media #{bp.$down-xs} {
184
184
  width: 100% !important;
185
185
  }
186
186
  }
@@ -130,8 +130,6 @@
130
130
  </template>
131
131
 
132
132
  <style lang="scss" scoped>
133
- @use '@/assets/amelipro/apTokens2026' as apTokens;
134
-
135
133
  .v-btn :deep(.v-btn__content) {
136
134
  opacity: 1 !important;
137
135
  }
@@ -154,7 +152,7 @@
154
152
  }
155
153
 
156
154
  .user-menu-last-connexion {
157
- font-size: apTokens.$font-size-xs;
155
+ font-size: var(--v-ap-fontSizeXs);
158
156
  }
159
157
 
160
158
  .user-menu__btn--account,
@@ -0,0 +1,43 @@
1
+ import BackBtn from '../BackBtn.vue'
2
+
3
+ describe('BackBtn - Visual regression tests', () => {
4
+ it('displays the btn by default', () => {
5
+ cy.mountWithVuetify(BackBtn)
6
+
7
+ cy.get('.v-btn').should('be.visible')
8
+ cy.matchImageSnapshot('back-btn-default', cy.get('.v-btn'))
9
+ })
10
+
11
+ it('displays the btn without icon', () => {
12
+ cy.mountWithVuetify(BackBtn, {
13
+ props: { hideBackIcon: true },
14
+ })
15
+
16
+ cy.get('.v-btn').should('be.visible')
17
+ cy.matchImageSnapshot('back-btn-no-icon', cy.get('.v-btn'))
18
+ })
19
+
20
+ it('displays the btn in dark mode', () => {
21
+ cy.mountWithVuetify(BackBtn, {
22
+ props: {
23
+ dark: true,
24
+ },
25
+ })
26
+ cy.get('.v-application').invoke('css', 'background-color', '#121212')
27
+
28
+ cy.get('.v-btn').should('be.visible')
29
+ cy.get('.v-btn').matchImageSnapshot('back-btn-dark-mode', cy.get('.v-btn'))
30
+ cy.get('.v-application').invoke('css', 'background-color', '')
31
+ })
32
+
33
+ it('displays the btn with custom background', () => {
34
+ cy.mountWithVuetify(BackBtn, {
35
+ props: { backgroundColor: '#f5f5f5' },
36
+ })
37
+
38
+ cy.get('.v-btn').should('be.visible')
39
+ // cy.get('.v-btn').matchImageSnapshot('back-btn-custom-bg')
40
+ // take a snapshot of the button and not the whole page to avoid snapshotting the background color of the page
41
+ cy.matchImageSnapshot('back-btn-custom-bg', cy.get('.v-btn'))
42
+ })
43
+ })
@@ -300,8 +300,6 @@
300
300
  </template>
301
301
 
302
302
  <style scoped lang="scss">
303
- @use '@/assets/tokens';
304
-
305
303
  .label-options {
306
304
  font-size: 0.875rem;
307
305
  font-weight: 400;
@@ -310,7 +308,7 @@
310
308
  .captcha-audio :deep(.v-btn__content) span {
311
309
  display: flex;
312
310
  align-items: center;
313
- gap: tokens.$gap-2;
311
+ gap: var(--v-gap-2);
314
312
  letter-spacing: 0%;
315
313
  }
316
314
 
@@ -302,8 +302,6 @@
302
302
  </template>
303
303
 
304
304
  <style lang="scss" scoped>
305
- @use '@/assets/tokens';
306
-
307
305
  // Styles pour la liste HTML native
308
306
  .sy-chip-list ul {
309
307
  list-style: none;
@@ -342,30 +340,30 @@
342
340
  }
343
341
 
344
342
  .sy-chip-success {
345
- color: tokens.$colors-text-success !important;
346
- border: 1px solid tokens.$colors-border-success !important;
343
+ color: rgb(var(--v-theme-textSuccess)) !important;
344
+ border: 1px solid rgb(var(--v-theme-borderSuccess)) !important;
347
345
  }
348
346
 
349
347
  .sy-chip-error {
350
- color: tokens.$colors-text-error !important;
351
- border: 1px solid tokens.$colors-border-error !important;
348
+ color: rgb(var(--v-theme-textError)) !important;
349
+ border: 1px solid rgb(var(--v-theme-borderError)) !important;
352
350
  }
353
351
 
354
352
  .sy-chip-info {
355
- color: tokens.$colors-text-info !important;
356
- border: 1px solid tokens.$colors-border-info !important;
353
+ color: rgb(var(--v-theme-textInfo)) !important;
354
+ border: 1px solid rgb(var(--v-theme-borderInfo)) !important;
357
355
  }
358
356
 
359
357
  .sy-chip-warning {
360
- color: tokens.$colors-text-warning !important;
361
- border: 1px solid tokens.$colors-border-warning !important;
358
+ color: rgb(var(--v-theme-textWarning)) !important;
359
+ border: 1px solid rgb(var(--v-theme-borderWarning)) !important;
362
360
  }
363
361
 
364
362
  .overflow-chip {
365
363
  cursor: pointer;
366
364
 
367
365
  &:focus-visible {
368
- outline: 2px solid tokens.$primary-base !important;
366
+ outline: 2px solid rgb(var(--v-theme-primary)) !important;
369
367
  outline-offset: 2px !important;
370
368
  }
371
369
  }
@@ -377,27 +375,27 @@
377
375
 
378
376
  // Bouton "Réinitialiser le filtre" - améliorer le contraste de la bordure de focus
379
377
  .overflow-btn:focus-visible {
380
- outline: 2px solid tokens.$primary-base !important;
378
+ outline: 2px solid rgb(var(--v-theme-primary)) !important;
381
379
  }
382
380
 
383
381
  // Styles spécifiques pour améliorer le contraste de focus selon le thème du chip
384
382
  .sy-chip-success .remove-chip:focus-visible {
385
- outline: 2px solid tokens.$colors-border-success !important;
383
+ outline: 2px solid rgb(var(--v-theme-borderSuccess)) !important;
386
384
  outline-offset: -2px !important;
387
385
  }
388
386
 
389
387
  .sy-chip-info .remove-chip:focus-visible {
390
- outline: 2px solid tokens.$colors-border-info !important;
388
+ outline: 2px solid rgb(var(--v-theme-borderInfo)) !important;
391
389
  outline-offset: -2px !important;
392
390
  }
393
391
 
394
392
  .sy-chip-warning .remove-chip:focus-visible {
395
- outline: 2px solid tokens.$colors-border-warning !important;
393
+ outline: 2px solid rgb(var(--v-theme-borderWarning)) !important;
396
394
  outline-offset: -2px !important;
397
395
  }
398
396
 
399
397
  .sy-chip-error .remove-chip:focus-visible {
400
- outline: 2px solid tokens.$colors-border-error !important;
398
+ outline: 2px solid rgb(var(--v-theme-borderError)) !important;
401
399
  outline-offset: -2px !important;
402
400
  }
403
401
  </style>
@@ -180,8 +180,6 @@
180
180
  </template>
181
181
 
182
182
  <style lang="scss" scoped>
183
- @use '@/assets/tokens';
184
-
185
183
  details > summary {
186
184
  cursor: pointer;
187
185
  list-style: none;
@@ -125,8 +125,6 @@
125
125
  </template>
126
126
 
127
127
  <style lang="scss" scoped>
128
- @use '@/assets/tokens';
129
-
130
128
  .v-btn:deep() {
131
129
  .v-btn__underlay,
132
130
  .v-btn__overlay {
@@ -143,6 +141,6 @@
143
141
  }
144
142
 
145
143
  .v-btn--icon .v-icon {
146
- color: tokens.$grey-lighten-20;
144
+ color: rgb(var(--v-theme-grey-lighten20));
147
145
  }
148
146
  </style>
@@ -35,7 +35,7 @@
35
35
  (e: 'update:error-messages', value: string[] | undefined): void
36
36
  }>()
37
37
 
38
- const internalValue = ref<SelectBtnValue>(null)
38
+ const internalValue = ref<SelectBtnValue>(props.multiple ? [] : null)
39
39
  const darktheme = ref<boolean>(false)
40
40
  const listRef = ref<HTMLElement | null>(null)
41
41
  const optionsRef = ref<Array<HTMLElement>>([])
@@ -48,11 +48,12 @@
48
48
  })
49
49
 
50
50
  watch(() => props.modelValue, (value) => {
51
- if (value === null && props.multiple) {
52
- internalValue.value = []
53
- return
51
+ if (props.multiple) {
52
+ internalValue.value = Array.isArray(value) ? value : []
53
+ }
54
+ else {
55
+ internalValue.value = value ?? null
54
56
  }
55
- internalValue.value = value
56
57
  }, {
57
58
  immediate: true,
58
59
  deep: true,
@@ -79,10 +80,12 @@
79
80
 
80
81
  function getNewValue(item: SelectBtnItem): SelectBtnValue {
81
82
  if (props.multiple) {
82
- const typedValue = internalValue.value as Array<string | number>
83
+ const typedValue = Array.isArray(internalValue.value)
84
+ ? internalValue.value
85
+ : []
83
86
 
84
87
  // if the item is unique, select only it
85
- if (item.unique && typedValue.includes(item.value) === false) {
88
+ if (item.unique && !typedValue.includes(item.value)) {
86
89
  return [item.value]
87
90
  }
88
91
 
@@ -199,8 +202,7 @@
199
202
  // Don't auto-select if focus was caused by mouse interaction
200
203
  if (isMouseInteraction.value) {
201
204
  const element = e.target as HTMLElement
202
- const index = optionsRef.value.findIndex(item => item === element)
203
- focusedIndex.value = index
205
+ focusedIndex.value = optionsRef.value.findIndex(item => item === element)
204
206
  return
205
207
  }
206
208
 
@@ -265,7 +267,7 @@
265
267
  }"
266
268
  role="option"
267
269
  :tabindex="index === focusedIndex ? '0' : '-1'"
268
- :aria-selected="!props.multiple ? (isSelected(item.value) ? 'true' : 'false') : undefined"
270
+ :aria-selected="props.multiple ? undefined : (isSelected(item.value) ? 'true' : 'false')"
269
271
  :aria-checked="props.multiple ? (isSelected(item.value) ? 'true' : 'false') : undefined"
270
272
  @keydown.space.prevent="toggleItem(item)"
271
273
  @mousedown="handleMouseDown"
@@ -308,14 +310,12 @@
308
310
  </template>
309
311
 
310
312
  <style lang="scss" scoped>
311
- @use '@/assets/tokens';
312
-
313
313
  .select-btn-field__options {
314
314
  display: flex;
315
315
  list-style-type: none;
316
316
  padding: 0;
317
317
  margin: 0;
318
- gap: tokens.$gap-2;
318
+ gap: var(--v-gap-2);
319
319
  }
320
320
 
321
321
  .select-btn-field__options--inline {
@@ -335,10 +335,10 @@
335
335
  cursor: pointer;
336
336
  position: relative;
337
337
  transition: background-color 0.2s, color 0.2s;
338
- background-color: #fff;
338
+ background-color: rgb(var(--v-theme-surface));
339
339
 
340
340
  &--selected {
341
- color: #fff;
341
+ color: rgb(var(--v-theme-textOnDark));
342
342
  background-color: rgb(var(--v-theme-primary));
343
343
  }
344
344
 
@@ -377,7 +377,7 @@
377
377
  }
378
378
 
379
379
  .select-btn-field__options--error .select-btn-field__item {
380
- color: tokens.$colors-text-error;
381
- border-color: tokens.$colors-border-error;
380
+ color: rgb(var(--v-theme-textError));
381
+ border-color: rgb(var(--v-theme-borderError));
382
382
  }
383
383
  </style>
@@ -118,6 +118,37 @@ describe('SelectBtnField', () => {
118
118
  ])
119
119
  })
120
120
 
121
+ it('handles multiple mode safely when modelValue is null', async () => {
122
+ const wrapper = mount(SelectBtnField, {
123
+ props: {
124
+ label: 'Test',
125
+ hint: 'Test',
126
+ items: [
127
+ {
128
+ text: 'Test',
129
+ value: 'test',
130
+ },
131
+ {
132
+ text: 'Test 2',
133
+ value: 'test2',
134
+ },
135
+ {
136
+ text: 'Test 3',
137
+ value: 'test3',
138
+ },
139
+ ],
140
+ multiple: true,
141
+ modelValue: null,
142
+ },
143
+ })
144
+
145
+ await wrapper.find('[role="option"]').trigger('click')
146
+
147
+ expect(wrapper.emitted('update:modelValue')).toEqual([
148
+ [['test']],
149
+ ])
150
+ })
151
+
121
152
  it(`display correctly with an error`, () => {
122
153
  const wrapper = mount(SelectBtnField, {
123
154
  props: {
@@ -125,6 +125,10 @@ const meta: Meta<typeof SyAutocomplete> = {
125
125
  action: 'update:modelValue',
126
126
  description: 'Émis lors de la sélection d\'une option. Reçoit la valeur sélectionnée.',
127
127
  },
128
+ 'disabled': {
129
+ control: 'boolean',
130
+ description: 'Désactive le champ',
131
+ },
128
132
  'readonly': {
129
133
  control: 'boolean',
130
134
  description: 'Rend le champ en lecture seule',
@@ -1199,6 +1203,68 @@ const items = [
1199
1203
  },
1200
1204
  }
1201
1205
 
1206
+ export const DisabledField: Story = {
1207
+ parameters: {
1208
+ sourceCode: [
1209
+ {
1210
+ name: 'Template',
1211
+ code: `
1212
+ <template>
1213
+ <SyAutocomplete
1214
+ v-model="selectedValue"
1215
+ :items="items"
1216
+ label="Champ désactivé"
1217
+ disabled
1218
+ />
1219
+ </template>
1220
+ `,
1221
+ },
1222
+ {
1223
+ name: 'Script',
1224
+ code: `
1225
+ <script setup lang="ts">
1226
+ import { ref } from 'vue'
1227
+ import { SyAutocomplete } from '@cnamts/synapse'
1228
+
1229
+ const selectedValue = ref('Axel')
1230
+ const items = [
1231
+ { text: 'Adrien', value: 'Adrien' },
1232
+ { text: 'Axel', value: 'Axel' },
1233
+ { text: 'Baptiste', value: 'Baptiste' },
1234
+ ]
1235
+ </script>
1236
+ `,
1237
+ },
1238
+ ],
1239
+ },
1240
+ args: {
1241
+ items: [
1242
+ { text: 'Adrien', value: 'Adrien' },
1243
+ { text: 'Axel', value: 'Axel' },
1244
+ { text: 'Baptiste', value: 'Baptiste' },
1245
+ ],
1246
+ label: 'Champ désactivé',
1247
+ disabled: true,
1248
+ },
1249
+ render: (args) => {
1250
+ return {
1251
+ components: { SyAutocomplete },
1252
+ setup() {
1253
+ const selectedValue = ref('Axel')
1254
+ return { args, selectedValue }
1255
+ },
1256
+ template: `
1257
+ <div class="pa-4">
1258
+ <SyAutocomplete
1259
+ v-model="selectedValue"
1260
+ v-bind="args"
1261
+ />
1262
+ </div>
1263
+ `,
1264
+ }
1265
+ },
1266
+ }
1267
+
1202
1268
  export const WithCustomKeys: Story = {
1203
1269
  parameters: {
1204
1270
 
@@ -123,6 +123,10 @@
123
123
  type: String,
124
124
  default: '',
125
125
  },
126
+ disabled: {
127
+ type: Boolean,
128
+ default: false,
129
+ },
126
130
  readonly: {
127
131
  type: Boolean,
128
132
  default: false,
@@ -420,6 +424,7 @@
420
424
  }
421
425
 
422
426
  const openAndFocus = () => {
427
+ if (props.disabled || props.readonly) return
423
428
  markInteracted()
424
429
  isOpen.value = true
425
430
  focusInput(textFieldRef)
@@ -488,6 +493,7 @@
488
493
  :placeholder="hasInlineSelections || hasSelectionTextDisplay ? '' : placeholder"
489
494
  :is-active="hasInlineSelections || hasSelectionTextDisplay"
490
495
  :readonly="readonly"
496
+ :disabled="disabled"
491
497
  :bg-color="bgColor"
492
498
  :density="density"
493
499
  :autocomplete="'off'"
@@ -627,8 +633,6 @@
627
633
  </template>
628
634
 
629
635
  <style scoped lang="scss">
630
- @use '@/assets/tokens';
631
-
632
636
  .sy-autocomplete {
633
637
  width: 100%;
634
638
  position: relative;
@@ -724,7 +728,7 @@ li:hover {
724
728
  .v-list-item.keyboard-focused,
725
729
  li:focus-visible,
726
730
  li.keyboard-focused {
727
- outline: 2px solid rgb(var(--v-theme-accentPrimary));
731
+ outline: 2px solid rgb(var(--v-theme-borderAccentPrimary));
728
732
  outline-offset: -2px;
729
733
  background-color: rgb(0 0 0 / 8%);
730
734
  }
@@ -146,6 +146,24 @@ describe('SyAutocomplete – accessibility (axe)', () => {
146
146
  })
147
147
  })
148
148
 
149
+ it('has no obvious axe violations for disabled field', async () => {
150
+ const wrapper = mount(SyAutocomplete, {
151
+ props: {
152
+ modelValue: 'Option 1',
153
+ items,
154
+ label: 'Champ désactivé',
155
+ textKey: 'text',
156
+ valueKey: 'value',
157
+ disabled: true,
158
+ },
159
+ })
160
+
161
+ const results = await axe(wrapper.element as HTMLElement)
162
+ assertNoA11yViolations(results, 'SyAutocomplete – disabled field', {
163
+ ignoreRules: ['region'],
164
+ })
165
+ })
166
+
149
167
  it('has no obvious axe violations when hideDetails is true', async () => {
150
168
  const wrapper = mount(SyAutocomplete, {
151
169
  props: {