@cnamts/synapse 1.0.9 → 1.0.10

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 (393) hide show
  1. package/dist/{DateFilter-BylukfjR.js → DateFilter-C0wDuzgn.js} +1 -1
  2. package/dist/{NumberFilter-C_bUk9o1.js → NumberFilter-CBj7zdOi.js} +1 -1
  3. package/dist/{PeriodFilter-dVOmcfmt.js → PeriodFilter-DB4wWyKy.js} +1 -1
  4. package/dist/{SelectFilter-BW8KpXkQ.js → SelectFilter-Dces8572.js} +1 -1
  5. package/dist/{TextFilter-diwVzTz7.js → TextFilter-BU9nlkuS.js} +1 -1
  6. package/dist/components/Amelipro/AmeliproAccordionFrieze/AmeliproAccordionFrieze.d.ts +110 -0
  7. package/dist/components/Amelipro/AmeliproAccordionFrieze/types.d.ts +6 -0
  8. package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +120 -120
  9. package/dist/components/Amelipro/AmeliproBtn/AmeliproBtn.d.ts +2 -2
  10. package/dist/components/Amelipro/AmeliproCarousel/AmeliproCarousel.d.ts +3 -3
  11. package/dist/components/Amelipro/AmeliproDentalChart/AmeliproDentalChart.d.ts +47 -0
  12. package/dist/components/Amelipro/AmeliproDentalChart/AmeliproTooth/AmeliproTooth.d.ts +88 -0
  13. package/dist/components/Amelipro/AmeliproDentalChart/types.d.ts +13 -0
  14. package/dist/components/Amelipro/AmeliproFirstLogin/AmeliproFirstLogin.d.ts +70 -0
  15. package/dist/components/Amelipro/AmeliproFirstLogin/locales.d.ts +46 -0
  16. package/dist/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.d.ts +1 -1
  17. package/dist/components/Amelipro/AmeliproPatientLogged/AmeliproPatientLogged.d.ts +149 -0
  18. package/dist/components/Amelipro/AmeliproPatientLogged/types.d.ts +48 -0
  19. package/dist/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLogin.d.ts +177 -0
  20. package/dist/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLoginForm/AmeliproPatientLoginForm.d.ts +169 -0
  21. package/dist/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLoginForm/types.d.ts +5 -0
  22. package/dist/components/Amelipro/AmeliproPatientLogin/types.d.ts +5 -0
  23. package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.d.ts +2925 -0
  24. package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/types.d.ts +11 -0
  25. package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.d.ts +4489 -0
  26. package/dist/components/Amelipro/AmeliproPostalAddressField/types.d.ts +17 -0
  27. package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +120 -120
  28. package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +120 -120
  29. package/dist/components/Amelipro/AmeliproTextArea/AmeliproTextArea.d.ts +12 -12
  30. package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +30 -30
  31. package/dist/components/Amelipro/AmeliproTooltips/AmeliproTooltips.d.ts +12 -2
  32. package/dist/components/CookieBanner/CookieBanner.d.ts +7 -7
  33. package/dist/components/CookiesSelection/CookiesInformation/CookiesInformation.d.ts +20 -20
  34. package/dist/components/CookiesSelection/CookiesSelection.d.ts +9 -9
  35. package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +7 -6
  36. package/dist/components/Customs/SyForm/SyForm.d.ts +1820 -0
  37. package/dist/components/Customs/SyTabs/SyTabs.d.ts +3 -1
  38. package/dist/components/Customs/SyTabs/useTabTransition.d.ts +5 -0
  39. package/dist/components/Customs/SyTextField/SyTextField.d.ts +36 -31
  40. package/dist/components/Customs/SyTextField/types.d.ts +1 -1
  41. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +232 -134
  42. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +121 -71
  43. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +60 -37
  44. package/dist/components/DatePicker/composables/useDateValidation.d.ts +14 -2
  45. package/dist/components/DatePicker/composables/useManualDateValidation.d.ts +2 -2
  46. package/dist/components/DatePicker/tests/setup.d.ts +74354 -0
  47. package/dist/components/DialogBox/DialogBox.d.ts +10 -10
  48. package/dist/components/DialogBox/locales.d.ts +1 -0
  49. package/dist/components/DialogBox/useDraggable.d.ts +2 -0
  50. package/dist/components/FilterSideBar/FilterSideBar.d.ts +7 -7
  51. package/dist/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.d.ts +2 -0
  52. package/dist/components/HeaderNavigationBar/types.d.ts +1 -0
  53. package/dist/components/HeaderToolbar/HeaderToolbar.d.ts +842 -9
  54. package/dist/components/HeaderToolbar/locales.d.ts +3 -0
  55. package/dist/components/HeaderToolbar/useMobileRightMenu.d.ts +10 -0
  56. package/dist/components/LangBtn/LangBtn.d.ts +8 -8
  57. package/dist/components/NirField/NirField.d.ts +90 -65
  58. package/dist/components/NirField/locales.d.ts +6 -4
  59. package/dist/components/PasswordField/PasswordField.d.ts +3 -1
  60. package/dist/components/PasswordField/locales.d.ts +2 -0
  61. package/dist/components/PeriodField/PeriodField.d.ts +460 -260
  62. package/dist/components/PhoneField/PhoneField.d.ts +45 -32
  63. package/dist/components/RangeField/RangeField.d.ts +11 -1
  64. package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +2 -2
  65. package/dist/components/RangeField/config.d.ts +3 -0
  66. package/dist/components/RatingPicker/EmotionPicker/EmotionPicker.d.ts +3 -1
  67. package/dist/components/RatingPicker/EmotionPicker/locales.d.ts +2 -0
  68. package/dist/components/RatingPicker/NumberPicker/NumberPicker.d.ts +3 -1
  69. package/dist/components/RatingPicker/StarsPicker/StarsPicker.d.ts +3 -1
  70. package/dist/components/RatingPicker/locales.d.ts +1 -0
  71. package/dist/components/SearchListField/SearchListField.d.ts +6 -6
  72. package/dist/components/SyAlert/SyAlert.d.ts +2 -2
  73. package/dist/components/SyTextArea/SyTextArea.d.ts +13 -13
  74. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +3 -5
  75. package/dist/components/Tables/SyTable/SyTable.d.ts +3 -5
  76. package/dist/components/Tables/common/SyTablePagination.d.ts +8 -6
  77. package/dist/components/Tables/common/organizeColumns/OrganizeColumns.d.ts +4 -4
  78. package/dist/components/Tables/common/usePagination.d.ts +1 -3
  79. package/dist/components/Tables/common/useTableCheckbox.d.ts +1 -1
  80. package/dist/components/UploadWorkflow/UploadWorkflow.d.ts +4 -4
  81. package/dist/components/index.d.ts +8 -0
  82. package/dist/composables/validation/useFormValidation.d.ts +24 -0
  83. package/dist/composables/validation/useValidatable.d.ts +17 -0
  84. package/dist/design-system-v3.js +181 -173
  85. package/dist/design-system-v3.umd.cjs +265 -263
  86. package/dist/{main-2eWGB7zZ.js → main-Dt4iNotT.js} +14095 -11151
  87. package/dist/style.css +1 -1
  88. package/dist/tooth-11-B9fN9Ow_.js +4 -0
  89. package/dist/tooth-12-BOOjuDe9.js +4 -0
  90. package/dist/tooth-13-DVU7jhZ8.js +4 -0
  91. package/dist/tooth-14-CXNleTBu.js +4 -0
  92. package/dist/tooth-15-iq3z8dzZ.js +4 -0
  93. package/dist/tooth-16-BuNIHSQk.js +4 -0
  94. package/dist/tooth-17-DLb4ijsH.js +4 -0
  95. package/dist/tooth-18-huijQe68.js +4 -0
  96. package/dist/tooth-21-Bl7Q-o4y.js +4 -0
  97. package/dist/tooth-22-ChQKI3h5.js +4 -0
  98. package/dist/tooth-23-CkzbEvBa.js +4 -0
  99. package/dist/tooth-24-BpaPUSEp.js +4 -0
  100. package/dist/tooth-25-BaVfhAL6.js +4 -0
  101. package/dist/tooth-26-BnL03Jv5.js +4 -0
  102. package/dist/tooth-27-BaHyZfhH.js +4 -0
  103. package/dist/tooth-28-BrMBVEgX.js +4 -0
  104. package/dist/tooth-31-DEH3Btej.js +4 -0
  105. package/dist/tooth-32-Dqcy596v.js +4 -0
  106. package/dist/tooth-33-DLzQOVky.js +4 -0
  107. package/dist/tooth-34-36nkjUPW.js +4 -0
  108. package/dist/tooth-35-VfFhleWT.js +4 -0
  109. package/dist/tooth-36-BHwtGkLx.js +4 -0
  110. package/dist/tooth-37-CT47Rtk-.js +4 -0
  111. package/dist/tooth-38-D15JmYSD.js +4 -0
  112. package/dist/tooth-41--x9N_iSc.js +4 -0
  113. package/dist/tooth-42-DZ1D3qmP.js +4 -0
  114. package/dist/tooth-43-C9T3b5_0.js +4 -0
  115. package/dist/tooth-44-CsPRBSZV.js +4 -0
  116. package/dist/tooth-45-Dg3wQunm.js +4 -0
  117. package/dist/tooth-46-DAOEt4G5.js +4 -0
  118. package/dist/tooth-47-DcqUeVM0.js +4 -0
  119. package/dist/tooth-48-0MVzkYem.js +4 -0
  120. package/dist/tooth-51-DOTod22I.js +4 -0
  121. package/dist/tooth-52-DZB1Jabv.js +4 -0
  122. package/dist/tooth-53-nunm2BQr.js +4 -0
  123. package/dist/tooth-54-BwdYfBd-.js +4 -0
  124. package/dist/tooth-55-BUJdNwqL.js +4 -0
  125. package/dist/tooth-61-BwqR1B88.js +4 -0
  126. package/dist/tooth-62-BzaECsvF.js +4 -0
  127. package/dist/tooth-63-wjdIfSq2.js +4 -0
  128. package/dist/tooth-64-CGW4ZcUq.js +4 -0
  129. package/dist/tooth-65-DxH4GgAL.js +4 -0
  130. package/dist/tooth-71-CmjVz11G.js +4 -0
  131. package/dist/tooth-72-CCyNUD-W.js +4 -0
  132. package/dist/tooth-73-D6aJwVz4.js +4 -0
  133. package/dist/tooth-74-zNtDQ6ig.js +4 -0
  134. package/dist/tooth-75-DDEx6y4E.js +4 -0
  135. package/dist/tooth-81-xg8UVvz2.js +4 -0
  136. package/dist/tooth-82-CtNXwBtB.js +4 -0
  137. package/dist/tooth-83-C2ODw7VT.js +4 -0
  138. package/dist/tooth-84-BKIdO9HA.js +4 -0
  139. package/dist/tooth-85-3YmvfAsK.js +4 -0
  140. package/package.json +2 -2
  141. package/src/assets/amelipro/img/dental-chart-img/tooth-11.svg +16 -0
  142. package/src/assets/amelipro/img/dental-chart-img/tooth-12.svg +11 -0
  143. package/src/assets/amelipro/img/dental-chart-img/tooth-13.svg +11 -0
  144. package/src/assets/amelipro/img/dental-chart-img/tooth-14.svg +26 -0
  145. package/src/assets/amelipro/img/dental-chart-img/tooth-15.svg +21 -0
  146. package/src/assets/amelipro/img/dental-chart-img/tooth-16.svg +31 -0
  147. package/src/assets/amelipro/img/dental-chart-img/tooth-17.svg +26 -0
  148. package/src/assets/amelipro/img/dental-chart-img/tooth-18.svg +26 -0
  149. package/src/assets/amelipro/img/dental-chart-img/tooth-21.svg +16 -0
  150. package/src/assets/amelipro/img/dental-chart-img/tooth-22.svg +11 -0
  151. package/src/assets/amelipro/img/dental-chart-img/tooth-23.svg +11 -0
  152. package/src/assets/amelipro/img/dental-chart-img/tooth-24.svg +26 -0
  153. package/src/assets/amelipro/img/dental-chart-img/tooth-25.svg +21 -0
  154. package/src/assets/amelipro/img/dental-chart-img/tooth-26.svg +31 -0
  155. package/src/assets/amelipro/img/dental-chart-img/tooth-27.svg +26 -0
  156. package/src/assets/amelipro/img/dental-chart-img/tooth-28.svg +26 -0
  157. package/src/assets/amelipro/img/dental-chart-img/tooth-31.svg +11 -0
  158. package/src/assets/amelipro/img/dental-chart-img/tooth-32.svg +11 -0
  159. package/src/assets/amelipro/img/dental-chart-img/tooth-33.svg +11 -0
  160. package/src/assets/amelipro/img/dental-chart-img/tooth-34.svg +11 -0
  161. package/src/assets/amelipro/img/dental-chart-img/tooth-35.svg +22 -0
  162. package/src/assets/amelipro/img/dental-chart-img/tooth-36.svg +26 -0
  163. package/src/assets/amelipro/img/dental-chart-img/tooth-37.svg +26 -0
  164. package/src/assets/amelipro/img/dental-chart-img/tooth-38.svg +11 -0
  165. package/src/assets/amelipro/img/dental-chart-img/tooth-41.svg +11 -0
  166. package/src/assets/amelipro/img/dental-chart-img/tooth-42.svg +11 -0
  167. package/src/assets/amelipro/img/dental-chart-img/tooth-43.svg +11 -0
  168. package/src/assets/amelipro/img/dental-chart-img/tooth-44.svg +11 -0
  169. package/src/assets/amelipro/img/dental-chart-img/tooth-45.svg +22 -0
  170. package/src/assets/amelipro/img/dental-chart-img/tooth-46.svg +26 -0
  171. package/src/assets/amelipro/img/dental-chart-img/tooth-47.svg +26 -0
  172. package/src/assets/amelipro/img/dental-chart-img/tooth-48.svg +11 -0
  173. package/src/assets/amelipro/img/dental-chart-img/tooth-51.svg +11 -0
  174. package/src/assets/amelipro/img/dental-chart-img/tooth-52.svg +16 -0
  175. package/src/assets/amelipro/img/dental-chart-img/tooth-53.svg +16 -0
  176. package/src/assets/amelipro/img/dental-chart-img/tooth-54.svg +11 -0
  177. package/src/assets/amelipro/img/dental-chart-img/tooth-55.svg +16 -0
  178. package/src/assets/amelipro/img/dental-chart-img/tooth-61.svg +11 -0
  179. package/src/assets/amelipro/img/dental-chart-img/tooth-62.svg +16 -0
  180. package/src/assets/amelipro/img/dental-chart-img/tooth-63.svg +16 -0
  181. package/src/assets/amelipro/img/dental-chart-img/tooth-64.svg +11 -0
  182. package/src/assets/amelipro/img/dental-chart-img/tooth-65.svg +16 -0
  183. package/src/assets/amelipro/img/dental-chart-img/tooth-71.svg +11 -0
  184. package/src/assets/amelipro/img/dental-chart-img/tooth-72.svg +16 -0
  185. package/src/assets/amelipro/img/dental-chart-img/tooth-73.svg +16 -0
  186. package/src/assets/amelipro/img/dental-chart-img/tooth-74.svg +11 -0
  187. package/src/assets/amelipro/img/dental-chart-img/tooth-75.svg +16 -0
  188. package/src/assets/amelipro/img/dental-chart-img/tooth-81.svg +11 -0
  189. package/src/assets/amelipro/img/dental-chart-img/tooth-82.svg +16 -0
  190. package/src/assets/amelipro/img/dental-chart-img/tooth-83.svg +16 -0
  191. package/src/assets/amelipro/img/dental-chart-img/tooth-84.svg +11 -0
  192. package/src/assets/amelipro/img/dental-chart-img/tooth-85.svg +16 -0
  193. package/src/assets/amelipro/img/idpa/apcv_logo.svg +16 -0
  194. package/src/assets/amelipro/img/idpa/carte-vitale.svg +75 -0
  195. package/src/components/Amelipro/AmeliproAccordionFrieze/AmeliproAccordionFrieze.mdx +15 -0
  196. package/src/components/Amelipro/AmeliproAccordionFrieze/AmeliproAccordionFrieze.stories.ts +261 -0
  197. package/src/components/Amelipro/AmeliproAccordionFrieze/AmeliproAccordionFrieze.vue +419 -0
  198. package/src/components/Amelipro/AmeliproAccordionFrieze/__tests__/AmeliproAccordionFrieze.spec.ts +98 -0
  199. package/src/components/Amelipro/AmeliproAccordionFrieze/__tests__/__snapshots__/AmeliproAccordionFrieze.spec.ts.snap +858 -0
  200. package/src/components/Amelipro/AmeliproAccordionFrieze/types.d.ts +6 -0
  201. package/src/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.vue +2 -2
  202. package/src/components/Amelipro/AmeliproAccordionList/__tests__/__snapshots__/AmeliproAccordionList.spec.ts.snap +0 -4
  203. package/src/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.vue +2 -2
  204. package/src/components/Amelipro/AmeliproAccordionResultList/__tests__/__snapshots__/AmeliproAccordionResultList.spec.ts.snap +0 -4
  205. package/src/components/Amelipro/AmeliproBadge/AmeliproBadge.stories.ts +97 -0
  206. package/src/components/Amelipro/AmeliproBtn/AmeliproBtn.stories.ts +190 -8
  207. package/src/components/Amelipro/AmeliproCallback/AmeliproCallback.stories.ts +321 -0
  208. package/src/components/Amelipro/AmeliproCaptcha/AmeliproCaptcha.vue +1 -1
  209. package/src/components/Amelipro/AmeliproCard/AmeliproCard.stories.ts +360 -0
  210. package/src/components/Amelipro/AmeliproCheckbox/AmeliproCheckbox.stories.ts +1 -1
  211. package/src/components/Amelipro/AmeliproCheckboxGroup/AmeliproCheckboxGroup.stories.ts +2 -2
  212. package/src/components/Amelipro/AmeliproCheckboxGroup/AmeliproCheckboxGroup.vue +1 -1
  213. package/src/components/Amelipro/AmeliproChips/AmeliproChips.stories.ts +46 -0
  214. package/src/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.stories.ts +173 -0
  215. package/src/components/Amelipro/AmeliproCopyBtn/AmeliproCopyBtn.stories.ts +112 -26
  216. package/src/components/Amelipro/AmeliproDentalChart/AmeliproDentalChart.mdx +15 -0
  217. package/src/components/Amelipro/AmeliproDentalChart/AmeliproDentalChart.stories.ts +1078 -0
  218. package/src/components/Amelipro/AmeliproDentalChart/AmeliproDentalChart.vue +163 -0
  219. package/src/components/Amelipro/AmeliproDentalChart/AmeliproTooth/AmeliproTooth.vue +183 -0
  220. package/src/components/Amelipro/AmeliproDentalChart/AmeliproTooth/tests/AmeliproTooth.spec.ts +20 -0
  221. package/src/components/Amelipro/AmeliproDentalChart/AmeliproTooth/tests/__snapshots__/AmeliproTooth.spec.ts.snap +39 -0
  222. package/src/components/Amelipro/AmeliproDentalChart/tests/AmeliproDentalChart.spec.ts +468 -0
  223. package/src/components/Amelipro/AmeliproDentalChart/tests/__snapshots__/AmeliproDentalChart.spec.ts.snap +2589 -0
  224. package/src/components/Amelipro/AmeliproDentalChart/types.d.ts +13 -0
  225. package/src/components/Amelipro/AmeliproDialog/AmeliproDialog.stories.ts +333 -0
  226. package/src/components/Amelipro/AmeliproDialog/AmeliproDialog.vue +7 -2
  227. package/src/components/Amelipro/AmeliproDialog/tests/__snapshots__/AmeliproDialog.spec.ts.snap +1 -0
  228. package/src/components/Amelipro/AmeliproErrorTemplate/AmeliproErrorTemplate.vue +1 -1
  229. package/src/components/Amelipro/AmeliproErrorTemplate/__tests__/__snapshots__/AmeliproErrorTemplate.spec.ts.snap +1 -2
  230. package/src/components/Amelipro/AmeliproFirstLogin/AmeliproFirstLogin.mdx +15 -0
  231. package/src/components/Amelipro/AmeliproFirstLogin/AmeliproFirstLogin.stories.ts +287 -0
  232. package/src/components/Amelipro/AmeliproFirstLogin/AmeliproFirstLogin.vue +331 -0
  233. package/src/components/Amelipro/AmeliproFirstLogin/__tests__/AmeliproFirstLogin.spec.ts +29 -0
  234. package/src/components/Amelipro/AmeliproFirstLogin/__tests__/__snapshots__/AmeliproFirstLogin.spec.ts.snap +1210 -0
  235. package/src/components/Amelipro/AmeliproFirstLogin/locales.ts +48 -0
  236. package/src/components/Amelipro/AmeliproIcon/AmeliproIcon.stories.ts +61 -1
  237. package/src/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.stories.ts +174 -0
  238. package/src/components/Amelipro/AmeliproIllustratedDataTile/AmeliproIllustratedDataTile.stories.ts +186 -0
  239. package/src/components/Amelipro/AmeliproMailTile/AmeliproMailTile.stories.ts +237 -0
  240. package/src/components/Amelipro/AmeliproMessage/AmeliproMessage.stories.ts +111 -0
  241. package/src/components/Amelipro/AmeliproMultipleFoldingCard/AmeliproMultipleFoldingCard.stories.ts +199 -0
  242. package/src/components/Amelipro/AmeliproNumberedCard/AmeliproNumberedCard.stories.ts +150 -0
  243. package/src/components/Amelipro/AmeliproOnboarding/AmeliproOnboarding.stories.ts +281 -8
  244. package/src/components/Amelipro/AmeliproPagination/AmeliproPagination.stories.ts +123 -43
  245. package/src/components/Amelipro/AmeliproPatientLogged/AmeliproPatientLogged.mdx +18 -0
  246. package/src/components/Amelipro/AmeliproPatientLogged/AmeliproPatientLogged.stories.ts +250 -0
  247. package/src/components/Amelipro/AmeliproPatientLogged/AmeliproPatientLogged.vue +520 -0
  248. package/src/components/Amelipro/AmeliproPatientLogged/__tests__/AmeliproPatientLogged.spec.ts +79 -0
  249. package/src/components/Amelipro/AmeliproPatientLogged/__tests__/__snapshots__/AmeliproPatientLogged.spec.ts.snap +1140 -0
  250. package/src/components/Amelipro/AmeliproPatientLogged/types.d.ts +49 -0
  251. package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLogin.mdx +18 -0
  252. package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLogin.stories.ts +151 -0
  253. package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLogin.vue +231 -0
  254. package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLoginForm/AmeliproPatientLoginForm.vue +252 -0
  255. package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLoginForm/__tests__/AmeliproPatientLoginForm.spec.ts +46 -0
  256. package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLoginForm/__tests__/__snapshots__/AmeliproPatientLoginForm.spec.ts.snap +33 -0
  257. package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLoginForm/types.d.ts +6 -0
  258. package/src/components/Amelipro/AmeliproPatientLogin/__tests__/AmeliproPatientLogin.spec.ts +49 -0
  259. package/src/components/Amelipro/AmeliproPatientLogin/__tests__/__snapshots__/AmeliproPatientLogin.spec.ts.snap +60 -0
  260. package/src/components/Amelipro/AmeliproPatientLogin/types.d.ts +6 -0
  261. package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.vue +464 -0
  262. package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/__tests__/AmeliproPostalAddressCityRow.spec.ts +41 -0
  263. package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/__tests__/__snapshots__/AmeliproPostalAddressCityRow.spec.ts.snap +548 -0
  264. package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/types.d.ts +12 -0
  265. package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.mdx +15 -0
  266. package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.stories.ts +133 -0
  267. package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.vue +360 -0
  268. package/src/components/Amelipro/AmeliproPostalAddressField/tests/AmeliproPostalAddressField.spec.ts +27 -0
  269. package/src/components/Amelipro/AmeliproPostalAddressField/tests/__snapshots__/AmeliproPostalAddressField.spec.ts.snap +548 -0
  270. package/src/components/Amelipro/AmeliproPostalAddressField/types.d.ts +18 -0
  271. package/src/components/Amelipro/AmeliproRadioGroup/AmeliproRadioGroup.vue +4 -3
  272. package/src/components/Amelipro/AmeliproResultList/AmeliproResultList.vue +2 -2
  273. package/src/components/Amelipro/AmeliproResultList/__tests__/__snapshots__/AmeliproResultList.spec.ts.snap +0 -4
  274. package/src/components/Amelipro/AmeliproStateTile/AmeliproStateTile.stories.ts +210 -0
  275. package/src/components/Amelipro/AmeliproStatus/AmeliproStatus.stories.ts +326 -0
  276. package/src/components/Amelipro/AmeliproTable/AmeliproTable.stories.ts +232 -4
  277. package/src/components/Amelipro/AmeliproTable/AmeliproTable.vue +3 -2
  278. package/src/components/Amelipro/AmeliproTable/__tests__/__snapshots__/AmeliproTable.spec.ts.snap +0 -4
  279. package/src/components/Amelipro/AmeliproTabs/AmeliproTabs.vue +1 -1
  280. package/src/components/Amelipro/AmeliproTextField/AmeliproTextField.stories.ts +2 -2
  281. package/src/components/Amelipro/AmeliproTileBtn/AmeliproTileBtn.stories.ts +222 -6
  282. package/src/components/Amelipro/AmeliproTooltips/AmeliproTooltips.stories.ts +169 -0
  283. package/src/components/Amelipro/AmeliproTooltips/AmeliproTooltips.vue +6 -1
  284. package/src/components/Amelipro/AmeliproTooltips/tests/__snapshots__/AmeliproTooltips.spec.ts.snap +1 -5
  285. package/src/components/Amelipro/AmeliproTransmission/AmeliproTransmission.stories.ts +160 -0
  286. package/src/components/Amelipro/StructureMenu/StructureMenu.vue +1 -1
  287. package/src/components/Amelipro/StructureMenu/tests/__snapshots__/StructureMenu.spec.ts.snap +1 -2
  288. package/src/components/Customs/Selects/SySelect/SySelect.vue +43 -1
  289. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +4 -0
  290. package/src/components/Customs/SyForm/Introduction.mdx +132 -0
  291. package/src/components/Customs/SyForm/SyForm.mdx +105 -0
  292. package/src/components/Customs/SyForm/SyForm.stories.ts +375 -0
  293. package/src/components/Customs/SyForm/SyForm.vue +80 -0
  294. package/src/components/Customs/SyTabs/SyTabs.stories.ts +31 -0
  295. package/src/components/Customs/SyTabs/SyTabs.vue +185 -27
  296. package/src/components/Customs/SyTabs/useTabTransition.ts +42 -0
  297. package/src/components/Customs/SyTextField/SyTextField.vue +12 -3
  298. package/src/components/Customs/SyTextField/types.d.ts +1 -1
  299. package/src/components/DataListItem/DataListItem.vue +12 -13
  300. package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +242 -41
  301. package/src/components/DatePicker/CalendarMode/DatePicker.vue +30 -12
  302. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +246 -59
  303. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +40 -10
  304. package/src/components/DatePicker/DatePickerOverview.mdx +5 -1
  305. package/src/components/DatePicker/DatePickerValidationExample/DatePickerValidation.mdx +21 -21
  306. package/src/components/DatePicker/DatePickerValidationExample/DatePickerValidation.stories.ts +240 -133
  307. package/src/components/DatePicker/DateTextInput/DateRange.stories.ts +29 -1
  308. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +32 -9
  309. package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +166 -38
  310. package/src/components/DatePicker/composables/useDateValidation.ts +8 -5
  311. package/src/components/DatePicker/composables/useManualDateValidation.ts +23 -6
  312. package/src/components/DatePicker/datePickers.stories.ts +28 -0
  313. package/src/components/DatePicker/docExamples/DatePickerBidirectionalValidation.vue +47 -58
  314. package/src/components/DatePicker/docExamples/DatePickerValidationExamples.vue +2 -2
  315. package/src/components/DatePicker/tests/DatePicker.validation.spec.ts +4654 -0
  316. package/src/components/DatePicker/tests/archiTest.md +33 -0
  317. package/src/components/DatePicker/tests/setup.ts +243 -0
  318. package/src/components/DialogBox/DialogBox.stories.ts +1 -1
  319. package/src/components/DialogBox/DialogBox.vue +25 -8
  320. package/src/components/DialogBox/locales.ts +1 -0
  321. package/src/components/DialogBox/tests/DialogBox.spec.ts +187 -15
  322. package/src/components/DialogBox/useDraggable.ts +92 -4
  323. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.vue +4 -0
  324. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/tests/__snapshots__/HeaderMenuItem.spec.ts.snap +4 -1
  325. package/src/components/HeaderNavigationBar/HeaderNavigationBar.vue +18 -2
  326. package/src/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.vue +14 -4
  327. package/src/components/HeaderNavigationBar/types.ts +1 -0
  328. package/src/components/HeaderToolbar/Accessibilite.stories.ts +8 -0
  329. package/src/components/HeaderToolbar/HeaderToolbar.mdx +0 -1
  330. package/src/components/HeaderToolbar/HeaderToolbar.stories.ts +65 -6
  331. package/src/components/HeaderToolbar/HeaderToolbar.vue +589 -162
  332. package/src/components/HeaderToolbar/locales.ts +3 -0
  333. package/src/components/HeaderToolbar/useMobileRightMenu.ts +121 -0
  334. package/src/components/NirField/Accessibilite.stories.ts +4 -0
  335. package/src/components/NirField/NirField.stories.ts +0 -11
  336. package/src/components/NirField/NirField.vue +164 -53
  337. package/src/components/NirField/locales.ts +6 -4
  338. package/src/components/NirField/tests/NirField.spec.ts +2 -2
  339. package/src/components/PasswordField/Accessibilite.stories.ts +96 -0
  340. package/src/components/PasswordField/PasswordField.stories.ts +8 -1
  341. package/src/components/PasswordField/PasswordField.vue +98 -19
  342. package/src/components/PasswordField/locales.ts +2 -0
  343. package/src/components/PasswordField/tests/PasswordField.spec.ts +1 -1
  344. package/src/components/PhoneField/PhoneField.vue +4 -0
  345. package/src/components/RangeField/Accessibilite.stories.ts +4 -0
  346. package/src/components/RangeField/RangeField.stories.ts +60 -0
  347. package/src/components/RangeField/RangeField.vue +37 -21
  348. package/src/components/RangeField/RangeSlider/RangeSlider.vue +30 -8
  349. package/src/components/RangeField/RangeSlider/Tooltip/Tooltip.vue +1 -0
  350. package/src/components/RangeField/RangeSlider/tests/__snapshots__/rangeSlider.spec.ts.snap +12 -4
  351. package/src/components/RangeField/RangeSlider/tests/useMouseSlide.spec.ts +9 -1
  352. package/src/components/RangeField/RangeSlider/useMouseSlide.ts +23 -8
  353. package/src/components/RangeField/config.ts +3 -1
  354. package/src/components/RangeField/tests/__snapshots__/RangeField.spec.ts.snap +132 -141
  355. package/src/components/RatingPicker/Accessibilite.stories.ts +4 -0
  356. package/src/components/RatingPicker/EmotionPicker/EmotionPicker.vue +119 -66
  357. package/src/components/RatingPicker/EmotionPicker/locales.ts +2 -0
  358. package/src/components/RatingPicker/EmotionPicker/tests/EmotionPicker.spec.ts +4 -4
  359. package/src/components/RatingPicker/EmotionPicker/tests/__snapshots__/EmotionPicker.spec.ts.snap +462 -678
  360. package/src/components/RatingPicker/NumberPicker/NumberPicker.vue +106 -42
  361. package/src/components/RatingPicker/NumberPicker/tests/NumberPicker.spec.ts +3 -3
  362. package/src/components/RatingPicker/NumberPicker/tests/__snapshots__/NumberPicker.spec.ts.snap +119 -515
  363. package/src/components/RatingPicker/Rating.ts +5 -1
  364. package/src/components/RatingPicker/RatingPicker.stories.ts +5 -6
  365. package/src/components/RatingPicker/RatingPicker.vue +7 -2
  366. package/src/components/RatingPicker/StarsPicker/StarsPicker.vue +78 -42
  367. package/src/components/RatingPicker/StarsPicker/tests/StarsPicker.spec.ts +7 -7
  368. package/src/components/RatingPicker/StarsPicker/tests/__snapshots__/StarsPicker.spec.ts.snap +163 -245
  369. package/src/components/RatingPicker/locales.ts +1 -0
  370. package/src/components/RatingPicker/tests/__snapshots__/RatingPicker.spec.ts.snap +120 -516
  371. package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +109 -84
  372. package/src/components/Tables/SyServerTable/SyServerTable.vue +51 -16
  373. package/src/components/Tables/SyTable/SyTable.vue +1 -6
  374. package/src/components/Tables/SyTable/tests/SyTable.spec.ts +6 -0
  375. package/src/components/Tables/common/SyTablePagination.vue +0 -6
  376. package/src/components/Tables/common/tableProps.ts +19 -1
  377. package/src/components/Tables/common/usePagination.ts +0 -6
  378. package/src/components/Tables/common/useTableCheckbox.ts +5 -5
  379. package/src/components/index.ts +8 -0
  380. package/src/composables/rules/useFieldValidation.ts +21 -3
  381. package/src/composables/validation/AvecVosComposants.mdx +145 -0
  382. package/src/composables/validation/FormValidation.mdx +151 -0
  383. package/src/composables/validation/FormValidation.stories.ts +402 -0
  384. package/src/composables/validation/useFormValidation.ts +91 -0
  385. package/src/composables/validation/useValidatable.ts +41 -0
  386. package/src/stories/Accessibilite/Avancement/Avancement.stories.ts +2 -2
  387. package/src/stories/Accessibilite/KitDePreAudit/Outils/Introduction.mdx +2 -2
  388. package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +2 -2
  389. package/src/stories/Demarrer/Accueil.stories.ts +6 -6
  390. package/src/stories/GuideDuDev/Installation.mdx +13 -0
  391. package/src/stories/GuideDuDev/LesBreackingChanges.mdx +1 -1
  392. package/src/stories/GuideDuDev/MigrationDepuisBridge.mdx +1 -1
  393. package/src/stories/GuideDuDev/MigrationDepuisVue2.mdx +1 -1
