@cnamts/synapse 1.0.16 → 1.0.17

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 (248) hide show
  1. package/dist/{DateFilter-DSwJUvBu.js → DateFilter-RHtdShO1.js} +1 -1
  2. package/dist/{NumberFilter-CwsbYyz4.js → NumberFilter-DXYz_b_w.js} +1 -1
  3. package/dist/{PeriodFilter-csnEZU30.js → PeriodFilter-CzphmrNu.js} +1 -1
  4. package/dist/{SelectFilter-Bd5fndzR.js → SelectFilter-a4fUV5Jp.js} +1 -1
  5. package/dist/{TextFilter-B6gxzq2a.js → TextFilter-CZ4LTKoq.js} +1 -1
  6. package/dist/components/Accordion/Accordion.d.ts +22 -7
  7. package/dist/components/Amelipro/AmeliproPatientLogged/AmeliproPatientLogged.d.ts +31 -8
  8. package/dist/components/Amelipro/AmeliproPatientLogged/types.d.ts +2 -1
  9. package/dist/components/Amelipro/AmeliproTabs/AmeliproTabBtn/AmeliproTabBtn.d.ts +1 -1
  10. package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +14 -5
  11. package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +10 -1
  12. package/dist/components/Amelipro/AmeliproTooltips/AmeliproTooltips.d.ts +6 -2
  13. package/dist/components/Amelipro/StructureMenu/StructureBtn/StructureBtn.d.ts +9 -0
  14. package/dist/components/Amelipro/StructureMenu/StructureItem/types.d.ts +1 -0
  15. package/dist/components/Amelipro/StructureMenu/StructureMenu.d.ts +9 -0
  16. package/dist/components/Amelipro/StructureMenu/StructureTabs/StructureTabs.d.ts +23 -2
  17. package/dist/components/ChipList/locales.d.ts +1 -0
  18. package/dist/components/CookieBanner/CookieBanner.d.ts +2 -2
  19. package/dist/components/Customs/SyTextField/SyTextField.d.ts +1 -1
  20. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +4 -4
  21. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +9 -11
  22. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +7 -10
  23. package/dist/components/DatePicker/composables/index.d.ts +0 -1
  24. package/dist/components/DialogBox/DialogBox.d.ts +3 -3
  25. package/dist/components/DialogBox/config.d.ts +4 -0
  26. package/dist/components/FilterSideBar/FilterSideBar.d.ts +10 -3
  27. package/dist/components/FilterSideBar/locales.d.ts +5 -0
  28. package/dist/components/HeaderBar/HeaderBar.d.ts +2 -0
  29. package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +14 -4
  30. package/dist/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.d.ts +5 -1
  31. package/dist/components/MaintenancePage/MaintenancePage.d.ts +8 -1
  32. package/dist/components/NotFoundPage/NotFoundPage.d.ts +9 -2
  33. package/dist/components/NotificationBar/Notification/Notification.d.ts +30 -0
  34. package/dist/components/NotificationBar/NotificationBar.d.ts +32 -20
  35. package/dist/components/PeriodField/PeriodField.d.ts +16 -16
  36. package/dist/components/SubHeader/SubHeader.d.ts +11 -8
  37. package/dist/components/SyTextArea/SyTextArea.d.ts +2 -0
  38. package/dist/components/SyTextArea/locales.d.ts +1 -0
  39. package/dist/components/UserMenuBtn/UserMenuBtn.d.ts +2 -0
  40. package/dist/design-system-v3.js +1 -1
  41. package/dist/design-system-v3.umd.cjs +18 -18
  42. package/dist/directives/lockFocus.d.ts +1 -1
  43. package/dist/{main-DkZZpa3S.js → main-BXIMMzFS.js} +9368 -9157
  44. package/dist/style.css +1 -1
  45. package/package.json +11 -4
  46. package/src/components/Accordion/Accessibilite/AccessibilityGuide.mdx +70 -241
  47. package/src/components/Accordion/Accordion.mdx +6 -1
  48. package/src/components/Accordion/Accordion.stories.ts +88 -9
  49. package/src/components/Accordion/Accordion.vue +56 -24
  50. package/src/components/Accordion/tests/Accordion.a11y.spec.ts +46 -0
  51. package/src/components/Accordion/tests/__snapshots__/accordion.spec.ts.snap +26 -30
  52. package/src/components/Accordion/tests/accordion.spec.ts +27 -26
  53. package/src/components/Amelipro/AmeliproPatientLogged/AmeliproPatientLogged.stories.ts +62 -34
  54. package/src/components/Amelipro/AmeliproPatientLogged/AmeliproPatientLogged.vue +48 -15
  55. package/src/components/Amelipro/AmeliproPatientLogged/__tests__/AmeliproPatientLogged.spec.ts +4 -2
  56. package/src/components/Amelipro/AmeliproPatientLogged/__tests__/__snapshots__/AmeliproPatientLogged.spec.ts.snap +54 -4
  57. package/src/components/Amelipro/AmeliproPatientLogged/types.d.ts +2 -1
  58. package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLogin.stories.ts +11 -5
  59. package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLoginForm/AmeliproPatientLoginForm.vue +8 -0
  60. package/src/components/Amelipro/AmeliproSelect/AmeliproSelect.vue +37 -1
  61. package/src/components/Amelipro/AmeliproSelect/__tests__/__snapshots__/AmeliproSelect.spec.ts.snap +2 -2
  62. package/src/components/Amelipro/AmeliproTabs/AmeliproTabs.stories.ts +94 -0
  63. package/src/components/Amelipro/AmeliproTabs/AmeliproTabs.vue +6 -2
  64. package/src/components/Amelipro/AmeliproTabs/__tests__/AmeliproTabs.spec.ts +4 -0
  65. package/src/components/Amelipro/AmeliproTabs/__tests__/__snapshots__/AmeliproTabs.spec.ts.snap +4 -2
  66. package/src/components/Amelipro/AmeliproTextField/AmeliproTextField.stories.ts +68 -0
  67. package/src/components/Amelipro/AmeliproTextField/AmeliproTextField.vue +110 -2
  68. package/src/components/Amelipro/AmeliproTextField/__tests__/AmeliproTextField.spec.ts +14 -2
  69. package/src/components/Amelipro/AmeliproTextField/__tests__/__snapshots__/AmeliproTextField.spec.ts.snap +2 -0
  70. package/src/components/Amelipro/AmeliproTooltips/AmeliproTooltips.stories.ts +45 -0
  71. package/src/components/Amelipro/AmeliproTooltips/AmeliproTooltips.vue +6 -0
  72. package/src/components/Amelipro/StructureMenu/StructureBtn/StructureBtn.vue +13 -0
  73. package/src/components/Amelipro/StructureMenu/StructureBtn/__tests__/StructureBtn.spec.ts +6 -0
  74. package/src/components/Amelipro/StructureMenu/StructureBtn/__tests__/__snapshots__/StructureBtn.spec.ts.snap +1 -1
  75. package/src/components/Amelipro/StructureMenu/StructureItem/StructureItem.vue +14 -2
  76. package/src/components/Amelipro/StructureMenu/StructureItem/__tests__/__snapshots__/StructureItem.spec.ts.snap +22 -6
  77. package/src/components/Amelipro/StructureMenu/StructureItem/types.d.ts +1 -0
  78. package/src/components/Amelipro/StructureMenu/StructureMenu.stories.ts +93 -63
  79. package/src/components/Amelipro/StructureMenu/StructureMenu.vue +5 -0
  80. package/src/components/Amelipro/StructureMenu/StructureTabs/StructureTabs.vue +22 -1
  81. package/src/components/Amelipro/StructureMenu/StructureTabs/__tests__/StructureTabs.spec.ts +4 -0
  82. package/src/components/Amelipro/StructureMenu/StructureTabs/__tests__/__snapshots__/StructureTabs.spec.ts.snap +2 -0
  83. package/src/components/Amelipro/StructureMenu/__tests__/StructureMenu.spec.ts +12 -6
  84. package/src/components/BackBtn/tests/BackBtn.a11y.spec.ts +20 -0
  85. package/src/components/BackToTopBtn/BackToTopBtn.stories.ts +9 -0
  86. package/src/components/BackToTopBtn/tests/BackToTopBtn.a11y.spec.ts +37 -0
  87. package/src/components/Captcha/tests/Captcha.a11y.spec.ts +49 -0
  88. package/src/components/ChipList/ChipList.stories.ts +15 -0
  89. package/src/components/ChipList/ChipList.vue +20 -17
  90. package/src/components/ChipList/locales.ts +1 -0
  91. package/src/components/ChipList/tests/ChipList.a11y.spec.ts +40 -0
  92. package/src/components/CollapsibleList/Accessibilite.mdx +67 -11
  93. package/src/components/CollapsibleList/tests/CollapsibleList.a11y.spec.ts +38 -0
  94. package/src/components/ContextualMenu/ContextualMenu.stories.ts +3 -0
  95. package/src/components/ContextualMenu/tests/ContextualMenu.a11y.spec.ts +30 -0
  96. package/src/components/CookieBanner/CookieBanner.stories.ts +15 -0
  97. package/src/components/CookieBanner/CookieBanner.vue +0 -1
  98. package/src/components/CookieBanner/tests/CookieBanner.a11y.spec.ts +29 -0
  99. package/src/components/CookiesSelection/CookiesInformation/tests/CookiesInformation.a11y.spec.ts +46 -0
  100. package/src/components/CookiesSelection/CookiesTable/tests/CookiesTable.a11y.spec.ts +37 -0
  101. package/src/components/CookiesSelection/tests/CookiesSelection.a11y.spec.ts +58 -0
  102. package/src/components/CopyBtn/CopyBtn.stories.ts +21 -0
  103. package/src/components/CopyBtn/tests/CopyBtn.a11y.spec.ts +40 -0
  104. package/src/components/Customs/Selects/SyBtnSelect/SyBtnSelect.stories.ts +30 -0
  105. package/src/components/Customs/Selects/SyBtnSelect/SyBtnSelect.vue +1 -0
  106. package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +27 -0
  107. package/src/components/Customs/Selects/SySelect/tests/SySelect.a11y.spec.ts +40 -0
  108. package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +7 -3
  109. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +20 -2
  110. package/src/components/Customs/SyCheckbox/tests/SyCheckbox.a11y.spec.ts +26 -0
  111. package/src/components/Customs/SyForm/SyForm.a11y.spec.ts +33 -0
  112. package/src/components/Customs/SyIcon/SyIcon.a11y.spec.ts +37 -0
  113. package/src/components/Customs/SyIcon/SyIcon.stories.ts +5 -0
  114. package/src/components/Customs/SyPagination/tests/SyPagination.a11y.spec.ts +27 -0
  115. package/src/components/Customs/SyRadioGroup/tests/SyRadioGroup.a11y.spec.ts +30 -0
  116. package/src/components/Customs/SyTabs/SyTabs.stories.ts +33 -0
  117. package/src/components/Customs/SyTabs/tests/SyTabs.a11y.spec.ts +51 -0
  118. package/src/components/Customs/SyTextField/SyTextField.stories.ts +3 -0
  119. package/src/components/Customs/SyTextField/SyTextField.vue +13 -11
  120. package/src/components/Customs/SyTextField/tests/SyTextField.a11y.spec.ts +27 -0
  121. package/src/components/DataList/tests/DataList.a11y.spec.ts +35 -0
  122. package/src/components/DataListGroup/tests/DataListGroup.a11y.spec.ts +24 -0
  123. package/src/components/DataListItem/tests/DataListItem.a11y.spec.ts +31 -0
  124. package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +45 -0
  125. package/src/components/DatePicker/CalendarMode/DatePicker.vue +76 -30
  126. package/src/components/DatePicker/CalendarMode/tests/DatePicker.a11y.spec.ts +27 -0
  127. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +54 -0
  128. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +79 -23
  129. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.a11y.spec.ts +26 -0
  130. package/src/components/DatePicker/DateTextInput/DateRange.stories.ts +12 -0
  131. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +0 -8
  132. package/src/components/DatePicker/DateTextInput/tests/DateTextInput.a11y.spec.ts +27 -0
  133. package/src/components/DatePicker/composables/index.ts +0 -1
  134. package/src/components/DatePicker/composables/useMonthButtonCustomization.ts +0 -1
  135. package/src/components/DiacriticPicker/tests/DiacriticPicker.a11y.spec.ts +46 -0
  136. package/src/components/DialogBox/DialogBox.stories.ts +5 -2
  137. package/src/components/DialogBox/DialogBox.vue +5 -0
  138. package/src/components/DialogBox/config.ts +5 -0
  139. package/src/components/DialogBox/tests/DialogBox.a11y.spec.ts +43 -0
  140. package/src/components/DownloadBtn/tests/DownloadBtn.a11y.spec.ts +26 -0
  141. package/src/components/ErrorPage/ErrorPage.stories.ts +60 -0
  142. package/src/components/ErrorPage/tests/ErrorPage.a11y.spec.ts +29 -0
  143. package/src/components/ExternalLinks/ExternalLinks.stories.ts +21 -0
  144. package/src/components/ExternalLinks/tests/ExternalLinks.a11y.spec.ts +39 -0
  145. package/src/components/FileList/FileList.stories.ts +3 -0
  146. package/src/components/FileList/tests/FileList.a11y.spec.ts +41 -0
  147. package/src/components/FilePreview/FilePreview.stories.ts +3 -0
  148. package/src/components/FilePreview/tests/FilePreview.a11y.spec.ts +47 -0
  149. package/src/components/FileUpload/tests/FileUpload.a11y.spec.ts +25 -0
  150. package/src/components/FilterInline/FilterInline.stories.ts +15 -0
  151. package/src/components/FilterInline/FilterInline.vue +8 -4
  152. package/src/components/FilterInline/tests/FilterInline.a11y.spec.ts +36 -0
  153. package/src/components/FilterInline/tests/__snapshots__/FilterInline.spec.ts.snap +0 -3
  154. package/src/components/FilterSideBar/Accessibilite.stories.ts +4 -0
  155. package/src/components/FilterSideBar/FilterSideBar.stories.ts +33 -11
  156. package/src/components/FilterSideBar/FilterSideBar.vue +146 -83
  157. package/src/components/FilterSideBar/locales.ts +6 -0
  158. package/src/components/FilterSideBar/tests/FilterSideBar.a11y.spec.ts +59 -0
  159. package/src/components/FilterSideBar/tests/FilterSideBar.spec.ts +2 -2
  160. package/src/components/FooterBar/Accessibilite.mdx +67 -11
  161. package/src/components/FooterBar/FooterBar.vue +1 -1
  162. package/src/components/FooterBar/config.ts +2 -2
  163. package/src/components/FooterBar/tests/FooterBar.a11y.spec.ts +31 -0
  164. package/src/components/FooterBar/tests/FooterBarConfig.spec.ts +1 -1
  165. package/src/components/FooterBar/tests/__snapshots__/FooterBar.spec.ts.snap +1 -1
  166. package/src/components/FranceConnectBtn/tests/FranceConnectBtn.a11y.spec.ts +25 -0
  167. package/src/components/HeaderBar/HeaderBar.stories.ts +21 -0
  168. package/src/components/HeaderBar/HeaderBar.vue +47 -40
  169. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderBurgerMenu.stories.ts +12 -0
  170. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.stories.ts +3 -0
  171. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.vue +4 -0
  172. package/src/components/HeaderBar/HeaderBurgerMenu/menu.scss +17 -7
  173. package/src/components/HeaderBar/consts.scss +0 -1
  174. package/src/components/HeaderBar/tests/HeaderBar.a11y.spec.ts +33 -0
  175. package/src/components/HeaderBar/tests/__snapshots__/HeaderBar.spec.ts.snap +58 -57
  176. package/src/components/HeaderLoading/tests/HeaderLoading.a11y.spec.ts +25 -0
  177. package/src/components/HeaderNavigationBar/HeaderNavigationBar.stories.ts +42 -0
  178. package/src/components/HeaderNavigationBar/HeaderNavigationBar.vue +4 -0
  179. package/src/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.vue +6 -2
  180. package/src/components/HeaderNavigationBar/tests/HeaderNavigationBar.a11y.spec.ts +45 -0
  181. package/src/components/HeaderToolbar/HeaderToolbar.stories.ts +6 -0
  182. package/src/components/HeaderToolbar/HeaderToolbar.vue +0 -3
  183. package/src/components/HeaderToolbar/tests/HeaderToolbar.a11y.spec.ts +25 -0
  184. package/src/components/LangBtn/LangBtn.stories.ts +12 -0
  185. package/src/components/LangBtn/tests/LangBtn.a11y.spec.ts +25 -0
  186. package/src/components/Logo/tests/Logo.a11y.spec.ts +20 -0
  187. package/src/components/LogoBrandSection/tests/LogoBrandSection.a11y.spec.ts +38 -0
  188. package/src/components/LunarCalendar/tests/LunarCalendar.a11y.spec.ts +31 -0
  189. package/src/components/MaintenancePage/MaintenancePage.stories.ts +46 -0
  190. package/src/components/MaintenancePage/MaintenancePage.vue +7 -5
  191. package/src/components/MaintenancePage/tests/MaintenancePage.a11y.spec.ts +21 -0
  192. package/src/components/NirField/NirField.stories.ts +6 -0
  193. package/src/components/NirField/tests/NirField.a11y.spec.ts +32 -0
  194. package/src/components/NotFoundPage/NotFoundPage.stories.ts +56 -0
  195. package/src/components/NotFoundPage/NotFoundPage.vue +7 -5
  196. package/src/components/NotFoundPage/tests/NotFoundPage.a11y.spec.ts +31 -0
  197. package/src/components/NotificationBar/Notification/Notification.vue +203 -0
  198. package/src/components/NotificationBar/NotificationBar.stories.ts +151 -140
  199. package/src/components/NotificationBar/NotificationBar.vue +148 -202
  200. package/src/components/NotificationBar/config.ts +1 -1
  201. package/src/components/NotificationBar/tests/NotificationBar.a11y.spec.ts +66 -0
  202. package/src/components/NotificationBar/tests/NotificationBar.spec.ts +173 -177
  203. package/src/components/NotificationBar/tests/__snapshots__/NotificationBar.spec.ts.snap +67 -29
  204. package/src/components/PageContainer/tests/PageContainer.a11y.spec.ts +27 -0
  205. package/src/components/PaginatedTable/PaginatedTable.stories.ts +6 -0
  206. package/src/components/PaginatedTable/PaginatedTable.vue +48 -1
  207. package/src/components/PaginatedTable/tests/PaginatedTable.a11y.spec.ts +43 -0
  208. package/src/components/PasswordField/PasswordField.stories.ts +39 -0
  209. package/src/components/PasswordField/tests/PasswordField.a11y.spec.ts +26 -0
  210. package/src/components/PeriodField/tests/PeriodField.a11y.spec.ts +31 -0
  211. package/src/components/PhoneField/PhoneField.stories.ts +51 -0
  212. package/src/components/PhoneField/tests/PhoneField.a11y.spec.ts +34 -0
  213. package/src/components/RangeField/tests/RangeField.a11y.spec.ts +32 -0
  214. package/src/components/RatingPicker/RatingPicker.stories.ts +21 -0
  215. package/src/components/SkipLink/Accessibilite.mdx +59 -13
  216. package/src/components/SkipLink/SkipLink.stories.ts +41 -8
  217. package/src/components/SubHeader/SubHeader.stories.ts +178 -92
  218. package/src/components/SubHeader/SubHeader.vue +84 -71
  219. package/src/components/SubHeader/config.ts +1 -1
  220. package/src/components/SyAlert/SyAlert.vue +1 -1
  221. package/src/components/SyTextArea/SyTextArea.stories.ts +40 -0
  222. package/src/components/SyTextArea/SyTextArea.vue +13 -0
  223. package/src/components/SyTextArea/locales.ts +1 -0
  224. package/src/components/SyTextArea/tests/SyTextArea.spec.ts +42 -0
  225. package/src/components/TableToolbar/TableToolbar.stories.ts +3 -0
  226. package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +70 -1
  227. package/src/components/Tables/SyTable/FilterRules.stories.ts +12 -0
  228. package/src/components/Tables/SyTable/SyTable.stories.ts +69 -0
  229. package/src/components/UserMenuBtn/UserMenuBtn.stories.ts +31 -1
  230. package/src/components/UserMenuBtn/UserMenuBtn.vue +2 -1
  231. package/src/components/UserMenuBtn/tests/UserMenuBtn.a11y.spec.ts +31 -0
  232. package/src/directives/lockFocus.ts +12 -2
  233. package/src/stories/GuideDuDev/ClassesUtilitaires/DataUtilities.mdx +6 -6
  234. package/src/stories/GuideDuDev/ClassesUtilitaires/DomBrowserUtilities.mdx +52 -59
  235. package/src/stories/GuideDuDev/ClassesUtilitaires/FormattingUtilities.mdx +9 -9
  236. package/src/stories/GuideDuDev/ClassesUtilitaires/StorageUtilities.mdx +2 -2
  237. package/src/stories/GuideDuDev/ClassesUtilitaires/ValidationRules.mdx +3 -3
  238. package/src/stories/GuideDuDev/ClassesUtilitaires/ValidationUtilities.mdx +11 -11
  239. package/src/stories/GuideDuDev/ClassesUtilitaires/index.mdx +15 -15
  240. package/src/stories/GuideDuDev/MigrationDepuisBridge.mdx +1 -1
  241. package/src/stories/GuideDuDev/moduleDeNotification.mdx +1 -1
  242. package/src/stories/accessibility/AccessibilityGuideLayout.mdx +87 -0
  243. package/src/stories/styles/accessibility-guide.css +153 -0
  244. package/dist/components/DatePicker/composables/useIconState.d.ts +0 -17
  245. package/src/components/Amelipro/AmeliproTextField/tests/__snapshots__/AmeliproTextField.spec.ts.snap +0 -162
  246. package/src/components/DatePicker/composables/tests/useIconState.spec.ts +0 -130
  247. package/src/components/DatePicker/composables/useIconState.ts +0 -53
  248. package/src/components/Usages/tests/Usages.spec.ts +0 -155
