@banzamel/mineralui 2.4.2 → 2.5.1

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 (582) 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-BkNf7fzo.js → MButtonGroup-DDnn8Wfy.js} +3 -3
  11. package/dist/{MButtonGroup-BkNf7fzo.js.map → MButtonGroup-DDnn8Wfy.js.map} +1 -1
  12. package/dist/{MButtonGroup-iPv14c0V.cjs → MButtonGroup-Dz8Fm-oA.cjs} +2 -2
  13. package/dist/{MButtonGroup-iPv14c0V.cjs.map → MButtonGroup-Dz8Fm-oA.cjs.map} +1 -1
  14. package/dist/{MCard-DK-_FkpE.cjs → MCard-Bqm4BjK_.cjs} +2 -2
  15. package/dist/MCard-Bqm4BjK_.cjs.map +1 -0
  16. package/dist/{MCard-azpp4YVD.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-DqMnZ7Iv.cjs → MKbd-CnW3NUIu.cjs} +2 -2
  55. package/dist/{MKbd-DqMnZ7Iv.cjs.map → MKbd-CnW3NUIu.cjs.map} +1 -1
  56. package/dist/{MKbd-v6-tJ9sP.js → MKbd-DjfGyajR.js} +2 -2
  57. package/dist/{MKbd-v6-tJ9sP.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-BWKurW6H.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-C5uD4Axo.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/{arduino-BdpdaLwK.cjs → arduino-C1gw-z1N.cjs} +1 -1
  115. package/dist/{arduino-BdpdaLwK.cjs.map → arduino-C1gw-z1N.cjs.map} +1 -1
  116. package/dist/{arduino-DDDlP9Yt.js → arduino-CcVvzDWF.js} +1 -1
  117. package/dist/{arduino-DDDlP9Yt.js.map → arduino-CcVvzDWF.js.map} +1 -1
  118. package/dist/{bash-D8WbAmuA.js → bash-DkMiO80l.js} +1 -1
  119. package/dist/{bash-D8WbAmuA.js.map → bash-DkMiO80l.js.map} +1 -1
  120. package/dist/{bash-eOUFh3S1.cjs → bash-wzZkpJC-.cjs} +1 -1
  121. package/dist/{bash-eOUFh3S1.cjs.map → bash-wzZkpJC-.cjs.map} +1 -1
  122. package/dist/{c-Bur7Mn-u.cjs → c-BSPjDa0P.cjs} +1 -1
  123. package/dist/{c-Bur7Mn-u.cjs.map → c-BSPjDa0P.cjs.map} +1 -1
  124. package/dist/{c-CTKNfUJI.js → c-DtlFV5Pa.js} +1 -1
  125. package/dist/{c-CTKNfUJI.js.map → c-DtlFV5Pa.js.map} +1 -1
  126. package/dist/calendar-2yhnCkGW.cjs +2 -0
  127. package/dist/calendar-2yhnCkGW.cjs.map +1 -0
  128. package/dist/calendar-DcNYDTVb.js +195 -0
  129. package/dist/calendar-DcNYDTVb.js.map +1 -0
  130. package/dist/calendar.cjs +1 -1
  131. package/dist/calendar.js +1 -1
  132. package/dist/{calendarDates-CYkJqcnp.js → calendarDates-Bpw_G_QR.js} +30 -19
  133. package/dist/calendarDates-Bpw_G_QR.js.map +1 -0
  134. package/dist/calendarDates-Cg0nm69Y.cjs +2 -0
  135. package/dist/calendarDates-Cg0nm69Y.cjs.map +1 -0
  136. package/dist/cards-Bp886TRb.cjs +2 -0
  137. package/dist/cards-Bp886TRb.cjs.map +1 -0
  138. package/dist/cards-BvER6Gx0.js +1277 -0
  139. package/dist/cards-BvER6Gx0.js.map +1 -0
  140. package/dist/cards.cjs +1 -1
  141. package/dist/cards.js +2 -2
  142. package/dist/{cn-YER3QsV1.js → cn-CUSXNnjF.js} +1 -1
  143. package/dist/{cn-YER3QsV1.js.map → cn-CUSXNnjF.js.map} +1 -1
  144. package/dist/{cn-CU5TNITO.cjs → cn-DYFxgzi2.cjs} +1 -1
  145. package/dist/{cn-CU5TNITO.cjs.map → cn-DYFxgzi2.cjs.map} +1 -1
  146. package/dist/components/cards/MCardDaySchedule/MCardDaySchedule.d.ts +1 -1
  147. package/dist/components/cards/MCardDocumentTree/MCardDocumentTree.d.ts +1 -1
  148. package/dist/components/cards/MCardGrid/MCardGrid.d.ts +1 -1
  149. package/dist/components/cards/MCardPayment/MCardPayment.d.ts +1 -1
  150. package/dist/components/cards/MCardPayment/MCardPayment.types.d.ts +4 -0
  151. package/dist/components/cards/MCardPaymentMethod/MCardPaymentMethod.d.ts +1 -1
  152. package/dist/components/cards/MStatCard/MStatCard.d.ts +1 -1
  153. package/dist/components/controls/MCheckbox/MCheckbox.types.d.ts +6 -0
  154. package/dist/components/controls/MLoadMore/MLoadMore.d.ts +1 -1
  155. package/dist/components/controls/MSlider/MSlider.d.ts +1 -1
  156. package/dist/components/controls/MSlider/MSlider.types.d.ts +5 -0
  157. package/dist/components/data/MTreeView/MTreeView.d.ts +1 -1
  158. package/dist/components/data/MTreeView/MTreeView.types.d.ts +6 -0
  159. package/dist/components/data/MWeekGrid/MWeekGrid.d.ts +1 -1
  160. package/dist/components/data/MWeekGrid/MWeekGrid.types.d.ts +9 -3
  161. package/dist/components/display/MCodeBlock/MCodeBlock.d.ts +1 -1
  162. package/dist/components/dropdowns/MAutocomplete/MAutocomplete.d.ts +1 -1
  163. package/dist/components/dropdowns/MAutocomplete/MAutocomplete.types.d.ts +8 -2
  164. package/dist/components/dropdowns/MSelect/MSelect.d.ts +1 -1
  165. package/dist/components/dropdowns/shared/TimeColumnListbox.d.ts +20 -0
  166. package/dist/components/feedback/MAlert/MAlert.d.ts +1 -1
  167. package/dist/components/feedback/MBadge/MBadge.d.ts +1 -1
  168. package/dist/components/feedback/MBanner/MBanner.d.ts +1 -1
  169. package/dist/components/feedback/MLoader/MLoader.d.ts +1 -1
  170. package/dist/components/feedback/MSpinner/MSpinner.d.ts +1 -1
  171. package/dist/components/feedback/MTag/MTag.d.ts +1 -1
  172. package/dist/components/inputs/MInput/MInput.types.d.ts +6 -1
  173. package/dist/components/inputs/MInput/useFormatCaret.d.ts +8 -0
  174. package/dist/components/layout/MCanvasGrid/MCanvasGrid.types.d.ts +5 -0
  175. package/dist/components/layout/MContainer/MContainer.d.ts +1 -1
  176. package/dist/components/layout/MDivider/MDivider.d.ts +1 -1
  177. package/dist/components/layout/MFooter/MFooter.d.ts +1 -1
  178. package/dist/components/layout/MHeader/MHeader.d.ts +1 -1
  179. package/dist/components/layout/MInline/MInline.d.ts +1 -1
  180. package/dist/components/layout/MNavbar/MNavbar.d.ts +1 -1
  181. package/dist/components/layout/MNavbar/MNavbar.types.d.ts +2 -0
  182. package/dist/components/layout/MSection/MSection.d.ts +1 -1
  183. package/dist/components/layout/MStack/MStack.d.ts +1 -1
  184. package/dist/components/layout/MStickyPanel/MStickyPanel.types.d.ts +4 -0
  185. package/dist/components/layout/MSurface/MSurface.d.ts +1 -1
  186. package/dist/components/media/MAvatar/MAvatar.d.ts +1 -1
  187. package/dist/components/media/MAvatar/MAvatar.types.d.ts +10 -0
  188. package/dist/components/media/MCarousel/MCarousel.d.ts +1 -1
  189. package/dist/components/media/MImage/MImage.d.ts +1 -1
  190. package/dist/components/media/carouselA11y.d.ts +9 -0
  191. package/dist/components/overlays/MCommandPalette/MCommandPalette.d.ts +1 -1
  192. package/dist/components/overlays/MDropdownMenu/MDropdownMenu.d.ts +4 -2
  193. package/dist/components/overlays/MDropdownMenu/MDropdownMenu.types.d.ts +3 -1
  194. package/dist/components/overlays/MPopconfirm/MPopconfirm.d.ts +1 -1
  195. package/dist/components/overlays/scrollLock.d.ts +14 -0
  196. package/dist/components/primitives/MPopover/MPopover.d.ts +1 -1
  197. package/dist/components/primitives/MPopover/MPopover.types.d.ts +32 -1
  198. package/dist/components/primitives/MPopover/popoverStack.d.ts +8 -0
  199. package/dist/components/typography/MHeading/MHeading.d.ts +2 -3
  200. package/dist/components/typography/MSubText/MSubText.d.ts +1 -1
  201. package/dist/components/typography/MText/MText.d.ts +1 -1
  202. package/dist/controls-B4Dxaab4.js +491 -0
  203. package/dist/controls-B4Dxaab4.js.map +1 -0
  204. package/dist/controls-CyXEIOXD.cjs +2 -0
  205. package/dist/controls-CyXEIOXD.cjs.map +1 -0
  206. package/dist/controls.cjs +1 -1
  207. package/dist/controls.js +5 -5
  208. package/dist/{core-D5-SQcs8.js → core-B8VC-Umz.js} +1 -1
  209. package/dist/{core-D5-SQcs8.js.map → core-B8VC-Umz.js.map} +1 -1
  210. package/dist/{core-D66c1_Wo.cjs → core-w629c4ND.cjs} +1 -1
  211. package/dist/{core-D66c1_Wo.cjs.map → core-w629c4ND.cjs.map} +1 -1
  212. package/dist/{cpp-DAzz2TpY.js → cpp-BraS2arf.js} +1 -1
  213. package/dist/{cpp-DAzz2TpY.js.map → cpp-BraS2arf.js.map} +1 -1
  214. package/dist/{cpp-BMULAf-B.cjs → cpp-LIcuHkFj.cjs} +1 -1
  215. package/dist/{cpp-BMULAf-B.cjs.map → cpp-LIcuHkFj.cjs.map} +1 -1
  216. package/dist/creditCards-Bo2mrc53.cjs +2 -0
  217. package/dist/creditCards-Bo2mrc53.cjs.map +1 -0
  218. package/dist/{creditCards-D_iWmtG6.js → creditCards-DmDOyvcw.js} +20 -31
  219. package/dist/creditCards-DmDOyvcw.js.map +1 -0
  220. package/dist/{css-9M03GzKO.cjs → css-D6fGBtGV.cjs} +1 -1
  221. package/dist/{css-9M03GzKO.cjs.map → css-D6fGBtGV.cjs.map} +1 -1
  222. package/dist/{css-EGOXTWIl.js → css-Dy8pFAWa.js} +1 -1
  223. package/dist/{css-EGOXTWIl.js.map → css-Dy8pFAWa.js.map} +1 -1
  224. package/dist/data-BM3KG8oN.cjs +2 -0
  225. package/dist/data-BM3KG8oN.cjs.map +1 -0
  226. package/dist/data-qnR8OBmj.js +808 -0
  227. package/dist/data-qnR8OBmj.js.map +1 -0
  228. package/dist/data.cjs +1 -1
  229. package/dist/data.js +2 -2
  230. package/dist/{dateUtils-CUY6CRCf.js → dateUtils-B-ToNZq_.js} +5 -6
  231. package/dist/dateUtils-B-ToNZq_.js.map +1 -0
  232. package/dist/dateUtils-z2L7ZaxA.cjs +2 -0
  233. package/dist/dateUtils-z2L7ZaxA.cjs.map +1 -0
  234. package/dist/display-BLMOBofj.cjs +3 -0
  235. package/dist/display-BLMOBofj.cjs.map +1 -0
  236. package/dist/display-Dlb79lkA.js +968 -0
  237. package/dist/display-Dlb79lkA.js.map +1 -0
  238. package/dist/display.cjs +1 -1
  239. package/dist/display.js +2 -2
  240. package/dist/dropdowns-2_7VMEDo.js +2009 -0
  241. package/dist/dropdowns-2_7VMEDo.js.map +1 -0
  242. package/dist/dropdowns-DN7j8J-V.cjs +2 -0
  243. package/dist/dropdowns-DN7j8J-V.cjs.map +1 -0
  244. package/dist/dropdowns.cjs +1 -1
  245. package/dist/dropdowns.js +1 -1
  246. package/dist/feedback-CECayytY.js +335 -0
  247. package/dist/feedback-CECayytY.js.map +1 -0
  248. package/dist/feedback-paV8Ls-h.cjs +2 -0
  249. package/dist/feedback-paV8Ls-h.cjs.map +1 -0
  250. package/dist/feedback.cjs +1 -1
  251. package/dist/feedback.js +5 -5
  252. package/dist/form-Br56h5EF.cjs +2 -0
  253. package/dist/form-Br56h5EF.cjs.map +1 -0
  254. package/dist/form-CJmMZgsH.js +165 -0
  255. package/dist/form-CJmMZgsH.js.map +1 -0
  256. package/dist/form.cjs +1 -1
  257. package/dist/form.js +1 -1
  258. package/dist/{formatters-CNjg_h7-.cjs → formatters-CauWlsnM.cjs} +1 -1
  259. package/dist/{formatters-CNjg_h7-.cjs.map → formatters-CauWlsnM.cjs.map} +1 -1
  260. package/dist/{formatters-T0vvjMtB.js → formatters-Doqdu_w1.js} +1 -1
  261. package/dist/{formatters-T0vvjMtB.js.map → formatters-Doqdu_w1.js.map} +1 -1
  262. package/dist/frameworkTexts-CaqdiKHW.cjs +2 -0
  263. package/dist/frameworkTexts-CaqdiKHW.cjs.map +1 -0
  264. package/dist/frameworkTexts-o43FqY1A.js +505 -0
  265. package/dist/frameworkTexts-o43FqY1A.js.map +1 -0
  266. package/dist/i18n/MI18nProvider.d.ts +6 -1
  267. package/dist/i18n/frameworkTexts.d.ts +572 -0
  268. package/dist/i18n/index.d.ts +1 -0
  269. package/dist/i18n.cjs +1 -1
  270. package/dist/i18n.js +2 -2
  271. package/dist/icons-Bp8bB9TP.cjs +2 -0
  272. package/dist/icons-Bp8bB9TP.cjs.map +1 -0
  273. package/dist/{icons-CBMl-kOM.js → icons-IqEBmGh3.js} +1223 -1220
  274. package/dist/icons-IqEBmGh3.js.map +1 -0
  275. package/dist/icons.cjs +1 -1
  276. package/dist/icons.js +1 -1
  277. package/dist/illustrations.cjs +1 -1
  278. package/dist/illustrations.js +1 -1
  279. package/dist/index.cjs +1 -1
  280. package/dist/index.d.ts +4 -2
  281. package/dist/index.js +56 -56
  282. package/dist/inputs-C0BJzlA-.js +1923 -0
  283. package/dist/inputs-C0BJzlA-.js.map +1 -0
  284. package/dist/inputs-CvNBBLFA.cjs +2 -0
  285. package/dist/inputs-CvNBBLFA.cjs.map +1 -0
  286. package/dist/inputs.cjs +1 -1
  287. package/dist/inputs.js +4 -4
  288. package/dist/{javascript-CHSg4NGc.js → javascript-CqKLBRqa.js} +1 -1
  289. package/dist/{javascript-CHSg4NGc.js.map → javascript-CqKLBRqa.js.map} +1 -1
  290. package/dist/{javascript-CastOQF5.cjs → javascript-Oy5hkezl.cjs} +1 -1
  291. package/dist/{javascript-CastOQF5.cjs.map → javascript-Oy5hkezl.cjs.map} +1 -1
  292. package/dist/{json-DCkJ-m-p.cjs → json-BP8eqPWc.cjs} +1 -1
  293. package/dist/{json-DCkJ-m-p.cjs.map → json-BP8eqPWc.cjs.map} +1 -1
  294. package/dist/{json-Bejy9Rlg.js → json-DJkyYaPe.js} +1 -1
  295. package/dist/{json-Bejy9Rlg.js.map → json-DJkyYaPe.js.map} +1 -1
  296. package/dist/layout-BSFqGXLZ.js +1101 -0
  297. package/dist/layout-BSFqGXLZ.js.map +1 -0
  298. package/dist/layout-MKqvUkPv.cjs +2 -0
  299. package/dist/layout-MKqvUkPv.cjs.map +1 -0
  300. package/dist/layout.cjs +1 -1
  301. package/dist/layout.js +6 -6
  302. package/dist/{licensing-f5KYVz7D.js → licensing-BKmoAdfr.js} +5 -4
  303. package/dist/licensing-BKmoAdfr.js.map +1 -0
  304. package/dist/licensing-DVgjkw-s.cjs +2 -0
  305. package/dist/licensing-DVgjkw-s.cjs.map +1 -0
  306. package/dist/{locale-DRRl_s5-.cjs → locale-C08q7FjE.cjs} +2 -2
  307. package/dist/{locale-DRRl_s5-.cjs.map → locale-C08q7FjE.cjs.map} +1 -1
  308. package/dist/{locale-CS1-IY_I.js → locale-CjJpk9GN.js} +1 -1
  309. package/dist/{locale-CS1-IY_I.js.map → locale-CjJpk9GN.js.map} +1 -1
  310. package/dist/media-fiasAbBv.js +485 -0
  311. package/dist/media-fiasAbBv.js.map +1 -0
  312. package/dist/media-tr1s386v.cjs +2 -0
  313. package/dist/media-tr1s386v.cjs.map +1 -0
  314. package/dist/media.cjs +1 -1
  315. package/dist/media.js +2 -2
  316. package/dist/overlays-Df-NpmkW.cjs +2 -0
  317. package/dist/overlays-Df-NpmkW.cjs.map +1 -0
  318. package/dist/overlays-W0WW3fn7.js +607 -0
  319. package/dist/overlays-W0WW3fn7.js.map +1 -0
  320. package/dist/overlays.cjs +1 -1
  321. package/dist/overlays.js +3 -3
  322. package/dist/{php-BdVXegqn.cjs → php-Cwjc-ZYq.cjs} +1 -1
  323. package/dist/{php-BdVXegqn.cjs.map → php-Cwjc-ZYq.cjs.map} +1 -1
  324. package/dist/{php-Cb_S1hXT.js → php-Db8PWzaX.js} +1 -1
  325. package/dist/{php-Cb_S1hXT.js.map → php-Db8PWzaX.js.map} +1 -1
  326. package/dist/primitives.cjs +1 -1
  327. package/dist/primitives.js +2 -2
  328. package/dist/radioGroupKeys-Bm-Qeh8G.js +28 -0
  329. package/dist/radioGroupKeys-Bm-Qeh8G.js.map +1 -0
  330. package/dist/radioGroupKeys-COL8uXbH.cjs +2 -0
  331. package/dist/radioGroupKeys-COL8uXbH.cjs.map +1 -0
  332. package/dist/{relativeTime-Cr-NVzij.js → relativeTime-BqCuaBqb.js} +1 -1
  333. package/dist/{relativeTime-Cr-NVzij.js.map → relativeTime-BqCuaBqb.js.map} +1 -1
  334. package/dist/{relativeTime-DgYBUaVm.cjs → relativeTime-DUbW4O44.cjs} +1 -1
  335. package/dist/{relativeTime-DgYBUaVm.cjs.map → relativeTime-DUbW4O44.cjs.map} +1 -1
  336. package/dist/scrollLock-C9P9o6wH.cjs +2 -0
  337. package/dist/scrollLock-C9P9o6wH.cjs.map +1 -0
  338. package/dist/scrollLock-D27VmgPV.js +14 -0
  339. package/dist/scrollLock-D27VmgPV.js.map +1 -0
  340. package/dist/style-runtime.cjs +1 -1
  341. package/dist/style-runtime.js +1 -1
  342. package/dist/styles.css +1 -1
  343. package/dist/theme/MThemeProvider.d.ts +18 -1
  344. package/dist/theme/index.d.ts +2 -2
  345. package/dist/{theme-DAOU1aPs.js → theme-B_juOenJ.js} +71 -61
  346. package/dist/theme-B_juOenJ.js.map +1 -0
  347. package/dist/theme-ByPZH0dh.cjs +2 -0
  348. package/dist/theme-ByPZH0dh.cjs.map +1 -0
  349. package/dist/theme.cjs +1 -1
  350. package/dist/theme.js +2 -2
  351. package/dist/{typescript-CcGBfzlS.cjs → typescript-QKlfKtex.cjs} +1 -1
  352. package/dist/{typescript-CcGBfzlS.cjs.map → typescript-QKlfKtex.cjs.map} +1 -1
  353. package/dist/{typescript-0VHxrxf2.js → typescript-chdf_txx.js} +1 -1
  354. package/dist/{typescript-0VHxrxf2.js.map → typescript-chdf_txx.js.map} +1 -1
  355. package/dist/{typography-CAW17MDj.js → typography-DNcB8dOy.js} +3 -3
  356. package/dist/{typography-CAW17MDj.js.map → typography-DNcB8dOy.js.map} +1 -1
  357. package/dist/{typography-C4_O8len.cjs → typography-I7aeG8pH.cjs} +2 -2
  358. package/dist/{typography-C4_O8len.cjs.map → typography-I7aeG8pH.cjs.map} +1 -1
  359. package/dist/typography.cjs +1 -1
  360. package/dist/typography.js +6 -6
  361. package/dist/useGhostText-CKsb8Ufa.js +240 -0
  362. package/dist/useGhostText-CKsb8Ufa.js.map +1 -0
  363. package/dist/useGhostText-DO-tfxS0.cjs +2 -0
  364. package/dist/useGhostText-DO-tfxS0.cjs.map +1 -0
  365. package/dist/{useInteractionEffect-CFwDX5UF.cjs → useInteractionEffect-CtXlbjhC.cjs} +2 -2
  366. package/dist/{useInteractionEffect-CFwDX5UF.cjs.map → useInteractionEffect-CtXlbjhC.cjs.map} +1 -1
  367. package/dist/useModalLayer-CpOPSDbf.js +128 -0
  368. package/dist/useModalLayer-CpOPSDbf.js.map +1 -0
  369. package/dist/useModalLayer-Cyt93Prs.cjs +2 -0
  370. package/dist/useModalLayer-Cyt93Prs.cjs.map +1 -0
  371. package/dist/utils/calendarDates.d.ts +5 -0
  372. package/dist/utils/radioGroupKeys.d.ts +9 -0
  373. package/dist/utils/useDateGridNav.d.ts +39 -0
  374. package/dist/utils/useGhostText.d.ts +2 -1
  375. package/dist/utils/useKeyboardNav.d.ts +51 -5
  376. package/dist/utils/useModalLayer.d.ts +14 -0
  377. package/dist/utils/useRovingToolbar.d.ts +26 -0
  378. package/dist/utils/validationMessages.d.ts +15 -0
  379. package/dist/utils.cjs +1 -1
  380. package/dist/utils.entry.d.ts +3 -1
  381. package/dist/utils.js +11 -11
  382. package/dist/validationMessages-BFimXxlT.js +23 -0
  383. package/dist/validationMessages-BFimXxlT.js.map +1 -0
  384. package/dist/validationMessages-iHu7apWr.cjs +2 -0
  385. package/dist/validationMessages-iHu7apWr.cjs.map +1 -0
  386. package/dist/validators-SZmLxnir.cjs +2 -0
  387. package/dist/validators-SZmLxnir.cjs.map +1 -0
  388. package/dist/{validators-DVYOtFnw.js → validators-ULebNme2.js} +107 -106
  389. package/dist/validators-ULebNme2.js.map +1 -0
  390. package/dist/{xml-Dbm3mobK.cjs → xml-DEtyywwU.cjs} +1 -1
  391. package/dist/{xml-Dbm3mobK.cjs.map → xml-DEtyywwU.cjs.map} +1 -1
  392. package/dist/{xml-8GjNy8SM.js → xml-DnydRpfh.js} +1 -1
  393. package/dist/{xml-8GjNy8SM.js.map → xml-DnydRpfh.js.map} +1 -1
  394. package/package.json +1 -1
  395. package/dist/MAvatar-Capz5Gbc.cjs +0 -2
  396. package/dist/MAvatar-Capz5Gbc.cjs.map +0 -1
  397. package/dist/MAvatar-DtJCj3dD.js +0 -63
  398. package/dist/MAvatar-DtJCj3dD.js.map +0 -1
  399. package/dist/MButton-C1pnL4_j.js +0 -115
  400. package/dist/MButton-C1pnL4_j.js.map +0 -1
  401. package/dist/MButton-sTKnano6.cjs +0 -2
  402. package/dist/MButton-sTKnano6.cjs.map +0 -1
  403. package/dist/MCard-DK-_FkpE.cjs.map +0 -1
  404. package/dist/MCard-azpp4YVD.js.map +0 -1
  405. package/dist/MCheckbox-B7SpcD4H.js +0 -59
  406. package/dist/MCheckbox-B7SpcD4H.js.map +0 -1
  407. package/dist/MCheckbox-CIX7wp41.cjs +0 -2
  408. package/dist/MCheckbox-CIX7wp41.cjs.map +0 -1
  409. package/dist/MConflictIllustration-CZ3Md38Z.cjs +0 -2
  410. package/dist/MConflictIllustration-CZ3Md38Z.cjs.map +0 -1
  411. package/dist/MConflictIllustration-znC7ijmP.js.map +0 -1
  412. package/dist/MDetailList-Ce7KzUKC.cjs +0 -2
  413. package/dist/MDetailList-Ce7KzUKC.cjs.map +0 -1
  414. package/dist/MDetailList-fDhVyhm7.js +0 -98
  415. package/dist/MDetailList-fDhVyhm7.js.map +0 -1
  416. package/dist/MDropdownMenu-B_QWQhxy.cjs +0 -2
  417. package/dist/MDropdownMenu-B_QWQhxy.cjs.map +0 -1
  418. package/dist/MDropdownMenu-C4CuKMRZ.js +0 -172
  419. package/dist/MDropdownMenu-C4CuKMRZ.js.map +0 -1
  420. package/dist/MGrid-CYL3cbUI.js +0 -265
  421. package/dist/MGrid-CYL3cbUI.js.map +0 -1
  422. package/dist/MGrid-fTx6wFq_.cjs +0 -2
  423. package/dist/MGrid-fTx6wFq_.cjs.map +0 -1
  424. package/dist/MHeading-B7KgSP4T.js +0 -21
  425. package/dist/MHeading-B7KgSP4T.js.map +0 -1
  426. package/dist/MHeading-KDSpnCof.cjs +0 -2
  427. package/dist/MHeading-KDSpnCof.cjs.map +0 -1
  428. package/dist/MI18nProvider-DXRbB0VY.cjs +0 -2
  429. package/dist/MI18nProvider-DXRbB0VY.cjs.map +0 -1
  430. package/dist/MI18nProvider-VH14CI8u.js +0 -72
  431. package/dist/MI18nProvider-VH14CI8u.js.map +0 -1
  432. package/dist/MInput-C8ObGzQk.js +0 -187
  433. package/dist/MInput-C8ObGzQk.js.map +0 -1
  434. package/dist/MInput-CGl2Q-rM.cjs +0 -2
  435. package/dist/MInput-CGl2Q-rM.cjs.map +0 -1
  436. package/dist/MInputCVC-Blv5PeyS.js +0 -320
  437. package/dist/MInputCVC-Blv5PeyS.js.map +0 -1
  438. package/dist/MInputCVC-lAFKTV6y.cjs +0 -2
  439. package/dist/MInputCVC-lAFKTV6y.cjs.map +0 -1
  440. package/dist/MInputSearch-BM8gLlJ1.js +0 -43
  441. package/dist/MInputSearch-BM8gLlJ1.js.map +0 -1
  442. package/dist/MInputSearch-BZDnbFB4.cjs +0 -2
  443. package/dist/MInputSearch-BZDnbFB4.cjs.map +0 -1
  444. package/dist/MLink-Bd8fLH1N.js +0 -31
  445. package/dist/MLink-Bd8fLH1N.js.map +0 -1
  446. package/dist/MLink-U24G6KJj.cjs +0 -2
  447. package/dist/MLink-U24G6KJj.cjs.map +0 -1
  448. package/dist/MLoader-CnvWqFtA.js +0 -41
  449. package/dist/MLoader-CnvWqFtA.js.map +0 -1
  450. package/dist/MLoader-CvFIvytw.cjs +0 -2
  451. package/dist/MLoader-CvFIvytw.cjs.map +0 -1
  452. package/dist/MPagination-BkvOEZpp.js +0 -113
  453. package/dist/MPagination-BkvOEZpp.js.map +0 -1
  454. package/dist/MPagination-DgQta29Q.cjs +0 -2
  455. package/dist/MPagination-DgQta29Q.cjs.map +0 -1
  456. package/dist/MPopover-C-e1CoV0.cjs +0 -2
  457. package/dist/MPopover-C-e1CoV0.cjs.map +0 -1
  458. package/dist/MPopover-Dd-GIBU6.js +0 -155
  459. package/dist/MPopover-Dd-GIBU6.js.map +0 -1
  460. package/dist/MPortal-Ba2Sxset.js +0 -10
  461. package/dist/MPortal-Ba2Sxset.js.map +0 -1
  462. package/dist/MPortal-DUSIuINN.cjs +0 -2
  463. package/dist/MPortal-DUSIuINN.cjs.map +0 -1
  464. package/dist/MSimpleGrid-BWKurW6H.js.map +0 -1
  465. package/dist/MSimpleGrid-BzlIitcJ.cjs +0 -2
  466. package/dist/MSimpleGrid-BzlIitcJ.cjs.map +0 -1
  467. package/dist/MSkeleton-BoFpowFU.cjs +0 -2
  468. package/dist/MSkeleton-BoFpowFU.cjs.map +0 -1
  469. package/dist/MSkeleton-C5uD4Axo.js.map +0 -1
  470. package/dist/MSlider-BTDBqF8t.cjs +0 -2
  471. package/dist/MSlider-BTDBqF8t.cjs.map +0 -1
  472. package/dist/MSlider-CqrusKJQ.js +0 -75
  473. package/dist/MSlider-CqrusKJQ.js.map +0 -1
  474. package/dist/MStack-B3Ldqsc-.cjs +0 -2
  475. package/dist/MStack-B3Ldqsc-.cjs.map +0 -1
  476. package/dist/MStack-CSCw6to2.js +0 -39
  477. package/dist/MStack-CSCw6to2.js.map +0 -1
  478. package/dist/MSubText-47PsgE8T.cjs +0 -2
  479. package/dist/MSubText-47PsgE8T.cjs.map +0 -1
  480. package/dist/MSubText-C-N15d4Z.js +0 -17
  481. package/dist/MSubText-C-N15d4Z.js.map +0 -1
  482. package/dist/MSurface-B-sjyczH.js +0 -74
  483. package/dist/MSurface-B-sjyczH.js.map +0 -1
  484. package/dist/MSurface-QYEygc_0.cjs +0 -2
  485. package/dist/MSurface-QYEygc_0.cjs.map +0 -1
  486. package/dist/MTag-BjV-dXkk.cjs +0 -2
  487. package/dist/MTag-BjV-dXkk.cjs.map +0 -1
  488. package/dist/MTag-D9q6faIk.js +0 -39
  489. package/dist/MTag-D9q6faIk.js.map +0 -1
  490. package/dist/MText-CL-LPcXi.js +0 -45
  491. package/dist/MText-CL-LPcXi.js.map +0 -1
  492. package/dist/MText-Dni707tS.cjs +0 -2
  493. package/dist/MText-Dni707tS.cjs.map +0 -1
  494. package/dist/MTooltip-ChvuN4Ow.cjs +0 -2
  495. package/dist/MTooltip-ChvuN4Ow.cjs.map +0 -1
  496. package/dist/MTooltip-H3we0a7w.js +0 -57
  497. package/dist/MTooltip-H3we0a7w.js.map +0 -1
  498. package/dist/MTreeView-B1J7uqd1.js +0 -315
  499. package/dist/MTreeView-B1J7uqd1.js.map +0 -1
  500. package/dist/MTreeView-VYp0eErQ.cjs +0 -2
  501. package/dist/MTreeView-VYp0eErQ.cjs.map +0 -1
  502. package/dist/calendar-P7MwKfWS.cjs +0 -2
  503. package/dist/calendar-P7MwKfWS.cjs.map +0 -1
  504. package/dist/calendar-bzeZRst9.js +0 -193
  505. package/dist/calendar-bzeZRst9.js.map +0 -1
  506. package/dist/calendarDates-AnlGcvZM.cjs +0 -2
  507. package/dist/calendarDates-AnlGcvZM.cjs.map +0 -1
  508. package/dist/calendarDates-CYkJqcnp.js.map +0 -1
  509. package/dist/cards-CFDJsdxR.js +0 -1226
  510. package/dist/cards-CFDJsdxR.js.map +0 -1
  511. package/dist/cards-DeA7I2KC.cjs +0 -2
  512. package/dist/cards-DeA7I2KC.cjs.map +0 -1
  513. package/dist/controls-BKAhqjNM.js +0 -474
  514. package/dist/controls-BKAhqjNM.js.map +0 -1
  515. package/dist/controls-KK-TyUTT.cjs +0 -2
  516. package/dist/controls-KK-TyUTT.cjs.map +0 -1
  517. package/dist/creditCards-D_HwRUBz.cjs +0 -2
  518. package/dist/creditCards-D_HwRUBz.cjs.map +0 -1
  519. package/dist/creditCards-D_iWmtG6.js.map +0 -1
  520. package/dist/data-CgLutFxU.js +0 -689
  521. package/dist/data-CgLutFxU.js.map +0 -1
  522. package/dist/data-DFrkJTlF.cjs +0 -2
  523. package/dist/data-DFrkJTlF.cjs.map +0 -1
  524. package/dist/dateUtils-CUY6CRCf.js.map +0 -1
  525. package/dist/dateUtils-Dq1vaA-D.cjs +0 -2
  526. package/dist/dateUtils-Dq1vaA-D.cjs.map +0 -1
  527. package/dist/display--E7rI0tk.cjs +0 -3
  528. package/dist/display--E7rI0tk.cjs.map +0 -1
  529. package/dist/display-BnkHKW1n.js +0 -782
  530. package/dist/display-BnkHKW1n.js.map +0 -1
  531. package/dist/dropdowns-DGYg9zIh.cjs +0 -2
  532. package/dist/dropdowns-DGYg9zIh.cjs.map +0 -1
  533. package/dist/dropdowns-Dq-xAplH.js +0 -1698
  534. package/dist/dropdowns-Dq-xAplH.js.map +0 -1
  535. package/dist/feedback-CA77ShtB.cjs +0 -2
  536. package/dist/feedback-CA77ShtB.cjs.map +0 -1
  537. package/dist/feedback-CCwbdNZu.js +0 -255
  538. package/dist/feedback-CCwbdNZu.js.map +0 -1
  539. package/dist/form-CAFcvmUS.js +0 -167
  540. package/dist/form-CAFcvmUS.js.map +0 -1
  541. package/dist/form-DpfzLUOn.cjs +0 -2
  542. package/dist/form-DpfzLUOn.cjs.map +0 -1
  543. package/dist/frameworkTexts-DH0Xp-Vx.js +0 -78
  544. package/dist/frameworkTexts-DH0Xp-Vx.js.map +0 -1
  545. package/dist/frameworkTexts-iDXhcW6k.cjs +0 -2
  546. package/dist/frameworkTexts-iDXhcW6k.cjs.map +0 -1
  547. package/dist/icons-CBMl-kOM.js.map +0 -1
  548. package/dist/icons-D_NB67he.cjs +0 -2
  549. package/dist/icons-D_NB67he.cjs.map +0 -1
  550. package/dist/inputs-B1LCddA4.js +0 -1752
  551. package/dist/inputs-B1LCddA4.js.map +0 -1
  552. package/dist/inputs-Clenc4Rm.cjs +0 -2
  553. package/dist/inputs-Clenc4Rm.cjs.map +0 -1
  554. package/dist/layout-CNoZdeXw.cjs +0 -2
  555. package/dist/layout-CNoZdeXw.cjs.map +0 -1
  556. package/dist/layout-DsE4zfpg.js +0 -882
  557. package/dist/layout-DsE4zfpg.js.map +0 -1
  558. package/dist/licensing-DGIdtfNg.cjs +0 -2
  559. package/dist/licensing-DGIdtfNg.cjs.map +0 -1
  560. package/dist/licensing-f5KYVz7D.js.map +0 -1
  561. package/dist/media-DRTBXDnn.cjs +0 -2
  562. package/dist/media-DRTBXDnn.cjs.map +0 -1
  563. package/dist/media-vOQOIYFD.js +0 -402
  564. package/dist/media-vOQOIYFD.js.map +0 -1
  565. package/dist/overlays-BKk_ZXue.js +0 -568
  566. package/dist/overlays-BKk_ZXue.js.map +0 -1
  567. package/dist/overlays-Qbp4d596.cjs +0 -2
  568. package/dist/overlays-Qbp4d596.cjs.map +0 -1
  569. package/dist/theme-DAOU1aPs.js.map +0 -1
  570. package/dist/theme-DgaM4CjM.cjs +0 -2
  571. package/dist/theme-DgaM4CjM.cjs.map +0 -1
  572. package/dist/useGhostText-DG0bzcao.js +0 -68
  573. package/dist/useGhostText-DG0bzcao.js.map +0 -1
  574. package/dist/useGhostText-Dlemg1vw.cjs +0 -2
  575. package/dist/useGhostText-Dlemg1vw.cjs.map +0 -1
  576. package/dist/useKeyboardNav-Bm-dxVq-.cjs +0 -2
  577. package/dist/useKeyboardNav-Bm-dxVq-.cjs.map +0 -1
  578. package/dist/useKeyboardNav-iEXOdEMB.js +0 -43
  579. package/dist/useKeyboardNav-iEXOdEMB.js.map +0 -1
  580. package/dist/validators-B6yWdsu2.cjs +0 -2
  581. package/dist/validators-B6yWdsu2.cjs.map +0 -1
  582. package/dist/validators-DVYOtFnw.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"useInteractionEffect-CFwDX5UF.cjs","names":[],"sources":["../src/utils/useInteractionEffect.tsx"],"sourcesContent":["import {useCallback, useRef} from 'react'\nimport type {PointerEvent, ReactElement} from 'react'\n\nexport type MClickEffect = 'none' | 'ripple'\n\nexport interface UseInteractionEffectOptions {\n effect?: MClickEffect\n disabled?: boolean\n centered?: boolean\n color?: string\n}\n\nexport interface UseInteractionEffectResult<T extends HTMLElement> {\n effectClassName?: string\n effectLayer: ReactElement | null\n handlePointerDown: (event: PointerEvent<T>) => void\n triggerEffect: (target: T | null) => void\n}\n\ninterface RippleOptions {\n centered: boolean\n color?: string\n clientX?: number\n clientY?: number\n}\n\n// Render and position a ripple wave inside the dedicated effect layer.\nfunction appendRipple(layer: HTMLSpanElement, host: HTMLElement, options: RippleOptions) {\n const rect = host.getBoundingClientRect()\n const size = Math.max(rect.width, rect.height) * 1.75\n const radius = size / 2\n const wave = document.createElement('span')\n const x =\n options.centered || options.clientX === undefined\n ? rect.width / 2 - radius\n : options.clientX - rect.left - radius\n const y =\n options.centered || options.clientY === undefined\n ? rect.height / 2 - radius\n : options.clientY - rect.top - radius\n\n wave.className = 'click-effect-wave'\n wave.style.width = `${size}px`\n wave.style.height = `${size}px`\n wave.style.left = `${x}px`\n wave.style.top = `${y}px`\n\n if (options.color) {\n wave.style.setProperty('--click-effect-color', options.color)\n }\n\n layer.appendChild(wave)\n wave.addEventListener('animationend', () => wave.remove(), {once: true})\n}\n\n// Attach a lightweight click feedback effect without coupling it to a specific component.\nexport function useInteractionEffect<T extends HTMLElement = HTMLElement>({\n effect = 'ripple',\n disabled = false,\n centered = false,\n color,\n}: UseInteractionEffectOptions = {}): UseInteractionEffectResult<T> {\n const layerRef = useRef<HTMLSpanElement>(null)\n const enabled = effect === 'ripple' && !disabled\n\n // Trigger a centered ripple for keyboard-driven or programmatic actions.\n const triggerEffect = useCallback(\n (target: T | null) => {\n if (!enabled || !target || !layerRef.current) {\n return\n }\n\n appendRipple(layerRef.current, target, {centered: true, color})\n },\n [color, enabled]\n )\n\n // Start the ripple from the actual pointer position when possible.\n const handlePointerDown = useCallback(\n (event: PointerEvent<T>) => {\n if (!enabled || !layerRef.current) {\n return\n }\n\n if (event.pointerType === 'mouse' && event.button !== 0) {\n return\n }\n\n appendRipple(layerRef.current, event.currentTarget, {\n centered,\n color,\n clientX: event.clientX,\n clientY: event.clientY,\n })\n },\n [centered, color, enabled]\n )\n\n return {\n effectClassName: enabled ? 'click-effect-root' : undefined,\n effectLayer: enabled ? <span ref={layerRef} className=\"click-effect-layer\" aria-hidden=\"true\" /> : null,\n handlePointerDown,\n triggerEffect,\n }\n}\n"],"mappings":"qFA2BA,SAAS,EAAa,EAAwB,EAAmB,EAAwB,CACrF,IAAM,EAAO,EAAK,uBAAuB,CACnC,EAAO,KAAK,IAAI,EAAK,MAAO,EAAK,OAAO,CAAG,KAC3C,EAAS,EAAO,EAChB,EAAO,SAAS,cAAc,OAAO,CACrC,EACF,EAAQ,UAAY,EAAQ,UAAY,IAAA,GAClC,EAAK,MAAQ,EAAI,EACjB,EAAQ,QAAU,EAAK,KAAO,EAClC,EACF,EAAQ,UAAY,EAAQ,UAAY,IAAA,GAClC,EAAK,OAAS,EAAI,EAClB,EAAQ,QAAU,EAAK,IAAM,EAEvC,EAAK,UAAY,oBACjB,EAAK,MAAM,MAAQ,GAAG,EAAK,IAC3B,EAAK,MAAM,OAAS,GAAG,EAAK,IAC5B,EAAK,MAAM,KAAO,GAAG,EAAE,IACvB,EAAK,MAAM,IAAM,GAAG,EAAE,IAElB,EAAQ,OACR,EAAK,MAAM,YAAY,uBAAwB,EAAQ,MAAM,CAGjE,EAAM,YAAY,EAAK,CACvB,EAAK,iBAAiB,mBAAsB,EAAK,QAAQ,CAAE,CAAC,KAAM,GAAK,CAAC,CAI5E,SAAgB,EAA0D,CACtE,SAAS,SACT,WAAW,GACX,WAAW,GACX,SAC6B,EAAE,CAAiC,CAChE,IAAM,GAAA,EAAA,EAAA,QAAmC,KAAK,CACxC,EAAU,IAAW,UAAY,CAAC,EAGlC,GAAA,EAAA,EAAA,aACD,GAAqB,CACd,CAAC,GAAW,CAAC,GAAU,CAAC,EAAS,SAIrC,EAAa,EAAS,QAAS,EAAQ,CAAC,SAAU,GAAM,QAAM,CAAC,EAEnE,CAAC,EAAO,EAAQ,CACnB,CAGK,GAAA,EAAA,EAAA,aACD,GAA2B,CACpB,CAAC,GAAW,CAAC,EAAS,SAItB,EAAM,cAAgB,SAAW,EAAM,SAAW,GAItD,EAAa,EAAS,QAAS,EAAM,cAAe,CAChD,WACA,QACA,QAAS,EAAM,QACf,QAAS,EAAM,QAClB,CAAC,EAEN,CAAC,EAAU,EAAO,EAAQ,CAC7B,CAED,MAAO,CACH,gBAAiB,EAAU,oBAAsB,IAAA,GACjD,YAAa,GAAU,EAAA,EAAA,KAAC,OAAD,CAAM,IAAK,EAAU,UAAU,qBAAqB,cAAY,OAAS,CAAA,CAAG,KACnG,oBACA,gBACH"}
