@cnamts/synapse 1.0.6 → 1.0.8

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 (235) hide show
  1. package/dist/{DateFilter-BlOpwEVq.js → DateFilter-DkqG0pmr.js} +1 -1
  2. package/dist/{NumberFilter-BPUXE4wY.js → NumberFilter-Ck7AwD39.js} +1 -1
  3. package/dist/{PeriodFilter-B2yx329_.js → PeriodFilter-LRI6YpgU.js} +1 -1
  4. package/dist/{SelectFilter-CedKn1oV.js → SelectFilter-DPc70Jk7.js} +1 -1
  5. package/dist/{TextFilter-DkhJjRtR.js → TextFilter-DRQL7uD8.js} +1 -1
  6. package/dist/components/Amelipro/AmeliproAccordionGroup/AmeliproAccordionGroup.d.ts +116 -0
  7. package/dist/components/Amelipro/AmeliproAccordionGroup/types.d.ts +4 -0
  8. package/dist/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.d.ts +220 -0
  9. package/dist/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResult.d.ts +68 -0
  10. package/dist/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResultTemplate/AmeliproAccordionResultTemplate.d.ts +70 -0
  11. package/dist/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.d.ts +204 -0
  12. package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +26 -26
  13. package/dist/components/Amelipro/AmeliproBadge/AmeliproBadge.d.ts +59 -0
  14. package/dist/components/Amelipro/AmeliproBtn/AmeliproBtn.d.ts +3 -3
  15. package/dist/components/Amelipro/AmeliproCaptcha/AmeliproCaptcha.d.ts +1 -1
  16. package/dist/components/Amelipro/AmeliproCarousel/AmeliproCarousel.d.ts +214 -0
  17. package/dist/components/Amelipro/AmeliproCarousel/AmeliproCarouselItem/AmeliproCarouselItem.d.ts +70 -0
  18. package/dist/components/Amelipro/AmeliproCarousel/types.d.ts +7 -0
  19. package/dist/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.d.ts +125 -0
  20. package/dist/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.d.ts +1 -1
  21. package/dist/components/Amelipro/AmeliproIllustratedDataTile/AmeliproIllustratedDataTile.d.ts +2 -2
  22. package/dist/components/Amelipro/AmeliproResultList/AmeliproResultList.d.ts +164 -0
  23. package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +27 -27
  24. package/dist/components/Amelipro/AmeliproStateTile/AmeliproStateTile.d.ts +1 -1
  25. package/dist/components/Amelipro/AmeliproTable/AmeliproTable.d.ts +1 -1
  26. package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +32 -32
  27. package/dist/components/Amelipro/AmeliproTextArea/AmeliproTextArea.d.ts +6 -6
  28. package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +7 -7
  29. package/dist/components/Amelipro/AmeliproTileBtn/AmeliproTileBtn.d.ts +1 -1
  30. package/dist/components/Amelipro/AmeliproTooltips/AmeliproTooltips.d.ts +2 -2
  31. package/dist/components/ChipList/ChipList.d.ts +4 -0
  32. package/dist/components/ChipList/locales.d.ts +4 -2
  33. package/dist/components/CookiesSelection/CookiesInformation/CookiesInformation.d.ts +8 -8
  34. package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +329 -1296
  35. package/dist/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.d.ts +0 -1
  36. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +2 -0
  37. package/dist/components/Customs/SyTabs/SyTabs.d.ts +71 -0
  38. package/dist/components/Customs/SyTabs/config.d.ts +17 -0
  39. package/dist/components/Customs/SyTabs/types.d.ts +11 -0
  40. package/dist/components/Customs/SyTextField/SyTextField.d.ts +9 -9
  41. package/dist/components/DataList/DataList.d.ts +1 -1
  42. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +4811 -240
  43. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +52 -33
  44. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +23 -10
  45. package/dist/components/DatePicker/composables/useDateInputEditing.d.ts +1 -0
  46. package/dist/components/DatePicker/composables/useTodayButton.d.ts +1 -0
  47. package/dist/components/DialogBox/DialogBox.d.ts +219 -0
  48. package/dist/components/HeaderLoading/HeaderLoading.d.ts +27 -0
  49. package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +110 -3
  50. package/dist/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.d.ts +19 -1
  51. package/dist/components/LangBtn/LangBtn.d.ts +2 -2
  52. package/dist/components/NirField/NirField.d.ts +18 -18
  53. package/dist/components/PeriodField/PeriodField.d.ts +10766 -1620
  54. package/dist/components/PhoneField/PhoneField.d.ts +1866 -2
  55. package/dist/components/PhoneField/indicatifs.d.ts +1 -0
  56. package/dist/components/PhoneField/locales.d.ts +1 -0
  57. package/dist/components/RangeField/RangeField.d.ts +1 -1
  58. package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +1 -1
  59. package/dist/components/SubHeader/SubHeader.d.ts +8 -0
  60. package/dist/components/SubHeader/locales.d.ts +1 -0
  61. package/dist/components/SyTextArea/SyTextArea.d.ts +6 -6
  62. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +5 -4
  63. package/dist/components/Tables/SyTable/SyTable.d.ts +5 -4
  64. package/dist/components/Tables/common/SyTablePagination.d.ts +333 -1296
  65. package/dist/components/Tables/common/organizeColumns/OrganizeColumns.d.ts +2 -2
  66. package/dist/components/Tables/common/types.d.ts +2 -0
  67. package/dist/components/index.d.ts +9 -0
  68. package/dist/design-system-v3.js +173 -164
  69. package/dist/design-system-v3.umd.cjs +286 -263
  70. package/dist/{main-BXPFSAB4.js → main-DXMoMtj5.js} +13176 -11457
  71. package/dist/services/NotificationService.d.ts +1 -0
  72. package/dist/style.css +1 -1
  73. package/package.json +1 -1
  74. package/src/assets/amelipro/icons.ts +38 -11
  75. package/src/components/Amelipro/AmeliproAccordionGroup/AmeliproAccordionGroup.mdx +20 -0
  76. package/src/components/Amelipro/AmeliproAccordionGroup/AmeliproAccordionGroup.stories.ts +135 -0
  77. package/src/components/Amelipro/AmeliproAccordionGroup/AmeliproAccordionGroup.vue +107 -0
  78. package/src/components/Amelipro/AmeliproAccordionGroup/__tests__/AmeliproAccordionGroup.spec.ts +37 -0
  79. package/src/components/Amelipro/AmeliproAccordionGroup/__tests__/__snapshots__/AmeliproAccordionGroup.spec.ts.snap +513 -0
  80. package/src/components/Amelipro/AmeliproAccordionGroup/types.d.ts +4 -0
  81. package/src/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.mdx +16 -0
  82. package/src/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.stories.ts +300 -0
  83. package/src/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.vue +288 -0
  84. package/src/components/Amelipro/AmeliproAccordionList/__tests__/AmeliproAccordionList.spec.ts +38 -0
  85. package/src/components/Amelipro/AmeliproAccordionList/__tests__/__snapshots__/AmeliproAccordionList.spec.ts.snap +1712 -0
  86. package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResult.mdx +19 -0
  87. package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResult.stories.ts +68 -0
  88. package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResult.vue +66 -0
  89. package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResultTemplate/AmeliproAccordionResultTemplate.vue +145 -0
  90. package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResultTemplate/__tests__/AmeliproAccordionResultTemplate.spec.ts +24 -0
  91. package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResultTemplate/__tests__/__snapshots__/AmeliproAccordionResultTemplate.spec.ts.snap +127 -0
  92. package/src/components/Amelipro/AmeliproAccordionResult/__tests__/AmeliproAccordionResult.spec.ts +24 -0
  93. package/src/components/Amelipro/AmeliproAccordionResult/__tests__/__snapshots__/AmeliproAccordionResult.spec.ts.snap +123 -0
  94. package/src/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.mdx +20 -0
  95. package/src/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.stories.ts +273 -0
  96. package/src/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.vue +275 -0
  97. package/src/components/Amelipro/AmeliproAccordionResultList/__tests__/AmeliproAccordionResultList.spec.ts +38 -0
  98. package/src/components/Amelipro/AmeliproAccordionResultList/__tests__/__snapshots__/AmeliproAccordionResultList.spec.ts.snap +1593 -0
  99. package/src/components/Amelipro/AmeliproBadge/AmeliproBadge.mdx +15 -0
  100. package/src/components/Amelipro/AmeliproBadge/AmeliproBadge.stories.ts +54 -0
  101. package/src/components/Amelipro/AmeliproBadge/AmeliproBadge.vue +76 -0
  102. package/src/components/Amelipro/AmeliproBadge/__tests__/AmeliproBadge.spec.ts +20 -0
  103. package/src/components/Amelipro/AmeliproBadge/__tests__/__snapshots__/AmeliproBadge.spec.ts.snap +19 -0
  104. package/src/components/Amelipro/AmeliproCarousel/AmeliproCarousel.mdx +15 -0
  105. package/src/components/Amelipro/AmeliproCarousel/AmeliproCarousel.stories.ts +191 -0
  106. package/src/components/Amelipro/AmeliproCarousel/AmeliproCarousel.vue +263 -0
  107. package/src/components/Amelipro/AmeliproCarousel/AmeliproCarouselItem/AmeliproCarouselItem.vue +93 -0
  108. package/src/components/Amelipro/AmeliproCarousel/AmeliproCarouselItem/__tests__/AmeliproCarouselItem.spec.ts +24 -0
  109. package/src/components/Amelipro/AmeliproCarousel/AmeliproCarouselItem/__tests__/__snapshots__/AmeliproCarouselItem.spec.ts.snap +43 -0
  110. package/src/components/Amelipro/AmeliproCarousel/__tests__/AmeliproCarousel.spec.ts +40 -0
  111. package/src/components/Amelipro/AmeliproCarousel/__tests__/__snapshots__/AmeliproCarousel.spec.ts.snap +342 -0
  112. package/src/components/Amelipro/AmeliproCarousel/types.d.ts +8 -0
  113. package/src/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.mdx +18 -0
  114. package/src/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.stories.ts +67 -0
  115. package/src/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.vue +233 -0
  116. package/src/components/Amelipro/AmeliproClickableTile/tests/AmeliproClickableTile.spec.ts +21 -0
  117. package/src/components/Amelipro/AmeliproClickableTile/tests/__snapshots__/AmeliproClickableTile.spec.ts.snap +140 -0
  118. package/src/components/Amelipro/AmeliproHeader/AmeliproHeader.vue +7 -1
  119. package/src/components/Amelipro/AmeliproHeader/tests/__snapshots__/AmeliproHeader.spec.ts.snap +5 -4
  120. package/src/components/Amelipro/AmeliproIcon/iconList.ts +6 -0
  121. package/src/components/Amelipro/AmeliproPageLayout/tests/__snapshots__/AmeliproPageLayout.spec.ts.snap +5 -4
  122. package/src/components/Amelipro/AmeliproResultList/AmeliproResultList.mdx +15 -0
  123. package/src/components/Amelipro/AmeliproResultList/AmeliproResultList.stories.ts +264 -0
  124. package/src/components/Amelipro/AmeliproResultList/AmeliproResultList.vue +231 -0
  125. package/src/components/Amelipro/AmeliproResultList/__tests__/AmeliproResultList.spec.ts +37 -0
  126. package/src/components/Amelipro/AmeliproResultList/__tests__/__snapshots__/AmeliproResultList.spec.ts.snap +434 -0
  127. package/src/components/Amelipro/AmeliproTable/AmeliproTable.vue +6 -5
  128. package/src/components/Amelipro/AmeliproTable/__tests__/__snapshots__/AmeliproTable.spec.ts.snap +23 -26
  129. package/src/components/Amelipro/AmeliproTileBtn/AmeliproTileBtn.stories.ts +2 -2
  130. package/src/components/ChipList/Accessibilite.stories.ts +4 -0
  131. package/src/components/ChipList/ChipList.vue +185 -42
  132. package/src/components/ChipList/locales.ts +4 -2
  133. package/src/components/ChipList/tests/chipList.spec.ts +7 -4
  134. package/src/components/Customs/Selects/SelectOverview.mdx +34 -66
  135. package/src/components/Customs/Selects/SyBtnSelect/SyBtnSelect.stories.ts +10 -10
  136. package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.mdx +3 -0
  137. package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.stories.ts +14 -0
  138. package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +14 -6
  139. package/src/components/Customs/Selects/SySelect/SySelect.vue +268 -205
  140. package/src/components/Customs/Selects/SySelect/composables/tests/useSySelectKeyboard.spec.ts +0 -10
  141. package/src/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.ts +0 -5
  142. package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +184 -25
  143. package/src/components/Customs/SyCheckbox/SyCheckbox.mdx +3 -1
  144. package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +165 -0
  145. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +28 -9
  146. package/src/components/Customs/SyTabs/Accessibilite.mdx +309 -0
  147. package/src/components/Customs/SyTabs/SyTabs.mdx +117 -0
  148. package/src/components/Customs/SyTabs/SyTabs.stories.ts +354 -0
  149. package/src/components/Customs/SyTabs/SyTabs.vue +413 -0
  150. package/src/components/Customs/SyTabs/config.ts +17 -0
  151. package/src/components/Customs/SyTabs/tests/SyTabs.spec.ts +425 -0
  152. package/src/components/Customs/SyTabs/types.ts +12 -0
  153. package/src/components/Customs/SyTextField/SyTextField.mdx +3 -0
  154. package/src/components/Customs/SyTextField/SyTextField.stories.ts +142 -1
  155. package/src/components/Customs/SyTextField/SyTextField.vue +19 -16
  156. package/src/components/DataList/DataList.vue +47 -49
  157. package/src/components/DataListGroup/DataListGroup.vue +1 -1
  158. package/src/components/DataListItem/DataListItem.vue +67 -63
  159. package/src/components/DataListItem/tests/DataListItem.spec.ts +2 -2
  160. package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +3 -3
  161. package/src/components/DatePicker/CalendarMode/DatePicker.vue +49 -13
  162. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +412 -649
  163. package/src/components/DatePicker/DatePickerValidationExample/CalendarMode.stories.ts +215 -0
  164. package/src/components/DatePicker/DatePickerValidationExample/ComplexDatePicker.stories.ts +218 -0
  165. package/src/components/DatePicker/DatePickerValidationExample/DatePickerValidation.mdx +2 -0
  166. package/src/components/DatePicker/DatePickerValidationExample/DatePickerValidation.stories.ts +1 -1
  167. package/src/components/DatePicker/DatePickerValidationExample/DateTextInput.stories.ts +218 -0
  168. package/src/components/DatePicker/DatePickerValidationExample/MultiMode.stories.ts +281 -0
  169. package/src/components/DatePicker/DateTextInput/DateTextInput.events.spec.ts +17 -4
  170. package/src/components/DatePicker/DateTextInput/DateTextInput.range.spec.ts +111 -18
  171. package/src/components/DatePicker/DateTextInput/DateTextInput.spec.ts +238 -6
  172. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +716 -757
  173. package/src/components/DatePicker/composables/tests/useDateInputEditing.spec.ts +4 -4
  174. package/src/components/DatePicker/composables/tests/useDisplayedDateString.spec.ts +17 -10
  175. package/src/components/DatePicker/composables/useDateInputEditing.ts +52 -22
  176. package/src/components/DatePicker/composables/useDisplayedDateString.ts +18 -4
  177. package/src/components/DatePicker/composables/useTodayButton.ts +13 -1
  178. package/src/components/DatePicker/utils/dateFormattingUtils.ts +79 -14
  179. package/src/components/DialogBox/DialogBox.stories.ts +12 -0
  180. package/src/components/DialogBox/DialogBox.vue +16 -11
  181. package/src/components/DialogBox/tests/DialogBox.spec.ts +22 -0
  182. package/src/components/HeaderLoading/Accessibilite.mdx +429 -8
  183. package/src/components/HeaderLoading/Accessibilite.stories.ts +4 -0
  184. package/src/components/HeaderLoading/HeaderLoading.vue +59 -0
  185. package/src/components/HeaderNavigationBar/HeaderNavigationBar.mdx +17 -2
  186. package/src/components/HeaderNavigationBar/HeaderNavigationBar.stories.ts +91 -2
  187. package/src/components/HeaderNavigationBar/HeaderNavigationBar.vue +37 -1
  188. package/src/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.vue +284 -21
  189. package/src/components/HeaderNavigationBar/tests/HeaderNavigationBar.spec.ts +2 -2
  190. package/src/components/NirField/NirField.mdx +3 -0
  191. package/src/components/NirField/NirField.vue +10 -1
  192. package/src/components/NirField/tests/NirField.spec.ts +81 -0
  193. package/src/components/NotificationBar/NotificationBar.stories.ts +128 -2
  194. package/src/components/NotificationBar/NotificationBar.vue +16 -1
  195. package/src/components/NotificationBar/tests/NotificationBar.spec.ts +65 -0
  196. package/src/components/PasswordField/PasswordField.mdx +3 -0
  197. package/src/components/PeriodField/PeriodField.mdx +2 -0
  198. package/src/components/PeriodField/PeriodField.stories.ts +195 -0
  199. package/src/components/PhoneField/Accessibilite.stories.ts +4 -0
  200. package/src/components/PhoneField/PhoneField.mdx +3 -1
  201. package/src/components/PhoneField/PhoneField.stories.ts +285 -1
  202. package/src/components/PhoneField/PhoneField.vue +228 -95
  203. package/src/components/PhoneField/indicatifs.ts +102 -102
  204. package/src/components/PhoneField/locales.ts +1 -0
  205. package/src/components/PhoneField/tests/PhoneField.spec.ts +419 -2
  206. package/src/components/SkipLink/SkipLink.vue +3 -31
  207. package/src/components/SkipLink/tests/skipLink.spec.ts +0 -21
  208. package/src/components/SubHeader/Accessibilite.stories.ts +8 -0
  209. package/src/components/SubHeader/SubHeader.mdx +1 -0
  210. package/src/components/SubHeader/SubHeader.stories.ts +179 -60
  211. package/src/components/SubHeader/SubHeader.vue +45 -15
  212. package/src/components/SubHeader/locales.ts +1 -0
  213. package/src/components/SyAlert/SyAlert.vue +6 -0
  214. package/src/components/Tables/SyServerTable/SyServerTable.mdx +3 -10
  215. package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +242 -0
  216. package/src/components/Tables/SyServerTable/SyServerTable.vue +29 -10
  217. package/src/components/Tables/SyTable/SyTable.mdx +3 -10
  218. package/src/components/Tables/SyTable/SyTable.stories.ts +242 -0
  219. package/src/components/Tables/SyTable/SyTable.vue +2 -0
  220. package/src/components/Tables/common/SyTablePagination.vue +13 -6
  221. package/src/components/Tables/common/filters/tests/SelectFilter.spec.ts +6 -1
  222. package/src/components/Tables/common/tests/SyTablePagination.spec.ts +157 -0
  223. package/src/components/Tables/common/types.ts +2 -0
  224. package/src/components/index.ts +9 -0
  225. package/src/composables/useFilterable/useFilterable.ts +10 -0
  226. package/src/designTokens/tokens/amelipro/apColors.ts +1 -1
  227. package/src/designTokens/tokens/cnam/cnamSemantic.ts +3 -3
  228. package/src/services/NotificationService.ts +9 -0
  229. package/src/stories/Components/Components.stories.ts +1 -1
  230. package/src/stories/GuideDuDev/FormValidationGuide.mdx +342 -0
  231. package/src/stories/Templates/Templates.stories.ts +1 -1
  232. package/src/utils/functions/ameliproColors/ameliproColors.ts +1 -1
  233. package/dist/components/DataList/locales.d.ts +0 -3
  234. package/src/components/DataList/locales.ts +0 -3
  235. package/src/components/PhoneField/tests/PhoneField.additional.spec.ts +0 -266
