@cnamts/synapse 1.0.24 → 1.0.26

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 (493) hide show
  1. package/README.md +27 -5
  2. package/dist/{AutocompleteFilter-BWLR3U7W.js → AutocompleteFilter-BPR-a55G.js} +1 -1
  3. package/dist/{DateFilter-BpwFexzi.js → DateFilter-CknrJWs2.js} +2 -2
  4. package/dist/{NumberFilter-Bz_NTdX9.js → NumberFilter-DJ-yNlzv.js} +1 -1
  5. package/dist/{PeriodFilter-DX_wy9g-.js → PeriodFilter-CiB5Oa9Z.js} +1 -1
  6. package/dist/{SelectFilter-xqiPtPgX.js → SelectFilter-EiafX97M.js} +2 -2
  7. package/dist/{TextFilter-BBl3JFqK.js → TextFilter-BzOmpdxj.js} +1 -1
  8. package/dist/{apLightTheme-D1P4jcD0.js → apLightTheme-DS0Uy44H.js} +446 -723
  9. package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +14 -8
  10. package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +60 -289
  11. package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +1 -0
  12. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +4 -0
  13. package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +1 -0
  14. package/dist/components/Customs/SyTabs/SyTabs.d.ts +13 -11
  15. package/dist/components/Customs/SyTextField/SyTextField.d.ts +0 -2
  16. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +54 -73
  17. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +31 -40
  18. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +9 -14
  19. package/dist/components/DatePicker/composables/useDatePickerState.d.ts +4 -3
  20. package/dist/components/DatePicker/composables/useDateTextField.d.ts +2 -2
  21. package/dist/components/DatePicker/composables/useInputBlurHandler.d.ts +2 -2
  22. package/dist/components/DatePicker/types.d.ts +1 -2
  23. package/dist/components/FileList/FileList.d.ts +6 -0
  24. package/dist/components/FilterSideBar/FilterSideBar.d.ts +2 -0
  25. package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +13 -13
  26. package/dist/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.d.ts +3 -3
  27. package/dist/components/LunarCalendar/useLunarCalendarValidation.d.ts +1 -0
  28. package/dist/components/MonthPicker/MonthPicker.d.ts +2 -7
  29. package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +2 -7
  30. package/dist/components/NirField/NirField.d.ts +12 -20
  31. package/dist/components/NirField/useNirValidation.d.ts +6 -2
  32. package/dist/components/PeriodField/PeriodField.d.ts +110 -150
  33. package/dist/components/PhoneField/PhoneField.d.ts +12 -7
  34. package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +0 -3
  35. package/dist/components/RatingPicker/EmotionPicker/EmotionPicker.d.ts +3 -1
  36. package/dist/components/RatingPicker/NumberPicker/NumberPicker.d.ts +4 -3
  37. package/dist/components/RatingPicker/RatingPicker.d.ts +18 -5
  38. package/dist/components/RatingPicker/StarsPicker/StarsPicker.d.ts +3 -1
  39. package/dist/components/RatingPicker/tests/RatingPicker.a11y.spect.d.ts +1 -0
  40. package/dist/components/RatingPicker/useRatingFocus.d.ts +18 -0
  41. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +5 -4
  42. package/dist/components/Tables/SyTable/SyTable.d.ts +5 -4
  43. package/dist/components/Tables/common/SyTablePagination.d.ts +154 -364
  44. package/dist/components/Tables/common/TableHeader.d.ts +6 -1
  45. package/dist/components/Tables/common/filters/DateFilter.d.ts +4 -4
  46. package/dist/components/Tables/common/locales.d.ts +3 -0
  47. package/dist/components/Tables/common/types.d.ts +2 -0
  48. package/dist/components/UploadWorkflow/UploadWorkflow.d.ts +1 -0
  49. package/dist/composables/date/useDateInitializationDayjs.d.ts +3 -1
  50. package/dist/composables/unifyValidation/documentationValidationProps.d.ts +230 -0
  51. package/dist/composables/unifyValidation/useCustomValidation.d.ts +3 -1
  52. package/dist/composables/unifyValidation/useValidation.d.ts +12 -6
  53. package/dist/composables/unifyValidation/useVuetifyValidation.d.ts +1 -1
  54. package/dist/composables/validation/useValidation.d.ts +6 -1
  55. package/dist/design-system-v3.js +2 -2
  56. package/dist/designTokens/tokens/amelipro/apColors.d.ts +10 -10
  57. package/dist/designTokens/tokens/amelipro/apColors2026.d.ts +1 -2
  58. package/dist/designTokens/tokens/amelipro/apContextual.d.ts +44 -0
  59. package/dist/designTokens/tokens/amelipro/apLightTheme.d.ts +2 -0
  60. package/dist/designTokens/tokens/amelipro/apSemantic.d.ts +1 -1
  61. package/dist/designTokens/tokens/baseColors.d.ts +127 -0
  62. package/dist/designTokens/tokens/baseContextualTokens.d.ts +50 -0
  63. package/dist/designTokens/tokens/cnam/cnamColors.d.ts +10 -10
  64. package/dist/designTokens/tokens/cnam/cnamLightTheme.d.ts +2 -0
  65. package/dist/designTokens/tokens/cnam/cnamSemantic.d.ts +1 -1
  66. package/dist/designTokens/tokens/pa/paColors.d.ts +1 -166
  67. package/dist/designTokens/tokens/pa/paSemantic.d.ts +1 -1
  68. package/dist/designTokens/utils/buildColorClassMap.d.ts +12 -0
  69. package/dist/designTokens/utils/createFlattenTheme.d.ts +1 -3
  70. package/dist/designTokens/utils/index.d.ts +2 -2
  71. package/dist/{main-BtTqyn4z.js → main-BsJ9ec3i.js} +16021 -15715
  72. package/dist/synapse.css +1 -1
  73. package/dist/utils/functions/classToHex.d.ts +1 -1
  74. package/dist/utils/functions/createHexResolver.d.ts +16 -0
  75. package/dist/vuetifyConfig.js +113 -152
  76. package/package.json +35 -23
  77. package/src/assets/amelipro/apTokens2026.scss +5 -5
  78. package/src/assets/overrides/_breakpoints.scss +25 -0
  79. package/src/assets/overrides/_btns.scss +0 -2
  80. package/src/assets/overrides/_forms.scss +1 -3
  81. package/src/assets/overrides/_icons.scss +5 -22
  82. package/src/assets/overrides/_otp.scss +40 -0
  83. package/src/assets/overrides/_tables.scss +11 -20
  84. package/src/assets/overrides/_tooltips.scss +17 -7
  85. package/src/assets/overrides/_typography.scss +35 -37
  86. package/src/assets/overrides/_utilities.scss +43 -47
  87. package/src/assets/themes.scss +1 -0
  88. package/src/components/Accordion/Accordion.vue +2 -0
  89. package/src/components/Amelipro/AmeliproAccordion/AmeliproAccordionTemplate/AmeliproAccordionTemplate.vue +20 -20
  90. package/src/components/Amelipro/AmeliproAccordionFrieze/AmeliproAccordionFrieze.vue +12 -14
  91. package/src/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.vue +4 -6
  92. package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResultTemplate/AmeliproAccordionResultTemplate.vue +5 -5
  93. package/src/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.vue +4 -6
  94. package/src/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.vue +4 -6
  95. package/src/components/Amelipro/AmeliproBadge/AmeliproBadge.vue +4 -6
  96. package/src/components/Amelipro/AmeliproBreadcrumb/AmeliproBreadcrumb.vue +1 -3
  97. package/src/components/Amelipro/AmeliproBtn/AmeliproBtn.vue +4 -6
  98. package/src/components/Amelipro/AmeliproCallback/AmeliproCallback.vue +2 -2
  99. package/src/components/Amelipro/AmeliproCard/AmeliproCard.vue +31 -31
  100. package/src/components/Amelipro/AmeliproCarousel/AmeliproCarousel.vue +5 -7
  101. package/src/components/Amelipro/AmeliproCheckbox/AmeliproCheckbox.vue +13 -15
  102. package/src/components/Amelipro/AmeliproCheckboxGroup/AmeliproCheckboxGroup.vue +23 -23
  103. package/src/components/Amelipro/AmeliproChips/AmeliproChips.vue +1 -3
  104. package/src/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.vue +17 -12
  105. package/src/components/Amelipro/AmeliproClickableTile/tests/__snapshots__/AmeliproClickableTile.spec.ts.snap +2 -2
  106. package/src/components/Amelipro/AmeliproCopyBtn/AmeliproCopyBtn.vue +4 -6
  107. package/src/components/Amelipro/AmeliproCustomSelector/AmeliproCustomSelector.vue +13 -13
  108. package/src/components/Amelipro/AmeliproDentalChart/AmeliproDentalChart.vue +4 -2
  109. package/src/components/Amelipro/AmeliproDentalChart/AmeliproTooth/AmeliproTooth.vue +4 -4
  110. package/src/components/Amelipro/AmeliproDialog/AmeliproDialog.vue +5 -7
  111. package/src/components/Amelipro/AmeliproDisclosure/AmeliproDisclosure.vue +1 -3
  112. package/src/components/Amelipro/AmeliproErrorTemplate/AmeliproErrorTemplate.vue +2 -4
  113. package/src/components/Amelipro/AmeliproFilePreview/AmeliproFilePreview.vue +4 -6
  114. package/src/components/Amelipro/AmeliproFilters/AmeliproFilters.vue +13 -13
  115. package/src/components/Amelipro/AmeliproFirstLogin/AmeliproFirstLogin.vue +3 -5
  116. package/src/components/Amelipro/AmeliproFooter/AmeliproFooter.vue +1 -3
  117. package/src/components/Amelipro/AmeliproHeader/AmeliproHeader.vue +2 -4
  118. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBar.vue +1 -3
  119. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/AmeliproHeaderBrandSection.vue +20 -16
  120. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/__tests__/__snapshots__/AmeliproHeaderBrandSection.spec.ts.snap +1 -1
  121. package/src/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.vue +2 -4
  122. package/src/components/Amelipro/AmeliproIllustratedDataTile/AmeliproIllustratedDataTile.vue +5 -7
  123. package/src/components/Amelipro/AmeliproIllustratedRadioGroup/AmeliproIllustratedRadioGroup.vue +6 -8
  124. package/src/components/Amelipro/AmeliproMailTile/AmeliproMailTile.vue +14 -14
  125. package/src/components/Amelipro/AmeliproMenu/AmeliproMenu.vue +11 -13
  126. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproDropdownMenu/AmeliproDropdownMenu.vue +2 -4
  127. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproMessagingLayout.vue +8 -8
  128. package/src/components/Amelipro/AmeliproMultipleFoldingCard/AmeliproMultipleFoldingCard.vue +40 -40
  129. package/src/components/Amelipro/AmeliproNumberedCard/AmeliproNumberedCard.vue +27 -27
  130. package/src/components/Amelipro/AmeliproOnboarding/AmeliproOnboarding.vue +3 -5
  131. package/src/components/Amelipro/AmeliproPageLayout/AmeliproPageLayout.vue +2 -4
  132. package/src/components/Amelipro/AmeliproPagination/AmeliproPagination.vue +2 -4
  133. package/src/components/Amelipro/AmeliproPagination/AmeliproPaginationBtn/AmeliproPaginationBtn.vue +3 -5
  134. package/src/components/Amelipro/AmeliproPatientBanner/AmeliproPatientBanner.vue +1 -3
  135. package/src/components/Amelipro/AmeliproPatientLogged/AmeliproPatientLogged.vue +2 -4
  136. package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLogin.vue +4 -4
  137. package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLoginForm/AmeliproPatientLoginForm.vue +1 -3
  138. package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.vue +3 -5
  139. package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.vue +3 -5
  140. package/src/components/Amelipro/AmeliproRadioGroup/AmeliproRadioGroup.vue +23 -23
  141. package/src/components/Amelipro/AmeliproResultList/AmeliproResultList.vue +4 -6
  142. package/src/components/Amelipro/AmeliproSelect/AmeliproSelect.vue +12 -22
  143. package/src/components/Amelipro/AmeliproStateTile/AmeliproStateTile.vue +10 -12
  144. package/src/components/Amelipro/AmeliproStepper/AmeliproStepper.vue +17 -17
  145. package/src/components/Amelipro/AmeliproTable/AmeliproTable.vue +8 -10
  146. package/src/components/Amelipro/AmeliproTabs/AmeliproTabBtn/AmeliproTabBtn.vue +6 -8
  147. package/src/components/Amelipro/AmeliproTabs/AmeliproTabs.vue +4 -4
  148. package/src/components/Amelipro/AmeliproTextArea/AmeliproTextArea.vue +4 -6
  149. package/src/components/Amelipro/AmeliproTextField/AmeliproTextField.vue +7 -9
  150. package/src/components/Amelipro/AmeliproTileBtn/AmeliproTileBtn.vue +3 -5
  151. package/src/components/Amelipro/AmeliproTooltips/AmeliproTooltips.vue +0 -2
  152. package/src/components/Amelipro/AmeliproUpload/AmeliproUpload.vue +6 -6
  153. package/src/components/Amelipro/ServiceMenu/ServiceMenu.vue +2 -2
  154. package/src/components/Amelipro/StructureMenu/StructureBtn/StructureBtn.vue +4 -4
  155. package/src/components/Amelipro/StructureMenu/StructureItem/StructureItem.vue +4 -6
  156. package/src/components/Amelipro/StructureMenu/StructureMenu.vue +2 -2
  157. package/src/components/Amelipro/StructureMenu/StructureTabs/StructureTabs.vue +2 -2
  158. package/src/components/Amelipro/UserMenu/UserMenu.vue +1 -3
  159. package/src/components/BackBtn/tests/BackBtn.visual.cy.ts +43 -0
  160. package/src/components/BackBtn/tests/__snapshots__/back-btn-custom-bg.snap.png +0 -0
  161. package/src/components/BackBtn/tests/__snapshots__/back-btn-dark-mode.snap.png +0 -0
  162. package/src/components/BackBtn/tests/__snapshots__/back-btn-default.snap.png +0 -0
  163. package/src/components/BackBtn/tests/__snapshots__/back-btn-no-icon.snap.png +0 -0
  164. package/src/components/Captcha/Captcha.vue +1 -3
  165. package/src/components/ChipList/ChipList.vue +14 -16
  166. package/src/components/CookiesSelection/CookiesInformation/CookiesInformation.vue +2 -3
  167. package/src/components/CookiesSelection/CookiesSelection.vue +2 -1
  168. package/src/components/CopyBtn/CopyBtn.vue +10 -3
  169. package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.vue +17 -17
  170. package/src/components/Customs/Selects/SelectBtnField/tests/SelectBtnField.spec.ts +31 -0
  171. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +66 -0
  172. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +8 -4
  173. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.a11y.spec.ts +18 -0
  174. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +66 -0
  175. package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.vue +4 -6
  176. package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +414 -135
  177. package/src/components/Customs/Selects/SySelect/SySelect.vue +502 -257
  178. package/src/components/Customs/Selects/SySelect/accessibilite/Accessibility.mdx +199 -269
  179. package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +278 -4
  180. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +3 -3
  181. package/src/components/Customs/SyCheckbox/SyCheckbox.mdx +5 -0
  182. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +52 -2
  183. package/src/components/Customs/SyCheckbox/accessibilite/Accessibility.mdx +18 -3
  184. package/src/components/Customs/SyPagination/SyPagination.vue +0 -2
  185. package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +23 -5
  186. package/src/components/Customs/SyTabs/SyTabs.mdx +0 -58
  187. package/src/components/Customs/SyTabs/SyTabs.stories.ts +34 -35
  188. package/src/components/Customs/SyTabs/SyTabs.vue +87 -67
  189. package/src/components/Customs/SyTabs/accessibilite/Accessibility.mdx +83 -23
  190. package/src/components/Customs/SyTabs/config.ts +3 -3
  191. package/src/components/Customs/SyTabs/tests/SyTabs.a11y.spec.ts +88 -0
  192. package/src/components/Customs/SyTabs/tests/SyTabs.spec.ts +46 -1
  193. package/src/components/Customs/SyTextField/SyTextField.stories.ts +21 -41
  194. package/src/components/Customs/SyTextField/SyTextField.vue +34 -9
  195. package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +1 -1
  196. package/src/components/DatePicker/CalendarMode/DatePicker.vue +29 -28
  197. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +1 -1
  198. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +28 -23
  199. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +24 -1
  200. package/src/components/DatePicker/DatePickerValidationExample/DatePickerValidation.stories.ts +1 -1
  201. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +65 -33
  202. package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +1 -1
  203. package/src/components/DatePicker/composables/tests/useDatePickerState.spec.ts +53 -0
  204. package/src/components/DatePicker/composables/useDatePickerState.ts +56 -13
  205. package/src/components/DatePicker/composables/useDateRangeInput.ts +2 -1
  206. package/src/components/DatePicker/composables/useDateSelection.ts +2 -1
  207. package/src/components/DatePicker/composables/useDateTextField.ts +2 -3
  208. package/src/components/DatePicker/composables/useInputBlurHandler.ts +2 -2
  209. package/src/components/DatePicker/composables/useMonthButtonCustomization.ts +9 -8
  210. package/src/components/DatePicker/playground/DatePickerHolidayRule.vue +1 -1
  211. package/src/components/DatePicker/types.ts +1 -2
  212. package/src/components/DialogBox/DialogBox.stories.ts +8 -8
  213. package/src/components/DialogBox/DialogBox.vue +3 -5
  214. package/src/components/DialogBox/accessibilite/Accessibility.mdx +86 -22
  215. package/src/components/DialogBox/tests/DialogBox.visual.cy.ts +76 -0
  216. package/src/components/DialogBox/tests/__snapshots__/dialog-box-custom-texts.snap.png +0 -0
  217. package/src/components/DialogBox/tests/__snapshots__/dialog-box-default.snap.png +0 -0
  218. package/src/components/DialogBox/tests/__snapshots__/dialog-box-no-actions.snap.png +0 -0
  219. package/src/components/FileList/FileList.vue +9 -2
  220. package/src/components/FileList/UploadItem/UploadItem.vue +11 -13
  221. package/src/components/FileList/tests/FileList.spec.ts +47 -0
  222. package/src/components/FileUpload/FileUpload.vue +3 -5
  223. package/src/components/FileUpload/FileUploadContent.vue +3 -5
  224. package/src/components/FilterInline/FilterInline.vue +1 -3
  225. package/src/components/FilterSideBar/FilterSideBar.mdx +44 -1
  226. package/src/components/FilterSideBar/FilterSideBar.stories.ts +105 -1
  227. package/src/components/FilterSideBar/FilterSideBar.vue +9 -1
  228. package/src/components/FilterSideBar/tests/FilterSideBar.a11y.spec.ts +54 -1
  229. package/src/components/FilterSideBar/tests/FilterSideBar.spec.ts +42 -0
  230. package/src/components/FooterBar/FooterBar.vue +9 -13
  231. package/src/components/FranceConnectBtn/FranceConnectBtn.vue +1 -1
  232. package/src/components/HeaderBar/HeaderBar.vue +2 -3
  233. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderBurgerMenu.vue +2 -3
  234. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.vue +2 -3
  235. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuSection/HeaderMenuSection.vue +0 -1
  236. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.vue +8 -9
  237. package/src/components/HeaderBar/HeaderBurgerMenu/menu.scss +0 -8
  238. package/src/components/HeaderBar/HeaderBurgerMenu/tests/HeaderBurgerMenu.visual.cy.ts +196 -0
  239. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated-submenu-open.snap.png +0 -0
  240. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated.snap.png +0 -0
  241. package/src/components/HeaderBar/HeaderLogo/HeaderLogo.vue +0 -1
  242. package/src/components/HeaderBar/HeaderMenuBtn/HeaderMenuBtn.vue +6 -7
  243. package/src/components/HeaderBar/tests/HeaderBar.visual.cy.ts +81 -0
  244. package/src/components/HeaderBar/tests/__snapshots__/header-bar-custom-width.snap.png +0 -0
  245. package/src/components/HeaderBar/tests/__snapshots__/header-bar-default.snap.png +0 -0
  246. package/src/components/HeaderBar/tests/__snapshots__/header-bar-no-sticky.snap.png +0 -0
  247. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-prepend.snap.png +0 -0
  248. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-side.snap.png +0 -0
  249. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-subtitle.snap.png +0 -0
  250. package/src/components/HeaderNavigationBar/HeaderNavigationBar.vue +12 -3
  251. package/src/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.vue +15 -8
  252. package/src/components/HeaderToolbar/HeaderToolbar.vue +6 -7
  253. package/src/components/LangBtn/LangBtn.vue +4 -5
  254. package/src/components/Logo/tests/Logo.visual.cy.ts +57 -0
  255. package/src/components/Logo/tests/__snapshots__/logo-avatar.snap.png +0 -0
  256. package/src/components/Logo/tests/__snapshots__/logo-dark.snap.png +0 -0
  257. package/src/components/Logo/tests/__snapshots__/logo-default.snap.png +0 -0
  258. package/src/components/Logo/tests/__snapshots__/logo-no-organism.snap.png +0 -0
  259. package/src/components/Logo/tests/__snapshots__/logo-no-signature.snap.png +0 -0
  260. package/src/components/Logo/tests/__snapshots__/logo-risque-pro.snap.png +0 -0
  261. package/src/components/LogoBrandSection/LogoBrandSection.vue +2 -2
  262. package/src/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.vue +1 -1
  263. package/src/components/NirField/NirField.stories.ts +2 -2
  264. package/src/components/NirField/NirField.vue +3 -5
  265. package/src/components/NirField/accessibilite/Accessibility.mdx +100 -5
  266. package/src/components/NirField/tests/NirField.spec.ts +118 -0
  267. package/src/components/NirField/tests/useNirValidation.spec.ts +449 -0
  268. package/src/components/NirField/useNirValidation.ts +38 -32
  269. package/src/components/NotificationBar/Notification/Notification.vue +7 -9
  270. package/src/components/NotificationBar/NotificationBar.vue +1 -3
  271. package/src/components/PaginatedTable/PaginatedTable.vue +3 -4
  272. package/src/components/PaginatedTable/Pagination.vue +4 -6
  273. package/src/components/PasswordField/PasswordField.vue +15 -13
  274. package/src/components/PhoneField/PhoneField.vue +7 -5
  275. package/src/components/RangeField/RangeSlider/RangeSlider.vue +11 -20
  276. package/src/components/RangeField/RangeSlider/Tooltip/Tooltip.vue +1 -1
  277. package/src/components/RangeField/tests/RangeField.visual.cy.ts +65 -0
  278. package/src/components/RangeField/tests/__snapshots__/range-field-custom-bg.snap.png +0 -0
  279. package/src/components/RangeField/tests/__snapshots__/range-field-custom-range.snap.png +0 -0
  280. package/src/components/RangeField/tests/__snapshots__/range-field-default.snap.png +0 -0
  281. package/src/components/RangeField/tests/__snapshots__/range-field-step.snap.png +0 -0
  282. package/src/components/RangeField/tests/__snapshots__/range-field-with-label.snap.png +0 -0
  283. package/src/components/RatingPicker/EmotionPicker/EmotionPicker.vue +38 -56
  284. package/src/components/RatingPicker/EmotionPicker/tests/__snapshots__/EmotionPicker.spec.ts.snap +5 -0
  285. package/src/components/RatingPicker/NumberPicker/NumberPicker.vue +48 -53
  286. package/src/components/RatingPicker/NumberPicker/tests/NumberPicker.spec.ts +2 -1
  287. package/src/components/RatingPicker/NumberPicker/tests/__snapshots__/NumberPicker.spec.ts.snap +40 -13
  288. package/src/components/RatingPicker/RatingPicker.stories.ts +65 -88
  289. package/src/components/RatingPicker/RatingPicker.vue +71 -15
  290. package/src/components/RatingPicker/StarsPicker/StarsPicker.vue +31 -42
  291. package/src/components/RatingPicker/StarsPicker/tests/StarsPicker.spec.ts +1 -1
  292. package/src/components/RatingPicker/StarsPicker/tests/__snapshots__/StarsPicker.spec.ts.snap +5 -0
  293. package/src/components/RatingPicker/accessibilite/Accessibility.mdx +137 -9
  294. package/src/components/RatingPicker/tests/RatingPicker.a11y.spect.ts +123 -0
  295. package/src/components/RatingPicker/tests/RatingPicker.spec.ts +3 -2
  296. package/src/components/RatingPicker/tests/__snapshots__/RatingPicker.spec.ts.snap +40 -11
  297. package/src/components/RatingPicker/useRatingFocus.ts +97 -0
  298. package/src/components/SearchListField/SearchListField.vue +0 -2
  299. package/src/components/SkipLink/SkipLink.vue +2 -4
  300. package/src/components/SocialMediaLinks/SocialMediaLinks.vue +6 -6
  301. package/src/components/SubHeader/SubHeader.vue +1 -1
  302. package/src/components/SyAlert/SyAlert.vue +7 -9
  303. package/src/components/SyAlert/tests/SyAlert.visual.cy.ts +46 -0
  304. package/src/components/SyAlert/tests/__snapshots__/sy-alert-closable.snap.png +0 -0
  305. package/src/components/SyAlert/tests/__snapshots__/sy-alert-error.snap.png +0 -0
  306. package/src/components/SyAlert/tests/__snapshots__/sy-alert-info.snap.png +0 -0
  307. package/src/components/SyAlert/tests/__snapshots__/sy-alert-success.snap.png +0 -0
  308. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-outlined.snap.png +0 -0
  309. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-tonal.snap.png +0 -0
  310. package/src/components/SyAlert/tests/__snapshots__/sy-alert-warning.snap.png +0 -0
  311. package/src/components/SyBtnMenu/SyBtnMenu.vue +2 -4
  312. package/src/components/SyTextArea/SyTextArea.vue +32 -1
  313. package/src/components/TableToolbar/TableToolbar.vue +6 -8
  314. package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +166 -0
  315. package/src/components/Tables/SyServerTable/SyServerTable.vue +10 -8
  316. package/src/components/Tables/SyServerTable/tests/SyServerTable.a11y.spec.ts +23 -0
  317. package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +268 -0
  318. package/src/components/Tables/SyTable/SyTable.stories.ts +104 -0
  319. package/src/components/Tables/SyTable/SyTable.vue +10 -8
  320. package/src/components/Tables/SyTable/tests/SyTable.a11y.spec.ts +22 -0
  321. package/src/components/Tables/SyTable/tests/SyTable.spec.ts +274 -0
  322. package/src/components/Tables/common/SyTableFilter.vue +31 -6
  323. package/src/components/Tables/common/SyTablePagination.vue +143 -19
  324. package/src/components/Tables/common/TableHeader.vue +41 -4
  325. package/src/components/Tables/common/filters/DateFilter.vue +2 -2
  326. package/src/components/Tables/common/filters/SelectFilter.vue +1 -1
  327. package/src/components/Tables/common/locales.ts +3 -0
  328. package/src/components/Tables/common/tableStyles.scss +16 -19
  329. package/src/components/Tables/common/tests/SyTablePagination.spec.ts +18 -0
  330. package/src/components/Tables/common/tests/TableHeader.spec.ts +39 -0
  331. package/src/components/Tables/common/types.ts +2 -0
  332. package/src/components/Tables/common/useTableHeaders.ts +49 -27
  333. package/src/components/UploadWorkflow/UploadWorkflow.vue +1 -0
  334. package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +23 -0
  335. package/src/components/UploadWorkflow/tests/__snapshots__/UploadWorkflow.spec.ts.snap +66 -0
  336. package/src/components/UploadWorkflow/useFileList.ts +3 -0
  337. package/src/components/UserMenuBtn/UserMenuBtn.vue +1 -3
  338. package/src/composables/date/tests/useDateFormatDayjs.spec.ts +81 -0
  339. package/src/composables/date/tests/{useDateInitialization.spec.ts → useDateInitializationDayjs.spec.ts} +39 -3
  340. package/src/composables/date/useDateInitializationDayjs.ts +4 -1
  341. package/src/composables/unifyValidation/documentationValidationProps.ts +235 -0
  342. package/src/composables/unifyValidation/tests/useCustomValidation.spec.ts +2 -1
  343. package/src/composables/unifyValidation/tests/useValidation.spec.ts +22 -0
  344. package/src/composables/unifyValidation/useCustomValidation.ts +16 -4
  345. package/src/composables/unifyValidation/useValidation.ts +46 -15
  346. package/src/composables/unifyValidation/useVuetifyValidation.ts +2 -2
  347. package/src/composables/useFormFieldErrorHandling.ts +4 -1
  348. package/src/composables/validation/tests/useValidation.spec.ts +2 -2
  349. package/src/composables/validation/useValidation.ts +32 -4
  350. package/src/composantsVuetify/VBreadcrumbs/VBreadcrumbs.mdx +28 -0
  351. package/src/composantsVuetify/VBreadcrumbs/v-breadcrumbs.stories.ts +108 -0
  352. package/src/composantsVuetify/VCard/VCard.mdx +59 -0
  353. package/src/composantsVuetify/VCard/v-card.stories.ts +279 -0
  354. package/src/composantsVuetify/VOtpInput/VOtpInput.mdx +39 -0
  355. package/src/composantsVuetify/VOtpInput/v-otp-input.stories.ts +56 -0
  356. package/src/composantsVuetify/VSkeletonLoader/VSkeletonLoader.mdx +42 -0
  357. package/src/composantsVuetify/VSkeletonLoader/v-skeleton-loader.stories.ts +77 -0
  358. package/src/composantsVuetify/VSwitch/VSwitch.mdx +47 -0
  359. package/src/composantsVuetify/VSwitch/v-switch.stories.ts +166 -0
  360. package/src/designTokens/tests/buildColorClassMap.spec.ts +31 -0
  361. package/src/designTokens/tests/generateScssTokens.spec.ts +12 -0
  362. package/src/designTokens/tests/themeUtils.spec.ts +53 -0
  363. package/src/designTokens/tokens/amelipro/apColors.ts +8 -130
  364. package/src/designTokens/tokens/amelipro/apColors2026.ts +3 -15
  365. package/src/designTokens/tokens/amelipro/apContextual.ts +55 -47
  366. package/src/designTokens/tokens/amelipro/apLightTheme.ts +4 -1
  367. package/src/designTokens/tokens/amelipro/apSemantic.ts +1 -1
  368. package/src/designTokens/tokens/baseColors.ts +129 -0
  369. package/src/designTokens/tokens/baseContextualTokens.ts +52 -0
  370. package/src/designTokens/tokens/cnam/cnamColors.ts +3 -125
  371. package/src/designTokens/tokens/cnam/cnamContextual.ts +4 -48
  372. package/src/designTokens/tokens/cnam/cnamLightTheme.ts +4 -1
  373. package/src/designTokens/tokens/cnam/cnamSemantic.ts +1 -1
  374. package/src/designTokens/tokens/pa/paColors.ts +2 -166
  375. package/src/designTokens/tokens/pa/paContextual.ts +3 -48
  376. package/src/designTokens/tokens/pa/paLightTheme.ts +1 -1
  377. package/src/designTokens/tokens/pa/paSemantic.ts +2 -2
  378. package/src/designTokens/utils/buildColorClassMap.ts +34 -0
  379. package/src/designTokens/utils/convertSemanticsToken.ts +8 -11
  380. package/src/designTokens/utils/createFlattenTheme.ts +15 -7
  381. package/src/designTokens/utils/index.ts +2 -2
  382. package/src/stories/Accessibilite/Aculturation/SensibilisationAccessibilite.mdx +61 -91
  383. package/src/stories/Accessibilite/AuditDesignSystem.mdx +5 -19
  384. package/src/stories/Accessibilite/AuditEtContreAudit/Exemptions-derogations.mdx +1 -1
  385. package/src/stories/Accessibilite/AuditEtContreAudit/Introduction.mdx +11 -8
  386. package/src/stories/Accessibilite/AuditEtContreAudit/RGAA.mdx +6 -7
  387. package/src/stories/Accessibilite/DesignSystem/Avancement.mdx +433 -0
  388. package/src/stories/Accessibilite/DesignSystem/a11y-status.json +692 -0
  389. package/src/stories/Accessibilite/Introduction.mdx +30 -30
  390. package/src/stories/Accessibilite/KitDePreAudit/Echantillonnage.mdx +176 -79
  391. package/src/stories/Accessibilite/KitDePreAudit/Introduction.mdx +67 -19
  392. package/src/stories/Accessibilite/KitDePreAudit/Outils/Introduction.mdx +78 -50
  393. package/src/stories/Accessibilite/KitDePreAudit/Outils/LecteursDEcran.mdx +23 -49
  394. package/src/stories/Accessibilite/KitDePreAudit/Outils/Tanaguru/FauxPositifs.stories.ts +6 -0
  395. package/src/stories/Accessibilite/KitDePreAudit/Outils/Tanaguru/Utilisation.mdx +7 -19
  396. package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +55 -67
  397. package/src/stories/Components/Components.stories.ts +92 -4
  398. package/src/stories/Demarrer/EnrichirLeDesignSystem.mdx +4 -9
  399. package/src/stories/Demarrer/EnrichirLeDesignSystem.stories.ts +28 -0
  400. package/src/stories/Demarrer/Releases.stories.ts +48 -5
  401. package/src/stories/DesignTokens/ColorDisplay.vue +6 -5
  402. package/src/stories/DesignTokens/ColorIntegrationExample.vue +2 -4
  403. package/src/stories/DesignTokens/colors.stories.ts +5 -6
  404. package/src/stories/GuideDuDev/CreateVuetifyInstance.mdx +95 -0
  405. package/src/stories/GuideDuDev/Theme.mdx +36 -26
  406. package/src/stories/GuideDuDev/moduleDeNotification.mdx +3 -2
  407. package/src/stories/styles/accessibility-guide.css +3 -3
  408. package/src/utils/functions/classToHex.ts +6 -34
  409. package/src/utils/functions/createHexResolver.ts +45 -0
  410. package/src/utils/functions/tests/classToHex.spec.ts +36 -0
  411. package/src/utils/functions/tests/convertToHex.spec.ts +31 -0
  412. package/src/utils/functions/tests/createHexResolver.spec.ts +66 -0
  413. package/src/utils/functions/tests/isCssColor.spec.ts +48 -0
  414. package/dist/AutocompleteFilter-D9jzRzAL.cjs +0 -1
  415. package/dist/DateFilter-DTUl8hb1.cjs +0 -1
  416. package/dist/NumberFilter-MAEojdk0.cjs +0 -1
  417. package/dist/PeriodFilter-CC4WgIhl.cjs +0 -1
  418. package/dist/SelectFilter-BR3fvl-a.cjs +0 -1
  419. package/dist/TextFilter-CCfYFl5F.cjs +0 -1
  420. package/dist/apLightTheme-CFSRrjv2.cjs +0 -1
  421. package/dist/composables/date/useDateFormat.d.ts +0 -26
  422. package/dist/composables/date/useDateInitialization.d.ts +0 -18
  423. package/dist/design-system-v3.umd.cjs +0 -1
  424. package/dist/designTokens/utils/convertGaps.d.ts +0 -5
  425. package/dist/main-C1e3eoxd.cjs +0 -1067
  426. package/dist/tooth-11-D3sLWv2n.cjs +0 -1
  427. package/dist/tooth-12-CXrLuH03.cjs +0 -1
  428. package/dist/tooth-13-BSfo5fpT.cjs +0 -1
  429. package/dist/tooth-14-DMzulx0h.cjs +0 -1
  430. package/dist/tooth-15-BKRFVi-9.cjs +0 -1
  431. package/dist/tooth-16-CpuxAbuM.cjs +0 -1
  432. package/dist/tooth-17-BPoahUdg.cjs +0 -1
  433. package/dist/tooth-18-DhHJz8sy.cjs +0 -1
  434. package/dist/tooth-21-Dgd5hn_X.cjs +0 -1
  435. package/dist/tooth-22-C2Tn19sB.cjs +0 -1
  436. package/dist/tooth-23-C9uaaSGb.cjs +0 -1
  437. package/dist/tooth-24-BrK9UGpf.cjs +0 -1
  438. package/dist/tooth-25-CE_EfGNp.cjs +0 -1
  439. package/dist/tooth-26-Ctv4i9Fy.cjs +0 -1
  440. package/dist/tooth-27-C5J7JkWM.cjs +0 -1
  441. package/dist/tooth-28-Z9oWqjo0.cjs +0 -1
  442. package/dist/tooth-31-BrYqmkTi.cjs +0 -1
  443. package/dist/tooth-32-BNNR0oCZ.cjs +0 -1
  444. package/dist/tooth-33-DuxvqO2J.cjs +0 -1
  445. package/dist/tooth-34-BCSCXMB6.cjs +0 -1
  446. package/dist/tooth-35-BLUXkX88.cjs +0 -1
  447. package/dist/tooth-36-IrKHYqlA.cjs +0 -1
  448. package/dist/tooth-37-BYqpdMwo.cjs +0 -1
  449. package/dist/tooth-38-B_eNXXdu.cjs +0 -1
  450. package/dist/tooth-41-Ddva4Ot8.cjs +0 -1
  451. package/dist/tooth-42-szcDqlM0.cjs +0 -1
  452. package/dist/tooth-43-B3ka6rQm.cjs +0 -1
  453. package/dist/tooth-44-CazyQucj.cjs +0 -1
  454. package/dist/tooth-45-B4HQtc8n.cjs +0 -1
  455. package/dist/tooth-46-BPM40gbG.cjs +0 -1
  456. package/dist/tooth-47-Dvr20dlh.cjs +0 -1
  457. package/dist/tooth-48-Bd8ljGsF.cjs +0 -1
  458. package/dist/tooth-51-OBpwCOF3.cjs +0 -1
  459. package/dist/tooth-52-aKxyHcmq.cjs +0 -1
  460. package/dist/tooth-53-vCwJjTOc.cjs +0 -1
  461. package/dist/tooth-54-DsWu2iFy.cjs +0 -1
  462. package/dist/tooth-55-BxC1X2Dn.cjs +0 -1
  463. package/dist/tooth-61-BbLvxMQi.cjs +0 -1
  464. package/dist/tooth-62-CmTkWczP.cjs +0 -1
  465. package/dist/tooth-63-DI7l_2qI.cjs +0 -1
  466. package/dist/tooth-64-B21sOsJh.cjs +0 -1
  467. package/dist/tooth-65-D2ZC2VEr.cjs +0 -1
  468. package/dist/tooth-71-D473PPO5.cjs +0 -1
  469. package/dist/tooth-72-Drh1wnNu.cjs +0 -1
  470. package/dist/tooth-73-DzlwYI23.cjs +0 -1
  471. package/dist/tooth-74-8aGvcZPg.cjs +0 -1
  472. package/dist/tooth-75-BFK7At_r.cjs +0 -1
  473. package/dist/tooth-81-BZmR-I0M.cjs +0 -1
  474. package/dist/tooth-82-euVfUUZV.cjs +0 -1
  475. package/dist/tooth-83-KV010j64.cjs +0 -1
  476. package/dist/tooth-84-BBg1RjhZ.cjs +0 -1
  477. package/dist/tooth-85-Cr-kc1wM.cjs +0 -1
  478. package/dist/vuetifyConfig.umd.cjs +0 -1
  479. package/src/assets/apTokens.scss +0 -343
  480. package/src/assets/overrides/_container.scss +0 -36
  481. package/src/assets/tokens.scss +0 -388
  482. package/src/composables/date/tests/useDateFormat.spec.ts +0 -67
  483. package/src/composables/date/useDateFormat.ts +0 -110
  484. package/src/composables/date/useDateInitialization.ts +0 -92
  485. package/src/designTokens/apColors.md +0 -66
  486. package/src/designTokens/cnamColors.md +0 -193
  487. package/src/designTokens/paColors.md +0 -66
  488. package/src/designTokens/tokens/json/contextual-tokens.json +0 -156
  489. package/src/designTokens/tokens/json/primitives.json +0 -209
  490. package/src/designTokens/tokens/json/semantic.json +0 -120
  491. package/src/designTokens/utils/convertGaps.ts +0 -11
  492. package/src/stories/Accessibilite/Avancement/Avancement.mdx +0 -533
  493. package/src/stories/Accessibilite/Avancement/Avancement.stories.ts +0 -306