@@ -1,9 +1,13 @@
1
1
  <script lang="ts" setup>
2
- import { VMenu, VList, VListItem, VIcon } from 'vuetify/components'
3
- import { mdiChevronDown, mdiChevronRight } from '@mdi/js'
2
+ import { VMenu, VList, VListItem } from 'vuetify/components'
3
+ import { mdiChevronDown, mdiChevronRight, mdiMenu } from '@mdi/js'
4
4
  import { ref, type PropType, nextTick, onMounted, onBeforeUnmount, watch } from 'vue'
5
5
  import type { MenuItem, SelectItem } from './types'
6
6
  import { useDisplay } from 'vuetify'
7
+ import { useMobileRightMenu } from './useMobileRightMenu'
8
+ import SyIcon from '@/components/Customs/SyIcon/SyIcon.vue'
9
+
10
+ import { locales } from './locales'
7
11
 
8
12
  const elementWidth = ref(0)
9
13
  const menuOpen = ref(false)
@@ -27,6 +31,10 @@
27
31
  },
28
32
  ],
29
33
  },
34
+ currentPageIndex: {
35
+ type: Number,
36
+ default: null,
37
+ },
30
38
  rightMenu: {
31
39
  type: Array as PropType<MenuItem[]>,
32
40
  default: () => [
@@ -153,66 +161,156 @@
153
161
  },
154
162
  ],