@@ -61,6 +61,15 @@ const meta = {
61
61
  type: { summary: 'DataOptions', detail: '{ page: number, itemsPerPage: number, sortBy: SortOptions[], groupBy?: SortOptions[], multiSort?: boolean, mustSort?: boolean, filters?: FilterOption[] }' },
62
62
  },
63
63
  },
64
+ itemsPerPageOptions: {
65
+ description: 'Limite les options disponibles dans le sélecteur "itemsPerPage"',
66
+ control: { type: 'object' },
67
+ table: {
68
+ category: 'props',
69
+ type: { summary: 'number[]' },
70
+ defaultValue: { summary: 'undefined' },
71
+ },
72
+ },
64
73
  suffix: {
65
74
  description: 'Suffixe permettant de gérer individuellement le stockage des options d\'un tableau d\'une page à l\'autre. Ce prop est obligatoire pour garantir un stockage unique pour chaque tableau.',
66
75
  control: { type: 'text' },
@@ -3359,3 +3368,236 @@ export const SlotHeaders: Story = {
3359
3368
  }
3360
3369
  },
3361
3370
  }
3371
+
3372
+ export const ItemsPerPageOptions: Story = {
3373
+ parameters: {
3374
+ sourceCode: [
3375
+ {
3376
+ name: 'Template',
3377
+ code: `
3378
+ <template>
3379
+ <SyTable
3380
+ v-model:options="options"
3381
+ :headers="headers"
3382
+ :items="items"
3383
+ :items-per-page-options="[5, 10, 15]"
3384
+ suffix="items-per-page-options-table"
3385
+ />
3386
+ </template>
3387
+ `,
3388
+ },
3389
+ {
3390
+ name: 'Script',
3391
+ code: `
3392
+ <script setup lang="ts">
3393
+ import { ref } from 'vue'
3394
+ import { SyTable } from '@cnamts/synapse'
3395
+
3396
+ const options = ref({
3397
+ itemsPerPage: 5,
3398
+ })
3399
+
3400
+ const headers = ref([
3401
+ {
3402
+ title: 'Nom',
3403
+ key: 'lastname',
3404
+ },
3405
+ {
3406
+ title: 'Prénom',
3407
+ key: 'firstname',
3408
+ },
3409
+ {
3410
+ title: 'Email',
3411
+ value: 'email',
3412
+ },
3413
+ ])
3414
+
3415
+ const items = ref([
3416
+ {
3417
+ firstname: 'Virginie',
3418
+ lastname: 'Beauchesne',
3419
+ email: 'virginie.beauchesne@example.com',
3420
+ },
3421
+ {
3422
+ firstname: 'Simone',
3423
+ lastname: 'Bellefeuille',
3424
+ email: 'simone.bellefeuille@example.com',
3425
+ },
3426
+ {
3427
+ firstname: 'Étienne',
3428
+ lastname: 'Salois',
3429
+ email: 'etienne.salois@example.com',
3430
+ },
3431
+ {
3432
+ firstname: 'Thierry',
3433
+ lastname: 'Bobu',
3434
+ email: 'thierry.bobu@example.com',
3435
+ },
3436
+ {
3437
+ firstname: 'Bernadette',
3438
+ lastname: 'Langelier',
3439
+ email: 'bernadette.langelier@exemple.com',
3440
+ },
3441
+ {
3442
+ firstname: 'Agate',
3443
+ lastname: 'Roy',
3444
+ email: 'agate.roy@exemple.com',
3445
+ },
3446
+ {
3447
+ firstname: 'Théo',
3448
+ lastname: 'Garnier',
3449
+ email: 'theo.garnier@exemple.com',
3450
+ },
3451
+ {
3452
+ firstname: 'Clara',
3453
+ lastname: 'Moreau',
3454
+ email: 'clara.moreau@exemple.com',
3455
+ },
3456
+ {
3457
+ firstname: 'Lucas',
3458
+ lastname: 'Lefebvre',
3459
+ email: 'lucas.lefebre@exemple.com',
3460
+ },
3461
+ {
3462
+ firstname: 'Emma',
3463
+ lastname: 'Dubois',
3464
+ email: 'emma.dubois@exemple.com',
3465
+ },
3466
+ {
3467
+ firstname: 'Julien',
3468
+ lastname: 'Martin',
3469
+ email: 'julien.martin@exemple.com',
3470
+ },
3471
+ {
3472
+ firstname: 'Sophie',
3473
+ lastname: 'Bernard',
3474
+ email: 'sophie.bernard@exemple.com',
3475
+ },
3476
+ {
3477
+ firstname: 'Antoine',
3478
+ lastname: 'Lemoine',
3479
+ email: 'antoine.lemoine@exemple.com',
3480
+ },
3481
+ {
3482
+ firstname: 'Camille',
3483
+ lastname: 'Rousseau',
3484
+ email: 'camille.rousseau@exemple.com',
3485
+ },
3486
+ ])
3487
+ </script>
3488
+ `,
3489
+ },
3490
+ ],
3491
+ },
3492
+ args: {
3493
+ 'headers': [
3494
+ {
3495
+ title: 'Nom',
3496
+ key: 'lastname',
3497
+ },
3498
+ {
3499
+ title: 'Prénom',
3500
+ key: 'firstname',
3501
+ },
3502
+ {
3503
+ title: 'Email',
3504
+ value: 'email',
3505
+ },
3506
+ ],
3507
+ 'items': [
3508
+ {
3509
+ firstname: 'Virginie',
3510
+ lastname: 'Beauchesne',
3511
+ email: 'virginie.beauchesne@example.com',
3512
+ },
3513
+ {
3514
+ firstname: 'Simone',
3515
+ lastname: 'Bellefeuille',
3516
+ email: 'simone.bellefeuille@example.com',
3517
+ },
3518
+ {
3519
+ firstname: 'Étienne',
3520
+ lastname: 'Salois',
3521
+ email: 'etienne.salois@example.com',
3522
+ },
3523
+ {
3524
+ firstname: 'Thierry',
3525
+ lastname: 'Bobu',
3526
+ email: 'thierry.bobu@example.com',
3527
+ },
3528
+ {
3529
+ firstname: 'Bernadette',
3530
+ lastname: 'Langelier',
3531
+ email: 'bernadette.langelier@exemple.com',
3532
+ },
3533
+ {
3534
+ firstname: 'Agate',
3535
+ lastname: 'Roy',
3536
+ email: 'agate.roy@exemple.com',
3537
+ },
3538
+ {
3539
+ firstname: 'Théo',
3540
+ lastname: 'Garnier',
3541
+ email: 'theo.garnier@exemple.com',
3542
+ },
3543
+ {
3544
+ firstname: 'Clara',
3545
+ lastname: 'Moreau',
3546
+ email: 'clara.moreau@exemple.com',
3547
+ },
3548
+ {
3549
+ firstname: 'Lucas',
3550
+ lastname: 'Lefebvre',
3551
+ email: 'lucas.lefebre@exemple.com',
3552
+ },
3553
+ {
3554
+ firstname: 'Emma',
3555
+ lastname: 'Dubois',
3556
+ email: 'emma.dubois@exemple.com',
3557
+ },
3558
+ {
3559
+ firstname: 'Julien',
3560
+ lastname: 'Martin',
3561
+ email: 'julien.martin@exemple.com',
3562
+ },
3563
+ {
3564
+ firstname: 'Sophie',
3565
+ lastname: 'Bernard',
3566
+ email: 'sophie.bernard@exemple.com',
3567
+ },
3568
+ {
3569
+ firstname: 'Antoine',
3570
+ lastname: 'Lemoine',
3571
+ email: 'antoine.lemoine@exemple.com',
3572
+ },
3573
+ {
3574
+ firstname: 'Camille',
3575
+ lastname: 'Rousseau',
3576
+ email: 'camille.rousseau@exemple.com',
3577
+ },
3578
+ ],
3579
+ 'options': {
3580
+ itemsPerPage: 5,
3581
+ },
3582
+ 'itemsPerPageOptions': [5, 10, 15],
3583
+ 'caption': '',
3584
+ 'suffix': 'default-table',
3585
+ 'density': 'default',
3586
+ 'striped': false,
3587
+ 'onUpdate:options': fn(),
3588
+ },
3589
+ render: (args) => {
3590
+ return {
3591
+ components: { SyTable },
3592
+ setup() {
3593
+ return { args }
3594
+ },
3595
+ template: `
3596
+ <SyTable
3597
+ v-model:options="args.options"
3598
+ v-bind="args"
3599
+ />
3600
+ `,
3601
+ }
3602
+ },
3603
+ }
@@ -29,6 +29,7 @@
29
29
  showSelect: false,
