@cnamts/synapse 1.0.24 → 1.0.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (367) hide show
  1. package/README.md +27 -5
  2. package/dist/{AutocompleteFilter-BWLR3U7W.js → AutocompleteFilter-D7qBuCAP.js} +1 -1
  3. package/dist/{AutocompleteFilter-D9jzRzAL.cjs → AutocompleteFilter-Df9i5mAl.cjs} +1 -1
  4. package/dist/{DateFilter-DTUl8hb1.cjs → DateFilter-BJD6FMev.cjs} +1 -1
  5. package/dist/{DateFilter-BpwFexzi.js → DateFilter-BitMWrMU.js} +1 -1
  6. package/dist/{NumberFilter-Bz_NTdX9.js → NumberFilter-BTLUxw0a.js} +1 -1
  7. package/dist/{NumberFilter-MAEojdk0.cjs → NumberFilter-DGCzCXzI.cjs} +1 -1
  8. package/dist/{PeriodFilter-DX_wy9g-.js → PeriodFilter-B5rUIPAC.js} +1 -1
  9. package/dist/{PeriodFilter-CC4WgIhl.cjs → PeriodFilter-DO_ecTZW.cjs} +1 -1
  10. package/dist/{SelectFilter-BR3fvl-a.cjs → SelectFilter-CGwcKWLm.cjs} +1 -1
  11. package/dist/{SelectFilter-xqiPtPgX.js → SelectFilter-l4QnRcuk.js} +2 -2
  12. package/dist/{TextFilter-CCfYFl5F.cjs → TextFilter-B8nf7xoK.cjs} +1 -1
  13. package/dist/{TextFilter-BBl3JFqK.js → TextFilter-C9hj6Qrp.js} +1 -1
  14. package/dist/apLightTheme-CEK4iY3f.cjs +1 -0
  15. package/dist/{apLightTheme-D1P4jcD0.js → apLightTheme-DnIM24Lv.js} +441 -722
  16. package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +10 -6
  17. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +3 -0
  18. package/dist/components/Customs/SyTabs/SyTabs.d.ts +13 -11
  19. package/dist/components/Customs/SyTextField/SyTextField.d.ts +4 -4
  20. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +4 -24
  21. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +2 -12
  22. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +1 -6
  23. package/dist/components/DatePicker/composables/useDatePickerState.d.ts +1 -0
  24. package/dist/components/FileList/FileList.d.ts +6 -0
  25. package/dist/components/FilterSideBar/FilterSideBar.d.ts +2 -0
  26. package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +13 -13
  27. package/dist/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.d.ts +3 -3
  28. package/dist/components/MonthPicker/MonthPicker.d.ts +1 -6
  29. package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +1 -6
  30. package/dist/components/NirField/NirField.d.ts +4 -16
  31. package/dist/components/PeriodField/PeriodField.d.ts +8 -48
  32. package/dist/components/PhoneField/PhoneField.d.ts +1 -6
  33. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +1 -0
  34. package/dist/components/Tables/SyTable/SyTable.d.ts +1 -0
  35. package/dist/components/Tables/common/SyTablePagination.d.ts +2 -0
  36. package/dist/components/Tables/common/TableHeader.d.ts +5 -0
  37. package/dist/components/Tables/common/locales.d.ts +3 -0
  38. package/dist/components/Tables/common/types.d.ts +2 -0
  39. package/dist/components/UploadWorkflow/UploadWorkflow.d.ts +1 -0
  40. package/dist/composables/unifyValidation/documentationValidationProps.d.ts +230 -0
  41. package/dist/composables/validation/useValidation.d.ts +5 -1
  42. package/dist/design-system-v3.js +2 -2
  43. package/dist/design-system-v3.umd.cjs +1 -1
  44. package/dist/designTokens/tokens/amelipro/apColors.d.ts +10 -10
  45. package/dist/designTokens/tokens/amelipro/apColors2026.d.ts +1 -2
  46. package/dist/designTokens/tokens/amelipro/apContextual.d.ts +44 -0
  47. package/dist/designTokens/tokens/amelipro/apSemantic.d.ts +1 -1
  48. package/dist/designTokens/tokens/baseColors.d.ts +127 -0
  49. package/dist/designTokens/tokens/baseContextualTokens.d.ts +50 -0
  50. package/dist/designTokens/tokens/cnam/cnamColors.d.ts +10 -10
  51. package/dist/designTokens/tokens/cnam/cnamSemantic.d.ts +1 -1
  52. package/dist/designTokens/tokens/pa/paColors.d.ts +1 -166
  53. package/dist/designTokens/tokens/pa/paSemantic.d.ts +1 -1
  54. package/dist/designTokens/utils/buildColorClassMap.d.ts +12 -0
  55. package/dist/designTokens/utils/createFlattenTheme.d.ts +1 -3
  56. package/dist/designTokens/utils/index.d.ts +2 -2
  57. package/dist/main-ByDPHpae.cjs +1067 -0
  58. package/dist/main-Cpx8Co6H.js +38869 -0
  59. package/dist/synapse.css +1 -1
  60. package/dist/utils/functions/classToHex.d.ts +1 -1
  61. package/dist/utils/functions/createHexResolver.d.ts +16 -0
  62. package/dist/vuetifyConfig.js +113 -152
  63. package/dist/vuetifyConfig.umd.cjs +1 -1
  64. package/package.json +29 -18
  65. package/src/assets/amelipro/apTokens2026.scss +5 -5
  66. package/src/assets/overrides/_breakpoints.scss +25 -0
  67. package/src/assets/overrides/_btns.scss +0 -2
  68. package/src/assets/overrides/_forms.scss +1 -3
  69. package/src/assets/overrides/_icons.scss +7 -11
  70. package/src/assets/overrides/_otp.scss +41 -0
  71. package/src/assets/overrides/_tables.scss +11 -20
  72. package/src/assets/overrides/_tooltips.scss +17 -7
  73. package/src/assets/overrides/_typography.scss +35 -37
  74. package/src/assets/overrides/_utilities.scss +43 -47
  75. package/src/assets/themes.scss +1 -0
  76. package/src/components/Amelipro/AmeliproAccordion/AmeliproAccordionTemplate/AmeliproAccordionTemplate.vue +20 -20
  77. package/src/components/Amelipro/AmeliproAccordionFrieze/AmeliproAccordionFrieze.vue +12 -14
  78. package/src/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.vue +4 -6
  79. package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResultTemplate/AmeliproAccordionResultTemplate.vue +5 -5
  80. package/src/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.vue +4 -6
  81. package/src/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.vue +4 -6
  82. package/src/components/Amelipro/AmeliproBadge/AmeliproBadge.vue +4 -6
  83. package/src/components/Amelipro/AmeliproBreadcrumb/AmeliproBreadcrumb.vue +1 -3
  84. package/src/components/Amelipro/AmeliproBtn/AmeliproBtn.vue +4 -6
  85. package/src/components/Amelipro/AmeliproCallback/AmeliproCallback.vue +2 -2
  86. package/src/components/Amelipro/AmeliproCard/AmeliproCard.vue +31 -31
  87. package/src/components/Amelipro/AmeliproCarousel/AmeliproCarousel.vue +5 -7
  88. package/src/components/Amelipro/AmeliproCheckbox/AmeliproCheckbox.vue +13 -15
  89. package/src/components/Amelipro/AmeliproCheckboxGroup/AmeliproCheckboxGroup.vue +23 -23
  90. package/src/components/Amelipro/AmeliproChips/AmeliproChips.vue +1 -3
  91. package/src/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.vue +17 -12
  92. package/src/components/Amelipro/AmeliproClickableTile/tests/__snapshots__/AmeliproClickableTile.spec.ts.snap +2 -2
  93. package/src/components/Amelipro/AmeliproCopyBtn/AmeliproCopyBtn.vue +4 -6
  94. package/src/components/Amelipro/AmeliproCustomSelector/AmeliproCustomSelector.vue +13 -13
  95. package/src/components/Amelipro/AmeliproDentalChart/AmeliproDentalChart.vue +4 -2
  96. package/src/components/Amelipro/AmeliproDentalChart/AmeliproTooth/AmeliproTooth.vue +4 -4
  97. package/src/components/Amelipro/AmeliproDialog/AmeliproDialog.vue +5 -7
  98. package/src/components/Amelipro/AmeliproDisclosure/AmeliproDisclosure.vue +1 -3
  99. package/src/components/Amelipro/AmeliproErrorTemplate/AmeliproErrorTemplate.vue +2 -4
  100. package/src/components/Amelipro/AmeliproFilePreview/AmeliproFilePreview.vue +4 -6
  101. package/src/components/Amelipro/AmeliproFilters/AmeliproFilters.vue +13 -13
  102. package/src/components/Amelipro/AmeliproFirstLogin/AmeliproFirstLogin.vue +3 -5
  103. package/src/components/Amelipro/AmeliproFooter/AmeliproFooter.vue +1 -3
  104. package/src/components/Amelipro/AmeliproHeader/AmeliproHeader.vue +2 -4
  105. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBar.vue +1 -3
  106. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/AmeliproHeaderBrandSection.vue +20 -16
  107. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/__tests__/__snapshots__/AmeliproHeaderBrandSection.spec.ts.snap +1 -1
  108. package/src/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.vue +2 -4
  109. package/src/components/Amelipro/AmeliproIllustratedDataTile/AmeliproIllustratedDataTile.vue +5 -7
  110. package/src/components/Amelipro/AmeliproIllustratedRadioGroup/AmeliproIllustratedRadioGroup.vue +6 -8
  111. package/src/components/Amelipro/AmeliproMailTile/AmeliproMailTile.vue +14 -14
  112. package/src/components/Amelipro/AmeliproMenu/AmeliproMenu.vue +11 -13
  113. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproDropdownMenu/AmeliproDropdownMenu.vue +2 -4
  114. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproMessagingLayout.vue +8 -8
  115. package/src/components/Amelipro/AmeliproMultipleFoldingCard/AmeliproMultipleFoldingCard.vue +40 -40
  116. package/src/components/Amelipro/AmeliproNumberedCard/AmeliproNumberedCard.vue +27 -27
  117. package/src/components/Amelipro/AmeliproOnboarding/AmeliproOnboarding.vue +3 -5
  118. package/src/components/Amelipro/AmeliproPageLayout/AmeliproPageLayout.vue +2 -4
  119. package/src/components/Amelipro/AmeliproPagination/AmeliproPagination.vue +2 -4
  120. package/src/components/Amelipro/AmeliproPagination/AmeliproPaginationBtn/AmeliproPaginationBtn.vue +3 -5
  121. package/src/components/Amelipro/AmeliproPatientBanner/AmeliproPatientBanner.vue +1 -3
  122. package/src/components/Amelipro/AmeliproPatientLogged/AmeliproPatientLogged.vue +2 -4
  123. package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLogin.vue +4 -4
  124. package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLoginForm/AmeliproPatientLoginForm.vue +1 -3
  125. package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.vue +3 -5
  126. package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.vue +3 -5
  127. package/src/components/Amelipro/AmeliproRadioGroup/AmeliproRadioGroup.vue +23 -23
  128. package/src/components/Amelipro/AmeliproResultList/AmeliproResultList.vue +4 -6
  129. package/src/components/Amelipro/AmeliproSelect/AmeliproSelect.vue +12 -22
  130. package/src/components/Amelipro/AmeliproStateTile/AmeliproStateTile.vue +10 -12
  131. package/src/components/Amelipro/AmeliproStepper/AmeliproStepper.vue +17 -17
  132. package/src/components/Amelipro/AmeliproTable/AmeliproTable.vue +8 -10
  133. package/src/components/Amelipro/AmeliproTabs/AmeliproTabBtn/AmeliproTabBtn.vue +6 -8
  134. package/src/components/Amelipro/AmeliproTabs/AmeliproTabs.vue +4 -4
  135. package/src/components/Amelipro/AmeliproTextArea/AmeliproTextArea.vue +4 -6
  136. package/src/components/Amelipro/AmeliproTextField/AmeliproTextField.vue +7 -9
  137. package/src/components/Amelipro/AmeliproTileBtn/AmeliproTileBtn.vue +3 -5
  138. package/src/components/Amelipro/AmeliproTooltips/AmeliproTooltips.vue +0 -2
  139. package/src/components/Amelipro/AmeliproUpload/AmeliproUpload.vue +6 -6
  140. package/src/components/Amelipro/ServiceMenu/ServiceMenu.vue +2 -2
  141. package/src/components/Amelipro/StructureMenu/StructureBtn/StructureBtn.vue +4 -4
  142. package/src/components/Amelipro/StructureMenu/StructureItem/StructureItem.vue +4 -6
  143. package/src/components/Amelipro/StructureMenu/StructureMenu.vue +2 -2
  144. package/src/components/Amelipro/StructureMenu/StructureTabs/StructureTabs.vue +2 -2
  145. package/src/components/Amelipro/UserMenu/UserMenu.vue +1 -3
  146. package/src/components/BackBtn/tests/BackBtn.visual.cy.ts +43 -0
  147. package/src/components/BackBtn/tests/__snapshots__/back-btn-custom-bg.snap.png +0 -0
  148. package/src/components/BackBtn/tests/__snapshots__/back-btn-dark-mode.snap.png +0 -0
  149. package/src/components/BackBtn/tests/__snapshots__/back-btn-default.snap.png +0 -0
  150. package/src/components/BackBtn/tests/__snapshots__/back-btn-no-icon.snap.png +0 -0
  151. package/src/components/Captcha/Captcha.vue +1 -3
  152. package/src/components/ChipList/ChipList.vue +14 -16
  153. package/src/components/CookiesSelection/CookiesInformation/CookiesInformation.vue +0 -2
  154. package/src/components/CopyBtn/CopyBtn.vue +1 -3
  155. package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.vue +17 -17
  156. package/src/components/Customs/Selects/SelectBtnField/tests/SelectBtnField.spec.ts +31 -0
  157. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +66 -0
  158. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +7 -3
  159. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.a11y.spec.ts +18 -0
  160. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +66 -0
  161. package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.vue +4 -6
  162. package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +1 -39
  163. package/src/components/Customs/Selects/SySelect/SySelect.vue +263 -63
  164. package/src/components/Customs/Selects/SySelect/accessibilite/Accessibility.mdx +199 -269
  165. package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +35 -0
  166. package/src/components/Customs/SyCheckbox/SyCheckbox.mdx +5 -0
  167. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +29 -0
  168. package/src/components/Customs/SyCheckbox/accessibilite/Accessibility.mdx +18 -3
  169. package/src/components/Customs/SyPagination/SyPagination.vue +0 -2
  170. package/src/components/Customs/SyTabs/SyTabs.mdx +0 -58
  171. package/src/components/Customs/SyTabs/SyTabs.stories.ts +32 -33
  172. package/src/components/Customs/SyTabs/SyTabs.vue +87 -67
  173. package/src/components/Customs/SyTabs/accessibilite/Accessibility.mdx +83 -23
  174. package/src/components/Customs/SyTabs/tests/SyTabs.a11y.spec.ts +88 -0
  175. package/src/components/Customs/SyTabs/tests/SyTabs.spec.ts +46 -1
  176. package/src/components/Customs/SyTextField/SyTextField.stories.ts +21 -41
  177. package/src/components/Customs/SyTextField/SyTextField.vue +4 -6
  178. package/src/components/DatePicker/CalendarMode/DatePicker.vue +12 -14
  179. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +20 -16
  180. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +23 -0
  181. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +8 -10
  182. package/src/components/DatePicker/composables/tests/useDatePickerState.spec.ts +53 -0
  183. package/src/components/DatePicker/composables/useDatePickerState.ts +24 -0
  184. package/src/components/DatePicker/composables/useDateTextField.ts +0 -1
  185. package/src/components/DatePicker/composables/useMonthButtonCustomization.ts +9 -8
  186. package/src/components/DatePicker/playground/DatePickerHolidayRule.vue +1 -1
  187. package/src/components/DialogBox/DialogBox.vue +3 -5
  188. package/src/components/DialogBox/tests/DialogBox.visual.cy.ts +76 -0
  189. package/src/components/DialogBox/tests/__snapshots__/dialog-box-custom-texts.snap.png +0 -0
  190. package/src/components/DialogBox/tests/__snapshots__/dialog-box-default.snap.png +0 -0
  191. package/src/components/DialogBox/tests/__snapshots__/dialog-box-no-actions.snap.png +0 -0
  192. package/src/components/FileList/FileList.vue +9 -2
  193. package/src/components/FileList/UploadItem/UploadItem.vue +11 -13
  194. package/src/components/FileList/tests/FileList.spec.ts +47 -0
  195. package/src/components/FileUpload/FileUpload.vue +3 -5
  196. package/src/components/FileUpload/FileUploadContent.vue +3 -5
  197. package/src/components/FilterInline/FilterInline.vue +1 -3
  198. package/src/components/FilterSideBar/FilterSideBar.mdx +44 -1
  199. package/src/components/FilterSideBar/FilterSideBar.stories.ts +105 -1
  200. package/src/components/FilterSideBar/FilterSideBar.vue +7 -0
  201. package/src/components/FilterSideBar/tests/FilterSideBar.a11y.spec.ts +54 -1
  202. package/src/components/FilterSideBar/tests/FilterSideBar.spec.ts +42 -0
  203. package/src/components/FooterBar/FooterBar.vue +9 -13
  204. package/src/components/FranceConnectBtn/FranceConnectBtn.vue +1 -1
  205. package/src/components/HeaderBar/HeaderBar.vue +2 -3
  206. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderBurgerMenu.vue +2 -3
  207. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.vue +2 -3
  208. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuSection/HeaderMenuSection.vue +0 -1
  209. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.vue +8 -9
  210. package/src/components/HeaderBar/HeaderBurgerMenu/menu.scss +0 -8
  211. package/src/components/HeaderBar/HeaderBurgerMenu/tests/HeaderBurgerMenu.visual.cy.ts +196 -0
  212. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated-submenu-open.snap.png +0 -0
  213. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated.snap.png +0 -0
  214. package/src/components/HeaderBar/HeaderLogo/HeaderLogo.vue +0 -1
  215. package/src/components/HeaderBar/HeaderMenuBtn/HeaderMenuBtn.vue +6 -7
  216. package/src/components/HeaderBar/tests/HeaderBar.visual.cy.ts +81 -0
  217. package/src/components/HeaderBar/tests/__snapshots__/header-bar-custom-width.snap.png +0 -0
  218. package/src/components/HeaderBar/tests/__snapshots__/header-bar-default.snap.png +0 -0
  219. package/src/components/HeaderBar/tests/__snapshots__/header-bar-no-sticky.snap.png +0 -0
  220. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-prepend.snap.png +0 -0
  221. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-side.snap.png +0 -0
  222. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-subtitle.snap.png +0 -0
  223. package/src/components/HeaderNavigationBar/HeaderNavigationBar.vue +12 -3
  224. package/src/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.vue +15 -8
  225. package/src/components/HeaderToolbar/HeaderToolbar.vue +6 -7
  226. package/src/components/LangBtn/LangBtn.vue +2 -4
  227. package/src/components/Logo/tests/Logo.visual.cy.ts +57 -0
  228. package/src/components/Logo/tests/__snapshots__/logo-avatar.snap.png +0 -0
  229. package/src/components/Logo/tests/__snapshots__/logo-dark.snap.png +0 -0
  230. package/src/components/Logo/tests/__snapshots__/logo-default.snap.png +0 -0
  231. package/src/components/Logo/tests/__snapshots__/logo-no-organism.snap.png +0 -0
  232. package/src/components/Logo/tests/__snapshots__/logo-no-signature.snap.png +0 -0
  233. package/src/components/Logo/tests/__snapshots__/logo-risque-pro.snap.png +0 -0
  234. package/src/components/LogoBrandSection/LogoBrandSection.vue +2 -2
  235. package/src/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.vue +1 -1
  236. package/src/components/NirField/NirField.stories.ts +2 -2
  237. package/src/components/NirField/NirField.vue +3 -5
  238. package/src/components/NirField/accessibilite/Accessibility.mdx +100 -5
  239. package/src/components/NirField/tests/NirField.spec.ts +118 -0
  240. package/src/components/NirField/tests/useNirValidation.spec.ts +449 -0
  241. package/src/components/NirField/useNirValidation.ts +38 -32
  242. package/src/components/NotificationBar/Notification/Notification.vue +5 -7
  243. package/src/components/NotificationBar/NotificationBar.vue +1 -3
  244. package/src/components/PaginatedTable/PaginatedTable.vue +2 -3
  245. package/src/components/PaginatedTable/Pagination.vue +3 -5
  246. package/src/components/PasswordField/PasswordField.vue +8 -10
  247. package/src/components/PhoneField/PhoneField.vue +3 -3
  248. package/src/components/RangeField/RangeSlider/RangeSlider.vue +0 -2
  249. package/src/components/RangeField/RangeSlider/Tooltip/Tooltip.vue +1 -1
  250. package/src/components/RangeField/tests/RangeField.visual.cy.ts +65 -0
  251. package/src/components/RangeField/tests/__snapshots__/range-field-custom-bg.snap.png +0 -0
  252. package/src/components/RangeField/tests/__snapshots__/range-field-custom-range.snap.png +0 -0
  253. package/src/components/RangeField/tests/__snapshots__/range-field-default.snap.png +0 -0
  254. package/src/components/RangeField/tests/__snapshots__/range-field-step.snap.png +0 -0
  255. package/src/components/RangeField/tests/__snapshots__/range-field-with-label.snap.png +0 -0
  256. package/src/components/RatingPicker/EmotionPicker/EmotionPicker.vue +6 -8
  257. package/src/components/RatingPicker/StarsPicker/StarsPicker.vue +3 -5
  258. package/src/components/SearchListField/SearchListField.vue +0 -2
  259. package/src/components/SkipLink/SkipLink.vue +2 -4
  260. package/src/components/SocialMediaLinks/SocialMediaLinks.vue +6 -6
  261. package/src/components/SubHeader/SubHeader.vue +1 -1
  262. package/src/components/SyAlert/SyAlert.vue +7 -9
  263. package/src/components/SyAlert/tests/SyAlert.visual.cy.ts +46 -0
  264. package/src/components/SyAlert/tests/__snapshots__/sy-alert-closable.snap.png +0 -0
  265. package/src/components/SyAlert/tests/__snapshots__/sy-alert-error.snap.png +0 -0
  266. package/src/components/SyAlert/tests/__snapshots__/sy-alert-info.snap.png +0 -0
  267. package/src/components/SyAlert/tests/__snapshots__/sy-alert-success.snap.png +0 -0
  268. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-outlined.snap.png +0 -0
  269. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-tonal.snap.png +0 -0
  270. package/src/components/SyAlert/tests/__snapshots__/sy-alert-warning.snap.png +0 -0
  271. package/src/components/SyBtnMenu/SyBtnMenu.vue +2 -4
  272. package/src/components/TableToolbar/TableToolbar.vue +6 -8
  273. package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +166 -0
  274. package/src/components/Tables/SyServerTable/SyServerTable.vue +9 -7
  275. package/src/components/Tables/SyServerTable/tests/SyServerTable.a11y.spec.ts +23 -0
  276. package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +268 -0
  277. package/src/components/Tables/SyTable/SyTable.stories.ts +104 -0
  278. package/src/components/Tables/SyTable/SyTable.vue +9 -7
  279. package/src/components/Tables/SyTable/tests/SyTable.a11y.spec.ts +22 -0
  280. package/src/components/Tables/SyTable/tests/SyTable.spec.ts +274 -0
  281. package/src/components/Tables/common/SyTableFilter.vue +27 -2
  282. package/src/components/Tables/common/SyTablePagination.vue +142 -19
  283. package/src/components/Tables/common/TableHeader.vue +40 -3
  284. package/src/components/Tables/common/filters/SelectFilter.vue +1 -1
  285. package/src/components/Tables/common/locales.ts +3 -0
  286. package/src/components/Tables/common/tableStyles.scss +16 -19
  287. package/src/components/Tables/common/tests/SyTablePagination.spec.ts +18 -0
  288. package/src/components/Tables/common/tests/TableHeader.spec.ts +39 -0
  289. package/src/components/Tables/common/types.ts +2 -0
  290. package/src/components/Tables/common/useTableHeaders.ts +49 -27
  291. package/src/components/UploadWorkflow/UploadWorkflow.vue +1 -0
  292. package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +23 -0
  293. package/src/components/UploadWorkflow/tests/__snapshots__/UploadWorkflow.spec.ts.snap +66 -0
  294. package/src/components/UploadWorkflow/useFileList.ts +3 -0
  295. package/src/components/UserMenuBtn/UserMenuBtn.vue +1 -3
  296. package/src/composables/unifyValidation/documentationValidationProps.ts +235 -0
  297. package/src/composables/validation/useValidation.ts +17 -1
  298. package/src/composantsVuetify/VBreadcrumbs/VBreadcrumbs.mdx +28 -0
  299. package/src/composantsVuetify/VBreadcrumbs/v-breadcrumbs.stories.ts +108 -0
  300. package/src/composantsVuetify/VOtpInput/VOtpInput.mdx +39 -0
  301. package/src/composantsVuetify/VOtpInput/v-otp-input.stories.ts +56 -0
  302. package/src/composantsVuetify/VSkeletonLoader/VSkeletonLoader.mdx +42 -0
  303. package/src/composantsVuetify/VSkeletonLoader/v-skeleton-loader.stories.ts +77 -0
  304. package/src/composantsVuetify/VSwitch/VSwitch.mdx +47 -0
  305. package/src/composantsVuetify/VSwitch/v-switch.stories.ts +166 -0
  306. package/src/designTokens/tests/buildColorClassMap.spec.ts +31 -0
  307. package/src/designTokens/tests/generateScssTokens.spec.ts +12 -0
  308. package/src/designTokens/tests/themeUtils.spec.ts +53 -0
  309. package/src/designTokens/tokens/amelipro/apColors.ts +8 -130
  310. package/src/designTokens/tokens/amelipro/apColors2026.ts +3 -15
  311. package/src/designTokens/tokens/amelipro/apContextual.ts +55 -47
  312. package/src/designTokens/tokens/amelipro/apLightTheme.ts +1 -1
  313. package/src/designTokens/tokens/amelipro/apSemantic.ts +1 -1
  314. package/src/designTokens/tokens/baseColors.ts +129 -0
  315. package/src/designTokens/tokens/baseContextualTokens.ts +52 -0
  316. package/src/designTokens/tokens/cnam/cnamColors.ts +3 -125
  317. package/src/designTokens/tokens/cnam/cnamContextual.ts +4 -48
  318. package/src/designTokens/tokens/cnam/cnamLightTheme.ts +1 -1
  319. package/src/designTokens/tokens/cnam/cnamSemantic.ts +1 -1
  320. package/src/designTokens/tokens/pa/paColors.ts +2 -166
  321. package/src/designTokens/tokens/pa/paContextual.ts +3 -48
  322. package/src/designTokens/tokens/pa/paLightTheme.ts +1 -1
  323. package/src/designTokens/tokens/pa/paSemantic.ts +2 -2
  324. package/src/designTokens/utils/buildColorClassMap.ts +34 -0
  325. package/src/designTokens/utils/convertSemanticsToken.ts +8 -11
  326. package/src/designTokens/utils/createFlattenTheme.ts +15 -7
  327. package/src/designTokens/utils/index.ts +2 -2
  328. package/src/stories/Accessibilite/AuditDesignSystem.mdx +0 -11
  329. package/src/stories/Accessibilite/DesignSystem/Avancement.mdx +433 -0
  330. package/src/stories/Accessibilite/DesignSystem/a11y-status.json +692 -0
  331. package/src/stories/Accessibilite/KitDePreAudit/Echantillonnage.mdx +8 -1
  332. package/src/stories/Accessibilite/KitDePreAudit/Introduction.mdx +51 -10
  333. package/src/stories/Accessibilite/KitDePreAudit/Outils/Introduction.mdx +16 -9
  334. package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +48 -58
  335. package/src/stories/Components/Components.stories.ts +40 -1
  336. package/src/stories/Demarrer/EnrichirLeDesignSystem.mdx +4 -9
  337. package/src/stories/Demarrer/EnrichirLeDesignSystem.stories.ts +28 -0
  338. package/src/stories/Demarrer/Releases.stories.ts +48 -5
  339. package/src/stories/DesignTokens/ColorDisplay.vue +6 -5
  340. package/src/stories/DesignTokens/ColorIntegrationExample.vue +2 -4
  341. package/src/stories/DesignTokens/colors.stories.ts +5 -6
  342. package/src/stories/GuideDuDev/CreateVuetifyInstance.mdx +95 -0
  343. package/src/stories/GuideDuDev/Theme.mdx +36 -26
  344. package/src/stories/GuideDuDev/moduleDeNotification.mdx +3 -2
  345. package/src/stories/styles/accessibility-guide.css +3 -3
  346. package/src/utils/functions/classToHex.ts +6 -34
  347. package/src/utils/functions/createHexResolver.ts +45 -0
  348. package/src/utils/functions/tests/classToHex.spec.ts +36 -0
  349. package/src/utils/functions/tests/convertToHex.spec.ts +31 -0
  350. package/src/utils/functions/tests/createHexResolver.spec.ts +66 -0
  351. package/src/utils/functions/tests/isCssColor.spec.ts +48 -0
  352. package/dist/apLightTheme-CFSRrjv2.cjs +0 -1
  353. package/dist/designTokens/utils/convertGaps.d.ts +0 -5
  354. package/dist/main-BtTqyn4z.js +0 -38648
  355. package/dist/main-C1e3eoxd.cjs +0 -1067
  356. package/src/assets/apTokens.scss +0 -343
  357. package/src/assets/overrides/_container.scss +0 -36
  358. package/src/assets/tokens.scss +0 -388
  359. package/src/designTokens/apColors.md +0 -66
  360. package/src/designTokens/cnamColors.md +0 -193
  361. package/src/designTokens/paColors.md +0 -66
  362. package/src/designTokens/tokens/json/contextual-tokens.json +0 -156
  363. package/src/designTokens/tokens/json/primitives.json +0 -209
  364. package/src/designTokens/tokens/json/semantic.json +0 -120
  365. package/src/designTokens/utils/convertGaps.ts +0 -11
  366. package/src/stories/Accessibilite/Avancement/Avancement.mdx +0 -533
  367. package/src/stories/Accessibilite/Avancement/Avancement.stories.ts +0 -306
