@banzamel/mineralui 2.4.3 → 2.5.2

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 (545) hide show
  1. package/README.md +1 -1
  2. package/dist/MAvatar-CvQuiGvT.cjs +2 -0
  3. package/dist/MAvatar-CvQuiGvT.cjs.map +1 -0
  4. package/dist/MAvatar-EkOBrEtS.js +73 -0
  5. package/dist/MAvatar-EkOBrEtS.js.map +1 -0
  6. package/dist/MButton-BxEky3xQ.cjs +2 -0
  7. package/dist/MButton-BxEky3xQ.cjs.map +1 -0
  8. package/dist/MButton-KELyyBw1.js +123 -0
  9. package/dist/MButton-KELyyBw1.js.map +1 -0
  10. package/dist/{MButtonGroup-BEJxXZ8u.js → MButtonGroup-DDnn8Wfy.js} +3 -3
  11. package/dist/{MButtonGroup-BEJxXZ8u.js.map → MButtonGroup-DDnn8Wfy.js.map} +1 -1
  12. package/dist/{MButtonGroup-DO1Tq3Za.cjs → MButtonGroup-Dz8Fm-oA.cjs} +2 -2
  13. package/dist/{MButtonGroup-DO1Tq3Za.cjs.map → MButtonGroup-Dz8Fm-oA.cjs.map} +1 -1
  14. package/dist/{MCard-P8OoswWM.cjs → MCard-Bqm4BjK_.cjs} +2 -2
  15. package/dist/MCard-Bqm4BjK_.cjs.map +1 -0
  16. package/dist/{MCard-BqSkGAgf.js → MCard-CqZYGaS2.js} +4 -4
  17. package/dist/MCard-CqZYGaS2.js.map +1 -0
  18. package/dist/MCheckbox-CaWgyUn5.js +72 -0
  19. package/dist/MCheckbox-CaWgyUn5.js.map +1 -0
  20. package/dist/MCheckbox-DpKJpnFF.cjs +2 -0
  21. package/dist/MCheckbox-DpKJpnFF.cjs.map +1 -0
  22. package/dist/{MConflictIllustration-znC7ijmP.js → MConflictIllustration-dwZS44ye.js} +1517 -1515
  23. package/dist/MConflictIllustration-dwZS44ye.js.map +1 -0
  24. package/dist/MConflictIllustration-vfHs-jad.cjs +2 -0
  25. package/dist/MConflictIllustration-vfHs-jad.cjs.map +1 -0
  26. package/dist/MDetailList-C3othNs3.js +127 -0
  27. package/dist/MDetailList-C3othNs3.js.map +1 -0
  28. package/dist/MDetailList-DkDHLdJ8.cjs +2 -0
  29. package/dist/MDetailList-DkDHLdJ8.cjs.map +1 -0
  30. package/dist/MDropdownMenu-C4-r7UZM.cjs +2 -0
  31. package/dist/MDropdownMenu-C4-r7UZM.cjs.map +1 -0
  32. package/dist/MDropdownMenu-Dvg9UsHB.js +219 -0
  33. package/dist/MDropdownMenu-Dvg9UsHB.js.map +1 -0
  34. package/dist/MGrid-CQqT8nHi.js +271 -0
  35. package/dist/MGrid-CQqT8nHi.js.map +1 -0
  36. package/dist/MGrid-tBsqShLG.cjs +2 -0
  37. package/dist/MGrid-tBsqShLG.cjs.map +1 -0
  38. package/dist/MHeading-DQSQ8c7L.js +21 -0
  39. package/dist/MHeading-DQSQ8c7L.js.map +1 -0
  40. package/dist/MHeading-DiGYs1FJ.cjs +2 -0
  41. package/dist/MHeading-DiGYs1FJ.cjs.map +1 -0
  42. package/dist/MInput-BeEGufZG.cjs +2 -0
  43. package/dist/MInput-BeEGufZG.cjs.map +1 -0
  44. package/dist/MInput-QnQV9L8U.js +190 -0
  45. package/dist/MInput-QnQV9L8U.js.map +1 -0
  46. package/dist/MInputCVC-CCNRAqHw.cjs +2 -0
  47. package/dist/MInputCVC-CCNRAqHw.cjs.map +1 -0
  48. package/dist/MInputCVC-IXIYZwex.js +410 -0
  49. package/dist/MInputCVC-IXIYZwex.js.map +1 -0
  50. package/dist/MInputSearch-BSIc6m2P.cjs +2 -0
  51. package/dist/MInputSearch-BSIc6m2P.cjs.map +1 -0
  52. package/dist/MInputSearch-CNuTAbYs.js +44 -0
  53. package/dist/MInputSearch-CNuTAbYs.js.map +1 -0
  54. package/dist/{MKbd-BR1GX5oK.cjs → MKbd-CnW3NUIu.cjs} +2 -2
  55. package/dist/{MKbd-BR1GX5oK.cjs.map → MKbd-CnW3NUIu.cjs.map} +1 -1
  56. package/dist/{MKbd-COb7oh_k.js → MKbd-DjfGyajR.js} +2 -2
  57. package/dist/{MKbd-COb7oh_k.js.map → MKbd-DjfGyajR.js.map} +1 -1
  58. package/dist/MLink-C6uwA6db.cjs +2 -0
  59. package/dist/MLink-C6uwA6db.cjs.map +1 -0
  60. package/dist/MLink-ixg0xFFI.js +31 -0
  61. package/dist/MLink-ixg0xFFI.js.map +1 -0
  62. package/dist/MLoader-CViA3zBo.js +44 -0
  63. package/dist/MLoader-CViA3zBo.js.map +1 -0
  64. package/dist/MLoader-DUOoOoNE.cjs +2 -0
  65. package/dist/MLoader-DUOoOoNE.cjs.map +1 -0
  66. package/dist/MPagination-BTGenxWW.js +122 -0
  67. package/dist/MPagination-BTGenxWW.js.map +1 -0
  68. package/dist/MPagination-DitmdtCc.cjs +2 -0
  69. package/dist/MPagination-DitmdtCc.cjs.map +1 -0
  70. package/dist/MPopover-CBDbUOW6.js +183 -0
  71. package/dist/MPopover-CBDbUOW6.js.map +1 -0
  72. package/dist/MPopover-ZeoU9hb5.cjs +2 -0
  73. package/dist/MPopover-ZeoU9hb5.cjs.map +1 -0
  74. package/dist/{MSimpleGrid-Ui8cI0ho.js → MSimpleGrid-C_QvLmck.js} +3 -3
  75. package/dist/MSimpleGrid-C_QvLmck.js.map +1 -0
  76. package/dist/MSimpleGrid-wgvjnxwM.cjs +2 -0
  77. package/dist/MSimpleGrid-wgvjnxwM.cjs.map +1 -0
  78. package/dist/{MSkeleton-Dhu-loDO.js → MSkeleton-BpcpBBJq.js} +12 -10
  79. package/dist/MSkeleton-BpcpBBJq.js.map +1 -0
  80. package/dist/MSkeleton-DuAN8Vcv.cjs +2 -0
  81. package/dist/MSkeleton-DuAN8Vcv.cjs.map +1 -0
  82. package/dist/MSlider-CLASUc2H.js +134 -0
  83. package/dist/MSlider-CLASUc2H.js.map +1 -0
  84. package/dist/MSlider-hONQBulE.cjs +2 -0
  85. package/dist/MSlider-hONQBulE.cjs.map +1 -0
  86. package/dist/MStack-BwAFeGGg.js +39 -0
  87. package/dist/MStack-BwAFeGGg.js.map +1 -0
  88. package/dist/MStack-CGII4A-q.cjs +2 -0
  89. package/dist/MStack-CGII4A-q.cjs.map +1 -0
  90. package/dist/MSubText-BeZk-fhz.js +17 -0
  91. package/dist/MSubText-BeZk-fhz.js.map +1 -0
  92. package/dist/MSubText-Dl1PfToZ.cjs +2 -0
  93. package/dist/MSubText-Dl1PfToZ.cjs.map +1 -0
  94. package/dist/MSurface-B_QnRLr5.js +74 -0
  95. package/dist/MSurface-B_QnRLr5.js.map +1 -0
  96. package/dist/MSurface-BrFo-JMJ.cjs +2 -0
  97. package/dist/MSurface-BrFo-JMJ.cjs.map +1 -0
  98. package/dist/MTag-BZrKN_DS.js +41 -0
  99. package/dist/MTag-BZrKN_DS.js.map +1 -0
  100. package/dist/MTag-DCE1vRJM.cjs +2 -0
  101. package/dist/MTag-DCE1vRJM.cjs.map +1 -0
  102. package/dist/MText-BUWQPoBM.js +45 -0
  103. package/dist/MText-BUWQPoBM.js.map +1 -0
  104. package/dist/MText-nsvLFsSv.cjs +2 -0
  105. package/dist/MText-nsvLFsSv.cjs.map +1 -0
  106. package/dist/MTooltip-BRSPJ3RY.js +100 -0
  107. package/dist/MTooltip-BRSPJ3RY.js.map +1 -0
  108. package/dist/MTooltip-Cj2Fxmzc.cjs +2 -0
  109. package/dist/MTooltip-Cj2Fxmzc.cjs.map +1 -0
  110. package/dist/MTreeView-BWCTlsU-.cjs +2 -0
  111. package/dist/MTreeView-BWCTlsU-.cjs.map +1 -0
  112. package/dist/MTreeView-CWcMwE-Z.js +554 -0
  113. package/dist/MTreeView-CWcMwE-Z.js.map +1 -0
  114. package/dist/calendar-2yhnCkGW.cjs +2 -0
  115. package/dist/calendar-2yhnCkGW.cjs.map +1 -0
  116. package/dist/calendar-DcNYDTVb.js +195 -0
  117. package/dist/calendar-DcNYDTVb.js.map +1 -0
  118. package/dist/calendar.cjs +1 -1
  119. package/dist/calendar.js +1 -1
  120. package/dist/{calendarDates-M_Dawj0j.js → calendarDates-Bpw_G_QR.js} +30 -19
  121. package/dist/calendarDates-Bpw_G_QR.js.map +1 -0
  122. package/dist/calendarDates-Cg0nm69Y.cjs +2 -0
  123. package/dist/calendarDates-Cg0nm69Y.cjs.map +1 -0
  124. package/dist/cards-Bp886TRb.cjs +2 -0
  125. package/dist/cards-Bp886TRb.cjs.map +1 -0
  126. package/dist/cards-BvER6Gx0.js +1277 -0
  127. package/dist/cards-BvER6Gx0.js.map +1 -0
  128. package/dist/cards.cjs +1 -1
  129. package/dist/cards.js +2 -2
  130. package/dist/{cn-YER3QsV1.js → cn-CUSXNnjF.js} +1 -1
  131. package/dist/{cn-YER3QsV1.js.map → cn-CUSXNnjF.js.map} +1 -1
  132. package/dist/{cn-CU5TNITO.cjs → cn-DYFxgzi2.cjs} +1 -1
  133. package/dist/{cn-CU5TNITO.cjs.map → cn-DYFxgzi2.cjs.map} +1 -1
  134. package/dist/components/cards/MCardDaySchedule/MCardDaySchedule.d.ts +1 -1
  135. package/dist/components/cards/MCardDocumentTree/MCardDocumentTree.d.ts +1 -1
  136. package/dist/components/cards/MCardGrid/MCardGrid.d.ts +1 -1
  137. package/dist/components/cards/MCardPayment/MCardPayment.d.ts +1 -1
  138. package/dist/components/cards/MCardPayment/MCardPayment.types.d.ts +4 -0
  139. package/dist/components/cards/MCardPaymentMethod/MCardPaymentMethod.d.ts +1 -1
  140. package/dist/components/cards/MStatCard/MStatCard.d.ts +1 -1
  141. package/dist/components/controls/MCheckbox/MCheckbox.types.d.ts +6 -0
  142. package/dist/components/controls/MLoadMore/MLoadMore.d.ts +1 -1
  143. package/dist/components/controls/MSlider/MSlider.d.ts +1 -1
  144. package/dist/components/controls/MSlider/MSlider.types.d.ts +5 -0
  145. package/dist/components/data/MTreeView/MTreeView.d.ts +1 -1
  146. package/dist/components/data/MTreeView/MTreeView.types.d.ts +6 -0
  147. package/dist/components/data/MWeekGrid/MWeekGrid.d.ts +1 -1
  148. package/dist/components/data/MWeekGrid/MWeekGrid.types.d.ts +9 -3
  149. package/dist/components/display/MCodeBlock/MCodeBlock.d.ts +1 -1
  150. package/dist/components/dropdowns/MAutocomplete/MAutocomplete.d.ts +1 -1
  151. package/dist/components/dropdowns/MAutocomplete/MAutocomplete.types.d.ts +8 -2
  152. package/dist/components/dropdowns/MSelect/MSelect.d.ts +1 -1
  153. package/dist/components/dropdowns/shared/TimeColumnListbox.d.ts +20 -0
  154. package/dist/components/feedback/MAlert/MAlert.d.ts +1 -1
  155. package/dist/components/feedback/MBadge/MBadge.d.ts +1 -1
  156. package/dist/components/feedback/MBanner/MBanner.d.ts +1 -1
  157. package/dist/components/feedback/MLoader/MLoader.d.ts +1 -1
  158. package/dist/components/feedback/MSpinner/MSpinner.d.ts +1 -1
  159. package/dist/components/feedback/MTag/MTag.d.ts +1 -1
  160. package/dist/components/inputs/MInput/MInput.types.d.ts +6 -1
  161. package/dist/components/inputs/MInput/useFormatCaret.d.ts +8 -0
  162. package/dist/components/layout/MCanvasGrid/MCanvasGrid.types.d.ts +5 -0
  163. package/dist/components/layout/MContainer/MContainer.d.ts +1 -1
  164. package/dist/components/layout/MDivider/MDivider.d.ts +1 -1
  165. package/dist/components/layout/MFooter/MFooter.d.ts +1 -1
  166. package/dist/components/layout/MHeader/MHeader.d.ts +1 -1
  167. package/dist/components/layout/MInline/MInline.d.ts +1 -1
  168. package/dist/components/layout/MNavbar/MNavbar.d.ts +1 -1
  169. package/dist/components/layout/MNavbar/MNavbar.types.d.ts +2 -0
  170. package/dist/components/layout/MSection/MSection.d.ts +1 -1
  171. package/dist/components/layout/MStack/MStack.d.ts +1 -1
  172. package/dist/components/layout/MStickyPanel/MStickyPanel.types.d.ts +4 -0
  173. package/dist/components/layout/MSurface/MSurface.d.ts +1 -1
  174. package/dist/components/media/MAvatar/MAvatar.d.ts +1 -1
  175. package/dist/components/media/MAvatar/MAvatar.types.d.ts +10 -0
  176. package/dist/components/media/MCarousel/MCarousel.d.ts +1 -1
  177. package/dist/components/media/MImage/MImage.d.ts +1 -1
  178. package/dist/components/media/carouselA11y.d.ts +9 -0
  179. package/dist/components/overlays/MCommandPalette/MCommandPalette.d.ts +1 -1
  180. package/dist/components/overlays/MDropdownMenu/MDropdownMenu.d.ts +4 -2
  181. package/dist/components/overlays/MDropdownMenu/MDropdownMenu.types.d.ts +3 -1
  182. package/dist/components/overlays/MPopconfirm/MPopconfirm.d.ts +1 -1
  183. package/dist/components/overlays/scrollLock.d.ts +14 -0
  184. package/dist/components/primitives/MPopover/MPopover.d.ts +1 -1
  185. package/dist/components/primitives/MPopover/MPopover.types.d.ts +32 -1
  186. package/dist/components/primitives/MPopover/popoverStack.d.ts +6 -0
  187. package/dist/components/typography/MHeading/MHeading.d.ts +2 -3
  188. package/dist/components/typography/MSubText/MSubText.d.ts +1 -1
  189. package/dist/components/typography/MText/MText.d.ts +1 -1
  190. package/dist/controls-B4Dxaab4.js +491 -0
  191. package/dist/controls-B4Dxaab4.js.map +1 -0
  192. package/dist/controls-CyXEIOXD.cjs +2 -0
  193. package/dist/controls-CyXEIOXD.cjs.map +1 -0
  194. package/dist/controls.cjs +1 -1
  195. package/dist/controls.js +5 -5
  196. package/dist/creditCards-Bo2mrc53.cjs +2 -0
  197. package/dist/creditCards-Bo2mrc53.cjs.map +1 -0
  198. package/dist/{creditCards-D_iWmtG6.js → creditCards-DmDOyvcw.js} +20 -31
  199. package/dist/creditCards-DmDOyvcw.js.map +1 -0
  200. package/dist/data-BM3KG8oN.cjs +2 -0
  201. package/dist/data-BM3KG8oN.cjs.map +1 -0
  202. package/dist/data-qnR8OBmj.js +808 -0
  203. package/dist/data-qnR8OBmj.js.map +1 -0
  204. package/dist/data.cjs +1 -1
  205. package/dist/data.js +2 -2
  206. package/dist/{dateUtils-CUY6CRCf.js → dateUtils-B-ToNZq_.js} +5 -6
  207. package/dist/dateUtils-B-ToNZq_.js.map +1 -0
  208. package/dist/dateUtils-z2L7ZaxA.cjs +2 -0
  209. package/dist/dateUtils-z2L7ZaxA.cjs.map +1 -0
  210. package/dist/display-BLMOBofj.cjs +3 -0
  211. package/dist/display-BLMOBofj.cjs.map +1 -0
  212. package/dist/display-Dlb79lkA.js +968 -0
  213. package/dist/display-Dlb79lkA.js.map +1 -0
  214. package/dist/display.cjs +1 -1
  215. package/dist/display.js +2 -2
  216. package/dist/dropdowns-2_7VMEDo.js +2009 -0
  217. package/dist/dropdowns-2_7VMEDo.js.map +1 -0
  218. package/dist/dropdowns-DN7j8J-V.cjs +2 -0
  219. package/dist/dropdowns-DN7j8J-V.cjs.map +1 -0
  220. package/dist/dropdowns.cjs +1 -1
  221. package/dist/dropdowns.js +1 -1
  222. package/dist/feedback-CECayytY.js +335 -0
  223. package/dist/feedback-CECayytY.js.map +1 -0
  224. package/dist/feedback-paV8Ls-h.cjs +2 -0
  225. package/dist/feedback-paV8Ls-h.cjs.map +1 -0
  226. package/dist/feedback.cjs +1 -1
  227. package/dist/feedback.js +5 -5
  228. package/dist/form-Br56h5EF.cjs +2 -0
  229. package/dist/form-Br56h5EF.cjs.map +1 -0
  230. package/dist/form-CJmMZgsH.js +165 -0
  231. package/dist/form-CJmMZgsH.js.map +1 -0
  232. package/dist/form.cjs +1 -1
  233. package/dist/form.js +1 -1
  234. package/dist/{formatters-CNjg_h7-.cjs → formatters-CauWlsnM.cjs} +1 -1
  235. package/dist/{formatters-CNjg_h7-.cjs.map → formatters-CauWlsnM.cjs.map} +1 -1
  236. package/dist/{formatters-T0vvjMtB.js → formatters-Doqdu_w1.js} +1 -1
  237. package/dist/{formatters-T0vvjMtB.js.map → formatters-Doqdu_w1.js.map} +1 -1
  238. package/dist/frameworkTexts-CaqdiKHW.cjs +2 -0
  239. package/dist/frameworkTexts-CaqdiKHW.cjs.map +1 -0
  240. package/dist/frameworkTexts-o43FqY1A.js +505 -0
  241. package/dist/frameworkTexts-o43FqY1A.js.map +1 -0
  242. package/dist/i18n/MI18nProvider.d.ts +6 -1
  243. package/dist/i18n/frameworkTexts.d.ts +511 -0
  244. package/dist/i18n/index.d.ts +1 -0
  245. package/dist/i18n.cjs +1 -1
  246. package/dist/i18n.js +2 -2
  247. package/dist/icons-Bp8bB9TP.cjs +2 -0
  248. package/dist/icons-Bp8bB9TP.cjs.map +1 -0
  249. package/dist/{icons-CBMl-kOM.js → icons-IqEBmGh3.js} +1223 -1220
  250. package/dist/icons-IqEBmGh3.js.map +1 -0
  251. package/dist/icons.cjs +1 -1
  252. package/dist/icons.js +1 -1
  253. package/dist/illustrations.cjs +1 -1
  254. package/dist/illustrations.js +1 -1
  255. package/dist/index.cjs +1 -1
  256. package/dist/index.d.ts +4 -2
  257. package/dist/index.js +56 -56
  258. package/dist/inputs-C0BJzlA-.js +1923 -0
  259. package/dist/inputs-C0BJzlA-.js.map +1 -0
  260. package/dist/inputs-CvNBBLFA.cjs +2 -0
  261. package/dist/inputs-CvNBBLFA.cjs.map +1 -0
  262. package/dist/inputs.cjs +1 -1
  263. package/dist/inputs.js +4 -4
  264. package/dist/layout-BSFqGXLZ.js +1101 -0
  265. package/dist/layout-BSFqGXLZ.js.map +1 -0
  266. package/dist/layout-MKqvUkPv.cjs +2 -0
  267. package/dist/layout-MKqvUkPv.cjs.map +1 -0
  268. package/dist/layout.cjs +1 -1
  269. package/dist/layout.js +6 -6
  270. package/dist/{layoutProps-Ck4VtGm9.cjs → layoutProps-B8y2XwHy.cjs} +1 -1
  271. package/dist/{layoutProps-Ck4VtGm9.cjs.map → layoutProps-B8y2XwHy.cjs.map} +1 -1
  272. package/dist/{layoutProps-Cl6d1KmH.js → layoutProps-CE5-ghKw.js} +1 -1
  273. package/dist/{layoutProps-Cl6d1KmH.js.map → layoutProps-CE5-ghKw.js.map} +1 -1
  274. package/dist/{licensing-f5KYVz7D.js → licensing-BKmoAdfr.js} +5 -4
  275. package/dist/licensing-BKmoAdfr.js.map +1 -0
  276. package/dist/licensing-DVgjkw-s.cjs +2 -0
  277. package/dist/licensing-DVgjkw-s.cjs.map +1 -0
  278. package/dist/media-fiasAbBv.js +485 -0
  279. package/dist/media-fiasAbBv.js.map +1 -0
  280. package/dist/media-tr1s386v.cjs +2 -0
  281. package/dist/media-tr1s386v.cjs.map +1 -0
  282. package/dist/media.cjs +1 -1
  283. package/dist/media.js +2 -2
  284. package/dist/overlays-Df-NpmkW.cjs +2 -0
  285. package/dist/overlays-Df-NpmkW.cjs.map +1 -0
  286. package/dist/overlays-W0WW3fn7.js +607 -0
  287. package/dist/overlays-W0WW3fn7.js.map +1 -0
  288. package/dist/overlays.cjs +1 -1
  289. package/dist/overlays.js +3 -3
  290. package/dist/primitives.cjs +1 -1
  291. package/dist/primitives.js +2 -2
  292. package/dist/radioGroupKeys-Bm-Qeh8G.js +28 -0
  293. package/dist/radioGroupKeys-Bm-Qeh8G.js.map +1 -0
  294. package/dist/radioGroupKeys-COL8uXbH.cjs +2 -0
  295. package/dist/radioGroupKeys-COL8uXbH.cjs.map +1 -0
  296. package/dist/{relativeTime-Cr-NVzij.js → relativeTime-BqCuaBqb.js} +1 -1
  297. package/dist/{relativeTime-Cr-NVzij.js.map → relativeTime-BqCuaBqb.js.map} +1 -1
  298. package/dist/{relativeTime-DgYBUaVm.cjs → relativeTime-DUbW4O44.cjs} +1 -1
  299. package/dist/{relativeTime-DgYBUaVm.cjs.map → relativeTime-DUbW4O44.cjs.map} +1 -1
  300. package/dist/scrollLock-C9P9o6wH.cjs +2 -0
  301. package/dist/scrollLock-C9P9o6wH.cjs.map +1 -0
  302. package/dist/scrollLock-D27VmgPV.js +14 -0
  303. package/dist/scrollLock-D27VmgPV.js.map +1 -0
  304. package/dist/style-runtime.cjs +1 -1
  305. package/dist/style-runtime.js +1 -1
  306. package/dist/styles.css +1 -1
  307. package/dist/theme/MThemeProvider.d.ts +18 -1
  308. package/dist/theme/index.d.ts +2 -2
  309. package/dist/{theme-DAOU1aPs.js → theme-B_juOenJ.js} +71 -61
  310. package/dist/theme-B_juOenJ.js.map +1 -0
  311. package/dist/theme-ByPZH0dh.cjs +2 -0
  312. package/dist/theme-ByPZH0dh.cjs.map +1 -0
  313. package/dist/theme.cjs +1 -1
  314. package/dist/theme.js +2 -2
  315. package/dist/{typography-C806GYT4.js → typography-DNcB8dOy.js} +3 -3
  316. package/dist/{typography-C806GYT4.js.map → typography-DNcB8dOy.js.map} +1 -1
  317. package/dist/{typography-4v01oNWx.cjs → typography-I7aeG8pH.cjs} +2 -2
  318. package/dist/{typography-4v01oNWx.cjs.map → typography-I7aeG8pH.cjs.map} +1 -1
  319. package/dist/typography.cjs +1 -1
  320. package/dist/typography.js +6 -6
  321. package/dist/useGhostText-CKsb8Ufa.js +240 -0
  322. package/dist/useGhostText-CKsb8Ufa.js.map +1 -0
  323. package/dist/useGhostText-DO-tfxS0.cjs +2 -0
  324. package/dist/useGhostText-DO-tfxS0.cjs.map +1 -0
  325. package/dist/useModalLayer-CpOPSDbf.js +128 -0
  326. package/dist/useModalLayer-CpOPSDbf.js.map +1 -0
  327. package/dist/useModalLayer-Cyt93Prs.cjs +2 -0
  328. package/dist/useModalLayer-Cyt93Prs.cjs.map +1 -0
  329. package/dist/utils/calendarDates.d.ts +5 -0
  330. package/dist/utils/radioGroupKeys.d.ts +9 -0
  331. package/dist/utils/useDateGridNav.d.ts +39 -0
  332. package/dist/utils/useGhostText.d.ts +2 -1
  333. package/dist/utils/useKeyboardNav.d.ts +51 -5
  334. package/dist/utils/useModalLayer.d.ts +4 -0
  335. package/dist/utils/useRovingToolbar.d.ts +26 -0
  336. package/dist/utils/validationMessages.d.ts +15 -0
  337. package/dist/utils.cjs +1 -1
  338. package/dist/utils.entry.d.ts +3 -1
  339. package/dist/utils.js +11 -11
  340. package/dist/validationMessages-BFimXxlT.js +23 -0
  341. package/dist/validationMessages-BFimXxlT.js.map +1 -0
  342. package/dist/validationMessages-iHu7apWr.cjs +2 -0
  343. package/dist/validationMessages-iHu7apWr.cjs.map +1 -0
  344. package/dist/validators-SZmLxnir.cjs +2 -0
  345. package/dist/validators-SZmLxnir.cjs.map +1 -0
  346. package/dist/{validators-DVYOtFnw.js → validators-ULebNme2.js} +107 -106
  347. package/dist/validators-ULebNme2.js.map +1 -0
  348. package/package.json +1 -1
  349. package/dist/MAvatar-DHNB3829.cjs +0 -2
  350. package/dist/MAvatar-DHNB3829.cjs.map +0 -1
  351. package/dist/MAvatar-GeRL-CNO.js +0 -63
  352. package/dist/MAvatar-GeRL-CNO.js.map +0 -1
  353. package/dist/MButton-CEwo8lUB.js +0 -115
  354. package/dist/MButton-CEwo8lUB.js.map +0 -1
  355. package/dist/MButton-CnAr77Za.cjs +0 -2
  356. package/dist/MButton-CnAr77Za.cjs.map +0 -1
  357. package/dist/MCard-BqSkGAgf.js.map +0 -1
  358. package/dist/MCard-P8OoswWM.cjs.map +0 -1
  359. package/dist/MCheckbox-BxFBADcE.js +0 -59
  360. package/dist/MCheckbox-BxFBADcE.js.map +0 -1
  361. package/dist/MCheckbox-DozwF2ai.cjs +0 -2
  362. package/dist/MCheckbox-DozwF2ai.cjs.map +0 -1
  363. package/dist/MConflictIllustration-2QL-BHYv.cjs +0 -2
  364. package/dist/MConflictIllustration-2QL-BHYv.cjs.map +0 -1
  365. package/dist/MConflictIllustration-znC7ijmP.js.map +0 -1
  366. package/dist/MDetailList-CThQvoyf.cjs +0 -2
  367. package/dist/MDetailList-CThQvoyf.cjs.map +0 -1
  368. package/dist/MDetailList-Cx9H81xT.js +0 -98
  369. package/dist/MDetailList-Cx9H81xT.js.map +0 -1
  370. package/dist/MDropdownMenu-DnKcCyW6.cjs +0 -2
  371. package/dist/MDropdownMenu-DnKcCyW6.cjs.map +0 -1
  372. package/dist/MDropdownMenu-DxbKN7Ui.js +0 -172
  373. package/dist/MDropdownMenu-DxbKN7Ui.js.map +0 -1
  374. package/dist/MGrid-BkRSGN2t.cjs +0 -2
  375. package/dist/MGrid-BkRSGN2t.cjs.map +0 -1
  376. package/dist/MGrid-CIz-2i6X.js +0 -265
  377. package/dist/MGrid-CIz-2i6X.js.map +0 -1
  378. package/dist/MHeading-AYQ8_GFP.cjs +0 -2
  379. package/dist/MHeading-AYQ8_GFP.cjs.map +0 -1
  380. package/dist/MHeading-DcGxUMwC.js +0 -21
  381. package/dist/MHeading-DcGxUMwC.js.map +0 -1
  382. package/dist/MI18nProvider-CqAwaswx.cjs +0 -2
  383. package/dist/MI18nProvider-CqAwaswx.cjs.map +0 -1
  384. package/dist/MI18nProvider-VH14CI8u.js +0 -72
  385. package/dist/MI18nProvider-VH14CI8u.js.map +0 -1
  386. package/dist/MInput-BYj2BdUe.cjs +0 -2
  387. package/dist/MInput-BYj2BdUe.cjs.map +0 -1
  388. package/dist/MInput-nodE-CZF.js +0 -188
  389. package/dist/MInput-nodE-CZF.js.map +0 -1
  390. package/dist/MInputCVC-9XWryaTz.cjs +0 -2
  391. package/dist/MInputCVC-9XWryaTz.cjs.map +0 -1
  392. package/dist/MInputCVC-CrDTaUXm.js +0 -321
  393. package/dist/MInputCVC-CrDTaUXm.js.map +0 -1
  394. package/dist/MInputSearch-BMgCHjFk.js +0 -43
  395. package/dist/MInputSearch-BMgCHjFk.js.map +0 -1
  396. package/dist/MInputSearch-BiVI1jNc.cjs +0 -2
  397. package/dist/MInputSearch-BiVI1jNc.cjs.map +0 -1
  398. package/dist/MLink-CAl6N6_z.js +0 -31
  399. package/dist/MLink-CAl6N6_z.js.map +0 -1
  400. package/dist/MLink-Dk_ReE6i.cjs +0 -2
  401. package/dist/MLink-Dk_ReE6i.cjs.map +0 -1
  402. package/dist/MLoader-CYp0OJU_.js +0 -41
  403. package/dist/MLoader-CYp0OJU_.js.map +0 -1
  404. package/dist/MLoader-DvmFle31.cjs +0 -2
  405. package/dist/MLoader-DvmFle31.cjs.map +0 -1
  406. package/dist/MPagination-E7IixIeo.js +0 -113
  407. package/dist/MPagination-E7IixIeo.js.map +0 -1
  408. package/dist/MPagination-reDU9xTW.cjs +0 -2
  409. package/dist/MPagination-reDU9xTW.cjs.map +0 -1
  410. package/dist/MPopover-8gYD3Ogq.js +0 -118
  411. package/dist/MPopover-8gYD3Ogq.js.map +0 -1
  412. package/dist/MPopover-B3npyAkL.cjs +0 -2
  413. package/dist/MPopover-B3npyAkL.cjs.map +0 -1
  414. package/dist/MPortal-Ba2Sxset.js +0 -10
  415. package/dist/MPortal-Ba2Sxset.js.map +0 -1
  416. package/dist/MPortal-CuBXhhl_.cjs +0 -2
  417. package/dist/MPortal-CuBXhhl_.cjs.map +0 -1
  418. package/dist/MSimpleGrid-BchGYPMi.cjs +0 -2
  419. package/dist/MSimpleGrid-BchGYPMi.cjs.map +0 -1
  420. package/dist/MSimpleGrid-Ui8cI0ho.js.map +0 -1
  421. package/dist/MSkeleton-DPa_G_2X.cjs +0 -2
  422. package/dist/MSkeleton-DPa_G_2X.cjs.map +0 -1
  423. package/dist/MSkeleton-Dhu-loDO.js.map +0 -1
  424. package/dist/MSlider-BRjhyBSc.js +0 -75
  425. package/dist/MSlider-BRjhyBSc.js.map +0 -1
  426. package/dist/MSlider-w5214a-W.cjs +0 -2
  427. package/dist/MSlider-w5214a-W.cjs.map +0 -1
  428. package/dist/MStack-Dt-rWvg3.js +0 -39
  429. package/dist/MStack-Dt-rWvg3.js.map +0 -1
  430. package/dist/MStack-nc6Y_9K3.cjs +0 -2
  431. package/dist/MStack-nc6Y_9K3.cjs.map +0 -1
  432. package/dist/MSubText-B0tXiuAp.js +0 -17
  433. package/dist/MSubText-B0tXiuAp.js.map +0 -1
  434. package/dist/MSubText-C6v6Exa2.cjs +0 -2
  435. package/dist/MSubText-C6v6Exa2.cjs.map +0 -1
  436. package/dist/MSurface-BjE-mL1L.cjs +0 -2
  437. package/dist/MSurface-BjE-mL1L.cjs.map +0 -1
  438. package/dist/MSurface-CpDJCdb5.js +0 -74
  439. package/dist/MSurface-CpDJCdb5.js.map +0 -1
  440. package/dist/MTag-BgOxiahL.cjs +0 -2
  441. package/dist/MTag-BgOxiahL.cjs.map +0 -1
  442. package/dist/MTag-cw3cIGHX.js +0 -41
  443. package/dist/MTag-cw3cIGHX.js.map +0 -1
  444. package/dist/MText-BDI4mdw8.cjs +0 -2
  445. package/dist/MText-BDI4mdw8.cjs.map +0 -1
  446. package/dist/MText-DhbAjtUE.js +0 -45
  447. package/dist/MText-DhbAjtUE.js.map +0 -1
  448. package/dist/MTooltip-BAgHlv5I.cjs +0 -2
  449. package/dist/MTooltip-BAgHlv5I.cjs.map +0 -1
  450. package/dist/MTooltip-CJxvlkOX.js +0 -92
  451. package/dist/MTooltip-CJxvlkOX.js.map +0 -1
  452. package/dist/MTreeView-DsBnYQMT.js +0 -315
  453. package/dist/MTreeView-DsBnYQMT.js.map +0 -1
  454. package/dist/MTreeView-LiJ5o-zy.cjs +0 -2
  455. package/dist/MTreeView-LiJ5o-zy.cjs.map +0 -1
  456. package/dist/calendar-Bq6NMNnS.js +0 -193
  457. package/dist/calendar-Bq6NMNnS.js.map +0 -1
  458. package/dist/calendar-C57BH8Nd.cjs +0 -2
  459. package/dist/calendar-C57BH8Nd.cjs.map +0 -1
  460. package/dist/calendarDates-M_Dawj0j.js.map +0 -1
  461. package/dist/calendarDates-qm047RW2.cjs +0 -2
  462. package/dist/calendarDates-qm047RW2.cjs.map +0 -1
  463. package/dist/cards-D4xJVd4q.js +0 -1227
  464. package/dist/cards-D4xJVd4q.js.map +0 -1
  465. package/dist/cards-Du6dbZSQ.cjs +0 -2
  466. package/dist/cards-Du6dbZSQ.cjs.map +0 -1
  467. package/dist/controls-BKoc_yel.js +0 -475
  468. package/dist/controls-BKoc_yel.js.map +0 -1
  469. package/dist/controls-Ck-PMt__.cjs +0 -2
  470. package/dist/controls-Ck-PMt__.cjs.map +0 -1
  471. package/dist/creditCards-D_HwRUBz.cjs +0 -2
  472. package/dist/creditCards-D_HwRUBz.cjs.map +0 -1
  473. package/dist/creditCards-D_iWmtG6.js.map +0 -1
  474. package/dist/data-CdQximqm.js +0 -689
  475. package/dist/data-CdQximqm.js.map +0 -1
  476. package/dist/data-PS4ygCyj.cjs +0 -2
  477. package/dist/data-PS4ygCyj.cjs.map +0 -1
  478. package/dist/dateUtils-CUY6CRCf.js.map +0 -1
  479. package/dist/dateUtils-Dq1vaA-D.cjs +0 -2
  480. package/dist/dateUtils-Dq1vaA-D.cjs.map +0 -1
  481. package/dist/display-YC1fVpXA.js +0 -782
  482. package/dist/display-YC1fVpXA.js.map +0 -1
  483. package/dist/display-slIo1bQI.cjs +0 -3
  484. package/dist/display-slIo1bQI.cjs.map +0 -1
  485. package/dist/dropdowns-DFbUoZ8Q.cjs +0 -2
  486. package/dist/dropdowns-DFbUoZ8Q.cjs.map +0 -1
  487. package/dist/dropdowns-nW3MY5XG.js +0 -1715
  488. package/dist/dropdowns-nW3MY5XG.js.map +0 -1
  489. package/dist/feedback-6MNb2Xyk.cjs +0 -2
  490. package/dist/feedback-6MNb2Xyk.cjs.map +0 -1
  491. package/dist/feedback-CPwJaQHY.js +0 -259
  492. package/dist/feedback-CPwJaQHY.js.map +0 -1
  493. package/dist/form-CMsZo6Dm.cjs +0 -2
  494. package/dist/form-CMsZo6Dm.cjs.map +0 -1
  495. package/dist/form-WU6DcQGD.js +0 -164
  496. package/dist/form-WU6DcQGD.js.map +0 -1
  497. package/dist/frameworkTexts-BSXUtXOp.cjs +0 -2
  498. package/dist/frameworkTexts-BSXUtXOp.cjs.map +0 -1
  499. package/dist/frameworkTexts-DP5RUl19.js +0 -131
  500. package/dist/frameworkTexts-DP5RUl19.js.map +0 -1
  501. package/dist/icons-CBMl-kOM.js.map +0 -1
  502. package/dist/icons-D3n9-919.cjs +0 -2
  503. package/dist/icons-D3n9-919.cjs.map +0 -1
  504. package/dist/inputs-B7rGMLMr.js +0 -1753
  505. package/dist/inputs-B7rGMLMr.js.map +0 -1
  506. package/dist/inputs-BiN62hgH.cjs +0 -2
  507. package/dist/inputs-BiN62hgH.cjs.map +0 -1
  508. package/dist/layout-BMggJ_qO.cjs +0 -2
  509. package/dist/layout-BMggJ_qO.cjs.map +0 -1
  510. package/dist/layout-DBYHyCTr.js +0 -883
  511. package/dist/layout-DBYHyCTr.js.map +0 -1
  512. package/dist/licensing-Be3g-PJt.cjs +0 -2
  513. package/dist/licensing-Be3g-PJt.cjs.map +0 -1
  514. package/dist/licensing-f5KYVz7D.js.map +0 -1
  515. package/dist/media-BPzMgzqE.js +0 -405
  516. package/dist/media-BPzMgzqE.js.map +0 -1
  517. package/dist/media-D63hxCAJ.cjs +0 -2
  518. package/dist/media-D63hxCAJ.cjs.map +0 -1
  519. package/dist/overlays-CCeYD6hT.js +0 -555
  520. package/dist/overlays-CCeYD6hT.js.map +0 -1
  521. package/dist/overlays-CsRN5OG8.cjs +0 -2
  522. package/dist/overlays-CsRN5OG8.cjs.map +0 -1
  523. package/dist/popoverStack--0r2oJCD.js +0 -44
  524. package/dist/popoverStack--0r2oJCD.js.map +0 -1
  525. package/dist/popoverStack-BmMk-VZJ.cjs +0 -2
  526. package/dist/popoverStack-BmMk-VZJ.cjs.map +0 -1
  527. package/dist/theme-CJuqObWL.cjs +0 -2
  528. package/dist/theme-CJuqObWL.cjs.map +0 -1
  529. package/dist/theme-DAOU1aPs.js.map +0 -1
  530. package/dist/useGhostText-DG0bzcao.js +0 -68
  531. package/dist/useGhostText-DG0bzcao.js.map +0 -1
  532. package/dist/useGhostText-mibV4s1-.cjs +0 -2
  533. package/dist/useGhostText-mibV4s1-.cjs.map +0 -1
  534. package/dist/useKeyboardNav-CCUoRMgm.cjs +0 -2
  535. package/dist/useKeyboardNav-CCUoRMgm.cjs.map +0 -1
  536. package/dist/useKeyboardNav-iEXOdEMB.js +0 -43
  537. package/dist/useKeyboardNav-iEXOdEMB.js.map +0 -1
  538. package/dist/useModalLayer-Bf4TcEz-.js +0 -58
  539. package/dist/useModalLayer-Bf4TcEz-.js.map +0 -1
  540. package/dist/useModalLayer-DxYhhgRO.cjs +0 -2
  541. package/dist/useModalLayer-DxYhhgRO.cjs.map +0 -1
  542. package/dist/utils/proActivationWarning.d.ts +0 -7
  543. package/dist/validators-B6yWdsu2.cjs +0 -2
  544. package/dist/validators-B6yWdsu2.cjs.map +0 -1
  545. package/dist/validators-DVYOtFnw.js.map +0 -1
