@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
@@ -1,8 +1,34 @@
1
1
  import axios from 'axios'
2
- import { onMounted, ref } from 'vue'
2
+ import { onMounted, shallowRef } from 'vue'
3
3
  import * as marked from 'marked'
4
4
  import SyAlert from '../../components/SyAlert/SyAlert.vue'
5
5
 
6
+ type GitHubRelease = {
7
+ id: number
8
+ name?: string | null
9
+ tag_name?: string | null
10
+ published_at: string
11
+ body?: string | null
12
+ }
13
+
14
+ type ReleaseAlert = {
15
+ id: string
16
+ releaseVersion: string
17
+ message: string
18
+ type: 'success' | 'info' | 'warning' | 'error'
19
+ variant: 'tonal' | 'outlined'
20
+ }
21
+
22
+ const releaseAlerts: ReleaseAlert[] = [
23
+ {
24
+ id: 'starter-kit-2-0-32',
25
+ releaseVersion: 'v1.0.24',
26
+ message: 'Il est conseillé de faire une montée de version du Starter Kit en 2.0.32',
27
+ type: 'warning',
28
+ variant: 'tonal',
29
+ },
30
+ ]
31
+
6
32
  export default {
7
33
  title: 'Démarrer/Releases',
8
34
  component: SyAlert,
@@ -12,8 +38,8 @@ export const List = {
12
38
  return {
13
39
  components: { SyAlert },
14
40
  setup() {
15
- const releases = ref([])
16
- const errorMessage = ref('')
41
+ const releases = shallowRef<GitHubRelease[]>([])
42
+ const errorMessage = shallowRef('')
17
43
 
18
44
  const fetchReleases = async () => {
19
45
  try {
@@ -30,8 +56,14 @@ export const List = {
30
56
  return new Date(date).toLocaleDateString()
31
57
  }
32
58
 
33
- const formatMarkdown = (markdown: string) => {
34
- return marked.parse(markdown)
59
+ const formatMarkdown = (markdown?: string | null) => {
60
+ return marked.parse(markdown ?? '')
61
+ }
62
+
63
+ const getReleaseAlerts = (release: GitHubRelease) => {
64
+ return releaseAlerts.filter(alert =>
65
+ [release.name, release.tag_name].some(value => value?.includes(alert.releaseVersion)),
66
+ )
35
67
  }
36
68
 
37
69
  onMounted(() => {
@@ -43,6 +75,7 @@ export const List = {
43
75
  errorMessage,
44
76
  formatDate,
45
77
  formatMarkdown,
78
+ getReleaseAlerts,
46
79
  }
47
80
  },
48
81
  template: `
@@ -60,6 +93,16 @@ export const List = {
60
93
  <div v-else>
61
94
  <div v-for="release in releases" :key="release.id">
62
95
  <h2>{{ release.name }} ({{ formatDate(release.published_at) }})</h2>
96
+ <SyAlert
97
+ v-for="alert in getReleaseAlerts(release)"
98
+ :key="alert.id"
99
+ :type="alert.type"
100
+ :variant="alert.variant"
101
+ :closable="false"
102
+ class="mt-2 mb-4"
103
+ >
104
+ <template #default>{{ alert.message }}</template>
105
+ </SyAlert>
63
106
  <div v-html="formatMarkdown(release.body)"></div>
64
107
  <hr>
65
108
  </div>
@@ -2,6 +2,7 @@
2
2
  /* eslint-disabled vuejs-accessibility/anchor-has-content */
3
3
  import SyHeading from '@/components/SyHeading/SyHeading.vue'
4
4
  import { computed } from 'vue'
5
+ import { useTheme } from 'vuetify'
5
6
  import { VContainer, VRow, VCol, VCard, VCardTitle, VCardSubtitle } from 'vuetify/components'
6
7
 
7
8
  interface Props {
@@ -17,16 +18,16 @@
17
18
  }
18
19
 
19
20
  const props = defineProps<Props>()
21
+ const theme = useTheme()
20
22
 
21
- const theme = computed(() => typeof window !== 'undefined' ? localStorage.getItem('storybook-theme') : 'cnam')
22
23
  const displayColors = computed(() => {
23
- if (theme.value === 'pa') {
24
+ if (theme.global.name.value === 'pa') {
24
25
  return props.paColors
25
26
  }
26
- if (theme.value === 'ap') {
27
+ if (theme.global.name.value === 'ap') {
27
28
  return props.apColors
28
29
  }
29
- if (theme.value === 'ap2026') {
30
+ if (theme.global.name.value === 'ap2026') {
30
31
  return props.apColors2026
31
32
  }
32
33
  return props.cnamColors
@@ -42,7 +43,7 @@
42
43
  <div
43
44
  v-if="!isEmptyObject(displayColors) ||
44
45
  (isEmptyObject(displayColors) && displayEmptyColors &&
45
- !['ap2026', 'ap', 'cnam', 'pa'].includes(theme ?? ''))"
46
+ !['ap2026', 'ap', 'cnam', 'pa'].includes(theme.global.name.value))"
46
47
  class="mb-5"
47
48
  >
48
49
  <SyHeading
@@ -26,7 +26,7 @@
26
26
  <pre style="margin: 0; font-size: 12px; color: #333;"><code>@use '@cnamts/synapse/assets/tokens' as tokens;
27
27
 
28
28
  .my-color {
29
- color: tokens.$yellow-lighten-40 !important;
29
+ color: rgb(var(--v-theme-yellow-lighten40)) !important;
30
30
  }</code></pre>
31
31
  </div>
32
32
  </div>
@@ -35,9 +35,7 @@
35
35
  </template>
36
36
 
37
37
  <style lang="scss" scoped>
38
- @use '@/assets/tokens' as tokens;
39
-
40
38
  .my-color {
41
- color: tokens.$yellow-lighten-40 !important;
39
+ color: rgb(var(--v-theme-yellow-lighten40)) !important;
42
40
  }
43
41
  </style>
@@ -61,11 +61,7 @@ export const Theme: StoryObj = {
61
61
  render: () => {
62
62
  return {
63
63
  setup() {
64
- const theme = computed<ThemeKey>(() => {
65
- const value
66
- = typeof window !== 'undefined' ? localStorage.getItem('storybook-theme') : 'cnam'
67
- return (value as ThemeKey) ?? 'cnam'
68
- })
64
+ const theme = useTheme()
69
65
 
70
66
  const themeLabels: Record<ThemeKey, string> = {
71
67
  cnam: 'Assurance Maladie',
@@ -74,7 +70,10 @@ export const Theme: StoryObj = {
74
70
  ap2026: 'AmeliPro',
75
71
  }
76
72
 
77
- const themeLabel = computed(() => themeLabels[theme.value])
73
+ const themeLabel = computed(() => {
74
+ const currentTheme = theme.global.name.value as ThemeKey
75
+ return themeLabels[currentTheme] ?? themeLabels.cnam
76
+ })
78
77
 
79
78
  return {
80
79
  themeLabel,
@@ -0,0 +1,95 @@
1
+ import { Meta, Source } from '@storybook/addon-docs/blocks';
2
+ import '../styles/shared.css';
3
+
4
+ <Meta title="Guide Du Dev/createVuetifyInstance" />
5
+
6
+ <div className="header">
7
+ <h1>createVuetifyInstance</h1>
8
+ </div>
9
+
10
+ `createVuetifyInstance` est une fonction exportée par le design system qui retourne une instance Vuetify pré-configurée avec l'ensemble des thèmes, icônes et options propres à l'écosystème CNAM/PA/Amelipro.
11
+
12
+ Elle remplace l'appel manuel à `createVuetify` et garantit une configuration cohérente entre tous les projets.
13
+
14
+ ## Importation
15
+
16
+ <Source dark code={`import { createVuetifyInstance } from '@cnamts/synapse/vuetifyConfig'`} />
17
+
18
+ > **Note** : il s'agit d'un point d'entrée dédié (`/vuetifyConfig`), distinct de l'import principal `@cnamts/synapse`.
19
+
20
+ ## Utilisation dans `main.ts`
21
+
22
+ <Source dark code={`
23
+ import 'vuetify/styles'
24
+ import { createApp } from 'vue'
25
+ import App from './App.vue'
26
+ import { createVuetifyInstance } from '@cnamts/synapse/vuetifyConfig'
27
+
28
+ const vuetify = createVuetifyInstance()
29
+
30
+ createApp(App)
31
+ .use(vuetify)
32
+ .mount('#app')
33
+ `} />
34
+
35
+ ## Thèmes disponibles
36
+
37
+ L'instance inclut les thèmes suivants, utilisables via la prop `theme` sur un composant ou via `defaultTheme` :
38
+
39
+ <table>
40
+ <thead>
41
+ <tr>
42
+ <th>Identifiant</th>
43
+ <th>Application</th>
44
+ </tr>
45
+ </thead>
46
+ <tbody>
47
+ <tr>
48
+ <td><code>cnam</code></td>
49
+ <td>CNAM (défaut)</td>
50
+ </tr>
51
+ <tr>
52
+ <td><code>pa</code></td>
53
+ <td>Portail Agent</td>
54
+ </tr>
55
+ <tr>
56
+ <td><code>ap</code></td>
57
+ <td>Amelipro</td>
58
+ </tr>
59
+ </tbody>
60
+ </table>
61
+
62
+ ## Changer le thème par défaut
63
+
64
+ Pour appliquer un thème différent de `cnam`, passez l'identifiant souhaité à la prop `theme` du composant racine ou via la configuration Vuetify.
65
+
66
+ ### Via le composant racine (recommandé)
67
+
68
+ <Source dark code={`
69
+ <template>
70
+ <VApp theme="pa">
71
+ <!-- votre application -->
72
+ </VApp>
73
+ </template>
74
+ `} />
75
+
76
+ ### Via la configuration Vuetify (alternative)
77
+
78
+ Si vous devez forcer le thème globalement sans modifier le composant racine, vous pouvez accéder à l'instance Vuetify après création :
79
+
80
+ <Source dark code={`
81
+ import { createVuetifyInstance } from '@cnamts/synapse/vuetifyConfig'
82
+
83
+ const vuetify = createVuetifyInstance()
84
+ vuetify.theme.global.name.value = 'pa'
85
+ `} />
86
+
87
+ ## Ce que la fonction configure
88
+
89
+ `createVuetifyInstance` encapsule les éléments suivants :
90
+
91
+ - **Tous les composants et directives Vuetify** (`vuetify/components`, `vuetify/directives`)
92
+ - **Icônes MDI** via `mdi-svg`
93
+ - **Locale française** (`fr`)
94
+ - **Tokens de design** : couleurs, typographie et variables CSS injectées pour chaque thème
95
+ - **Trois thèmes complets** : `cnam`, `pa`, `ap`
@@ -10,39 +10,49 @@ import '../styles/shared.css';
10
10
  </div>
11
11
 
12
12
  Le thème par défaut du Starter kit est celui de la Cnam par défaut.
13
- Si votre projet dépend du Portail Agent, il vous faudra modifier la configuration pour appliquer le thème spécifique à votre ligne de fabrication.
14
-
15
- ## Étapes pour changer le thème du Design System
16
-
17
- ### 1. Modification du fichier main.ts
18
-
19
- 1. Ouvrez le fichier `src/main.ts` dans votre éditeur de code.
20
- 2. Remplacez la valeur de `defaultTheme` par le thème qui correspond à votre projet :
21
- - `cnam` : CNAM
22
- - `pa` : Portail Agent
23
- - `ap2026` : Amelipro
13
+ Si votre projet dépend du Portail Agent ou d'Amelipro, appliquez le thème correspondant à votre ligne de fabrication.
14
+
15
+ Pour configurer Vuetify et changer le thème, utilisez `createVuetifyInstance` — consultez la page [createVuetifyInstance](/docs/guide-du-dev-createvuetifyinstance--docs) pour le détail complet.
16
+
17
+ ## Résumé des thèmes disponibles
18
+
19
+ <table>
20
+ <thead>
21
+ <tr>
22
+ <th>Identifiant</th>
23
+ <th>Application</th>
24
+ </tr>
25
+ </thead>
26
+ <tbody>
27
+ <tr>
28
+ <td><code>cnam</code></td>
29
+ <td>CNAM (défaut)</td>
30
+ </tr>
31
+ <tr>
32
+ <td><code>pa</code></td>
33
+ <td>Portail Agent</td>
34
+ </tr>
35
+ <tr>
36
+ <td><code>ap</code></td>
37
+ <td>Amelipro</td>
38
+ </tr>
39
+ </tbody>
40
+ </table>
41
+
42
+ ## Appliquer le thème dans le composant racine
24
43
 
25
44
  <Source dark code={`
26
- import { createApp } from '
27
- import '../styles/shared.css';vue';
28
- ...
29
-
30
- const vuetify = createVuetify({
31
- theme: {
32
- defaultTheme: 'pa',
33
- ...
34
-
45
+ <template>
46
+ <VApp theme="pa">
47
+ <!-- votre application -->
48
+ </VApp>
49
+ </template>
35
50
  `}
36
51
  />
37
52
 
38
- ### 2. Relancer le projet
53
+ Après avoir modifié le thème, relancez le serveur de développement :
39
54
 
40
- Après avoir effectué les modifications dans le fichier de configuration, relancez le serveur de développement pour appliquer les changements :
41
55
  <Source dark code={`
42
56
  pnpm dev
43
57
  `}
44
58
  />
45
-
46
- ### 3. Vérification
47
-
48
- Une fois le projet redémarré, vérifiez que la charte PA est bien appliquée.
@@ -13,12 +13,13 @@ import '../styles/shared.css';
13
13
  ## Importation et utilisation
14
14
 
15
15
  <Source dark code={`
16
- import { useNotificationService } from '
17
- import '../styles/shared.css';@cnamts/synapse'
16
+ import { useNotificationService } from '@cnamts/synapse/modules/notification'
18
17
 
19
18
  const { notificationQueue, addNotification, removeNotification, clearQueue } = useNotificationService()
20
19
  `} />
21
20
 
21
+ > L'entrée `@cnamts/synapse/modules/notification` est déclarée explicitement dans les exports du package.
22
+
22
23
  ## Propriétés et méthodes :
23
24
 
24
25
  <Source dark code={`
@@ -76,7 +76,7 @@
76
76
  .criteria-header h3 {
77
77
  margin: 0;
78
78
  font-size: 1.4rem;
79
- color: #1976d2;
79
+ color: rgb(var(--v-theme-primary));
80
80
  margin-top: 0.5rem !important;
81
81
  margin-bottom: 0.5rem !important;
82
82
  }
@@ -131,14 +131,14 @@
131
131
  }
132
132
 
133
133
  .resources-section a {
134
- color: #1976d2;
134
+ color: rgb(var(--v-theme-primary));
135
135
  text-decoration: none;
136
136
  border-bottom: 1px dotted;
137
137
  transition: color 0.2s ease;
138
138
  }
139
139
 
140
140
  .resources-section a:hover {
141
- color: #0d47a1;
141
+ color: rgb(var(--v-theme-secondary));
142
142
  }
143
143
 
144
144
  @media (width <= 768px) {
@@ -1,38 +1,10 @@
1
1
  import { apLightTheme2026 } from '@/designTokens/tokens/amelipro/apLightTheme2026'
2
2
  import { apColorsTokens2026 } from '@/designTokens/tokens/amelipro/apColors2026'
3
3
  import { AmeliproColors } from './ameliproColors/ameliproColors'
4
+ import { createHexResolver } from './createHexResolver'
4
5
 
5
- const currentTheme = apLightTheme2026
6
- const ameliproColors = AmeliproColors
7
- const colors = apColorsTokens2026 as unknown as Record<string, Record<string, string>>
8
- export function classToHex(color: string): string | undefined {
9
- color = color.trim()
10
- color = color.replace(/-./, x => x[1]!.toUpperCase())
11
- color = color.replace('-', ' ')
12
- // eslint-disable-next-line prefer-const
13
- let [colorName, colorModifier] = color.split(' ', 2) as (string | undefined)[]
14
- colorModifier = colorModifier?.replace('-', '')
15
- let fullColorName = ''
16
- let hexColor: string | undefined = undefined
17
- if (colorName && colorName in colors) {
18
- if (colorModifier && colorModifier in colors[colorName]!) {
19
- hexColor = colors[colorName]![colorModifier]!
20
- }
21
- else if ('base' in colors[colorName]!) {
22
- hexColor = colors[colorName].base
23
- }
24
- }
25
- else if (colorName && colorName in currentTheme) {
26
- hexColor = currentTheme[colorName]
27
- }
28
- else if (color && colorName) {
29
- if (colorModifier === undefined) {
30
- fullColorName = colorName
31
- }
32
- else {
33
- fullColorName = colorName + colorModifier
34
- }
35
- hexColor = ameliproColors[fullColorName]?.hexColor
36
- }
37
- return hexColor
38
- }
6
+ export const classToHex = createHexResolver(
7
+ apLightTheme2026,
8
+ apColorsTokens2026 as unknown as Record<string, Record<string, string>>,
9
+ AmeliproColors,
10
+ )
@@ -0,0 +1,45 @@
1
+ type Theme = Record<string, string>
2
+ type ColorsMap = Record<string, Record<string, string>>
3
+ type LegacyColors = Record<string, { hexColor: string }>
4
+
5
+ /**
6
+ * Creates a resolver that converts a color class name (e.g. "ap-blue-lighten-1")
7
+ * into a hex value for the given theme and color palette.
8
+ *
9
+ * Lookup order:
10
+ * 1. colors map: colorName + optional modifier (e.g. apBlue.lighten1)
11
+ * 2. theme map: direct key lookup (e.g. primary, secondary)
12
+ * 3. legacyColors map: flat key lookup (e.g. apBluelighten1.hexColor)
13
+ */
14
+ export function createHexResolver(
15
+ theme: Theme,
16
+ colors: ColorsMap,
17
+ legacyColors?: LegacyColors,
18
+ ): (color: string) => string | undefined {
19
+ return function resolveHex(color: string): string | undefined {
20
+ color = color.trim()
21
+ color = color.replace(/-./, x => x[1]!.toUpperCase())
22
+ color = color.replace('-', ' ')
23
+
24
+ // eslint-disable-next-line prefer-const
25
+ let [colorName, colorModifier] = color.split(' ', 2) as (string | undefined)[]
26
+ colorModifier = colorModifier?.replace('-', '')
27
+
28
+ if (colorName && colorName in colors) {
29
+ if (colorModifier && colorModifier in colors[colorName]!)
30
+ return colors[colorName]![colorModifier]!
31
+ if ('base' in colors[colorName]!)
32
+ return colors[colorName].base
33
+ }
34
+
35
+ if (colorName && colorName in theme)
36
+ return theme[colorName]
37
+
38
+ if (legacyColors && colorName) {
39
+ const fullColorName = colorModifier === undefined ? colorName : colorName + colorModifier
40
+ return legacyColors[fullColorName]?.hexColor
41
+ }
42
+
43
+ return undefined
44
+ }
45
+ }
@@ -0,0 +1,36 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import { classToHex } from '../classToHex'
3
+
4
+ describe('classToHex', () => {
5
+ it('resolves a camelCase color name to its base hex value', () => {
6
+ expect(classToHex('apBlue')).toBe('#0C419A')
7
+ })
8
+
9
+ it('resolves a kebab-case color name', () => {
10
+ expect(classToHex('ap-blue')).toBe('#0C419A')
11
+ })
12
+
13
+ it('resolves a color name with a modifier', () => {
14
+ expect(classToHex('ap-blue-darken-1')).toBe('#00749C')
15
+ })
16
+
17
+ it('falls back to base when modifier is not found', () => {
18
+ expect(classToHex('ap-blue-unknown')).toBe('#0C419A')
19
+ })
20
+
21
+ it('resolves theme keys like "primary"', () => {
22
+ expect(classToHex('primary')).toBe('#00749C')
23
+ })
24
+
25
+ it('resolves legacy color names via AmeliproColors', () => {
26
+ expect(classToHex('apBluelighten1')).toBe('#99DBF2')
27
+ })
28
+
29
+ it('returns undefined for completely unknown color', () => {
30
+ expect(classToHex('not-a-color')).toBeUndefined()
31
+ })
32
+
33
+ it('trims whitespace from input', () => {
34
+ expect(classToHex(' apBlue ')).toBe('#0C419A')
35
+ })
36
+ })
@@ -0,0 +1,31 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import { convertToHex } from '../convertToHex'
3
+
4
+ describe('convertToHex', () => {
5
+ it('returns the color as-is when it is a valid CSS color', () => {
6
+ expect(convertToHex('#fff')).toBe('#fff')
7
+ expect(convertToHex('#0c419a')).toBe('#0c419a')
8
+ expect(convertToHex('rgb(0, 0, 0)')).toBe('rgb(0, 0, 0)')
9
+ expect(convertToHex('var(--color-primary)')).toBe('var(--color-primary)')
10
+ })
11
+
12
+ it('converts "white" to #FFF', () => {
13
+ expect(convertToHex('white')).toBe('#FFF')
14
+ })
15
+
16
+ it('converts "black" to #000', () => {
17
+ expect(convertToHex('black')).toBe('#000')
18
+ })
19
+
20
+ it('converts "transparent" to transparent', () => {
21
+ expect(convertToHex('transparent')).toBe('transparent')
22
+ })
23
+
24
+ it('returns #000 for undefined', () => {
25
+ expect(convertToHex(undefined)).toBe('#000')
26
+ })
27
+
28
+ it('returns #000 for unknown class names', () => {
29
+ expect(convertToHex('not-a-real-color-class')).toBe('#000')
30
+ })
31
+ })
@@ -0,0 +1,66 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import { createHexResolver } from '../createHexResolver'
3
+
4
+ const colors = {
5
+ apBlue: { base: '#0c419a', darken1: '#00749c', lighten1: '#99dbf2' },
6
+ apRed: { base: '#b33f2e' },
7
+ }
8
+
9
+ const theme = {
10
+ primary: '#00749c',
11
+ secondary: '#00516d',
12
+ }
13
+
14
+ const legacy = {
15
+ apBluelighten1: { hexColor: '#99dbf2' },
16
+ apBlue: { hexColor: '#0c419a' },
17
+ }
18
+
19
+ describe('createHexResolver', () => {
20
+ it('resolves a color name to its base value', () => {
21
+ const resolve = createHexResolver(theme, colors)
22
+ expect(resolve('apBlue')).toBe('#0c419a')
23
+ })
24
+
25
+ it('resolves a color name with a modifier', () => {
26
+ const resolve = createHexResolver(theme, colors)
27
+ // "ap-blue-darken-1" → apBlue.darken1
28
+ expect(resolve('ap-blue-darken-1')).toBe('#00749c')
29
+ })
30
+
31
+ it('falls back to base when modifier is not found', () => {
32
+ const resolve = createHexResolver(theme, colors)
33
+ // "ap-blue-unknownmod": first -b→B gives "apBlue-unknownmod",
34
+ // then first -→space gives "apBlue unknownmod" → modifier not found → falls back to base
35
+ expect(resolve('ap-blue-unknownmod')).toBe('#0c419a')
36
+ })
37
+
38
+ it('falls back to theme map', () => {
39
+ const resolve = createHexResolver(theme, colors)
40
+ expect(resolve('primary')).toBe('#00749c')
41
+ expect(resolve('secondary')).toBe('#00516d')
42
+ })
43
+
44
+ it('falls back to legacyColors map', () => {
45
+ const resolve = createHexResolver(theme, colors, legacy)
46
+ expect(resolve('ap-blue-lighten-1')).toBe('#99dbf2')
47
+ })
48
+
49
+ it('returns undefined for unknown color', () => {
50
+ const resolve = createHexResolver(theme, colors)
51
+ expect(resolve('nonexistent-color')).toBeUndefined()
52
+ })
53
+
54
+ it('trims whitespace from input', () => {
55
+ const resolve = createHexResolver(theme, colors)
56
+ expect(resolve(' apBlue ')).toBe('#0c419a')
57
+ })
58
+
59
+ it('is independent — two resolvers with different themes return different values', () => {
60
+ const theme2 = { primary: '#ff0000' }
61
+ const resolveA = createHexResolver(theme, colors)
62
+ const resolveB = createHexResolver(theme2, colors)
63
+ expect(resolveA('primary')).toBe('#00749c')
64
+ expect(resolveB('primary')).toBe('#ff0000')
65
+ })
66
+ })
@@ -0,0 +1,48 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import { isCssColor } from '../isCssColor'
3
+
4
+ describe('isCssColor', () => {
5
+ it('returns true for hex colors', () => {
6
+ expect(isCssColor('#fff')).toBe(true)
7
+ expect(isCssColor('#ffffff')).toBe(true)
8
+ expect(isCssColor('#FF0000')).toBe(true)
9
+ })
10
+
11
+ it('returns true for rgb/rgba colors', () => {
12
+ expect(isCssColor('rgb(0, 0, 0)')).toBe(true)
13
+ expect(isCssColor('rgba(0, 0, 0, 0.5)')).toBe(true)
14
+ })
15
+
16
+ it('returns true for hsl/hsla colors', () => {
17
+ expect(isCssColor('hsl(0, 0%, 0%)')).toBe(true)
18
+ expect(isCssColor('hsla(0, 0%, 0%, 0.5)')).toBe(true)
19
+ })
20
+
21
+ it('returns true for CSS custom properties', () => {
22
+ expect(isCssColor('var(--color-primary)')).toBe(true)
23
+ expect(isCssColor('var(--my-color)')).toBe(true)
24
+ })
25
+
26
+ it('returns false for named colors', () => {
27
+ expect(isCssColor('red')).toBe(false)
28
+ expect(isCssColor('white')).toBe(false)
29
+ expect(isCssColor('transparent')).toBe(false)
30
+ })
31
+
32
+ it('returns false for class-like strings', () => {
33
+ expect(isCssColor('primary')).toBe(false)
34
+ expect(isCssColor('ap-blue-base')).toBe(false)
35
+ })
36
+
37
+ it('returns false for undefined', () => {
38
+ expect(isCssColor(undefined)).toBe(false)
39
+ })
40
+
41
+ it('returns false for false', () => {
42
+ expect(isCssColor(false)).toBe(false)
43
+ })
44
+
45
+ it('returns false for empty string', () => {
46
+ expect(isCssColor('')).toBe(false)
47
+ })
48
+ })