@@ -7,16 +7,12 @@
7
7
  import useAccordionState from './composables/useAccordionState'
8
8
  import useAccordionGroupCommunication from './composables/useAccordionGroupCommunication'
9
9
  import useAccordionKeyboardNavigation, { type AccordionItem as KeyboardNavigationItem } from './composables/useAccordionKeyboardNavigation'
10
-
11
- interface ContentObject {
12
- title: string
13
- content: string
14
- }
10
+ import SyIcon from '@/components/Customs/SyIcon/SyIcon.vue'
15
11
 
16
12
  interface AccordionItem {
17
13
  id: string
18
14
  title: string
19
- content: string | ContentObject
15
+ content: string | Record<string, unknown>
20
16
  headingLevel?: number
21
17
  disabled?: boolean
22
18
  }
@@ -117,7 +113,7 @@
117
113
  :is="getHeadingTag(item)"
118
114
  class="sy-accordion-heading"
119
115
  >
120
- <div
116
+ <span
121
117
  class="sy-accordion-title"
122
118
  :class="isItemOpen(item.id) ? `text-${options.accordion.activeColor}` : `text-${options.accordion.titleColor}`"
123
119
  >
@@ -125,10 +121,29 @@
125
121
  class="sy-accordion-icon"
126
122
  :class="{ 'sy-accordion-icon--open': isItemOpen(item.id) }"