@@ -0,0 +1,240 @@
1
+ import { useCallback as e, useEffect as t, useId as n, useMemo as r, useRef as i, useState as a } from "react";
2
+ //#region src/utils/useDebounce.ts
3
+ function o(e, n) {
4
+ let [r, i] = a(e);
5
+ return t(() => {
6
+ let t = setTimeout(() => i(e), n);
7
+ return () => clearTimeout(t);
8
+ }, [e, n]), r;
9
+ }
10
+ function s(t, n) {
11
+ let r = i(t);
12
+ r.current = t;
13
+ let a = i(null);
14
+ return e(((...e) => {
15
+ a.current && clearTimeout(a.current), a.current = setTimeout(() => r.current(...e), n);
16
+ }), [n]);
17
+ }
18
+ //#endregion
19
+ //#region src/utils/useKeyboardNav.ts
20
+ var c = 500;
21
+ function l(e) {
22
+ return e.replace(/[^a-zA-Z0-9_-]/g, "");
23
+ }
24
+ function u({ itemCount: r, onSelect: o, onClose: s, isOpen: u = !0, loop: d = !0, mode: f = "none", orientation: p = "vertical", rtl: m = !1, isItemDisabled: h, getItemLabel: g, selectOnSpace: _ = !1, idPrefix: v, initialIndex: y = -1 }) {
25
+ let [b, x] = a(y), S = n(), C = v ?? `m-kbnav-${l(S)}`, w = i([]), T = i(!1), E = i({
26
+ buffer: "",
27
+ timer: null
28
+ }), D = e(() => x(-1), []), O = e((e) => h ? h(e) : !1, [h]), k = e(() => {
29
+ for (let e = 0; e < r; e++) if (!O(e)) return e;
30
+ return -1;
31
+ }, [r, O]), A = e(() => {
32
+ for (let e = r - 1; e >= 0; e--) if (!O(e)) return e;
33
+ return -1;
34
+ }, [r, O]), j = e((e, t) => {
35
+ if (t === 1) {
36
+ for (let t = e + 1; t < r; t++) if (!O(t)) return t;
37
+ if (!d) return e;
38
+ let t = k();
39
+ return t === -1 ? e : t;
40
+ }
41
+ for (let t = Math.min(e, r) - 1; t >= 0; t--) if (!O(t)) return t;
42
+ if (!d) return e === -1 ? k() : e;
43
+ let n = A();
44
+ return n === -1 ? e : n;
45
+ }, [
46
+ r,
47
+ O,
48
+ d,
49
+ k,
50
+ A
51
+ ]), M = e((e) => {
52
+ T.current = !0, x(e);
53
+ }, []);
54
+ t(() => {
55
+ if (f !== "roving" || !T.current) return;
56
+ T.current = !1;
57
+ let e = w.current[b];
58
+ e && typeof e.focus == "function" && e !== e.ownerDocument.activeElement && e.focus();
59
+ }, [f, b]), t(() => {
60
+ if (f !== "activedescendant" || !u || b < 0) return;
61
+ let e = w.current[b];
62
+ e && typeof e.scrollIntoView == "function" && e.scrollIntoView({ block: "nearest" });
63
+ }, [
64
+ f,
65
+ u,
66
+ b
67
+ ]), t(() => {
68
+ let e = E.current;
69
+ return () => {
70
+ e.timer && clearTimeout(e.timer);
71
+ };
72
+ }, []);
73
+ let N = e((e) => {
74
+ if (!g || r === 0) return !1;
75
+ let t = E.current;
76
+ t.timer && clearTimeout(t.timer), t.buffer += e.toLowerCase(), t.timer = setTimeout(() => {
77
+ t.buffer = "", t.timer = null;
78
+ }, c);
79
+ let n = t.buffer, i = n.length > 1 && n.split("").every((e) => e === n[0]) ? n[0] : n, a = +(i.length === 1), o = b < 0 ? 0 : b;
80
+ for (let e = 0; e < r; e++) {
81
+ let t = (o + a + e) % r;
82
+ if (!O(t) && (g(t) ?? "").trim().toLowerCase().startsWith(i)) return M(t), !0;
83
+ }
84
+ return !1;
85
+ }, [
86
+ g,
87
+ r,
88
+ b,
89
+ O,
90
+ M
91
+ ]), P = e((e) => {
92
+ if (!u || r === 0) return;
93
+ let t = p !== "horizontal", n = p !== "vertical", i = e.key;
94
+ if (n && m && (i === "ArrowLeft" || i === "ArrowRight") && (i = i === "ArrowLeft" ? "ArrowRight" : "ArrowLeft"), i === "ArrowDown" && t || i === "ArrowRight" && n) {
95
+ e.preventDefault(), M((e) => j(e, 1));
96
+ return;
97
+ }
98
+ if (i === "ArrowUp" && t || i === "ArrowLeft" && n) {
99
+ e.preventDefault(), M((e) => j(e, -1));
100
+ return;
101
+ }
102
+ switch (i) {
103
+ case "Enter":
104
+ e.preventDefault(), b >= 0 && b < r && !O(b) && o?.(b);
105
+ return;
106
+ case "Escape":
107
+ if (!s) return;
108
+ e.preventDefault(), s();
109
+ return;
110
+ case "Home":
111
+ e.preventDefault(), M(k());
112
+ return;
113
+ case "End":
114
+ e.preventDefault(), M(A());
115
+ return;
116
+ }
117
+ if (i === " " && _ && !E.current.buffer) {
118
+ e.preventDefault(), b >= 0 && b < r && !O(b) && o?.(b);
119
+ return;
120
+ }
121
+ if (g && i.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {
122
+ if (i === " " && !E.current.buffer) return;
123
+ N(i) && f === "roving" && e.preventDefault();
124
+ }
125
+ }, [
126
+ u,
127
+ r,
128
+ p,
129
+ m,
130
+ b,
131
+ o,
132
+ s,
133
+ _,
134
+ g,
135
+ f,
136
+ M,
137
+ j,
138
+ O,
139
+ k,
140
+ A,
141
+ N
142
+ ]), F = e((e) => `${C}-item-${e}`, [C]), I = f === "activedescendant" && u && b >= 0 && b < r ? F(b) : void 0, L = b >= 0 && b < r && !O(b) ? b : k(), R = e((e) => {
143
+ if (e < 0 || e >= r) return;
144
+ M(e);
145
+ let t = w.current[e];
146
+ t && typeof t.focus == "function" && t.focus();
147
+ }, [r, M]);
148
+ return {
149
+ activeIndex: b,
150
+ setActiveIndex: x,
151
+ resetIndex: D,
152
+ onKeyDown: P,
153
+ activeDescendantId: I,
154
+ getItemId: F,
155
+ getItemProps: e((e) => {
156
+ let t = (t) => {
157
+ w.current[e] = t;
158
+ };
159
+ return f === "roving" ? {
160
+ id: F(e),
161
+ tabIndex: e === L ? 0 : -1,
162
+ ref: t,
163
+ onFocus: () => {
164
+ O(e) || x(e);
165
+ }
166
+ } : {
167
+ id: F(e),
168
+ ref: t
169
+ };
170
+ }, [
171
+ f,
172
+ F,
173
+ L,
174
+ O
175
+ ]),
176
+ getContainerProps: e(() => f === "activedescendant" ? {
177
+ onKeyDown: P,
178
+ "aria-activedescendant": I
179
+ } : { onKeyDown: P }, [
180
+ f,
181
+ P,
182
+ I
183
+ ]),
184
+ focusItem: R
185
+ };
186
+ }
187
+ //#endregion
188
+ //#region src/utils/useGhostText.ts
189
+ function d(e) {
190
+ return typeof e == "string" ? e : String(e);
191
+ }
192
+ function f(e, t, n) {
193
+ if (!t) return [];
194
+ let r = t.toLowerCase();
195
+ return e.filter((e) => n(e).toLowerCase().startsWith(r));
196
+ }
197
+ function p({ options: t, value: n, minChars: i = 2, getLabel: o = d, filter: s }) {
198
+ let [c, l] = a(0), [u, p] = a(null), m = r(() => n.length < i ? [] : s ? s(t, n) : f(t, n, o), [
199
+ t,
200
+ n,
201
+ i,
202
+ s,
203
+ o
204
+ ]), h = m.length > 0 ? m[c % m.length] : null, g = h ? o(h) : "", _ = u !== n && g && g.toLowerCase().startsWith(n.toLowerCase()) ? g.slice(n.length) : "", v = e(() => !_ || !h ? {
205
+ value: n,
206
+ option: null
207
+ } : {
208
+ value: n + _,
209
+ option: h
210
+ }, [
211
+ _,
212
+ h,
213
+ n
214
+ ]), y = e(() => {
215
+ m.length > 1 && l((e) => (e + 1) % m.length);
216
+ }, [m.length]), b = e(() => {
217
+ m.length > 1 && l((e) => (e - 1 + m.length) % m.length);
218
+ }, [m.length]), x = e(() => {
219
+ l(0), p(null);
220
+ }, []), S = e((e) => (e.key === "Tab" || e.key === "Enter") && _ ? (e.preventDefault(), !0) : e.key === "Escape" && _ ? (e.preventDefault(), p(n), !1) : e.key === "ArrowDown" && _ && m.length > 1 ? (e.preventDefault(), y(), !1) : e.key === "ArrowUp" && _ && m.length > 1 ? (e.preventDefault(), b(), !1) : !1, [
221
+ _,
222
+ n,
223
+ m.length,
224
+ y,
225
+ b
226
+ ]);
227
+ return {
228
+ hint: _,
229
+ accept: v,
230
+ next: y,
231
+ prev: b,
232
+ reset: x,
233
+ matchCount: m.length,
234
+ onKeyDown: S
235
+ };
236
+ }
237
+ //#endregion
238
+ export { s as i, u as n, o as r, p as t };
239
+
240
+ //# sourceMappingURL=useGhostText-CKsb8Ufa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGhostText-CKsb8Ufa.js","names":[],"sources":["../src/utils/useDebounce.ts","../src/utils/useKeyboardNav.ts","../src/utils/useGhostText.ts"],"sourcesContent":["import {useState, useEffect, useRef, useCallback} from 'react'\n\n// Expose a value only after it stays stable for the given delay.\nexport function useDebounce<T>(value: T, delay: number): T {\n const [debounced, setDebounced] = useState(value)\n\n useEffect(() => {\n const timer = setTimeout(() => setDebounced(value), delay)\n return () => clearTimeout(timer)\n }, [value, delay])\n\n return debounced\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n// Wrap a callback so repeated calls collapse into the latest invocation.\nexport function useDebouncedCallback<T extends (...args: any[]) => void>(callback: T, delay: number): T {\n const callbackRef = useRef(callback)\n callbackRef.current = callback\n const timerRef = useRef<ReturnType<typeof setTimeout>>(null)\n\n return useCallback(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ((...args: any[]) => {\n if (timerRef.current) clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => callbackRef.current(...args), delay)\n }) as T,\n [delay]\n )\n}\n","import {useState, useCallback, useEffect, useId, useRef, type FocusEvent, type KeyboardEvent} from 'react'\n\n/**\n * Focus-management strategy (WAI-ARIA APG \"Managing focus within components\"):\n * - `none` (default) — the hook only tracks `activeIndex`; the caller renders the highlight itself.\n * - `activedescendant` — DOM focus stays on the container / input; the active item is exposed via\n * `aria-activedescendant` (combobox, listbox, grid with a focused host).\n * - `roving` — exactly one item has `tabIndex=0`, the rest `-1`; arrow keys move real DOM focus\n * (menu, toolbar, tablist, tree, radio group).\n */\nexport type UseKeyboardNavMode = 'none' | 'activedescendant' | 'roving'\n\n/** Which arrow keys move the active item. */\nexport type UseKeyboardNavOrientation = 'vertical' | 'horizontal' | 'both'\n\nexport interface UseKeyboardNavOptions {\n itemCount: number\n /** Called on Enter (and Space when `selectOnSpace`) with the active index. */\n onSelect?: (index: number) => void\n /** Called on Escape. When omitted Escape is not handled, so it can bubble to an outer layer. */\n onClose?: () => void\n /** Keys are ignored while `false`. Defaults to `true`. */\n isOpen?: boolean\n loop?: boolean\n /** Focus strategy. Defaults to `'none'` (the original behaviour). */\n mode?: UseKeyboardNavMode\n /** Defaults to `'vertical'` (ArrowUp / ArrowDown). */\n orientation?: UseKeyboardNavOrientation\n /** Flip ArrowLeft / ArrowRight for right-to-left layouts. */\n rtl?: boolean\n /** Disabled items are skipped by arrows, Home / End and typeahead, and are never selected. */\n isItemDisabled?: (index: number) => boolean\n /** Enables first-letter typeahead (APG) when provided. */\n getItemLabel?: (index: number) => string\n /** Treat Space like Enter (menus, toolbars, listboxes without a text input). */\n selectOnSpace?: boolean\n /** Prefix for generated item ids. Defaults to a `useId()` based value. */\n idPrefix?: string\n /** Initial active index. Defaults to `-1` (nothing active). */\n initialIndex?: number\n}\n\nexport interface UseKeyboardNavItemProps {\n id: string\n tabIndex?: number\n ref?: (el: HTMLElement | null) => void\n onFocus?: (e: FocusEvent<HTMLElement>) => void\n}\n\nexport interface UseKeyboardNavContainerProps {\n onKeyDown: (e: KeyboardEvent) => void\n 'aria-activedescendant'?: string\n}\n\nconst TYPEAHEAD_RESET_MS = 500\n\nfunction sanitizeId(value: string) {\n return value.replace(/[^a-zA-Z0-9_-]/g, '')\n}\n\n// Provide arrow-key navigation and selection state for list-like widgets.\nexport function useKeyboardNav({\n itemCount,\n onSelect,\n onClose,\n isOpen = true,\n loop = true,\n mode = 'none',\n orientation = 'vertical',\n rtl = false,\n isItemDisabled,\n getItemLabel,\n selectOnSpace = false,\n idPrefix,\n initialIndex = -1,\n}: UseKeyboardNavOptions) {\n const [activeIndex, setActiveIndex] = useState(initialIndex)\n const reactId = useId()\n const prefix = idPrefix ?? `m-kbnav-${sanitizeId(reactId)}`\n const itemRefs = useRef<(HTMLElement | null)[]>([])\n const focusPendingRef = useRef(false)\n const typeaheadRef = useRef<{buffer: string; timer: ReturnType<typeof setTimeout> | null}>({\n buffer: '',\n timer: null,\n })\n\n // Reset highlight state when the owning widget closes or clears results.\n const resetIndex = useCallback(() => setActiveIndex(-1), [])\n\n const isDisabled = useCallback(\n (index: number) => (isItemDisabled ? isItemDisabled(index) : false),\n [isItemDisabled]\n )\n\n const firstEnabled = useCallback(() => {\n for (let i = 0; i < itemCount; i++) if (!isDisabled(i)) return i\n return -1\n }, [itemCount, isDisabled])\n\n const lastEnabled = useCallback(() => {\n for (let i = itemCount - 1; i >= 0; i--) if (!isDisabled(i)) return i\n return -1\n }, [itemCount, isDisabled])\n\n // Step to the next enabled item in `dir`, honouring `loop`. Returns `prev` when nothing qualifies.\n const step = useCallback(\n (prev: number, dir: 1 | -1) => {\n if (dir === 1) {\n for (let i = prev + 1; i < itemCount; i++) if (!isDisabled(i)) return i\n if (!loop) return prev\n const first = firstEnabled()\n return first === -1 ? prev : first\n }\n for (let i = Math.min(prev, itemCount) - 1; i >= 0; i--) if (!isDisabled(i)) return i\n if (!loop) return prev === -1 ? firstEnabled() : prev\n const last = lastEnabled()\n return last === -1 ? prev : last\n },\n [itemCount, isDisabled, loop, firstEnabled, lastEnabled]\n )\n\n const moveTo = useCallback((next: number | ((prev: number) => number)) => {\n focusPendingRef.current = true\n setActiveIndex(next)\n }, [])\n\n // Roving mode: move real DOM focus after a keyboard-driven index change.\n useEffect(() => {\n if (mode !== 'roving' || !focusPendingRef.current) return\n focusPendingRef.current = false\n const el = itemRefs.current[activeIndex]\n if (el && typeof el.focus === 'function' && el !== el.ownerDocument.activeElement) el.focus()\n }, [mode, activeIndex])\n\n // Active-descendant mode: keep the virtually focused option visible inside scroll containers.\n useEffect(() => {\n if (mode !== 'activedescendant' || !isOpen || activeIndex < 0) return\n const el = itemRefs.current[activeIndex]\n if (el && typeof el.scrollIntoView === 'function') el.scrollIntoView({block: 'nearest'})\n }, [mode, isOpen, activeIndex])\n\n useEffect(() => {\n const state = typeaheadRef.current\n return () => {\n if (state.timer) clearTimeout(state.timer)\n }\n }, [])\n\n const handleTypeahead = useCallback(\n (char: string) => {\n if (!getItemLabel || itemCount === 0) return false\n const state = typeaheadRef.current\n if (state.timer) clearTimeout(state.timer)\n state.buffer += char.toLowerCase()\n state.timer = setTimeout(() => {\n state.buffer = ''\n state.timer = null\n }, TYPEAHEAD_RESET_MS)\n\n // Repeating the same letter cycles through matches; a longer prefix refines from the current item.\n const buffer = state.buffer\n const sameChar = buffer.length > 1 && buffer.split('').every((c) => c === buffer[0])\n const search = sameChar ? buffer[0] : buffer\n const startOffset = search.length === 1 ? 1 : 0\n const start = activeIndex < 0 ? 0 : activeIndex\n for (let n = 0; n < itemCount; n++) {\n const i = (start + startOffset + n) % itemCount\n if (isDisabled(i)) continue\n const label = (getItemLabel(i) ?? '').trim().toLowerCase()\n if (label.startsWith(search)) {\n moveTo(i)\n return true\n }\n }\n return false\n },\n [getItemLabel, itemCount, activeIndex, isDisabled, moveTo]\n )\n\n const onKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (!isOpen || itemCount === 0) return\n\n const vertical = orientation !== 'horizontal'\n const horizontal = orientation !== 'vertical'\n let key = e.key\n if (horizontal && rtl && (key === 'ArrowLeft' || key === 'ArrowRight')) {\n key = key === 'ArrowLeft' ? 'ArrowRight' : 'ArrowLeft'\n }\n\n if ((key === 'ArrowDown' && vertical) || (key === 'ArrowRight' && horizontal)) {\n e.preventDefault()\n moveTo((prev) => step(prev, 1))\n return\n }\n if ((key === 'ArrowUp' && vertical) || (key === 'ArrowLeft' && horizontal)) {\n e.preventDefault()\n moveTo((prev) => step(prev, -1))\n return\n }\n\n switch (key) {\n case 'Enter': {\n e.preventDefault()\n if (activeIndex >= 0 && activeIndex < itemCount && !isDisabled(activeIndex)) {\n onSelect?.(activeIndex)\n }\n return\n }\n case 'Escape': {\n if (!onClose) return\n e.preventDefault()\n onClose()\n return\n }\n case 'Home': {\n e.preventDefault()\n moveTo(firstEnabled())\n return\n }\n case 'End': {\n e.preventDefault()\n moveTo(lastEnabled())\n return\n }\n }\n\n if (key === ' ' && selectOnSpace && !typeaheadRef.current.buffer) {\n e.preventDefault()\n if (activeIndex >= 0 && activeIndex < itemCount && !isDisabled(activeIndex)) {\n onSelect?.(activeIndex)\n }\n return\n }\n\n if (getItemLabel && key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {\n if (key === ' ' && !typeaheadRef.current.buffer) return\n if (handleTypeahead(key) && mode === 'roving') e.preventDefault()\n }\n },\n [\n isOpen,\n itemCount,\n orientation,\n rtl,\n activeIndex,\n onSelect,\n onClose,\n selectOnSpace,\n getItemLabel,\n mode,\n moveTo,\n step,\n isDisabled,\n firstEnabled,\n lastEnabled,\n handleTypeahead,\n ]\n )\n\n const getItemId = useCallback((index: number) => `${prefix}-item-${index}`, [prefix])\n\n const activeDescendantId =\n mode === 'activedescendant' && isOpen && activeIndex >= 0 && activeIndex < itemCount\n ? getItemId(activeIndex)\n : undefined\n\n // Roving: the tab stop is the active item, falling back to the first enabled one.\n const tabStopIndex =\n activeIndex >= 0 && activeIndex < itemCount && !isDisabled(activeIndex) ? activeIndex : firstEnabled()\n\n const focusItem = useCallback(\n (index: number) => {\n if (index < 0 || index >= itemCount) return\n moveTo(index)\n const el = itemRefs.current[index]\n if (el && typeof el.focus === 'function') el.focus()\n },\n [itemCount, moveTo]\n )\n\n const getItemProps = useCallback(\n (index: number): UseKeyboardNavItemProps => {\n const ref = (el: HTMLElement | null) => {\n itemRefs.current[index] = el\n }\n if (mode === 'roving') {\n return {\n id: getItemId(index),\n tabIndex: index === tabStopIndex ? 0 : -1,\n ref,\n onFocus: () => {\n if (!isDisabled(index)) setActiveIndex(index)\n },\n }\n }\n return {id: getItemId(index), ref}\n },\n [mode, getItemId, tabStopIndex, isDisabled]\n )\n\n const getContainerProps = useCallback(\n (): UseKeyboardNavContainerProps =>\n mode === 'activedescendant' ? {onKeyDown, 'aria-activedescendant': activeDescendantId} : {onKeyDown},\n [mode, onKeyDown, activeDescendantId]\n )\n\n return {\n activeIndex,\n setActiveIndex,\n resetIndex,\n onKeyDown,\n activeDescendantId,\n getItemId,\n getItemProps,\n getContainerProps,\n focusItem,\n }\n}\n\nexport type UseKeyboardNavResult = ReturnType<typeof useKeyboardNav>\n","import {useState, useCallback, useMemo} from 'react'\nimport type * as React from 'react'\n\nexport interface GhostTextOptions<T = string> {\n options: T[]\n value: string\n minChars?: number\n getLabel?: (option: T) => string\n filter?: (options: T[], input: string) => T[]\n}\n\nexport interface GhostTextReturn<T = string> {\n /** The ghost suffix to render after the typed text. */\n hint: string\n /** Accept the current hint and return the full value. */\n accept: () => {value: string; option: T | null}\n /** Cycle to the next matching option. */\n next: () => void\n /** Cycle to the previous matching option. */\n prev: () => void\n /** Reset the hint index (call on value change). */\n reset: () => void\n /** Number of matching options. */\n matchCount: number\n /** Handle keyboard events — Tab/Enter accept, arrows cycle (only while a hint is shown), Escape hides the hint\n * until the value changes. */\n onKeyDown: (e: React.KeyboardEvent) => boolean\n}\n\nfunction defaultGetLabel<T>(option: T): string {\n return typeof option === 'string' ? option : String(option)\n}\n\nfunction defaultFilter<T>(options: T[], input: string, getLabel: (o: T) => string): T[] {\n if (!input) return []\n const lower = input.toLowerCase()\n return options.filter((o) => getLabel(o).toLowerCase().startsWith(lower))\n}\n\n// Manage inline ghost-text suggestions for any text input.\nexport function useGhostText<T = string>({\n options,\n value,\n minChars = 2,\n getLabel = defaultGetLabel,\n filter,\n}: GhostTextOptions<T>): GhostTextReturn<T> {\n const [hintIndex, setHintIndex] = useState(0)\n // Value for which the user dismissed the hint with Escape; typing anything else shows hints again.\n const [dismissedFor, setDismissedFor] = useState<string | null>(null)\n\n const filtered = useMemo(() => {\n if (value.length < minChars) return []\n if (filter) return filter(options, value)\n return defaultFilter(options, value, getLabel)\n }, [options, value, minChars, filter, getLabel])\n\n const current = filtered.length > 0 ? filtered[hintIndex % filtered.length] : null\n const fullLabel = current ? getLabel(current) : ''\n const hint =\n dismissedFor !== value && fullLabel && fullLabel.toLowerCase().startsWith(value.toLowerCase())\n ? fullLabel.slice(value.length)\n : ''\n\n const accept = useCallback(() => {\n if (!hint || !current) return {value, option: null}\n return {value: value + hint, option: current}\n }, [hint, current, value])\n\n const next = useCallback(() => {\n if (filtered.length > 1) setHintIndex((i) => (i + 1) % filtered.length)\n }, [filtered.length])\n\n const prev = useCallback(() => {\n if (filtered.length > 1) setHintIndex((i) => (i - 1 + filtered.length) % filtered.length)\n }, [filtered.length])\n\n const reset = useCallback(() => {\n setHintIndex(0)\n setDismissedFor(null)\n }, [])\n\n const onKeyDown = useCallback(\n (e: React.KeyboardEvent): boolean => {\n if ((e.key === 'Tab' || e.key === 'Enter') && hint) {\n e.preventDefault()\n return true // signal: caller should accept\n }\n if (e.key === 'Escape' && hint) {\n e.preventDefault()\n setDismissedFor(value)\n return false\n }\n // Arrows only cycle a visible hint; otherwise they keep moving the caret (e.g. in a textarea).\n if (e.key === 'ArrowDown' && hint && filtered.length > 1) {\n e.preventDefault()\n next()\n return false\n }\n if (e.key === 'ArrowUp' && hint && filtered.length > 1) {\n e.preventDefault()\n prev()\n return false\n }\n return false\n },\n [hint, value, filtered.length, next, prev]\n )\n\n return {hint, accept, next, prev, reset, matchCount: filtered.length, onKeyDown}\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ require(`./core-w629c4ND.cjs`);let e=require(`react`);function t(t,n){let[r,i]=(0,e.useState)(t);return(0,e.useEffect)(()=>{let e=setTimeout(()=>i(t),n);return()=>clearTimeout(e)},[t,n]),r}function n(t,n){let r=(0,e.useRef)(t);r.current=t;let i=(0,e.useRef)(null);return(0,e.useCallback)(((...e)=>{i.current&&clearTimeout(i.current),i.current=setTimeout(()=>r.current(...e),n)}),[n])}var r=500;function i(e){return e.replace(/[^a-zA-Z0-9_-]/g,``)}function a({itemCount:t,onSelect:n,onClose:a,isOpen:o=!0,loop:s=!0,mode:c=`none`,orientation:l=`vertical`,rtl:u=!1,isItemDisabled:d,getItemLabel:f,selectOnSpace:p=!1,idPrefix:m,initialIndex:h=-1}){let[g,_]=(0,e.useState)(h),v=(0,e.useId)(),y=m??`m-kbnav-${i(v)}`,b=(0,e.useRef)([]),x=(0,e.useRef)(!1),S=(0,e.useRef)({buffer:``,timer:null}),C=(0,e.useCallback)(()=>_(-1),[]),w=(0,e.useCallback)(e=>d?d(e):!1,[d]),T=(0,e.useCallback)(()=>{for(let e=0;e<t;e++)if(!w(e))return e;return-1},[t,w]),E=(0,e.useCallback)(()=>{for(let e=t-1;e>=0;e--)if(!w(e))return e;return-1},[t,w]),D=(0,e.useCallback)((e,n)=>{if(n===1){for(let n=e+1;n<t;n++)if(!w(n))return n;if(!s)return e;let n=T();return n===-1?e:n}for(let n=Math.min(e,t)-1;n>=0;n--)if(!w(n))return n;if(!s)return e===-1?T():e;let r=E();return r===-1?e:r},[t,w,s,T,E]),O=(0,e.useCallback)(e=>{x.current=!0,_(e)},[]);(0,e.useEffect)(()=>{if(c!==`roving`||!x.current)return;x.current=!1;let e=b.current[g];e&&typeof e.focus==`function`&&e!==e.ownerDocument.activeElement&&e.focus()},[c,g]),(0,e.useEffect)(()=>{if(c!==`activedescendant`||!o||g<0)return;let e=b.current[g];e&&typeof e.scrollIntoView==`function`&&e.scrollIntoView({block:`nearest`})},[c,o,g]),(0,e.useEffect)(()=>{let e=S.current;return()=>{e.timer&&clearTimeout(e.timer)}},[]);let k=(0,e.useCallback)(e=>{if(!f||t===0)return!1;let n=S.current;n.timer&&clearTimeout(n.timer),n.buffer+=e.toLowerCase(),n.timer=setTimeout(()=>{n.buffer=``,n.timer=null},r);let i=n.buffer,a=i.length>1&&i.split(``).every(e=>e===i[0])?i[0]:i,o=+(a.length===1),s=g<0?0:g;for(let e=0;e<t;e++){let n=(s+o+e)%t;if(!w(n)&&(f(n)??``).trim().toLowerCase().startsWith(a))return O(n),!0}return!1},[f,t,g,w,O]),A=(0,e.useCallback)(e=>{if(!o||t===0)return;let r=l!==`horizontal`,i=l!==`vertical`,s=e.key;if(i&&u&&(s===`ArrowLeft`||s===`ArrowRight`)&&(s=s===`ArrowLeft`?`ArrowRight`:`ArrowLeft`),s===`ArrowDown`&&r||s===`ArrowRight`&&i){e.preventDefault(),O(e=>D(e,1));return}if(s===`ArrowUp`&&r||s===`ArrowLeft`&&i){e.preventDefault(),O(e=>D(e,-1));return}switch(s){case`Enter`:e.preventDefault(),g>=0&&g<t&&!w(g)&&n?.(g);return;case`Escape`:if(!a)return;e.preventDefault(),a();return;case`Home`:e.preventDefault(),O(T());return;case`End`:e.preventDefault(),O(E());return}if(s===` `&&p&&!S.current.buffer){e.preventDefault(),g>=0&&g<t&&!w(g)&&n?.(g);return}if(f&&s.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey){if(s===` `&&!S.current.buffer)return;k(s)&&c===`roving`&&e.preventDefault()}},[o,t,l,u,g,n,a,p,f,c,O,D,w,T,E,k]),j=(0,e.useCallback)(e=>`${y}-item-${e}`,[y]),M=c===`activedescendant`&&o&&g>=0&&g<t?j(g):void 0,N=g>=0&&g<t&&!w(g)?g:T(),P=(0,e.useCallback)(e=>{if(e<0||e>=t)return;O(e);let n=b.current[e];n&&typeof n.focus==`function`&&n.focus()},[t,O]);return{activeIndex:g,setActiveIndex:_,resetIndex:C,onKeyDown:A,activeDescendantId:M,getItemId:j,getItemProps:(0,e.useCallback)(e=>{let t=t=>{b.current[e]=t};return c===`roving`?{id:j(e),tabIndex:e===N?0:-1,ref:t,onFocus:()=>{w(e)||_(e)}}:{id:j(e),ref:t}},[c,j,N,w]),getContainerProps:(0,e.useCallback)(()=>c===`activedescendant`?{onKeyDown:A,"aria-activedescendant":M}:{onKeyDown:A},[c,A,M]),focusItem:P}}function o(e){return typeof e==`string`?e:String(e)}function s(e,t,n){if(!t)return[];let r=t.toLowerCase();return e.filter(e=>n(e).toLowerCase().startsWith(r))}function c({options:t,value:n,minChars:r=2,getLabel:i=o,filter:a}){let[c,l]=(0,e.useState)(0),[u,d]=(0,e.useState)(null),f=(0,e.useMemo)(()=>n.length<r?[]:a?a(t,n):s(t,n,i),[t,n,r,a,i]),p=f.length>0?f[c%f.length]:null,m=p?i(p):``,h=u!==n&&m&&m.toLowerCase().startsWith(n.toLowerCase())?m.slice(n.length):``,g=(0,e.useCallback)(()=>!h||!p?{value:n,option:null}:{value:n+h,option:p},[h,p,n]),_=(0,e.useCallback)(()=>{f.length>1&&l(e=>(e+1)%f.length)},[f.length]),v=(0,e.useCallback)(()=>{f.length>1&&l(e=>(e-1+f.length)%f.length)},[f.length]),y=(0,e.useCallback)(()=>{l(0),d(null)},[]),b=(0,e.useCallback)(e=>(e.key===`Tab`||e.key===`Enter`)&&h?(e.preventDefault(),!0):e.key===`Escape`&&h?(e.preventDefault(),d(n),!1):e.key===`ArrowDown`&&h&&f.length>1?(e.preventDefault(),_(),!1):e.key===`ArrowUp`&&h&&f.length>1?(e.preventDefault(),v(),!1):!1,[h,n,f.length,_,v]);return{hint:h,accept:g,next:_,prev:v,reset:y,matchCount:f.length,onKeyDown:b}}Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return c}});
2
+ //# sourceMappingURL=useGhostText-DO-tfxS0.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGhostText-DO-tfxS0.cjs","names":[],"sources":["../src/utils/useDebounce.ts","../src/utils/useKeyboardNav.ts","../src/utils/useGhostText.ts"],"sourcesContent":["import {useState, useEffect, useRef, useCallback} from 'react'\n\n// Expose a value only after it stays stable for the given delay.\nexport function useDebounce<T>(value: T, delay: number): T {\n const [debounced, setDebounced] = useState(value)\n\n useEffect(() => {\n const timer = setTimeout(() => setDebounced(value), delay)\n return () => clearTimeout(timer)\n }, [value, delay])\n\n return debounced\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n// Wrap a callback so repeated calls collapse into the latest invocation.\nexport function useDebouncedCallback<T extends (...args: any[]) => void>(callback: T, delay: number): T {\n const callbackRef = useRef(callback)\n callbackRef.current = callback\n const timerRef = useRef<ReturnType<typeof setTimeout>>(null)\n\n return useCallback(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ((...args: any[]) => {\n if (timerRef.current) clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => callbackRef.current(...args), delay)\n }) as T,\n [delay]\n )\n}\n","import {useState, useCallback, useEffect, useId, useRef, type FocusEvent, type KeyboardEvent} from 'react'\n\n/**\n * Focus-management strategy (WAI-ARIA APG \"Managing focus within components\"):\n * - `none` (default) — the hook only tracks `activeIndex`; the caller renders the highlight itself.\n * - `activedescendant` — DOM focus stays on the container / input; the active item is exposed via\n * `aria-activedescendant` (combobox, listbox, grid with a focused host).\n * - `roving` — exactly one item has `tabIndex=0`, the rest `-1`; arrow keys move real DOM focus\n * (menu, toolbar, tablist, tree, radio group).\n */\nexport type UseKeyboardNavMode = 'none' | 'activedescendant' | 'roving'\n\n/** Which arrow keys move the active item. */\nexport type UseKeyboardNavOrientation = 'vertical' | 'horizontal' | 'both'\n\nexport interface UseKeyboardNavOptions {\n itemCount: number\n /** Called on Enter (and Space when `selectOnSpace`) with the active index. */\n onSelect?: (index: number) => void\n /** Called on Escape. When omitted Escape is not handled, so it can bubble to an outer layer. */\n onClose?: () => void\n /** Keys are ignored while `false`. Defaults to `true`. */\n isOpen?: boolean\n loop?: boolean\n /** Focus strategy. Defaults to `'none'` (the original behaviour). */\n mode?: UseKeyboardNavMode\n /** Defaults to `'vertical'` (ArrowUp / ArrowDown). */\n orientation?: UseKeyboardNavOrientation\n /** Flip ArrowLeft / ArrowRight for right-to-left layouts. */\n rtl?: boolean\n /** Disabled items are skipped by arrows, Home / End and typeahead, and are never selected. */\n isItemDisabled?: (index: number) => boolean\n /** Enables first-letter typeahead (APG) when provided. */\n getItemLabel?: (index: number) => string\n /** Treat Space like Enter (menus, toolbars, listboxes without a text input). */\n selectOnSpace?: boolean\n /** Prefix for generated item ids. Defaults to a `useId()` based value. */\n idPrefix?: string\n /** Initial active index. Defaults to `-1` (nothing active). */\n initialIndex?: number\n}\n\nexport interface UseKeyboardNavItemProps {\n id: string\n tabIndex?: number\n ref?: (el: HTMLElement | null) => void\n onFocus?: (e: FocusEvent<HTMLElement>) => void\n}\n\nexport interface UseKeyboardNavContainerProps {\n onKeyDown: (e: KeyboardEvent) => void\n 'aria-activedescendant'?: string\n}\n\nconst TYPEAHEAD_RESET_MS = 500\n\nfunction sanitizeId(value: string) {\n return value.replace(/[^a-zA-Z0-9_-]/g, '')\n}\n\n// Provide arrow-key navigation and selection state for list-like widgets.\nexport function useKeyboardNav({\n itemCount,\n onSelect,\n onClose,\n isOpen = true,\n loop = true,\n mode = 'none',\n orientation = 'vertical',\n rtl = false,\n isItemDisabled,\n getItemLabel,\n selectOnSpace = false,\n idPrefix,\n initialIndex = -1,\n}: UseKeyboardNavOptions) {\n const [activeIndex, setActiveIndex] = useState(initialIndex)\n const reactId = useId()\n const prefix = idPrefix ?? `m-kbnav-${sanitizeId(reactId)}`\n const itemRefs = useRef<(HTMLElement | null)[]>([])\n const focusPendingRef = useRef(false)\n const typeaheadRef = useRef<{buffer: string; timer: ReturnType<typeof setTimeout> | null}>({\n buffer: '',\n timer: null,\n })\n\n // Reset highlight state when the owning widget closes or clears results.\n const resetIndex = useCallback(() => setActiveIndex(-1), [])\n\n const isDisabled = useCallback(\n (index: number) => (isItemDisabled ? isItemDisabled(index) : false),\n [isItemDisabled]\n )\n\n const firstEnabled = useCallback(() => {\n for (let i = 0; i < itemCount; i++) if (!isDisabled(i)) return i\n return -1\n }, [itemCount, isDisabled])\n\n const lastEnabled = useCallback(() => {\n for (let i = itemCount - 1; i >= 0; i--) if (!isDisabled(i)) return i\n return -1\n }, [itemCount, isDisabled])\n\n // Step to the next enabled item in `dir`, honouring `loop`. Returns `prev` when nothing qualifies.\n const step = useCallback(\n (prev: number, dir: 1 | -1) => {\n if (dir === 1) {\n for (let i = prev + 1; i < itemCount; i++) if (!isDisabled(i)) return i\n if (!loop) return prev\n const first = firstEnabled()\n return first === -1 ? prev : first\n }\n for (let i = Math.min(prev, itemCount) - 1; i >= 0; i--) if (!isDisabled(i)) return i\n if (!loop) return prev === -1 ? firstEnabled() : prev\n const last = lastEnabled()\n return last === -1 ? prev : last\n },\n [itemCount, isDisabled, loop, firstEnabled, lastEnabled]\n )\n\n const moveTo = useCallback((next: number | ((prev: number) => number)) => {\n focusPendingRef.current = true\n setActiveIndex(next)\n }, [])\n\n // Roving mode: move real DOM focus after a keyboard-driven index change.\n useEffect(() => {\n if (mode !== 'roving' || !focusPendingRef.current) return\n focusPendingRef.current = false\n const el = itemRefs.current[activeIndex]\n if (el && typeof el.focus === 'function' && el !== el.ownerDocument.activeElement) el.focus()\n }, [mode, activeIndex])\n\n // Active-descendant mode: keep the virtually focused option visible inside scroll containers.\n useEffect(() => {\n if (mode !== 'activedescendant' || !isOpen || activeIndex < 0) return\n const el = itemRefs.current[activeIndex]\n if (el && typeof el.scrollIntoView === 'function') el.scrollIntoView({block: 'nearest'})\n }, [mode, isOpen, activeIndex])\n\n useEffect(() => {\n const state = typeaheadRef.current\n return () => {\n if (state.timer) clearTimeout(state.timer)\n }\n }, [])\n\n const handleTypeahead = useCallback(\n (char: string) => {\n if (!getItemLabel || itemCount === 0) return false\n const state = typeaheadRef.current\n if (state.timer) clearTimeout(state.timer)\n state.buffer += char.toLowerCase()\n state.timer = setTimeout(() => {\n state.buffer = ''\n state.timer = null\n }, TYPEAHEAD_RESET_MS)\n\n // Repeating the same letter cycles through matches; a longer prefix refines from the current item.\n const buffer = state.buffer\n const sameChar = buffer.length > 1 && buffer.split('').every((c) => c === buffer[0])\n const search = sameChar ? buffer[0] : buffer\n const startOffset = search.length === 1 ? 1 : 0\n const start = activeIndex < 0 ? 0 : activeIndex\n for (let n = 0; n < itemCount; n++) {\n const i = (start + startOffset + n) % itemCount\n if (isDisabled(i)) continue\n const label = (getItemLabel(i) ?? '').trim().toLowerCase()\n if (label.startsWith(search)) {\n moveTo(i)\n return true\n }\n }\n return false\n },\n [getItemLabel, itemCount, activeIndex, isDisabled, moveTo]\n )\n\n const onKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (!isOpen || itemCount === 0) return\n\n const vertical = orientation !== 'horizontal'\n const horizontal = orientation !== 'vertical'\n let key = e.key\n if (horizontal && rtl && (key === 'ArrowLeft' || key === 'ArrowRight')) {\n key = key === 'ArrowLeft' ? 'ArrowRight' : 'ArrowLeft'\n }\n\n if ((key === 'ArrowDown' && vertical) || (key === 'ArrowRight' && horizontal)) {\n e.preventDefault()\n moveTo((prev) => step(prev, 1))\n return\n }\n if ((key === 'ArrowUp' && vertical) || (key === 'ArrowLeft' && horizontal)) {\n e.preventDefault()\n moveTo((prev) => step(prev, -1))\n return\n }\n\n switch (key) {\n case 'Enter': {\n e.preventDefault()\n if (activeIndex >= 0 && activeIndex < itemCount && !isDisabled(activeIndex)) {\n onSelect?.(activeIndex)\n }\n return\n }\n case 'Escape': {\n if (!onClose) return\n e.preventDefault()\n onClose()\n return\n }\n case 'Home': {\n e.preventDefault()\n moveTo(firstEnabled())\n return\n }\n case 'End': {\n e.preventDefault()\n moveTo(lastEnabled())\n return\n }\n }\n\n if (key === ' ' && selectOnSpace && !typeaheadRef.current.buffer) {\n e.preventDefault()\n if (activeIndex >= 0 && activeIndex < itemCount && !isDisabled(activeIndex)) {\n onSelect?.(activeIndex)\n }\n return\n }\n\n if (getItemLabel && key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {\n if (key === ' ' && !typeaheadRef.current.buffer) return\n if (handleTypeahead(key) && mode === 'roving') e.preventDefault()\n }\n },\n [\n isOpen,\n itemCount,\n orientation,\n rtl,\n activeIndex,\n onSelect,\n onClose,\n selectOnSpace,\n getItemLabel,\n mode,\n moveTo,\n step,\n isDisabled,\n firstEnabled,\n lastEnabled,\n handleTypeahead,\n ]\n )\n\n const getItemId = useCallback((index: number) => `${prefix}-item-${index}`, [prefix])\n\n const activeDescendantId =\n mode === 'activedescendant' && isOpen && activeIndex >= 0 && activeIndex < itemCount\n ? getItemId(activeIndex)\n : undefined\n\n // Roving: the tab stop is the active item, falling back to the first enabled one.\n const tabStopIndex =\n activeIndex >= 0 && activeIndex < itemCount && !isDisabled(activeIndex) ? activeIndex : firstEnabled()\n\n const focusItem = useCallback(\n (index: number) => {\n if (index < 0 || index >= itemCount) return\n moveTo(index)\n const el = itemRefs.current[index]\n if (el && typeof el.focus === 'function') el.focus()\n },\n [itemCount, moveTo]\n )\n\n const getItemProps = useCallback(\n (index: number): UseKeyboardNavItemProps => {\n const ref = (el: HTMLElement | null) => {\n itemRefs.current[index] = el\n }\n if (mode === 'roving') {\n return {\n id: getItemId(index),\n tabIndex: index === tabStopIndex ? 0 : -1,\n ref,\n onFocus: () => {\n if (!isDisabled(index)) setActiveIndex(index)\n },\n }\n }\n return {id: getItemId(index), ref}\n },\n [mode, getItemId, tabStopIndex, isDisabled]\n )\n\n const getContainerProps = useCallback(\n (): UseKeyboardNavContainerProps =>\n mode === 'activedescendant' ? {onKeyDown, 'aria-activedescendant': activeDescendantId} : {onKeyDown},\n [mode, onKeyDown, activeDescendantId]\n )\n\n return {\n activeIndex,\n setActiveIndex,\n resetIndex,\n onKeyDown,\n activeDescendantId,\n getItemId,\n getItemProps,\n getContainerProps,\n focusItem,\n }\n}\n\nexport type UseKeyboardNavResult = ReturnType<typeof useKeyboardNav>\n","import {useState, useCallback, useMemo} from 'react'\nimport type * as React from 'react'\n\nexport interface GhostTextOptions<T = string> {\n options: T[]\n value: string\n minChars?: number\n getLabel?: (option: T) => string\n filter?: (options: T[], input: string) => T[]\n}\n\nexport interface GhostTextReturn<T = string> {\n /** The ghost suffix to render after the typed text. */\n hint: string\n /** Accept the current hint and return the full value. */\n accept: () => {value: string; option: T | null}\n /** Cycle to the next matching option. */\n next: () => void\n /** Cycle to the previous matching option. */\n prev: () => void\n /** Reset the hint index (call on value change). */\n reset: () => void\n /** Number of matching options. */\n matchCount: number\n /** Handle keyboard events — Tab/Enter accept, arrows cycle (only while a hint is shown), Escape hides the hint\n * until the value changes. */\n onKeyDown: (e: React.KeyboardEvent) => boolean\n}\n\nfunction defaultGetLabel<T>(option: T): string {\n return typeof option === 'string' ? option : String(option)\n}\n\nfunction defaultFilter<T>(options: T[], input: string, getLabel: (o: T) => string): T[] {\n if (!input) return []\n const lower = input.toLowerCase()\n return options.filter((o) => getLabel(o).toLowerCase().startsWith(lower))\n}\n\n// Manage inline ghost-text suggestions for any text input.\nexport function useGhostText<T = string>({\n options,\n value,\n minChars = 2,\n getLabel = defaultGetLabel,\n filter,\n}: GhostTextOptions<T>): GhostTextReturn<T> {\n const [hintIndex, setHintIndex] = useState(0)\n // Value for which the user dismissed the hint with Escape; typing anything else shows hints again.\n const [dismissedFor, setDismissedFor] = useState<string | null>(null)\n\n const filtered = useMemo(() => {\n if (value.length < minChars) return []\n if (filter) return filter(options, value)\n return defaultFilter(options, value, getLabel)\n }, [options, value, minChars, filter, getLabel])\n\n const current = filtered.length > 0 ? filtered[hintIndex % filtered.length] : null\n const fullLabel = current ? getLabel(current) : ''\n const hint =\n dismissedFor !== value && fullLabel && fullLabel.toLowerCase().startsWith(value.toLowerCase())\n ? fullLabel.slice(value.length)\n : ''\n\n const accept = useCallback(() => {\n if (!hint || !current) return {value, option: null}\n return {value: value + hint, option: current}\n }, [hint, current, value])\n\n const next = useCallback(() => {\n if (filtered.length > 1) setHintIndex((i) => (i + 1) % filtered.length)\n }, [filtered.length])\n\n const prev = useCallback(() => {\n if (filtered.length > 1) setHintIndex((i) => (i - 1 + filtered.length) % filtered.length)\n }, [filtered.length])\n\n const reset = useCallback(() => {\n setHintIndex(0)\n setDismissedFor(null)\n }, [])\n\n const onKeyDown = useCallback(\n (e: React.KeyboardEvent): boolean => {\n if ((e.key === 'Tab' || e.key === 'Enter') && hint) {\n e.preventDefault()\n return true // signal: caller should accept\n }\n if (e.key === 'Escape' && hint) {\n e.preventDefault()\n setDismissedFor(value)\n return false\n }\n // Arrows only cycle a visible hint; otherwise they keep moving the caret (e.g. in a textarea).\n if (e.key === 'ArrowDown' && hint && filtered.length > 1) {\n e.preventDefault()\n next()\n return false\n }\n if (e.key === 'ArrowUp' && hint && filtered.length > 1) {\n e.preventDefault()\n prev()\n return false\n }\n return false\n },\n [hint, value, filtered.length, next, prev]\n )\n\n return {hint, accept, next, prev, reset, matchCount: filtered.length, onKeyDown}\n}\n"],"mappings":"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"}
@@ -0,0 +1,128 @@
1
+ import { useEffect as e, useRef as t } from "react";
2
+ import { createPortal as n } from "react-dom";
3
+ //#region src/components/primitives/MPortal/MPortal.tsx
4
+ function r({ children: e, container: t }) {
5
+ let r = t ?? (typeof document < "u" ? document.body : null);
6
+ return r ? n(e, r) : null;
7
+ }
8
+ //#endregion
9
+ //#region src/components/primitives/MPopover/popoverStack.ts
10
+ var i = [], a = 1;
11
+ function o() {
12
+ return a++;
13
+ }
14
+ function s(e) {
15
+ return i.push(e), () => {
16
+ let t = i.indexOf(e);
17
+ t !== -1 && i.splice(t, 1);
18
+ };
19
+ }
20
+ function c() {
21
+ return i.length > 0;
22
+ }
23
+ function l(e) {
24
+ let t = e.getAnchorEl();
25
+ if (!t) return null;
26
+ for (let n of i) {
27
+ if (n.id === e.id) continue;
28
+ let r = n.getPopoverEl();
29
+ if (r && r.contains(t)) return n.id;
30
+ }
31
+ return null;
32
+ }
33
+ function u(e, t) {
34
+ if (!t) return !1;
35
+ for (let n of i) {
36
+ if (n.id === e) continue;
37
+ let r = n.getPopoverEl();
38
+ if (!r || !r.contains(t)) continue;
39
+ let a = /* @__PURE__ */ new Set(), o = l(n);
40
+ for (; o !== null && !a.has(o);) {
41
+ if (o === e) return !0;
42
+ a.add(o);
43
+ let t = i.find((e) => e.id === o);
44
+ o = t ? l(t) : null;
45
+ }
46
+ }
47
+ return !1;
48
+ }
49
+ function d(e) {
50
+ for (let t of i) {
51
+ if (t.id === e) continue;
52
+ let n = /* @__PURE__ */ new Set(), r = l(t);
53
+ for (; r !== null && !n.has(r);) {
54
+ if (r === e) return !0;
55
+ n.add(r);
56
+ let t = i.find((e) => e.id === r);
57
+ r = t ? l(t) : null;
58
+ }
59
+ }
60
+ return !1;
61
+ }
62
+ function f(e) {
63
+ for (let t = i.length - 1; t >= 0; t--) {
64
+ let n = i[t];
65
+ if (!d(n.id)) return n.id === e;
66
+ }
67
+ return !1;
68
+ }
69
+ //#endregion
70
+ //#region src/utils/useModalLayer.ts
71
+ var p = [], m = [
72
+ "a[href]",
73
+ "area[href]",
74
+ "button:not([disabled])",
75
+ "input:not([disabled]):not([type=\"hidden\"])",
76
+ "select:not([disabled])",
77
+ "textarea:not([disabled])",
78
+ "iframe",
79
+ "audio[controls]",
80
+ "video[controls]",
81
+ "[contenteditable]:not([contenteditable=\"false\"])",
82
+ "[tabindex]:not([tabindex=\"-1\"])"
83
+ ].join(",");
84
+ function h(e) {
85
+ return Array.from(e.querySelectorAll(m)).filter((e) => !e.closest("[inert]") && (typeof e.checkVisibility == "function" ? e.checkVisibility() : !0));
86
+ }
87
+ function g(e) {
88
+ return h(e).filter((e) => e.tabIndex >= 0);
89
+ }
90
+ function _({ active: n, containerRef: r, onEscape: i }) {
91
+ let a = t(i);
92
+ e(() => {
93
+ a.current = i;
94
+ }, [i]), e(() => {
95
+ if (!n || typeof document > "u") return;
96
+ let e = {};
97
+ p.push(e);
98
+ let t = () => p[p.length - 1] === e, i = document.activeElement instanceof HTMLElement ? document.activeElement : null, o = r.current, s = o?.querySelector("[role=\"dialog\"]") ?? o;
99
+ s && !s.contains(document.activeElement) && (s.hasAttribute("tabindex") || s.setAttribute("tabindex", "-1"), (s.querySelector("[autofocus], [data-autofocus]") ?? s).focus({ preventScroll: !0 }));
100
+ let l = (e) => {
101
+ if (!t() || e.defaultPrevented) return;
102
+ if (e.key === "Escape") {
103
+ if (c() || !a.current) return;
104
+ a.current();
105
+ return;
106
+ }
107
+ if (e.key !== "Tab" || !s) return;
108
+ let n = document.activeElement;
109
+ if (n && !s.contains(n) && n.closest(".popover")) return;
110
+ let r = h(s);
111
+ if (r.length === 0) {
112
+ e.preventDefault(), s.focus({ preventScroll: !0 });
113
+ return;
114
+ }
115
+ let i = r[0], o = r[r.length - 1], l = !n || !s.contains(n) || n === s;
116
+ e.shiftKey && (l || n === i) ? (e.preventDefault(), o.focus()) : !e.shiftKey && (l || n === o) && (e.preventDefault(), i.focus());
117
+ };
118
+ return document.addEventListener("keydown", l), () => {
119
+ document.removeEventListener("keydown", l);
120
+ let t = p.indexOf(e);
121
+ t !== -1 && p.splice(t, 1), i && i.isConnected && i.focus({ preventScroll: !0 });
122
+ };
123
+ }, [n, r]);
124
+ }
125
+ //#endregion
126
+ export { f as a, r as c, u as i, g as n, o, _ as r, s, h as t };
127
+
128
+ //# sourceMappingURL=useModalLayer-CpOPSDbf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useModalLayer-CpOPSDbf.js","names":[],"sources":["../src/components/primitives/MPortal/MPortal.tsx","../src/components/primitives/MPopover/popoverStack.ts","../src/utils/useModalLayer.ts"],"sourcesContent":["import {createPortal} from 'react-dom'\nimport type {MPortalProps} from './MPortal.types'\n\n// Mount children into a detached DOM target while defaulting to document.body.\nexport function MPortal({children, container}: MPortalProps) {\n const target = container ?? (typeof document !== 'undefined' ? document.body : null)\n if (!target) return null\n return createPortal(children, target)\n}\n","/**\n * Registry of currently-open MPopover instances.\n *\n * Every popover portals its content to `document.body`, so a popover opened\n * from inside another popover is NOT a DOM descendant of its parent. That\n * breaks the naive outside-click test (`parent.contains(target)`): pressing a\n * nested dropdown item looks like an outside click to the parent, the parent\n * closes, React unmounts the nested menu mid-gesture, and the browser never\n * gets to fire `click` because mousedown and mouseup landed on different\n * elements. The action silently does nothing.\n *\n * This registry restores the nesting relation the DOM lost. Nesting is derived\n * from where each popover's ANCHOR lives, not from open order: a popover whose\n * anchor sits inside another popover's element is that popover's child. Open\n * order would misclassify two independent popovers that happen to be open at\n * the same time — clicking the newer one must still close the older one.\n */\n\nexport interface PopoverRegistration {\n id: number\n getPopoverEl: () => HTMLElement | null\n getAnchorEl: () => HTMLElement | null\n}\n\nconst registrations: PopoverRegistration[] = []\nlet nextId = 1\n\nexport function nextPopoverId(): number {\n return nextId++\n}\n\nexport function registerPopover(registration: PopoverRegistration): () => void {\n registrations.push(registration)\n return () => {\n const index = registrations.indexOf(registration)\n if (index !== -1) registrations.splice(index, 1)\n }\n}\n\n/** True while any popover is open — modal layers leave Escape to it. */\nexport function hasOpenPopovers(): boolean {\n return registrations.length > 0\n}\n\n/** The registered popover whose element contains `entry`'s anchor, if any. */\nfunction parentIdOf(entry: PopoverRegistration): number | null {\n const anchor = entry.getAnchorEl()\n if (!anchor) return null\n\n for (const other of registrations) {\n if (other.id === entry.id) continue\n const element = other.getPopoverEl()\n if (element && element.contains(anchor)) return other.id\n }\n\n return null\n}\n\n/**\n * True when `target` lies inside a popover that is nested (at any depth) within\n * the popover identified by `id`. Callers use it to keep a parent open while\n * the interaction belongs to one of its descendants.\n */\nexport function isInsideDescendantPopover(id: number, target: Node | null): boolean {\n if (!target) return false\n\n for (const entry of registrations) {\n if (entry.id === id) continue\n\n const element = entry.getPopoverEl()\n if (!element || !element.contains(target)) continue\n\n // Walk the ancestor chain of the popover that was actually hit.\n // `seen` guards against a cycle if a malformed tree ever produces one.\n const seen = new Set<number>()\n let cursor = parentIdOf(entry)\n\n while (cursor !== null && !seen.has(cursor)) {\n if (cursor === id) return true\n seen.add(cursor)\n const parent = registrations.find((candidate) => candidate.id === cursor)\n cursor = parent ? parentIdOf(parent) : null\n }\n }\n\n return false\n}\n\n/** True when the popover identified by `id` has an open popover nested inside it. */\nfunction hasDescendant(id: number): boolean {\n for (const entry of registrations) {\n if (entry.id === id) continue\n\n const seen = new Set<number>()\n let cursor = parentIdOf(entry)\n while (cursor !== null && !seen.has(cursor)) {\n if (cursor === id) return true\n seen.add(cursor)\n const parent = registrations.find((candidate) => candidate.id === cursor)\n cursor = parent ? parentIdOf(parent) : null\n }\n }\n\n return false\n}\n\n/**\n * True when the popover identified by `id` is the top layer: the most recently\n * opened popover that has no open popover nested inside it. Only the top layer\n * reacts to Escape, so one key press peels off exactly one layer.\n */\nexport function isTopPopover(id: number): boolean {\n for (let index = registrations.length - 1; index >= 0; index--) {\n const entry = registrations[index]\n if (hasDescendant(entry.id)) continue\n return entry.id === id\n }\n\n return false\n}\n\n/** Test-only helper — the registry is module state that outlives a render. */\nexport function __resetPopoverStack(): void {\n registrations.length = 0\n nextId = 1\n}\n","import {useEffect, useRef} from 'react'\nimport type {RefObject} from 'react'\nimport {hasOpenPopovers} from '../components/primitives/MPopover/popoverStack'\n\n/**\n * Shared behaviour of blocking overlays (MModal, MDrawer, MSheet, MMediaLightbox).\n *\n * Open layers form a stack, so with a drawer opened from a modal only the top one\n * reacts to Escape and owns the Tab cycle. Focus moves into the dialog on open,\n * stays inside it while it is the top layer and returns to the opener on close.\n */\n\nconst layers: object[] = []\n\nconst FOCUSABLE = [\n 'a[href]',\n 'area[href]',\n 'button:not([disabled])',\n 'input:not([disabled]):not([type=\"hidden\"])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n 'iframe',\n 'audio[controls]',\n 'video[controls]',\n '[contenteditable]:not([contenteditable=\"false\"])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(',')\n\n/** Focusable, visible descendants of `container` in DOM order (shared with MPopover). */\nexport function getFocusable(container: HTMLElement): HTMLElement[] {\n return Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE)).filter(\n (element) =>\n !element.closest('[inert]') &&\n (typeof element.checkVisibility === 'function' ? element.checkVisibility() : true)\n )\n}\n\n/** Like `getFocusable`, minus elements taken out of the Tab order (`tabindex=\"-1\"`, e.g. roving items). */\nexport function getTabbable(container: HTMLElement): HTMLElement[] {\n return getFocusable(container).filter((element) => element.tabIndex >= 0)\n}\n\nexport interface UseModalLayerOptions {\n /** True while the overlay is mounted and open (not while it animates out). */\n active: boolean\n /** Element wrapping the whole overlay; the dialog is the `[role=\"dialog\"]` inside it. */\n containerRef: RefObject<HTMLElement | null>\n /** Called on Escape when this is the top layer. Omit to ignore Escape. */\n onEscape?: () => void\n}\n\nexport function useModalLayer({active, containerRef, onEscape}: UseModalLayerOptions): void {\n const onEscapeRef = useRef(onEscape)\n useEffect(() => {\n onEscapeRef.current = onEscape\n }, [onEscape])\n\n useEffect(() => {\n if (!active || typeof document === 'undefined') return\n\n const token = {}\n layers.push(token)\n const isTop = () => layers[layers.length - 1] === token\n\n const opener = document.activeElement instanceof HTMLElement ? document.activeElement : null\n const container = containerRef.current\n const dialog = container?.querySelector<HTMLElement>('[role=\"dialog\"]') ?? container\n\n if (dialog && !dialog.contains(document.activeElement)) {\n if (!dialog.hasAttribute('tabindex')) dialog.setAttribute('tabindex', '-1')\n const preferred = dialog.querySelector<HTMLElement>('[autofocus], [data-autofocus]')\n ;(preferred ?? dialog).focus({preventScroll: true})\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!isTop() || event.defaultPrevented) return\n\n if (event.key === 'Escape') {\n // An open select/menu inside the dialog closes first.\n if (hasOpenPopovers() || !onEscapeRef.current) return\n onEscapeRef.current()\n return\n }\n\n if (event.key !== 'Tab' || !dialog) return\n\n const activeElement = document.activeElement as HTMLElement | null\n // Popovers portal outside the dialog; leave their own Tab handling alone.\n if (activeElement && !dialog.contains(activeElement) && activeElement.closest('.popover')) return\n\n const focusable = getFocusable(dialog)\n if (focusable.length === 0) {\n event.preventDefault()\n dialog.focus({preventScroll: true})\n return\n }\n\n const first = focusable[0]\n const last = focusable[focusable.length - 1]\n const outside = !activeElement || !dialog.contains(activeElement) || activeElement === dialog\n\n if (event.shiftKey && (outside || activeElement === first)) {\n event.preventDefault()\n last.focus()\n } else if (!event.shiftKey && (outside || activeElement === last)) {\n event.preventDefault()\n first.focus()\n }\n }\n\n document.addEventListener('keydown', handleKeyDown)\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown)\n const index = layers.indexOf(token)\n if (index !== -1) layers.splice(index, 1)\n if (opener && opener.isConnected) opener.focus({preventScroll: true})\n }\n }, [active, containerRef])\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ require(`./core-w629c4ND.cjs`);let e=require(`react`),t=require(`react-dom`);function n({children:e,container:n}){let r=n??(typeof document<`u`?document.body:null);return r?(0,t.createPortal)(e,r):null}var r=[],i=1;function a(){return i++}function o(e){return r.push(e),()=>{let t=r.indexOf(e);t!==-1&&r.splice(t,1)}}function s(){return r.length>0}function c(e){let t=e.getAnchorEl();if(!t)return null;for(let n of r){if(n.id===e.id)continue;let r=n.getPopoverEl();if(r&&r.contains(t))return n.id}return null}function l(e,t){if(!t)return!1;for(let n of r){if(n.id===e)continue;let i=n.getPopoverEl();if(!i||!i.contains(t))continue;let a=new Set,o=c(n);for(;o!==null&&!a.has(o);){if(o===e)return!0;a.add(o);let t=r.find(e=>e.id===o);o=t?c(t):null}}return!1}function u(e){for(let t of r){if(t.id===e)continue;let n=new Set,i=c(t);for(;i!==null&&!n.has(i);){if(i===e)return!0;n.add(i);let t=r.find(e=>e.id===i);i=t?c(t):null}}return!1}function d(e){for(let t=r.length-1;t>=0;t--){let n=r[t];if(!u(n.id))return n.id===e}return!1}var f=[],p=[`a[href]`,`area[href]`,`button:not([disabled])`,`input:not([disabled]):not([type="hidden"])`,`select:not([disabled])`,`textarea:not([disabled])`,`iframe`,`audio[controls]`,`video[controls]`,`[contenteditable]:not([contenteditable="false"])`,`[tabindex]:not([tabindex="-1"])`].join(`,`);function m(e){return Array.from(e.querySelectorAll(p)).filter(e=>!e.closest(`[inert]`)&&(typeof e.checkVisibility==`function`?e.checkVisibility():!0))}function h(e){return m(e).filter(e=>e.tabIndex>=0)}function g({active:t,containerRef:n,onEscape:r}){let i=(0,e.useRef)(r);(0,e.useEffect)(()=>{i.current=r},[r]),(0,e.useEffect)(()=>{if(!t||typeof document>`u`)return;let e={};f.push(e);let r=()=>f[f.length-1]===e,a=document.activeElement instanceof HTMLElement?document.activeElement:null,o=n.current,c=o?.querySelector(`[role="dialog"]`)??o;c&&!c.contains(document.activeElement)&&(c.hasAttribute(`tabindex`)||c.setAttribute(`tabindex`,`-1`),(c.querySelector(`[autofocus], [data-autofocus]`)??c).focus({preventScroll:!0}));let l=e=>{if(!r()||e.defaultPrevented)return;if(e.key===`Escape`){if(s()||!i.current)return;i.current();return}if(e.key!==`Tab`||!c)return;let t=document.activeElement;if(t&&!c.contains(t)&&t.closest(`.popover`))return;let n=m(c);if(n.length===0){e.preventDefault(),c.focus({preventScroll:!0});return}let a=n[0],o=n[n.length-1],l=!t||!c.contains(t)||t===c;e.shiftKey&&(l||t===a)?(e.preventDefault(),o.focus()):!e.shiftKey&&(l||t===o)&&(e.preventDefault(),a.focus())};return document.addEventListener(`keydown`,l),()=>{document.removeEventListener(`keydown`,l);let t=f.indexOf(e);t!==-1&&f.splice(t,1),a&&a.isConnected&&a.focus({preventScroll:!0})}},[t,n])}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return m}});
2
+ //# sourceMappingURL=useModalLayer-Cyt93Prs.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useModalLayer-Cyt93Prs.cjs","names":[],"sources":["../src/components/primitives/MPortal/MPortal.tsx","../src/components/primitives/MPopover/popoverStack.ts","../src/utils/useModalLayer.ts"],"sourcesContent":["import {createPortal} from 'react-dom'\nimport type {MPortalProps} from './MPortal.types'\n\n// Mount children into a detached DOM target while defaulting to document.body.\nexport function MPortal({children, container}: MPortalProps) {\n const target = container ?? (typeof document !== 'undefined' ? document.body : null)\n if (!target) return null\n return createPortal(children, target)\n}\n","/**\n * Registry of currently-open MPopover instances.\n *\n * Every popover portals its content to `document.body`, so a popover opened\n * from inside another popover is NOT a DOM descendant of its parent. That\n * breaks the naive outside-click test (`parent.contains(target)`): pressing a\n * nested dropdown item looks like an outside click to the parent, the parent\n * closes, React unmounts the nested menu mid-gesture, and the browser never\n * gets to fire `click` because mousedown and mouseup landed on different\n * elements. The action silently does nothing.\n *\n * This registry restores the nesting relation the DOM lost. Nesting is derived\n * from where each popover's ANCHOR lives, not from open order: a popover whose\n * anchor sits inside another popover's element is that popover's child. Open\n * order would misclassify two independent popovers that happen to be open at\n * the same time — clicking the newer one must still close the older one.\n */\n\nexport interface PopoverRegistration {\n id: number\n getPopoverEl: () => HTMLElement | null\n getAnchorEl: () => HTMLElement | null\n}\n\nconst registrations: PopoverRegistration[] = []\nlet nextId = 1\n\nexport function nextPopoverId(): number {\n return nextId++\n}\n\nexport function registerPopover(registration: PopoverRegistration): () => void {\n registrations.push(registration)\n return () => {\n const index = registrations.indexOf(registration)\n if (index !== -1) registrations.splice(index, 1)\n }\n}\n\n/** True while any popover is open — modal layers leave Escape to it. */\nexport function hasOpenPopovers(): boolean {\n return registrations.length > 0\n}\n\n/** The registered popover whose element contains `entry`'s anchor, if any. */\nfunction parentIdOf(entry: PopoverRegistration): number | null {\n const anchor = entry.getAnchorEl()\n if (!anchor) return null\n\n for (const other of registrations) {\n if (other.id === entry.id) continue\n const element = other.getPopoverEl()\n if (element && element.contains(anchor)) return other.id\n }\n\n return null\n}\n\n/**\n * True when `target` lies inside a popover that is nested (at any depth) within\n * the popover identified by `id`. Callers use it to keep a parent open while\n * the interaction belongs to one of its descendants.\n */\nexport function isInsideDescendantPopover(id: number, target: Node | null): boolean {\n if (!target) return false\n\n for (const entry of registrations) {\n if (entry.id === id) continue\n\n const element = entry.getPopoverEl()\n if (!element || !element.contains(target)) continue\n\n // Walk the ancestor chain of the popover that was actually hit.\n // `seen` guards against a cycle if a malformed tree ever produces one.\n const seen = new Set<number>()\n let cursor = parentIdOf(entry)\n\n while (cursor !== null && !seen.has(cursor)) {\n if (cursor === id) return true\n seen.add(cursor)\n const parent = registrations.find((candidate) => candidate.id === cursor)\n cursor = parent ? parentIdOf(parent) : null\n }\n }\n\n return false\n}\n\n/** True when the popover identified by `id` has an open popover nested inside it. */\nfunction hasDescendant(id: number): boolean {\n for (const entry of registrations) {\n if (entry.id === id) continue\n\n const seen = new Set<number>()\n let cursor = parentIdOf(entry)\n while (cursor !== null && !seen.has(cursor)) {\n if (cursor === id) return true\n seen.add(cursor)\n const parent = registrations.find((candidate) => candidate.id === cursor)\n cursor = parent ? parentIdOf(parent) : null\n }\n }\n\n return false\n}\n\n/**\n * True when the popover identified by `id` is the top layer: the most recently\n * opened popover that has no open popover nested inside it. Only the top layer\n * reacts to Escape, so one key press peels off exactly one layer.\n */\nexport function isTopPopover(id: number): boolean {\n for (let index = registrations.length - 1; index >= 0; index--) {\n const entry = registrations[index]\n if (hasDescendant(entry.id)) continue\n return entry.id === id\n }\n\n return false\n}\n\n/** Test-only helper — the registry is module state that outlives a render. */\nexport function __resetPopoverStack(): void {\n registrations.length = 0\n nextId = 1\n}\n","import {useEffect, useRef} from 'react'\nimport type {RefObject} from 'react'\nimport {hasOpenPopovers} from '../components/primitives/MPopover/popoverStack'\n\n/**\n * Shared behaviour of blocking overlays (MModal, MDrawer, MSheet, MMediaLightbox).\n *\n * Open layers form a stack, so with a drawer opened from a modal only the top one\n * reacts to Escape and owns the Tab cycle. Focus moves into the dialog on open,\n * stays inside it while it is the top layer and returns to the opener on close.\n */\n\nconst layers: object[] = []\n\nconst FOCUSABLE = [\n 'a[href]',\n 'area[href]',\n 'button:not([disabled])',\n 'input:not([disabled]):not([type=\"hidden\"])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n 'iframe',\n 'audio[controls]',\n 'video[controls]',\n '[contenteditable]:not([contenteditable=\"false\"])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(',')\n\n/** Focusable, visible descendants of `container` in DOM order (shared with MPopover). */\nexport function getFocusable(container: HTMLElement): HTMLElement[] {\n return Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE)).filter(\n (element) =>\n !element.closest('[inert]') &&\n (typeof element.checkVisibility === 'function' ? element.checkVisibility() : true)\n )\n}\n\n/** Like `getFocusable`, minus elements taken out of the Tab order (`tabindex=\"-1\"`, e.g. roving items). */\nexport function getTabbable(container: HTMLElement): HTMLElement[] {\n return getFocusable(container).filter((element) => element.tabIndex >= 0)\n}\n\nexport interface UseModalLayerOptions {\n /** True while the overlay is mounted and open (not while it animates out). */\n active: boolean\n /** Element wrapping the whole overlay; the dialog is the `[role=\"dialog\"]` inside it. */\n containerRef: RefObject<HTMLElement | null>\n /** Called on Escape when this is the top layer. Omit to ignore Escape. */\n onEscape?: () => void\n}\n\nexport function useModalLayer({active, containerRef, onEscape}: UseModalLayerOptions): void {\n const onEscapeRef = useRef(onEscape)\n useEffect(() => {\n onEscapeRef.current = onEscape\n }, [onEscape])\n\n useEffect(() => {\n if (!active || typeof document === 'undefined') return\n\n const token = {}\n layers.push(token)\n const isTop = () => layers[layers.length - 1] === token\n\n const opener = document.activeElement instanceof HTMLElement ? document.activeElement : null\n const container = containerRef.current\n const dialog = container?.querySelector<HTMLElement>('[role=\"dialog\"]') ?? container\n\n if (dialog && !dialog.contains(document.activeElement)) {\n if (!dialog.hasAttribute('tabindex')) dialog.setAttribute('tabindex', '-1')\n const preferred = dialog.querySelector<HTMLElement>('[autofocus], [data-autofocus]')\n ;(preferred ?? dialog).focus({preventScroll: true})\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!isTop() || event.defaultPrevented) return\n\n if (event.key === 'Escape') {\n // An open select/menu inside the dialog closes first.\n if (hasOpenPopovers() || !onEscapeRef.current) return\n onEscapeRef.current()\n return\n }\n\n if (event.key !== 'Tab' || !dialog) return\n\n const activeElement = document.activeElement as HTMLElement | null\n // Popovers portal outside the dialog; leave their own Tab handling alone.\n if (activeElement && !dialog.contains(activeElement) && activeElement.closest('.popover')) return\n\n const focusable = getFocusable(dialog)\n if (focusable.length === 0) {\n event.preventDefault()\n dialog.focus({preventScroll: true})\n return\n }\n\n const first = focusable[0]\n const last = focusable[focusable.length - 1]\n const outside = !activeElement || !dialog.contains(activeElement) || activeElement === dialog\n\n if (event.shiftKey && (outside || activeElement === first)) {\n event.preventDefault()\n last.focus()\n } else if (!event.shiftKey && (outside || activeElement === last)) {\n event.preventDefault()\n first.focus()\n }\n }\n\n document.addEventListener('keydown', handleKeyDown)\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown)\n const index = layers.indexOf(token)\n if (index !== -1) layers.splice(index, 1)\n if (opener && opener.isConnected) opener.focus({preventScroll: true})\n }\n }, [active, containerRef])\n}\n"],"mappings":"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"}
@@ -12,6 +12,11 @@ export declare function isValidDate(value: Date): boolean;
12
12
  export declare function parseHmToMinutes(value?: string): number | null;
13
13
  export declare function startOfDay(date: Date): Date;
14
14
  export declare function stripTime(date: Date): Date;
15
+ /**
16
+ * Calendar day of `value` at local midnight. A date-only string (`yyyy-MM-dd`) is read as a
17
+ * local day — `new Date('2026-09-24')` would read it as UTC midnight, which is the previous
18
+ * day in every UTC−x zone.
19
+ */
15
20
  export declare function normalizeDate(value?: Date | string | null): Date | null;
16
21
  /** Adds calendar days (DST-safe, keeps the wall-clock time). */
17
22
  export declare function addDays(date: Date, amount: number): Date;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Arrow-key target for an APG radio group (roving tabindex, selection follows focus).
3
+ * ArrowRight / ArrowDown move forward, ArrowLeft / ArrowUp move back, both wrap; Home / End jump
4
+ * to the ends. In right-to-left layouts ArrowLeft / ArrowRight are flipped. Returns `null` for
5
+ * keys the group does not handle. Internal helper, not re-exported.
6
+ */
7
+ export declare function getRadioGroupTarget(key: string, index: number, count: number, rtl?: boolean): number | null;
8
+ /** True when the element is laid out right-to-left. */
9
+ export declare function isRtlElement(element: Element | null): boolean;
@@ -0,0 +1,39 @@
1
+ import { KeyboardEvent } from 'react';
2
+ import { CalendarWeekStart } from './calendarDates';
3
+ /**
4
+ * Internal (not re-exported from the package root): WAI-ARIA APG date-grid keyboard model shared
5
+ * by MDatePicker and MDateRangePicker.
6
+ *
7
+ * One roving tab stop across every visible month; arrows move by day / week, PageUp / PageDown by
8
+ * month (Shift: year), Home / End to the edges of the week, Enter / Space select. Moving past the
9
+ * visible months scrolls the view. Unavailable days stay focusable (`aria-disabled`) so the
10
+ * arrows never get stuck, but they are never selected.
11
+ */
12
+ export interface UseDateGridNavOptions {
13
+ /** First visible month (any day inside it). */
14
+ viewMonth: Date;
15
+ /** Number of months rendered side by side. Defaults to 1. */
16
+ monthsShown?: number;
17
+ onViewMonthChange: (month: Date) => void;
18
+ selectedDate: Date | null;
19
+ weekStartsOn: CalendarWeekStart;
20
+ onSelect: (date: Date) => void;
21
+ isDisabled: (date: Date) => boolean;
22
+ /** Called whenever the keyboard moves the focused day (e.g. a range preview). */
23
+ onFocusDate?: (date: Date) => void;
24
+ }
25
+ export interface DateGridCellProps {
26
+ 'data-date': string;
27
+ tabIndex: number;
28
+ ref: (el: HTMLElement | null) => void;
29
+ onFocus: () => void;
30
+ }
31
+ export declare function getDateGridTarget(key: string, current: Date, shiftKey: boolean, weekStartsOn: CalendarWeekStart): Date | null;
32
+ export declare function useDateGridNav({ viewMonth, monthsShown, onViewMonthChange, selectedDate, weekStartsOn, onSelect, isDisabled, onFocusDate, }: UseDateGridNavOptions): {
33
+ tabStop: Date;
34
+ containerRef: import('react').RefObject<HTMLElement | null>;
35
+ tabStopRef: import('react').RefObject<HTMLElement | null>;
36
+ getCellProps: (date: Date) => DateGridCellProps;
37
+ onGridKeyDown: (event: KeyboardEvent) => void;
38
+ focusTabStop: () => void;
39
+ };