1
+ {"version":3,"file":"useInteractionEffect-CtXlbjhC.cjs","names":[],"sources":["../src/utils/useInteractionEffect.tsx"],"sourcesContent":["import {useCallback, useRef} from 'react'\nimport type {PointerEvent, ReactElement} from 'react'\n\nexport type MClickEffect = 'none' | 'ripple'\n\nexport interface UseInteractionEffectOptions {\n effect?: MClickEffect\n disabled?: boolean\n centered?: boolean\n color?: string\n}\n\nexport interface UseInteractionEffectResult<T extends HTMLElement> {\n effectClassName?: string\n effectLayer: ReactElement | null\n handlePointerDown: (event: PointerEvent<T>) => void\n triggerEffect: (target: T | null) => void\n}\n\ninterface RippleOptions {\n centered: boolean\n color?: string\n clientX?: number\n clientY?: number\n}\n\n// Render and position a ripple wave inside the dedicated effect layer.\nfunction appendRipple(layer: HTMLSpanElement, host: HTMLElement, options: RippleOptions) {\n const rect = host.getBoundingClientRect()\n const size = Math.max(rect.width, rect.height) * 1.75\n const radius = size / 2\n const wave = document.createElement('span')\n const x =\n options.centered || options.clientX === undefined\n ? rect.width / 2 - radius\n : options.clientX - rect.left - radius\n const y =\n options.centered || options.clientY === undefined\n ? rect.height / 2 - radius\n : options.clientY - rect.top - radius\n\n wave.className = 'click-effect-wave'\n wave.style.width = `${size}px`\n wave.style.height = `${size}px`\n wave.style.left = `${x}px`\n wave.style.top = `${y}px`\n\n if (options.color) {\n wave.style.setProperty('--click-effect-color', options.color)\n }\n\n layer.appendChild(wave)\n wave.addEventListener('animationend', () => wave.remove(), {once: true})\n}\n\n// Attach a lightweight click feedback effect without coupling it to a specific component.\nexport function useInteractionEffect<T extends HTMLElement = HTMLElement>({\n effect = 'ripple',\n disabled = false,\n centered = false,\n color,\n}: UseInteractionEffectOptions = {}): UseInteractionEffectResult<T> {\n const layerRef = useRef<HTMLSpanElement>(null)\n const enabled = effect === 'ripple' && !disabled\n\n // Trigger a centered ripple for keyboard-driven or programmatic actions.\n const triggerEffect = useCallback(\n (target: T | null) => {\n if (!enabled || !target || !layerRef.current) {\n return\n }\n\n appendRipple(layerRef.current, target, {centered: true, color})\n },\n [color, enabled]\n )\n\n // Start the ripple from the actual pointer position when possible.\n const handlePointerDown = useCallback(\n (event: PointerEvent<T>) => {\n if (!enabled || !layerRef.current) {\n return\n }\n\n if (event.pointerType === 'mouse' && event.button !== 0) {\n return\n }\n\n appendRipple(layerRef.current, event.currentTarget, {\n centered,\n color,\n clientX: event.clientX,\n clientY: event.clientY,\n })\n },\n [centered, color, enabled]\n )\n\n return {\n effectClassName: enabled ? 'click-effect-root' : undefined,\n effectLayer: enabled ? <span ref={layerRef} className=\"click-effect-layer\" aria-hidden=\"true\" /> : null,\n handlePointerDown,\n triggerEffect,\n }\n}\n"],"mappings":"qFA2BA,SAAS,EAAa,EAAwB,EAAmB,EAAwB,CACrF,IAAM,EAAO,EAAK,uBAAuB,CACnC,EAAO,KAAK,IAAI,EAAK,MAAO,EAAK,OAAO,CAAG,KAC3C,EAAS,EAAO,EAChB,EAAO,SAAS,cAAc,OAAO,CACrC,EACF,EAAQ,UAAY,EAAQ,UAAY,IAAA,GAClC,EAAK,MAAQ,EAAI,EACjB,EAAQ,QAAU,EAAK,KAAO,EAClC,EACF,EAAQ,UAAY,EAAQ,UAAY,IAAA,GAClC,EAAK,OAAS,EAAI,EAClB,EAAQ,QAAU,EAAK,IAAM,EAEvC,EAAK,UAAY,oBACjB,EAAK,MAAM,MAAQ,GAAG,EAAK,IAC3B,EAAK,MAAM,OAAS,GAAG,EAAK,IAC5B,EAAK,MAAM,KAAO,GAAG,EAAE,IACvB,EAAK,MAAM,IAAM,GAAG,EAAE,IAElB,EAAQ,OACR,EAAK,MAAM,YAAY,uBAAwB,EAAQ,MAAM,CAGjE,EAAM,YAAY,EAAK,CACvB,EAAK,iBAAiB,mBAAsB,EAAK,QAAQ,CAAE,CAAC,KAAM,GAAK,CAAC,CAI5E,SAAgB,EAA0D,CACtE,SAAS,SACT,WAAW,GACX,WAAW,GACX,SAC6B,EAAE,CAAiC,CAChE,IAAM,GAAA,EAAA,EAAA,QAAmC,KAAK,CACxC,EAAU,IAAW,UAAY,CAAC,EAGlC,GAAA,EAAA,EAAA,aACD,GAAqB,CACd,CAAC,GAAW,CAAC,GAAU,CAAC,EAAS,SAIrC,EAAa,EAAS,QAAS,EAAQ,CAAC,SAAU,GAAM,QAAM,CAAC,EAEnE,CAAC,EAAO,EAAQ,CACnB,CAGK,GAAA,EAAA,EAAA,aACD,GAA2B,CACpB,CAAC,GAAW,CAAC,EAAS,SAItB,EAAM,cAAgB,SAAW,EAAM,SAAW,GAItD,EAAa,EAAS,QAAS,EAAM,cAAe,CAChD,WACA,QACA,QAAS,EAAM,QACf,QAAS,EAAM,QAClB,CAAC,EAEN,CAAC,EAAU,EAAO,EAAQ,CAC7B,CAED,MAAO,CACH,gBAAiB,EAAU,oBAAsB,IAAA,GACjD,YAAa,GAAU,EAAA,EAAA,KAAC,OAAD,CAAM,IAAK,EAAU,UAAU,qBAAqB,cAAY,OAAS,CAAA,CAAG,KACnG,oBACA,gBACH"}
@@ -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
+ };
@@ -22,7 +22,8 @@ export interface GhostTextReturn<T = string> {
22
22
  reset: () => void;
23
23
  /** Number of matching options. */
24
24
  matchCount: number;
25
- /** Handle keyboard events — Tab/Enter accept, arrows cycle, Escape resets. */
25
+ /** Handle keyboard events — Tab/Enter accept, arrows cycle (only while a hint is shown), Escape hides the hint
26
+ * until the value changes. */
26
27
  onKeyDown: (e: React.KeyboardEvent) => boolean;
27
28
  }