155
163
  },
156
- ariaLeftMenu: {
164
+ ariaLeftLabel: {
157
165
  type: String,
158
- default: 'left-menu',
166
+ default: 'Choix du public',
159
167
  },
160
- ariaRightMenu: {
168
+ ariaRightLabel: {
161
169
  type: String,
162
- default: 'right-menu',
170
+ default: 'Menu institutionnel',
163
171
  },
164
172
  })
165
173
 
174
+ // Display breakpoint helpers
166
175
  const { smAndDown } = useDisplay()
167
176
 
177
+ // Return proper link component
168
178
  const getLinkComponent = (item: MenuItem): string => {
169
- if (item.href) {
170
- return 'a'
171
- }
172
- else if (item.to) {
173
- return 'RouterLink'
174
- }
175
- else {
176
- return 'a' // fix doc
177
- }
179
+ if (item.href) return 'a'
180
+ // Safely detect a possible router "to" without using 'any'
181
+ const maybeTo = (item as unknown as { to?: unknown }).to
182
+ if (maybeTo !== undefined && maybeTo !== null) return 'RouterLink'
183
+ return 'a'
178
184
  }
179
185
 
186
+ // Overlay and focus state
180
187
  const showOverlay = ref(false)
181
188
  const highlightMenu = ref(false)
