@preply/ds-docs 11.0.0 → 11.1.0

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 (642) hide show
  1. package/.storybook/decorators/withIntlProvider.tsx +1 -1
  2. package/.storybook/main.ts +1 -0
  3. package/.storybook/preview.tsx +5 -0
  4. package/chromatic.config.json +10 -0
  5. package/dist/addon-visual-tests-assets/visual-test-illustration.mp4 +0 -0
  6. package/dist/assets/00.LayoutFlex.stories-pFo1xsBe.js +85 -0
  7. package/dist/assets/00.applications-Cqkdr1wk.js +50 -0
  8. package/dist/assets/00.favicons.guide-B91Vhoka.js +21 -0
  9. package/dist/assets/00.token-explorer-B19aUGGg.js +340 -0
  10. package/dist/assets/00.using-responsive-props-B3Gr_s-n.js +18 -0
  11. package/dist/assets/01.semantic-tokens-ClbORo2f.js +11 -0
  12. package/dist/assets/01.using-shorthand-props-CZYYf4mA.js +39 -0
  13. package/dist/assets/10.Combinations.stories-BktZvBWq.js +128 -0
  14. package/dist/assets/10.fonts.guide-BGeAIZ8f.js +39 -0
  15. package/dist/assets/10.ssr--ERdtJ_Z.js +91 -0
  16. package/dist/assets/11.fonts.explorer-CApH9AGF.js +2 -0
  17. package/dist/assets/11.ssr.app-router-DusJ4Mbq.js +59 -0
  18. package/dist/assets/20.libraries-AkYtGwIz.js +22 -0
  19. package/dist/assets/2025-q4-ds-cleanup-njc6pOZy.js +351 -0
  20. package/dist/assets/30.icons.explorer-D8JDwXl5.js +72 -0
  21. package/dist/assets/30.storybook-C2VMIEWx.js +42 -0
  22. package/dist/assets/40.illustrations.explorer-Dexx0-Yq.js +21 -0
  23. package/dist/assets/60.components-EsXml7S8.js +22 -0
  24. package/dist/assets/90.advanced-CGMa0hIb.js +32 -0
  25. package/dist/assets/Accordion-BGpSQDcU.js +25 -0
  26. package/dist/assets/Accordion-bbEcwV1l.css +1 -0
  27. package/dist/assets/{Accordion.stories-CLwah67K.js → Accordion.stories-DZqm_pl0.js} +7 -7
  28. package/dist/assets/{Accordion.tests.stories-CFH7p1Jq.js → Accordion.tests.stories-CETE9vG5.js} +9 -9
  29. package/dist/assets/AlertBanner.primitives.stories-C1Rk8KVQ.js +14 -0
  30. package/dist/assets/AlertBanner.stories-CJnU52Gn.js +112 -0
  31. package/dist/assets/AlertBannerAction-BSNrnhbi.js +216 -0
  32. package/dist/assets/AlertBannerAction-UAyHHOqS.css +1 -0
  33. package/dist/assets/AlertDialog-Cr1_lUp6.css +1 -0
  34. package/dist/assets/AlertDialog-D1kj7VoM.js +6 -0
  35. package/dist/assets/{AlertDialog.stories-BKT7nitb.js → AlertDialog.stories-CjXjghMW.js} +11 -7
  36. package/dist/assets/Avatar-CZrWRM_5.css +1 -0
  37. package/dist/assets/Avatar-LEDcSb51.js +6 -0
  38. package/dist/assets/Avatar.stories-B6YvTFd5.js +42 -0
  39. package/dist/assets/{AvatarWithStatus-azmN9QBq.css → AvatarWithStatus-DNgVIYbt.css} +1 -1
  40. package/dist/assets/AvatarWithStatus-Dacm-jO_.js +6 -0
  41. package/dist/assets/AvatarWithStatus.stories-D9tFABve.js +36 -0
  42. package/dist/assets/Badge-CXba4Jz8.js +10 -0
  43. package/dist/assets/{Badge-BVnE8GHY.css → Badge-ChvYkJOj.css} +1 -1
  44. package/dist/assets/Badge.stories-6McX8lAA.js +90 -0
  45. package/dist/assets/Box-CJ3Eco8o.js +3 -0
  46. package/dist/assets/Box-CoMoVRxI.css +1 -0
  47. package/dist/assets/Box.stories-D7RLIL2b.js +44 -0
  48. package/dist/assets/BubbleCounter-DwJsPISN.js +5 -0
  49. package/dist/assets/BubbleCounter.stories-CaNBUXy9.js +246 -0
  50. package/dist/assets/Button-DnVrHohm.js +18 -0
  51. package/dist/assets/Button-DsoMn9D3.css +1 -0
  52. package/dist/assets/Button.stories-DB4FO1yP.js +271 -0
  53. package/dist/assets/ButtonBase-DMbDbkQ4.css +1 -0
  54. package/dist/assets/ButtonBase-DV0YtoS6.js +8 -0
  55. package/dist/assets/CalloutBanner-ChlWZtBk.css +1 -0
  56. package/dist/assets/CalloutBanner.stories-DMr5laA1.js +212 -0
  57. package/dist/assets/CalloutBannerText-Lb5ksCJz.css +1 -0
  58. package/dist/assets/CalloutBannerText-pe-2SkHW.js +75 -0
  59. package/dist/assets/Checkbox-B_qY1TUo.css +1 -0
  60. package/dist/assets/Checkbox-DEB6VLYS.js +10 -0
  61. package/dist/assets/{Checkbox.stories-ClI-ZBnj.js → Checkbox.stories-C_Oku35V.js} +6 -6
  62. package/dist/assets/Checkbox.tests.stories-BPHBBZi3.js +68 -0
  63. package/dist/assets/Chips-DK10vypy.css +1 -0
  64. package/dist/assets/Chips.stories-_LC622UQ.js +148 -0
  65. package/dist/assets/Color-6BZIO3FS-Cli2qKZW.js +1 -0
  66. package/dist/assets/{ComposingDialogs.stories-DwVqal9K.js → ComposingDialogs.stories-BSCyTSJL.js} +3 -3
  67. package/dist/assets/ComposingPopovers.stories-cp3PAdHA.js +49 -0
  68. package/dist/assets/CountryFlag-DMEPQuIc.js +49 -0
  69. package/dist/assets/{CountryFlag.stories-hf40f81N.js → CountryFlag.stories-CCfcgg_Y.js} +6 -6
  70. package/dist/assets/CountryFlag.test.stories-BaGoS-6l.js +27 -0
  71. package/dist/assets/Dialog-DCPUOQU4.js +13 -0
  72. package/dist/assets/Dialog.primitives-BPvLcj0z.css +1 -0
  73. package/dist/assets/Dialog.primitives.stories-Vxeh7YZt.js +237 -0
  74. package/dist/assets/Dialog.stories-87tBh-R6.js +267 -0
  75. package/dist/assets/Dialog.test.stories-B4pw7sJ3.js +146 -0
  76. package/dist/assets/DialogActions-BuK-fnKs.js +101 -0
  77. package/dist/assets/DialogCloseButton-Bh5fJ-N5.css +1 -0
  78. package/dist/assets/DialogCloseButton-dPdpMifg.js +149 -0
  79. package/dist/assets/DismissibleChips-Dv66pNAL.js +1 -0
  80. package/dist/assets/DismissibleChips.stories-nMCs_O4R.js +625 -0
  81. package/dist/assets/{Divider-DECo0bYW.css → Divider-BVw27QR_.css} +1 -1
  82. package/dist/assets/Divider-BsdKe9ia.js +1 -0
  83. package/dist/assets/Divider.stories-DMxdOUMT.js +9 -0
  84. package/dist/assets/DocsRenderer-LL677BLK-CToDaeBi.js +2 -0
  85. package/dist/assets/DropdownMenu-BUteP_4e.js +1258 -0
  86. package/dist/assets/DropdownMenu-Dp5QD_2I.css +1 -0
  87. package/dist/assets/DropdownMenu.stories-CPFPB_iw.js +1613 -0
  88. package/dist/assets/FieldButton-B7nd3jTk.css +1 -0
  89. package/dist/assets/FieldButton-lc__KGvz.js +1 -0
  90. package/dist/assets/FieldButton.stories-BweftrEg.js +1 -0
  91. package/dist/assets/FormControl-DX3yRMc2.css +1 -0
  92. package/dist/assets/FormControl-cSvM3XwI.js +7 -0
  93. package/dist/assets/FormControl.stories-guYQ8AuE.js +42 -0
  94. package/dist/assets/Heading-BMcfRMjT.css +1 -0
  95. package/dist/assets/Heading-CEZfMm-F.js +1 -0
  96. package/dist/assets/Heading.stories-CzERNny6.js +67 -0
  97. package/dist/assets/Icon-CfZyHxyH.js +8 -0
  98. package/dist/assets/{Icon-CyGLQNx7.css → Icon-D-_6_kTJ.css} +1 -1
  99. package/dist/assets/Icon-RSC-BpFBpboR.js +6 -0
  100. package/dist/assets/Icon.stories-D27wol8h.js +45 -0
  101. package/dist/assets/IconButton-CUt4Aks_.js +8 -0
  102. package/dist/assets/IconButton-D-myVwPD.css +1 -0
  103. package/dist/assets/IconTile.stories-jvAqK25q.js +88 -0
  104. package/dist/assets/Input-DXnvG-Wl.js +95 -0
  105. package/dist/assets/InputContainer-CKX9LGmw.js +2 -0
  106. package/dist/assets/InputContainer-dj6obgaH.css +1 -0
  107. package/dist/assets/IntegrationWithReactHookForm.stories-CW7Lqen8.js +467 -0
  108. package/dist/assets/{IntlFormattedDateTime.stories-BCwbTrw1.js → IntlFormattedAggregatedDateTime-CsA6eNMt.js} +112 -94
  109. package/dist/assets/{IntlFormattedCurrency.stories-j1D4xFto.js → IntlFormattedCurrency-CAb0INYF.js} +149 -125
  110. package/dist/assets/IntlFormattedCurrency.stories-CDdFf0Ih.js +1 -0
  111. package/dist/assets/IntlFormattedDateTime.stories-UGK_UBla.js +2 -0
  112. package/dist/assets/{constants-DDJ2G0OO.js → IntlFormattedTime-CFUwDROI.js} +853 -761
  113. package/dist/assets/LayoutFlex-Bc-UxKN0.css +1 -0
  114. package/dist/assets/LayoutFlex-DdWp4cl3.js +1 -0
  115. package/dist/assets/LayoutFlexItem-D6I-QYqv.css +1 -0
  116. package/dist/assets/LayoutFlexItem-DE78Bh3c.js +1 -0
  117. package/dist/assets/LayoutGrid-CIFhWu8r.css +1 -0
  118. package/dist/assets/LayoutGrid-qM5_bxVY.js +1 -0
  119. package/dist/assets/LayoutGrid.stories-DnBXjNoY.js +88 -0
  120. package/dist/assets/LayoutGridItem-BDeI61oE.css +1 -0
  121. package/dist/assets/LayoutGridItem-DXWb3V6X.js +1 -0
  122. package/dist/assets/Link-DZ7eineG.css +1 -0
  123. package/dist/assets/Link-J-HUcV5T.js +5 -0
  124. package/dist/assets/{Link.stories-6gHkl5xC.js → Link.stories-Bi7F_Vkw.js} +7 -7
  125. package/dist/assets/Loader-D4VDQ8pj.css +1 -0
  126. package/dist/assets/Loader-D9Ihhamv.js +1 -0
  127. package/dist/assets/Loader.stories-CA2r7ptV.js +37 -0
  128. package/dist/assets/MultiSelectChips-DLTwAQne.js +2 -0
  129. package/dist/assets/MultiSelectChips.stories-BXvs5PAK.js +608 -0
  130. package/dist/assets/NativeSelectField.stories-D0re4a3o.js +295 -0
  131. package/dist/assets/NumberField-BAofx_Ni.js +6 -0
  132. package/dist/assets/NumberField.stories-BhuTuTmY.js +254 -0
  133. package/dist/assets/ObserveIntersection-DPsyMqP-.js +8 -0
  134. package/dist/assets/ObserveIntersection.stories-C5r2quD1.js +27 -0
  135. package/dist/assets/OnboardingTooltip-By90tTWJ.css +1 -0
  136. package/dist/assets/OnboardingTooltip-D8NhfEzc.js +24 -0
  137. package/dist/assets/OnboardingTooltip.stories-D2Y_je7z.js +107 -0
  138. package/dist/assets/OnboardingTooltip.tests.stories-Chu-efpG.js +79 -0
  139. package/dist/assets/OnboardingTour-90hHg-Pp.css +1 -0
  140. package/dist/assets/OnboardingTour-DGI3bTQy.js +4 -0
  141. package/dist/assets/OnboardingTour.stories-Cb1WP0Hu.js +50 -0
  142. package/dist/assets/{OnboardingTour.tests.stories-CHMykq2a.js → OnboardingTour.tests.stories-B05mBGhB.js} +6 -6
  143. package/dist/assets/PasswordField-ByApWpbK.js +6 -0
  144. package/dist/assets/PasswordField.stories-DMtrOVsn.js +229 -0
  145. package/dist/assets/PreplyLogo-D-slBTep.js +3 -0
  146. package/dist/assets/PreplyLogo.stories-uJXJ3dh_.js +93 -0
  147. package/dist/assets/ProgressBar-Tb0nv9N6.js +4 -0
  148. package/dist/assets/ProgressBar-ZiF8cU84.css +1 -0
  149. package/dist/assets/ProgressBar.stories-Bj5ouQO7.js +43 -0
  150. package/dist/assets/ProgressSteps-CKNbDWn0.js +4 -0
  151. package/dist/assets/ProgressSteps-LZubx2ie.css +1 -0
  152. package/dist/assets/ProgressSteps.stories-Dl5cvdWw.js +31 -0
  153. package/dist/assets/PromoDialog-Daxo9KGU.js +3 -0
  154. package/dist/assets/RangeSlider-BshsrfHH.js +4 -0
  155. package/dist/assets/RangeSlider.stories-BnxUgnUq.js +117 -0
  156. package/dist/assets/Rating-7Lokv5qX.js +2 -0
  157. package/dist/assets/Rating.stories-C6vLq72a.js +115 -0
  158. package/dist/assets/RatingInput-B9JvC6a9.js +30 -0
  159. package/dist/assets/RatingInput.stories-CZaxR49A.js +421 -0
  160. package/dist/assets/SelectField-_eSdIkCW.js +19 -0
  161. package/dist/assets/SelectField-jvir0s5w.css +1 -0
  162. package/dist/assets/SelectField.stories-CeBOPAQf.js +517 -0
  163. package/dist/assets/ShowOnIntersection-sdAtBMhN.js +11 -0
  164. package/dist/assets/ShowOnIntersection.stories-Lmr1KetU.js +17 -0
  165. package/dist/assets/SingleSelectChips-BuIHP3oW.js +2 -0
  166. package/dist/assets/{SingleSelectChips.stories-CTAvW0Y9.js → SingleSelectChips.stories-z43WCX3L.js} +22 -22
  167. package/dist/assets/Slider-BJ8Eqvyw.css +1 -0
  168. package/dist/assets/Slider-BjEfhJ_o.js +2 -0
  169. package/dist/assets/Slider.stories-OZrQotEf.js +69 -0
  170. package/dist/assets/Spinner-9IaQuPm2.js +1 -0
  171. package/dist/assets/Spinner-CIgevzeA.css +1 -0
  172. package/dist/assets/Stars-DRmASRCW.css +1 -0
  173. package/dist/assets/Stars-DuQupRe3.js +1 -0
  174. package/dist/assets/Steps-BAxCCGnQ.css +1 -0
  175. package/dist/assets/Steps-Bf2x77zr.js +26 -0
  176. package/dist/assets/{Steps.stories-DqOo6fKy.js → Steps.stories-DFPBr2Yl.js} +13 -11
  177. package/dist/assets/Switch-ClfB15Th.css +1 -0
  178. package/dist/assets/Switch-DPX8X1b7.js +12 -0
  179. package/dist/assets/Switch.stories-EIYyG0Zt.js +151 -0
  180. package/dist/assets/Text-BTI4NIf0.css +1 -0
  181. package/dist/assets/Text-bm2vnOS2.js +1 -0
  182. package/dist/assets/Text.stories-CmIl_fwM.js +67 -0
  183. package/dist/assets/TextField-zS8J7vJP.js +6 -0
  184. package/dist/assets/TextField.stories-BUVrLpus.js +254 -0
  185. package/dist/assets/{TextHighlighted-CzbRMqIZ.css → TextHighlighted-C53ygX_A.css} +1 -1
  186. package/dist/assets/TextHighlighted-DF3lEelY.js +1 -0
  187. package/dist/assets/TextHighlighted.stories-CqDVxX79.js +32 -0
  188. package/dist/assets/{TextInline-CNIzsRbS.css → TextInline-BDaxjuE1.css} +1 -1
  189. package/dist/assets/TextInline-CHB850A5.js +1 -0
  190. package/dist/assets/TextInline.stories-CN5P8M-t.js +50 -0
  191. package/dist/assets/TextareaField-D-D245Qp.js +6 -0
  192. package/dist/assets/TextareaField.stories-zf-ovHbR.js +272 -0
  193. package/dist/assets/Toast-BwHq_wh7.js +3 -0
  194. package/dist/assets/Toast-CeQJ1lVu.css +1 -0
  195. package/dist/assets/Toast.stories-ojcdW7OV.js +183 -0
  196. package/dist/assets/TokyoUIAttach-CJ32NKTG.js +1 -0
  197. package/dist/assets/TokyoUIAvailability7LateNight-DffduFvP.js +1 -0
  198. package/dist/assets/TokyoUICheck-UkrDdu35.js +1 -0
  199. package/dist/assets/TokyoUICheckmark-6GaMBtS8.js +1 -0
  200. package/dist/assets/TokyoUIChevronDown-CS0lTt7n.js +1 -0
  201. package/dist/assets/TokyoUIChevronRight-BtUABx06.js +1 -0
  202. package/dist/assets/TokyoUIClose-cJyNy-kq.js +1 -0
  203. package/dist/assets/TokyoUIEmojiFrowning-DEhH_o6k.js +1 -0
  204. package/dist/assets/TokyoUIErrorWarning-CE_6hT_0.js +1 -0
  205. package/dist/assets/TokyoUIExerciseClosedGapsJumble-CmLQbqx9.js +1 -0
  206. package/dist/assets/TokyoUIEye--Ky-ic4j.js +1 -0
  207. package/dist/assets/TokyoUIFav-D3EBPocg.js +1 -0
  208. package/dist/assets/TokyoUIInfo-B-CriP10.js +1 -0
  209. package/dist/assets/TokyoUILanguage-B0kNm-zw.js +1 -0
  210. package/dist/assets/TokyoUILibraryExplore-BZ10fOAZ.js +1 -0
  211. package/dist/assets/TokyoUILock-Chkf2ogE.js +1 -0
  212. package/dist/assets/TokyoUIMessages-z4JOaU4E.js +1 -0
  213. package/dist/assets/TokyoUIMinus-DKK-A5EK.js +1 -0
  214. package/dist/assets/TokyoUINotebook-DO8t9gWt.js +1 -0
  215. package/dist/assets/TokyoUINotesWithPad-DM2X7aVA.js +1 -0
  216. package/dist/assets/TokyoUIPhone-Bw5Vf4vA.js +1 -0
  217. package/dist/assets/TokyoUISettings-D5pBmcYk.js +1 -0
  218. package/dist/assets/TokyoUISparkle-C3Cy7wMI.js +1 -0
  219. package/dist/assets/TokyoUIStarFilled-CYq7gSvg.js +1 -0
  220. package/dist/assets/TokyoUITag-Cg8pSiwB.js +1 -0
  221. package/dist/assets/TokyoUIUpload-B1wN3uN1.js +1 -0
  222. package/dist/assets/TokyoUIUser-BxbKTbW_.js +1 -0
  223. package/dist/assets/{Tooltip-Cm9bKrYj.css → Tooltip-C5LpnpaC.css} +1 -1
  224. package/dist/assets/Tooltip-IQdlsINh.js +9 -0
  225. package/dist/assets/Tooltip.stories-9Tn4uyBh.js +93 -0
  226. package/dist/assets/Tooltip.tests.stories-Cr4rBDLb.js +65 -0
  227. package/dist/assets/VisuallyHidden-CN0xhFLZ.js +1 -0
  228. package/dist/assets/VisuallyHidden-SLhaLKxx.css +1 -0
  229. package/dist/assets/WithTooltip-65CFNBJE-B-ngulbF.js +9 -0
  230. package/dist/assets/align-self-B8vQODdk.css +1 -0
  231. package/dist/assets/align-self-DLZqaACP.js +1 -0
  232. package/dist/assets/ar-CmAh1fW1.js +1 -0
  233. package/dist/assets/axe-C7CO230w.js +20 -0
  234. package/dist/assets/breakpoints-DVI9b-sj.js +31 -0
  235. package/dist/assets/breakpoints-DhB77ppz.js +32 -0
  236. package/dist/assets/breakpoints-JehRf-HQ.js +30 -0
  237. package/dist/assets/{changelog-BoskfpJ8.js → changelog-BlpT3PVh.js} +18 -3
  238. package/dist/assets/chunk-242VQQM5-BHHKbgg-.js +1 -0
  239. package/dist/assets/chunk-3LY4VQVK-Di70sXb8.js +6 -0
  240. package/dist/assets/chunk-BneVvdWh.js +1 -0
  241. package/dist/assets/chunk-YKABRMAI-tsMt0pG-.js +18 -0
  242. package/dist/assets/client-o3HipSzo.js +1 -0
  243. package/dist/assets/components-B2mdrQXl.js +1 -0
  244. package/dist/assets/components-BJI6UJJQ.js +250 -0
  245. package/dist/assets/constants-BKSB-IRi.js +37 -0
  246. package/dist/assets/createRequiredContext-CgxIAZIj.js +241 -0
  247. package/dist/assets/createRequiredContext-rvejDfGq.css +1 -0
  248. package/dist/assets/cs-o6LA2LFi.js +1 -0
  249. package/dist/assets/de-CGU9rRAn.js +1 -0
  250. package/dist/assets/dist-Cc1j9Pjk.js +1 -0
  251. package/dist/assets/dist-CrJFSSHJ.css +1 -0
  252. package/dist/assets/dist-DtfJeYQK.js +32 -0
  253. package/dist/assets/dist-XW9XCd1i.js +122 -0
  254. package/dist/assets/emotion-unitless.esm-NifOLKB5.js +1 -0
  255. package/dist/assets/en-CAnKwElg.js +1 -0
  256. package/dist/assets/es-MH1DT2kV.js +1 -0
  257. package/dist/assets/esm-CS074ZRu.js +12 -0
  258. package/dist/assets/filterAttributesPassedByRadixUIAtRuntime-CGiuUnR2.js +1 -0
  259. package/dist/assets/fonts-explorer.stories-I8-ZOqnR.js +100 -0
  260. package/dist/assets/formatter-EIJCOSYU-CrRlJc_C.js +1 -0
  261. package/dist/assets/fr-CgnvB_BI.js +1 -0
  262. package/dist/assets/getTokenVar-BdWui4zI.js +11 -0
  263. package/dist/assets/gradientBorders-CStgfkEm.js +45 -0
  264. package/dist/assets/hk-CaQALTDd.js +1 -0
  265. package/dist/assets/hover-BZswJq9X.js +13 -0
  266. package/dist/assets/hover-DkvE2XjW.js +14 -0
  267. package/dist/assets/hover-xopBYDG-.js +16 -0
  268. package/dist/assets/id-Bp-BGWpK.js +1 -0
  269. package/dist/assets/iframe-CYkk6Y66.css +1 -0
  270. package/dist/assets/iframe-f34VuKy-.js +1194 -0
  271. package/dist/assets/intro-OCMNWtPd.js +31 -0
  272. package/dist/assets/it-BMSKWkCc.js +1 -0
  273. package/dist/assets/ja-wtIn1pnV.js +1 -0
  274. package/dist/assets/jsx-runtime-C2wGStra.js +1 -0
  275. package/dist/assets/ko-DvhW2pVO.js +1 -0
  276. package/dist/assets/layout-relative-BDjBJtei.js +1 -0
  277. package/dist/assets/layout-relative-D3aa9xon.css +1 -0
  278. package/dist/assets/layout-relative.module-BEsoJgyf.js +1 -0
  279. package/dist/assets/lib-CXCPi5ID.js +26 -0
  280. package/dist/assets/matchers-5TDFFDYO-CdU16gNa.js +28 -0
  281. package/dist/assets/mcp-wYzkbrqT.js +32 -0
  282. package/dist/assets/mdx-react-shim-Bi0BC7jy.js +1 -0
  283. package/dist/assets/migrating-from-less-DfjDPQaC.js +36 -0
  284. package/dist/assets/nl-BW9s7SpL.js +1 -0
  285. package/dist/assets/pl-B0BEw5na.js +1 -0
  286. package/dist/assets/playground.stories-oI9ZDlnt.js +6 -0
  287. package/dist/assets/preload-helper-nVtPd9zc.js +1 -0
  288. package/dist/assets/pt-qEWGT9cy.js +1 -0
  289. package/dist/assets/react-18-ziWOvQTm.js +1 -0
  290. package/dist/assets/react-B8jdHdWa.js +1 -0
  291. package/dist/assets/react-C6B6irz5.js +1 -0
  292. package/dist/assets/react-C7IZe2D1.js +1 -0
  293. package/dist/assets/react-dom-CLuuWI32.js +8 -0
  294. package/dist/assets/render-icon-Dzkg3KVE.js +1 -0
  295. package/dist/assets/ro-DLH7plv7.js +1 -0
  296. package/dist/assets/ru-BmiT91mV.js +1 -0
  297. package/dist/assets/shared-strings-DrlpFtg5.js +1 -0
  298. package/dist/assets/shim-Do3tPrxV.js +1 -0
  299. package/dist/assets/storybook-utils-CXrHOWy7.js +1 -0
  300. package/dist/assets/styled-components.browser.esm-BqKZXl6d.js +2 -0
  301. package/dist/assets/styled-components.browser.esm-ByE8r-7j.js +2 -0
  302. package/dist/assets/sv-CW9z0vaU.js +1 -0
  303. package/dist/assets/syntaxhighlighter-ED5Y7EFY-BYBQ9ptv.js +6 -0
  304. package/dist/assets/text-accent-CfNKCcRq.js +1 -0
  305. package/dist/assets/text-centered-DCp9pLpt.css +1 -0
  306. package/dist/assets/text-centered-ozyo-Yf9.js +1 -0
  307. package/dist/assets/th-isRlGLm5.js +1 -0
  308. package/dist/assets/theming-BrHPXhKw.js +1 -0
  309. package/dist/assets/theming-C7TmxyGw.js +39 -0
  310. package/dist/assets/tokens-C1gyoh8D.js +16 -0
  311. package/dist/assets/tokens-C7Hn5QJc.js +15 -0
  312. package/dist/assets/tokens-CubiKgE5.js +15 -0
  313. package/dist/assets/tr-CvfBJD7Q.js +1 -0
  314. package/dist/assets/tw-DpiBe17Q.js +1 -0
  315. package/dist/assets/ua-CPYW3Hlj.js +1 -0
  316. package/dist/assets/useBreakpointMatch-B8CIBjwc.js +1 -0
  317. package/dist/assets/useControllableState-BBsZ9A2n.js +1 -0
  318. package/dist/assets/useMergeRefs-D0D5dYrn.js +1 -0
  319. package/dist/assets/usePortalElement-uqsVx9U8.js +19 -0
  320. package/dist/assets/useStableCallback-DnHVYLVo.js +1 -0
  321. package/dist/assets/welcome-t0_iHw7X.js +23 -0
  322. package/dist/assets/zeroheight-DxMICzug.js +75 -0
  323. package/dist/assets/zh-C43VYh_6.js +1 -0
  324. package/dist/iframe.html +69 -40
  325. package/dist/index.html +8 -3
  326. package/dist/index.json +1 -1
  327. package/dist/preview-stats.json +21532 -16519
  328. package/dist/project.json +1 -1
  329. package/dist/sb-addons/a11y-1/manager-bundle.js +55 -3
  330. package/dist/sb-addons/chromatic-com-storybook-5/manager-bundle.js +352 -0
  331. package/dist/sb-addons/chromatic-com-storybook-5/manager-bundle.js.LEGAL.txt +40 -0
  332. package/dist/sb-addons/docs-4/manager-bundle.js +1 -1
  333. package/dist/sb-addons/links-2/manager-bundle.js +1 -1
  334. package/dist/sb-addons/storybook-6/manager-bundle.js +3 -0
  335. package/dist/sb-addons/storybook-core-server-presets-0/common-manager-bundle.js +66 -66
  336. package/dist/sb-addons/vitest-3/manager-bundle.js +1 -1
  337. package/dist/sb-manager/globals-runtime.js +9758 -7407
  338. package/dist/sb-manager/runtime.js +3034 -2325
  339. package/dist/vite-inject-mocker-entry.js +2 -18
  340. package/package.json +19 -20
  341. package/pages/30.guides/70.assets/constants/icon-imports.ts +8 -0
  342. package/dist/assets/00-BMs4V7pn.css +0 -1
  343. package/dist/assets/00-CGymiNpA.css +0 -1
  344. package/dist/assets/00.LayoutFlex.stories-lllooXjc.js +0 -85
  345. package/dist/assets/00.applications-ApRgtzMF.js +0 -50
  346. package/dist/assets/00.favicons.guide-4ivqvu_K.js +0 -21
  347. package/dist/assets/00.token-explorer-DCBSOdHJ.js +0 -340
  348. package/dist/assets/00.using-responsive-props-BhAkr9Gn.js +0 -18
  349. package/dist/assets/01-2pw2iC19.css +0 -1
  350. package/dist/assets/01.semantic-tokens-BBQKcQ5o.js +0 -11
  351. package/dist/assets/01.using-shorthand-props-SxccG8oR.js +0 -39
  352. package/dist/assets/10.Combinations.stories-D3XySbv3.js +0 -128
  353. package/dist/assets/10.fonts.guide-p4vZ2TE8.js +0 -39
  354. package/dist/assets/10.ssr-BLS5aGYV.js +0 -91
  355. package/dist/assets/11.fonts.explorer-BMm1rcuE.js +0 -2
  356. package/dist/assets/11.ssr.app-router-B_LdKMuw.js +0 -59
  357. package/dist/assets/20.libraries-Uutk1t-k.js +0 -21
  358. package/dist/assets/2025-q4-ds-cleanup-D2AonoQX.js +0 -341
  359. package/dist/assets/30.icons.explorer-D63Br7GU.js +0 -72
  360. package/dist/assets/30.storybook-B_OtmSNE.js +0 -42
  361. package/dist/assets/40.illustrations.explorer-Pi9iaQwM.js +0 -21
  362. package/dist/assets/90.advanced-tEkbHxcl.js +0 -32
  363. package/dist/assets/Accordion-2avWtqXz.js +0 -23
  364. package/dist/assets/Accordion-DBIXJNVb.css +0 -1
  365. package/dist/assets/AlertBanner.primitives.stories-DpA-of6O.js +0 -14
  366. package/dist/assets/AlertBanner.stories-B7xxyCn2.js +0 -124
  367. package/dist/assets/AlertBannerAction-D14MnnIA.js +0 -128
  368. package/dist/assets/AlertBannerAction-Dgo9FikS.css +0 -1
  369. package/dist/assets/AlertDialog-B5rRXSxb.js +0 -4
  370. package/dist/assets/AlertDialog-DjB9AufV.css +0 -1
  371. package/dist/assets/Avatar-B6s9WtES.css +0 -1
  372. package/dist/assets/Avatar-Die_4zu0.js +0 -6
  373. package/dist/assets/Avatar.stories-DJHK0lEC.js +0 -42
  374. package/dist/assets/AvatarWithStatus.stories-E9QQr3Dr.js +0 -41
  375. package/dist/assets/Badge-BSDHZ3bI.js +0 -10
  376. package/dist/assets/Badge.stories-6FOVA96I.js +0 -90
  377. package/dist/assets/Box-CfDLuPKr.css +0 -1
  378. package/dist/assets/Box.stories-DAVs5Qmd.js +0 -44
  379. package/dist/assets/BubbleCounter.stories-DHv_hrNV.js +0 -242
  380. package/dist/assets/Button-C0Um_QuO.js +0 -18
  381. package/dist/assets/Button-U6ON1pQl.css +0 -1
  382. package/dist/assets/Button.stories-CTSwUwYJ.js +0 -270
  383. package/dist/assets/ButtonBase-Bv11I0L0.css +0 -1
  384. package/dist/assets/ButtonBase-DGinnt2u.js +0 -1
  385. package/dist/assets/ButtonBase-HkSfLFbE.js +0 -8
  386. package/dist/assets/ButtonBase-vTD2whCv.css +0 -1
  387. package/dist/assets/CalloutBanner-Cw440Euq.css +0 -1
  388. package/dist/assets/CalloutBanner.stories-C62ApsKt.js +0 -286
  389. package/dist/assets/Checkbox-CrI8PiHH.css +0 -1
  390. package/dist/assets/Checkbox-U8uzIr-e.js +0 -10
  391. package/dist/assets/Checkbox.tests.stories-CrLxNZ2d.js +0 -64
  392. package/dist/assets/Chips-BXIX_-Jx.css +0 -1
  393. package/dist/assets/Chips.stories-BMxD1fH1.js +0 -146
  394. package/dist/assets/Color-ASIRERSW-BsR8auWQ.js +0 -1
  395. package/dist/assets/ComposingPopovers.stories-DtmTbsU_.js +0 -49
  396. package/dist/assets/CountryFlag-D40CtNEa.js +0 -49
  397. package/dist/assets/CountryFlag.test.stories-Bde0Okud.js +0 -27
  398. package/dist/assets/Dialog-CJQmu6iz.js +0 -13
  399. package/dist/assets/Dialog.primitives-DLgD-yog.css +0 -1
  400. package/dist/assets/Dialog.primitives.stories-BRGfipHO.js +0 -213
  401. package/dist/assets/Dialog.stories-D4tyIGD0.js +0 -329
  402. package/dist/assets/Dialog.test.stories-xCqInD69.js +0 -146
  403. package/dist/assets/DialogActions-GLMqsJfB.js +0 -101
  404. package/dist/assets/DialogCloseButton-D5YliaRd.js +0 -149
  405. package/dist/assets/DialogCloseButton-DXcPNZE4.css +0 -1
  406. package/dist/assets/DismissibleChips-YCE2ttV-.js +0 -1
  407. package/dist/assets/DismissibleChips.stories-Cx3sJ6UG.js +0 -625
  408. package/dist/assets/Divider-j3vJV734.js +0 -1
  409. package/dist/assets/Divider.stories-CK-PipZt.js +0 -9
  410. package/dist/assets/DocsRenderer-GHJI37HO-WuLZQEsz.js +0 -2
  411. package/dist/assets/DropdownMenu-B9HIHqSr.css +0 -1
  412. package/dist/assets/DropdownMenu-CgNvtJ2F.js +0 -1232
  413. package/dist/assets/DropdownMenu.stories-DpmKDI1Q.js +0 -1603
  414. package/dist/assets/FieldButton-CDW5AvHN.css +0 -1
  415. package/dist/assets/FieldButton-DpHF49o_.js +0 -1
  416. package/dist/assets/FieldButton.stories-C7v9WweE.js +0 -1
  417. package/dist/assets/FormControl-BBqp99uJ.css +0 -1
  418. package/dist/assets/FormControl-Zqf1cIwP.js +0 -7
  419. package/dist/assets/FormControl.stories-D4xKaMaA.js +0 -42
  420. package/dist/assets/Heading-BTHqyLcz.css +0 -1
  421. package/dist/assets/Heading-Cj8Si45g.js +0 -1
  422. package/dist/assets/Heading.stories-BG_kLNJz.js +0 -67
  423. package/dist/assets/Icon-CC0yjdx9.js +0 -8
  424. package/dist/assets/Icon-RSC-Cl0H44C3.js +0 -6
  425. package/dist/assets/Icon.stories-DAIYY4Bp.js +0 -45
  426. package/dist/assets/IconButton-BpjNyYgD.js +0 -8
  427. package/dist/assets/IconButton-COydvoLU.css +0 -1
  428. package/dist/assets/IconTile-CAnlU9ss.js +0 -1
  429. package/dist/assets/IconTile-DDvHA75S.css +0 -1
  430. package/dist/assets/IconTile.stories-DnUYn3Id.js +0 -88
  431. package/dist/assets/Input-DuW1_5SG.js +0 -48
  432. package/dist/assets/InputContainer-Cmdo_xyq.js +0 -2
  433. package/dist/assets/InputContainer-DIiUCsnL.css +0 -1
  434. package/dist/assets/IntegrationWithReactHookForm.stories-9EImL3zR.js +0 -467
  435. package/dist/assets/LayoutFlex-7DoB3s9X.css +0 -1
  436. package/dist/assets/LayoutFlex-CTH6ELdm.js +0 -1
  437. package/dist/assets/LayoutFlex-DXRMJ9FH.js +0 -1
  438. package/dist/assets/LayoutFlex-vHEU4SLb.css +0 -1
  439. package/dist/assets/LayoutFlexItem-C4cPPR-1.css +0 -1
  440. package/dist/assets/LayoutFlexItem-lmgCv4Y9.js +0 -1
  441. package/dist/assets/LayoutGrid-CSKyUAin.css +0 -1
  442. package/dist/assets/LayoutGrid-CUGRXgEO.js +0 -1
  443. package/dist/assets/LayoutGrid-Cm59X3OY.css +0 -1
  444. package/dist/assets/LayoutGrid-SAztDD7Z.js +0 -1
  445. package/dist/assets/LayoutGrid.stories-2dbzhVi7.js +0 -88
  446. package/dist/assets/LayoutGridItem-Bo7Opdaq.css +0 -1
  447. package/dist/assets/LayoutGridItem-UTn4G6JO.js +0 -1
  448. package/dist/assets/Link-BAFCJR3T.js +0 -5
  449. package/dist/assets/Link-BIhxLhqK.css +0 -1
  450. package/dist/assets/Loader-hjoeRutr.css +0 -1
  451. package/dist/assets/Loader.stories-CG-Eo8vg.js +0 -37
  452. package/dist/assets/MultiSelectChips-CBnEtn4N.js +0 -2
  453. package/dist/assets/MultiSelectChips.stories-Ch4FxGM2.js +0 -608
  454. package/dist/assets/NativeSelectField.stories-Pj5dm9hL.js +0 -295
  455. package/dist/assets/NumberField-klmIiQAi.js +0 -6
  456. package/dist/assets/NumberField.stories-D740jISy.js +0 -254
  457. package/dist/assets/ObserveIntersection-Dx2gD1CU.js +0 -8
  458. package/dist/assets/ObserveIntersection.stories-JJPEw5oG.js +0 -27
  459. package/dist/assets/OnboardingTooltip-DzQhJzWc.js +0 -16
  460. package/dist/assets/OnboardingTooltip-X4QjsIe6.css +0 -1
  461. package/dist/assets/OnboardingTooltip.stories-BDgRgbzO.js +0 -107
  462. package/dist/assets/OnboardingTooltip.tests.stories-DrqovP8T.js +0 -79
  463. package/dist/assets/OnboardingTour-B5gEod5H.js +0 -4
  464. package/dist/assets/OnboardingTour-DoEbirUE.css +0 -1
  465. package/dist/assets/OnboardingTour.stories-BzHBS52z.js +0 -46
  466. package/dist/assets/PasswordField-BjqiXySY.js +0 -6
  467. package/dist/assets/PasswordField.stories-YCTP14pU.js +0 -229
  468. package/dist/assets/PreplyLogo.stories-lPBmn_E2.js +0 -95
  469. package/dist/assets/ProgressBar-N_jhfqno.css +0 -1
  470. package/dist/assets/ProgressBar.stories-DqvDJEeF.js +0 -44
  471. package/dist/assets/ProgressSteps-5GOrC9Qn.css +0 -1
  472. package/dist/assets/ProgressSteps-Dce_SjLt.js +0 -2
  473. package/dist/assets/ProgressSteps.stories-BMDqz7-Z.js +0 -31
  474. package/dist/assets/PromoDialog-DdnXVfH8.js +0 -3
  475. package/dist/assets/RangeSlider-MZqvjtBp.js +0 -4
  476. package/dist/assets/RangeSlider.stories-BS4-l1u4.js +0 -117
  477. package/dist/assets/Rating.stories-wHsrBw3w.js +0 -116
  478. package/dist/assets/RatingInput.stories-BKAXF4Qv.js +0 -455
  479. package/dist/assets/SelectField-BvrdbknI.css +0 -1
  480. package/dist/assets/SelectField-DU60q2LU.js +0 -19
  481. package/dist/assets/SelectField.stories-BKCyFPQa.js +0 -517
  482. package/dist/assets/ShowOnIntersection.stories-BdO_3n9P.js +0 -17
  483. package/dist/assets/SingleSelectChips-CDtny-H7.js +0 -2
  484. package/dist/assets/Slider-B8ndK7PX.js +0 -2
  485. package/dist/assets/Slider-B_IRLClB.css +0 -1
  486. package/dist/assets/Slider.stories-CBV0fePJ.js +0 -69
  487. package/dist/assets/Spinner-8-RB4YZR.js +0 -1
  488. package/dist/assets/Spinner-CzIq-Vt3.css +0 -1
  489. package/dist/assets/Stars-BJkSwBV2.css +0 -1
  490. package/dist/assets/Stars-BSTkfC0i.js +0 -1
  491. package/dist/assets/Steps-DUeCVcxV.js +0 -26
  492. package/dist/assets/Steps-nUB2CDHz.css +0 -1
  493. package/dist/assets/Switch-DHmH1ale.css +0 -1
  494. package/dist/assets/Switch-Dyoj_Z1P.js +0 -12
  495. package/dist/assets/Switch.stories-CDVDjU2B.js +0 -151
  496. package/dist/assets/Text-D2ADMZ83.css +0 -1
  497. package/dist/assets/Text-DJTKRzSb.js +0 -1
  498. package/dist/assets/Text-DvShrljd.js +0 -1
  499. package/dist/assets/Text-O3SM8a3p.css +0 -1
  500. package/dist/assets/Text.stories-DRuLuJwb.js +0 -67
  501. package/dist/assets/TextField-BSJgR_zK.js +0 -6
  502. package/dist/assets/TextField.stories-rtu-asgN.js +0 -254
  503. package/dist/assets/TextHighlighted.stories-Bc0bMLCv.js +0 -32
  504. package/dist/assets/TextInline.stories-DKWvwjg6.js +0 -50
  505. package/dist/assets/TextareaField-DUqOyVK5.js +0 -53
  506. package/dist/assets/TextareaField.stories-CiRYJL_j.js +0 -272
  507. package/dist/assets/Toast-PKFBYWQw.css +0 -1
  508. package/dist/assets/Toast.stories-S5qFLRPf.js +0 -185
  509. package/dist/assets/TokyoUIAttach-BsMlsNHQ.js +0 -1
  510. package/dist/assets/TokyoUIAvailability7LateNight-BUCnoHXS.js +0 -1
  511. package/dist/assets/TokyoUICheck-DQLX_x10.js +0 -1
  512. package/dist/assets/TokyoUICheckmark-BHJrELn_.js +0 -1
  513. package/dist/assets/TokyoUIChevronDown-DiBNbDdz.js +0 -1
  514. package/dist/assets/TokyoUIChevronRight-DRhJYmWB.js +0 -1
  515. package/dist/assets/TokyoUIClose-BfMyMrDa.js +0 -1
  516. package/dist/assets/TokyoUIEmojiFrowning-DkxcBN-M.js +0 -1
  517. package/dist/assets/TokyoUIErrorWarning-GuwQvo24.js +0 -1
  518. package/dist/assets/TokyoUIExerciseClosedGapsJumble-BhG23ylY.css +0 -1
  519. package/dist/assets/TokyoUIExerciseClosedGapsJumble-C8roFqfh.js +0 -1
  520. package/dist/assets/TokyoUIEye-oyrTN--k.js +0 -1
  521. package/dist/assets/TokyoUIFav-C-stY9U_.js +0 -1
  522. package/dist/assets/TokyoUIInfo-BSNbI4Gr.js +0 -1
  523. package/dist/assets/TokyoUILanguage-BcrymOo9.js +0 -1
  524. package/dist/assets/TokyoUILibraryExplore-DvvKpWd6.js +0 -1
  525. package/dist/assets/TokyoUILock-B22xkFQW.js +0 -1
  526. package/dist/assets/TokyoUIMessages-hZLnK87p.js +0 -1
  527. package/dist/assets/TokyoUIMinus-C6TctZRw.js +0 -1
  528. package/dist/assets/TokyoUINotebook-mwleX-o1.js +0 -1
  529. package/dist/assets/TokyoUINotesWithPad-CG0gLTYm.js +0 -1
  530. package/dist/assets/TokyoUIPhone-CFykqUer.js +0 -1
  531. package/dist/assets/TokyoUISettings-BbgnUEy1.js +0 -1
  532. package/dist/assets/TokyoUISparkle-DPOw7W2T.js +0 -1
  533. package/dist/assets/TokyoUIStarFilled-CF0iG37X.js +0 -1
  534. package/dist/assets/TokyoUITag-B1Xueyd7.js +0 -1
  535. package/dist/assets/TokyoUIUpload-CrasJ02A.js +0 -1
  536. package/dist/assets/TokyoUIUser-XhPCF9-5.js +0 -1
  537. package/dist/assets/Tooltip-BiqKWYpo.js +0 -9
  538. package/dist/assets/Tooltip.stories-DCB24NyS.js +0 -93
  539. package/dist/assets/Tooltip.tests.stories-B3iLlPPq.js +0 -65
  540. package/dist/assets/VisuallyHidden-Jfhj9R2Y.css +0 -1
  541. package/dist/assets/VisuallyHidden-fvo3PSUE.js +0 -1
  542. package/dist/assets/WithTooltip-IO6J4KBT-BUV9ELqr.js +0 -9
  543. package/dist/assets/align-self-BYi8giLn.js +0 -1
  544. package/dist/assets/align-self-C4ATemga.css +0 -1
  545. package/dist/assets/ar-D1Y8jKvF.js +0 -1
  546. package/dist/assets/axe-BG-rWtCi.js +0 -30
  547. package/dist/assets/breakpoints-BfMlrtxE.js +0 -1
  548. package/dist/assets/breakpoints-CBpJ5xgl.js +0 -31
  549. package/dist/assets/breakpoints-Cu9uEe0J.js +0 -32
  550. package/dist/assets/breakpoints-CuJuvIR9.js +0 -30
  551. package/dist/assets/client-BN2KdiJY.js +0 -1
  552. package/dist/assets/componentNames-hc9KR2nX.js +0 -1
  553. package/dist/assets/constants-5om8Ptru.js +0 -1
  554. package/dist/assets/constants-DYYVurUY.js +0 -1
  555. package/dist/assets/consts-KAYct7Gj.js +0 -1
  556. package/dist/assets/createRequiredContext-B3Arn9-D.js +0 -241
  557. package/dist/assets/createRequiredContext-Cjxy1dPq.css +0 -1
  558. package/dist/assets/cs-CamDwf-r.js +0 -1
  559. package/dist/assets/de-CWLDjtzP.js +0 -1
  560. package/dist/assets/emotion-unitless.esm-BZwEwAnk.js +0 -1
  561. package/dist/assets/en-DmA3N6t9.js +0 -1
  562. package/dist/assets/es-C4sqCVWL.js +0 -1
  563. package/dist/assets/filterAttributesPassedByRadixUIAtRuntime-B7QTVwVw.js +0 -1
  564. package/dist/assets/filterAttributesPassedByRadixUIAtRuntime-Bye2JkZ0.js +0 -1
  565. package/dist/assets/fonts-explorer-B5KcfnOG.css +0 -1
  566. package/dist/assets/fonts-explorer.stories-CeMUwBuQ.js +0 -130
  567. package/dist/assets/formatter-QJ4M4OGQ-B2Vljo6_.js +0 -1
  568. package/dist/assets/fr-BxUkVECU.js +0 -1
  569. package/dist/assets/getTokenVar-CVkrm5Qs.js +0 -1
  570. package/dist/assets/getTokenVar-DmUJH1GU.js +0 -11
  571. package/dist/assets/gradientBorders-Q_ip9Ojv.js +0 -45
  572. package/dist/assets/hk-CamDwf-r.js +0 -1
  573. package/dist/assets/hover-C8NhPbjk.js +0 -13
  574. package/dist/assets/hover-C9fsErpn.js +0 -16
  575. package/dist/assets/hover-D55mJaWK.js +0 -14
  576. package/dist/assets/id-BUwhaEpp.js +0 -1
  577. package/dist/assets/iframe-B_74HtSc.js +0 -1891
  578. package/dist/assets/iframe-DR4kltvM.css +0 -1
  579. package/dist/assets/index-BJaBvJhB.js +0 -22
  580. package/dist/assets/index-BW8FBNWq.js +0 -193
  581. package/dist/assets/index-CC6DAVyL.js +0 -1
  582. package/dist/assets/index-Cnv20V_M.js +0 -1
  583. package/dist/assets/index-DIqvfT2b.js +0 -12
  584. package/dist/assets/index-DWFFXgf1.js +0 -1
  585. package/dist/assets/index-W3BB_3go.js +0 -41
  586. package/dist/assets/intro-DOuARa_Y.js +0 -31
  587. package/dist/assets/it-kJJ1S0qv.js +0 -1
  588. package/dist/assets/ja-CThSHCIs.js +0 -1
  589. package/dist/assets/ko-B1qhOecF.js +0 -1
  590. package/dist/assets/layout-relative-B9CiYPwj.js +0 -1
  591. package/dist/assets/layout-relative-BWwbkKin.css +0 -1
  592. package/dist/assets/layout-relative-DOxkgOJk.css +0 -1
  593. package/dist/assets/layout-relative.module-1z75aSwo-Dcy7i8oK.js +0 -1
  594. package/dist/assets/layout-relative.module-BIZVul8q.js +0 -1
  595. package/dist/assets/matchers-DMFSMG2O-CAdg16Fl.js +0 -14
  596. package/dist/assets/mcp-D2eIYE7x.js +0 -32
  597. package/dist/assets/message-DJT5rp5J.js +0 -1
  598. package/dist/assets/migrating-from-less-CxT_5hNC.js +0 -36
  599. package/dist/assets/mixins-DZk1Zeoo.js +0 -7
  600. package/dist/assets/nl-CEfRou2e.js +0 -1
  601. package/dist/assets/options-jUub4JL1.js +0 -1
  602. package/dist/assets/pl-B4SjM4RJ.js +0 -1
  603. package/dist/assets/playground.stories-DqwdOX0P.js +0 -6
  604. package/dist/assets/preload-helper-Dp1pzeXC.js +0 -1
  605. package/dist/assets/pt-B_cv-Bbz.js +0 -1
  606. package/dist/assets/react-18-DoE4ZK8O.js +0 -1
  607. package/dist/assets/render-icon-DSbVIpCz.js +0 -9
  608. package/dist/assets/render-icon-MT6RlyNs.js +0 -9
  609. package/dist/assets/ro-Wp2i1-uz.js +0 -1
  610. package/dist/assets/ru-C9RPHSvh.js +0 -1
  611. package/dist/assets/shared-strings-ThL9KyH0.js +0 -1
  612. package/dist/assets/store-B0wM9Zg8.js +0 -9
  613. package/dist/assets/styled-components.browser.esm-BHxIJD2_.js +0 -2
  614. package/dist/assets/styled-components.browser.esm-rrOBirU4.js +0 -2
  615. package/dist/assets/sv-BV70iAZ6.js +0 -1
  616. package/dist/assets/syntaxhighlighter-IQDEPFLK-BakL6JIW.js +0 -6
  617. package/dist/assets/text-accent-BQ9POoE5.js +0 -1
  618. package/dist/assets/text-centered-BEaaxMgl.js +0 -1
  619. package/dist/assets/text-centered-CT0UilMD.css +0 -1
  620. package/dist/assets/text-centered-CYnBFi3a.js +0 -1
  621. package/dist/assets/text-centered-DxXu3Wfr.css +0 -1
  622. package/dist/assets/th-DQ6Pn590.js +0 -1
  623. package/dist/assets/tokens-BEyO2LY-.js +0 -15
  624. package/dist/assets/tokens-Cg01svK-.js +0 -15
  625. package/dist/assets/tokens-CmSwgWJ8.js +0 -16
  626. package/dist/assets/tokens-im-qJUCZ.js +0 -1
  627. package/dist/assets/tr-ByOPzs3p.js +0 -1
  628. package/dist/assets/tw-CamDwf-r.js +0 -1
  629. package/dist/assets/ua-rcge5Swp.js +0 -1
  630. package/dist/assets/useControllableState-BB4EHwEp.js +0 -1
  631. package/dist/assets/useHostname-CbpnzdHv.js +0 -1
  632. package/dist/assets/useMergeRefs-CFhXCqbA.js +0 -1
  633. package/dist/assets/useMergeRefs-Caz9hOck.js +0 -1
  634. package/dist/assets/useOpenInteractionType-D3sASQWj.js +0 -15
  635. package/dist/assets/usePortalElement-Cbyb850w.js +0 -19
  636. package/dist/assets/useStableCallback-D5P5kDx5.js +0 -1
  637. package/dist/assets/useToken-OSVftwxQ.js +0 -1
  638. package/dist/assets/welcome-QqBTVkpV.js +0 -23
  639. package/dist/assets/zeroheight-BXMq4jvo.js +0 -75
  640. package/dist/assets/zh-B9zAtuTc.js +0 -1
  641. package/dist/sb-addons/storybook-5/manager-bundle.js +0 -3
  642. package/vitest.config.mts +0 -30