28
29
  export declare function useGhostText<T = string>({ options, value, minChars, getLabel, filter, }: GhostTextOptions<T>): GhostTextReturn<T>;
@@ -1,14 +1,60 @@
1
- import { KeyboardEvent } from 'react';
1
+ import { FocusEvent, KeyboardEvent } from 'react';
2
+ /**
3
+ * Focus-management strategy (WAI-ARIA APG "Managing focus within components"):
4
+ * - `none` (default) — the hook only tracks `activeIndex`; the caller renders the highlight itself.
5
+ * - `activedescendant` — DOM focus stays on the container / input; the active item is exposed via
6
+ * `aria-activedescendant` (combobox, listbox, grid with a focused host).
7
+ * - `roving` — exactly one item has `tabIndex=0`, the rest `-1`; arrow keys move real DOM focus
8
+ * (menu, toolbar, tablist, tree, radio group).
9
+ */
10
+ export type UseKeyboardNavMode = 'none' | 'activedescendant' | 'roving';
11
+ /** Which arrow keys move the active item. */
12
+ export type UseKeyboardNavOrientation = 'vertical' | 'horizontal' | 'both';
2
13
  export interface UseKeyboardNavOptions {
3
14
  itemCount: number;
4
- onSelect: (index: number) => void;
5
- onClose: () => void;
6
- isOpen: boolean;
15
+ /** Called on Enter (and Space when `selectOnSpace`) with the active index. */
16
+ onSelect?: (index: number) => void;
17
+ /** Called on Escape. When omitted Escape is not handled, so it can bubble to an outer layer. */
18
+ onClose?: () => void;
19
+ /** Keys are ignored while `false`. Defaults to `true`. */
20
+ isOpen?: boolean;
7
21
  loop?: boolean;
22
+ /** Focus strategy. Defaults to `'none'` (the original behaviour). */
23
+ mode?: UseKeyboardNavMode;
24
+ /** Defaults to `'vertical'` (ArrowUp / ArrowDown). */
25
+ orientation?: UseKeyboardNavOrientation;
26
+ /** Flip ArrowLeft / ArrowRight for right-to-left layouts. */
27
+ rtl?: boolean;
28
+ /** Disabled items are skipped by arrows, Home / End and typeahead, and are never selected. */
29
+ isItemDisabled?: (index: number) => boolean;
30
+ /** Enables first-letter typeahead (APG) when provided. */
31
+ getItemLabel?: (index: number) => string;
32
+ /** Treat Space like Enter (menus, toolbars, listboxes without a text input). */
33
+ selectOnSpace?: boolean;
34
+ /** Prefix for generated item ids. Defaults to a `useId()` based value. */
35
+ idPrefix?: string;
36
+ /** Initial active index. Defaults to `-1` (nothing active). */
37
+ initialIndex?: number;
8
38
  }