30
30
  multiSort: false,
31
31
  mustSort: false,
32
+ itemsPerPageOptions: undefined,
32
33
  })
33
34
 
34
35
  const emit = defineEmits<{
@@ -421,6 +422,7 @@
421
422
  :items-per-page="itemsPerPageValue"
422
423
  :page-count="pageCount"
423
424
  :items-length="filteredItems.length"
425
+ :items-per-page-options="props.itemsPerPageOptions"
424
426
  @update:page="page = $event"
425
427
  @update:items-per-page="updateItemsPerPage"
426
428
  />
@@ -9,7 +9,10 @@
9
9
 
10
10
  // Items per page options - standard options and current value
11
11
  const itemsPerPageOptions = computed(() => {
12
- const standardOptions = [5, 10, 25, 50, 100]
12
+ // Use provided itemsPerPageOptions or default standard options
13
+ const baseOptions = props.itemsPerPageOptions || [5, 10, 25, 50, 100]
14
+ // Filter out -1 from base options since we'll handle it separately
15
+ const standardOptions = [...baseOptions.filter(option => option !== -1)]
13
16
 
14
17
  // Add the current itemsPerPage if it's not already in the standard options
15
18
  // and it's not -1 (which represents "Tous")
@@ -25,11 +28,14 @@
25
28
  value,
26
29
  }))