127
123
  >
128
- <v-icon :icon="mdiChevronRight" />
124
+ <SyIcon
125
+ :icon="mdiChevronRight"
126
+ decorative
127
+ />
129
128
  </span>
130
- <span>{{ item.title }}</span>
131
- </div>
129
+ <slot
130
+ name="title"
131
+ :item="item"
132
+ :index="index"
133
+ >
134
+ <span>{{ item.title }}</span>
135
+ </slot>
136
+ </span>
137
+ <span
138
+ v-if="$slots['right-content']"
139
+ class="sy-accordion-right-content"
140
+ >
141
+ <slot
142
+ name="right-content"
143
+ :item="item"
144
+ :index="index"
145
+ />
146
+ </span>
132
147
  </component>
133
148
  </div>
134
149
 
@@ -141,20 +156,28 @@
141
156
  :tabindex="isItemOpen(item.id) ? 0 : -1"
142
157
  >
143
158
  <div class="sy-accordion-content-inner">
144
- <template v-if="typeof item.content === 'string'">
145
- <p class="sy-accordion-content-text">
146
- {{ item.content }}
147
- </p>
148
- </template>
149
- <template v-else>
150
- <div class="sy-accordion-content-item">
151
- <div class="sy-accordion-content-line">
152
- <strong>
153
- {{ item.content.title }}
154
- </strong>: {{ item.content.content }}
159
+ <slot
160
+ name="content"
161
+ :item="item"
162
+ :index="index"
163
+ :is-open="isItemOpen(item.id)"
164
+ >
165
+ <template v-if="typeof item.content === 'string'">
166
+ <p class="sy-accordion-content-text">
167
+ {{ item.content }}
168
+ </p>
169
+ </template>
170
+ <template v-else>
171
+ <div class="sy-accordion-content-item">
172
+ <p class="sy-accordion-content-text">
173
+ <strong>{{ (item.content as any).title }}</strong>
174
+ </p>
175
+ <p class="sy-accordion-content-text">
176
+ {{ (item.content as any).content }}
177
+ </p>
155
178
  </div>