@@ -40,6 +40,7 @@
40
40
  itemsPerPageOptions: undefined,
41
41
  headingLevel: 2,
42
42
  clickableRow: false,
43
+ pageInput: false,
43
44
  })
44
45
 
45
46
  const emit = defineEmits<{
@@ -318,6 +319,7 @@
318
319
  :column="column"
319
320
  :header-props-raw="(getHeaderForColumn(column)?.headerProps as any)"
320
321
  :resizable-columns="props.resizableColumns"
322
+ :wrap-title="props.resizableColumns || !!getHeaderForColumn(column)?.maxWidth"
321
323
  >
322
324
  <template
323
325
  v-for="slotName in Object.keys($slots)"
@@ -344,9 +346,9 @@
344
346
  >
345
347
  <th
346
348
  :style="{
347
- ...(getHeaderForColumn(column)?.maxWidth ? { maxWidth: getHeaderForColumn(column)?.maxWidth as any } : {}),
349
+ ...(getHeaderForColumn(column)?.maxWidth && !props.resizableColumns ? { maxWidth: getHeaderForColumn(column)?.maxWidth as any } : {}),
348
350
  ...(getHeaderForColumn(column)?.minWidth ? { minWidth: getHeaderForColumn(column)?.minWidth as any } : {}),
349
- ...(getHeaderForColumn(column)?.width ? { width: getHeaderForColumn(column)?.width as any } : {}),
351
+ width: (reactiveColumnWidths[column.key!] || getHeaderForColumn(column)?.width) as any || undefined,
350
352
  }"