9
- export declare function useKeyboardNav({ itemCount, onSelect, onClose, isOpen, loop }: UseKeyboardNavOptions): {
39
+ export interface UseKeyboardNavItemProps {
40
+ id: string;
41
+ tabIndex?: number;
42
+ ref?: (el: HTMLElement | null) => void;
43
+ onFocus?: (e: FocusEvent<HTMLElement>) => void;
44
+ }
45
+ export interface UseKeyboardNavContainerProps {
46
+ onKeyDown: (e: KeyboardEvent) => void;
47
+ 'aria-activedescendant'?: string;
48
+ }
49
+ export declare function useKeyboardNav({ itemCount, onSelect, onClose, isOpen, loop, mode, orientation, rtl, isItemDisabled, getItemLabel, selectOnSpace, idPrefix, initialIndex, }: UseKeyboardNavOptions): {
10
50
  activeIndex: number;
11
51
  setActiveIndex: import('react').Dispatch<import('react').SetStateAction<number>>;
12
52
  resetIndex: () => void;
13
53
  onKeyDown: (e: KeyboardEvent) => void;
54
+ activeDescendantId: string | undefined;
55
+ getItemId: (index: number) => string;
56
+ getItemProps: (index: number) => UseKeyboardNavItemProps;
57
+ getContainerProps: () => UseKeyboardNavContainerProps;
58
+ focusItem: (index: number) => void;
14
59
  };
60
+ export type UseKeyboardNavResult = ReturnType<typeof useKeyboardNav>;
@@ -0,0 +1,14 @@
1
+ import { RefObject } from 'react';
2
+ /** Focusable, visible descendants of `container` in DOM order (shared with MPopover). */
3
+ export declare function getFocusable(container: HTMLElement): HTMLElement[];
4
+ /** Like `getFocusable`, minus elements taken out of the Tab order (`tabindex="-1"`, e.g. roving items). */
5
+ export declare function getTabbable(container: HTMLElement): HTMLElement[];
6
+ export interface UseModalLayerOptions {
7
+ /** True while the overlay is mounted and open (not while it animates out). */
8
+ active: boolean;
9
+ /** Element wrapping the whole overlay; the dialog is the `[role="dialog"]` inside it. */
10
+ containerRef: RefObject<HTMLElement | null>;
11
+ /** Called on Escape when this is the top layer. Omit to ignore Escape. */
12
+ onEscape?: () => void;
13
+ }
14
+ export declare function useModalLayer({ active, containerRef, onEscape }: UseModalLayerOptions): void;
@@ -0,0 +1,26 @@
1
+ import { FocusEvent, KeyboardEvent, RefObject } from 'react';
2
+ /**
3
+ * Internal (not re-exported from the package root): WAI-ARIA APG toolbar keyboard model for a
4
+ * container whose controls are rendered by arbitrary children (slots, MButton, MDropdownMenu
5
+ * triggers).
6
+ *
7
+ * The toolbar is one Tab stop: exactly one control keeps `tabindex="0"`, the others get `-1`.
8
+ * ArrowLeft / ArrowRight move focus between the controls (flipped in right-to-left layouts, both
9
+ * wrap), Home / End jump to the ends. Text fields and controls inside a nested dialog, menu,
10
+ * listbox, grid or toolbar are left alone, so they keep their own keys and Tab stop.
11
+ *
12
+ * The roving state is applied to the DOM directly (the controls are not owned by the toolbar),
13
+ * re-synced after every render and whenever the children change.
14
+ */
15
+ export interface UseRovingToolbarOptions {
16
+ /** Turns the behaviour off (the controls keep their own Tab stops). Defaults to `true`. */
17
+ enabled?: boolean;
18
+ /** Control that holds the Tab stop until the user moves it (e.g. the selected day). */
19
+ preferSelector?: string;
20
+ }
21
+ /** Controls of the toolbar `root`, in DOM order. */
22
+ export declare function getToolbarItems(root: HTMLElement): HTMLElement[];
23
+ export declare function useRovingToolbar(rootRef: RefObject<HTMLElement | null>, { enabled, preferSelector }?: UseRovingToolbarOptions): {
24
+ onKeyDown: (event: KeyboardEvent<HTMLElement>) => void;
25
+ onFocus: (event: FocusEvent<HTMLElement>) => void;
26
+ };
@@ -0,0 +1,15 @@
1
+ import { ValidationResult } from './validators';
2
+ export type ValidationMessageParams = Record<string, string | number>;
3
+ /** Translation info behind a failed built-in validator result. */
4
+ export interface ValidationMessageInfo {
5
+ /** Key below `mineralui.validation.` (e.g. `email`, `minLength`, `postCode.PL`). */
6
+ key: string;
7
+ /** English template with `{param}` placeholders; `error` is this template filled with `params`. */
8
+ template: string;
9
+ params: ValidationMessageParams;
10
+ }
11
+ export declare function fillValidationTemplate(template: string, params: ValidationMessageParams): string;
12
+ /** Build a failed result whose English message can later be translated via `mineralui.validation.<key>`. */
13
+ export declare function validationFailure(key: string, template: string, params?: ValidationMessageParams): ValidationResult;
14
+ /** Translation info for a result returned by a built-in `validate*` function, if any. */
15
+ export declare function getValidationMessageInfo(result: ValidationResult): ValidationMessageInfo | undefined;
package/dist/utils.cjs CHANGED
@@ -1,3 +1,3 @@
1
1
  const {ensureStyles}=require('./style-runtime.cjs')
2
2
  ensureStyles()
3
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./cn-CU5TNITO.cjs`),t=require(`./validators-B6yWdsu2.cjs`),n=require(`./creditCards-D_HwRUBz.cjs`),r=require(`./formatters-CNjg_h7-.cjs`),i=require(`./dateUtils-Dq1vaA-D.cjs`),a=require(`./relativeTime-DgYBUaVm.cjs`),o=require(`./useGhostText-Dlemg1vw.cjs`),s=require(`./licensing-DGIdtfNg.cjs`),c=require(`./useKeyboardNav-Bm-dxVq-.cjs`),l=require(`./useInteractionEffect-CFwDX5UF.cjs`);exports.addMonths=i.t,exports.addYears=i.n,exports.adjustCursorAfterFormat=r.t,exports.capitalizeWords=r.n,exports.cn=e.t,exports.composeValidators=t.t,exports.creditCardBrands=n.t,exports.daysInMonth=i.i,exports.detectCardBrand=n.n,exports.firstDayOfMonth=i.a,exports.formatAbsoluteTime=a.t,exports.formatCardNumber=n.r,exports.formatCurrency=r.r,exports.formatDate=i.o,exports.formatIBAN=r.a,exports.formatNIP=r.o,exports.formatPhone=r.s,exports.formatPostCode=t.v,exports.formatRelativeTime=a.n,exports.formatTime=i.c,exports.getAutoUpdateInterval=a.r,exports.getDayNames=i.u,exports.getMineralComponentLicense=s.t,exports.getMineralComponentPlan=s.n,exports.getMonthNames=i.d,exports.getPostCodeRule=t.y,exports.getRelativeTimeValue=a.i,exports.isDateInRange=i.f,exports.isMineralProComponent=s.r,exports.isSameDay=i.p,exports.mineralComponentLicenses=s.i,exports.mineralProComponents=s.a,exports.parseCurrencyToNumber=r.c,exports.parseDate=i.m,exports.parseRelativeThreshold=a.a,exports.parseTime=i.h,exports.postCodeCountries=t.b,exports.postCodeRules=t.x,exports.stripCardNumber=n.i,exports.stripNonAlphanumeric=r.l,exports.stripNonDigits=r.u,exports.stripTime=i._,exports.toDate=a.o,exports.unformatIBAN=r.d,exports.useClickOutside=s.o,exports.useDebounce=o.n,exports.useDebouncedCallback=o.r,exports.useGhostText=o.t,exports.useInteractionEffect=l.t,exports.useKeyboardNav=c.t,exports.validateCardNumber=n.a,exports.validateEmail=t.o,exports.validateIBAN=t.s,exports.validateMaxLength=t.c,exports.validateMinLength=t.l,exports.validateNIP=t.u,exports.validatePESEL=t.d,exports.validatePattern=t.f,exports.validatePhone=t.p,exports.validatePostCode=t.S,exports.validateREGON=t.m,exports.validateRange=t.h,exports.validateRequired=t.g;
3
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./validationMessages-iHu7apWr.cjs`),t=require(`./cn-DYFxgzi2.cjs`),n=require(`./validators-SZmLxnir.cjs`),r=require(`./creditCards-Bo2mrc53.cjs`),i=require(`./formatters-CauWlsnM.cjs`),a=require(`./dateUtils-z2L7ZaxA.cjs`),o=require(`./relativeTime-DUbW4O44.cjs`),s=require(`./useGhostText-DO-tfxS0.cjs`),c=require(`./licensing-DVgjkw-s.cjs`),l=require(`./useInteractionEffect-CtXlbjhC.cjs`);exports.addMonths=a.t,exports.addYears=a.n,exports.adjustCursorAfterFormat=i.t,exports.capitalizeWords=i.n,exports.cn=t.t,exports.composeValidators=n.t,exports.creditCardBrands=r.t,exports.daysInMonth=a.i,exports.detectCardBrand=r.n,exports.firstDayOfMonth=a.a,exports.formatAbsoluteTime=o.t,exports.formatCardNumber=r.r,exports.formatCurrency=i.r,exports.formatDate=a.o,exports.formatIBAN=i.a,exports.formatNIP=i.o,exports.formatPhone=i.s,exports.formatPostCode=n.v,exports.formatRelativeTime=o.n,exports.formatTime=a.c,exports.getAutoUpdateInterval=o.r,exports.getDayNames=a.u,exports.getMineralComponentLicense=c.t,exports.getMineralComponentPlan=c.n,exports.getMonthNames=a.d,exports.getPostCodeRule=n.y,exports.getRelativeTimeValue=o.i,exports.getValidationMessageInfo=e.n,exports.isDateInRange=a.f,exports.isMineralProComponent=c.r,exports.isSameDay=a.p,exports.mineralComponentLicenses=c.i,exports.mineralProComponents=c.a,exports.parseCurrencyToNumber=i.c,exports.parseDate=a.m,exports.parseRelativeThreshold=o.a,exports.parseTime=a.h,exports.postCodeCountries=n.b,exports.postCodeRules=n.x,exports.stripCardNumber=r.i,exports.stripNonAlphanumeric=i.l,exports.stripNonDigits=i.u,exports.stripTime=a._,exports.toDate=o.o,exports.unformatIBAN=i.d,exports.useClickOutside=c.o,exports.useDebounce=s.r,exports.useDebouncedCallback=s.i,exports.useGhostText=s.t,exports.useInteractionEffect=l.t,exports.useKeyboardNav=s.n,exports.validateCardNumber=r.a,exports.validateEmail=n.o,exports.validateIBAN=n.s,exports.validateMaxLength=n.c,exports.validateMinLength=n.l,exports.validateNIP=n.u,exports.validatePESEL=n.d,exports.validatePattern=n.f,exports.validatePhone=n.p,exports.validatePostCode=n.S,exports.validateREGON=n.m,exports.validateRange=n.h,exports.validateRequired=n.g;
@@ -1,6 +1,8 @@
1
1
  export { cn } from './utils/cn';