@@ -1,5 +1,6 @@
1
1
  import { ref } from 'vue'
2
2
  import type { Ref } from 'vue'
3
+ import { DATE_PICKER_MESSAGES } from '../constants/messages'
3
4
 
4
5
  /**
5
6
  * Composable pour gérer la sélection de dates dans les composants CalendarMode
@@ -101,7 +102,7 @@ export function useDateSelection(
101
102
  }
102
103
  else if (typeof input === 'string') {
103
104
  // Mode plage de dates
104
- const dates = input.split(' - ')
105
+ const dates = input.split(DATE_PICKER_MESSAGES.RANGE_SEPARATOR)
105
106
  if (dates.length === 2) {
106
107
  const startDate = parseDate(dates[0]!, format)
107
108
  const endDate = parseDate(dates[1]!, format)
@@ -1,6 +1,6 @@
1
1
  import type { Ref } from 'vue'
2
2
  import type { ValidationResult } from '@/composables/validation/useValidation'
3
- import type { DateValue } from '@/composables/date/useDateInitializationDayjs'
3
+ import type { DateModelValue } from '@/composables/date/useDateInitializationDayjs'
4
4
  import { useManualDateValidation } from './useManualDateValidation'
5
5
 
6
6
  export interface UseDateTextFieldManualValidationOptions {
@@ -37,7 +37,7 @@ export interface UseDateTextFieldResetOptions {
37
37
  inputValue: Ref<string>
38
38
  selectedDates: Ref<unknown>
39
39
  resetState: () => void
40
- emitModel: (value: DateValue) => void
40
+ emitModel: (value: DateModelValue) => void
41
41
  }
42
42
 
43
43
  export interface UseDateTextFieldOptions {
@@ -80,7 +80,6 @@ export const useDateTextField = (options: UseDateTextFieldOptions) => {
80
80
  isValidating.value = true
81
81
  hasInteracted.value = true
82
82
  const ok = await runRules(inputValue.value)
83
- console.log('ok from validateOnSubmit:', ok)
84
83
  isValidating.value = false
85
84
  return ok
86
85
  }
@@ -1,5 +1,5 @@
1
1
  import { type Ref, ref } from 'vue'
2
- import { type DateValue } from '@/composables/date/useDateInitializationDayjs'
2
+ import { type DateModelValue } from '@/composables/date/useDateInitializationDayjs'
3
3
  import { type DateObjectValue } from '../types'
4
4
  import { DATE_PICKER_MESSAGES } from '../constants/messages'
5
5
 
@@ -27,7 +27,7 @@ export const useInputBlurHandler = (options: {
27
27
  validateDateFormat: (dateStr: string) => { isValid: boolean, message: string }
28
28
  parseDate: (dateStr: string, format: string) => Date | null
29
29
  formatDate: (date: Date, format: string) => string
30
- updateModel: (value: DateValue) => void
30
+ updateModel: (value: DateModelValue) => void
31
31
  validateManualInput: (value: string) => boolean | Promise<boolean>
32
32
 
33
33
  // Émetteurs d'événements
@@ -14,6 +14,7 @@ export function useMonthButtonCustomization(
14
14
  const monthButtonText = ref('')
15
15
  const yearText = ref('')
16
16
  const monthButtonObservers: MutationObserver[] = []
17
+ const primaryThemeColor = 'rgb(var(--v-theme-primary, 12, 65, 154))'
17
18
 
18
19
  onBeforeUnmount(() => {
19
20
  monthButtonObservers.forEach(observer => observer.disconnect())
@@ -111,12 +112,12 @@ export function useMonthButtonCustomization(
111
112
  )
112
113
  monthBtnElement.setAttribute('data-ripple', 'false')
113
114
  monthBtnElement.setAttribute('aria-label', monthText)
114
- monthBtnElement.style.color = 'var(--v-theme-primary)'
115
+ monthBtnElement.style.color = primaryThemeColor
115
116
 
116
117
  const buttonContentHTML = `
117
- <div class="v-btn__content" data-no-activator="" style="color: var(--v-theme-primary);">
118
- <span style="color: var(--v-theme-primary);">${monthText}</span>
119
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="18" height="18" class="ms-1" style="fill: var(--v-theme-primary);" aria-hidden="true"><path d="M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z" /></svg>
118
+ <div class="v-btn__content" data-no-activator="" style="color: ${primaryThemeColor};">
119
+ <span style="color: ${primaryThemeColor};">${monthText}</span>
120
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="18" height="18" class="ms-1" style="fill: ${primaryThemeColor};" aria-hidden="true"><path d="M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z" /></svg>
120
121
  </div>
121
122
  `
122
123
 
@@ -167,12 +168,12 @@ export function useMonthButtonCustomization(
167
168
  )
168
169
  yearBtnElement.setAttribute('data-ripple', 'false')
169
170
  yearBtnElement.setAttribute('aria-label', displayedYear)
170
- yearBtnElement.style.color = 'var(--v-theme-primary)'
171
+ yearBtnElement.style.color = primaryThemeColor
171
172
 
172
173
  const yearButtonContentHTML = `
173
- <div class="v-btn__content" data-no-activator="" style="color: var(--v-theme-primary);">
174
- <span style="color: var(--v-theme-primary);">${displayedYear}</span>
175
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="18" height="18" class="ms-1" style="fill: var(--v-theme-primary);" aria-hidden="true"><path d="M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z" /></svg>
174
+ <div class="v-btn__content" data-no-activator="" style="color: ${primaryThemeColor};">
175
+ <span style="color: ${primaryThemeColor};">${displayedYear}</span>
176
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="18" height="18" class="ms-1" style="fill: ${primaryThemeColor};" aria-hidden="true"><path d="M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z" /></svg>
176
177
  </div>
177
178
  `
178
179
 
@@ -135,7 +135,7 @@
135
135
  .holiday-list {
136
136
  max-height: 200px;
137
137
  overflow-y: auto;
138
- background-color: #fff;
138
+ background-color: rgb(var(--v-theme-surface));
139
139
  padding: 10px;
140
140
  border-radius: 4px;
141
141
  border: 1px solid #e0e0e0;
@@ -9,7 +9,6 @@
9
9
  export type DateObjectValue = Date | (Date | null)[] | null
10
10
 
11
11
  /**
12
- * Alias pour maintenir la compatibilité avec le code existant
13
- * @deprecated Utilisez DateObjectValue pour les objets Date ou importez DateValue depuis useDateInitializationDayjs pour les chaînes
12
+ * @deprecated Utilisez DateObjectValue pour les objets Date ou importez DateModelValue depuis useDateInitializationDayjs pour les chaînes
14
13
  */