351
353
  >
352
354
  <SyTableFilter
@@ -462,6 +464,7 @@
462
464
  :page-count="pageCount"
463
465
  :items-length="filteredItems.length"
464
466
  :items-per-page-options="props.itemsPerPageOptions"
467
+ :page-input="props.pageInput"
465
468
  @update:page="updateOptions({ page: $event })"
466
469
  @update:items-per-page="updateItemsPerPage"
467
470
  />
@@ -473,7 +476,6 @@
473
476
 
474
477
  <style lang="scss" scoped>
475
478
  @use '@/components/Tables/common/tableStyles' as *;
476
- @use '@/assets/tokens';
477
479
 
478
480
  .sy-table :deep() {
479
481
  @include tablestyles;
@@ -482,7 +484,7 @@
482
484
 
483
485
  @mixin striped-rows {
484
486
  .v-table tbody tr:nth-child(even) {
485
- background-color: rgba(tokens.$primary-base, 0.05);
487
+ background-color: rgba(var(--v-theme-primary), 0.05);
486
488
  }
487
489
  }
488
490
 
@@ -500,11 +502,11 @@
500
502
  }
501
503
 
502
504
  .sy-table--pinned-left-shadow :deep(.sy-table__pinned--left) {
503
- box-shadow: 2px 0 6px -4px rgba(tokens.$grey-base, 0.6);
505
+ box-shadow: 2px 0 6px -4px rgba(var(--v-theme-grey-base), 0.6);
504
506
  }