2
2
  export { validateRequired, validateMinLength, validateMaxLength, validatePattern, validateRange, validateEmail, validatePhone, validateIBAN, validateNIP, validatePESEL, validateREGON, validatePostCode, validateCardNumber, composeValidators, } from './utils/validators';
3
3
  export type { ValidationResult, ValidatorFn } from './utils/validators';
4
+ export { getValidationMessageInfo } from './utils/validationMessages';
5
+ export type { ValidationMessageInfo, ValidationMessageParams } from './utils/validationMessages';
4
6
  export { formatPostCode, formatIBAN, formatCardNumber, unformatIBAN, formatPhone, formatNIP, formatCurrency, parseCurrencyToNumber, stripNonDigits, stripNonAlphanumeric, capitalizeWords, adjustCursorAfterFormat, } from './utils/formatters';
5
7
  export type { PhoneFormatOptions, CurrencyFormatOptions } from './utils/formatters';
6
8
  export { getPostCodeRule, postCodeCountries, postCodeRules } from './utils/postalCodes';
@@ -13,7 +15,7 @@ export type { RelativeTimeFallbackFormat, RelativeTimeUnit, RelativeTimeValue }
13
15
  export { useDebounce, useDebouncedCallback } from './utils/useDebounce';
14
16
  export { useClickOutside } from './utils/useClickOutside';