27
30
 
28
- // Add "Tous" option to display all elements
29
- options.push({
30
- text: locales.pagination.all,
31
- value: -1,
32
- })
31
+ // Add "Tous" option only if not limited by itemsPerPageOptions
32
+ // or if explicitly allowed (by including -1 in itemsPerPageOptions)
33
+ if (!props.itemsPerPageOptions || props.itemsPerPageOptions.includes(-1)) {
34
+ options.push({
35
+ text: locales.pagination.all,
36
+ value: -1,
37
+ })
38
+ }
33
39
 
34
40
  return options
35
41
  })
@@ -39,6 +45,7 @@
39
45
  pageCount: number
40
46
  itemsPerPage: number
41
47
  itemsLength: number
48
+ itemsPerPageOptions?: number[]
42
49
  }>()
43
50
 
44
51
  const emit = defineEmits<{
@@ -1,4 +1,4 @@
1
- import { describe, it, expect, beforeEach, vi } from 'vitest'
1
+ import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest'
2
2
  import { mount } from '@vue/test-utils'
3
3
  import { createVuetify } from 'vuetify'
4
4
  import * as components from 'vuetify/components'
@@ -44,6 +44,11 @@ describe('SelectFilter.vue', () => {
44
44
  })
45
45
  })
46
46
 