505
507
 
506
508
  .sy-table--pinned-right-shadow :deep(.sy-table__pinned--right) {
507
- box-shadow: -2px 0 6px -4px rgba(tokens.$grey-base, 0.6);
509
+ box-shadow: -2px 0 6px -4px rgba(var(--v-theme-grey-base), 0.6);
508
510
  }
509
511
 
510
512
  .sy-table--pinned-select-left :deep(.v-data-table__th--select),
@@ -545,7 +547,7 @@
545
547
  .sy-table--pinned-left-shadow.sy-table--pinned-select-left :deep(.v-table__wrapper > table > tbody > tr:not(.v-data-table-rows-loading) > .v-data-table__td:first-child),
546
548
  .sy-table--pinned-left-shadow.sy-table--pinned-select-left :deep(.v-data-table__tbody .v-data-table__tr:not(.v-data-table-rows-loading) > .v-data-table__td:first-child),
547
549
  .sy-table--pinned-left-shadow.sy-table--pinned-select-left :deep(.v-data-table__tbody tr:not(.v-data-table-rows-loading) > td:first-child) {
548
- box-shadow: 2px 0 6px -4px rgba(tokens.$grey-base, 0.6);
550
+ box-shadow: 2px 0 6px -4px rgba(var(--v-theme-grey-base), 0.6);
549
551
  }