15
14
  export type DateValue = DateObjectValue
@@ -730,7 +730,7 @@ export const VuetifyOptions: Story = {
730
730
  rounded: 'xl',
731
731
  },
732
732
  cardTitle: {
733
- class: 'pa-5 mb-4 accent--text',
733
+ class: 'pa-5 mb-4 secondary--text',
734
734
  },
735
735
  closeBtn: {
736
736
  class: {
@@ -738,14 +738,14 @@ export const VuetifyOptions: Story = {
738
738
  },
739
739
  },
740
740
  icon: {
741
- color: 'accent',
741
+ color: 'secondary',
742
742
  },
743
743
  cancelBtn: {
744
- color: 'accent',
744
+ color: 'secondary',
745
745
  text: false,
746
746
  },
747
747
  confirmBtn: {
748
- color: 'accent',
748
+ color: 'secondary',
749
749
  text: true,
750
750
  },
751
751
  },
@@ -813,7 +813,7 @@ export const VuetifyOptions: Story = {
813
813
  rounded: 'xl',
814
814
  },
815
815
  cardTitle: {
816
- class: 'pa-5 mb-4 accent--text',
816
+ class: 'pa-5 mb-4 secondary--text',
817
817
  },
818
818
  closeBtn: {
819
819
  class: {
@@ -821,14 +821,14 @@ export const VuetifyOptions: Story = {
821
821
  },
822
822
  },
823
823
  icon: {
824
- color: 'accent',
824
+ color: 'secondary',
825
825
  },
826
826
  cancelBtn: {
827
- color: 'accent',
827
+ color: 'secondary',
828
828
  text: false,
829
829
  },
830
830
  confirmBtn: {
831
- color: 'accent',
831
+ color: 'secondary',
832
832
  text: true,
833
833
  },
834
834
  }