47
+ afterEach(() => {
48
+ vi.clearAllMocks()
49
+ document.body.innerHTML = ''
50
+ })
51
+
47
52
  it('renders correctly with default props', () => {
48
53
  expect(wrapper.exists()).toBe(true)
49
54
  expect(wrapper.findComponent(SySelect).exists()).toBe(true)
@@ -170,4 +170,161 @@ describe('SyTablePagination.vue', () => {
170
170
  const labelText = wrapper.find('.rows-per-page-label').text()
171
171
  expect(labelText).toContain('Lignes par page')
172
172
  })
173
+
174
+ // Tests for itemsPerPageOptions functionality
175
+ describe('itemsPerPageOptions', () => {
176
+ it('should use default options when itemsPerPageOptions is not provided', () => {
177
+ const wrapper = mount(SyTablePagination, {
178
+ props: {
179
+ page: 1,
180
+ pageCount: 5,
181
+ itemsPerPage: 10,
182
+ itemsLength: 50,
183
+ },
184
+ global: {
185
+ plugins: [vuetify],
186
+ },
187
+ })
188
+
189
+ // Should have default options: 5, 10, 25, 50, 100, and "Tous" (-1)
190
+ const vm = wrapper.vm as unknown as { itemsPerPageOptions: Array<{ text: string, value: number }> }
191
+ const selectOptions = vm.itemsPerPageOptions
192
+ expect(selectOptions).toHaveLength(6)
193
+ expect(selectOptions.map(opt => opt.value)).toEqual([5, 10, 25, 50, 100, -1])
194
+ })
195
+
196
+ it('should limit options when itemsPerPageOptions is provided', () => {
197
+ const wrapper = mount(SyTablePagination, {
198
+ props: {
199
+ page: 1,
200
+ pageCount: 5,
201
+ itemsPerPage: 10,
202
+ itemsLength: 50,
203
+ itemsPerPageOptions: [5, 10, 25],
204
+ },
205
+ global: {
206
+ plugins: [vuetify],
207
+ },
208
+ })
209
+
210
+ // Should only have the limited options, no "Tous" option
211
+ const vm = wrapper.vm as unknown as { itemsPerPageOptions: Array<{ text: string, value: number }> }
212
+ const selectOptions = vm.itemsPerPageOptions
213
+ expect(selectOptions).toHaveLength(3)
214
+ expect(selectOptions.map(opt => opt.value)).toEqual([5, 10, 25])
215
+ expect(selectOptions.map(opt => opt.text)).toEqual(['5', '10', '25'])
216
+ })
217
+
218
+ it('should include "Tous" option when explicitly allowed in itemsPerPageOptions', () => {
219
+ const wrapper = mount(SyTablePagination, {
220
+ props: {
221
+ page: 1,
222
+ pageCount: 5,
223
+ itemsPerPage: 10,
224
+ itemsLength: 50,
225
+ itemsPerPageOptions: [5, 10, 25, -1],
226
+ },
227
+ global: {
228
+ plugins: [vuetify],
229
+ },
230
+ })
231
+
232
+ // Should have the limited options plus "Tous"
233
+ const vm = wrapper.vm as unknown as { itemsPerPageOptions: Array<{ text: string, value: number }> }
234
+ const selectOptions = vm.itemsPerPageOptions
235
+ expect(selectOptions).toHaveLength(4)
236
+ expect(selectOptions.map(opt => opt.value)).toEqual([5, 10, 25, -1])
237
+
238
+ // Check that the last option is "Tous"
239
+ const lastOption = selectOptions[selectOptions.length - 1]
240
+ expect(lastOption.value).toBe(-1)
241
+ expect(lastOption.text).toBe('Tous')
242
+ })
243
+
244
+ it('should add current itemsPerPage to options if not already included', () => {
245
+ const wrapper = mount(SyTablePagination, {
246
+ props: {
247
+ page: 1,
248
+ pageCount: 5,
249
+ itemsPerPage: 15, // Not in the itemsPerPageOptions
250
+ itemsLength: 50,
251
+ itemsPerPageOptions: [5, 10, 25],
252
+ },
253
+ global: {
254
+ plugins: [vuetify],
255
+ },
256
+ })
257
+
258
+ // Should include the current itemsPerPage value and sort numerically
259
+ const vm = wrapper.vm as unknown as { itemsPerPageOptions: Array<{ text: string, value: number }> }
260
+ const selectOptions = vm.itemsPerPageOptions
261
+ expect(selectOptions).toHaveLength(4)
262
+ expect(selectOptions.map(opt => opt.value)).toEqual([5, 10, 15, 25])
263
+ })
264
+
265
+ it('should not add current itemsPerPage if it is -1 (Tous)', () => {
266
+ const wrapper = mount(SyTablePagination, {
267
+ props: {
268
+ page: 1,
269
+ pageCount: 5,
270
+ itemsPerPage: -1, // "Tous" option
271
+ itemsLength: 50,
272
+ itemsPerPageOptions: [5, 10, 25],
273
+ },
274
+ global: {
275
+ plugins: [vuetify],
276
+ },
277
+ })
278
+
279
+ // Should not add -1 to the options since itemsPerPageOptions doesn't include it
280
+ const vm = wrapper.vm as unknown as { itemsPerPageOptions: Array<{ text: string, value: number }> }
281
+ const selectOptions = vm.itemsPerPageOptions
282
+ expect(selectOptions).toHaveLength(3)
283
+ expect(selectOptions.map(opt => opt.value)).toEqual([5, 10, 25])
284
+ expect(selectOptions.find(opt => opt.value === -1)).toBeUndefined()
285
+ })
286
+
287
+ it('should work with very restrictive options', () => {
288
+ const wrapper = mount(SyTablePagination, {
289
+ props: {
290
+ page: 1,
291
+ pageCount: 5,
292
+ itemsPerPage: 5,
293
+ itemsLength: 50,
294
+ itemsPerPageOptions: [5], // Only one option
295
+ },
296
+ global: {
297
+ plugins: [vuetify],
298
+ },
299
+ })
300
+
301
+ // Should only have one option
302
+ const vm = wrapper.vm as unknown as { itemsPerPageOptions: Array<{ text: string, value: number }> }
303
+ const selectOptions = vm.itemsPerPageOptions
304
+ expect(selectOptions).toHaveLength(1)
305
+ expect(selectOptions.map(opt => opt.value)).toEqual([5])
306
+ expect(selectOptions.map(opt => opt.text)).toEqual(['5'])
307
+ })
308
+
309
+ it('should handle empty itemsPerPageOptions array', () => {
310
+ const wrapper = mount(SyTablePagination, {
311
+ props: {
312
+ page: 1,
313
+ pageCount: 5,
314
+ itemsPerPage: 10,
315
+ itemsLength: 50,
316
+ itemsPerPageOptions: [], // Empty array
317
+ },
318
+ global: {
319
+ plugins: [vuetify],
320
+ },
321
+ })
322
+
323
+ // Should only include the current itemsPerPage since base options are empty
324
+ const vm = wrapper.vm as unknown as { itemsPerPageOptions: Array<{ text: string, value: number }> }
325
+ const selectOptions = vm.itemsPerPageOptions
326
+ expect(selectOptions).toHaveLength(1)
327
+ expect(selectOptions.map(opt => opt.value)).toEqual([10])
328
+ })
329
+ })
173
330
  })