550
552
  /* stylelint-enable @stylistic/max-line-length */
551
553
 
@@ -36,6 +36,28 @@ describe('SyTable - accessibility (axe)', () => {
36
36
  }
37
37
  })
38
38
 
39
+ it('has no obvious axe violations with pageInput enabled', async () => {
40
+ const manyItems = Array.from({ length: 11 }, (_, i) => ({ id: i + 1, name: `User ${i + 1}`, age: 20 + i }))
41
+
42
+ const wrapper = mount(SyTable, {
43
+ props: {
44
+ options: {} as DataOptions,
45
+ suffix: 'a11y-page-input-test',
46
+ pageInput: true,
47
+ headers,
48
+ items: manyItems,
49
+ },
50
+ attachTo: document.body,
51
+ })
52
+
53
+ await wrapper.vm.$nextTick()
54
+
55
+ const results = await axe(wrapper.element as HTMLElement)
56
+ assertNoA11yViolations(results, 'SyTable - pageInput', {
57
+ ignoreRules: ['region', 'aria-prohibited-attr'],
58
+ })
59
+ })
60
+
39
61
  it('has no obvious axe violations when rows are clickable and contain nested actions', async () => {
40
62
  const wrapper = mount(SyTable, {
41
63
  props: {
@@ -892,4 +892,278 @@ describe('SyTable selectionKey', () => {
892
892
  const result = itemValue(item as unknown as Record<string, unknown>)
893
893
  expect(result).toBe(item) // same object reference
894
894
  })
895
+
896
+ describe('maxWidth truncation', () => {
897
+ const truncateHeaders = [
898
+ {
899
+ title: 'Nom de la colonne super longue',
900
+ key: 'nom',
901
+ maxWidth: '100px',
902
+ },
903
+ {
904
+ title: 'Prénom',
905
+ key: 'prenom',
906
+ },
907
+ ]
908
+
909
+ const truncateItems = [
910
+ { nom: 'Valeur très longue qui dépasse la largeur maximale', prenom: 'Court' },
911
+ ]
912
+
913
+ it('applies maxWidth and wraps the header title on <th> when maxWidth is set', async () => {
914
+ const wrapper = mount(SyTable, {
915
+ props: {
916
+ suffix: 'truncate-test',
917
+ headers: truncateHeaders,
918
+ items: truncateItems,
919
+ },
920
+ attachTo: document.body,
921
+ })
922
+
923
+ await wrapper.vm.$nextTick()
924
+ await vi.dynamicImportSettled()
925
+
926
+ const ths = wrapper.findAll('tr.headers th')
927
+ const truncatedTh = ths.find(th => (th.attributes('style') || '').includes('max-width'))
928
+
929
+ expect(truncatedTh).toBeDefined()
930
+ expect(truncatedTh!.attributes('style')).toContain('max-width: 100px')
931
+ expect(truncatedTh!.attributes('style')).not.toContain('overflow: hidden')
932
+ expect(truncatedTh!.attributes('title')).toBeUndefined()
933
+ expect(truncatedTh!.find('.col-title').classes()).toContain('col-title--wrap')
934
+ })
935
+
936
+ it('does not apply multiline header styles on <th> without maxWidth', async () => {
937
+ const wrapper = mount(SyTable, {
938
+ props: {
939
+ suffix: 'no-truncate-test',
940
+ headers: truncateHeaders,
941
+ items: truncateItems,
942
+ },
943
+ attachTo: document.body,
944
+ })
945
+
946
+ await wrapper.vm.$nextTick()
947
+ await vi.dynamicImportSettled()
948
+
949
+ const ths = wrapper.findAll('tr.headers th')
950
+ const normalTh = ths.find(th => !(th.attributes('style') || '').includes('max-width'))
951
+
952
+ expect(normalTh).toBeDefined()
953
+ expect(normalTh!.attributes('title')).toBeUndefined()
954
+ expect(normalTh!.find('.col-title').classes()).not.toContain('col-title--wrap')
955
+ })
956
+
957
+ it('applies multiline styles on <td> when maxWidth is set', async () => {
958
+ const wrapper = mount(SyTable, {
959
+ props: {
960
+ suffix: 'truncate-td-test',
961
+ headers: truncateHeaders,
962
+ items: truncateItems,
963
+ },
964
+ attachTo: document.body,
965
+ })
966
+
967
+ await wrapper.vm.$nextTick()
968
+ await vi.dynamicImportSettled()
969
+
970
+ const tds = wrapper.findAll('tbody tr td')
971
+ const truncatedTd = tds.find(td => (td.attributes('style') || '').includes('max-width'))
972
+
973
+ expect(truncatedTd).toBeDefined()
974
+ expect(truncatedTd!.attributes('style')).toContain('max-width: 100px')
975
+ expect(truncatedTd!.attributes('style')).toContain('white-space: normal')
976
+ expect(truncatedTd!.attributes('style')).toContain('overflow-wrap: anywhere')
977
+ expect(truncatedTd!.attributes('style')).toContain('word-break: break-word')
978
+ expect(truncatedTd!.attributes('style')).not.toContain('overflow: hidden')
979
+ expect(truncatedTd!.attributes('title')).toBeUndefined()
980
+ })
981
+
982
+ it('applies maxWidth without truncation on filter row <th> when maxWidth is set with showFilters', async () => {
983
+ const wrapper = mount(SyTable, {
984
+ props: {
985
+ suffix: 'truncate-filter-test',
986
+ showFilters: true,
987
+ headers: truncateHeaders,
988
+ items: truncateItems,
989
+ },
990
+ attachTo: document.body,
991
+ })
992
+
993
+ await wrapper.vm.$nextTick()
994
+ await vi.dynamicImportSettled()
995
+
996
+ const filterThs = wrapper.findAll('tr.filters th')
997
+ const truncatedFilterTh = filterThs.find(th => (th.attributes('style') || '').includes('max-width'))
998
+
999
+ expect(truncatedFilterTh).toBeDefined()
1000
+ expect(truncatedFilterTh!.attributes('style')).toContain('max-width: 100px')
1001
+ expect(truncatedFilterTh!.attributes('style')).not.toContain('overflow: hidden')
1002
+ })
1003
+
1004
+ it('keeps multiline td styles after reordering a maxWidth column with column controls', async () => {
1005
+ const mockOrganizeColumns = {
1006
+ name: 'OrganizeColumns',
1007
+ props: ['headers'],
1008
+ template: '<div></div>',
1009
+ emits: ['update:headers'],
1010
+ }
1011
+
1012
+ const wrapper = mount(SyTable, {
1013
+ props: {
1014
+ suffix: 'truncate-reorder-test',
1015
+ headers: truncateHeaders.map((header, index) => ({
1016
+ ...header,
1017
+ order: index + 1,
1018
+ })),
1019
+ items: truncateItems,
1020
+ enableColumnControls: true,
1021
+ },
1022
+ global: {
1023
+ stubs: {
1024
+ OrganizeColumns: mockOrganizeColumns,
1025
+ },
1026
+ },
1027
+ attachTo: document.body,
1028
+ })
1029
+
1030
+ const organizeColumnsComponent = wrapper.findComponent({ name: 'OrganizeColumns' })
1031
+ const reorderedHeaders = JSON.parse(JSON.stringify([
1032
+ { ...truncateHeaders[0], order: 2 },
1033
+ { ...truncateHeaders[1], order: 1 },
1034
+ ]))
1035
+
1036
+ organizeColumnsComponent.vm.$emit('update:headers', reorderedHeaders)
1037
+ await wrapper.vm.$nextTick()
1038
+ await vi.dynamicImportSettled()
1039
+
1040
+ const tds = wrapper.findAll('tbody tr td')
1041
+ expect(tds[0]!.text()).toBe('Court')
1042
+ expect(tds[1]!.text()).toBe('Valeur très longue qui dépasse la largeur maximale')
1043
+ expect(tds[1]!.attributes('style')).toContain('max-width: 100px')
1044
+ expect(tds[1]!.attributes('style')).toContain('white-space: normal')
1045
+ expect(tds[1]!.attributes('style')).toContain('overflow-wrap: anywhere')
1046
+ })
1047
+ })
1048
+ })
1049
+
1050
+ describe('SyTable pageInput', () => {
1051
+ const manyItems = Array.from({ length: 11 }, (_, i) => ({
1052
+ id: i + 1,
1053
+ name: `User ${i + 1}`,
1054
+ age: 20 + i,
1055
+ }))
1056
+
1057
+ it('does not render page-input when pageInput is false', () => {
1058
+ const wrapper = mount(SyTable, {
1059
+ props: {
1060
+ options: { itemsPerPage: 5 } as DataOptions,
1061
+ suffix: 'page-input-test',
1062
+ pageInput: false,
1063
+ },
1064
+ attrs: { items: manyItems, headers },
1065
+ })
1066
+
1067
+ expect(wrapper.find('.page-input').exists()).toBe(false)
1068
+ })
1069
+
1070
+ it('renders page-input field when pageInput is true and pageCount > 1', async () => {
1071
+ const wrapper = mount(SyTable, {
1072
+ props: {
1073
+ options: { itemsPerPage: 5 } as DataOptions,
1074
+ suffix: 'page-input-test',
1075
+ pageInput: true,
1076
+ },
1077
+ attrs: { items: manyItems, headers },
1078
+ })
1079
+
1080
+ await wrapper.vm.$nextTick()
1081
+ await vi.dynamicImportSettled()
1082
+
1083
+ expect(wrapper.find('.page-input').exists()).toBe(true)
1084
+ expect(wrapper.find('.page-input__field').exists()).toBe(true)
1085
+ expect(wrapper.find('.page-input__label').exists()).toBe(true)
1086
+ })
1087
+
1088
+ it('page-input field has correct min/max attributes', async () => {
1089
+ const wrapper = mount(SyTable, {
1090
+ props: {
1091
+ options: { itemsPerPage: 5 } as DataOptions,
1092
+ suffix: 'page-input-test',
1093
+ pageInput: true,
1094
+ },
1095
+ attrs: { items: manyItems, headers },
1096
+ })
1097
+
1098
+ await wrapper.vm.$nextTick()
1099
+ await vi.dynamicImportSettled()
1100
+
1101
+ const input = wrapper.find('.page-input__field')
1102
+ expect(input.attributes('min')).toBe('1')
1103
+ expect(input.attributes('max')).toBe('3')
1104
+ expect(input.attributes('type')).toBe('number')
1105
+ })
1106
+
1107
+ it('page-input field has accessible aria-label', async () => {
1108
+ const wrapper = mount(SyTable, {
1109
+ props: {
1110
+ options: { itemsPerPage: 5 } as DataOptions,
1111
+ suffix: 'page-input-test',
1112
+ pageInput: true,
1113
+ },
1114
+ attrs: { items: manyItems, headers },
1115
+ })
1116
+
1117
+ await wrapper.vm.$nextTick()
1118
+ await vi.dynamicImportSettled()
1119
+
1120
+ const input = wrapper.find('.page-input__field')
1121
+ expect(input.attributes('aria-label')).toContain('3')
1122
+ })
1123
+
1124
+ it('navigates to page on Enter key', async () => {
1125
+ const wrapper = mount(SyTable, {
1126
+ props: {
1127
+ options: { itemsPerPage: 5 } as DataOptions,
1128
+ suffix: 'page-input-test',
1129
+ pageInput: true,
1130
+ },
1131
+ attrs: { items: manyItems, headers },
1132
+ })
1133
+
1134
+ await wrapper.vm.$nextTick()
1135
+ await vi.dynamicImportSettled()
1136
+
1137
+ const input = wrapper.find('.page-input__field')
1138
+ await input.setValue(2)
1139
+ await input.trigger('keydown', { key: 'Enter' })
1140
+
1141
+ const emitted = wrapper.emitted('update:options')
1142
+ expect(emitted).toBeTruthy()
1143
+ const lastEmit = emitted![emitted!.length - 1]![0] as DataOptions
1144
+ expect(lastEmit.page).toBe(2)
1145
+ })
1146
+
1147
+ it('clamps out-of-range values on blur', async () => {
1148
+ const wrapper = mount(SyTable, {
1149
+ props: {
1150
+ options: { itemsPerPage: 5 } as DataOptions,
1151
+ suffix: 'page-input-test',
1152
+ pageInput: true,
1153
+ },
1154
+ attrs: { items: manyItems, headers },
1155
+ })
1156
+
1157
+ await wrapper.vm.$nextTick()
1158
+ await vi.dynamicImportSettled()
1159
+
1160
+ const input = wrapper.find('.page-input__field')
1161
+ await input.setValue(99)
1162
+ await input.trigger('blur')
1163
+
1164
+ const emitted = wrapper.emitted('update:options')
1165
+ expect(emitted).toBeTruthy()
1166
+ const lastEmit = emitted![emitted!.length - 1]![0] as DataOptions
1167
+ expect(lastEmit.page).toBe(3)
1168
+ })
895
1169
  })
@@ -297,13 +297,38 @@
297
297
  flex-wrap: wrap;
298
298
  gap: 16px;
299
299
  padding: 16px 0;
300
- background-color: var(--v-theme-surface);
301
300
  border-bottom: 1px solid var(--v-border-color);
302
301
 
303
302
  &-item {
304
- min-width: 200px;
303
+ min-width: 0;
304
+ width: 100%;
305
305
  flex: 1;
306
306
  }
307
+
308
+ :deep(.v-field) {
309
+ height: auto;
310
+ min-height: var(--v-input-control-height, 56px);
311
+ }
312
+
313
+ :deep(.v-field__field),
314
+ :deep(.v-field__input) {
315
+ min-width: 0;
316
+ }
317
+
318
+ :deep(.sy-select .v-field__input),
319
+ :deep(.sy-autocomplete .v-field__input) {
320
+ flex-wrap: wrap;
321
+ }
322
+
323
+ :deep(.sy-select__label),
324
+ :deep(.sy-autocomplete__label),
325
+ :deep(.sy-autocomplete__selection-text) {
326
+ white-space: normal;
327
+ overflow-wrap: anywhere;
328
+ word-break: break-word;
329
+ line-height: 1.25;
330
+ flex-shrink: 1;
331
+ }
307
332
  }
308
333
 
309
334
  </style>
@@ -11,9 +11,11 @@
11
11
  itemsLength: number
12
12
  itemsPerPageOptions?: number[]
13
13
  headingLevel?: 1 | 2 | 3 | 4 | 5 | 6
14
+ pageInput?: boolean
14
15
  }>(), {
15
16
  itemsPerPageOptions: undefined,
16
17
  headingLevel: 2,
18
+ pageInput: false,
17
19
  })