156
- </div>
157
- </template>
179
+ </template>
180
+ </slot>
158
181
  </div>
159
182
  </div>
160
183
  </div>
@@ -175,6 +198,10 @@
175
198
 
176
199
  .sy-accordion-heading {
177
200
  margin: 0;
201
+ display: flex;
202
+ align-items: center;
203
+ justify-content: space-between;
204
+ width: 100%;
178
205
  }
179
206
 
180
207
  .sy-accordion-button {
@@ -197,6 +224,12 @@
197
224
  display: flex;
198
225
  }
199
226
 
227
+ .sy-accordion-right-content {
228
+ display: flex;
229
+ align-items: center;
230
+ margin-left: 16px;
231
+ }
232
+
200
233
  .sy-accordion-button:hover,
201
234
  .sy-accordion-content--open + .sy-accordion-button,
202
235
  .sy-accordion-item:has(.sy-accordion-content--open) .sy-accordion-button {
@@ -266,7 +299,6 @@
266
299
  }
267
300
 
268
301
  .sy-accordion-content-line {
269
- margin-bottom: 8px;
270
302
  line-height: 1.5;
271
303
  }
272
304
 
@@ -0,0 +1,46 @@
1
+ // @vitest-environment jsdom
2
+
3
+ import { describe, it } from 'vitest'
4
+ import { mount } from '@vue/test-utils'
5
+ import { axe } from 'vitest-axe'
6
+ import { assertNoA11yViolations } from '@tests/unit/accessibility/axeUtils'
7
+ import Accordion from '../Accordion.vue'
8
+
9
+ const defaultItems = [
10
+ { id: 'item1', title: 'Section 1', content: 'Contenu de la section 1' },
11
+ {
12
+ id: 'item2',
13
+ title: 'Section 2',
14
+ content: {
15
+ title: 'Sous-titre de la section 2',
16
+ content: 'Contenu détaillé de la section 2',
17
+ },
18
+ },
19
+ ]
20
+
21
+ // Test d'accessibilité dédié à Accordion, basé sur un scénario réaliste :
22
+ // - plusieurs items
23
+ // - ouvertures successives pour vérifier l'état ouvert/fermé et les attributs ARIA
24
+
25
+ describe('Accordion – accessibility (axe)', () => {
26
+ it('has no obvious axe violations when sections are opened', async () => {
27
+ const wrapper = mount(Accordion, {
28
+ props: {
29
+ items: defaultItems,
30
+ headingLevel: 2,
31
+ },
32
+ })
33
+
34
+ // Ouvrir les deux sections pour inclure le contenu dans l’audit axe
35
+ const buttons = wrapper.findAll('.sy-accordion-button')
36
+ if (buttons.length > 0) {
37
+ await buttons[0].trigger('click')
38
+ }
39
+ if (buttons.length > 1) {
40
+ await buttons[1].trigger('click')
41
+ }
42
+
43
+ const results = await axe(wrapper.element as HTMLElement)
44
+ assertNoA11yViolations(results, 'Accordion – sections opened')
45
+ })
46
+ })
@@ -23,24 +23,22 @@ exports[`Accordion > renders correctly 1`] = `
23
23
  tabindex="0"
24
24
  >
25
25
  <h2 class="sy-accordion-heading">
26
- <div class="
26
+ <span class="
27
27
  sy-accordion-title
28
28
  text-primary
29
29
  ">
30
30
  <span class="sy-accordion-icon">
31
- <v-icon-stub
32
- disabled="false"
33
- end="false"
31
+ <sy-icon-stub
32
+ autodetectbutton="false"
33
+ decorative="true"
34
34
  icon="M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z"
35
- size="default"
36
- start="false"
37
- tag="i"
38
- ></v-icon-stub>
35
+ ></sy-icon-stub>
39
36
  </span>
40
37
  <span>
41
38
  Section 1
42
39
  </span>
43
- </div>
40
+ </span>
41
+ <!-- v-if -->
44
42
  </h2>
45
43
  </div>
46
44
  <div
@@ -71,24 +69,22 @@ exports[`Accordion > renders correctly 1`] = `
71
69
  tabindex="0"