182
189
  const activeIndex = ref<number | null>(null)
190
+ const activeDescendantId = ref<string | null>(null)
191
+ // Transient audit compatibility: when true, all items are tabbable (0) just after open
192
+ const leftMenuAuditTransient = ref(false)
193
+
194
+ const menuButtonRef = ref<HTMLElement | null>(null)
195
+
196
+ // Resolve the interactive ancestor (a/button/focusable) for the left menu activator span
197
+ const getLeftActivatorInteractiveEl = (): HTMLElement | null => {
198
+ const raw = menuButtonRef.value as unknown as { $el?: unknown } | HTMLElement | null
199
+ const baseEl = (raw && (raw as { $el?: unknown }).$el) ? (raw as { $el: unknown }).$el as HTMLElement : (raw as HTMLElement | null)
200
+ const elem = baseEl instanceof HTMLElement ? baseEl : null
201
+ const target = elem?.closest('a,button,[tabindex]:not([tabindex="-1"])') as HTMLElement | null
202
+ if (target) return target
203
+ // Fallback to DOM query if ref resolution fails
204
+ return document.querySelector('#left-menu li:nth-child(2) a') as HTMLElement | null
205
+ }
206
+ // Mobile burger and focus management via composable
207
+ const {
208
+ mobileMenuOpen,
209
+ mobileBurgerButtonRef,
210
+ mobileRightMenuRef,
211
+ mobileActiveDescendantId,
212
+ handleMobileMenuKeydown,
213
+ onMobileMenuModel,
214
+ openMobileMenuAndFocus,
215
+ } = useMobileRightMenu()
216
+ const leftMenuListRef = ref<HTMLElement | null>(null)
217
+ const leftMenuRef = ref<HTMLElement | null>(null)
218
+
219
+ // Resolve the actual HTMLElement of the left dropdown list (works with Vuetify component refs and teleported content)
220
+ const getLeftDropdownEl = (): HTMLElement | null => {
221
+ const refVal = leftMenuListRef.value as unknown as { $el?: unknown } | HTMLElement | null
222
+ const maybeEl = (refVal && (refVal as { $el?: unknown }).$el) ?? refVal
223
+ // If we got a real HTMLElement, return it; otherwise fallback to the id in the DOM
224
+ if (maybeEl instanceof HTMLElement) return maybeEl
225
+ return document.getElementById('left-dropdown-menu')
226
+ }
183
227
 