18
20
 
19
21
  // Reference to the SySelect component
@@ -91,6 +93,34 @@
91
93
  localItemsPerPage.value = newValue
92
94
  })
93
95
 
96
+ /**
97
+ * Page input field logic
98
+ */
99
+ const pageInputValue = ref<number | null>(props.page)
100
+
101
+ watch(() => props.page, (newPage) => {
102
+ pageInputValue.value = newPage
103
+ })
104
+
105
+ function commitPageInput() {
106
+ const enteredPage = pageInputValue.value
107
+ if (enteredPage === null || !Number.isInteger(enteredPage)) {
108
+ pageInputValue.value = props.page
109
+ return
110
+ }
111
+ const targetPage = Math.min(Math.max(1, enteredPage), props.pageCount)
112
+ pageInputValue.value = targetPage
113
+ if (targetPage !== props.page) {
114
+ emit('update:page', targetPage)
115
+ }
116
+ }
117
+
118
+ function handlePageInputKeydown(e: KeyboardEvent) {
119
+ if (e.key === 'Enter') {
120
+ commitPageInput()
121
+ }
122
+ }
123
+
94
124
  // Remove aria-describedby attribute after component is mounted
95
125
  onMounted(() => {
96
126
  // Use nextTick to ensure the DOM is fully rendered
@@ -120,26 +150,57 @@
120
150
  }}