@@ -244,8 +244,6 @@
244
244
  </template>
245
245
 
246
246
  <style lang="scss" scoped>
247
- @use '@/assets/tokens' as *;
248
-
249
247
  .sy-dialog-box-actions :deep(.v-btn) {
250
248
  box-shadow: none;
251
249
  }
@@ -255,7 +253,7 @@
255
253
  }
256
254
 
257
255
  .v-btn--icon {
258
- color: $colors-icon-base;
256
+ color: rgb(var(--v-theme-iconBase));
259
257
  position: absolute;
260
258
  right: 24px;
261
259
  }
@@ -285,7 +283,7 @@ h2 {
285
283
  display: flex;
286
284
  flex-direction: column;
287
285
  justify-content: stretch;
288
- gap: $spacing-small;
286
+ gap: 16px;
289
287
  }
290
288
 
291
289
  .sy-dialog-box-draggable .sy-dialog-box-title {
@@ -303,7 +301,7 @@ h2 {
303
301
  user-select: none;
304
302
  }
305
303
 
306
- @media screen and (min-width: $container-mobile-max-width) {
304
+ @media screen and (width >= 600px) {
307
305
  .sy-dialog-box-actions-ctn {
308
306
  flex-direction: row;
309
307
  }
@@ -1,14 +1,13 @@
1
- import { Meta, Story, Primary } from '@storybook/addon-docs';
1
+ import { Meta } from '@storybook/addon-docs';
2
2
  import * as DialogBoxStories from '../DialogBox.stories.ts';
3
3
  import '@/stories/styles/shared.css';
4
4
  import AccessibilityIcon from '@/common/imgs/accessibility-svgrepo-com.svg';
5
+
5
6
  import {
6
- AccessibilityGuideLayout,
7
- CriteriaSection,
8
- CriteriaCard,
9
- DemoSection,
10
- BestPracticesSection,
11
- ResourcesSection,
7
+ AccessibilityGuideLayout,
8
+ CriteriaSection,
9
+ CriteriaCard,
10
+ AuditSection
12
11
  } from '@/stories/accessibility/AccessibilityGuideLayout.mdx';
13
12
 
14
13
  <Meta of={DialogBoxStories} />
@@ -16,20 +15,85 @@ import {
16
15
  componentName="DialogBox"
17
16
  iconSrc={AccessibilityIcon}
18
17
  >
19
- <div class="mt-2">
20
- <p>Rapport d’audit manuel : <a href="/audits/DialogBox.xlsx" style={{ color:'#0C41BD' }}>Voir le rapport</a></p>
21
- <p style={{ color: 'grey', fontSize: '14px', marginTop: '0px' }}>Correctifs associés (<a href="https://github.com/assurance-maladie-digital/design-system-v3/issues/798" target="_blank" style={{color:'#0C41BD'}}>issue #798</a>)</p>
22
- </div>
23
- <CriteriaSection>
24
- <CriteriaCard icon="🧩" title="Niveau de titre configurable via la prop headingLevel">
25
- <ul>
26
- <li>Le niveau du titre (h1 à h6) est défini grâce à la propriété <strong>headingLevel</strong> déclarée dans le composant. Si aucune valeur n’est fournie, le composant applique par défaut un titre de niveau h2, défini dans l’implémentation du composant.</li>
27
- <code>&lt;DialogBox
28
- :heading-level="2" /&gt; </code>
29
-
30
- <li><strong>Accessibilité</strong> : Permet que la hiérarchie entre les titres soit pertinente (critère 9.1.1 RGAA) </li>
31
- </ul>
32
- </CriteriaCard>
33
- </CriteriaSection>
18
+ <AuditSection>
19
+ <div>Rapport d’audit manuel : <a href="/audits/DialogBox.xlsx" style={{color: '#0C41BD'}}>Voir le rapport</a></div>
20
+ <div style={{color: 'grey', fontSize: '14px', marginTop: '0px'}}>
21
+ Correctifs associés (<a href="https://github.com/assurance-maladie-digital/design-system-v3/issues/798" target="_blank" style={{color: '#0C41BD'}}>issue #798</a>)
22
+ </div>
23
+ </AuditSection>
24
+ <CriteriaSection>
25
+ <CriteriaCard icon="🧩" title="Niveau de titre configurable via la prop headingLevel">
26
+ <ul>
27
+ <li>Le niveau du titre (h1 à h6) est défini grâce à la propriété <strong>headingLevel</strong> déclarée dans le composant. Si aucune valeur n’est fournie, le composant applique par défaut un titre de niveau h2, défini dans l’implémentation du composant.</li>
28
+ <code>&lt;DialogBox
29
+ :heading-level="2" /&gt; </code>
30
+
31
+ <li><strong>Accessibilité</strong> : Permet que la hiérarchie entre les titres soit pertinente (critère 9.1.1 RGAA) </li>
32
+
33
+ <li>Si aucune valeur n’est fournie, le composant applique par défaut un titre de niveau<strong> h2</strong>.</li>
34
+
35
+ <li>Ce titre est rendu via le composant<strong> SyHeading</strong>, ce qui garantit une structure sémantique correcte dans le DOM.</li>
36
+
37
+ <li><strong>Accessibilité :</strong> permet de respecter une hiérarchie de titres cohérente et pertinente pour les technologies d’assistance (critère 9.1.1 RGAA).</li>
38
+ </ul>
39
+ </CriteriaCard>
40
+
41
+ <CriteriaCard icon="🎯" title="Gestion automatique du focus à l’ouverture et à la fermeture">
42
+ <ul>
43
+ <li>À l’ouverture de la modale, le focus est déplacé soit sur le bouton de validation (<strong>autofocusValidateBtn</strong>), soit sur la zone de titre si la modale est draggable.</li>
44
+
45
+ <li>À la fermeture, le focus est automatiquement restauré sur l’élément qui avait le focus avant l’ouverture.</li>
46
+
47
+ <li><strong>Accessibilité :</strong> évite la perte de contexte pour les utilisateurs clavier et lecteurs d’écran (critère 7.3 RGAA).</li>
48
+ </ul>
49
+ </CriteriaCard>
50
+
51
+ <CriteriaCard icon="⌨️" title="Piégeage du focus dans la boîte de dialogue">
52
+ <ul>
53
+ <li>La navigation clavier avec la touche<strong> Tab </strong>est maintenue à l’intérieur de la modale.</li>
54
+
55
+ <li>Le focus boucle automatiquement entre le premier et le dernier élément interactif.</li>
56
+
57
+ <li>La combinaison<strong> Shift + Tab </strong>est également gérée.</li>
58
+
59
+ <li><strong>Accessibilité :</strong> empêche la sortie involontaire du focus hors de la fenêtre modale (critère 7.1 RGAA).</li>
60
+ </ul>
61
+ </CriteriaCard>
62
+
63
+ <CriteriaCard icon="🏷️" title="Association correcte du titre avec aria-labelledby">
64
+ <ul>
65
+ <li>Le composant utilise un identifiant unique généré avec <strong>useId() </strong>.</li>
66
+
67
+ <li>Cet identifiant est appliqué au titre et référencé via <strong> aria-labelledby </strong>sur le composant dialog.</li>
68
+
69
+ <li>Le composant déclare également<strong> aria-modal="true" </strong>.</li>
70
+
71
+ <li><strong>Accessibilité :</strong> permet aux lecteurs d’écran d’annoncer correctement le contexte de la fenêtre modale (critère 7.1 RGAA).</li>
72
+ </ul>
73
+ </CriteriaCard>
74
+
75
+ <CriteriaCard icon="✋" title="Support clavier du mode draggable">
76
+ <ul>
77
+ <li>Lorsque la prop<strong> draggable </strong>est activée, le titre devient focusable avec <strong>tabindex="0"</strong>.</li>
78
+
79
+ <li>Le déplacement peut être réalisé avec les flèches clavier (gauche, droite, haut, bas).</li>
80
+
81
+ <li>Des attributs<strong> title </strong>et <strong> aria-label </strong>expliquent l’usage aux utilisateurs.</li>
82
+
83
+ <li><strong>Accessibilité :</strong> rend le déplacement utilisable sans souris et améliore l’accessibilité fonctionnelle.</li>
84
+ </ul>
85
+ </CriteriaCard>
86
+
87
+ <CriteriaCard icon="❌" title="Bouton de fermeture explicite et accessible">
88
+ <ul>
89
+ <li>Le bouton de fermeture possède un<strong> aria-label </strong>explicite.</li>
90
+
91
+ <li>L’icône est décorative (<strong>decorative=true</strong>) pour éviter une lecture redondante.</li>
92
+
93
+ <li>Le style de focus visible est renforcé pour garantir une navigation clavier claire.</li>
34
94
 
95
+ <li><strong>Accessibilité :</strong> assure une identification immédiate de l’action de fermeture (critère 11.10 RGAA).</li>
96
+ </ul>
97
+ </CriteriaCard>
98
+ </CriteriaSection>
35
99
  </AccessibilityGuideLayout>
@@ -0,0 +1,76 @@
1
+ import { h } from 'vue'
2
+ import DialogBox from '../DialogBox.vue'
3
+
4
+ const dialogTransitionOptions = {
5
+ global: {
6
+ stubs: {
7
+ 'transition': false,
8
+ 'transition-group': false,
9
+ },
10
+ },
11
+ } as const
12
+
13
+ function waitForDialogTransitionEnd() {
14
+ cy.get('.v-overlay__content')
15
+ .should('be.visible')
16
+ .and('not.have.class', 'dialog-transition-enter-active')
17
+ }
18
+
19
+ describe('DialogBox - Visual regression tests', () => {
20
+ it('displays the opened dialog box', () => {
21
+ cy.mountWithVuetify(DialogBox, {
22
+ ...dialogTransitionOptions,
23
+ props: {
24
+ 'modelValue': true,
25
+ 'title': 'Confirmer la suppression',
26
+ 'onUpdate:modelValue': () => {},
27
+ },
28
+ slots: {
29
+ default: () => h('p', 'Êtes-vous sûr de vouloir supprimer cet élément ?'),
30
+ },
31
+ })
32
+
33
+ cy.get('.v-dialog').should('be.visible')
34
+ waitForDialogTransitionEnd()
35
+ cy.matchImageSnapshot('dialog-box-default')
36
+ })
37
+
38
+ it('displays the dialog box without actions', () => {
39
+ cy.mountWithVuetify(DialogBox, {
40
+ ...dialogTransitionOptions,
41
+ props: {
42
+ 'modelValue': true,
43
+ 'title': 'Information',
44
+ 'hideActions': true,
45
+ 'onUpdate:modelValue': () => {},
46
+ },
47
+ slots: {
48
+ default: () => h('p', 'Ceci est un message informatif.'),
49
+ },
50
+ })
51
+
52
+ cy.get('.v-dialog').should('be.visible')
53
+ waitForDialogTransitionEnd()
54
+ cy.matchImageSnapshot('dialog-box-no-actions')
55
+ })
56
+
57
+ it('displays the dialog box with custom texts', () => {
58
+ cy.mountWithVuetify(DialogBox, {
59
+ ...dialogTransitionOptions,
60
+ props: {
61
+ 'modelValue': true,
62
+ 'title': 'Valider le formulaire',
63
+ 'cancelBtnText': 'Annuler',
64
+ 'confirmBtnText': 'Valider',
65
+ 'onUpdate:modelValue': () => {},
66
+ },
67
+ slots: {
68
+ default: () => h('p', 'Souhaitez-vous valider ce formulaire ?'),
69
+ },
70
+ })
71
+
72
+ cy.get('.v-dialog').should('be.visible')
73
+ waitForDialogTransitionEnd()
74
+ cy.matchImageSnapshot('dialog-box-custom-texts')
75
+ })
76
+ })
@@ -19,8 +19,14 @@
19
19
  const props = withDefaults(defineProps<{
20
20
  uploadList: Item[]
21
21
  locales?: typeof defaultLocales
22
+ seeLabel?: string
23
+ importLabel?: string
24
+ deleteLabel?: string
22
25
  } & Widthable>(), {
23
26
  locales: () => defaultLocales,
27
+ seeLabel: undefined,
28
+ importLabel: undefined,
29
+ deleteLabel: undefined,
24
30
  })
25
31
 
26
32
  const { widthStyles } = useWidthable(props)
@@ -51,6 +57,9 @@
51
57
  :show-delete-btn="item.showDeleteBtn"
52
58
  tag="li"
53
59
  :locales="locales"
60
+ :see-label="seeLabel"
61
+ :import-label="importLabel"
62
+ :delete-label="deleteLabel"
54
63
  @upload="() => $emit('upload', uploadList.find((i) => i.id === item.id) as Item)"
55
64
  @preview="() => $emit('preview', uploadList.find((i) => i.id === item.id) as Item)"
56
65
  @delete="() => $emit('delete', uploadList.find((i) => i.id === item.id) as Item)"
@@ -66,8 +75,6 @@
66
75
  </template>
67
76
 
68
77
  <style lang="scss" scoped>
69
- @use '@/assets/tokens';
70
-
71
78
  .upload-list {
72
79
  display: flex;
73
80
  flex-direction: column;
@@ -206,14 +206,12 @@
206
206
  </template>
207
207
 
208
208
  <style lang="scss" scoped>
209
- @use '@/assets/tokens';
210
-
211
209
  .file-item {
212
210
  display: flex;
213
211
  flex-direction: column;
214
- gap: tokens.$gap-3;
215
- padding-block: tokens.$padding-4;
216
- border-bottom: 1px solid tokens.$colors-border-subdued;
212
+ gap: var(--v-gap-3);
213
+ padding-block: var(--v-padding-4);
214
+ border-bottom: 1px solid rgb(var(--v-theme-borderSubdued));
217
215
 
218
216
  &:first-child:last-child {
219
217
  border-bottom: none;
@@ -221,12 +219,12 @@
221
219
  }
222
220
 
223
221
  .file-item__title {
224
- font-size: tokens.$font-size-body-text;
222
+ font-size: var(--v-fontSize-corpsDeTexte);
225
223
  }
226
224
 
227
225
  .file-item__name {
228
226
  font-size: 0.875rem;
229
- color: tokens.$colors-text-base;
227
+ color: rgb(var(--v-theme-textBase));
230
228
  }
231
229
 
232
230
  .file-item__description {
@@ -252,7 +250,7 @@
252
250
 
253
251
  .file-item__content {
254
252
  display: flex;
255
- gap: tokens.$gap-4;
253
+ gap: var(--v-gap-4);
256
254
  align-items: center;
257
255
  }
258
256
 
@@ -263,9 +261,9 @@
263
261
  justify-content: center;
264
262
  margin-left: auto;
265
263
  height: 100%;
266
- gap: tokens.$gap-1;
264
+ gap: var(--v-gap-1);
267
265
 
268
- @media screen and (min-width: tokens.$container-tablet-max-width) {
266
+ @media screen and (width >= 960px) {
269
267
  flex-direction: row;
270
268
  }
271
269
  }
@@ -280,18 +278,18 @@
280
278
 
281
279
  .file-item__message {
282
280
  font-size: 0.875rem;
283
- color: tokens.$colors-text-subdued;
281
+ color: rgb(var(--v-theme-textSubdued));
284
282
  }
285
283
 
286
284
  .file-item__message-success,
287
285
  .file-item__message-error {
288
- margin-top: tokens.$gap-3;
286
+ margin-top: var(--v-gap-3);
289
287
  }
290
288
 
291
289
  .file-item__message-error {
292
290
  display: flex;
293
291
  align-items: center;
294
- gap: tokens.$gap-4;
292
+ gap: var(--v-gap-4);
295
293
  }
296
294
 
297
295
  </style>
@@ -135,6 +135,53 @@ describe('FileList', () => {
135
135
  expect(wrapper.emitted('preview')?.[0]?.[0]).toEqual(fileItem2)
136
136
  })
137
137
 
138
+ it('forwards seeLabel, importLabel, deleteLabel to all items', () => {
139
+ const wrapper = mount(FileList, {
140
+ props: {
141
+ uploadList: [
142
+ { id: 'file1', title: 'file1', state: 'initial' },
143
+ { id: 'file2', title: 'file2', state: 'success', showDeleteBtn: true, showPreviewBtn: true },
144
+ ],
145
+ importLabel: 'Ajouter',
146
+ seeLabel: 'Consulter',
147
+ deleteLabel: 'Retirer',
148
+ },
149
+ })
150
+
151
+ const item1 = wrapper.findAll('.file-item').at(0)
152
+ expect(item1!.find('.file-item__action-upload').text()).toContain('Ajouter')
153
+
154
+ const item2 = wrapper.findAll('.file-item').at(1)
155
+ expect(item2!.find('.file-item__action-preview').text()).toContain('Consulter')
156
+ expect(item2!.find('.file-item__action-delete').text()).toContain('Retirer')
157
+ })
158
+
159
+ it('uses locales for button labels when individual label props are not passed', () => {
160
+ const customLocales = {
161
+ ...locales,
162
+ import: 'Déposer',
163
+ see: 'Afficher',
164
+ delete: 'Effacer',
165
+ }
166
+
167
+ const wrapper = mount(FileList, {
168
+ props: {
169
+ uploadList: [
170
+ { id: 'file1', title: 'file1', state: 'initial' },
171
+ { id: 'file2', title: 'file2', state: 'success', showDeleteBtn: true, showPreviewBtn: true },
172
+ ],
173
+ locales: customLocales,
174
+ },
175
+ })
176
+
177
+ const item1 = wrapper.findAll('.file-item').at(0)
178
+ expect(item1!.find('.file-item__action-upload').text()).toContain('Importer le fichier')
179
+
180
+ const item2 = wrapper.findAll('.file-item').at(1)
181
+ expect(item2!.find('.file-item__action-preview').text()).toContain('Voir le fichier')
182
+ expect(item2!.find('.file-item__action-delete').text()).toContain('Supprimer le fichier')
183
+ })
184
+
138
185
  it('shows when a file is optional', () => {
139
186
  const wrapper = mount(FileList, {
140
187
  props: {
@@ -167,8 +167,6 @@
167
167
  </template>
168
168
 
169
169
  <style lang="scss" scoped>
170
- @use '@/assets/tokens';
171
-
172
170
  .sy-file-upload-wrapper {
173
171
  display: contents;
174
172
  }
@@ -176,14 +174,14 @@
176
174
  .sy-file-upload {
177
175
  cursor: pointer;
178
176
  position: relative;
179
- border: 1px dashed tokens.$colors-border-accent-primary;
180
- border-radius: tokens.$radius-rounded-lg;
177
+ border: 1px dashed rgb(var(--v-theme-borderAccentPrimary));
178
+ border-radius: var(--v-radius-roundedLg);
181
179
  transition: background 0.25s;
182
180
 
183
181
  &:hover,
184
182
  &:focus-within,
185
183
  &.dragover {
186
- background: tokens.$colors-background-surface-alt;
184
+ background: rgb(var(--v-theme-backgroundSurfaceAlt));
187
185
  }
188
186
 
189
187
  &.dark-mode {
@@ -88,8 +88,6 @@
88
88
  </template>
89
89
 
90
90
  <style lang="scss" scoped>
91
- @use '@/assets/tokens';
92
-
93
91
  .sy-file-upload-placeholder {
94
92
  display: flex;
95
93
  align-items: center;
@@ -98,14 +96,14 @@
98
96
 
99
97
  .sy-file-upload-caption {
100
98
  font-size: 0.875rem;
101
- color: tokens.$colors-text-subdued;
99
+ color: rgb(var(--v-theme-textSubdued));
102
100
  }
103
101
 
104
102
  .sy-file-upload-btn {
105
- border-radius: tokens.$radius-rounded;
103
+ border-radius: var(--v-radius-rounded);
106
104
  transition: background 0.25s;
107
105
  font-weight: 700 !important;
108
- font-size: tokens.$heading-3-font-size;
106
+ font-size: var(--v-fontSize-corpsDeTexte);
109
107
  padding: 10px 16px;
110
108
  }
111
109
  </style>
@@ -100,10 +100,8 @@
100
100
  </template>
101
101
 
102
102
  <style lang="scss" scoped>
103
- @use '@/assets/tokens';
104
-
105
103
  .v-badge :deep(.v-badge__badge) {
106
- color: tokens.$cyan-darken-40 !important;
104
+ color: rgb(var(--v-theme-cyan-darken40)) !important;
107
105
  background-color: white;
108
106
  }
109
107