184
- const hideOverlay = () => {
185
- const activeSelected = document.querySelector('.custom-select > span')?.textContent
186
- if (activeSelected && activeSelected === 'Professionnel de santé') {
187
- highlightMenu.value = false
228
+ const isCurrentRightLink = (item: MenuItem): boolean => {
229
+ if (!item.href) return false
230
+ try {
231
+ const target = new URL(item.href, window.location.href)
232
+ const current = new URL(window.location.href)
233
+ return target.origin === current.origin && target.pathname === current.pathname
234
+ }
235
+ catch {
236
+ return false
188
237
  }
238
+ }
239
+
240
+ // Mobile handlers are provided by the composable
241
+
242
+ const onLeftMenuModel = (val: boolean) => {
243
+ if (val) {
244
+ leftMenuAuditTransient.value = true
245
+ showOverlay.value = true
246
+ nextTick(() => {
247
+ setTimeout(() => {
248
+ const container = getLeftDropdownEl()
249
+ const first = container?.querySelector('[role="menuitem"]') as HTMLElement | null
250
+ if (first) {
251
+ activeDescendantId.value = first.id || 'menu-item-0'
252
+ first.focus()
253
+ }
254
+ }, 30)
255
+ })
256
+ }
257
+ else {
258
+ hideOverlay()
259
+ }
260
+ }
261
+
262
+ // Hide overlay and reset menu state
263
+ const hideOverlay = () => {
189
264
  showOverlay.value = false
190
- menuOpen.value = false // S'assurer que le menu se ferme aussi
265
+ menuOpen.value = false
266
+ activeDescendantId.value = null
191
267
  }
268
+
269
+ // Handle click on left menu links
192
270
  const handleLink = (index: number) => {
193
271
  if (index === 1) {
272
+ // Toggle overlay visibility when clicking the dropdown activator (required by tests)
194
273
  showOverlay.value = !showOverlay.value
195
274
  }
196
275
  }
276
+
277
+ // Update active link and manage overlay highlight logic
197
278
  const checkActiveLink = (index: number) => {
198
- activeIndex.value = index
279
+ if (props.currentPageIndex === null) {
280
+ activeIndex.value = index
281
+ }
199
282
  if (index !== 1) {
283
+ // Clicking a normal link should close any overlay/menu
200
284
  highlightMenu.value = false
285
+ hideOverlay()
201
286
  }
202
287
  }
203
288
 
289
+ // onMobileMenuModel provided by composable
290
+
291
+ // openMobileMenuAndFocus provided by composable
292
+
293
+ // Computed pour déterminer quel élément doit avoir aria-current
294
+ const getCurrentPageIndex = () => {
295
+ return props.currentPageIndex !== null ? props.currentPageIndex : activeIndex.value
296
+ }
297
+
204
298
  const deleteActiveLink = () => {
205
299
  activeIndex.value = null
300
+ // Close any overlay when navigating via right menu
301
+ hideOverlay()
206
302
  }
207
303
 
208
304
  const handleKeyboardEnter = (item: MenuItem, index: number) => {
209
305
  if (index === 1) {
210
- // Pour le menu déroulant, basculer l'état du menu
211
- menuOpen.value = !menuOpen.value
306
+ // Pour le menu déroulant, ouvrir le menu et l'overlay
307
+ openMenuWithKeyboard()
212
308
  }
213
309
  else if (item.href) {
214
310
  // Pour les liens, naviguer vers la destination
215
311
  checkActiveLink(index)
312
+ // Ensure overlay is closed when navigating via keyboard
313
+ hideOverlay()
216
314
  if (item.openInNewTab) {
217
315
  window.open(item.href, '_blank', 'noopener,noreferrer')
218
316
  }
@@ -224,6 +322,8 @@
224
322
  // Pour les liens RouterLink, on ne fait que mettre à jour l'activeIndex
225
323
  // car Vue Router gérera la navigation
226
324
  checkActiveLink(index)
325
+ // Ensure overlay is closed when navigating via router
326
+ hideOverlay()
227
327
  }
228
328
  }
229
329
 
@@ -235,6 +335,15 @@
235
335
  activeIndex.value = 1
236
336
  selectedSubItemText.value = subItem.text // Update selected sub-item tracker
237
337
 
338
+ // Fermer le menu et l'overlay puis rediriger le focus sur le bouton
339
+ hideOverlay()
340
+
341
+ // Rediriger le focus sur le bouton après sélection
342
+ nextTick(() => {
343
+ const focusTarget = getLeftActivatorInteractiveEl()
344
+ focusTarget?.focus()
345
+ })
346
+
238
347
  if (subItem.href) {
239
348
  if (subItem.openInNewTab) {
240
349
  window.open(subItem.href, '_blank', 'noopener,noreferrer')
@@ -247,9 +356,12 @@
247
356
 
248
357
  const updateWidth = async () => {
249
358
  await nextTick()
250
- const element = document.querySelector('.toolbar #left-menu li:nth-child(2)') as HTMLElement
251
- if (element) {
252
- elementWidth.value = element.offsetWidth
359
+ // Measure second left-menu item width using the leftMenuRef (nav > ul > li:nth-child(2))
360
+ const navLike = leftMenuRef.value as unknown as { $el?: unknown } | HTMLElement | null
361
+ const navEl = (navLike && (navLike as { $el?: unknown }).$el) ? (navLike as { $el: unknown }).$el as HTMLElement : (navLike as HTMLElement | null)
362
+ const secondLi = navEl?.querySelector('ul > li:nth-child(2)') as HTMLElement | null
363
+ if (secondLi) {
364
+ elementWidth.value = secondLi.offsetWidth || 0
253
365
  }
254
366
  }
255
367
 
@@ -268,6 +380,109 @@
268
380
  window.removeEventListener('resize', updateWidth)
269
381
  })
270
382
 
383
+ // Gestion de la navigation clavier dans le menu (scopée au menu courant)
384
+ const handleMenuKeydown = (event: KeyboardEvent) => {
385
+ // Exit transient audit mode on first real keyboard interaction inside the menu
386
+ if (leftMenuAuditTransient.value) leftMenuAuditTransient.value = false
387
+ const container = event.currentTarget as HTMLElement | null
388
+ const menuItems = container ? (Array.from(container.querySelectorAll('[role="menuitem"]')) as HTMLElement[]) : []
389
+ if (!menuItems || menuItems.length === 0) return
390
+
391
+ const currentIndex = activeDescendantId.value
392
+ ? menuItems.findIndex(item => item.id === activeDescendantId.value)
393
+ : -1
394
+
395
+ let newIndex = currentIndex
396
+
397
+ switch (event.key) {
398
+ case 'ArrowDown':
399
+ event.preventDefault()
400
+ newIndex = currentIndex < menuItems.length - 1 ? currentIndex + 1 : 0
401
+ break
402
+ case 'ArrowUp':
403
+ event.preventDefault()
404
+ newIndex = currentIndex > 0 ? currentIndex - 1 : menuItems.length - 1
405
+ break
406
+ case 'Home':
407
+ event.preventDefault()
408
+ newIndex = 0
409
+ break
410
+ case 'End':
411
+ event.preventDefault()
412
+ newIndex = menuItems.length - 1
413
+ break
414
+ case 'Escape': {
415
+ event.preventDefault()
416
+ menuOpen.value = false
417
+ showOverlay.value = false
418
+ activeDescendantId.value = null
419
+ // Retourner le focus sur le lien du 2ème menu (Professionnel de santé) via ref robuste
420
+ const secondMenuItem = getLeftActivatorInteractiveEl()
421
+ secondMenuItem?.focus()
422
+ return
423
+ }
424
+ case 'Enter':
425
+ case ' ':
426
+ event.preventDefault()
427
+ if (currentIndex >= 0) {
428
+ (menuItems[currentIndex] as HTMLElement).click()
429
+ }
430
+ return
431
+ default: {
432
+ // Navigation par caractère - recherche d'un item qui commence par la lettre tapée
433
+ if (event.key.length === 1 && /^[a-zA-ZÀ-ÿ]$/.test(event.key)) {
434
+ event.preventDefault()
435
+ const searchChar = event.key.toLowerCase()
436
+
437
+ // Commencer la recherche à partir de l'élément suivant le focus actuel
438
+ const startIndex = currentIndex >= 0 ? currentIndex + 1 : 0
439
+
440
+ // Rechercher d'abord à partir de l'index de départ jusqu'à la fin
441
+ for (let i = startIndex; i < menuItems.length; i++) {
442
+ const itemText = menuItems[i].textContent?.trim().toLowerCase()
443
+ if (itemText && itemText.startsWith(searchChar)) {
444
+ activeDescendantId.value = (menuItems[i] as HTMLElement).id
445
+ return
446
+ }
447
+ }
448
+
449
+ // Si rien trouvé, rechercher du début jusqu'à l'index de départ
450
+ for (let i = 0; i < startIndex; i++) {
451
+ const itemText = (menuItems[i] as HTMLElement).textContent?.trim().toLowerCase()
452
+ if (itemText && itemText.startsWith(searchChar)) {
453
+ activeDescendantId.value = (menuItems[i] as HTMLElement).id
454
+ return
455
+ }
456
+ }
457
+ }
458
+ break
459
+ }
460
+ }
461
+
462
+ if (newIndex !== currentIndex && newIndex >= 0) {
463
+ activeDescendantId.value = menuItems[newIndex].id
464
+ // Move real focus to the active item (roving tabindex)
465
+ const nextEl = menuItems[newIndex] as HTMLElement
466
+ nextTick(() => nextEl.focus())
467
+ }
468
+ }
469
+
470
+ // Ouvrir le menu et placer le focus sur le premier élément (menu gauche)
471
+ const openMenuWithKeyboard = () => {
472
+ menuOpen.value = true
473
+ showOverlay.value = true
474
+ nextTick(() => {
475
+ setTimeout(() => {
476
+ const container = getLeftDropdownEl()
477
+ const firstMenuItem = container?.querySelector('[role="menuitem"]') as HTMLElement | null
478
+ if (firstMenuItem) {
479
+ activeDescendantId.value = firstMenuItem.id || 'menu-item-0'
480
+ firstMenuItem.focus()
481
+ }
482
+ }, 30)
483
+ })
484
+ }
485
+
271
486
  defineExpose({
272
487
  hideOverlay,
273
488
  handleLink,
@@ -279,147 +494,247 @@
279
494
  getLinkComponent,
280
495
  handleSubMenuItemClick,
281
496
  handleKeyboardEnter,
497
+ openMenuWithKeyboard,
498
+ handleMenuKeydown,
282
499
  })
283
500
  </script>
284
501
 
285
502
  <template>
286
- <div class="toolbar">
503
+ <header class="toolbar">
287
504
  <div class="container">
288
- <slot name="left-menu">
289
- <button
290
- v-if="showOverlay"
291
- aria-label="Close overlay"
292
- class="overlay"
293
- @click="hideOverlay"
294
- @keydown.enter="hideOverlay"
295
- @keydown.esc="hideOverlay"
296
- />
297
- <nav
298
- id="left-menu"
299
- :aria-labelledby="props.ariaLeftMenu"
300
- role="navigation"
301
- >
302
- <ul ref="secondLiRef">
303
- <li
304
- v-for="(item, index) in props.leftMenu"
305
- :key="index"
306
- :value="index"
307
- :class="{ active: activeIndex === index && selectedSubItemText !== 'Professionnel de santé', 'menu-open': index === 1 && menuOpen }"
308
- :aria-current="activeIndex === index ? 'page' : undefined"
309
- >
310
- <component
311
- :is="getLinkComponent(item as MenuItem)"
312
- :aria-label="item.title"
313
- :href="item.href"
314
- :rel="item.openInNewTab ? 'noopener noreferrer' : undefined"
315
- :tabindex="0"
316
- :target="item.openInNewTab ? '_blank' : undefined"
317
- :title="item.title"
318
- :to="item.to"
319
- :aria-current="activeIndex === index ? 'page' : undefined"
320
- @click="checkActiveLink(index)"
321
- @focus="index === 1 && showOverlay ? highlightMenu = true : null"
322
- @mouseover="index === 1 && showOverlay ? highlightMenu = true : null"
323
- @keydown.enter.prevent="handleKeyboardEnter(item, index)"
505
+ <section class="left-section">
506
+ <slot name="left-menu">
507
+ <button
508
+ v-if="showOverlay"
509
+ :aria-label="locales.closeOverlay"
510
+ class="overlay"
511
+ @click="hideOverlay"
512
+ @keydown.enter="hideOverlay"
513
+ @keydown.esc="hideOverlay"
514
+ />
515
+ <nav
516
+ id="left-menu"
517
+ ref="leftMenuRef"
518
+ :aria-label="props.ariaLeftLabel"
519
+ role="navigation"
520
+ >
521
+ <ul>
522
+ <li
523
+ v-for="(item, index) in props.leftMenu"
524
+ :key="index"
525
+ :class="{
526
+ active: getCurrentPageIndex() === index && selectedSubItemText !== 'Professionnel de santé',
527
+ 'menu-open': index === 1 && menuOpen,
528
+ 'current-page': getCurrentPageIndex() === index
529
+ }"
324
530
  >
325
- <v-menu
326
- v-if="itemsSelectMenu && index === 1"
327
- v-model="menuOpen"
328
- location="bottom"
329
- attach="body"
330
- scroll-strategy="none"
331
- :offset="[-2,16]"
332
- :close-on-content-click="true"
333
- containment
334
- @update:model-value="(val) => val === false && hideOverlay()"
531
+ <component
532
+ :is="getLinkComponent(item as MenuItem)"
533
+ :aria-label="itemsSelectMenu && index === 1 ? dropdownMenuTitle + '' : item.title"
534
+ :href="item.href"
535
+ :rel="item.openInNewTab ? 'noopener noreferrer' : undefined"
536
+ :tabindex="0"
537
+ :target="item.openInNewTab ? '_blank' : undefined"
538
+ :to="item.to"
539
+ :aria-current="getCurrentPageIndex() === index ? 'page' : undefined"
540
+ :aria-expanded="itemsSelectMenu && index === 1 ? (menuOpen ? 'true' : 'false') : undefined"
541
+ :aria-haspopup="itemsSelectMenu && index === 1 ? 'menu' : undefined"
542
+ :aria-controls="itemsSelectMenu && index === 1 && menuOpen ? 'left-dropdown-menu' : undefined"
543
+ @click="checkActiveLink(index)"
544
+ @focus="index === 1 && showOverlay ? highlightMenu = true : null"
545
+ @mouseover="index === 1 && showOverlay ? highlightMenu = true : null"
546
+ @keydown.enter.prevent="handleKeyboardEnter(item, index)"
547
+ @keydown.space.prevent="index === 1 ? openMenuWithKeyboard() : null"
548
+ @keydown.arrow-down.prevent="index === 1 ? openMenuWithKeyboard() : null"
335
549
  >
336
- <template #activator="{ props: activatorProps }">
337
- <button
338
- v-bind="activatorProps"
339
- :aria-label="dropdownMenuTitle + ', Menu déroulant'"
340
- :class="{ 'link-active': activeIndex === index, 'menu-open': menuOpen }"
341
- :style="smAndDown ? {minWidth: '136px'} : {minWidth: '236px'}"
342
- :aria-expanded="menuOpen ? 'true' : 'false'"
343
- :aria-haspopup="'true'"
344
- class="sy-header-button d-flex justify-space-between"
345
- @click="handleLink(index); checkActiveLink(index)"
346
- >
347
- {{ dropdownMenuTitle }}
348
- <v-icon
349
- :icon="mdiChevronDown"
350
- size="small"
351
- class="ml-1"
352
- />
353
- </button>
354
- </template>
355
- <v-list
356
- dense
357
- :class="smAndDown ? 'mt-2 smAndDown' : 'mt-3'"
358
- :style="smAndDown ? {width: '110vh'} : {width: elementWidth >= 260 ? elementWidth + 'px' : '236px'}"
550
+ <span
551
+ v-if="itemsSelectMenu && index === 1"
552
+ ref="menuButtonRef"
553
+ :class="{ 'link-active': activeIndex === index, 'menu-open': menuOpen }"
554
+ :style="smAndDown ? {minWidth: '136px'} : {minWidth: '236px'}"
555
+ class="sy-header-button d-flex justify-space-between"
359
556
  >
360
- <v-list-item
361
- v-for="(subItem, subIndex) in itemsSelectMenu"
362
- :key="subIndex"
363
- :value="subIndex"
364
- :aria-current="subItem.text === selectedSubItemText ? 'true' : undefined"
365
- :class="{ 'subitem-selected': subItem.text === selectedSubItemText }"
366
- @click="handleSubMenuItemClick(subItem)"
557
+ {{ dropdownMenuTitle }}
558
+ <SyIcon
559
+ :icon="mdiChevronDown"
560
+ size="small"
561
+ decorative
562
+ class="ml-1"
563
+ />
564
+ </span>
565
+ <v-menu
566
+ v-if="itemsSelectMenu && index === 1"
567
+ v-model="menuOpen"
568
+ location="bottom"
569
+ attach="body"
570
+ scroll-strategy="none"
571
+ :offset="[-12,0]"
572
+ :close-on-content-click="true"
573
+ activator="parent"
574
+ content-class="left-dropdown-menu"
575
+ @update:model-value="onLeftMenuModel"
576
+ >
577
+ <v-list
578
+ id="left-dropdown-menu"
579
+ ref="leftMenuListRef"
580
+ role="menu"
581
+ tabindex="-1"
582
+ :class="smAndDown ? 'mt-2 smAndDown' : 'mt-3'"
583
+ :style="smAndDown ? { width: '100vw', maxWidth: '100vw' } : { width: elementWidth >= 260 ? elementWidth + 'px' : '236px' }"
584
+ :aria-activedescendant="activeDescendantId || undefined"
585
+ @keydown="handleMenuKeydown"
367
586
  >
368
- <v-list-item-title class="text-primary">
369
- <v-icon
370
- :icon="mdiChevronRight"
371
- size="small"
372
- class="ml-1"
373
- />
374
- <span>
375
- {{ subItem.text }}
376
- </span>
377
- </v-list-item-title>
378
- </v-list-item>
379
- </v-list>
380
- </v-menu>
381
- <span
382
- v-else
383
- class="link"
384
- >
385
- {{ item.title }}
386
- </span>
387
- </component>
388
- </li>
389
- </ul>
390
- </nav>
391
- </slot>
392
- <slot name="right-menu">
393
- <nav
394
- id="right-menu"
395
- :aria-labelledby="props.ariaRightMenu"
396
- role="navigation"
587
+ <v-list-item
588
+ v-for="(subItem, subIndex) in itemsSelectMenu"
589
+ :id="`menu-item-${subIndex}`"
590
+ :key="subIndex"
591
+ role="menuitem"
592
+ :tabindex="leftMenuAuditTransient ? 0 : (activeDescendantId === `menu-item-${subIndex}` ? 0 : -1)"
593
+ :aria-selected="undefined"
594
+ :class="{
595
+ 'subitem-selected': subItem.text === selectedSubItemText,
596
+ 'menu-item-focused': activeDescendantId === `menu-item-${subIndex}`
597
+ }"
598
+ @click="handleSubMenuItemClick(subItem)"
599
+ >
600
+ <v-list-item-title
601
+ class="text-primary"
602
+ role="presentation"
603
+ >
604
+ <SyIcon
605
+ :icon="mdiChevronRight"
606
+ size="small"
607
+ decorative
608
+ class="ml-1"
609
+ />
610
+ <span>
611
+ {{ subItem.text }}
612
+ </span>
613
+ </v-list-item-title>
614
+ </v-list-item>
615
+ </v-list>
616
+ </v-menu>
617
+ <span
618
+ v-else
619
+ class="link"
620
+ >
621
+ {{ item.title }}
622
+ </span>
623
+ </component>
624
+ </li>
625
+ </ul>
626
+ </nav>
627
+ </slot>
628
+ </section>
629
+ <section class="right-section">
630
+ <!-- Mobile burger menu for right menu (accessible) -->
631
+ <div
632
+ v-if="smAndDown"
633
+ class="mobile-burger"
397
634
  >
398
- <ul>
399
- <li
400
- v-for="(item, index) in props.rightMenu"
401
- :key="index"
635
+ <v-menu
636
+ v-model="mobileMenuOpen"
637
+ location="bottom right"
638
+ origin="top right"
639
+ attach="body"
640
+ content-class="mobile-burger-menu"
641
+ eager
642
+ :offset="[0,0]"
643
+ :close-on-content-click="true"
644
+ @update:model-value="onMobileMenuModel"
645
+ >
646
+ <template #activator="{ props: activatorProps }">
647
+ <button
648
+ ref="mobileBurgerButtonRef"
649
+ type="button"
650
+ class="burger-btn"
651
+ v-bind="activatorProps"
652
+ :aria-label="props.ariaRightLabel"
653
+ :title="props.ariaRightLabel"
654
+ aria-haspopup="menu"
655
+ :aria-expanded="mobileMenuOpen ? 'true' : 'false'"
656
+ aria-controls="mobile-right-menu"
657
+ @keydown.space.prevent="openMobileMenuAndFocus()"
658
+ @keydown.enter.prevent="openMobileMenuAndFocus()"
659
+ >
660
+ <SyIcon
661
+ :icon="mdiMenu"
662
+ size="small"
663
+ decorative
664
+ />
665
+ </button>
666
+ </template>
667
+ <v-list
668
+ id="mobile-right-menu"
669
+ ref="mobileRightMenuRef"
670
+ role="menu"
671
+ tabindex="-1"
672
+ :aria-activedescendant="mobileActiveDescendantId || undefined"
673
+ :aria-label="props.ariaRightLabel"
674
+ @keydown="handleMobileMenuKeydown"
402
675
  >
403
- <component
404
- :is="getLinkComponent(item as MenuItem)"
405
- :aria-label="item.title"
676
+ <v-list-item
677
+ v-for="(item, index) in props.rightMenu"
678
+ :id="`mobile-item-${index}`"
679
+ :key="index"
680
+ link
681
+ role="menuitem"
682
+ :aria-current="isCurrentRightLink(item) ? 'page' : undefined"
406
683
  :href="item.href"
407
- :rel="item.openInNewTab ? 'noopener noreferrer' : undefined"
408
- :tabindex="0"
409
- :aria-current="activeIndex === index ? 'page' : undefined"
410
- :target="item.openInNewTab ? '_blank' : undefined"
411
- :title="item.title"
412
684
  :to="item.to"
413
- @click="deleteActiveLink()"
685
+ :target="item.openInNewTab ? '_blank' : undefined"
686
+ :rel="item.openInNewTab ? 'noopener noreferrer' : undefined"
687
+ :class="{ 'mobile-right-link': true, 'menu-item-focused': mobileActiveDescendantId === `mobile-item-${index}` }"
688
+ tabindex="0"
689
+ @click="mobileMenuOpen = false"
414
690
  >
415
- <span class="right-menu-item">{{ item.title }}</span>
416
- </component>
417
- </li>
418
- </ul>
419
- </nav>
420
- </slot>
691
+ <v-list-item-title class="text-primary">
692
+ <SyIcon
693
+ :icon="mdiChevronRight"
694
+ size="small"
695
+ decorative
696
+ class="mr-1"
697
+ />
698
+ {{ item.title }}
699
+ </v-list-item-title>
700
+ </v-list-item>
701
+ </v-list>
702
+ </v-menu>
703
+ </div>
704
+ <slot
705
+ v-if="!smAndDown"
706
+ name="right-menu"
707
+ >
708
+ <nav
709
+ id="right-menu"
710
+ :aria-label="props.ariaRightLabel"
711
+ role="navigation"
712
+ >
713
+ <ul>
714
+ <li
715
+ v-for="(item, index) in props.rightMenu"
716
+ :key="index"
717
+ >
718
+ <component
719
+ :is="getLinkComponent(item as MenuItem)"
720
+ :aria-label="item.title"
721
+ :href="item.href"
722
+ :rel="item.openInNewTab ? 'noopener noreferrer' : undefined"
723
+ :tabindex="0"
724
+ :target="item.openInNewTab ? '_blank' : undefined"
725
+ :title="item.title"
726
+ :to="item.to"
727
+ @click="deleteActiveLink()"
728
+ >
729
+ <span class="right-menu-item">{{ item.title }}</span>
730
+ </component>
731
+ </li>
732
+ </ul>
733
+ </nav>
734
+ </slot>
735
+ </section>
421
736
  </div>
422
- </div>
737
+ </header>
423
738
  </template>
424
739
 
425
740
  <style lang="scss" scoped>
@@ -440,6 +755,7 @@ $user-assure: tokens.$user-assure;
440
755
  $user-professionnel: tokens.$user-professionnel;
441
756
  $user-entreprise: tokens.$user-entreprise;
442
757
  $first-item-width: 95px;
758
+ $first-item-max-width: 320px;
443
759
  $first-item-width-mobile: 32px;
444
760
  $second-item-max-height: 44px;
445
761
  $second-item-max-height-mobile: 38px;
@@ -467,14 +783,18 @@ $z-overlay: 5; // Sans !important pour éviter des problèmes
467
783
  // Container for toolbar content
468
784
  .container {
469
785
  width: 100%;
470
- max-height: $container-max-height;
786
+
787
+ /* Use min-height to allow growth with large text instead of clipping */
788
+ min-height: $container-max-height;
789
+ height: auto;
471
790
  max-width: $header-max-width;
472
791
  display: flex;
473
792
  align-items: center;
474
793
  justify-content: space-between;
475
794
 
476
795
  @media (width <= $header-breakpoint-sm) {
477
- max-height: $container-max-height-mobile;
796
+ min-height: $container-max-height-mobile;
797
+ height: auto;
478
798
  }
479
799
 
480
800
  // Common list styling
@@ -482,6 +802,9 @@ $z-overlay: 5; // Sans !important pour éviter des problèmes
482
802
  display: flex;
483
803
  align-items: center;
484
804
  justify-content: flex-start;
805
+
806
+ /* Allow wrapping when text is zoomed so items don't overflow */
807
+ flex-wrap: wrap;
485
808
  list-style: none;
486
809
  text-decoration: none;
487
810
  }
@@ -522,6 +845,7 @@ $z-overlay: 5; // Sans !important pour éviter des problèmes
522
845
  // Premier élément (Assuré)
523
846
  li:first-child {
524
847
  min-width: $first-item-width;
848
+ max-width: $first-item-max-width;
525
849
  background: transparent;
526
850
  text-align: center;
527
851
  z-index: 1; // Position basse pour passer sous l'overlay
@@ -534,25 +858,39 @@ $z-overlay: 5; // Sans !important pour éviter des problèmes
534
858
  a:hover {
535
859
  background: $user-assure;
536
860
  }
861
+
862
+ // Indicateur visuel non-colorimétrique pour la page actuelle
863
+ &.current-page {
864
+ position: relative;
865
+
866
+ a {
867
+ font-weight: 900;
868
+ text-decoration: underline;
869
+ }
870
+ }
537
871
  }
538
872
 
539
873
  // Deuxième élément (Professionnel de santé)
540
874
  li:nth-child(2) {
541
875
  z-index: $z-menu-item; // Augmenté pour rester au-dessus de l'overlay
542
- max-height: $second-item-max-height;
876
+
877
+ /* Allow height to grow with larger text sizes */
878
+ min-height: $second-item-max-height;
543
879
  position: relative; // Ajout pour garantir l'effet du z-index
544
880
 
545
881
  @media (width <= $header-breakpoint-sm) {
546
- max-height: $second-item-max-height-mobile;
882
+ min-height: $second-item-max-height-mobile;
547
883
  }
548
884
 
549
885
  a {
550
- max-height: $second-item-max-height;
886
+ /* Let the link grow in height with text zoom */
887
+ min-height: $second-item-max-height;
551
888
  position: relative; // Garantit l'application du z-index
552
889
  z-index: $z-button; // S'assure que le lien reste visible
890
+ max-width: $first-item-max-width;
553
891
 
554
892
  @media (width <= $header-breakpoint-sm) {
555
- max-height: $second-item-max-height-mobile;
893
+ min-height: $second-item-max-height-mobile;
556
894
  }
557
895
  }
558
896
 
@@ -562,7 +900,9 @@ $z-overlay: 5; // Sans !important pour éviter des problèmes
562
900
  .sy-header-button {
563
901
  text-align: left;
564
902
  text-decoration: underline;
565
- white-space: nowrap;
903
+
904
+ /* Allow wrapping to avoid clipping on text zoom */
905
+ white-space: normal;
566
906
  }
567
907
  }
568
908
 
@@ -575,6 +915,17 @@ $z-overlay: 5; // Sans !important pour éviter des problèmes
575
915
  text-decoration: underline;
576
916
  }