72
70
  >
73
71
  <h2 class="sy-accordion-heading">
74
- <div class="
72
+ <span class="
75
73
  sy-accordion-title
76
74
  text-primary
77
75
  ">
78
76
  <span class="sy-accordion-icon">
79
- <v-icon-stub
80
- disabled="false"
81
- end="false"
77
+ <sy-icon-stub
78
+ autodetectbutton="false"
79
+ decorative="true"
82
80
  icon="M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z"
83
- size="default"
84
- start="false"
85
- tag="i"
86
- ></v-icon-stub>
81
+ ></sy-icon-stub>
87
82
  </span>
88
83
  <span>
89
84
  Section 2
90
85
  </span>
91
- </div>
86
+ </span>
87
+ <!-- v-if -->
92
88
  </h2>
93
89
  </div>
94
90
  <div
@@ -119,24 +115,22 @@ exports[`Accordion > renders correctly 1`] = `
119
115
  tabindex="0"
120
116
  >
121
117
  <h2 class="sy-accordion-heading">
122
- <div class="
118
+ <span class="
123
119
  sy-accordion-title
124
120
  text-primary
125
121
  ">
126
122
  <span class="sy-accordion-icon">
127
- <v-icon-stub
128
- disabled="false"
129
- end="false"
123
+ <sy-icon-stub
124
+ autodetectbutton="false"
125
+ decorative="true"
130
126
  icon="M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z"
131
- size="default"
132
- start="false"
133
- tag="i"
134
- ></v-icon-stub>
127
+ ></sy-icon-stub>
135
128
  </span>
136
129
  <span>
137
130
  Section 3
138
131
  </span>
139
- </div>
132
+ </span>
133
+ <!-- v-if -->
140
134
  </h2>
141
135
  </div>
142
136
  <div
@@ -148,12 +142,14 @@ exports[`Accordion > renders correctly 1`] = `
148
142
  >