15
17
  export { useKeyboardNav } from './utils/useKeyboardNav';
16
- export type { UseKeyboardNavOptions } from './utils/useKeyboardNav';
18
+ export type { UseKeyboardNavOptions, UseKeyboardNavMode, UseKeyboardNavOrientation, UseKeyboardNavItemProps, UseKeyboardNavContainerProps, UseKeyboardNavResult, } from './utils/useKeyboardNav';
17
19
  export { useInteractionEffect } from './utils/useInteractionEffect';
18
20
  export type { MClickEffect, UseInteractionEffectOptions, UseInteractionEffectResult } from './utils/useInteractionEffect';
19
21
  export { useGhostText } from './utils/useGhostText';
package/dist/utils.js CHANGED
@@ -1,13 +1,13 @@
1
1
  import {ensureStyles} from './style-runtime.js'
2
2
  ensureStyles()
3
- import { t as e } from "./cn-YER3QsV1.js";
4
- import { S as t, b as n, c as r, d as i, f as a, g as o, h as s, l as c, m as l, o as u, p as d, s as f, t as p, u as m, v as h, x as g, y as _ } from "./validators-DVYOtFnw.js";
5
- import { a as v, i as y, n as b, r as x, t as S } from "./creditCards-D_iWmtG6.js";
6
- import { a as C, c as w, d as T, l as E, n as D, o as O, r as k, s as A, t as j, u as M } from "./formatters-T0vvjMtB.js";
7
- import { _ as N, a as P, c as F, d as I, f as L, h as R, i as z, m as B, n as V, o as H, p as U, t as W, u as G } from "./dateUtils-CUY6CRCf.js";
8
- import { a as K, i as q, n as J, o as Y, r as X, t as Z } from "./relativeTime-Cr-NVzij.js";
9
- import { n as Q, r as $, t as ee } from "./useGhostText-DG0bzcao.js";
10
- import { a as te, i as ne, n as re, o as ie, r as ae, t as oe } from "./licensing-f5KYVz7D.js";
11
- import { t as se } from "./useKeyboardNav-iEXOdEMB.js";
12
- import { t as ce } from "./useInteractionEffect-DtpbVd77.js";
13
- export { W as addMonths, V as addYears, j as adjustCursorAfterFormat, D as capitalizeWords, e as cn, p as composeValidators, S as creditCardBrands, z as daysInMonth, b as detectCardBrand, P as firstDayOfMonth, Z as formatAbsoluteTime, x as formatCardNumber, k as formatCurrency, H as formatDate, C as formatIBAN, O as formatNIP, A as formatPhone, h as formatPostCode, J as formatRelativeTime, F as formatTime, X as getAutoUpdateInterval, G as getDayNames, oe as getMineralComponentLicense, re as getMineralComponentPlan, I as getMonthNames, _ as getPostCodeRule, q as getRelativeTimeValue, L as isDateInRange, ae as isMineralProComponent, U as isSameDay, ne as mineralComponentLicenses, te as mineralProComponents, w as parseCurrencyToNumber, B as parseDate, K as parseRelativeThreshold, R as parseTime, n as postCodeCountries, g as postCodeRules, y as stripCardNumber, E as stripNonAlphanumeric, M as stripNonDigits, N as stripTime, Y as toDate, T as unformatIBAN, ie as useClickOutside, Q as useDebounce, $ as useDebouncedCallback, ee as useGhostText, ce as useInteractionEffect, se as useKeyboardNav, v as validateCardNumber, u as validateEmail, f as validateIBAN, r as validateMaxLength, c as validateMinLength, m as validateNIP, i as validatePESEL, a as validatePattern, d as validatePhone, t as validatePostCode, l as validateREGON, s as validateRange, o as validateRequired };
3
+ import { n as e } from "./validationMessages-BFimXxlT.js";
4
+ import { t } from "./cn-CUSXNnjF.js";
5
+ import { S as n, b as r, c as i, d as a, f as o, g as s, h as c, l, m as u, o as d, p as f, s as p, t as m, u as h, v as g, x as _, y as v } from "./validators-ULebNme2.js";
6
+ import { a as y, i as b, n as x, r as S, t as C } from "./creditCards-DmDOyvcw.js";
7
+ import { a as w, c as T, d as E, l as D, n as O, o as k, r as A, s as j, t as M, u as N } from "./formatters-Doqdu_w1.js";
8
+ import { _ as P, a as F, c as I, d as L, f as R, h as z, i as B, m as V, n as H, o as U, p as W, t as G, u as K } from "./dateUtils-B-ToNZq_.js";
9
+ import { a as q, i as J, n as Y, o as X, r as Z, t as Q } from "./relativeTime-BqCuaBqb.js";
10
+ import { i as $, n as ee, r as te, t as ne } from "./useGhostText-CKsb8Ufa.js";
11
+ import { a as re, i as ie, n as ae, o as oe, r as se, t as ce } from "./licensing-BKmoAdfr.js";
12
+ import { t as le } from "./useInteractionEffect-DtpbVd77.js";
13
+ export { G as addMonths, H as addYears, M as adjustCursorAfterFormat, O as capitalizeWords, t as cn, m as composeValidators, C as creditCardBrands, B as daysInMonth, x as detectCardBrand, F as firstDayOfMonth, Q as formatAbsoluteTime, S as formatCardNumber, A as formatCurrency, U as formatDate, w as formatIBAN, k as formatNIP, j as formatPhone, g as formatPostCode, Y as formatRelativeTime, I as formatTime, Z as getAutoUpdateInterval, K as getDayNames, ce as getMineralComponentLicense, ae as getMineralComponentPlan, L as getMonthNames, v as getPostCodeRule, J as getRelativeTimeValue, e as getValidationMessageInfo, R as isDateInRange, se as isMineralProComponent, W as isSameDay, ie as mineralComponentLicenses, re as mineralProComponents, T as parseCurrencyToNumber, V as parseDate, q as parseRelativeThreshold, z as parseTime, r as postCodeCountries, _ as postCodeRules, b as stripCardNumber, D as stripNonAlphanumeric, N as stripNonDigits, P as stripTime, X as toDate, E as unformatIBAN, oe as useClickOutside, te as useDebounce, $ as useDebouncedCallback, ne as useGhostText, le as useInteractionEffect, ee as useKeyboardNav, y as validateCardNumber, d as validateEmail, p as validateIBAN, i as validateMaxLength, l as validateMinLength, h as validateNIP, a as validatePESEL, o as validatePattern, f as validatePhone, n as validatePostCode, u as validateREGON, c as validateRange, s as validateRequired };
@@ -0,0 +1,23 @@
1
+ //#region src/utils/validationMessages.ts
2
+ var e = /* @__PURE__ */ new WeakMap();
3
+ function t(e, t) {
4
+ return e.replace(/\{(\w+)\}/g, (e, n) => n in t ? String(t[n]) : e);
5
+ }
6
+ function n(n, r, i = {}) {
7
+ let a = {
8
+ valid: !1,
9
+ error: t(r, i)
10
+ };
11
+ return e.set(a, {
12
+ key: n,
13
+ template: r,
14
+ params: i
15
+ }), a;
16
+ }
17
+ function r(t) {
18
+ return e.get(t);
19
+ }
20
+ //#endregion
21
+ export { r as n, n as r, t };
22
+
23
+ //# sourceMappingURL=validationMessages-BFimXxlT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validationMessages-BFimXxlT.js","names":[],"sources":["../src/utils/validationMessages.ts"],"sourcesContent":["import type {ValidationResult} from './validators'\n\nexport type ValidationMessageParams = Record<string, string | number>\n\n/** Translation info behind a failed built-in validator result. */\nexport interface ValidationMessageInfo {\n /** Key below `mineralui.validation.` (e.g. `email`, `minLength`, `postCode.PL`). */\n key: string\n /** English template with `{param}` placeholders; `error` is this template filled with `params`. */\n template: string\n params: ValidationMessageParams\n}\n\n// Results stay plain {valid, error} objects (backward compatible); the i18n info lives on the side.\nconst messageInfo = new WeakMap<ValidationResult, ValidationMessageInfo>()\n\nexport function fillValidationTemplate(template: string, params: ValidationMessageParams): string {\n return template.replace(/\\{(\\w+)\\}/g, (match, name: string) => (name in params ? String(params[name]) : match))\n}\n\n/** Build a failed result whose English message can later be translated via `mineralui.validation.<key>`. */\nexport function validationFailure(\n key: string,\n template: string,\n params: ValidationMessageParams = {}\n): ValidationResult {\n const result: ValidationResult = {valid: false, error: fillValidationTemplate(template, params)}\n messageInfo.set(result, {key, template, params})\n return result\n}\n\n/** Translation info for a result returned by a built-in `validate*` function, if any. */\nexport function getValidationMessageInfo(result: ValidationResult): ValidationMessageInfo | undefined {\n return messageInfo.get(result)\n}\n"],"mappings":";AAcA,IAAM,oBAAc,IAAI,SAAkD;AAE1E,SAAgB,EAAuB,GAAkB,GAAyC;AAC9F,QAAO,EAAS,QAAQ,eAAe,GAAO,MAAkB,KAAQ,IAAS,OAAO,EAAO,GAAM,GAAG,EAAO;;AAInH,SAAgB,EACZ,GACA,GACA,IAAkC,EAAE,EACpB;CAChB,IAAM,IAA2B;EAAC,OAAO;EAAO,OAAO,EAAuB,GAAU,EAAO;EAAC;AAEhG,QADA,EAAY,IAAI,GAAQ;EAAC;EAAK;EAAU;EAAO,CAAC,EACzC;;AAIX,SAAgB,EAAyB,GAA6D;AAClG,QAAO,EAAY,IAAI,EAAO"}
@@ -0,0 +1,2 @@
1
+ var e=new WeakMap;function t(e,t){return e.replace(/\{(\w+)\}/g,(e,n)=>n in t?String(t[n]):e)}function n(n,r,i={}){let a={valid:!1,error:t(r,i)};return e.set(a,{key:n,template:r,params:i}),a}function r(t){return e.get(t)}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return t}});
2
+ //# sourceMappingURL=validationMessages-iHu7apWr.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validationMessages-iHu7apWr.cjs","names":[],"sources":["../src/utils/validationMessages.ts"],"sourcesContent":["import type {ValidationResult} from './validators'\n\nexport type ValidationMessageParams = Record<string, string | number>\n\n/** Translation info behind a failed built-in validator result. */\nexport interface ValidationMessageInfo {\n /** Key below `mineralui.validation.` (e.g. `email`, `minLength`, `postCode.PL`). */\n key: string\n /** English template with `{param}` placeholders; `error` is this template filled with `params`. */\n template: string\n params: ValidationMessageParams\n}\n\n// Results stay plain {valid, error} objects (backward compatible); the i18n info lives on the side.\nconst messageInfo = new WeakMap<ValidationResult, ValidationMessageInfo>()\n\nexport function fillValidationTemplate(template: string, params: ValidationMessageParams): string {\n return template.replace(/\\{(\\w+)\\}/g, (match, name: string) => (name in params ? String(params[name]) : match))\n}\n\n/** Build a failed result whose English message can later be translated via `mineralui.validation.<key>`. */\nexport function validationFailure(\n key: string,\n template: string,\n params: ValidationMessageParams = {}\n): ValidationResult {\n const result: ValidationResult = {valid: false, error: fillValidationTemplate(template, params)}\n messageInfo.set(result, {key, template, params})\n return result\n}\n\n/** Translation info for a result returned by a built-in `validate*` function, if any. */\nexport function getValidationMessageInfo(result: ValidationResult): ValidationMessageInfo | undefined {\n return messageInfo.get(result)\n}\n"],"mappings":"AAcA,IAAM,EAAc,IAAI,QAExB,SAAgB,EAAuB,EAAkB,EAAyC,CAC9F,OAAO,EAAS,QAAQ,cAAe,EAAO,IAAkB,KAAQ,EAAS,OAAO,EAAO,GAAM,CAAG,EAAO,CAInH,SAAgB,EACZ,EACA,EACA,EAAkC,EAAE,CACpB,CAChB,IAAM,EAA2B,CAAC,MAAO,GAAO,MAAO,EAAuB,EAAU,EAAO,CAAC,CAEhG,OADA,EAAY,IAAI,EAAQ,CAAC,MAAK,WAAU,SAAO,CAAC,CACzC,EAIX,SAAgB,EAAyB,EAA6D,CAClG,OAAO,EAAY,IAAI,EAAO"}
@@ -0,0 +1,2 @@
1
+ const e=require(`./validationMessages-iHu7apWr.cjs`);var t={valid:!0};function n(e){return e.toUpperCase().replace(/[^A-Z0-9]/g,``)}function r(e){let t=e.replace(/\D/g,``).slice(0,5);return t.length<=2?t:`${t.slice(0,2)}-${t.slice(2)}`}function i(e){let t=e.replace(/\D/g,``).slice(0,9);return t.length<=5?t:`${t.slice(0,5)}-${t.slice(5)}`}function a(e,t){return e.replace(/\D/g,``).slice(0,t)}function o(e){return n(e).slice(0,6).split(``).map((e,t)=>t===3?` ${e}`:e).join(``)}function s(e){let t=n(e).slice(0,7);return t.length<=3?t:`${t.slice(0,t.length-3)} ${t.slice(-3)}`}function c(e){let t=n(e).slice(0,6);return t.length<=4?t:`${t.slice(0,4)} ${t.slice(4)}`}var l={PL:{countryCode:`PL`,label:`Poland`,placeholder:`12-345`,example:`00-001`,inputMode:`numeric`,maxLength:6,regex:/^\d{2}-\d{3}$/,sanitize:e=>e.replace(/\D/g,``).slice(0,5),format:r,message:`Use the Polish format XX-XXX`},DE:{countryCode:`DE`,label:`Germany`,placeholder:`12345`,example:`10115`,inputMode:`numeric`,maxLength:5,regex:/^\d{5}$/,sanitize:e=>e.replace(/\D/g,``).slice(0,5),format:e=>a(e,5),message:`Use a 5-digit German postal code`},FR:{countryCode:`FR`,label:`France`,placeholder:`75001`,example:`75001`,inputMode:`numeric`,maxLength:5,regex:/^\d{5}$/,sanitize:e=>e.replace(/\D/g,``).slice(0,5),format:e=>a(e,5),message:`Use a 5-digit French postal code`},ES:{countryCode:`ES`,label:`Spain`,placeholder:`28013`,example:`28013`,inputMode:`numeric`,maxLength:5,regex:/^\d{5}$/,sanitize:e=>e.replace(/\D/g,``).slice(0,5),format:e=>a(e,5),message:`Use a 5-digit Spanish postal code`},IT:{countryCode:`IT`,label:`Italy`,placeholder:`00184`,example:`00184`,inputMode:`numeric`,maxLength:5,regex:/^\d{5}$/,sanitize:e=>e.replace(/\D/g,``).slice(0,5),format:e=>a(e,5),message:`Use a 5-digit Italian postal code`},US:{countryCode:`US`,label:`United States`,placeholder:`12345 or 12345-6789`,example:`10001`,inputMode:`numeric`,maxLength:10,regex:/^\d{5}(?:-\d{4})?$/,sanitize:e=>e.replace(/\D/g,``).slice(0,9),format:i,message:`Use ZIP or ZIP+4 format`},CA:{countryCode:`CA`,label:`Canada`,placeholder:`A1A 1A1`,example:`M5V 3L9`,inputMode:`text`,maxLength:7,regex:/^[A-Z]\d[A-Z] \d[A-Z]\d$/,sanitize:e=>n(e).slice(0,6),format:o,message:`Use the Canadian format A1A 1A1`},GB:{countryCode:`GB`,label:`United Kingdom`,placeholder:`SW1A 1AA`,example:`SW1A 1AA`,inputMode:`text`,maxLength:8,regex:/^[A-Z]{1,2}\d[A-Z\d]? \d[A-Z]{2}$/,sanitize:e=>n(e).slice(0,7),format:s,message:`Use a valid UK postcode`},NL:{countryCode:`NL`,label:`Netherlands`,placeholder:`1234 AB`,example:`1012 AB`,inputMode:`text`,maxLength:7,regex:/^\d{4} [A-Z]{2}$/,sanitize:e=>n(e).slice(0,6),format:c,message:`Use the Dutch format 1234 AB`}},u=Object.values(l).map(({countryCode:e,label:t})=>({value:e,label:t}));function d(e=`PL`){return l[e.toUpperCase()]??l.PL}function f(e,t=`PL`){let n=d(t);return n.format(n.sanitize(e))}function p(n,r=`PL`){if(!n)return t;let i=d(r),a=i.format(i.sanitize(n));return i.regex.test(a)?t:e.r(`postCode.${i.countryCode}`,i.message)}var m={valid:!0},h=e.r;function g(e){return e.trim().length>0?m:h(`required`,`This field is required`)}function _(e){return t=>t.length>=e?m:h(`minLength`,`Minimum {min} characters`,{min:e})}function v(e){return t=>t.length<=e?m:h(`maxLength`,`Maximum {max} characters`,{max:e})}function y(e,t){return n=>e.test(n)?m:t===void 0?h(`pattern`,`Invalid format`):{valid:!1,error:t}}function b(e,t){return n=>{let r=parseFloat(n);return isNaN(r)?h(`number`,`Must be a number`):e!==void 0&&r<e?h(`minValue`,`Minimum value is {min}`,{min:e}):t!==void 0&&r>t?h(`maxValue`,`Maximum value is {max}`,{max:t}):m}}var x=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;function S(e){return e?x.test(e)?m:h(`email`,`Invalid email address`):m}var C={PL:9,DE:10,US:10,GB:10,FR:9,CZ:9,SK:9};function w(e,t){if(!e)return m;let n=e.replace(/\D/g,``);if(n.length<7)return h(`phoneTooShort`,`Phone number too short`);if(n.length>15)return h(`phoneTooLong`,`Phone number too long`);if(t){let e=C[t.toUpperCase()];if(e&&n.length!==e)return h(`phoneDigits`,`Phone number should have {expected} digits`,{expected:e})}return m}var T={AL:28,AD:24,AT:20,AZ:28,BH:22,BY:28,BE:16,BA:20,BR:29,BG:22,CR:22,HR:21,CY:28,CZ:24,DK:18,DO:28,EG:29,SV:28,EE:20,FO:18,FI:18,FR:27,GE:22,DE:22,GI:23,GR:27,GL:18,GT:28,HU:28,IS:26,IQ:23,IE:22,IL:23,IT:27,JO:30,KZ:20,XK:20,KW:30,LV:21,LB:28,LI:21,LT:20,LU:20,MT:31,MR:27,MU:30,MD:24,MC:27,ME:22,NL:18,MK:19,NO:15,PK:24,PS:29,PL:28,PT:25,QA:29,RO:24,LC:32,SM:27,SA:24,RS:22,SC:31,SK:24,SI:19,ES:24,SE:24,CH:21,TL:23,TN:24,TR:26,UA:29,AE:23,GB:22,VA:22,VG:24},E=Object.keys(T).sort();function D(e){return T[e.toUpperCase()]??null}function O(e){let t=0;for(let n=0;n<e.length;n++)t=(t*10+parseInt(e[n],10))%97;return t}function k(e){if(!e)return m;let t=e.replace(/\s/g,``).toUpperCase();if(t.length<2)return h(`ibanTooShort`,`IBAN too short`);let n=t.slice(0,2),r=T[n];return r?t.length===r?O((t.slice(4)+t.slice(0,4)).replace(/[A-Z]/g,e=>String(e.charCodeAt(0)-55)))===1?m:h(`ibanChecksum`,`Invalid IBAN checksum`):h(`ibanLength`,`IBAN for {country} should have {length} characters`,{country:n,length:r}):h(`ibanCountry`,`Unknown IBAN country code`)}var A=[6,5,7,2,3,4,5,6,7];function j(e){if(!e)return m;let t=e.replace(/\D/g,``);if(t.length!==10)return h(`nipDigits`,`NIP must have 10 digits`);let n=0;for(let e=0;e<9;e++)n+=parseInt(t[e],10)*A[e];let r=n%11;return r===10?h(`nip`,`Invalid NIP`):r===parseInt(t[9],10)?m:h(`nipChecksum`,`Invalid NIP checksum`)}var M=[1,3,7,9,1,3,7,9,1,3];function N(e){if(!e)return m;let t=e.replace(/\D/g,``);if(t.length!==11)return h(`peselDigits`,`PESEL must have 11 digits`);let n=0;for(let e=0;e<10;e++)n+=parseInt(t[e],10)*M[e];return(10-n%10)%10===parseInt(t[10],10)?m:h(`peselChecksum`,`Invalid PESEL checksum`)}var P=[8,9,2,3,4,5,6,7],F=[2,4,8,5,0,9,7,3,6,1,2,4,8];function I(e){if(!e)return m;let t=e.replace(/\D/g,``);if(t.length!==9&&t.length!==14)return h(`regonDigits`,`REGON must have 9 or 14 digits`);let n=t.length===9?P:F,r=0;for(let e=0;e<n.length;e++)r+=parseInt(t[e],10)*n[e];return(r%11==10?0:r%11)===parseInt(t[t.length-1],10)?m:h(`regonChecksum`,`Invalid REGON checksum`)}function L(...e){return t=>{for(let n of e){let e=n(t);if(!e.valid)return e}return m}}function R(e,t=`DD/MM/YYYY`){let n=e.replace(/\D/g,``);if(n.length!==8)return null;let r,i,a;if(t===`DD/MM/YYYY`?(r=parseInt(n.slice(0,2),10),i=parseInt(n.slice(2,4),10),a=parseInt(n.slice(4,8),10)):t===`MM/DD/YYYY`?(i=parseInt(n.slice(0,2),10),r=parseInt(n.slice(2,4),10),a=parseInt(n.slice(4,8),10)):(a=parseInt(n.slice(0,4),10),i=parseInt(n.slice(4,6),10),r=parseInt(n.slice(6,8),10)),i<1||i>12||r<1||r>31||a<1)return null;let o=new Date(a,i-1,r);return o.getFullYear()!==a||o.getMonth()!==i-1||o.getDate()!==r?null:o}function z(e,t={}){if(!e)return m;let{format:n=`DD/MM/YYYY`,minDate:r,maxDate:i}=t;if(e.replace(/\D/g,``).length!==8)return h(`dateIncomplete`,`Incomplete date`);let a=R(e,n);return a?r&&a<new Date(r.getFullYear(),r.getMonth(),r.getDate())?h(`dateTooEarly`,`Date is too early`):i&&a>new Date(i.getFullYear(),i.getMonth(),i.getDate())?h(`dateTooLate`,`Date is too far in the future`):m:h(`date`,`Invalid date`)}function B(e,t={}){if(!e)return m;let{protocols:n=[`http`,`https`],requireProtocol:r=!0}=t,i=/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(e);if(!i&&r)return h(`urlProtocolRequired`,`URL must start with {protocols}`,{protocols:n.map(e=>`${e}://`).join(` or `)});let a=i?e:`https://${e}`,o;try{o=new URL(a)}catch{return h(`url`,`Invalid URL`)}if(!o.hostname)return h(`url`,`Invalid URL`);if(i&&n.length>0){let e=o.protocol.replace(/:$/,``);if(!n.includes(e))return h(`urlProtocol`,`Protocol "{protocol}" is not allowed`,{protocol:e})}return m}Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return d}});
2
+ //# sourceMappingURL=validators-SZmLxnir.cjs.map