577
917
  }
918
+
919
+ // Indicateur visuel non-colorimétrique pour la page actuelle
920
+ &.current-page {
921
+ position: relative;
922
+
923
+ a,
924
+ button,
925
+ .sy-header-button {
926
+ text-decoration: underline;
927
+ }
928
+ }
578
929
  }
579
930
 
580
931
  // Troisième élément (Entreprise)
@@ -587,6 +938,16 @@ $z-overlay: 5; // Sans !important pour éviter des problèmes
587
938
  a:hover {
588
939
  background: $user-entreprise;
589
940
  }
941
+
942
+ // Indicateur visuel non-colorimétrique pour la page actuelle
943
+ &.current-page {
944
+ position: relative;
945
+
946
+ a {
947
+ font-weight: 900;
948
+ text-decoration: underline;
949
+ }
950
+ }
590
951
  }
591
952
  }
592
953
 
@@ -599,11 +960,14 @@ $z-overlay: 5; // Sans !important pour éviter des problèmes
599
960
  }
600
961
 
601
962
  ul {
602
- white-space: nowrap;
603
- overflow: hidden;
963
+ /* Allow wrapping on text zoom to keep content visible and maintain contrast */
964
+ display: flex;
965
+ flex-wrap: wrap;
966
+ white-space: normal;
967
+ overflow: visible;
604
968
 
605
969
  li {
606
- display: inline-block;
970
+ display: inline-flex;
607
971
  }
608
972
  }