149
143
  <div class="sy-accordion-content-inner">
150
144
  <div class="sy-accordion-content-item">
151
- <div class="sy-accordion-content-line">
145
+ <p class="sy-accordion-content-text">
152
146
  <strong>
153
147
  Sous-titre de la section 3
154
148
  </strong>
155
- : Contenu détaillé de la section 3
156
- </div>
149
+ </p>
150
+ <p class="sy-accordion-content-text">
151
+ Contenu détaillé de la section 3
152
+ </p>
157
153
  </div>
158
154
  </div>
159
155
  </div>
@@ -83,7 +83,7 @@ describe('Accordion', () => {
83
83
  it('renders string content correctly', () => {
84
84
  const wrapper = mount(Accordion, {
85
85
  propsData: {
86
- items: [defaultItems[0]],
86
+ items: [defaultItems[0]!],
87
87
  headingLevel: 2,
88
88
  },
89
89
  })
@@ -92,13 +92,13 @@ describe('Accordion', () => {
92
92
  button.trigger('click')
93
93
 
94
94
  const content = wrapper.find('.sy-accordion-content-inner')
95
- expect(content.text()).toContain(defaultItems[0].content)
95
+ expect(content.text()).toContain(defaultItems[0]!.content)
96
96
  })
97
97
 
98
98
  it('renders object content correctly', async () => {
99
99
  const wrapper = mount(Accordion, {
100
100
  propsData: {
101
- items: [defaultItems[2]],
101
+ items: [defaultItems[2]!],
102
102
  headingLevel: 2,
103
103
  },
104
104
  })
@@ -106,10 +106,10 @@ describe('Accordion', () => {
106
106
  const button = wrapper.find('.sy-accordion-button')
107
107
  await button.trigger('click')
108
108
 
109
- const contentLine = wrapper.find('.sy-accordion-content-line')
110
- const objectContent = defaultItems[2].content as { title: string, content: string }
111
- expect(contentLine.text()).toContain(objectContent.title)
112
- expect(contentLine.text()).toContain(objectContent.content)
109
+ const objectContent = defaultItems[2]!.content as { title: string, content: string }
110
+ const content = wrapper.find('.sy-accordion-content-inner')
111
+ expect(content.text()).toContain(objectContent.title)
112
+ expect(content.text()).toContain(objectContent.content)
113
113
  })
114
114
 
115
115
  it('has correct accessibility attributes', () => {
@@ -263,26 +263,27 @@ describe('Accordion', () => {
263
263
  })
264
264
 
265
265
  // Ouvrir le premier accordéon (contenu string)
266
- const firstButton = wrapper.findAll('.sy-accordion-button')[0]
266
+ const firstButton = wrapper.findAll('.sy-accordion-button')[0]!
267
267
  await firstButton.trigger('click')
268
268
 
269
269
  // Vérifier que le contenu string est rendu dans un élément p
270
- const firstContent = wrapper.findAll('.sy-accordion-content-inner')[0]
270
+ const firstContent = wrapper.findAll('.sy-accordion-content-inner')[0]!
271
271
  const paragraph = firstContent.find('p.sy-accordion-content-text')
272
272
  expect(paragraph.exists()).toBe(true)
273
273
  expect(paragraph.text()).toBe('Contenu de la section 1')
274
274
 
275
275
  // Ouvrir le deuxième accordéon (contenu objet)
276
- const secondButton = wrapper.findAll('.sy-accordion-button')[1]
276
+ const secondButton = wrapper.findAll('.sy-accordion-button')[1]!
277
277
  await secondButton.trigger('click')
278
278
 
279
279
  // Vérifier que le contenu objet est rendu avec la structure appropriée
280
- const secondContent = wrapper.findAll('.sy-accordion-content-inner')[1]
281
- const contentLine = secondContent.find('.sy-accordion-content-line')
282
- expect(contentLine.exists()).toBe(true)
283
- expect(contentLine.find('strong').exists()).toBe(true)
284
- expect(contentLine.find('strong').text()).toBe('Sous-titre')
285
- expect(contentLine.text()).toContain('Contenu détaillé')
280
+ const secondContent = wrapper.findAll('.sy-accordion-content-inner')[1]!
281
+ const paragraphs = secondContent.findAll('p.sy-accordion-content-text')
282
+ expect(paragraphs.length).toBe(2)
283
+ expect(paragraphs[0]!.text()).toContain('Sous-titre')
284
+ expect(paragraphs[1]!.text()).toContain('Contenu détaillé')
285
+ // Le titre est affiché en gras
286
+ expect(paragraphs[0]!.find('strong').exists()).toBe(true)
286
287
  })
287
288
 
288
289
  it('applies custom colors from options', async () => {
@@ -372,11 +373,11 @@ describe('Accordion', () => {
372
373
  expect(buttons.length).toBeGreaterThan(1) // S'assurer qu'il y a plusieurs boutons
373
374
 
374
375
  // Ouvrir le premier accordéon
375
- await buttons[0].trigger('click')
376
+ await buttons[0]!.trigger('click')
376
377
  expect(wrapper.findAll('.sy-accordion-content--open').length).toBe(1)
377
378
 
378
379
  // Ouvrir le deuxième accordéon
379
- await buttons[1].trigger('click')
380
+ await buttons[1]!.trigger('click')
380
381
  expect(wrapper.findAll('.sy-accordion-content--open').length).toBe(2)
381
382
 
382
383
  // Vérifier que les deux accordéons sont ouverts
@@ -396,18 +397,18 @@ describe('Accordion', () => {
396
397
  expect(buttons.length).toBeGreaterThan(1) // S'assurer qu'il y a plusieurs boutons
397
398
 
398
399
  // Ouvrir le premier accordéon - il devrait avoir le focus
399
- await buttons[0].trigger('click')
400
- expect(buttons[0].classes()).toContain('sy-accordion-button--focused')
401
- expect(buttons[1].classes()).not.toContain('sy-accordion-button--focused')
400
+ await buttons[0]!.trigger('click')
401
+ expect(buttons[0]!.classes()).toContain('sy-accordion-button--focused')
402
+ expect(buttons[1]!.classes()).not.toContain('sy-accordion-button--focused')
402
403
 
403
404
  // Ouvrir le deuxième accordéon - le focus devrait être transféré
404
- await buttons[1].trigger('click')
405
- expect(buttons[0].classes()).not.toContain('sy-accordion-button--focused')
406
- expect(buttons[1].classes()).toContain('sy-accordion-button--focused')
405
+ await buttons[1]!.trigger('click')
406
+ expect(buttons[0]!.classes()).not.toContain('sy-accordion-button--focused')
407
+ expect(buttons[1]!.classes()).toContain('sy-accordion-button--focused')
407
408
 
408
409
  // Fermer le deuxième accordéon - le focus devrait être supprimé
409
- await buttons[1].trigger('click')
410
- expect(buttons[1].classes()).not.toContain('sy-accordion-button--focused')
410
+ await buttons[1]!.trigger('click')
411
+ expect(buttons[1]!.classes()).not.toContain('sy-accordion-button--focused')
411
412
  })
412
413
 
413
414
  it('removes event listener on component unmount', async () => {
@@ -4,12 +4,35 @@ import AmeliproPatientLogged from './AmeliproPatientLogged.vue'
4
4
  import { ref, watch } from 'vue'
5
5
 
6
6
  const meta = {
7
+ title: 'Composants/Amelipro/IDPA/AmeliproPatientLogged',
8
+ component: AmeliproPatientLogged,
9
+ parameters: {
10
+ controls: {
11
+ exclude: [
12
+ 'onClick:info',
13
+ 'onClick:copy',
14
+ 'onClick:pdf',
15
+ 'onClick:postal-address',
16
+ 'onClick:prevention',
17
+ 'onClick:fund-dialog',
18
+ 'onClick:doctor-dialog',
19
+ 'onClick:beneficiary-change',
20
+ 'onClick:patient-change',
21
+ ],
22
+ },
23
+ },
7
24
  argTypes: {
8
- 'btnMoreInfo': { description: 'Affiche le bouton plus d\'informations' },
25
+ 'btnPostalAddress': { description: 'Affiche le bouton adresse postale' },
26
+ 'btnPrevention': { description: 'Affiche le bouton prévention' },
9
27
  'isRestrictedData': { description: 'affiche la liste des bénéficiaires sans séléction possible' },
10
- 'click': { description: 'Evénement émis au click sur le bouton changer de patient' },
11
28
  'click:info': { description: 'Evénement émis au click sur le bouton informations' },
12
- 'click:more-info': { description: 'Evénement émis au click sur le bouton plus d\'informations' },
29
+ 'click:copy': { description: 'Evénement émis au click sur le bouton copier le texte' },
30
+ 'click:postal-address': { description: 'Evénement émis au click sur le bouton adresse postale' },
31
+ 'click:prevention': { description: 'Evénement émis au click sur le bouton prévention' },
32
+ 'click:fund-dialog': { description: 'Evénement émis au click sur le bouton caisse' },
33
+ 'click:doctor-dialog': { description: 'Evénement émis au click sur le bouton MT' },
34
+ 'click:beneficiary-change': { description: 'Evénement émis au changement de bénéficiaire' },
35
+ 'click:patient-change': { description: 'Evénement émis au click sur le bouton changement de patient' },
13
36
  'click:pdf': { description: 'Evénement émis au click sur le bouton pdf' },
14
37
  'default': { description: 'Espace libre avant le bouton informations supplémentaire au cas où il y aurait besoin de lignes supplémentaires' },
15
38
  'doctor': { description: 'Slot permettant de remplacer le contenu de la ligne médecin traitant au besoin' },
@@ -38,7 +61,7 @@ const meta = {
38
61
  firstName: string
39
62
  fund: string
40
63
  fundDialogTitle: string
41
- moreInfo: string
64
+ postalAddress: string
42
65
  mtm: string
43
66
  name: string
44
67
  nir: string
@@ -87,8 +110,6 @@ const meta = {
87
110
  'uniqueId': { description: 'Identifiant unique du composant' },
88
111
  'update:model-value': { description: 'Evénement émis à la mise à jour du v-model' },
89
112
  },
90
- component: AmeliproPatientLogged,
91
- title: 'Composants/Amelipro/IDPA/AmeliproPatientLogged',
92
113
  } as Meta<typeof AmeliproPatientLogged>
93
114
 
94
115
  export default meta
@@ -97,7 +118,8 @@ type Story = StoryObj<typeof AmeliproPatientLogged>
97
118
 
98
119
  export const Default: Story = {
99
120
  args: {
100
- 'btnMoreInfo': true,
121
+ 'btnPostalAddress': true,
122
+ 'btnPrevention': true,
101
123
  'doctorTooltipRed': true,
102
124
  'isRestrictedData': false,
103
125
  'patientInfos': {
@@ -133,9 +155,14 @@ export const Default: Story = {
133
155
  ],
134
156
  },
135
157
  'uniqueId': 'test-id',
136
- 'onClick': fn(),
137
158
  'onClick:info': fn(),
138
- 'onClick:more-info': fn(),
159
+ 'onClick:copy': fn(),
160
+ 'onClick:postal-address': fn(),
161
+ 'onClick:prevention': fn(),
162
+ 'onClick:fund-dialog': fn(),
163
+ 'onClick:doctor-dialog': fn(),
164
+ 'onClick:beneficiary-change': fn(),
165
+ 'onClick:patient-change': fn(),
139
166
  'onClick:pdf': fn(),
140
167
  },
141
168
  parameters: {
@@ -144,7 +171,7 @@ export const Default: Story = {
144
171
  name: 'Template',
145
172
  code: `<AmeliproPatientLogged
146
173
  v-model="myModel"
147
- :btn-more-info="true"
174
+ :postal-address-info="true"
148
175
  :doctor-tooltip-red="true"
149
176
  :patient-infos="{
150
177
  ame: 'oui',
@@ -222,31 +249,32 @@ export const Default: Story = {
222
249
  })
223
250
  return { args, model }
224
251
  },
225
- template: `<AmeliproPatientLogged
226
- v-bind="args"
227
- v-model="model"
228
- @click="args['onClick']"
229
- @click:infos="args['onClick:infos']"
230
- @click:more-infos="args['onClick:more-infos']"
231
- @click:pdf="args['onClick:pdf']"
232
- >
233
- <template #doctorDialog>
234
- <p>
235
- Contenu du slot "doctorDialog"
236
- </p>
237
- </template>
252
+ template: `
253
+ <div style="display: flex; justify-content: center;">
238
254
 
239
- <template #doctorDialogFooter>
240
- <p>
241
- Contenu du slot "doctorDialogFooter"
242
- </p>
243
- </template>
255
+ <AmeliproPatientLogged
256
+ v-bind="args"
257
+ v-model="model"
258
+ style="width: 350px !important;"
259
+ >
260
+ <template #doctorDialog>
261
+ <p>
262
+ Contenu du slot "doctorDialog"
263
+ </p>
264
+ </template>
244
265
 
245
- <template #fundDialog>
246
- <p>
247
- Contenu du slot "fundDialog"
248
- </p>
249
- </template>
250
- </AmeliproPatientLogged>`,
266
+ <template #doctorDialogFooter>
267
+ <p>
268
+ Contenu du slot "doctorDialogFooter"
269
+ </p>
270
+ </template>
271
+
272
+ <template #fundDialog>
273
+ <p>
274
+ Contenu du slot "fundDialog"
275
+ </p>
276
+ </template>
277
+ </AmeliproPatientLogged>
278
+ </div>`,
251
279
  }),
252
280
  }