121
151
  </div>
122
152
 
123
- <SyPagination
153
+ <div
124
154
  v-if="pageCount > 1"
125
- :model-value="page"
126
- :pages="pageCount"
127
- :heading-level="headingLevel"
128
- :visible="5"
129
- :label="locales.pagination.paginationNavAriaLabel"
130
- class="pagination"
131
- @update:model-value="goToPage"
155
+ class="pagination-controls"
132
156
  >
133
- <template #previous>
134
- <span>{{ locales.pagination.previous }}</span>
135
- </template>
136
- <template #page-number="{ page: pageNum }">
137
- {{ locales.pagination.pageText(pageNum) }}
138
- </template>
139
- <template #next>
140
- <span>{{ locales.pagination.next }}</span>
141
- </template>
142
- </SyPagination>
157
+ <SyPagination
158
+ :model-value="page"
159
+ :pages="pageCount"
160
+ :heading-level="headingLevel"
161
+ :visible="5"
162
+ :label="locales.pagination.paginationNavAriaLabel"
163
+ class="pagination"
164
+ @update:model-value="goToPage"
165
+ >
166
+ <template #previous>
167
+ <span>{{ locales.pagination.previous }}</span>
168
+ </template>
169
+ <template #page-number="{ page: pageNum }">
170
+ {{ locales.pagination.pageText(pageNum) }}
171
+ </template>
172
+ <template #next>
173
+ <span>{{ locales.pagination.next }}</span>
174
+ </template>
175
+ </SyPagination>
176
+
177
+ <div
178
+ v-if="pageInput"
179
+ class="page-input"
180
+ >
181
+ <div class="page-input__control">
182
+ <span class="page-input__label">
183
+ {{ locales.pagination.pageInputLabel }}
184
+ </span>
185
+ <input
186
+ v-model.number="pageInputValue"
187
+ type="number"
188
+ :min="1"
189
+ :max="pageCount"
190
+ class="page-input__field"
191
+ :aria-label="locales.pagination.pageInputAriaLabel(pageCount)"
192
+ @blur="commitPageInput"
193
+ @keydown="handlePageInputKeydown"
194
+ >
195
+ </div>
196
+ <span
197
+ class="page-input__total"
198
+ aria-hidden="true"
199
+ >
200
+ {{ locales.pagination.pageOf(pageCount) }}
201
+ </span>
202
+ </div>
203
+ </div>
143
204
 