609
973
  }
@@ -669,9 +1033,20 @@ $z-overlay: 5; // Sans !important pour éviter des problèmes
669
1033
  }
670
1034
  }
671
1035
 
1036
+ span {
1037
+ white-space: normal !important; // Override Vuetify nowrap
1038
+ }
1039
+
672
1040
  &.v-list-item--link:hover {
673
1041
  background-color: transparent;
674
1042
  }
1043
+
1044
+ // Style pour l'élément ayant le focus via aria-activedescendant
1045
+ &.menu-item-focused {
1046
+ background-color: rgb(25 118 210 / 12%);
1047
+ outline: 2px solid #1976d2;
1048
+ outline-offset: -2px;
1049
+ }
675
1050
  }
676
1051
 
677
1052
  .v-list-item-title {
@@ -734,6 +1109,50 @@ $z-overlay: 5; // Sans !important pour éviter des problèmes
734
1109
  }
735
1110
  }
736
1111
 
1112
+ /* Make left dropdown overlay full-width on mobile */
1113
+ :deep(.left-dropdown-menu) {
1114
+ @media (width <= $header-breakpoint-sm) {
1115
+ width: 100vw !important;
1116
+ max-width: 100vw !important;
1117
+ left: 0 !important;
1118
+ right: 0 !important;
1119
+ transform: none !important; /* avoid centering transforms that reduce width */
1120
+ }
1121
+ }
1122
+
1123
+ /* Ensure burger menu overlay content fits and aligns right on mobile */
1124
+ :deep(.mobile-burger-menu) {
1125
+ max-width: 100vw;
1126
+ width: auto;
1127
+
1128
+ /* Always align to the right edge when attached to body */
1129
+ left: auto !important;
1130
+ right: 0 !important;
1131
+ transform: none !important;
1132
+ }
1133
+
1134
+ /* Mobile burger visibility and button focus styles */
1135
+ .mobile-burger {
1136
+ display: none;
1137
+
1138
+ @media (width <= $header-breakpoint-md) {
1139
+ display: block;
1140
+ }
1141
+
1142
+ .burger-btn {
1143
+ background: transparent;
1144
+ border: 1px solid transparent;
1145
+ padding: 6px 8px;
1146
+ border-radius: 4px;
1147
+ cursor: pointer;
1148
+
1149
+ &:focus-visible {
1150
+ outline: 2px solid #1976d2;
1151
+ outline-offset: 2px;
1152
+ }
1153
+ }
1154
+ }
1155
+
737
1156
  .v-overlay--active {
738
1157
  z-index: $z-overlay;
739
1158
  }
@@ -749,4 +1168,12 @@ $z-overlay: 5; // Sans !important pour éviter des problèmes
749
1168
  border: none;
750
1169
  z-index: 3;
751
1170
  }
1171
+
1172
+ /* Ensure focused menu item styles also apply to teleported overlay content */
1173
+ :deep(.menu-item-focused) {
1174
+ background-color: rgb(25 118 210 / 12%);
1175
+ outline: 2px solid #1976d2;
1176
+ outline-offset: -2px;
1177
+ }
1178
+
752
1179
  </style>