@@ -76,6 +76,7 @@ export type SyTableProps = {
76
76
  showSelect?: boolean
77
77
  multiSort?: boolean
78
78
  mustSort?: boolean
79
+ itemsPerPageOptions?: number[]
79
80
  }
80
81
 
81
82
  export type SyServerTableProps = {
@@ -93,4 +94,5 @@ export type SyServerTableProps = {
93
94
  showSelect?: boolean
94
95
  multiSort?: boolean
95
96
  mustSort?: boolean
97
+ itemsPerPageOptions?: number[]
96
98
  }
@@ -28,6 +28,7 @@ export { default as HeaderNavigationBar } from './HeaderNavigationBar/HeaderNavi
28
28
  export { default as SkipLink } from './SkipLink/SkipLink.vue'
29
29
  export { default as SocialMediaLinks } from './SocialMediaLinks/SocialMediaLinks.vue'
30
30
  export { default as SyPagination } from './Customs/SyPagination/SyPagination.vue'
31
+ export { default as SyTabs } from './Customs/SyTabs/SyTabs.vue'
31
32
 
32
33
  // ===========================
33
34
  // Boutons
@@ -117,15 +118,22 @@ export { default as NotFoundPage } from './NotFoundPage/NotFoundPage.vue'
117
118
  // Amelipro
118
119
  // ===========================
119
120
  export { default as AmeliproAccordion } from './Amelipro/AmeliproAccordion/AmeliproAccordion.vue'
121
+ export { default as AmeliproAccordionGroup } from './Amelipro/AmeliproAccordionGroup/AmeliproAccordionGroup.vue'
122
+ export { default as AmeliproAccordionList } from './Amelipro/AmeliproAccordionList/AmeliproAccordionList.vue'
123
+ export { default as AmeliproAccordionResult } from './Amelipro/AmeliproAccordionResult/AmeliproAccordionResult.vue'
124
+ export { default as AmeliproAccordionResultList } from './Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.vue'
120
125
  export { default as AmeliproAutoCompleteField } from './Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.vue'
126
+ export { default as AmeliproBadge } from './Amelipro/AmeliproBadge/AmeliproBadge.vue'
121
127
  export { default as AmeliproBreadcrumb } from './Amelipro/AmeliproBreadcrumb/AmeliproBreadcrumb.vue'
122
128
  export { default as AmeliproBtn } from './Amelipro/AmeliproBtn/AmeliproBtn.vue'
123
129
  export { default as AmeliproCard } from './Amelipro/AmeliproCard/AmeliproCard.vue'
124
130
  export { default as AmeliproCallback } from './Amelipro/AmeliproCallback/AmeliproCallback.vue'
131
+ export { default as AmeliproCarousel } from './Amelipro/AmeliproCarousel/AmeliproCarousel.vue'
125
132
  export { default as AmeliproCaptcha } from './Amelipro/AmeliproCaptcha/AmeliproCaptcha.vue'
126
133
  export { default as AmeliproCheckbox } from './Amelipro/AmeliproCheckbox/AmeliproCheckbox.vue'
127
134
  export { default as AmeliproCheckboxGroup } from './Amelipro/AmeliproCheckboxGroup/AmeliproCheckboxGroup.vue'
128
135
  export { default as AmeliproChips } from './Amelipro/AmeliproChips/AmeliproChips.vue'
136
+ export { default as AmeliproClickableTile } from './Amelipro/AmeliproClickableTile/AmeliproClickableTile.vue'
129
137
  export { default as AmeliproCustomSelector } from './Amelipro/AmeliproCustomSelector/AmeliproCustomSelector.vue'
130
138
  export { default as AmeliproDialog } from './Amelipro/AmeliproDialog/AmeliproDialog.vue'
131
139
  export { default as AmeliproDisclosure } from './Amelipro/AmeliproDisclosure/AmeliproDisclosure.vue'
@@ -145,6 +153,7 @@ export { default as AmeliproPageLayout } from './Amelipro/AmeliproPageLayout/Ame
145
153
  export { default as AmeliproPagination } from './Amelipro/AmeliproPagination/AmeliproPagination.vue'
146
154
  export { default as AmeliproPatientBanner } from './Amelipro/AmeliproPatientBanner/AmeliproPatientBanner.vue'
147
155
  export { default as AmeliproRadioGroup } from './Amelipro/AmeliproRadioGroup/AmeliproRadioGroup.vue'
156
+ export { default as AmeliproResultList } from './Amelipro/AmeliproResultList/AmeliproResultList.vue'
148
157
  export { default as AmeliproSelect } from './Amelipro/AmeliproSelect/AmeliproSelect.vue'
149
158
  export { default as AmeliproStateTile } from './Amelipro/AmeliproStateTile/AmeliproStateTile.vue'
150
159
  export { default as AmeliproStatus } from './Amelipro/AmeliproStatus/AmeliproStatus.vue'
@@ -173,6 +173,16 @@ export default function useFilterable(model: Ref<FilterProp>, emits) {
173
173
  return
174
174
  }
175
175
 
176
+ // Handle single select objects (VSelect with return-object but without multiple)
177
+ const hasSelectStructure = (typedValue.title !== undefined || typedValue.text !== undefined) && typedValue.value !== undefined
178
+ if (hasSelectStructure) {
179
+ // For single select objects, clear the entire value
180
+ filter.value = undefined
181
+ updateValue()
182
+ return
183
+ }
184
+
185
+ // For other object types, delete the specific property
176
186
  delete typedValue[chipValue]
177
187
  filter.value = typedValue
178
188
  }