144
205
  <div class="rows-per-page">
145
206
  <span class="rows-per-page-label">{{ locales.pagination.itemsPerPageText }}</span>
@@ -163,7 +224,7 @@
163
224
  </template>
164
225
 
165
226
  <style lang="scss" scoped>
166
- @use '@/assets/tokens';
227
+ @use '@/assets/overrides/breakpoints' as bp;
167
228
 
168
229
  .sy-table-pagination {
169
230
  display: flex;
@@ -212,5 +273,67 @@
212
273
  gap: 0.5rem;
213
274
  align-items: center;
214
275
  }
276
+
277
+ .pagination-controls {
278
+ display: flex;
279
+ flex-wrap: wrap;
280
+ align-items: center;
281
+ justify-content: center;
282
+ gap: 0.75rem;
283
+ }
284
+
285
+ .page-input {
286
+ display: flex;
287
+ align-items: center;
288
+ gap: 0.5rem;
289
+ padding-inline-start: 1.75rem;
290
+ border-inline-start: 1px solid rgb(0 0 0 / 12%);
291
+
292
+ @media #{bp.$down-xs} {
293
+ padding-inline-start: 0;
294
+ border-inline-start: 0;
295
+ }
296
+
297
+ &__control {
298
+ display: flex;
299
+ align-items: center;
300
+ gap: 0.5rem;
301
+ }
302
+
303
+ &__label {
304
+ font-size: 0.875rem;
305
+ color: rgb(0 0 0 / 60%);
306
+ white-space: nowrap;
307
+ }
308
+
309
+ &__field {
310
+ width: 56px;
311
+ height: 32px;
312
+ padding: 0 8px;
313
+ border: 1px solid rgb(var(--v-theme-primary));
314
+ border-radius: 4px;
315
+ font-size: 0.875rem;
316
+ text-align: center;
317
+ color: inherit;
318
+ background: rgb(var(--v-theme-surface));
319
+ appearance: textfield;
320
+
321
+ &::-webkit-inner-spin-button,
322
+ &::-webkit-outer-spin-button {
323
+ appearance: none;
324
+ }
325
+
326
+ &:focus-visible {
327
+ outline: 2px solid rgb(var(--v-theme-primary));
328
+ outline-offset: 2px;
329
+ }
330
+ }
331
+
332
+ &__total {
333
+ font-size: 0.875rem;
334
+ color: rgb(0 0 0 / 60%);
335
+ white-space: nowrap;
336
+ }
337
+ }
215
338
  }
216
339
  </style>
@@ -14,10 +14,12 @@
14
14
  headerParams: Parameters<VDataTable['$slots']['headers']>['0']
15
15
  table: VDataTable | VDataTableServer | null | undefined
16
16
  resizableColumns?: boolean
17
+ wrapTitle?: boolean
17
18
  storageKey?: string
18
19
  headerPropsRaw?: HeaderPropsRaw
19
20
  }>(), {
20
21
  resizableColumns: false,
22
+ wrapTitle: false,
21
23
  storageKey: undefined,
22
24
  headerPropsRaw: undefined,
23
25
  })
@@ -198,13 +200,27 @@
198
200
  const index = props.headerParams.sortBy.findIndex(sort => sort.key === props.column.key)
199
201
  return index !== -1 ? index + 1 : null
200
202
  })
203
+
204
+ const titleClasses = computed(() => [
205
+ textAlignClass.value,
206
+ headerClassRaw.value,
207
+ { 'col-title--wrap': props.wrapTitle },
208
+ ])
209
+
210
+ const wrapperClasses = computed(() => [
211
+ alignClass.value,
212
+ {
213
+ 'h-100': !props.wrapTitle,
214
+ 'v-data-table-header__content--wrap': props.wrapTitle,
215
+ },
216
+ ])
201
217
  </script>
202
218
 
203
219
  <template>
204
220
  <div
205
221
  ref="wrapper"
206
- class="v-data-table-header__content d-flex align-center h-100 w-100"
207
- :class="alignClass"
222
+ class="v-data-table-header__content d-flex align-center w-100"
223
+ :class="wrapperClasses"
208
224
  >
209
225
  <slot
210
226
  :name="`header.${column.key}`"
@@ -216,7 +232,7 @@
216
232
  >
217
233
  <div
218
234
  class="col-title"
219
- :class="[textAlignClass, headerClassRaw]"
235
+ :class="titleClasses"
220
236
  :style="headerStyle"
221
237
  >
222
238
  {{ column.title }}
@@ -268,6 +284,27 @@
268
284
  <style lang="scss" scoped>
269
285
  .v-data-table-header__content {
270
286
  column-gap: 4px;
287
+ min-width: 0;
288
+ }
289
+
290
+ .v-data-table-header__content--wrap {
291
+ height: auto;
292
+ }
293
+
294
+ .col-title {
295
+ flex: 1 1 auto;
296
+ min-width: 0;
297
+ }
298
+
299
+ .col-title--wrap {
300
+ white-space: normal;
301
+ overflow-wrap: anywhere;
302
+ word-break: break-word;
303
+ line-height: 1.25;
304
+ }
305
+
306
+ .sort-container {
307
+ flex: 0 0 auto;
271
308
  }
272
309
 
273
310
  .sort-order-indicator {