@@ -0,0 +1,1613 @@
1
+ import{a as e,n as t}from"./chunk-BneVvdWh.js";import{t as n}from"./react-C7IZe2D1.js";import{t as r}from"./jsx-runtime-C2wGStra.js";import{n as i,t as a}from"./Icon-CfZyHxyH.js";import{n as ee,t as o}from"./Button-DnVrHohm.js";import{n as te,t as ne}from"./OnboardingTour-DGI3bTQy.js";import{n as re,t as ie}from"./Avatar-LEDcSb51.js";import{n as ae,t as oe}from"./IconButton-CUt4Aks_.js";import{n as se,t as ce}from"./CountryFlag-DMEPQuIc.js";import{n as le,t as ue}from"./Dialog-DCPUOQU4.js";import{n as de,t as fe}from"./Divider-BsdKe9ia.js";import{a as pe,c as s,i as c,l,n as me,o as he,r as u,s as d,t as f,u as ge}from"./DropdownMenu-BUteP_4e.js";import{n as _e,t as ve}from"./TokyoUIMessages-z4JOaU4E.js";import{n as ye,t as p}from"./TokyoUIEmojiFrowning-DEhH_o6k.js";import{i as be,n as xe,r as Se,t as Ce}from"./TokyoUISettings-D5pBmcYk.js";var m,h,g,_,v,y,we,b,Te,Ee,x,S,De,Oe,C,ke,w,Ae,je,Me,Ne,Pe,Fe,Ie,T,E,D,O,k,Le,A,j,M,N,P,F,I,L,R,z,Re,ze,Be,Ve,He,Ue,B,V,We,Ge,Ke,qe,Je,Ye,Xe,Ze,H,U,Qe,W,G,K,$e,q,J,Y,X,Z,et,Q,$,tt;t((()=>{m=e(n(),1),ge(),ee(),i(),be(),_e(),se(),re(),ye(),xe(),le(),de(),ae(),te(),h=r(),{fn:g,expect:_,userEvent:v,waitFor:y,within:we}=__STORYBOOK_MODULE_TEST__,b={onOpenChange:g(),items:{transferBalance:g(),addExtraHours:g(),currency:g(),language:g()}},Te={title:`Components/DropdownMenu`,component:f,subcomponents:{DropdownMenuItem:c,DropdownMenuGroup:u,DropdownSubmenu:l,DropdownMenuRadioGroup:pe,DropdownMenuRadioItem:he,DropdownMenuCheckboxItem:me,DropdownMenuSelect:d,DropdownMenuSelectOption:s},parameters:{preventIframeFromScrollingParent:!0,layout:`fullscreen`,docs:{story:{inline:!1,height:400,autoplay:!1}}},decorators:[(e,t)=>(0,h.jsx)(`div`,{style:{height:t.parameters.containerHeight||`100%`,padding:24,display:`flex`,justifyContent:`center`,alignItems:`center`},children:(0,h.jsx)(e,{})})],args:{onOpenChange:b.onOpenChange,trigger:(0,h.jsx)(o,{children:`Settings`}),children:(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(c,{label:`Transfer balance`,onClick:b.items.transferBalance}),(0,h.jsx)(c,{label:`Add extra hours`,onClick:b.items.addExtraHours})]})}},Ee={tags:[`!autodocs`,`!dev`],args:{defaultOpen:!0}},x=_.anything(),S={play:async({canvas:e,step:t,args:n})=>{await t(`Initially closed`,async()=>{_(e.queryByRole(`menu`)).not.toBeInTheDocument()}),await t(`Open dropdown`,async()=>{await v.click(e.getByRole(`button`,{name:`Settings`})),await y(()=>{_(e.queryByRole(`menu`)).toBeVisible()}),_(n.onOpenChange).toHaveBeenLastCalledWith(!0,x)}),await t(`Click outside to close the menu`,async()=>{await v.click(document.body),await y(()=>{_(e.queryByRole(`menu`)).not.toBeInTheDocument()}),_(n.onOpenChange).toHaveBeenLastCalledWith(!1,x)}),await t(`Open dropdown again`,async()=>{await v.click(e.getByRole(`button`,{name:`Settings`})),await y(()=>{_(e.queryByRole(`menu`)).toBeVisible()})}),await t(`Click on "Transfer balance"`,async()=>{await v.click(e.getByRole(`menuitem`,{name:`Transfer balance`})),_(b.items.transferBalance).toHaveBeenCalled(),await y(()=>{_(e.queryByRole(`menu`)).not.toBeInTheDocument()}),_(b.onOpenChange).toHaveBeenLastCalledWith(!1,x)})}},De={tags:[`!autodocs`],args:{defaultOpen:!0},play:async({canvas:e,step:t})=>{await t(`Initially open`,async()=>{await y(()=>{_(e.queryByRole(`menu`)).toBeVisible()})}),await t(`Click outside to close the menu`,async()=>{await v.click(document.body),await y(()=>{_(e.queryByRole(`menu`)).not.toBeInTheDocument()}),_(b.onOpenChange).toHaveBeenLastCalledWith(!1,x)})}},C={decorators:[(e,t)=>{let[n,r]=(0,m.useState)(!!t.args.open);Oe=r;let i=(e,n)=>{r(e),t.args.onOpenChange?.(e,n)};return(0,h.jsx)(e,{args:{...t.args,open:n,onOpenChange:i}})}],args:{open:!1},play:async({canvas:e,step:t,args:n})=>{await t(`Open dropdown`,async()=>{await v.click(e.getByRole(`button`,{name:`Settings`})),await y(()=>{_(e.queryByRole(`menu`)).toBeVisible()}),_(n.onOpenChange).toHaveBeenLastCalledWith(!0,x)}),await t(`Click outside to close the menu`,async()=>{await v.click(document.body),await y(()=>{_(e.queryByRole(`menu`)).not.toBeInTheDocument()}),_(n.onOpenChange).toHaveBeenLastCalledWith(!1,x)}),await t(`Open dropdown via open prop`,async()=>{b.onOpenChange.mockClear(),Oe(!0),await y(()=>{_(e.queryByRole(`menu`)).toBeVisible()}),_(n.onOpenChange).not.toHaveBeenCalled()}),await t(`Close dropdown via open prop`,async()=>{b.onOpenChange.mockClear(),Oe(!1),await y(()=>{_(e.queryByRole(`menu`)).not.toBeInTheDocument()}),_(n.onOpenChange).not.toHaveBeenCalled()})}},ke={...C,tags:[`!autodocs`],args:{...C.args,open:!0},play:async({canvas:e,step:t,args:n})=>{await t(`Initially open`,async()=>{await y(()=>{_(e.queryByRole(`menu`)).toBeVisible()})}),await t(`Click outside to close the menu`,async()=>{await v.click(document.body),await y(()=>{_(e.queryByRole(`menu`)).not.toBeInTheDocument()}),_(n.onOpenChange).toHaveBeenLastCalledWith(!1,x)})}},w={parameters:{containerHeight:`500px`},args:{side:`top`,align:`start`,defaultOpen:!0}},Ae={parameters:{containerHeight:`500px`},tags:[`!autodocs`],args:{side:`inline-end`,defaultOpen:!0}},je={parameters:{containerHeight:`500px`},tags:[`!autodocs`],args:{side:`inline-start`,defaultOpen:!0}},Me={parameters:{containerHeight:`500px`},tags:[`!autodocs`],args:{side:`left`,defaultOpen:!0}},Ne={parameters:{containerHeight:`500px`},tags:[`!autodocs`],args:{side:`right`,defaultOpen:!0}},Pe={parameters:{containerHeight:`500px`},tags:[`!autodocs`],args:{side:`top`,defaultOpen:!0}},Fe={tags:[`!autodocs`],args:{align:`start`,defaultOpen:!0}},Ie={tags:[`!autodocs`],args:{align:`end`,defaultOpen:!0}},T={args:{children:(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(c,{label:`Transfer balance`,onClick:b.items.transferBalance}),(0,h.jsx)(c,{label:`Add extra hours`,onClick:b.items.addExtraHours,disabled:!0})]})},play:async({canvas:e,step:t})=>{await t(`Open dropdown`,async()=>{await v.click(e.getByRole(`button`,{name:`Settings`})),await y(()=>{_(e.queryByRole(`menu`)).toBeVisible()})}),await t(`Click on "Add extra hours"`,async()=>{b.onOpenChange.mockClear();let t=e.getByRole(`menuitem`,{name:`Add extra hours`});_(t).toHaveAttribute(`aria-disabled`,`true`),await v.click(t),_(b.items.addExtraHours).not.toHaveBeenCalled(),_(b.onOpenChange).not.toHaveBeenCalled(),_(e.queryByRole(`menu`)).toBeVisible()})}},E={args:{trigger:(0,h.jsx)(o,{children:`Language`}),children:(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(c,{label:`Español`,description:`Spanish`}),(0,h.jsx)(c,{label:`Українська`,description:`Ukrainian`})]})},play:async({canvas:e,step:t})=>{await t(`Open dropdown`,async()=>{await v.click(e.getByRole(`button`,{name:`Language`})),await y(()=>{_(e.queryByRole(`menu`)).toBeVisible()})}),await t(`Verify items a11y names and descriptions`,async()=>{let t=e.getByRole(`menuitem`,{name:`Español`});_(t).toHaveAccessibleName(`Español`),_(t).toHaveAccessibleDescription(`Spanish`);let n=e.getByRole(`menuitem`,{name:`Українська`});_(n).toHaveAccessibleName(`Українська`),_(n).toHaveAccessibleDescription(`Ukrainian`)})}},D={args:{defaultOpen:!0,children:(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)(u,{label:`Region`,children:[(0,h.jsx)(c,{label:`Currency`}),(0,h.jsx)(c,{label:`Language`}),(0,h.jsx)(c,{label:`Time zone`})]}),(0,h.jsxs)(u,{label:`Subscription`,children:[(0,h.jsx)(c,{label:`Transfer balance`}),(0,h.jsx)(c,{label:`Add extra hours`})]})]})}},O={args:{defaultOpen:!0,children:(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(c,{label:`User profile`}),(0,h.jsx)(c,{label:`Payments & subscriptions`}),(0,h.jsx)(fe,{}),(0,h.jsx)(c,{label:`Logout`})]})}},k={parameters:{docs:{story:{height:600}}},args:{defaultOpen:!0,children:(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)(u,{label:`Icons`,children:[(0,h.jsx)(c,{leadingElement:(0,h.jsx)(a,{svg:Se,size:`24`}),label:`Reschedule`}),(0,h.jsx)(c,{leadingElement:(0,h.jsx)(a,{svg:ve,size:`24`}),label:`Message tutor`})]}),(0,h.jsxs)(u,{label:`Flags`,children:[(0,h.jsx)(c,{leadingElement:(0,h.jsx)(ce,{code:`es`,alt:``,size:`medium`}),label:`Spain`}),(0,h.jsx)(c,{leadingElement:(0,h.jsx)(ce,{code:`ua`,alt:``,size:`medium`}),label:`Ukraine`})]}),(0,h.jsxs)(u,{label:`Avatars`,children:[(0,h.jsx)(c,{leadingElement:(0,h.jsx)(ie,{size:`24`}),label:`Kobe B.`}),(0,h.jsx)(c,{leadingElement:(0,h.jsx)(ie,{size:`24`}),label:`Jenny R.`})]})]})}},Le=(0,m.forwardRef)(function({to:e,...t},n){return(0,h.jsx)(`a`,{href:e,...t,ref:n})}),Le.displayName=`Link`,A={findATutor:g(e=>{e.preventDefault()}),becomeATutor:g(e=>{e.preventDefault()}),myLessons:g(e=>{e.preventDefault()}),referAFriend:g(e=>{e.preventDefault()})},j={args:{trigger:(0,h.jsx)(o,{children:`Links`}),children:(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(c,{label:`Find a Tutor`,onClick:A.findATutor,as:(0,h.jsx)(`a`,{href:`/en/online/english-tutors`})}),(0,h.jsx)(c,{label:`Become a Tutor`,onClick:A.becomeATutor,as:(0,h.jsx)(`a`,{href:`/en/teach`}),disabled:!0}),(0,h.jsx)(c,{label:`My Lessons`,onClick:A.myLessons,as:(0,h.jsx)(Le,{to:`/en/lessons`})}),(0,h.jsx)(c,{label:`Refer a Friend`,onClick:A.referAFriend,as:(0,h.jsx)(Le,{to:`/en/referral`}),disabled:!0})]})},play:async({canvas:e,step:t})=>{await t(`Open dropdown`,async()=>{await v.click(e.getByRole(`button`,{name:`Links`})),await y(()=>{_(e.queryByRole(`menu`)).toBeVisible()})}),await t(`Assert links are rendered correctly`,async()=>{let t=e.getByRole(`menuitem`,{name:`Find a Tutor`});_(t.tagName).toBe(`A`),_(t).toHaveAttribute(`href`,`/en/online/english-tutors`);let n=e.getByRole(`menuitem`,{name:`Become a Tutor`});_(n.tagName).toBe(`A`),_(n).toHaveAttribute(`href`,`/en/teach`),_(n).toHaveAttribute(`aria-disabled`,`true`);let r=e.getByRole(`menuitem`,{name:`My Lessons`});_(r.tagName).toBe(`A`),_(r).toHaveAttribute(`href`,`/en/lessons`);let i=e.getByRole(`menuitem`,{name:`Refer a Friend`});_(i.tagName).toBe(`A`),_(i).toHaveAttribute(`href`,`/en/referral`),_(i).toHaveAttribute(`aria-disabled`,`true`)}),await t(`Click on "Find a Tutor"`,async()=>{let t=e.getByRole(`menuitem`,{name:`Find a Tutor`});await v.click(t),_(A.findATutor).toHaveBeenCalled()}),await t(`Open dropdown`,async()=>{await v.click(e.getByRole(`button`,{name:`Links`})),await y(()=>{_(e.queryByRole(`menu`)).toBeVisible()})}),await t(`Click on "Become a Tutor"`,async()=>{let t=e.getByRole(`menuitem`,{name:`Become a Tutor`});await y(()=>v.click(t)),_(A.becomeATutor).not.toHaveBeenCalled(),await y(()=>{_(e.queryByRole(`menu`)).toBeVisible()})}),await t(`Click on "My Lessons"`,async()=>{let t=e.getByRole(`menuitem`,{name:`My Lessons`});await v.click(t),_(A.myLessons).toHaveBeenCalled(),await y(()=>{_(e.queryByRole(`menu`)).not.toBeInTheDocument()})}),await t(`Open dropdown`,async()=>{await v.click(e.getByRole(`button`,{name:`Links`})),await y(()=>{_(e.queryByRole(`menu`)).toBeVisible()})}),await t(`Click on "Refer a Friend"`,async()=>{let t=e.getByRole(`menuitem`,{name:`Refer a Friend`});await v.click(t),_(A.referAFriend).not.toHaveBeenCalled()})}},M={dayOfTheWeek:g(),timeOfTheDay:g(),frequency:g()},N={args:{children:(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(u,{label:`Day of the week`,children:(0,h.jsx)(pe,{defaultValue:`mon`,onValueChange:M.dayOfTheWeek,items:[{label:`Monday`,value:`mon`},{label:`Tuesday`,value:`tue`},{label:`Wednesday`,value:`wed`},{label:`Thursday`,value:`thu`},{label:`Friday`,value:`fri`},{label:`Saturday`,value:`sat`,disabled:!0},{label:`Sunday`,value:`sun`,disabled:!0}]})}),(0,h.jsx)(u,{label:`Time of the day`,children:(0,h.jsxs)(pe,{onValueChange:M.timeOfTheDay,children:[(0,h.jsx)(he,{label:`Morning`,value:`morning`}),(0,h.jsx)(he,{label:`Afternoon`,value:`afternoon`})]})}),(0,h.jsx)(u,{label:`Frequency`,children:(0,h.jsxs)(pe,{value:`once`,onValueChange:M.frequency,disabled:!0,children:[(0,h.jsx)(he,{label:`Once`,value:`once`}),(0,h.jsx)(he,{label:`Weekly`,value:`weekly`})]})})]})},play:async({canvas:e,step:t})=>{await t(`Open dropdown`,async()=>{await v.click(e.getByRole(`button`,{name:`Settings`})),await y(()=>{_(e.queryByRole(`menu`)).toBeVisible()})});let n=e.getByRole(`menuitemradio`,{name:`Monday`}),r=e.getByRole(`menuitemradio`,{name:`Tuesday`}),i=e.getByRole(`menuitemradio`,{name:`Saturday`});await t(`Day of the week: default value is selected`,async()=>{_(n).toHaveAttribute(`aria-checked`,`true`)}),await t(`Click on "Tuesday"`,async()=>{await v.click(r),_(M.dayOfTheWeek).toHaveBeenCalledWith(`tue`),await y(()=>{_(n).toHaveAttribute(`aria-checked`,`false`),_(r).toHaveAttribute(`aria-checked`,`true`)})}),await t(`Click on "Saturday"`,async()=>{M.dayOfTheWeek.mockClear(),await v.click(i),_(M.dayOfTheWeek).not.toHaveBeenCalled(),await y(()=>{_(r).toHaveAttribute(`aria-checked`,`true`)})});let a=e.getByRole(`menuitemradio`,{name:`Morning`}),ee=e.getByRole(`menuitemradio`,{name:`Afternoon`});await t(`Time of the day: none is selected`,async()=>{_(a).toHaveAttribute(`aria-checked`,`false`),_(ee).toHaveAttribute(`aria-checked`,`false`)}),await t(`Click on "Morning"`,async()=>{await v.click(a),_(M.timeOfTheDay).toHaveBeenCalledWith(`morning`),await y(()=>{_(a).toHaveAttribute(`aria-checked`,`true`)})});let o=e.getByRole(`menuitemradio`,{name:`Once`}),te=e.getByRole(`menuitemradio`,{name:`Weekly`});await t(`Frequency: everything is disabled, once is selected`,async()=>{_(o).toHaveAttribute(`aria-disabled`,`true`),_(te).toHaveAttribute(`aria-disabled`,`true`),_(o).toHaveAttribute(`aria-checked`,`true`),_(te).toHaveAttribute(`aria-checked`,`false`)}),await t(`Click on "Weekly"`,async()=>{await v.click(te),_(M.frequency).not.toHaveBeenCalled(),await y(()=>{_(o).toHaveAttribute(`aria-checked`,`true`)})})}},P={email:g(),sms:g(),push:g(),alerts:g()},F={args:{children:(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(me,{label:`Email notifications`,onCheckedChange:P.email,defaultChecked:!0}),(0,h.jsx)(me,{label:`SMS notifications`,onCheckedChange:P.sms}),(0,h.jsx)(me,{label:`Push notifications`,onCheckedChange:P.push,disabled:!0}),(0,h.jsx)(me,{label:`System alerts (required)`,onCheckedChange:P.alerts,disabled:!0,checked:!0})]})},play:async({canvas:e,step:t})=>{await t(`Open dropdown`,async()=>{await v.click(e.getByRole(`button`,{name:`Settings`})),await y(()=>{_(e.queryByRole(`menu`)).toBeVisible()})});let n=e.getByRole(`menuitemcheckbox`,{name:`Email notifications`}),r=e.getByRole(`menuitemcheckbox`,{name:`SMS notifications`}),i=e.getByRole(`menuitemcheckbox`,{name:`Push notifications`}),a=e.getByRole(`menuitemcheckbox`,{name:`System alerts (required)`});await t(`Email notifications is checked by default`,async()=>{_(n).toHaveAttribute(`aria-checked`,`true`)}),await t(`Uncheck "Email notifications"`,async()=>{await v.click(n),_(P.email).toHaveBeenCalledWith(!1,x),await y(()=>{_(n).toHaveAttribute(`aria-checked`,`false`)})}),await t(`"SMS notifications" is not checked`,async()=>{_(r).toHaveAttribute(`aria-checked`,`false`)}),await t(`Check "SMS notifications"`,async()=>{await v.click(r),_(P.sms).toHaveBeenCalledWith(!0,x),await y(()=>{_(r).toHaveAttribute(`aria-checked`,`true`)})}),await t(`"Push notifications" is disabled and not checked`,async()=>{_(i).toHaveAttribute(`aria-disabled`,`true`),_(i).toHaveAttribute(`aria-checked`,`false`)}),await t(`Click on "Push notifications"`,async()=>{await v.click(i),_(P.push).not.toHaveBeenCalled(),await y(()=>{_(i).toHaveAttribute(`aria-checked`,`false`)})}),await t(`"System alerts (required)" is disabled and checked`,async()=>{_(a).toHaveAttribute(`aria-disabled`,`true`),_(a).toHaveAttribute(`aria-checked`,`true`)}),await t(`Click on "System alerts (required)"`,async()=>{await v.click(a),_(P.alerts).not.toHaveBeenCalled(),await y(()=>{_(a).toHaveAttribute(`aria-checked`,`true`)})})}},I={dayOfTheWeek:g(),timeOfTheDay:g(),frequency:g()},L=e=>{let[t,n]=(0,m.useState)(`mon`),[r,i]=(0,m.useState)(),a=e=>{n(e),I.dayOfTheWeek(e)},ee=e=>{i(e),I.timeOfTheDay(e)};return(0,h.jsxs)(f,{...e,children:[(0,h.jsx)(d,{label:`Day of the week`,value:t,onValueChange:a,items:[{label:`Monday`,value:`mon`},{label:`Tuesday`,value:`tue`},{label:`Wednesday`,value:`wed`},{label:`Thursday`,value:`thu`},{label:`Friday`,value:`fri`},{label:`Saturday`,value:`sat`,disabled:!0},{label:`Sunday`,value:`sun`,disabled:!0}]}),(0,h.jsxs)(d,{label:`Time of the day`,defaultValue:r,onValueChange:ee,children:[(0,h.jsx)(s,{value:`morning`,label:`Morning`}),(0,h.jsx)(s,{value:`afternoon`,label:`Afternoon`})]}),(0,h.jsxs)(d,{label:`Frequency`,onValueChange:I.frequency,disabled:!0,children:[(0,h.jsx)(s,{label:`Once`,value:`once`}),(0,h.jsx)(s,{label:`Weekly`,value:`weekly`})]})]})},L.play=async({canvas:e,step:t})=>{await t(`Open dropdown`,async()=>{await v.click(e.getByRole(`button`,{name:`Settings`})),await y(()=>{_(e.queryByRole(`menu`)).toBeVisible()})});let n=e.getByRole(`menuitem`,{name:/^Day of the week/});await t(`Day of the week: default value is selected`,async()=>{_(n).toHaveAccessibleName(/Selected: Monday$/)}),await t(`Open day of the week submenu`,async()=>{await v.hover(n),await y(()=>{_(e.queryByRole(`menu`,{name:/^Day of the week/})).toBeVisible()})}),await t(`Click on "Tuesday"`,async()=>{await v.click(e.getByRole(`menuitemradio`,{name:`Tuesday`})),_(I.dayOfTheWeek).toHaveBeenCalledWith(`tue`),await y(()=>{_(e.queryByRole(`menu`,{name:/^Day of the week/,hidden:!0})).not.toBeVisible(),_(n).toHaveAccessibleName(/Selected: Tuesday$/)})});let r=e.getByRole(`menuitem`,{name:/^Time of the day/});await t(`Time of the day: nothing is selected`,async()=>{_(r).toHaveAccessibleName(`Time of the day`)}),await t(`Open time of the day submenu`,async()=>{r.focus(),await v.keyboard(` `),await y(()=>{_(e.queryByRole(`menu`,{name:/^Time of the day/})).toBeVisible()})}),await t(`Click on "Morning"`,async()=>{await v.click(e.getByRole(`menuitemradio`,{name:`Morning`})),_(I.timeOfTheDay).toHaveBeenCalledWith(`morning`),await y(()=>{_(e.queryByRole(`menu`,{name:/^Time of the day/,hidden:!0})).not.toBeVisible(),_(r).toHaveAccessibleName(/Selected: Morning$/)})}),await t(`Open dropdown`,async()=>{await v.click(e.getByRole(`button`,{name:`Settings`})),await y(()=>{_(e.queryByRole(`menu`)).toBeVisible()})}),await t(`Frequency is disabled`,async()=>{let t=e.getByRole(`menuitem`,{name:`Frequency`});_(t).toHaveAttribute(`aria-disabled`,`true`),await v.click(t,{pointerEventsCheck:0}),_(I.frequency).not.toHaveBeenCalled(),await y(()=>{_(e.queryByRole(`menu`,{name:`Frequency`,hidden:!0})).not.toBeVisible()})})},R={render:function({align:e,side:t,...n}){return(0,h.jsx)(f,{...n,defaultOpen:!0,children:(0,h.jsxs)(d,{label:`Time of the day`,side:t,align:e,defaultOpen:!0,children:[(0,h.jsx)(s,{value:`morning`,label:`Morning`}),(0,h.jsx)(s,{value:`afternoon`,label:`Afternoon`})]})})},parameters:{containerHeight:`500px`},args:{side:`top`,align:`start`}},z={render:R.render,parameters:{containerHeight:`500px`},tags:[`!autodocs`],args:{side:`inline-end`}},Re={render:R.render,parameters:{containerHeight:`500px`},tags:[`!autodocs`],args:{side:`inline-start`,defaultOpen:!0}},ze={render:R.render,parameters:{containerHeight:`500px`},tags:[`!autodocs`],args:{side:`left`,defaultOpen:!0}},Be={render:R.render,parameters:{containerHeight:`500px`},tags:[`!autodocs`],args:{side:`right`,defaultOpen:!0}},Ve={render:R.render,parameters:{containerHeight:`500px`},tags:[`!autodocs`],args:{side:`top`,defaultOpen:!0}},He={render:R.render,tags:[`!autodocs`],args:{align:`start`,defaultOpen:!0}},Ue={render:R.render,tags:[`!autodocs`],args:{align:`end`,defaultOpen:!0}},B={args:{children:(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)(l,{label:`Region`,children:[(0,h.jsx)(c,{label:`Currency`}),(0,h.jsx)(c,{label:`Language`}),(0,h.jsx)(c,{label:`Time zone`})]}),(0,h.jsxs)(l,{label:`Subscription`,children:[(0,h.jsx)(c,{label:`Transfer balance`}),(0,h.jsx)(c,{label:`Add extra hours`})]}),(0,h.jsxs)(l,{label:`Integrations`,disabled:!0,children:[(0,h.jsx)(c,{label:`Connect calendar`}),(0,h.jsx)(c,{label:`Slack integration`}),(0,h.jsx)(c,{label:`Email sync`})]})]})},play:async({canvas:e,step:t})=>{await t(`Open dropdown`,async()=>{await v.click(e.getByRole(`button`,{name:`Settings`})),await y(()=>{_(e.queryByRole(`menu`)).toBeVisible()})});let n=e.getByRole(`menuitem`,{name:`Region`});await t(`Region submenu opens on hover`,async()=>{await v.hover(n),await y(()=>{_(e.queryByRole(`menu`,{name:`Region`})).toBeVisible()})}),await t(`Region submenu closes on hover out`,async()=>{await v.unhover(n),await y(()=>{_(e.queryByRole(`menu`,{name:`Region`})).not.toBeInTheDocument()})}),await t(`Integrations submenu is disabled`,async()=>{let t=e.getByRole(`menuitem`,{name:`Integrations`});_(t).toHaveAttribute(`aria-disabled`,`true`),await v.click(t),await y(()=>{_(e.queryByRole(`menu`,{name:`Integrations`})).not.toBeInTheDocument()})})}},V={render:function({align:e,side:t,...n}){return(0,h.jsx)(f,{...n,defaultOpen:!0,children:(0,h.jsxs)(l,{label:`Region`,side:t,align:e,defaultOpen:!0,children:[(0,h.jsx)(c,{label:`Currency`}),(0,h.jsx)(c,{label:`Language`}),(0,h.jsx)(c,{label:`Time zone`})]})})},parameters:{containerHeight:`500px`},args:{side:`top`,align:`start`}},We={render:V.render,parameters:{containerHeight:`500px`},tags:[`!autodocs`],args:{side:`inline-end`}},Ge={render:V.render,parameters:{containerHeight:`500px`},tags:[`!autodocs`],args:{side:`inline-start`,defaultOpen:!0}},Ke={render:V.render,parameters:{containerHeight:`500px`},tags:[`!autodocs`],args:{side:`left`,defaultOpen:!0}},qe={render:V.render,parameters:{containerHeight:`500px`},tags:[`!autodocs`],args:{side:`right`,defaultOpen:!0}},Je={render:V.render,parameters:{containerHeight:`500px`},tags:[`!autodocs`],args:{side:`top`,defaultOpen:!0}},Ye={render:V.render,tags:[`!autodocs`],args:{align:`start`,defaultOpen:!0}},Xe={render:V.render,tags:[`!autodocs`],args:{align:`end`,defaultOpen:!0}},{Provider:Ze,Step:H}=ne(),Ze.displayName=`Tour.Provider`,H.displayName=`Tour.Step`,U={parameters:{docs:{source:{type:`dynamic`}}},decorators:[e=>{let[t,n]=(0,m.useState)(0);return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(e,{},t),(0,h.jsx)(`div`,{style:{position:`fixed`,left:0,bottom:0,margin:8},children:(0,h.jsx)(o,{variant:`ghost`,size:`small`,onClick:()=>n(t+1),children:`Reset story`})})]})}],render:function(){let[e,t]=(0,m.useState)(!1),[n,r]=(0,m.useState)(!1),[i,a]=(0,m.useState)(!1),ee=e=>{switch(e){case 1:t(!0);return;case 3:r(!0);return;case 5:a(!0);return}},o=()=>{t(!1),r(!1),a(!1)};return(0,h.jsx)(Ze,{totalSteps:6,onStepChange:ee,onComplete:o,onClose:o,children:(0,h.jsx)(H,{step:0,title:`New settings menu`,text:`All settings are now in one place.`,children:(0,h.jsxs)(f,{open:e,onOpenChange:t,trigger:(0,h.jsx)(oe,{svg:Ce,variant:`ghost`,assistiveText:`Settings`}),children:[(0,h.jsx)(H,{step:1,title:`Transfer balance`,text:`You can now transfer your balance to another tutor.`,side:`right`,children:(0,h.jsx)(c,{label:`Transfer balance`})}),(0,h.jsx)(c,{label:`Add extra hours`}),(0,h.jsx)(H,{step:2,title:`Region`,text:`Region settings are grouped together.`,side:`top`,children:(0,h.jsxs)(l,{label:`Region`,keepMounted:!0,open:n,onOpenChange:r,children:[(0,h.jsx)(c,{label:`Language`}),(0,h.jsx)(H,{step:3,title:`Time zone`,text:`You can now select your time zone.`,side:`right`,children:(0,h.jsx)(c,{label:`Time zone`})})]})}),(0,h.jsx)(H,{step:4,title:`Currency`,text:`Currency settings moved here.`,side:`right`,children:(0,h.jsxs)(d,{open:i,onOpenChange:a,defaultValue:`USD`,label:`Currency`,children:[(0,h.jsx)(s,{value:`USD`,label:`US Dollar`}),(0,h.jsx)(s,{value:`EUR`,label:`Euro`}),(0,h.jsx)(H,{step:5,title:`New currency!`,text:`Pay and receive payments in british pounds.`,children:(0,h.jsx)(s,{value:`GBP`,label:`British Pound`})})]})})]})})})},play:async({canvas:e,step:t})=>{await t(`Tour tooltip should be visible`,async()=>{await y(()=>{_(e.getByRole(`dialog`,{name:`New settings menu`})).toBeVisible()})}),await t(`Click Next to advance to second step`,async()=>{await v.click(e.getByRole(`button`,{name:`Next`})),await y(()=>{_(e.getByRole(`dialog`,{name:`Transfer balance`})).toBeVisible(),_(e.getByRole(`menu`)).toBeVisible()})}),await t(`Click Next to advance to third step`,async()=>{let t=we(e.getByRole(`dialog`,{name:`Transfer balance`}));await v.click(t.getByRole(`button`,{name:`Next`})),await y(()=>{_(e.getByRole(`dialog`,{name:`Region`})).toBeVisible()})}),await t(`Click Next to advance to fourth step`,async()=>{let t=we(e.getByRole(`dialog`,{name:`Region`}));await v.click(t.getByRole(`button`,{name:`Next`})),await y(()=>{_(e.getByRole(`dialog`,{name:`Time zone`})).toBeVisible(),_(e.getByRole(`menu`,{name:`Region`})).toBeVisible()})}),await t(`Click Next to advance to fifth step`,async()=>{let t=we(e.getByRole(`dialog`,{name:`Time zone`}));await v.click(t.getByRole(`button`,{name:`Next`})),await y(()=>{_(e.getByRole(`dialog`,{name:`Currency`})).toBeVisible()})}),await t(`Click Next to advance to the last step`,async()=>{let t=we(e.getByRole(`dialog`,{name:`Currency`}));await v.click(t.getByRole(`button`,{name:`Next`})),await y(()=>{_(e.getByRole(`dialog`,{name:`New currency!`})).toBeVisible(),_(e.getByRole(`menu`,{name:/Currency/})).toBeVisible()})}),await v.click(e.getByRole(`button`,{name:`Reset story`}))}},Qe=e=>{if(!e)return!1;let{top:t,left:n,bottom:r,right:i}=e.getBoundingClientRect();return!(t>=window.innerHeight||r<=0||n>=window.innerWidth||i<=0)},W={args:{keepMounted:!0,children:(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(c,{label:`Transfer balance`}),(0,h.jsx)(c,{label:`Add extra hours`}),(0,h.jsxs)(l,{label:`Region`,keepMounted:!0,children:[(0,h.jsx)(c,{label:`Currency`}),(0,h.jsx)(c,{label:`Language`}),(0,h.jsx)(c,{label:`Time zone`})]})]})},play:async({canvas:e,step:t})=>{let n=await e.findByRole(`menu`,{name:`Settings`,hidden:!0}),r=await e.findByRole(`menu`,{name:`Region`,hidden:!0});await t(`Menus are mounted, but not visible`,async()=>{_(n).toBeInTheDocument(),_(n).not.toBeVisible(),_(r).toBeInTheDocument(),_(r).not.toBeVisible()}),await t(`Open the menu`,async()=>{await v.click(e.getByRole(`button`,{name:`Settings`})),await y(()=>{_(n).toBeVisible()})}),await t(`Submenu is visible`,async()=>{await v.click(e.getByRole(`menuitem`,{name:`Region`})),await y(()=>{_(r).toBeVisible()})}),await t(`Close the submenu.`,async()=>{await v.keyboard(`{Escape}`),await y(()=>{_(r).not.toBeVisible()}),_(r).toBeInTheDocument()}),await t(`Close the menu.`,async()=>{await v.keyboard(`{Escape}`),await y(()=>{_(n).not.toBeVisible()}),_(n).toBeInTheDocument()})}},G={args:B.args,globals:{viewport:{value:`narrow-l`,isRotated:!1}},parameters:{layout:`centered`},play:async({canvas:e,step:t})=>{await t(`Open dropdown`,async()=>{await v.click(e.getByRole(`button`,{name:`Settings`})),await y(()=>{_(e.queryByRole(`menu`)).toBeVisible()})}),await t(`Click on "Region"`,async()=>{await v.click(e.getByRole(`menuitem`,{name:`Region`})),await y(async()=>{_(Qe(e.queryByRole(`menu`,{name:`Settings`})),`Main menu should be hidden`).toBe(!1),_(Qe(e.queryByRole(`menu`,{name:`Region`})),`Submenu should be visible`).toBe(!0)})}),await t(`Tap away to return to main menu`,async()=>{let t=e.getByRole(`menu`,{name:`Region`}).closest(`[data-base-ui-portal]`).querySelector(`[data-backdrop]`);await v.click(t),await y(async()=>{_(Qe(e.queryByRole(`menu`,{name:`Region`})),`Submenu should be hidden`).toBe(!1),_(Qe(e.queryByRole(`menu`,{name:`Settings`})),`Main menu should be visible`).toBe(!0)})}),await t(`Tap away to close menu`,async()=>{await v.click(document.querySelector(`[data-backdrop]`)),await y(async()=>{_(e.queryByRole(`menu`)).not.toBeInTheDocument()})})}},K={args:{children:(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(c,{label:`Transfer balance`,onClick:b.items.transferBalance}),(0,h.jsx)(c,{label:`Add extra hours`,onClick:b.items.addExtraHours,disabled:!0}),(0,h.jsxs)(l,{label:`Region`,children:[(0,h.jsx)(c,{label:`Currency`,onClick:b.items.currency}),(0,h.jsx)(c,{label:`Language`,onClick:b.items.language}),(0,h.jsx)(c,{label:`Time zone`})]})]})},play:async({canvas:e,step:t})=>{let n=e.getByRole(`button`,{name:`Settings`});await t(`Focus on the trigger element`,async()=>{n.focus()}),await t(`Open the menu via Enter key. First item should be focused`,async()=>{await v.keyboard(`{Enter}`),await y(()=>{_(e.queryByRole(`menu`)).toBeVisible(),_(e.getByRole(`menuitem`,{name:`Transfer balance`})).toHaveFocus()})}),await t(`Close the menu via Escape key. Trigger should be focused`,async()=>{await v.keyboard(`{Escape}`),await y(()=>{_(e.queryByRole(`menu`)).not.toBeInTheDocument(),_(n).toHaveFocus()})}),await t(`Open the menu via Space key. First item should be focused`,async()=>{await v.keyboard(` `),await y(()=>{_(e.queryByRole(`menu`)).toBeVisible(),_(e.getByRole(`menuitem`,{name:`Transfer balance`})).toHaveFocus()})}),await t(`Select the first item via Enter key. Menu should be closed and trigger should be focused`,async()=>{await v.keyboard(`{Enter}`),_(b.items.transferBalance).toHaveBeenCalled(),await y(()=>{_(e.queryByRole(`menu`)).not.toBeInTheDocument(),_(n).toHaveFocus()})}),await t(`Open the menu via Enter key. First item should be focused`,async()=>{await v.keyboard(`{Enter}`),await y(()=>{_(e.queryByRole(`menu`)).toBeVisible(),_(e.getByRole(`menuitem`,{name:`Transfer balance`})).toHaveFocus()})}),await t(`Navigate through the menu using Arrow keys`,async()=>{await v.keyboard(`{ArrowDown}`),await y(()=>{_(e.getByRole(`menuitem`,{name:`Add extra hours`})).toHaveFocus()}),await v.keyboard(`{ArrowDown}`),await y(()=>{_(e.getByRole(`menuitem`,{name:`Region`})).toHaveFocus()}),await v.keyboard(`{ArrowDown}`),await y(()=>{_(e.getByRole(`menuitem`,{name:`Transfer balance`})).toHaveFocus()}),await v.keyboard(`{ArrowUp}`),await v.keyboard(`{ArrowUp}`),await y(()=>{_(e.getByRole(`menuitem`,{name:`Add extra hours`})).toHaveFocus()})}),await t(`Enter key does nothing for disabled item`,async()=>{await v.keyboard(`{Enter}`),_(b.items.addExtraHours).not.toHaveBeenCalled()}),await t(`Space key does nothing for disabled item`,async()=>{await v.keyboard(` `),_(b.items.addExtraHours).not.toHaveBeenCalled()}),await t(`Navigate to submenu trigger using Arrow down key`,async()=>{await v.keyboard(`{ArrowDown}`),await y(()=>{_(e.getByRole(`menuitem`,{name:`Region`})).toHaveFocus()})}),await t(`Open the submenu via Enter key. First item should be focused`,async()=>{await v.keyboard(`{Enter}`),await y(()=>{_(e.getByRole(`menuitem`,{name:`Currency`})).toHaveFocus()})}),await t(`Navigate back to main menu using Arrow left key. Submenu trigger should be focused`,async()=>{await v.keyboard(`{ArrowLeft}`),await y(()=>{_(e.getByRole(`menuitem`,{name:`Region`})).toHaveFocus()})}),await t(`Open submenu using Arrow right key. First item should be focused`,async()=>{await v.keyboard(`{ArrowRight}`),await y(()=>{_(e.getByRole(`menuitem`,{name:`Currency`})).toHaveFocus()})}),await t(`Navigate back to main menu using Escape key. Submenu trigger should be focused`,async()=>{await v.keyboard(`{Escape}`),await y(()=>{_(e.getByRole(`menuitem`,{name:`Region`})).toHaveFocus()})}),await t(`Open submenu using Enter key. First item should be focused`,async()=>{await v.keyboard(`{Enter}`),await y(()=>{_(e.getByRole(`menuitem`,{name:`Currency`})).toHaveFocus()})}),await t(`Close the menu via Tab key. Trigger should be focused`,async()=>{await v.keyboard(`{Tab}`),await y(()=>{_(e.queryByRole(`menu`)).not.toBeInTheDocument(),_(n).toHaveFocus()})})}},$e={...K,globals:G.globals,parameters:G.parameters,tags:[`!autodocs`]},q={args:{defaultOpen:!0,children:(0,h.jsx)(h.Fragment,{children:Array.from({length:100}).map((e,t)=>(0,h.jsx)(c,{label:`Item ${t+1}`},t))})}},J=Array.from({length:5}).map(()=>`I won't use long labels for menu items.`).join(` `),Y={args:{defaultOpen:!0,children:(0,h.jsxs)(u,{label:J,children:[(0,h.jsx)(c,{leadingElement:(0,h.jsx)(a,{size:`24`,svg:p}),label:J,description:J}),(0,h.jsx)(l,{leadingElement:(0,h.jsx)(a,{size:`24`,svg:p}),label:J,description:J,children:(0,h.jsx)(c,{leadingElement:(0,h.jsx)(a,{size:`24`,svg:p}),label:J,description:J})}),(0,h.jsx)(d,{leadingElement:(0,h.jsx)(a,{size:`24`,svg:p}),label:J,description:J,defaultValue:`1`,children:(0,h.jsx)(s,{leadingElement:(0,h.jsx)(a,{size:`24`,svg:p}),label:J,description:J,value:`1`})}),(0,h.jsx)(me,{leadingElement:(0,h.jsx)(a,{size:`24`,svg:p}),label:J,description:J}),(0,h.jsx)(pe,{defaultValue:`1`,children:(0,h.jsx)(he,{leadingElement:(0,h.jsx)(a,{size:`24`,svg:p}),label:J,description:J,value:`1`})})]})}},X={args:B.args,render:function(e){let[t,n]=(0,m.useState)(!1);return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(o,{onClick:()=>n(!0),children:`Open dialog`}),(0,h.jsx)(ue,{open:t,onClose:()=>n(!1),title:`Dialog`,description:void 0,children:(0,h.jsx)(f,{...e})})]})},play:async({canvas:e,step:t})=>{await t(`Open dialog`,async()=>{await v.click(e.getByRole(`button`,{name:`Open dialog`})),await y(()=>{_(e.getByRole(`dialog`,{name:`Dialog`})).toBeVisible()})}),await t(`Open dropdown with mouse`,async()=>{await v.click(e.getByRole(`button`,{name:`Settings`})),await y(()=>{_(e.queryByRole(`menu`,{name:`Settings`})).toBeVisible()})}),await t(`Open Region submenu with mouse`,async()=>{await v.click(e.getByRole(`menuitem`,{name:`Region`})),await y(()=>{_(e.queryByRole(`menu`,{name:`Region`})).toBeVisible()})}),await t(`Click on Currency item`,async()=>{await v.click(e.getByRole(`menuitem`,{name:`Currency`})),await y(()=>{_(e.queryByRole(`menu`,{name:`Settings`})).not.toBeInTheDocument()})}),await t(`Open dropdown with keyboard`,async()=>{e.getByRole(`button`,{name:`Settings`}).focus(),await v.keyboard(`{Enter}`),await y(()=>{_(e.queryByRole(`menu`,{name:`Settings`})).toBeVisible(),_(e.getByRole(`menuitem`,{name:`Region`})).toHaveFocus()})}),await t(`Open Region submenu with keyboard`,async()=>{await v.keyboard(`{Enter}`),await y(()=>{_(e.queryByRole(`menu`,{name:`Region`})).toBeVisible(),_(e.getByRole(`menuitem`,{name:`Currency`})).toHaveFocus()})}),await t(`Navigate to Language item with keyboard`,async()=>{await v.keyboard(`{ArrowDown}`),await y(()=>{_(e.getByRole(`menuitem`,{name:`Language`})).toHaveFocus()})}),await t(`Select Language item with keyboard`,async()=>{await v.keyboard(`{Enter}`),await y(()=>{_(e.queryByRole(`menu`,{name:`Settings`})).not.toBeInTheDocument()})}),await t(`Close dialog`,async()=>{await v.keyboard(`{Escape}`),await y(()=>{_(e.queryByRole(`dialog`,{name:`Dialog`})).not.toBeInTheDocument()})})}},Z={render:function(e){let[t,n]=(0,m.useState)(!1);return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(f,{...e,children:(0,h.jsx)(c,{label:`Open dialog`,onClick:()=>n(!0)})}),(0,h.jsx)(ue,{title:`Dialog`,description:void 0,open:t,onClose:()=>n(!1),children:`Dialog content`})]})},play:async({canvas:e,step:t})=>{await t(`Open dropdown`,async()=>{await v.click(e.getByRole(`button`,{name:`Settings`})),await y(()=>{_(e.getByRole(`menu`)).toBeVisible()})}),await t(`Open dialog`,async()=>{await v.click(e.getByRole(`menuitem`,{name:`Open dialog`})),await y(()=>{_(e.getByRole(`dialog`,{name:`Dialog`})).toBeVisible()})}),await t(`Close dialog`,async()=>{await v.keyboard(`{Escape}`)})}},et=()=>{let[e,t]=(0,m.useState)(!1);return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(c,{label:`Open dialog`,onClick:()=>t(!0)}),(0,h.jsx)(ue,{title:`Dialog`,description:void 0,open:e,onClose:()=>t(!1),children:`Dialog content`})]})},Q={args:{keepMounted:!0,children:(0,h.jsx)(et,{})},play:Z.play},$={render:()=>(0,h.jsx)(f,{open:!0,trigger:(0,h.jsx)((0,m.forwardRef)((e,t)=>(0,h.jsx)(`button`,{...e,ref:t,children:`Button`})),{}),children:(0,h.jsxs)(pe,{children:[(0,h.jsx)(c,{label:`Transfer balance`,onClick:b.items.transferBalance}),(0,h.jsx)(c,{label:`Add extra hours`,onClick:b.items.addExtraHours})]})})},Ee.parameters={...Ee.parameters,docs:{...Ee.parameters?.docs,source:{originalSource:`{
2
+ tags: ['!autodocs', '!dev'],
3
+ args: {
4
+ defaultOpen: true
5
+ }
6
+ }`,...Ee.parameters?.docs?.source}}},S.parameters={...S.parameters,docs:{...S.parameters?.docs,source:{originalSource:`{
7
+ play: async ({
8
+ canvas,
9
+ step,
10
+ args
11
+ }) => {
12
+ await step('Initially closed', async () => {
13
+ expect(canvas.queryByRole('menu')).not.toBeInTheDocument();
14
+ });
15
+ await step('Open dropdown', async () => {
16
+ await userEvent.click(canvas.getByRole('button', {
17
+ name: 'Settings'
18
+ }));
19
+ await waitFor(() => {
20
+ expect(canvas.queryByRole('menu')).toBeVisible();
21
+ });
22
+ expect(args.onOpenChange).toHaveBeenLastCalledWith(true, BaseUiEventDetails);
23
+ });
24
+ await step('Click outside to close the menu', async () => {
25
+ await userEvent.click(document.body);
26
+ await waitFor(() => {
27
+ expect(canvas.queryByRole('menu')).not.toBeInTheDocument();
28
+ });
29
+ expect(args.onOpenChange).toHaveBeenLastCalledWith(false, BaseUiEventDetails);
30
+ });
31
+ await step('Open dropdown again', async () => {
32
+ await userEvent.click(canvas.getByRole('button', {
33
+ name: 'Settings'
34
+ }));
35
+ await waitFor(() => {
36
+ expect(canvas.queryByRole('menu')).toBeVisible();
37
+ });
38
+ });
39
+ await step('Click on "Transfer balance"', async () => {
40
+ await userEvent.click(canvas.getByRole('menuitem', {
41
+ name: 'Transfer balance'
42
+ }));
43
+ expect(callbacks.items.transferBalance).toHaveBeenCalled();
44
+ await waitFor(() => {
45
+ expect(canvas.queryByRole('menu')).not.toBeInTheDocument();
46
+ });
47
+ expect(callbacks.onOpenChange).toHaveBeenLastCalledWith(false, BaseUiEventDetails);
48
+ });
49
+ }
50
+ }`,...S.parameters?.docs?.source},description:{story:"Dropdown menu is uncontrolled by default, managing its own open/closed state internally.\nUse the `defaultOpen` prop to set the initial open state.",...S.parameters?.docs?.description}}},De.parameters={...De.parameters,docs:{...De.parameters?.docs,source:{originalSource:`{
51
+ tags: ['!autodocs'],
52
+ args: {
53
+ defaultOpen: true
54
+ },
55
+ play: async ({
56
+ canvas,
57
+ step
58
+ }) => {
59
+ await step('Initially open', async () => {
60
+ await waitFor(() => {
61
+ expect(canvas.queryByRole('menu')).toBeVisible();
62
+ });
63
+ });
64
+ await step('Click outside to close the menu', async () => {
65
+ await userEvent.click(document.body);
66
+ await waitFor(() => {
67
+ expect(canvas.queryByRole('menu')).not.toBeInTheDocument();
68
+ });
69
+ expect(callbacks.onOpenChange).toHaveBeenLastCalledWith(false, BaseUiEventDetails);
70
+ });
71
+ }
72
+ }`,...De.parameters?.docs?.source}}},C.parameters={...C.parameters,docs:{...C.parameters?.docs,source:{originalSource:`{
73
+ decorators: [(Story, ctx) => {
74
+ const [open, setOpen] = useState(!!ctx.args.open);
75
+ setOpenFromPlayFunction = setOpen;
76
+ const handleOpenChange: DropdownMenuProps['onOpenChange'] = (open, details) => {
77
+ setOpen(open);
78
+ ctx.args.onOpenChange?.(open, details);
79
+ };
80
+ return <Story args={{
81
+ ...ctx.args,
82
+ open,
83
+ onOpenChange: handleOpenChange
84
+ }} />;
85
+ }],
86
+ args: {
87
+ open: false
88
+ },
89
+ play: async ({
90
+ canvas,
91
+ step,
92
+ args
93
+ }) => {
94
+ await step('Open dropdown', async () => {
95
+ await userEvent.click(canvas.getByRole('button', {
96
+ name: 'Settings'
97
+ }));
98
+ await waitFor(() => {
99
+ expect(canvas.queryByRole('menu')).toBeVisible();
100
+ });
101
+ expect(args.onOpenChange).toHaveBeenLastCalledWith(true, BaseUiEventDetails);
102
+ });
103
+ await step('Click outside to close the menu', async () => {
104
+ await userEvent.click(document.body);
105
+ await waitFor(() => {
106
+ expect(canvas.queryByRole('menu')).not.toBeInTheDocument();
107
+ });
108
+ expect(args.onOpenChange).toHaveBeenLastCalledWith(false, BaseUiEventDetails);
109
+ });
110
+ await step('Open dropdown via open prop', async () => {
111
+ callbacks.onOpenChange.mockClear();
112
+ setOpenFromPlayFunction(true);
113
+ await waitFor(() => {
114
+ expect(canvas.queryByRole('menu')).toBeVisible();
115
+ });
116
+ expect(args.onOpenChange).not.toHaveBeenCalled();
117
+ });
118
+ await step('Close dropdown via open prop', async () => {
119
+ callbacks.onOpenChange.mockClear();
120
+ setOpenFromPlayFunction(false);
121
+ await waitFor(() => {
122
+ expect(canvas.queryByRole('menu')).not.toBeInTheDocument();
123
+ });
124
+ expect(args.onOpenChange).not.toHaveBeenCalled();
125
+ });
126
+ }
127
+ }`,...C.parameters?.docs?.source},description:{story:"Use the `open` prop along with `onOpenChange` to make the dropdown menu controlled.\nThis gives you full control over the menu's open/closed state, useful for complex\ninteractions or when you need to coordinate the menu state with other UI elements.",...C.parameters?.docs?.description}}},ke.parameters={...ke.parameters,docs:{...ke.parameters?.docs,source:{originalSource:`{
128
+ ...Controlled,
129
+ tags: ['!autodocs'],
130
+ args: {
131
+ ...Controlled.args,
132
+ open: true
133
+ },
134
+ play: async ({
135
+ canvas,
136
+ step,
137
+ args
138
+ }) => {
139
+ await step('Initially open', async () => {
140
+ await waitFor(() => {
141
+ expect(canvas.queryByRole('menu')).toBeVisible();
142
+ });
143
+ });
144
+ await step('Click outside to close the menu', async () => {
145
+ await userEvent.click(document.body);
146
+ await waitFor(() => {
147
+ expect(canvas.queryByRole('menu')).not.toBeInTheDocument();
148
+ });
149
+ expect(args.onOpenChange).toHaveBeenLastCalledWith(false, BaseUiEventDetails);
150
+ });
151
+ }
152
+ }`,...ke.parameters?.docs?.source}}},w.parameters={...w.parameters,docs:{...w.parameters?.docs,source:{originalSource:`{
153
+ parameters: {
154
+ containerHeight: '500px'
155
+ },
156
+ args: {
157
+ side: 'top',
158
+ align: 'start',
159
+ defaultOpen: true
160
+ }
161
+ }`,...w.parameters?.docs?.source},description:{story:"Use the `side` and `align` props to control where the menu appears relative to the trigger.\nThe `side` prop determines which side of the trigger the menu opens on,\nwhile `align` controls alignment along that side.\nThe menu might automatically reposition to avoid viewport collisions.",...w.parameters?.docs?.description}}},Ae.parameters={...Ae.parameters,docs:{...Ae.parameters?.docs,source:{originalSource:`{
162
+ parameters: {
163
+ containerHeight: '500px'
164
+ },
165
+ tags: ['!autodocs'],
166
+ args: {
167
+ side: 'inline-end',
168
+ defaultOpen: true
169
+ }
170
+ }`,...Ae.parameters?.docs?.source}}},je.parameters={...je.parameters,docs:{...je.parameters?.docs,source:{originalSource:`{
171
+ parameters: {
172
+ containerHeight: '500px'
173
+ },
174
+ tags: ['!autodocs'],
175
+ args: {
176
+ side: 'inline-start',
177
+ defaultOpen: true
178
+ }
179
+ }`,...je.parameters?.docs?.source}}},Me.parameters={...Me.parameters,docs:{...Me.parameters?.docs,source:{originalSource:`{
180
+ parameters: {
181
+ containerHeight: '500px'
182
+ },
183
+ tags: ['!autodocs'],
184
+ args: {
185
+ side: 'left',
186
+ defaultOpen: true
187
+ }
188
+ }`,...Me.parameters?.docs?.source}}},Ne.parameters={...Ne.parameters,docs:{...Ne.parameters?.docs,source:{originalSource:`{
189
+ parameters: {
190
+ containerHeight: '500px'
191
+ },
192
+ tags: ['!autodocs'],
193
+ args: {
194
+ side: 'right',
195
+ defaultOpen: true
196
+ }
197
+ }`,...Ne.parameters?.docs?.source}}},Pe.parameters={...Pe.parameters,docs:{...Pe.parameters?.docs,source:{originalSource:`{
198
+ parameters: {
199
+ containerHeight: '500px'
200
+ },
201
+ tags: ['!autodocs'],
202
+ args: {
203
+ side: 'top',
204
+ defaultOpen: true
205
+ }
206
+ }`,...Pe.parameters?.docs?.source}}},Fe.parameters={...Fe.parameters,docs:{...Fe.parameters?.docs,source:{originalSource:`{
207
+ tags: ['!autodocs'],
208
+ args: {
209
+ align: 'start',
210
+ defaultOpen: true
211
+ }
212
+ }`,...Fe.parameters?.docs?.source}}},Ie.parameters={...Ie.parameters,docs:{...Ie.parameters?.docs,source:{originalSource:`{
213
+ tags: ['!autodocs'],
214
+ args: {
215
+ align: 'end',
216
+ defaultOpen: true
217
+ }
218
+ }`,...Ie.parameters?.docs?.source}}},T.parameters={...T.parameters,docs:{...T.parameters?.docs,source:{originalSource:`{
219
+ args: {
220
+ children: <>
221
+ <DropdownMenuItem label="Transfer balance" onClick={callbacks.items.transferBalance} />
222
+ <DropdownMenuItem label="Add extra hours" onClick={callbacks.items.addExtraHours} disabled />
223
+ </>
224
+ },
225
+ play: async ({
226
+ canvas,
227
+ step
228
+ }) => {
229
+ await step('Open dropdown', async () => {
230
+ await userEvent.click(canvas.getByRole('button', {
231
+ name: 'Settings'
232
+ }));
233
+ await waitFor(() => {
234
+ expect(canvas.queryByRole('menu')).toBeVisible();
235
+ });
236
+ });
237
+ await step('Click on "Add extra hours"', async () => {
238
+ callbacks.onOpenChange.mockClear();
239
+ const addExtraHours = canvas.getByRole('menuitem', {
240
+ name: 'Add extra hours'
241
+ });
242
+ expect(addExtraHours).toHaveAttribute('aria-disabled', 'true');
243
+ await userEvent.click(addExtraHours);
244
+ expect(callbacks.items.addExtraHours).not.toHaveBeenCalled();
245
+ expect(callbacks.onOpenChange).not.toHaveBeenCalled();
246
+ expect(canvas.queryByRole('menu')).toBeVisible();
247
+ });
248
+ }
249
+ }`,...T.parameters?.docs?.source},description:{story:`Menu items can be disabled to prevent user interaction. Disabled items are visually
250
+ distinguished and cannot be clicked or selected, useful for showing unavailable options
251
+ or actions that require certain conditions to be met.`,...T.parameters?.docs?.description}}},E.parameters={...E.parameters,docs:{...E.parameters?.docs,source:{originalSource:`{
252
+ args: {
253
+ trigger: <Button>Language</Button>,
254
+ children: <>
255
+ <DropdownMenuItem label="Español" description="Spanish" />
256
+ <DropdownMenuItem label="Українська" description="Ukrainian" />
257
+ </>
258
+ },
259
+ play: async ({
260
+ canvas,
261
+ step
262
+ }) => {
263
+ await step('Open dropdown', async () => {
264
+ await userEvent.click(canvas.getByRole('button', {
265
+ name: 'Language'
266
+ }));
267
+ await waitFor(() => {
268
+ expect(canvas.queryByRole('menu')).toBeVisible();
269
+ });
270
+ });
271
+ await step('Verify items a11y names and descriptions', async () => {
272
+ const spanishItem = canvas.getByRole('menuitem', {
273
+ name: 'Español'
274
+ });
275
+ expect(spanishItem).toHaveAccessibleName('Español');
276
+ expect(spanishItem).toHaveAccessibleDescription('Spanish');
277
+ const ukrainianItem = canvas.getByRole('menuitem', {
278
+ name: 'Українська'
279
+ });
280
+ expect(ukrainianItem).toHaveAccessibleName('Українська');
281
+ expect(ukrainianItem).toHaveAccessibleDescription('Ukrainian');
282
+ });
283
+ }
284
+ }`,...E.parameters?.docs?.source},description:{story:`Menu items can display additional context below the label using the \`description\` prop.
285
+ This is particularly useful for language selectors, settings options, or any scenario
286
+ where extra information helps users make informed choices.`,...E.parameters?.docs?.description}}},D.parameters={...D.parameters,docs:{...D.parameters?.docs,source:{originalSource:`{
287
+ args: {
288
+ defaultOpen: true,
289
+ children: <>
290
+ <DropdownMenuGroup label="Region">
291
+ <DropdownMenuItem label="Currency" />
292
+ <DropdownMenuItem label="Language" />
293
+ <DropdownMenuItem label="Time zone" />
294
+ </DropdownMenuGroup>
295
+ <DropdownMenuGroup label="Subscription">
296
+ <DropdownMenuItem label="Transfer balance" />
297
+ <DropdownMenuItem label="Add extra hours" />
298
+ </DropdownMenuGroup>
299
+ </>
300
+ }
301
+ }`,...D.parameters?.docs?.source},description:{story:`Organize related menu items into logical sections using \`DropdownMenuGroup\`. Groups have
302
+ a label and visually separate different categories of actions or options. This improves
303
+ scannability and helps users quickly find what they're looking for in longer menus.`,...D.parameters?.docs?.description}}},O.parameters={...O.parameters,docs:{...O.parameters?.docs,source:{originalSource:`{
304
+ args: {
305
+ defaultOpen: true,
306
+ children: <>
307
+ <DropdownMenuItem label="User profile" />
308
+ <DropdownMenuItem label="Payments & subscriptions" />
309
+ <Divider />
310
+ <DropdownMenuItem label="Logout" />
311
+ </>
312
+ }
313
+ }`,...O.parameters?.docs?.source},description:{story:`In some cases, you might want to separate outstanding items without creating a labeled group.
314
+ Use dividers to create subtle visual separation, particularly useful for isolating destructive
315
+ or important actions (like logout or delete) from regular options. Dividers provide a lightweight
316
+ way to organize menus when explicit group labels would be unnecessary or too verbose.`,...O.parameters?.docs?.description}}},k.parameters={...k.parameters,docs:{...k.parameters?.docs,source:{originalSource:`{
317
+ parameters: {
318
+ docs: {
319
+ story: {
320
+ height: 600
321
+ }
322
+ }
323
+ },
324
+ args: {
325
+ defaultOpen: true,
326
+ children: <>
327
+ <DropdownMenuGroup label="Icons">
328
+ <DropdownMenuItem leadingElement={<Icon svg={RescheduleSvg} size="24" />} label="Reschedule" />
329
+ <DropdownMenuItem leadingElement={<Icon svg={MessageSvg} size="24" />} label="Message tutor" />
330
+ </DropdownMenuGroup>
331
+ <DropdownMenuGroup label="Flags">
332
+ <DropdownMenuItem leadingElement={<CountryFlag code="es" alt="" size="medium" />} label="Spain" />
333
+ <DropdownMenuItem leadingElement={<CountryFlag code="ua" alt="" size="medium" />} label="Ukraine" />
334
+ </DropdownMenuGroup>
335
+ <DropdownMenuGroup label="Avatars">
336
+ <DropdownMenuItem leadingElement={<Avatar size="24" />} label="Kobe B." />
337
+ <DropdownMenuItem leadingElement={<Avatar size="24" />} label="Jenny R." />
338
+ </DropdownMenuGroup>
339
+ </>
340
+ }
341
+ }`,...k.parameters?.docs?.source},description:{story:`Enhance menu items with visual context using the \`leadingElement\` prop. You can add icons
342
+ to indicate actions, flags to represent countries or languages, or avatars to show users.
343
+ Leading elements help users quickly identify and distinguish between different menu options.`,...k.parameters?.docs?.description}}},j.parameters={...j.parameters,docs:{...j.parameters?.docs,source:{originalSource:`{
344
+ args: {
345
+ trigger: <Button>Links</Button>,
346
+ children: <>
347
+ <DropdownMenuItem label="Find a Tutor" onClick={linksCallbacks.findATutor} as={<a href="/en/online/english-tutors" />} />
348
+ <DropdownMenuItem label="Become a Tutor" onClick={linksCallbacks.becomeATutor} as={<a href="/en/teach" />} disabled />
349
+ <DropdownMenuItem label="My Lessons" onClick={linksCallbacks.myLessons} as={<Link to="/en/lessons" />} />
350
+ <DropdownMenuItem label="Refer a Friend" onClick={linksCallbacks.referAFriend} as={<Link to="/en/referral" />} disabled />
351
+ </>
352
+ },
353
+ play: async ({
354
+ canvas,
355
+ step
356
+ }) => {
357
+ await step('Open dropdown', async () => {
358
+ await userEvent.click(canvas.getByRole('button', {
359
+ name: 'Links'
360
+ }));
361
+ await waitFor(() => {
362
+ expect(canvas.queryByRole('menu')).toBeVisible();
363
+ });
364
+ });
365
+ await step('Assert links are rendered correctly', async () => {
366
+ const findATutor = canvas.getByRole('menuitem', {
367
+ name: 'Find a Tutor'
368
+ });
369
+ expect(findATutor.tagName).toBe('A');
370
+ expect(findATutor).toHaveAttribute('href', '/en/online/english-tutors');
371
+ const becomeATutor = canvas.getByRole('menuitem', {
372
+ name: 'Become a Tutor'
373
+ });
374
+ expect(becomeATutor.tagName).toBe('A');
375
+ expect(becomeATutor).toHaveAttribute('href', '/en/teach');
376
+ expect(becomeATutor).toHaveAttribute('aria-disabled', 'true');
377
+ const myLessons = canvas.getByRole('menuitem', {
378
+ name: 'My Lessons'
379
+ });
380
+ expect(myLessons.tagName).toBe('A');
381
+ expect(myLessons).toHaveAttribute('href', '/en/lessons');
382
+ const referAFriend = canvas.getByRole('menuitem', {
383
+ name: 'Refer a Friend'
384
+ });
385
+ expect(referAFriend.tagName).toBe('A');
386
+ expect(referAFriend).toHaveAttribute('href', '/en/referral');
387
+ expect(referAFriend).toHaveAttribute('aria-disabled', 'true');
388
+ });
389
+ await step('Click on "Find a Tutor"', async () => {
390
+ const findATutor = canvas.getByRole('menuitem', {
391
+ name: 'Find a Tutor'
392
+ });
393
+ await userEvent.click(findATutor);
394
+ expect(linksCallbacks.findATutor).toHaveBeenCalled();
395
+ });
396
+ await step('Open dropdown', async () => {
397
+ await userEvent.click(canvas.getByRole('button', {
398
+ name: 'Links'
399
+ }));
400
+ await waitFor(() => {
401
+ expect(canvas.queryByRole('menu')).toBeVisible();
402
+ });
403
+ });
404
+ await step('Click on "Become a Tutor"', async () => {
405
+ const becomeATutor = canvas.getByRole('menuitem', {
406
+ name: 'Become a Tutor'
407
+ });
408
+ await waitFor(() => userEvent.click(becomeATutor));
409
+ expect(linksCallbacks.becomeATutor).not.toHaveBeenCalled();
410
+ await waitFor(() => {
411
+ expect(canvas.queryByRole('menu')).toBeVisible();
412
+ });
413
+ });
414
+ await step('Click on "My Lessons"', async () => {
415
+ const myLessons = canvas.getByRole('menuitem', {
416
+ name: 'My Lessons'
417
+ });
418
+ await userEvent.click(myLessons);
419
+ expect(linksCallbacks.myLessons).toHaveBeenCalled();
420
+ await waitFor(() => {
421
+ expect(canvas.queryByRole('menu')).not.toBeInTheDocument();
422
+ });
423
+ });
424
+ await step('Open dropdown', async () => {
425
+ await userEvent.click(canvas.getByRole('button', {
426
+ name: 'Links'
427
+ }));
428
+ await waitFor(() => {
429
+ expect(canvas.queryByRole('menu')).toBeVisible();
430
+ });
431
+ });
432
+ await step('Click on "Refer a Friend"', async () => {
433
+ const referAFriend = canvas.getByRole('menuitem', {
434
+ name: 'Refer a Friend'
435
+ });
436
+ await userEvent.click(referAFriend);
437
+ expect(linksCallbacks.referAFriend).not.toHaveBeenCalled();
438
+ });
439
+ }
440
+ }`,...j.parameters?.docs?.source},description:{story:"You can use the `as` prop to render a custom element for the menu item.\nYou can use that to render anchors or custom link components (e.g. Next.js or React Router Link)",...j.parameters?.docs?.description}}},N.parameters={...N.parameters,docs:{...N.parameters?.docs,source:{originalSource:`{
441
+ args: {
442
+ children: <>
443
+ <DropdownMenuGroup label="Day of the week">
444
+ <DropdownMenuRadioGroup defaultValue="mon" onValueChange={radioCallbacks.dayOfTheWeek} items={[{
445
+ label: 'Monday',
446
+ value: 'mon'
447
+ }, {
448
+ label: 'Tuesday',
449
+ value: 'tue'
450
+ }, {
451
+ label: 'Wednesday',
452
+ value: 'wed'
453
+ }, {
454
+ label: 'Thursday',
455
+ value: 'thu'
456
+ }, {
457
+ label: 'Friday',
458
+ value: 'fri'
459
+ }, {
460
+ label: 'Saturday',
461
+ value: 'sat',
462
+ disabled: true
463
+ }, {
464
+ label: 'Sunday',
465
+ value: 'sun',
466
+ disabled: true
467
+ }]} />
468
+ </DropdownMenuGroup>
469
+ <DropdownMenuGroup label="Time of the day">
470
+ <DropdownMenuRadioGroup onValueChange={radioCallbacks.timeOfTheDay}>
471
+ <DropdownMenuRadioItem label="Morning" value="morning" />
472
+ <DropdownMenuRadioItem label="Afternoon" value="afternoon" />
473
+ </DropdownMenuRadioGroup>
474
+ </DropdownMenuGroup>
475
+ <DropdownMenuGroup label="Frequency">
476
+ <DropdownMenuRadioGroup value="once" onValueChange={radioCallbacks.frequency} disabled>
477
+ <DropdownMenuRadioItem label="Once" value="once" />
478
+ <DropdownMenuRadioItem label="Weekly" value="weekly" />
479
+ </DropdownMenuRadioGroup>
480
+ </DropdownMenuGroup>
481
+ </>
482
+ },
483
+ play: async ({
484
+ canvas,
485
+ step
486
+ }) => {
487
+ await step('Open dropdown', async () => {
488
+ await userEvent.click(canvas.getByRole('button', {
489
+ name: 'Settings'
490
+ }));
491
+ await waitFor(() => {
492
+ expect(canvas.queryByRole('menu')).toBeVisible();
493
+ });
494
+ });
495
+ const monday = canvas.getByRole('menuitemradio', {
496
+ name: 'Monday'
497
+ });
498
+ const tuesday = canvas.getByRole('menuitemradio', {
499
+ name: 'Tuesday'
500
+ });
501
+ const saturday = canvas.getByRole('menuitemradio', {
502
+ name: 'Saturday'
503
+ });
504
+ await step('Day of the week: default value is selected', async () => {
505
+ expect(monday).toHaveAttribute('aria-checked', 'true');
506
+ });
507
+ await step('Click on "Tuesday"', async () => {
508
+ await userEvent.click(tuesday);
509
+ expect(radioCallbacks.dayOfTheWeek).toHaveBeenCalledWith('tue');
510
+ await waitFor(() => {
511
+ expect(monday).toHaveAttribute('aria-checked', 'false');
512
+ expect(tuesday).toHaveAttribute('aria-checked', 'true');
513
+ });
514
+ });
515
+ await step('Click on "Saturday"', async () => {
516
+ radioCallbacks.dayOfTheWeek.mockClear();
517
+ await userEvent.click(saturday);
518
+ expect(radioCallbacks.dayOfTheWeek).not.toHaveBeenCalled();
519
+ await waitFor(() => {
520
+ expect(tuesday).toHaveAttribute('aria-checked', 'true');
521
+ });
522
+ });
523
+ const morning = canvas.getByRole('menuitemradio', {
524
+ name: 'Morning'
525
+ });
526
+ const afternoon = canvas.getByRole('menuitemradio', {
527
+ name: 'Afternoon'
528
+ });
529
+ await step('Time of the day: none is selected', async () => {
530
+ expect(morning).toHaveAttribute('aria-checked', 'false');
531
+ expect(afternoon).toHaveAttribute('aria-checked', 'false');
532
+ });
533
+ await step('Click on "Morning"', async () => {
534
+ await userEvent.click(morning);
535
+ expect(radioCallbacks.timeOfTheDay).toHaveBeenCalledWith('morning');
536
+ await waitFor(() => {
537
+ expect(morning).toHaveAttribute('aria-checked', 'true');
538
+ });
539
+ });
540
+ const once = canvas.getByRole('menuitemradio', {
541
+ name: 'Once'
542
+ });
543
+ const weekly = canvas.getByRole('menuitemradio', {
544
+ name: 'Weekly'
545
+ });
546
+ await step('Frequency: everything is disabled, once is selected', async () => {
547
+ expect(once).toHaveAttribute('aria-disabled', 'true');
548
+ expect(weekly).toHaveAttribute('aria-disabled', 'true');
549
+ expect(once).toHaveAttribute('aria-checked', 'true');
550
+ expect(weekly).toHaveAttribute('aria-checked', 'false');
551
+ });
552
+ await step('Click on "Weekly"', async () => {
553
+ await userEvent.click(weekly);
554
+ expect(radioCallbacks.frequency).not.toHaveBeenCalled();
555
+ await waitFor(() => {
556
+ expect(once).toHaveAttribute('aria-checked', 'true');
557
+ });
558
+ });
559
+ }
560
+ }`,...N.parameters?.docs?.source},description:{story:"Radio groups allow users to select a single option from a list of mutually exclusive options.\nUse `DropdownMenuRadioGroup` with `DropdownMenuRadioItem` components to create radio groups.\nMultiple independent radio groups can coexist in the same dropdown menu.\n\nYou can define radio group options either with type-safe `items` prop or by\npassing `DropdownMenuRadioItem` as children if you need more flexibility.",...N.parameters?.docs?.description}}},F.parameters={...F.parameters,docs:{...F.parameters?.docs,source:{originalSource:`{
561
+ args: {
562
+ children: <>
563
+ <DropdownMenuCheckboxItem label="Email notifications" onCheckedChange={checkboxCallbacks.email} defaultChecked />
564
+ <DropdownMenuCheckboxItem label="SMS notifications" onCheckedChange={checkboxCallbacks.sms} />
565
+ <DropdownMenuCheckboxItem label="Push notifications" onCheckedChange={checkboxCallbacks.push} disabled />
566
+ <DropdownMenuCheckboxItem label="System alerts (required)" onCheckedChange={checkboxCallbacks.alerts} disabled checked />
567
+ </>
568
+ },
569
+ play: async ({
570
+ canvas,
571
+ step
572
+ }) => {
573
+ await step('Open dropdown', async () => {
574
+ await userEvent.click(canvas.getByRole('button', {
575
+ name: 'Settings'
576
+ }));
577
+ await waitFor(() => {
578
+ expect(canvas.queryByRole('menu')).toBeVisible();
579
+ });
580
+ });
581
+ const emailNotifications = canvas.getByRole('menuitemcheckbox', {
582
+ name: 'Email notifications'
583
+ });
584
+ const smsNotifications = canvas.getByRole('menuitemcheckbox', {
585
+ name: 'SMS notifications'
586
+ });
587
+ const pushNotifications = canvas.getByRole('menuitemcheckbox', {
588
+ name: 'Push notifications'
589
+ });
590
+ const systemAlerts = canvas.getByRole('menuitemcheckbox', {
591
+ name: 'System alerts (required)'
592
+ });
593
+ await step('Email notifications is checked by default', async () => {
594
+ expect(emailNotifications).toHaveAttribute('aria-checked', 'true');
595
+ });
596
+ await step('Uncheck "Email notifications"', async () => {
597
+ await userEvent.click(emailNotifications);
598
+ expect(checkboxCallbacks.email).toHaveBeenCalledWith(false, BaseUiEventDetails);
599
+ await waitFor(() => {
600
+ expect(emailNotifications).toHaveAttribute('aria-checked', 'false');
601
+ });
602
+ });
603
+ await step('"SMS notifications" is not checked', async () => {
604
+ expect(smsNotifications).toHaveAttribute('aria-checked', 'false');
605
+ });
606
+ await step('Check "SMS notifications"', async () => {
607
+ await userEvent.click(smsNotifications);
608
+ expect(checkboxCallbacks.sms).toHaveBeenCalledWith(true, BaseUiEventDetails);
609
+ await waitFor(() => {
610
+ expect(smsNotifications).toHaveAttribute('aria-checked', 'true');
611
+ });
612
+ });
613
+ await step('"Push notifications" is disabled and not checked', async () => {
614
+ expect(pushNotifications).toHaveAttribute('aria-disabled', 'true');
615
+ expect(pushNotifications).toHaveAttribute('aria-checked', 'false');
616
+ });
617
+ await step('Click on "Push notifications"', async () => {
618
+ await userEvent.click(pushNotifications);
619
+ expect(checkboxCallbacks.push).not.toHaveBeenCalled();
620
+ await waitFor(() => {
621
+ expect(pushNotifications).toHaveAttribute('aria-checked', 'false');
622
+ });
623
+ });
624
+ await step('"System alerts (required)" is disabled and checked', async () => {
625
+ expect(systemAlerts).toHaveAttribute('aria-disabled', 'true');
626
+ expect(systemAlerts).toHaveAttribute('aria-checked', 'true');
627
+ });
628
+ await step('Click on "System alerts (required)"', async () => {
629
+ await userEvent.click(systemAlerts);
630
+ expect(checkboxCallbacks.alerts).not.toHaveBeenCalled();
631
+ await waitFor(() => {
632
+ expect(systemAlerts).toHaveAttribute('aria-checked', 'true');
633
+ });
634
+ });
635
+ }
636
+ }`,...F.parameters?.docs?.source},description:{story:`Checkbox items allow users to select multiple independent options from a list.
637
+ Use \`DropdownMenuCheckboxItem\` to add checkboxes to the menu. Each checkbox maintains
638
+ its own state and can be checked or unchecked independently of others.`,...F.parameters?.docs?.description}}},L.parameters={...L.parameters,docs:{...L.parameters?.docs,source:{originalSource:`args => {
639
+ const [dayOfTheWeek, setDayOfTheWeek] = useState('mon');
640
+ const [timeOfTheDay, setTimeOfTheDay] = useState<string | undefined>();
641
+ const handleDayOfTheWeekChange = (value: string) => {
642
+ setDayOfTheWeek(value);
643
+ selectCallbacks.dayOfTheWeek(value);
644
+ };
645
+ const handleTimeOfTheDayChange = (value: string) => {
646
+ setTimeOfTheDay(value);
647
+ selectCallbacks.timeOfTheDay(value);
648
+ };
649
+ return <DropdownMenu {...args}>
650
+ <DropdownMenuSelect label="Day of the week" value={dayOfTheWeek} onValueChange={handleDayOfTheWeekChange} items={[{
651
+ label: 'Monday',
652
+ value: 'mon'
653
+ }, {
654
+ label: 'Tuesday',
655
+ value: 'tue'
656
+ }, {
657
+ label: 'Wednesday',
658
+ value: 'wed'
659
+ }, {
660
+ label: 'Thursday',
661
+ value: 'thu'
662
+ }, {
663
+ label: 'Friday',
664
+ value: 'fri'
665
+ }, {
666
+ label: 'Saturday',
667
+ value: 'sat',
668
+ disabled: true
669
+ }, {
670
+ label: 'Sunday',
671
+ value: 'sun',
672
+ disabled: true
673
+ }]} />
674
+ <DropdownMenuSelect label="Time of the day" defaultValue={timeOfTheDay} onValueChange={handleTimeOfTheDayChange}>
675
+ <DropdownMenuSelectOption value="morning" label="Morning" />
676
+ <DropdownMenuSelectOption value="afternoon" label="Afternoon" />
677
+ </DropdownMenuSelect>
678
+ <DropdownMenuSelect label="Frequency" onValueChange={selectCallbacks.frequency} disabled>
679
+ <DropdownMenuSelectOption label="Once" value="once" />
680
+ <DropdownMenuSelectOption label="Weekly" value="weekly" />
681
+ </DropdownMenuSelect>
682
+ </DropdownMenu>;
683
+ }`,...L.parameters?.docs?.source},description:{story:"Select items provide a nested menu for choosing from a list of options, similar to a dropdown within a dropdown.\nUse `DropdownMenuSelect` with `DropdownMenuSelectOption` components to create select menus.\nThe selected value is displayed in the trigger label, and hovering over it opens a submenu with all available options.\n\nYou can define select options either with type-safe `items` prop or by\npassing `DropdownMenuSelectOption` as children if you need more flexibility.",...L.parameters?.docs?.description}}},R.parameters={...R.parameters,docs:{...R.parameters?.docs,source:{originalSource:`{
684
+ render: function Render({
685
+ align,
686
+ side,
687
+ ...rest
688
+ }) {
689
+ return <DropdownMenu {...rest} defaultOpen>
690
+ <DropdownMenuSelect label="Time of the day" side={side} align={align} defaultOpen>
691
+ <DropdownMenuSelectOption value="morning" label="Morning" />
692
+ <DropdownMenuSelectOption value="afternoon" label="Afternoon" />
693
+ </DropdownMenuSelect>
694
+ </DropdownMenu>;
695
+ },
696
+ parameters: {
697
+ containerHeight: '500px'
698
+ },
699
+ args: {
700
+ side: 'top',
701
+ align: 'start'
702
+ }
703
+ }`,...R.parameters?.docs?.source},description:{story:"Similar to DropdownMenu, DropdownMenuSelect position can be controlled with `side` and `align` props.",...R.parameters?.docs?.description}}},z.parameters={...z.parameters,docs:{...z.parameters?.docs,source:{originalSource:`{
704
+ render: ControllingSelectPosition.render,
705
+ parameters: {
706
+ containerHeight: '500px'
707
+ },
708
+ tags: ['!autodocs'],
709
+ args: {
710
+ side: 'inline-end'
711
+ }
712
+ }`,...z.parameters?.docs?.source}}},Re.parameters={...Re.parameters,docs:{...Re.parameters?.docs,source:{originalSource:`{
713
+ render: ControllingSelectPosition.render,
714
+ parameters: {
715
+ containerHeight: '500px'
716
+ },
717
+ tags: ['!autodocs'],
718
+ args: {
719
+ side: 'inline-start',
720
+ defaultOpen: true
721
+ }
722
+ }`,...Re.parameters?.docs?.source}}},ze.parameters={...ze.parameters,docs:{...ze.parameters?.docs,source:{originalSource:`{
723
+ render: ControllingSelectPosition.render,
724
+ parameters: {
725
+ containerHeight: '500px'
726
+ },
727
+ tags: ['!autodocs'],
728
+ args: {
729
+ side: 'left',
730
+ defaultOpen: true
731
+ }
732
+ }`,...ze.parameters?.docs?.source}}},Be.parameters={...Be.parameters,docs:{...Be.parameters?.docs,source:{originalSource:`{
733
+ render: ControllingSelectPosition.render,
734
+ parameters: {
735
+ containerHeight: '500px'
736
+ },
737
+ tags: ['!autodocs'],
738
+ args: {
739
+ side: 'right',
740
+ defaultOpen: true
741
+ }
742
+ }`,...Be.parameters?.docs?.source}}},Ve.parameters={...Ve.parameters,docs:{...Ve.parameters?.docs,source:{originalSource:`{
743
+ render: ControllingSelectPosition.render,
744
+ parameters: {
745
+ containerHeight: '500px'
746
+ },
747
+ tags: ['!autodocs'],
748
+ args: {
749
+ side: 'top',
750
+ defaultOpen: true
751
+ }
752
+ }`,...Ve.parameters?.docs?.source}}},He.parameters={...He.parameters,docs:{...He.parameters?.docs,source:{originalSource:`{
753
+ render: ControllingSelectPosition.render,
754
+ tags: ['!autodocs'],
755
+ args: {
756
+ align: 'start',
757
+ defaultOpen: true
758
+ }
759
+ }`,...He.parameters?.docs?.source}}},Ue.parameters={...Ue.parameters,docs:{...Ue.parameters?.docs,source:{originalSource:`{
760
+ render: ControllingSelectPosition.render,
761
+ tags: ['!autodocs'],
762
+ args: {
763
+ align: 'end',
764
+ defaultOpen: true
765
+ }
766
+ }`,...Ue.parameters?.docs?.source}}},B.parameters={...B.parameters,docs:{...B.parameters?.docs,source:{originalSource:`{
767
+ args: {
768
+ children: <>
769
+ <DropdownSubmenu label="Region">
770
+ <DropdownMenuItem label="Currency" />
771
+ <DropdownMenuItem label="Language" />
772
+ <DropdownMenuItem label="Time zone" />
773
+ </DropdownSubmenu>
774
+ <DropdownSubmenu label="Subscription">
775
+ <DropdownMenuItem label="Transfer balance" />
776
+ <DropdownMenuItem label="Add extra hours" />
777
+ </DropdownSubmenu>
778
+ <DropdownSubmenu label="Integrations" disabled>
779
+ <DropdownMenuItem label="Connect calendar" />
780
+ <DropdownMenuItem label="Slack integration" />
781
+ <DropdownMenuItem label="Email sync" />
782
+ </DropdownSubmenu>
783
+ </>
784
+ },
785
+ play: async ({
786
+ canvas,
787
+ step
788
+ }) => {
789
+ await step('Open dropdown', async () => {
790
+ await userEvent.click(canvas.getByRole('button', {
791
+ name: 'Settings'
792
+ }));
793
+ await waitFor(() => {
794
+ expect(canvas.queryByRole('menu')).toBeVisible();
795
+ });
796
+ });
797
+ const region = canvas.getByRole('menuitem', {
798
+ name: 'Region'
799
+ });
800
+ await step('Region submenu opens on hover', async () => {
801
+ await userEvent.hover(region);
802
+ await waitFor(() => {
803
+ expect(canvas.queryByRole('menu', {
804
+ name: 'Region'
805
+ })).toBeVisible();
806
+ });
807
+ });
808
+ await step('Region submenu closes on hover out', async () => {
809
+ await userEvent.unhover(region);
810
+ await waitFor(() => {
811
+ expect(canvas.queryByRole('menu', {
812
+ name: 'Region'
813
+ })).not.toBeInTheDocument();
814
+ });
815
+ });
816
+ await step('Integrations submenu is disabled', async () => {
817
+ const integrations = canvas.getByRole('menuitem', {
818
+ name: 'Integrations'
819
+ });
820
+ expect(integrations).toHaveAttribute('aria-disabled', 'true');
821
+ await userEvent.click(integrations);
822
+ await waitFor(() => {
823
+ expect(canvas.queryByRole('menu', {
824
+ name: 'Integrations'
825
+ })).not.toBeInTheDocument();
826
+ });
827
+ });
828
+ }
829
+ }`,...B.parameters?.docs?.source},description:{story:`Create nested menu structures using \`DropdownSubmenu\` to organize complex navigation hierarchies.
830
+ Submenus appear when hovering over or clicking their parent item, and can contain any menu items,
831
+ including additional submenus for deeper nesting. This pattern is ideal for settings menus or
832
+ complex action lists where options naturally group into categories.`,...B.parameters?.docs?.description}}},V.parameters={...V.parameters,docs:{...V.parameters?.docs,source:{originalSource:`{
833
+ render: function Render({
834
+ align,
835
+ side,
836
+ ...rest
837
+ }) {
838
+ return <DropdownMenu {...rest} defaultOpen>
839
+ <DropdownSubmenu label="Region" side={side} align={align} defaultOpen>
840
+ <DropdownMenuItem label="Currency" />
841
+ <DropdownMenuItem label="Language" />
842
+ <DropdownMenuItem label="Time zone" />
843
+ </DropdownSubmenu>
844
+ </DropdownMenu>;
845
+ },
846
+ parameters: {
847
+ containerHeight: '500px'
848
+ },
849
+ args: {
850
+ side: 'top',
851
+ align: 'start'
852
+ }
853
+ }`,...V.parameters?.docs?.source},description:{story:"Similar to DropdownMenu, DropdownSubmenu position can be controlled with `side` and `align` props.",...V.parameters?.docs?.description}}},We.parameters={...We.parameters,docs:{...We.parameters?.docs,source:{originalSource:`{
854
+ render: ControllingSubmenuPosition.render,
855
+ parameters: {
856
+ containerHeight: '500px'
857
+ },
858
+ tags: ['!autodocs'],
859
+ args: {
860
+ side: 'inline-end'
861
+ }
862
+ }`,...We.parameters?.docs?.source}}},Ge.parameters={...Ge.parameters,docs:{...Ge.parameters?.docs,source:{originalSource:`{
863
+ render: ControllingSubmenuPosition.render,
864
+ parameters: {
865
+ containerHeight: '500px'
866
+ },
867
+ tags: ['!autodocs'],
868
+ args: {
869
+ side: 'inline-start',
870
+ defaultOpen: true
871
+ }
872
+ }`,...Ge.parameters?.docs?.source}}},Ke.parameters={...Ke.parameters,docs:{...Ke.parameters?.docs,source:{originalSource:`{
873
+ render: ControllingSubmenuPosition.render,
874
+ parameters: {
875
+ containerHeight: '500px'
876
+ },
877
+ tags: ['!autodocs'],
878
+ args: {
879
+ side: 'left',
880
+ defaultOpen: true
881
+ }
882
+ }`,...Ke.parameters?.docs?.source}}},qe.parameters={...qe.parameters,docs:{...qe.parameters?.docs,source:{originalSource:`{
883
+ render: ControllingSubmenuPosition.render,
884
+ parameters: {
885
+ containerHeight: '500px'
886
+ },
887
+ tags: ['!autodocs'],
888
+ args: {
889
+ side: 'right',
890
+ defaultOpen: true
891
+ }
892
+ }`,...qe.parameters?.docs?.source}}},Je.parameters={...Je.parameters,docs:{...Je.parameters?.docs,source:{originalSource:`{
893
+ render: ControllingSubmenuPosition.render,
894
+ parameters: {
895
+ containerHeight: '500px'
896
+ },
897
+ tags: ['!autodocs'],
898
+ args: {
899
+ side: 'top',
900
+ defaultOpen: true
901
+ }
902
+ }`,...Je.parameters?.docs?.source}}},Ye.parameters={...Ye.parameters,docs:{...Ye.parameters?.docs,source:{originalSource:`{
903
+ render: ControllingSubmenuPosition.render,
904
+ tags: ['!autodocs'],
905
+ args: {
906
+ align: 'start',
907
+ defaultOpen: true
908
+ }
909
+ }`,...Ye.parameters?.docs?.source}}},Xe.parameters={...Xe.parameters,docs:{...Xe.parameters?.docs,source:{originalSource:`{
910
+ render: ControllingSubmenuPosition.render,
911
+ tags: ['!autodocs'],
912
+ args: {
913
+ align: 'end',
914
+ defaultOpen: true
915
+ }
916
+ }`,...Xe.parameters?.docs?.source}}},U.parameters={...U.parameters,docs:{...U.parameters?.docs,source:{originalSource:`{
917
+ parameters: {
918
+ docs: {
919
+ source: {
920
+ type: 'dynamic'
921
+ }
922
+ }
923
+ },
924
+ decorators: [Story => {
925
+ const [counter, setCounter] = useState(0);
926
+ const reset = () => setCounter(counter + 1);
927
+ return <>
928
+ <Story key={counter} />
929
+ <div style={{
930
+ position: 'fixed',
931
+ left: 0,
932
+ bottom: 0,
933
+ margin: 8
934
+ }}>
935
+ <Button variant="ghost" size="small" onClick={reset}>
936
+ Reset story
937
+ </Button>
938
+ </div>
939
+ </>;
940
+ }],
941
+ render: function Render() {
942
+ const [open, setOpen] = useState(false);
943
+ const [submenuOpen, setSubmenuOpen] = useState(false);
944
+ const [selectOpen, setSelectOpen] = useState(false);
945
+ const handleStepChange = (currentStep: number) => {
946
+ switch (currentStep) {
947
+ case 1:
948
+ setOpen(true);
949
+ return;
950
+ case 3:
951
+ setSubmenuOpen(true);
952
+ return;
953
+ case 5:
954
+ setSelectOpen(true);
955
+ return;
956
+ }
957
+ };
958
+ const handleTourComplete = () => {
959
+ setOpen(false);
960
+ setSubmenuOpen(false);
961
+ setSelectOpen(false);
962
+ };
963
+ return <Provider totalSteps={6} onStepChange={handleStepChange} onComplete={handleTourComplete} onClose={handleTourComplete}>
964
+ <Step step={0} title="New settings menu" text="All settings are now in one place.">
965
+ <DropdownMenu open={open} onOpenChange={setOpen} trigger={<IconButton svg={SettingsSvg} variant="ghost" assistiveText="Settings" />}>
966
+ <Step step={1} title="Transfer balance" text="You can now transfer your balance to another tutor." side="right">
967
+ <DropdownMenuItem label="Transfer balance" />
968
+ </Step>
969
+ <DropdownMenuItem label="Add extra hours" />
970
+ <Step step={2} title="Region" text="Region settings are grouped together." side="top">
971
+ <DropdownSubmenu label="Region" keepMounted open={submenuOpen} onOpenChange={setSubmenuOpen}>
972
+ <DropdownMenuItem label="Language" />
973
+ <Step step={3} title="Time zone" text="You can now select your time zone." side="right">
974
+ <DropdownMenuItem label="Time zone" />
975
+ </Step>
976
+ </DropdownSubmenu>
977
+ </Step>
978
+ <Step step={4} title="Currency" text="Currency settings moved here." side="right">
979
+ <DropdownMenuSelect open={selectOpen} onOpenChange={setSelectOpen} defaultValue="USD" label="Currency">
980
+ <DropdownMenuSelectOption value="USD" label="US Dollar" />
981
+ <DropdownMenuSelectOption value="EUR" label="Euro" />
982
+ <Step step={5} title="New currency!" text="Pay and receive payments in british pounds.">
983
+ <DropdownMenuSelectOption value="GBP" label="British Pound" />
984
+ </Step>
985
+ </DropdownMenuSelect>
986
+ </Step>
987
+ </DropdownMenu>
988
+ </Step>
989
+ </Provider>;
990
+ },
991
+ play: async ({
992
+ canvas,
993
+ step
994
+ }) => {
995
+ await step('Tour tooltip should be visible', async () => {
996
+ await waitFor(() => {
997
+ expect(canvas.getByRole('dialog', {
998
+ name: 'New settings menu'
999
+ })).toBeVisible();
1000
+ });
1001
+ });
1002
+ await step('Click Next to advance to second step', async () => {
1003
+ await userEvent.click(canvas.getByRole('button', {
1004
+ name: 'Next'
1005
+ }));
1006
+ await waitFor(() => {
1007
+ expect(canvas.getByRole('dialog', {
1008
+ name: 'Transfer balance'
1009
+ })).toBeVisible();
1010
+ expect(canvas.getByRole('menu')).toBeVisible();
1011
+ });
1012
+ });
1013
+ await step('Click Next to advance to third step', async () => {
1014
+ const tourStep = within(canvas.getByRole('dialog', {
1015
+ name: 'Transfer balance'
1016
+ }));
1017
+ await userEvent.click(tourStep.getByRole('button', {
1018
+ name: 'Next'
1019
+ }));
1020
+ await waitFor(() => {
1021
+ expect(canvas.getByRole('dialog', {
1022
+ name: 'Region'
1023
+ })).toBeVisible();
1024
+ });
1025
+ });
1026
+ await step('Click Next to advance to fourth step', async () => {
1027
+ const tourStep = within(canvas.getByRole('dialog', {
1028
+ name: 'Region'
1029
+ }));
1030
+ await userEvent.click(tourStep.getByRole('button', {
1031
+ name: 'Next'
1032
+ }));
1033
+ await waitFor(() => {
1034
+ expect(canvas.getByRole('dialog', {
1035
+ name: 'Time zone'
1036
+ })).toBeVisible();
1037
+ expect(canvas.getByRole('menu', {
1038
+ name: 'Region'
1039
+ })).toBeVisible();
1040
+ });
1041
+ });
1042
+ await step('Click Next to advance to fifth step', async () => {
1043
+ const tourStep = within(canvas.getByRole('dialog', {
1044
+ name: 'Time zone'
1045
+ }));
1046
+ await userEvent.click(tourStep.getByRole('button', {
1047
+ name: 'Next'
1048
+ }));
1049
+ await waitFor(() => {
1050
+ expect(canvas.getByRole('dialog', {
1051
+ name: 'Currency'
1052
+ })).toBeVisible();
1053
+ });
1054
+ });
1055
+ await step('Click Next to advance to the last step', async () => {
1056
+ const tourStep = within(canvas.getByRole('dialog', {
1057
+ name: 'Currency'
1058
+ }));
1059
+ await userEvent.click(tourStep.getByRole('button', {
1060
+ name: 'Next'
1061
+ }));
1062
+ await waitFor(() => {
1063
+ expect(canvas.getByRole('dialog', {
1064
+ name: 'New currency!'
1065
+ })).toBeVisible();
1066
+ expect(canvas.getByRole('menu', {
1067
+ name: /Currency/
1068
+ })).toBeVisible();
1069
+ });
1070
+ });
1071
+
1072
+ // Reset story to initial state
1073
+ await userEvent.click(canvas.getByRole('button', {
1074
+ name: 'Reset story'
1075
+ }));
1076
+ }
1077
+ }`,...U.parameters?.docs?.source},description:{story:`Submenu and select open state also can be controlled.
1078
+ This is useful for creating coordinated onboarding tours.`,...U.parameters?.docs?.description}}},W.parameters={...W.parameters,docs:{...W.parameters?.docs,source:{originalSource:`{
1079
+ args: {
1080
+ keepMounted: true,
1081
+ children: <>
1082
+ <DropdownMenuItem label="Transfer balance" />
1083
+ <DropdownMenuItem label="Add extra hours" />
1084
+ <DropdownSubmenu label="Region" keepMounted>
1085
+ <DropdownMenuItem label="Currency" />
1086
+ <DropdownMenuItem label="Language" />
1087
+ <DropdownMenuItem label="Time zone" />
1088
+ </DropdownSubmenu>
1089
+ </>
1090
+ },
1091
+ play: async ({
1092
+ canvas,
1093
+ step
1094
+ }) => {
1095
+ const menu = await canvas.findByRole('menu', {
1096
+ name: 'Settings',
1097
+ hidden: true
1098
+ });
1099
+ const submenu = await canvas.findByRole('menu', {
1100
+ name: 'Region',
1101
+ hidden: true
1102
+ });
1103
+ await step('Menus are mounted, but not visible', async () => {
1104
+ expect(menu).toBeInTheDocument();
1105
+ expect(menu).not.toBeVisible();
1106
+ expect(submenu).toBeInTheDocument();
1107
+ expect(submenu).not.toBeVisible();
1108
+ });
1109
+ await step('Open the menu', async () => {
1110
+ await userEvent.click(canvas.getByRole('button', {
1111
+ name: 'Settings'
1112
+ }));
1113
+ await waitFor(() => {
1114
+ expect(menu).toBeVisible();
1115
+ });
1116
+ });
1117
+ await step('Submenu is visible', async () => {
1118
+ await userEvent.click(canvas.getByRole('menuitem', {
1119
+ name: 'Region'
1120
+ }));
1121
+ await waitFor(() => {
1122
+ expect(submenu).toBeVisible();
1123
+ });
1124
+ });
1125
+ await step('Close the submenu.', async () => {
1126
+ await userEvent.keyboard('{Escape}');
1127
+ await waitFor(() => {
1128
+ expect(submenu).not.toBeVisible();
1129
+ });
1130
+ expect(submenu).toBeInTheDocument();
1131
+ });
1132
+ await step('Close the menu.', async () => {
1133
+ await userEvent.keyboard('{Escape}');
1134
+ await waitFor(() => {
1135
+ expect(menu).not.toBeVisible();
1136
+ });
1137
+ expect(menu).toBeInTheDocument();
1138
+ });
1139
+ }
1140
+ }`,...W.parameters?.docs?.source},description:{story:`Use the \`keepMounted\` prop to keep the menu in the DOM when closed, hidden with CSS instead of
1141
+ unmounted. This is useful for preserving state, enabling exit animations, or improving performance
1142
+ when the menu opens and closes frequently. Both the main menu and submenus can be kept mounted independently.`,...W.parameters?.docs?.description}}},G.parameters={...G.parameters,docs:{...G.parameters?.docs,source:{originalSource:`{
1143
+ args: Submenus.args,
1144
+ globals: {
1145
+ viewport: {
1146
+ value: 'narrow-l',
1147
+ isRotated: false
1148
+ }
1149
+ },
1150
+ parameters: {
1151
+ layout: 'centered'
1152
+ },
1153
+ play: async ({
1154
+ canvas,
1155
+ step
1156
+ }) => {
1157
+ await step('Open dropdown', async () => {
1158
+ await userEvent.click(canvas.getByRole('button', {
1159
+ name: 'Settings'
1160
+ }));
1161
+ await waitFor(() => {
1162
+ expect(canvas.queryByRole('menu')).toBeVisible();
1163
+ });
1164
+ });
1165
+ await step('Click on "Region"', async () => {
1166
+ await userEvent.click(canvas.getByRole('menuitem', {
1167
+ name: 'Region'
1168
+ }));
1169
+ await waitFor(async () => {
1170
+ expect(isInViewport(canvas.queryByRole('menu', {
1171
+ name: 'Settings'
1172
+ })), 'Main menu should be hidden').toBe(false);
1173
+ expect(isInViewport(canvas.queryByRole('menu', {
1174
+ name: 'Region'
1175
+ })), 'Submenu should be visible').toBe(true);
1176
+ });
1177
+ });
1178
+ await step('Tap away to return to main menu', async () => {
1179
+ /**
1180
+ * userEvent.click(document.body) sadly performs click on actual body,
1181
+ * so menu loses focus and closes. In real life, it's impossible because
1182
+ * of the backdrop, so here we're clicking on the backdrop directly.
1183
+ */
1184
+ const backdrop = canvas.getByRole('menu', {
1185
+ name: 'Region'
1186
+ }).closest('[data-base-ui-portal]')!.querySelector('[data-backdrop]')!;
1187
+ await userEvent.click(backdrop);
1188
+ await waitFor(async () => {
1189
+ expect(isInViewport(canvas.queryByRole('menu', {
1190
+ name: 'Region'
1191
+ })), 'Submenu should be hidden').toBe(false);
1192
+ expect(isInViewport(canvas.queryByRole('menu', {
1193
+ name: 'Settings'
1194
+ })), 'Main menu should be visible').toBe(true);
1195
+ });
1196
+ });
1197
+ await step('Tap away to close menu', async () => {
1198
+ /**
1199
+ * userEvent.click(document.body) sadly performs click on actual body,
1200
+ * so menu loses focus and closes. In real life, it's impossible because
1201
+ * of the backdrop, so here we're clicking on the backdrop directly.
1202
+ */
1203
+ await userEvent.click(document.querySelector('[data-backdrop]')!);
1204
+ await waitFor(async () => {
1205
+ expect(canvas.queryByRole('menu')).not.toBeInTheDocument();
1206
+ });
1207
+ });
1208
+ }
1209
+ }`,...G.parameters?.docs?.source},description:{story:`On mobile devices, the menu will be rendered as a bottom sheet instead of a dropdown.`,...G.parameters?.docs?.description}}},K.parameters={...K.parameters,docs:{...K.parameters?.docs,source:{originalSource:`{
1210
+ args: {
1211
+ children: <>
1212
+ <DropdownMenuItem label="Transfer balance" onClick={callbacks.items.transferBalance} />
1213
+ <DropdownMenuItem label="Add extra hours" onClick={callbacks.items.addExtraHours} disabled />
1214
+ <DropdownSubmenu label="Region">
1215
+ <DropdownMenuItem label="Currency" onClick={callbacks.items.currency} />
1216
+ <DropdownMenuItem label="Language" onClick={callbacks.items.language} />
1217
+ <DropdownMenuItem label="Time zone" />
1218
+ </DropdownSubmenu>
1219
+ </>
1220
+ },
1221
+ play: async ({
1222
+ canvas,
1223
+ step
1224
+ }) => {
1225
+ const trigger = canvas.getByRole('button', {
1226
+ name: 'Settings'
1227
+ });
1228
+ await step('Focus on the trigger element', async () => {
1229
+ trigger.focus();
1230
+ });
1231
+ await step('Open the menu via Enter key. First item should be focused', async () => {
1232
+ await userEvent.keyboard('{Enter}');
1233
+ await waitFor(() => {
1234
+ expect(canvas.queryByRole('menu')).toBeVisible();
1235
+ expect(canvas.getByRole('menuitem', {
1236
+ name: 'Transfer balance'
1237
+ })).toHaveFocus();
1238
+ });
1239
+ });
1240
+ await step('Close the menu via Escape key. Trigger should be focused', async () => {
1241
+ await userEvent.keyboard('{Escape}');
1242
+ await waitFor(() => {
1243
+ expect(canvas.queryByRole('menu')).not.toBeInTheDocument();
1244
+ expect(trigger).toHaveFocus();
1245
+ });
1246
+ });
1247
+ await step('Open the menu via Space key. First item should be focused', async () => {
1248
+ await userEvent.keyboard(' ');
1249
+ await waitFor(() => {
1250
+ expect(canvas.queryByRole('menu')).toBeVisible();
1251
+ expect(canvas.getByRole('menuitem', {
1252
+ name: 'Transfer balance'
1253
+ })).toHaveFocus();
1254
+ });
1255
+ });
1256
+ await step('Select the first item via Enter key. Menu should be closed and trigger should be focused', async () => {
1257
+ await userEvent.keyboard('{Enter}');
1258
+ expect(callbacks.items.transferBalance).toHaveBeenCalled();
1259
+ await waitFor(() => {
1260
+ expect(canvas.queryByRole('menu')).not.toBeInTheDocument();
1261
+ expect(trigger).toHaveFocus();
1262
+ });
1263
+ });
1264
+ await step('Open the menu via Enter key. First item should be focused', async () => {
1265
+ await userEvent.keyboard('{Enter}');
1266
+ await waitFor(() => {
1267
+ expect(canvas.queryByRole('menu')).toBeVisible();
1268
+ expect(canvas.getByRole('menuitem', {
1269
+ name: 'Transfer balance'
1270
+ })).toHaveFocus();
1271
+ });
1272
+ });
1273
+ await step('Navigate through the menu using Arrow keys', async () => {
1274
+ await userEvent.keyboard('{ArrowDown}');
1275
+ await waitFor(() => {
1276
+ expect(canvas.getByRole('menuitem', {
1277
+ name: 'Add extra hours'
1278
+ })).toHaveFocus();
1279
+ });
1280
+ await userEvent.keyboard('{ArrowDown}');
1281
+ await waitFor(() => {
1282
+ expect(canvas.getByRole('menuitem', {
1283
+ name: 'Region'
1284
+ })).toHaveFocus();
1285
+ });
1286
+ await userEvent.keyboard('{ArrowDown}');
1287
+ await waitFor(() => {
1288
+ expect(canvas.getByRole('menuitem', {
1289
+ name: 'Transfer balance'
1290
+ })).toHaveFocus();
1291
+ });
1292
+ await userEvent.keyboard('{ArrowUp}');
1293
+ await userEvent.keyboard('{ArrowUp}');
1294
+ await waitFor(() => {
1295
+ expect(canvas.getByRole('menuitem', {
1296
+ name: 'Add extra hours'
1297
+ })).toHaveFocus();
1298
+ });
1299
+ });
1300
+ await step('Enter key does nothing for disabled item', async () => {
1301
+ await userEvent.keyboard('{Enter}');
1302
+ expect(callbacks.items.addExtraHours).not.toHaveBeenCalled();
1303
+ });
1304
+ await step('Space key does nothing for disabled item', async () => {
1305
+ await userEvent.keyboard(' ');
1306
+ expect(callbacks.items.addExtraHours).not.toHaveBeenCalled();
1307
+ });
1308
+ await step('Navigate to submenu trigger using Arrow down key', async () => {
1309
+ await userEvent.keyboard('{ArrowDown}');
1310
+ await waitFor(() => {
1311
+ expect(canvas.getByRole('menuitem', {
1312
+ name: 'Region'
1313
+ })).toHaveFocus();
1314
+ });
1315
+ });
1316
+ await step('Open the submenu via Enter key. First item should be focused', async () => {
1317
+ await userEvent.keyboard('{Enter}');
1318
+ await waitFor(() => {
1319
+ expect(canvas.getByRole('menuitem', {
1320
+ name: 'Currency'
1321
+ })).toHaveFocus();
1322
+ });
1323
+ });
1324
+ await step('Navigate back to main menu using Arrow left key. Submenu trigger should be focused', async () => {
1325
+ await userEvent.keyboard('{ArrowLeft}');
1326
+ await waitFor(() => {
1327
+ expect(canvas.getByRole('menuitem', {
1328
+ name: 'Region'
1329
+ })).toHaveFocus();
1330
+ });
1331
+ });
1332
+ await step('Open submenu using Arrow right key. First item should be focused', async () => {
1333
+ await userEvent.keyboard('{ArrowRight}');
1334
+ await waitFor(() => {
1335
+ expect(canvas.getByRole('menuitem', {
1336
+ name: 'Currency'
1337
+ })).toHaveFocus();
1338
+ });
1339
+ });
1340
+ await step('Navigate back to main menu using Escape key. Submenu trigger should be focused', async () => {
1341
+ await userEvent.keyboard('{Escape}');
1342
+ await waitFor(() => {
1343
+ expect(canvas.getByRole('menuitem', {
1344
+ name: 'Region'
1345
+ })).toHaveFocus();
1346
+ });
1347
+ });
1348
+ await step('Open submenu using Enter key. First item should be focused', async () => {
1349
+ await userEvent.keyboard('{Enter}');
1350
+ await waitFor(() => {
1351
+ expect(canvas.getByRole('menuitem', {
1352
+ name: 'Currency'
1353
+ })).toHaveFocus();
1354
+ });
1355
+ });
1356
+ await step('Close the menu via Tab key. Trigger should be focused', async () => {
1357
+ await userEvent.keyboard('{Tab}');
1358
+ await waitFor(() => {
1359
+ expect(canvas.queryByRole('menu')).not.toBeInTheDocument();
1360
+ expect(trigger).toHaveFocus();
1361
+ });
1362
+ });
1363
+ }
1364
+ }`,...K.parameters?.docs?.source},description:{story:`The DropdownMenu component implements comprehensive keyboard navigation following the
1365
+ [WAI-ARIA Menu pattern](https://www.w3.org/WAI/ARIA/apg/patterns/menubar/) and accessibility
1366
+ best practices. This ensures users who rely on keyboard navigation or assistive technologies
1367
+ can efficiently interact with menus.
1368
+
1369
+ #### Opening and Closing the Menu
1370
+
1371
+ - **Enter** or **Space**: Opens the menu and moves focus to the first menu item
1372
+ - **Escape**: Closes the menu and returns focus to the trigger button
1373
+ - **Tab**: Closes the menu and moves focus to the next focusable element
1374
+
1375
+ #### Navigating Menu Items
1376
+
1377
+ - **Arrow Down**: Moves focus to the next menu item, wrapping to the first item when reaching the end
1378
+ - **Arrow Up**: Moves focus to the previous menu item, wrapping to the last item when at the beginning
1379
+ - Disabled items are included in keyboard navigation but cannot be activated
1380
+
1381
+ #### Activating Menu Items
1382
+
1383
+ - **Enter** or **Space**: Activates the focused menu item, closes the menu, and returns focus to the trigger
1384
+ - Disabled items will not respond to activation keys
1385
+
1386
+ #### Working with Submenus
1387
+
1388
+ - **Enter** or **Arrow Right**: Opens a submenu and moves focus to its first item
1389
+ - **Arrow Left** or **Escape**: Closes the submenu and returns focus to the submenu trigger
1390
+ - Submenus maintain the same navigation patterns as the main menu`,...K.parameters?.docs?.description}}},$e.parameters={...$e.parameters,docs:{...$e.parameters?.docs,source:{originalSource:`{
1391
+ ...KeyboardNavigation,
1392
+ globals: OnMobile.globals,
1393
+ parameters: OnMobile.parameters,
1394
+ tags: ['!autodocs']
1395
+ }`,...$e.parameters?.docs?.source}}},q.parameters={...q.parameters,docs:{...q.parameters?.docs,source:{originalSource:`{
1396
+ args: {
1397
+ defaultOpen: true,
1398
+ children: <>
1399
+ {Array.from({
1400
+ length: 100
1401
+ }).map((_, index) => <DropdownMenuItem key={index} label={\`Item \${index + 1}\`} />)}
1402
+ </>
1403
+ }
1404
+ }`,...q.parameters?.docs?.source},description:{story:`When the menu has a lot of items, it will be rendered as a scrollable container.`,...q.parameters?.docs?.description}}},Y.parameters={...Y.parameters,docs:{...Y.parameters?.docs,source:{originalSource:`{
1405
+ args: {
1406
+ defaultOpen: true,
1407
+ children: <DropdownMenuGroup label={longText}>
1408
+ <DropdownMenuItem leadingElement={<Icon size="24" svg={TokyoUIEmojiFrowning} />} label={longText} description={longText} />
1409
+ <DropdownSubmenu leadingElement={<Icon size="24" svg={TokyoUIEmojiFrowning} />} label={longText} description={longText}>
1410
+ <DropdownMenuItem leadingElement={<Icon size="24" svg={TokyoUIEmojiFrowning} />} label={longText} description={longText} />
1411
+ </DropdownSubmenu>
1412
+ <DropdownMenuSelect leadingElement={<Icon size="24" svg={TokyoUIEmojiFrowning} />} label={longText} description={longText} defaultValue="1">
1413
+ <DropdownMenuSelectOption leadingElement={<Icon size="24" svg={TokyoUIEmojiFrowning} />} label={longText} description={longText} value="1" />
1414
+ </DropdownMenuSelect>
1415
+ <DropdownMenuCheckboxItem leadingElement={<Icon size="24" svg={TokyoUIEmojiFrowning} />} label={longText} description={longText} />
1416
+ <DropdownMenuRadioGroup defaultValue="1">
1417
+ <DropdownMenuRadioItem leadingElement={<Icon size="24" svg={TokyoUIEmojiFrowning} />} label={longText} description={longText} value="1" />
1418
+ </DropdownMenuRadioGroup>
1419
+ </DropdownMenuGroup>
1420
+ }
1421
+ }`,...Y.parameters?.docs?.source},description:{story:`Please don't use long labels and descriptions for menu items.`,...Y.parameters?.docs?.description}}},X.parameters={...X.parameters,docs:{...X.parameters?.docs,source:{originalSource:`{
1422
+ args: Submenus.args,
1423
+ render: function StoryRender(args) {
1424
+ const [dialogOpen, setDialogOpen] = useState(false);
1425
+ return <>
1426
+ <Button onClick={() => setDialogOpen(true)}>Open dialog</Button>
1427
+ <Dialog open={dialogOpen} onClose={() => setDialogOpen(false)} title="Dialog" description={undefined}>
1428
+ <DropdownMenu {...args} />
1429
+ </Dialog>
1430
+ </>;
1431
+ },
1432
+ play: async ({
1433
+ canvas,
1434
+ step
1435
+ }) => {
1436
+ await step('Open dialog', async () => {
1437
+ await userEvent.click(canvas.getByRole('button', {
1438
+ name: 'Open dialog'
1439
+ }));
1440
+ await waitFor(() => {
1441
+ expect(canvas.getByRole('dialog', {
1442
+ name: 'Dialog'
1443
+ })).toBeVisible();
1444
+ });
1445
+ });
1446
+ await step('Open dropdown with mouse', async () => {
1447
+ await userEvent.click(canvas.getByRole('button', {
1448
+ name: 'Settings'
1449
+ }));
1450
+ await waitFor(() => {
1451
+ expect(canvas.queryByRole('menu', {
1452
+ name: 'Settings'
1453
+ })).toBeVisible();
1454
+ });
1455
+ });
1456
+ await step('Open Region submenu with mouse', async () => {
1457
+ await userEvent.click(canvas.getByRole('menuitem', {
1458
+ name: 'Region'
1459
+ }));
1460
+ await waitFor(() => {
1461
+ expect(canvas.queryByRole('menu', {
1462
+ name: 'Region'
1463
+ })).toBeVisible();
1464
+ });
1465
+ });
1466
+ await step('Click on Currency item', async () => {
1467
+ await userEvent.click(canvas.getByRole('menuitem', {
1468
+ name: 'Currency'
1469
+ }));
1470
+ await waitFor(() => {
1471
+ expect(canvas.queryByRole('menu', {
1472
+ name: 'Settings'
1473
+ })).not.toBeInTheDocument();
1474
+ });
1475
+ });
1476
+ await step('Open dropdown with keyboard', async () => {
1477
+ const trigger = canvas.getByRole('button', {
1478
+ name: 'Settings'
1479
+ });
1480
+ trigger.focus();
1481
+ await userEvent.keyboard('{Enter}');
1482
+ await waitFor(() => {
1483
+ expect(canvas.queryByRole('menu', {
1484
+ name: 'Settings'
1485
+ })).toBeVisible();
1486
+ expect(canvas.getByRole('menuitem', {
1487
+ name: 'Region'
1488
+ })).toHaveFocus();
1489
+ });
1490
+ });
1491
+ await step('Open Region submenu with keyboard', async () => {
1492
+ await userEvent.keyboard('{Enter}');
1493
+ await waitFor(() => {
1494
+ expect(canvas.queryByRole('menu', {
1495
+ name: 'Region'
1496
+ })).toBeVisible();
1497
+ expect(canvas.getByRole('menuitem', {
1498
+ name: 'Currency'
1499
+ })).toHaveFocus();
1500
+ });
1501
+ });
1502
+ await step('Navigate to Language item with keyboard', async () => {
1503
+ await userEvent.keyboard('{ArrowDown}');
1504
+ await waitFor(() => {
1505
+ expect(canvas.getByRole('menuitem', {
1506
+ name: 'Language'
1507
+ })).toHaveFocus();
1508
+ });
1509
+ });
1510
+ await step('Select Language item with keyboard', async () => {
1511
+ await userEvent.keyboard('{Enter}');
1512
+ await waitFor(() => {
1513
+ expect(canvas.queryByRole('menu', {
1514
+ name: 'Settings'
1515
+ })).not.toBeInTheDocument();
1516
+ });
1517
+ });
1518
+ await step('Close dialog', async () => {
1519
+ await userEvent.keyboard('{Escape}');
1520
+ await waitFor(() => {
1521
+ expect(canvas.queryByRole('dialog', {
1522
+ name: 'Dialog'
1523
+ })).not.toBeInTheDocument();
1524
+ });
1525
+ });
1526
+ }
1527
+ }`,...X.parameters?.docs?.source},description:{story:`Dropdown menu can be used inside a dialog or other popups.`,...X.parameters?.docs?.description}}},Z.parameters={...Z.parameters,docs:{...Z.parameters?.docs,source:{originalSource:`{
1528
+ render: function WithItemOpeningDialog(args) {
1529
+ const [open, setOpen] = useState(false);
1530
+ return <>
1531
+ <DropdownMenu {...args}>
1532
+ <DropdownMenuItem label="Open dialog" onClick={() => setOpen(true)} />
1533
+ </DropdownMenu>
1534
+ <Dialog title="Dialog" description={undefined} open={open} onClose={() => setOpen(false)}>
1535
+ Dialog content
1536
+ </Dialog>
1537
+ </>;
1538
+ },
1539
+ play: async ({
1540
+ canvas,
1541
+ step
1542
+ }) => {
1543
+ await step('Open dropdown', async () => {
1544
+ await userEvent.click(canvas.getByRole('button', {
1545
+ name: 'Settings'
1546
+ }));
1547
+ await waitFor(() => {
1548
+ expect(canvas.getByRole('menu')).toBeVisible();
1549
+ });
1550
+ });
1551
+ await step('Open dialog', async () => {
1552
+ await userEvent.click(canvas.getByRole('menuitem', {
1553
+ name: 'Open dialog'
1554
+ }));
1555
+ await waitFor(() => {
1556
+ expect(canvas.getByRole('dialog', {
1557
+ name: 'Dialog'
1558
+ })).toBeVisible();
1559
+ });
1560
+ });
1561
+ await step('Close dialog', async () => {
1562
+ await userEvent.keyboard('{Escape}');
1563
+ });
1564
+ }
1565
+ }`,...Z.parameters?.docs?.source},description:{story:`Dropdown menu items can also open external dialogs.`,...Z.parameters?.docs?.description}}},Q.parameters={...Q.parameters,docs:{...Q.parameters?.docs,source:{originalSource:`{
1566
+ args: {
1567
+ keepMounted: true,
1568
+ children: <CustomDropdownMenuItemWithDialog />
1569
+ },
1570
+ play: ItemOpeningDialog.play
1571
+ }`,...Q.parameters?.docs?.source},description:{story:`In some cases you might want to wrap DropdownMenuItem with a custom component, which might have a dialog inside:
1572
+
1573
+ \`\`\`tsx
1574
+ const CustomDropdownMenuItemWithDialog = () => {
1575
+ const [open, setOpen] = useState(false);
1576
+ return (
1577
+ <>
1578
+ <DropdownMenuItem label="Open dialog" onClick={() => setOpen(true)} />
1579
+ <Dialog title="Dialog" open={open} onClose={() => setOpen(false)}>
1580
+ Dialog content
1581
+ </Dialog>
1582
+ </>
1583
+ );
1584
+ };
1585
+ \`\`\`
1586
+
1587
+ In this case you need to use the \`keepMounted\` prop to prevent dialog from closing when menu unmounts.`,...Q.parameters?.docs?.description}}},$.parameters={...$.parameters,docs:{...$.parameters?.docs,source:{originalSource:`{
1588
+ render: () => {
1589
+ const CustomButton = forwardRef<HTMLButtonElement, Record<string, unknown>>((props, ref) => {
1590
+ return <button {...props} ref={ref}>
1591
+ Button
1592
+ </button>;
1593
+ });
1594
+ return <DropdownMenu open={true} trigger={<CustomButton />}>
1595
+ <DropdownMenuRadioGroup>
1596
+ <DropdownMenuItem label="Transfer balance" onClick={callbacks.items.transferBalance} />
1597
+ <DropdownMenuItem label="Add extra hours" onClick={callbacks.items.addExtraHours} />
1598
+ </DropdownMenuRadioGroup>
1599
+ </DropdownMenu>;
1600
+ }
1601
+ }`,...$.parameters?.docs?.source},description:{story:`Custom DropDownMenu triggers must forward the ref and props to the underlying DOM node to ensure proper dropdown positioning.
1602
+
1603
+ \`\`\`tsx
1604
+ const CustomButton = forwardRef<HTMLButtonElement, {}>(
1605
+ (props, ref) => {
1606
+ return <button {...props} ref={ref} />;
1607
+ },
1608
+ );
1609
+
1610
+ <DropdownMenu open={true} trigger={<CustomButton />}>
1611
+ ...
1612
+ </DropdownMenu>
1613
+ \`\`\``,...$.parameters?.docs?.description}}},tt=`Default.Uncontrolled.UncontrolledDefaultOpen.Controlled.ControlledDefaultOpen.ControllingPosition.SideInlineEnd.SideInlineStart.SideLeft.SideRight.SideTop.AlignStart.AlignEnd.DisabledItems.Description.Groups.Dividers.LeadingElements.Links.RadioGroups.CheckboxItems.SelectItems.ControllingSelectPosition.SelectSideInlineEnd.SelectSideInlineStart.SelectSideLeft.SelectSideRight.SelectSideTop.SelectAlignStart.SelectAlignEnd.Submenus.ControllingSubmenuPosition.SubmenuSideInlineEnd.SubmenuSideInlineStart.SubmenuSideLeft.SubmenuSideRight.SubmenuSideTop.SubmenuAlignStart.SubmenuAlignEnd.ControlledSubmenusAndSelects.KeepMounted.OnMobile.KeyboardNavigation.KeyboardNavigationOnMobile.Scroll.LongLabels.InsideDialog.ItemOpeningDialog.DialogInsideCustomItemComponent.CustomChildComponent`.split(`.`)}))();export{Ie as AlignEnd,Fe as AlignStart,F as CheckboxItems,C as Controlled,ke as ControlledDefaultOpen,U as ControlledSubmenusAndSelects,w as ControllingPosition,R as ControllingSelectPosition,V as ControllingSubmenuPosition,$ as CustomChildComponent,Ee as Default,E as Description,Q as DialogInsideCustomItemComponent,T as DisabledItems,O as Dividers,D as Groups,X as InsideDialog,Z as ItemOpeningDialog,W as KeepMounted,K as KeyboardNavigation,$e as KeyboardNavigationOnMobile,k as LeadingElements,j as Links,Y as LongLabels,G as OnMobile,N as RadioGroups,q as Scroll,Ue as SelectAlignEnd,He as SelectAlignStart,L as SelectItems,z as SelectSideInlineEnd,Re as SelectSideInlineStart,ze as SelectSideLeft,Be as SelectSideRight,Ve as SelectSideTop,Ae as SideInlineEnd,je as SideInlineStart,Me as SideLeft,Ne as SideRight,Pe as SideTop,Xe as SubmenuAlignEnd,Ye as SubmenuAlignStart,We as SubmenuSideInlineEnd,Ge as SubmenuSideInlineStart,Ke as SubmenuSideLeft,qe as SubmenuSideRight,Je as SubmenuSideTop,B as Submenus,S as Uncontrolled,De as UncontrolledDefaultOpen,tt as __namedExportsOrder,Te as default};