@@ -1,4 +1,4 @@
1
- import type { IndexedObject } from '@/components/Amelipro/types'
1
+ import type { IndexedObject } from '../../../components/Amelipro/types'
2
2
 
3
3
  export const apColorsTokens = {
4
4
  apBlack: { base: '#000000' },
@@ -36,7 +36,7 @@ export const cnamSemanticTokens = {
36
36
  accentOnDark: '#ffffff',
37
37
  info: '#0c419a',
38
38
  success: '#224e2d',
39
- warning: '#60480e',
39
+ warning: '#906b15',
40
40
  error: '#b33f2e',
41
41
  onDark: 'rgba(255, 255, 255, 0.7)',
42
42
  disabled: '#dddede',
@@ -49,7 +49,7 @@ export const cnamSemanticTokens = {
49
49
  subdued: '#545859',
50
50
  info: '#0c419a',
51
51
  success: '#224e2d',
52
- warning: '#60480e',
52
+ warning: '#906b15',
53
53
  error: '#b33f2e',
54
54
  disabled: '#989b9b',
55
55
  onDark: '#ffffff',
@@ -64,7 +64,7 @@ export const cnamSemanticTokens = {
64
64
  accentContrasted: '#07275c',
65
65
  info: '#0c419a',
66
66
  success: '#224e2d',
67
- warning: '#60480e',
67
+ warning: '#906b15',
68
68
  error: '#b33f2e',
69
69
  onDark: '#ffffff',
70
70
  disabled: '#989b9b',
@@ -2,6 +2,7 @@ import { ref } from 'vue'
2
2
  import type { Notification } from '@/components/NotificationBar/types'
3
3
 
4
4
  const notificationQueue = ref<Notification[]>([])
5
+ const clearAllEvent = ref(false) // Signal pour déclencher la fermeture des notifications affichées
5
6
 
6
7
  export function useNotificationService() {
7
8
  const addNotification = (notification: Notification) => {
@@ -15,11 +16,19 @@ export function useNotificationService() {
15
16
  }
16
17
 
17
18
  const clearQueue = () => {
19
+ // Signaler pour fermer les notifications affichées
20
+ clearAllEvent.value = true
21
+ // Reset le signal après un court délai
22
+ setTimeout(() => {
23
+ clearAllEvent.value = false
24
+ }, 100)
25
+ // Vider la file d'attente
18
26
  notificationQueue.value = []
19
27
  }
20
28
 
21
29
  return {
22
30
  notificationQueue,
31
+ clearAllEvent,
23
32
  addNotification,
24
33
  removeNotification,
25
34
  clearQueue,
@@ -10,7 +10,7 @@ export const Header: StoryObj = {
10
10
  return {
11
11
  template: `
12
12
  <div class="mb-8">
13
- <h1 class="text-h4 font-weight-bold mb-4">Composants</h1>
13
+ <h1 class="mb-4">Composants</h1>
14
14
  <p class="text-body-1">Découvrez notre collection de composants réutilisables conçus pour créer des interfaces utilisateur cohérentes et accessibles.</p>
15
15
  </div>
16
16
  `,