@feugene/granularity 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (442) hide show
  1. package/README.md +44 -45
  2. package/dist/GrButtonGroup.css +1 -1
  3. package/dist/GrFormFile.css +1 -1
  4. package/dist/GrIcon.css +1 -1
  5. package/dist/GrLoading.css +1 -1
  6. package/dist/GrSkeleton.css +1 -1
  7. package/dist/GrToaster.css +1 -0
  8. package/dist/GrTree.css +1 -1
  9. package/dist/chunks/{adapter-BqqjEZGU.js.map → adapter-CAOxmn2G.js.map} +1 -1
  10. package/dist/chunks/arrow-up-C_G4jg8M.js.map +1 -0
  11. package/dist/chunks/{classTokens-BPeBXNzu.js.map → classTokens-BzazaERD.js.map} +1 -1
  12. package/dist/chunks/{config-A-iei0Ux.js → config-1uSYl98Y.js} +5 -5
  13. package/dist/chunks/{config-A-iei0Ux.js.map → config-1uSYl98Y.js.map} +1 -1
  14. package/dist/chunks/{config-DZrlovR42.js.map → config-8Pcutu1j2.js.map} +1 -1
  15. package/dist/chunks/{config-VJuoznpH.js.map → config-B0qIpo8m.js.map} +1 -1
  16. package/dist/chunks/{config-C8MM2Dg0.js → config-B7IIWGt_2.js} +3 -3
  17. package/dist/chunks/config-B7IIWGt_2.js.map +1 -0
  18. package/dist/chunks/{config-DbghHyY_.js.map → config-BEegFP74.js.map} +1 -1
  19. package/dist/chunks/{config-D_Pafsjq2.js → config-BIRO0vDJ2.js} +6 -6
  20. package/dist/chunks/{config-D_Pafsjq2.js.map → config-BIRO0vDJ2.js.map} +1 -1
  21. package/dist/chunks/{config-BeBsN0c12.js.map → config-BLHqZhy-2.js.map} +1 -1
  22. package/dist/chunks/{config-BV4vBzdm.js.map → config-BNu8lFQB.js.map} +1 -1
  23. package/dist/chunks/config-BOlr7qw7.js +106 -0
  24. package/dist/chunks/config-BOlr7qw7.js.map +1 -0
  25. package/dist/chunks/{config-DhQc1TRY.js.map → config-BUHuGBik.js.map} +1 -1
  26. package/dist/chunks/{config-CPSdAjUi.js.map → config-BWGGp7uV.js.map} +1 -1
  27. package/dist/chunks/config-BX1JTrkV2.js +14 -0
  28. package/dist/chunks/config-BX1JTrkV2.js.map +1 -0
  29. package/dist/chunks/{config-BduXEXjt.js.map → config-BXtAmU3s.js.map} +1 -1
  30. package/dist/chunks/{config-CzgNEHKi.js.map → config-Bah4oHwL.js.map} +1 -1
  31. package/dist/chunks/{config-C_egzT_K.js → config-C49QUoJL.js} +3 -3
  32. package/dist/chunks/{config-C_egzT_K.js.map → config-C49QUoJL.js.map} +1 -1
  33. package/dist/chunks/{config-3I3vqDW4.js → config-C4snOIXg.js} +1 -1
  34. package/dist/chunks/{config-3I3vqDW4.js.map → config-C4snOIXg.js.map} +1 -1
  35. package/dist/chunks/{config-DvDNney3.js → config-C7NpDrfO.js} +5 -5
  36. package/dist/chunks/{config-DvDNney3.js.map → config-C7NpDrfO.js.map} +1 -1
  37. package/dist/chunks/{config-lMDE_8A5.js.map → config-C86UzUYf.js.map} +1 -1
  38. package/dist/chunks/{config-BgBWt9-A.js.map → config-C9AcVDkv.js.map} +1 -1
  39. package/dist/chunks/{config-BuoIngj32.js.map → config-CGHLoBlH2.js.map} +1 -1
  40. package/dist/chunks/{config-ChQxl75m.js.map → config-CThzliFi.js.map} +1 -1
  41. package/dist/chunks/{config-DDwBSoc_.js.map → config-Cb2PAlSD.js.map} +1 -1
  42. package/dist/chunks/{config-XspHtPsU.js → config-ClhKPJvg.js} +5 -5
  43. package/dist/chunks/{config-XspHtPsU.js.map → config-ClhKPJvg.js.map} +1 -1
  44. package/dist/chunks/{config-58Mj2rGH.js → config-Cpi9Mh2J.js} +3 -3
  45. package/dist/chunks/{config-58Mj2rGH.js.map → config-Cpi9Mh2J.js.map} +1 -1
  46. package/dist/chunks/{config-nrOj9p6I.js → config-CrG1XiE7.js} +4 -4
  47. package/dist/chunks/{config-nrOj9p6I.js.map → config-CrG1XiE7.js.map} +1 -1
  48. package/dist/chunks/{config-DRpkoSvq.js → config-CziwTDDL.js} +3 -3
  49. package/dist/chunks/{config-DRpkoSvq.js.map → config-CziwTDDL.js.map} +1 -1
  50. package/dist/chunks/{config-C5-ujXCI.js.map → config-D7GZO-Dx.js.map} +1 -1
  51. package/dist/chunks/{config-CUwF4E4R.js.map → config-DBmdgoVf.js.map} +1 -1
  52. package/dist/chunks/{config-C9MblwGq.js.map → config-DICOd-2X.js.map} +1 -1
  53. package/dist/chunks/{config-C6zT56Jc2.js → config-DUcu1D68.js} +3 -3
  54. package/dist/chunks/config-DUcu1D68.js.map +1 -0
  55. package/dist/chunks/{config-8f8624RN.js → config-D_R56_gT.js} +5 -5
  56. package/dist/chunks/{config-8f8624RN.js.map → config-D_R56_gT.js.map} +1 -1
  57. package/dist/chunks/{config-RjfJFv1Y.js → config-DezDih8_.js} +4 -4
  58. package/dist/chunks/config-DezDih8_.js.map +1 -0
  59. package/dist/chunks/{config-B0uUCaJW.js → config-DnvPqu4g.js} +3 -3
  60. package/dist/chunks/{config-B0uUCaJW.js.map → config-DnvPqu4g.js.map} +1 -1
  61. package/dist/chunks/{config-BLa1TEGm2.js.map → config-DpqOnJiz2.js.map} +1 -1
  62. package/dist/chunks/{config-V3LF-b_F.js.map → config-Dxuwwepq.js.map} +1 -1
  63. package/dist/chunks/{config-Doa_gU40.js.map → config-HZto2PVy.js.map} +1 -1
  64. package/dist/chunks/{config-Dl5aZ5VR.js.map → config-JOtB4mzs.js.map} +1 -1
  65. package/dist/chunks/{config-CWTfyPNI.js.map → config-JpHA4Xx0.js.map} +1 -1
  66. package/dist/chunks/{config-DkeLkzxj2.js → config-LGrZIdaZ2.js} +1 -1
  67. package/dist/chunks/{config-DkeLkzxj2.js.map → config-LGrZIdaZ2.js.map} +1 -1
  68. package/dist/chunks/{config-B3dn-gdC.js.map → config-PFg39mYo.js.map} +1 -1
  69. package/dist/chunks/{config-CU_CBd0k.js → config-QYGvEBu5.js} +2 -2
  70. package/dist/chunks/{config-CU_CBd0k.js.map → config-QYGvEBu5.js.map} +1 -1
  71. package/dist/chunks/{config-Bh4NWWsQ.js.map → config-QaIc_gRa.js.map} +1 -1
  72. package/dist/chunks/{config-vcDVCYXo.js.map → config-U4m9PSql.js.map} +1 -1
  73. package/dist/chunks/{config-C_q_4FrU.js.map → config-ZiXWIRBX.js.map} +1 -1
  74. package/dist/chunks/{config-hSlCXHoG.js → config-eYLZYOUS2.js} +63 -63
  75. package/dist/chunks/config-eYLZYOUS2.js.map +1 -0
  76. package/dist/chunks/{config-DDUPnue12.js.map → config-ipvU0lzP2.js.map} +1 -1
  77. package/dist/chunks/{config-B61cX08u.js → config-jBp9wVv-.js} +4 -4
  78. package/dist/chunks/{config-B61cX08u.js.map → config-jBp9wVv-.js.map} +1 -1
  79. package/dist/chunks/{config-D5ek7VSi.js.map → config-xR4XVmcy.js.map} +1 -1
  80. package/dist/chunks/{dialogShared-BtXUk6Zc.js.map → dialogShared-CxW62PQE.js.map} +1 -1
  81. package/dist/chunks/en-BdtiS2d3.js +138 -0
  82. package/dist/chunks/en-BdtiS2d3.js.map +1 -0
  83. package/dist/chunks/es-BGRMZbe9.js +138 -0
  84. package/dist/chunks/es-BGRMZbe9.js.map +1 -0
  85. package/dist/chunks/{es-CISK11Nv.js → es-DBhctWg-.js} +3 -3
  86. package/dist/chunks/{es-CISK11Nv.js.map → es-DBhctWg-.js.map} +1 -1
  87. package/dist/chunks/{fileValidation-c_iBg74s.js → fileValidation-C3WFaWU2.js} +2 -1
  88. package/dist/chunks/{fileValidation-c_iBg74s.js.map → fileValidation-C3WFaWU2.js.map} +1 -1
  89. package/dist/chunks/{grBadgeStyles-Cq0hH2Ls.js → grBadgeStyles-DrycBuKT.js} +13 -13
  90. package/dist/chunks/grBadgeStyles-DrycBuKT.js.map +1 -0
  91. package/dist/chunks/grButtonStyles-C7Yga_Q1.js +191 -0
  92. package/dist/chunks/grButtonStyles-C7Yga_Q1.js.map +1 -0
  93. package/dist/chunks/{grDropdownStyles-Bqx9hOzU.js → grDropdownStyles-B_-DKytw.js} +2 -2
  94. package/dist/chunks/{grDropdownStyles-Bqx9hOzU.js.map → grDropdownStyles-B_-DKytw.js.map} +1 -1
  95. package/dist/chunks/{grLoadingStyles-DmI-SJ3i.js.map → grLoadingStyles-R5sreH__.js.map} +1 -1
  96. package/dist/chunks/{grModalStyles-FgaKqx50.js → grModalStyles-DWd3i05Q.js} +6 -6
  97. package/dist/chunks/{grModalStyles-FgaKqx50.js.map → grModalStyles-DWd3i05Q.js.map} +1 -1
  98. package/dist/chunks/{grSelectStyles-AjWWl007.js → grSelectStyles-CLK5hRd3.js} +3 -3
  99. package/dist/chunks/grSelectStyles-CLK5hRd3.js.map +1 -0
  100. package/dist/chunks/{grStyle-D-gPHdyW.js → grStyle-Blc9otAx.js} +6 -6
  101. package/dist/chunks/grStyle-Blc9otAx.js.map +1 -0
  102. package/dist/chunks/{granularityI18n-D_7jowK2.js → granularityI18n-DoV7Ca2m.js} +1 -1
  103. package/dist/chunks/{granularityI18n-D_7jowK2.js.map → granularityI18n-DoV7Ca2m.js.map} +1 -1
  104. package/dist/chunks/info-Be2OccTu.js.map +1 -0
  105. package/dist/chunks/loader-circle-CfVLz7lb.js.map +1 -0
  106. package/dist/chunks/ru-BFCnOiML.js +138 -0
  107. package/dist/chunks/ru-BFCnOiML.js.map +1 -0
  108. package/dist/chunks/{safelist-_UVzJrgE2.js → safelist-CkF4v7DC.js} +3 -3
  109. package/dist/chunks/safelist-CkF4v7DC.js.map +1 -0
  110. package/dist/chunks/{safelist-DccvJqCE.js → safelist-Do2RtzLB.js} +3 -3
  111. package/dist/chunks/{safelist-DccvJqCE.js.map → safelist-Do2RtzLB.js.map} +1 -1
  112. package/dist/chunks/shared-ChvcQgDl.js +168 -0
  113. package/dist/chunks/shared-ChvcQgDl.js.map +1 -0
  114. package/dist/chunks/{transition-mJ3PZCHH.js → transition-TLFw4KBn.js} +26 -12
  115. package/dist/chunks/{transition-mJ3PZCHH.js.map → transition-TLFw4KBn.js.map} +1 -1
  116. package/dist/chunks/useAddonMeasurement-DM0akF4C.js +65 -0
  117. package/dist/chunks/useAddonMeasurement-DM0akF4C.js.map +1 -0
  118. package/dist/chunks/useEscapeToClose-C2t_S1gh.js +27 -0
  119. package/dist/chunks/useEscapeToClose-C2t_S1gh.js.map +1 -0
  120. package/dist/chunks/{useFloating-CLtbU7eD.js → useFloating-DtM6TyE4.js} +19 -4
  121. package/dist/chunks/{useFloating-CLtbU7eD.js.map → useFloating-DtM6TyE4.js.map} +1 -1
  122. package/dist/chunks/x-2KXnqxiD.js.map +1 -0
  123. package/dist/chunks/x-circle-BCBURwyX.js.map +1 -0
  124. package/dist/components/GrAlert/chunks/{GrAlert-HyCjYJeL.js → GrAlert-DPJSU_fG.js} +40 -37
  125. package/dist/components/GrAlert/chunks/GrAlert-DPJSU_fG.js.map +1 -0
  126. package/dist/components/GrAlert/index.js +2 -2
  127. package/dist/components/GrAvatar/chunks/{GrAvatar-BjnPKNAL.js → GrAvatar-96CpTCq5.js} +2 -2
  128. package/dist/components/GrAvatar/chunks/{GrAvatar-BjnPKNAL.js.map → GrAvatar-96CpTCq5.js.map} +1 -1
  129. package/dist/components/GrAvatar/index.js +2 -2
  130. package/dist/components/GrBadge/chunks/{GrBadge-Cs_cVfuO.js → GrBadge-B77XlaqE.js} +3 -3
  131. package/dist/components/GrBadge/chunks/{GrBadge-Cs_cVfuO.js.map → GrBadge-B77XlaqE.js.map} +1 -1
  132. package/dist/components/GrBadge/index.js +2 -2
  133. package/dist/components/GrBadgeWrap/chunks/{GrBadgeWrap-BEnE9DyJ.js → GrBadgeWrap-CcktMOdg.js} +2 -2
  134. package/dist/components/GrBadgeWrap/chunks/{GrBadgeWrap-BEnE9DyJ.js.map → GrBadgeWrap-CcktMOdg.js.map} +1 -1
  135. package/dist/components/GrBadgeWrap/index.js +2 -2
  136. package/dist/components/GrBottomNav/chunks/{GrBottomNav-XPHwd7UQ.js.map → GrBottomNav-usuMgG8_.js.map} +1 -1
  137. package/dist/components/GrBottomNav/index.js +2 -2
  138. package/dist/components/GrButton/chunks/GrButton-BlffdeJr.js +124 -0
  139. package/dist/components/GrButton/chunks/GrButton-BlffdeJr.js.map +1 -0
  140. package/dist/components/GrButton/index.js +4 -4
  141. package/dist/components/GrButtonGroup/chunks/{GrButtonGroup-CPOH6V-P.js → GrButtonGroup-Bs9dEKfA.js} +1 -1
  142. package/dist/components/GrButtonGroup/chunks/GrButtonGroup-Bs9dEKfA.js.map +1 -0
  143. package/dist/components/GrButtonGroup/index.js +2 -2
  144. package/dist/components/GrCard/chunks/{GrCard-6yk1RRAQ.js → GrCard-DUNMkuHW.js} +3 -3
  145. package/dist/components/GrCard/chunks/GrCard-DUNMkuHW.js.map +1 -0
  146. package/dist/components/GrCard/index.js +2 -2
  147. package/dist/components/GrCheckbox/chunks/{GrCheckbox-Bt3d7ckE.js → GrCheckbox-DJhzZZdO.js} +66 -18
  148. package/dist/components/GrCheckbox/chunks/GrCheckbox-DJhzZZdO.js.map +1 -0
  149. package/dist/components/GrCheckbox/index.js +2 -2
  150. package/dist/components/GrCollapse/chunks/{GrCollapse-CU94BTAR.js → GrCollapse-CPPLh_xU.js} +12 -12
  151. package/dist/components/GrCollapse/chunks/{GrCollapse-CU94BTAR.js.map → GrCollapse-CPPLh_xU.js.map} +1 -1
  152. package/dist/components/GrCollapse/index.js +2 -2
  153. package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-Bi2KLumL.js → GrConfirmDialog-BWYKCsHd.js} +20 -14
  154. package/dist/components/GrConfirmDialog/chunks/GrConfirmDialog-BWYKCsHd.js.map +1 -0
  155. package/dist/components/GrConfirmDialog/index.js +2 -2
  156. package/dist/components/GrDataTable/chunks/{GrDataTable-ClcYiyc8.js → GrDataTable-ptbARmJ3.js} +7 -7
  157. package/dist/components/GrDataTable/chunks/{GrDataTable-ClcYiyc8.js.map → GrDataTable-ptbARmJ3.js.map} +1 -1
  158. package/dist/components/GrDataTable/index.js +2 -2
  159. package/dist/components/GrDialog/chunks/{GrDialog-CxK4Lj4F.js → GrDialog-5DAS-1Lb.js} +14 -12
  160. package/dist/components/GrDialog/chunks/GrDialog-5DAS-1Lb.js.map +1 -0
  161. package/dist/components/GrDialog/index.js +3 -3
  162. package/dist/components/GrDialogService/chunks/GrDialogService-DY_fmaMu.js +425 -0
  163. package/dist/components/GrDialogService/chunks/GrDialogService-DY_fmaMu.js.map +1 -0
  164. package/dist/components/GrDialogService/index.js +3 -0
  165. package/dist/components/GrDrawer/chunks/{GrDrawer-BW3wtI7h.js → GrDrawer-D1kzsjXN.js} +19 -15
  166. package/dist/components/GrDrawer/chunks/GrDrawer-D1kzsjXN.js.map +1 -0
  167. package/dist/components/GrDrawer/index.js +2 -2
  168. package/dist/components/GrDropdown/chunks/{GrDropdown-BGKeEfZ1.js → GrDropdown-BXb5Cxxf.js} +9 -19
  169. package/dist/components/GrDropdown/chunks/GrDropdown-BXb5Cxxf.js.map +1 -0
  170. package/dist/components/GrDropdown/index.js +2 -2
  171. package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-CJom_-c2.js → GrDropdownMenu-DFEJLPcV.js} +10 -10
  172. package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-CJom_-c2.js.map → GrDropdownMenu-DFEJLPcV.js.map} +1 -1
  173. package/dist/components/GrDropdownMenu/index.js +2 -2
  174. package/dist/components/GrEmptyState/chunks/{GrEmptyState-yOuZW7-t.js → GrEmptyState-CA3BiTV7.js} +3 -3
  175. package/dist/components/GrEmptyState/chunks/{GrEmptyState-yOuZW7-t.js.map → GrEmptyState-CA3BiTV7.js.map} +1 -1
  176. package/dist/components/GrEmptyState/index.js +2 -2
  177. package/dist/components/GrFileUpload/chunks/{GrFileUpload-CBKK3dgC.js → GrFileUpload-DvWPpiJS.js} +26 -23
  178. package/dist/components/GrFileUpload/chunks/GrFileUpload-DvWPpiJS.js.map +1 -0
  179. package/dist/components/GrFileUpload/index.js +3 -3
  180. package/dist/components/GrFormField/chunks/{GrFormField-U7c_aDPJ.js → GrFormField-BujNQrw8.js} +1 -1
  181. package/dist/components/GrFormField/chunks/{GrFormField-U7c_aDPJ.js.map → GrFormField-BujNQrw8.js.map} +1 -1
  182. package/dist/components/GrFormField/index.js +2 -2
  183. package/dist/components/GrFormFile/chunks/{GrFormFile-CkR6cYqf.js → GrFormFile-CXcqqdvV.js} +38 -31
  184. package/dist/components/GrFormFile/chunks/GrFormFile-CXcqqdvV.js.map +1 -0
  185. package/dist/components/GrFormFile/index.js +2 -2
  186. package/dist/components/GrFormSection/chunks/{GrFormSection-dbyzqxYk.js → GrFormSection-Ce21jcgo.js} +1 -1
  187. package/dist/components/GrFormSection/chunks/{GrFormSection-dbyzqxYk.js.map → GrFormSection-Ce21jcgo.js.map} +1 -1
  188. package/dist/components/GrFormSection/index.js +2 -2
  189. package/dist/components/GrIcon/chunks/{GrIcon-BV7RBU_0.js → GrIcon-D9AWQLk2.js} +3 -3
  190. package/dist/components/GrIcon/chunks/{GrIcon-BV7RBU_0.js.map → GrIcon-D9AWQLk2.js.map} +1 -1
  191. package/dist/components/GrIcon/index.js +2 -2
  192. package/dist/components/GrImageViewer/chunks/{GrImageViewer-BG40DsHa.js → GrImageViewer-OCUIrNh2.js} +44 -33
  193. package/dist/components/GrImageViewer/chunks/GrImageViewer-OCUIrNh2.js.map +1 -0
  194. package/dist/components/GrImageViewer/index.js +2 -2
  195. package/dist/components/GrInput/chunks/{GrInput-gwFQ1sk4.js → GrInput-C8pOJgCi.js} +43 -66
  196. package/dist/components/GrInput/chunks/GrInput-C8pOJgCi.js.map +1 -0
  197. package/dist/components/GrInput/index.js +2 -2
  198. package/dist/components/GrInputTag/chunks/{GrInputTag-g-KdUI_Z.js → GrInputTag-zMgFqp2g.js} +27 -24
  199. package/dist/components/GrInputTag/chunks/GrInputTag-zMgFqp2g.js.map +1 -0
  200. package/dist/components/GrInputTag/index.js +2 -2
  201. package/dist/components/GrLink/chunks/{GrLink-KSTmk9Yq.js → GrLink-CYUe-Q8k.js} +14 -7
  202. package/dist/components/GrLink/chunks/GrLink-CYUe-Q8k.js.map +1 -0
  203. package/dist/components/GrLink/index.js +2 -2
  204. package/dist/components/GrList/chunks/{GrList-CUW2sRm_.js → GrList-Dx772Ns4.js} +1 -1
  205. package/dist/components/GrList/chunks/{GrList-CUW2sRm_.js.map → GrList-Dx772Ns4.js.map} +1 -1
  206. package/dist/components/GrList/index.js +2 -2
  207. package/dist/components/GrLoading/chunks/{GrLoading-mfyfghxs.js → GrLoading--X_7rdbb.js} +7 -7
  208. package/dist/components/GrLoading/chunks/{GrLoading-mfyfghxs.js.map → GrLoading--X_7rdbb.js.map} +1 -1
  209. package/dist/components/GrLoading/index.js +2 -2
  210. package/dist/components/GrModal/chunks/{GrModal-CSOL3fHQ.js → GrModal-BkjW9jZS.js} +7 -7
  211. package/dist/components/GrModal/chunks/{GrModal-CSOL3fHQ.js.map → GrModal-BkjW9jZS.js.map} +1 -1
  212. package/dist/components/GrModal/index.js +3 -3
  213. package/dist/components/GrNavbar/chunks/{GrNavbar-CHxwtFIR.js → GrNavbar-DW3MiIIf.js} +6 -6
  214. package/dist/components/GrNavbar/chunks/{GrNavbar-CHxwtFIR.js.map → GrNavbar-DW3MiIIf.js.map} +1 -1
  215. package/dist/components/GrNavbar/index.js +2 -2
  216. package/dist/components/GrNumberInput/chunks/{GrNumberInput-ClPBwkxx.js → GrNumberInput-CldPIWQx.js} +51 -61
  217. package/dist/components/GrNumberInput/chunks/GrNumberInput-CldPIWQx.js.map +1 -0
  218. package/dist/components/GrNumberInput/index.js +2 -2
  219. package/dist/components/GrPagination/chunks/{GrPagination-D2GS0ShQ.js → GrPagination-Bu9wv6it.js} +76 -25
  220. package/dist/components/GrPagination/chunks/GrPagination-Bu9wv6it.js.map +1 -0
  221. package/dist/components/GrPagination/index.js +2 -2
  222. package/dist/components/GrProgressBar/chunks/{GrProgressBar-BBSFpVEq.js → GrProgressBar-CC3z-Zqp.js} +3 -3
  223. package/dist/components/GrProgressBar/chunks/{GrProgressBar-BBSFpVEq.js.map → GrProgressBar-CC3z-Zqp.js.map} +1 -1
  224. package/dist/components/GrProgressBar/index.js +2 -2
  225. package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-D_TFqKsF.js → GrPromptDialog-TmWXbpEP.js} +31 -23
  226. package/dist/components/GrPromptDialog/chunks/GrPromptDialog-TmWXbpEP.js.map +1 -0
  227. package/dist/components/GrPromptDialog/index.js +2 -2
  228. package/dist/components/GrRadio/chunks/{GrRadio-CSbTnrom.js → GrRadio-CPTixXaY.js} +6 -6
  229. package/dist/components/GrRadio/chunks/{GrRadio-CSbTnrom.js.map → GrRadio-CPTixXaY.js.map} +1 -1
  230. package/dist/components/GrRadio/index.js +2 -2
  231. package/dist/components/GrRadioGroup/chunks/{GrRadioGroup-DsrnTygR.js → GrRadioGroup-vKZCbkCp.js} +3 -3
  232. package/dist/components/GrRadioGroup/chunks/{GrRadioGroup-DsrnTygR.js.map → GrRadioGroup-vKZCbkCp.js.map} +1 -1
  233. package/dist/components/GrRadioGroup/index.js +2 -2
  234. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-K1uZ1mYD.js → GrResponseErrorBanner-BWJNe2gr.js} +21 -18
  235. package/dist/components/GrResponseErrorBanner/chunks/GrResponseErrorBanner-BWJNe2gr.js.map +1 -0
  236. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-bM8FC_Bw.js → GrResponseErrorBanner-Cdu9ekK9.js} +5 -5
  237. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-bM8FC_Bw.js.map → GrResponseErrorBanner-Cdu9ekK9.js.map} +1 -1
  238. package/dist/components/GrResponseErrorBanner/index.js +2 -2
  239. package/dist/components/GrSegmented/chunks/{GrSegmented-DpZGs4VX.js → GrSegmented-C1y0UXpQ.js} +5 -5
  240. package/dist/components/GrSegmented/chunks/{GrSegmented-DpZGs4VX.js.map → GrSegmented-C1y0UXpQ.js.map} +1 -1
  241. package/dist/components/GrSegmented/index.js +2 -2
  242. package/dist/components/GrSelect/chunks/{GrSelect-DSz7jvUb.js → GrSelect-RShK21lK.js} +84 -64
  243. package/dist/components/GrSelect/chunks/GrSelect-RShK21lK.js.map +1 -0
  244. package/dist/components/GrSelect/index.js +2 -2
  245. package/dist/components/GrSidebar/chunks/GrSidebar-DkWozzwA.js +238 -0
  246. package/dist/components/GrSidebar/chunks/GrSidebar-DkWozzwA.js.map +1 -0
  247. package/dist/components/GrSidebar/index.js +3 -3
  248. package/dist/components/GrSkeleton/chunks/{GrSkeleton-B05K0QKh.js → GrSkeleton-DsN-_CDZ.js} +1 -1
  249. package/dist/components/GrSkeleton/chunks/{GrSkeleton-B05K0QKh.js.map → GrSkeleton-DsN-_CDZ.js.map} +1 -1
  250. package/dist/components/GrSkeleton/index.js +2 -2
  251. package/dist/components/GrSwitch/chunks/{GrSwitch-CSRtcN5-.js → GrSwitch-DAioyccZ.js} +10 -10
  252. package/dist/components/GrSwitch/chunks/{GrSwitch-CSRtcN5-.js.map → GrSwitch-DAioyccZ.js.map} +1 -1
  253. package/dist/components/GrSwitch/index.js +2 -2
  254. package/dist/components/GrTable/chunks/{GrTable-dTWUxzRm.js → GrTable-Db3hRnKA.js} +3 -3
  255. package/dist/components/GrTable/chunks/{GrTable-dTWUxzRm.js.map → GrTable-Db3hRnKA.js.map} +1 -1
  256. package/dist/components/GrTable/index.js +2 -2
  257. package/dist/components/GrTabs/chunks/{GrTabs-BfeVNMFJ.js → GrTabs-Z-FDJUr_.js} +3 -3
  258. package/dist/components/GrTabs/chunks/{GrTabs-BfeVNMFJ.js.map → GrTabs-Z-FDJUr_.js.map} +1 -1
  259. package/dist/components/GrTabs/index.js +2 -2
  260. package/dist/components/GrTextarea/chunks/{GrTextarea-CBBzpF2S.js → GrTextarea-D56YxhKq.js} +3 -3
  261. package/dist/components/GrTextarea/chunks/{GrTextarea-CBBzpF2S.js.map → GrTextarea-D56YxhKq.js.map} +1 -1
  262. package/dist/components/GrTextarea/index.js +2 -2
  263. package/dist/components/GrToaster/chunks/GrToaster-eI8YvnIo.js +189 -0
  264. package/dist/components/GrToaster/chunks/GrToaster-eI8YvnIo.js.map +1 -0
  265. package/dist/components/GrToaster/index.js +2 -2
  266. package/dist/components/GrTooltip/chunks/{GrTooltip-BC-40SA5.js → GrTooltip-BeyZ8ssR.js} +10 -10
  267. package/dist/components/GrTooltip/chunks/{GrTooltip-BC-40SA5.js.map → GrTooltip-BeyZ8ssR.js.map} +1 -1
  268. package/dist/components/GrTooltip/index.js +2 -2
  269. package/dist/components/GrTree/chunks/{GrTree-uZr5SyQI.js → GrTree-D3ODe2dB.js} +40 -35
  270. package/dist/components/GrTree/chunks/GrTree-D3ODe2dB.js.map +1 -0
  271. package/dist/components/GrTree/index.js +2 -2
  272. package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-CytivcCa.js → GrTreeSelect-B2xBKs5Q.js} +16 -16
  273. package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-CytivcCa.js.map → GrTreeSelect-B2xBKs5Q.js.map} +1 -1
  274. package/dist/components/GrTreeSelect/index.js +2 -2
  275. package/dist/composables/useTheme.js +48 -8
  276. package/dist/composables/useTheme.js.map +1 -1
  277. package/dist/composables/useToast.js +88 -26
  278. package/dist/composables/useToast.js.map +1 -1
  279. package/dist/directives/autofocus.js.map +1 -1
  280. package/dist/directives/autosize.js.map +1 -1
  281. package/dist/directives/clickOutside.js.map +1 -1
  282. package/dist/directives/dropzone.js +6 -5
  283. package/dist/directives/dropzone.js.map +1 -1
  284. package/dist/directives/hotkey.js +24 -7
  285. package/dist/directives/hotkey.js.map +1 -1
  286. package/dist/directives/loading.js +2 -2
  287. package/dist/directives/loading.js.map +1 -1
  288. package/dist/fileValidation/index.js +1 -1
  289. package/dist/granular-provider-node.js +7 -7
  290. package/dist/granular-provider-node.js.map +1 -1
  291. package/dist/granular-provider.js +1 -1
  292. package/dist/granular-provider.js.map +1 -1
  293. package/dist/i18n/all.js +1 -1
  294. package/dist/i18n/all.js.map +1 -1
  295. package/dist/i18n/index.js +2 -2
  296. package/dist/index.js +109 -534
  297. package/dist/index.js.map +1 -1
  298. package/dist/styles/base.css +32 -0
  299. package/dist/styles/index.css +15 -0
  300. package/dist/styles/preflight.css +29 -0
  301. package/dist/styles/themes/dark.css +107 -0
  302. package/dist/styles/themes/light.css +98 -0
  303. package/dist/styles/tokens.css +135 -0
  304. package/dist/types/src/components/GrButton/GrButton.vue.d.ts +25 -2
  305. package/dist/types/src/components/GrCheckbox/GrCheckbox.vue.d.ts +7 -2
  306. package/dist/types/src/components/GrConfirmDialog/GrConfirmDialog.vue.d.ts +8 -8
  307. package/dist/types/src/components/GrDataTable/GrDataTable.vue.d.ts +1 -1
  308. package/dist/types/src/components/GrDialog/GrDialog.vue.d.ts +2 -2
  309. package/dist/types/src/components/GrDialog/GrDialogHeader.vue.d.ts +2 -2
  310. package/dist/types/src/components/GrDrawer/GrDrawer.vue.d.ts +2 -2
  311. package/dist/types/src/components/GrFileUpload/GrFileUpload.vue.d.ts +4 -4
  312. package/dist/types/src/components/GrFormFile/GrFormFile.vue.d.ts +11 -11
  313. package/dist/types/src/components/GrImageViewer/GrImageViewer.vue.d.ts +18 -18
  314. package/dist/types/src/components/GrInput/GrInput.vue.d.ts +14 -0
  315. package/dist/types/src/components/GrInput/grInputStyles.d.ts +3 -3
  316. package/dist/types/src/components/GrInputTag/GrInputTag.vue.d.ts +2 -2
  317. package/dist/types/src/components/GrLink/GrLink.vue.d.ts +12 -6
  318. package/dist/types/src/components/GrLink/grLinkStyles.d.ts +31 -3
  319. package/dist/types/src/components/GrLink/index.d.ts +1 -1
  320. package/dist/types/src/components/GrLoading/GrLoading.vue.d.ts +1 -1
  321. package/dist/types/src/components/GrModal/grModalStyles.d.ts +1 -1
  322. package/dist/types/src/components/GrNumberInput/GrNumberInput.vue.d.ts +17 -4
  323. package/dist/types/src/components/GrPagination/GrPagination.vue.d.ts +13 -1
  324. package/dist/types/src/components/GrPromptDialog/GrPromptDialog.vue.d.ts +12 -12
  325. package/dist/types/src/components/GrSegmented/GrSegmented.vue.d.ts +1 -1
  326. package/dist/types/src/components/GrSegmented/grSegmentedStyles.d.ts +5 -5
  327. package/dist/types/src/components/GrSelect/GrSelect.vue.d.ts +1 -1
  328. package/dist/types/src/components/GrSelect/grSelectStyles.d.ts +2 -1
  329. package/dist/types/src/components/GrSidebar/GrSidebar.vue.d.ts +33 -10
  330. package/dist/types/src/components/GrSidebar/GrSidebarItem.vue.d.ts +64 -0
  331. package/dist/types/src/components/GrSidebar/index.d.ts +1 -0
  332. package/dist/types/src/components/GrSidebar/sidebarContext.d.ts +9 -0
  333. package/dist/types/src/components/GrSwitch/GrSwitch.vue.d.ts +1 -1
  334. package/dist/types/src/components/GrSwitch/grSwitchStyles.d.ts +2 -2
  335. package/dist/types/src/components/GrToaster/GrToaster.vue.d.ts +9 -4
  336. package/dist/types/src/components/GrTree/GrTree.vue.d.ts +1 -1
  337. package/dist/types/src/components/GrTreeSelect/GrTreeSelect.vue.d.ts +2 -2
  338. package/dist/types/src/components/GrTreeSelect/grTreeSelectStyles.d.ts +1 -1
  339. package/dist/types/src/components/GrTreeSelect/grTreeSelectTypes.d.ts +1 -1
  340. package/dist/types/src/composables/internal/useAddonMeasurement.d.ts +18 -0
  341. package/dist/types/src/composables/internal/useEscapeToClose.d.ts +11 -0
  342. package/dist/types/src/composables/useTheme.d.ts +5 -2
  343. package/dist/types/src/composables/useToast.d.ts +33 -1
  344. package/dist/types/src/directives/hotkey.d.ts +14 -0
  345. package/dist/types/src/granular-provider/shared.d.ts +1 -3
  346. package/dist/types/src/i18n/messages/en.d.ts +120 -0
  347. package/dist/types/src/i18n/messages/es.d.ts +120 -0
  348. package/dist/types/src/i18n/messages/ru.d.ts +120 -0
  349. package/dist/types/src/index.d.ts +2 -2
  350. package/dist/vue/index.js.map +1 -1
  351. package/dist/web-types.json +4673 -0
  352. package/package.json +26 -20
  353. package/dist/chunks/arrow-up-DZdIrpaF.js.map +0 -1
  354. package/dist/chunks/config-C6zT56Jc2.js.map +0 -1
  355. package/dist/chunks/config-C8MM2Dg0.js.map +0 -1
  356. package/dist/chunks/config-NkbzVFZo.js +0 -59
  357. package/dist/chunks/config-NkbzVFZo.js.map +0 -1
  358. package/dist/chunks/config-RjfJFv1Y.js.map +0 -1
  359. package/dist/chunks/config-hSlCXHoG.js.map +0 -1
  360. package/dist/chunks/en-B_fSdoTi.js +0 -72
  361. package/dist/chunks/en-B_fSdoTi.js.map +0 -1
  362. package/dist/chunks/es-DKP6fLir.js +0 -72
  363. package/dist/chunks/es-DKP6fLir.js.map +0 -1
  364. package/dist/chunks/grBadgeStyles-Cq0hH2Ls.js.map +0 -1
  365. package/dist/chunks/grButtonStyles-DKuXUemw.js +0 -191
  366. package/dist/chunks/grButtonStyles-DKuXUemw.js.map +0 -1
  367. package/dist/chunks/grSelectStyles-AjWWl007.js.map +0 -1
  368. package/dist/chunks/grStyle-D-gPHdyW.js.map +0 -1
  369. package/dist/chunks/info-C0bHmdZq.js.map +0 -1
  370. package/dist/chunks/loader-circle-BUntgosj.js.map +0 -1
  371. package/dist/chunks/ru-S6VlnurJ.js +0 -72
  372. package/dist/chunks/ru-S6VlnurJ.js.map +0 -1
  373. package/dist/chunks/safelist-_UVzJrgE2.js.map +0 -1
  374. package/dist/chunks/shared-DpjTvFno.js +0 -169
  375. package/dist/chunks/shared-DpjTvFno.js.map +0 -1
  376. package/dist/chunks/x-Pa6C2hwi.js.map +0 -1
  377. package/dist/chunks/x-circle-DQSlBLmX.js.map +0 -1
  378. package/dist/components/GrAlert/chunks/GrAlert-HyCjYJeL.js.map +0 -1
  379. package/dist/components/GrButton/chunks/GrButton-CPDKonoB.js +0 -83
  380. package/dist/components/GrButton/chunks/GrButton-CPDKonoB.js.map +0 -1
  381. package/dist/components/GrButtonGroup/chunks/GrButtonGroup-CPOH6V-P.js.map +0 -1
  382. package/dist/components/GrCard/chunks/GrCard-6yk1RRAQ.js.map +0 -1
  383. package/dist/components/GrCheckbox/chunks/GrCheckbox-Bt3d7ckE.js.map +0 -1
  384. package/dist/components/GrConfirmDialog/chunks/GrConfirmDialog-Bi2KLumL.js.map +0 -1
  385. package/dist/components/GrDialog/chunks/GrDialog-CxK4Lj4F.js.map +0 -1
  386. package/dist/components/GrDrawer/chunks/GrDrawer-BW3wtI7h.js.map +0 -1
  387. package/dist/components/GrDropdown/chunks/GrDropdown-BGKeEfZ1.js.map +0 -1
  388. package/dist/components/GrFileUpload/chunks/GrFileUpload-CBKK3dgC.js.map +0 -1
  389. package/dist/components/GrFormFile/chunks/GrFormFile-CkR6cYqf.js.map +0 -1
  390. package/dist/components/GrImageViewer/chunks/GrImageViewer-BG40DsHa.js.map +0 -1
  391. package/dist/components/GrInput/chunks/GrInput-gwFQ1sk4.js.map +0 -1
  392. package/dist/components/GrInputTag/chunks/GrInputTag-g-KdUI_Z.js.map +0 -1
  393. package/dist/components/GrLink/chunks/GrLink-KSTmk9Yq.js.map +0 -1
  394. package/dist/components/GrNumberInput/chunks/GrNumberInput-ClPBwkxx.js.map +0 -1
  395. package/dist/components/GrPagination/chunks/GrPagination-D2GS0ShQ.js.map +0 -1
  396. package/dist/components/GrPromptDialog/chunks/GrPromptDialog-D_TFqKsF.js.map +0 -1
  397. package/dist/components/GrResponseErrorBanner/chunks/GrResponseErrorBanner-K1uZ1mYD.js.map +0 -1
  398. package/dist/components/GrSelect/chunks/GrSelect-DSz7jvUb.js.map +0 -1
  399. package/dist/components/GrSidebar/chunks/GrSidebar-BW8LRMZ-.js +0 -44
  400. package/dist/components/GrSidebar/chunks/GrSidebar-BW8LRMZ-.js.map +0 -1
  401. package/dist/components/GrToaster/chunks/GrToaster-C6_iHk2J.js +0 -172
  402. package/dist/components/GrToaster/chunks/GrToaster-C6_iHk2J.js.map +0 -1
  403. package/dist/components/GrTree/chunks/GrTree-uZr5SyQI.js.map +0 -1
  404. /package/dist/chunks/{_plugin-vue_export-helper-DQR7Sy7Q.js → _plugin-vue_export-helper-BOaGB7Aw.js} +0 -0
  405. /package/dist/chunks/{adapter-BqqjEZGU.js → adapter-CAOxmn2G.js} +0 -0
  406. /package/dist/chunks/{arrow-up-DZdIrpaF.js → arrow-up-C_G4jg8M.js} +0 -0
  407. /package/dist/chunks/{classTokens-BPeBXNzu.js → classTokens-BzazaERD.js} +0 -0
  408. /package/dist/chunks/{config-DZrlovR42.js → config-8Pcutu1j2.js} +0 -0
  409. /package/dist/chunks/{config-VJuoznpH.js → config-B0qIpo8m.js} +0 -0
  410. /package/dist/chunks/{config-DbghHyY_.js → config-BEegFP74.js} +0 -0
  411. /package/dist/chunks/{config-BeBsN0c12.js → config-BLHqZhy-2.js} +0 -0
  412. /package/dist/chunks/{config-BV4vBzdm.js → config-BNu8lFQB.js} +0 -0
  413. /package/dist/chunks/{config-DhQc1TRY.js → config-BUHuGBik.js} +0 -0
  414. /package/dist/chunks/{config-CPSdAjUi.js → config-BWGGp7uV.js} +0 -0
  415. /package/dist/chunks/{config-BduXEXjt.js → config-BXtAmU3s.js} +0 -0
  416. /package/dist/chunks/{config-CzgNEHKi.js → config-Bah4oHwL.js} +0 -0
  417. /package/dist/chunks/{config-lMDE_8A5.js → config-C86UzUYf.js} +0 -0
  418. /package/dist/chunks/{config-BgBWt9-A.js → config-C9AcVDkv.js} +0 -0
  419. /package/dist/chunks/{config-BuoIngj32.js → config-CGHLoBlH2.js} +0 -0
  420. /package/dist/chunks/{config-ChQxl75m.js → config-CThzliFi.js} +0 -0
  421. /package/dist/chunks/{config-DDwBSoc_.js → config-Cb2PAlSD.js} +0 -0
  422. /package/dist/chunks/{config-C5-ujXCI.js → config-D7GZO-Dx.js} +0 -0
  423. /package/dist/chunks/{config-CUwF4E4R.js → config-DBmdgoVf.js} +0 -0
  424. /package/dist/chunks/{config-C9MblwGq.js → config-DICOd-2X.js} +0 -0
  425. /package/dist/chunks/{config-BLa1TEGm2.js → config-DpqOnJiz2.js} +0 -0
  426. /package/dist/chunks/{config-V3LF-b_F.js → config-Dxuwwepq.js} +0 -0
  427. /package/dist/chunks/{config-Doa_gU40.js → config-HZto2PVy.js} +0 -0
  428. /package/dist/chunks/{config-Dl5aZ5VR.js → config-JOtB4mzs.js} +0 -0
  429. /package/dist/chunks/{config-CWTfyPNI.js → config-JpHA4Xx0.js} +0 -0
  430. /package/dist/chunks/{config-B3dn-gdC.js → config-PFg39mYo.js} +0 -0
  431. /package/dist/chunks/{config-Bh4NWWsQ.js → config-QaIc_gRa.js} +0 -0
  432. /package/dist/chunks/{config-vcDVCYXo.js → config-U4m9PSql.js} +0 -0
  433. /package/dist/chunks/{config-C_q_4FrU.js → config-ZiXWIRBX.js} +0 -0
  434. /package/dist/chunks/{config-DDUPnue12.js → config-ipvU0lzP2.js} +0 -0
  435. /package/dist/chunks/{config-D5ek7VSi.js → config-xR4XVmcy.js} +0 -0
  436. /package/dist/chunks/{dialogShared-BtXUk6Zc.js → dialogShared-CxW62PQE.js} +0 -0
  437. /package/dist/chunks/{grLoadingStyles-DmI-SJ3i.js → grLoadingStyles-R5sreH__.js} +0 -0
  438. /package/dist/chunks/{info-C0bHmdZq.js → info-Be2OccTu.js} +0 -0
  439. /package/dist/chunks/{loader-circle-BUntgosj.js → loader-circle-CfVLz7lb.js} +0 -0
  440. /package/dist/chunks/{x-Pa6C2hwi.js → x-2KXnqxiD.js} +0 -0
  441. /package/dist/chunks/{x-circle-DQSlBLmX.js → x-circle-BCBURwyX.js} +0 -0
  442. /package/dist/components/GrBottomNav/chunks/{GrBottomNav-XPHwd7UQ.js → GrBottomNav-usuMgG8_.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"clickOutside.js","names":[],"sources":["../../src/directives/clickOutside.ts"],"sourcesContent":["import type { Directive } from 'vue'\n\nexport type ClickOutsideHandler = (event: MouseEvent | TouchEvent | PointerEvent) => void\n\nexport type ClickOutsideExclude = HTMLElement | string | (() => HTMLElement | null | undefined)\n\nexport type ClickOutsideBindingValue =\n | ClickOutsideHandler\n | {\n handler: ClickOutsideHandler\n /** По умолчанию `true`. */\n enabled?: boolean\n /** По умолчанию `true` (слушаем в capture, чтобы stopPropagation внутри не ломал закрытие). */\n capture?: boolean\n /** Список событий. По умолчанию `['click']`. */\n events?: Array<'click' | 'mousedown' | 'touchstart' | 'pointerdown'>\n /** Элементы/селекторы, клики по которым считаются \"внутри\". */\n exclude?: ClickOutsideExclude[]\n }\n\ntype NormalizedOptions = {\n enabled: boolean\n capture: boolean\n events: Array<'click' | 'mousedown' | 'touchstart' | 'pointerdown'>\n handler: ClickOutsideHandler | undefined\n exclude: ClickOutsideExclude[]\n}\n\nfunction normalize(value: ClickOutsideBindingValue | undefined): NormalizedOptions {\n if (typeof value === 'function') {\n return { enabled: true, capture: true, events: ['click'], handler: value, exclude: [] }\n }\n\n if (value && typeof value === 'object') {\n return {\n enabled: value.enabled ?? true,\n capture: value.capture ?? true,\n events: value.events?.length ? value.events : ['click'],\n handler: value.handler,\n exclude: value.exclude ?? [],\n }\n }\n\n return { enabled: false, capture: true, events: ['click'], handler: undefined, exclude: [] }\n}\n\nfunction isEventInside(el: HTMLElement, event: Event): boolean {\n const target = event.target as Node | null\n if (!target) return false\n\n const composedPath = (event as any).composedPath?.() as EventTarget[] | undefined\n if (Array.isArray(composedPath)) {\n return composedPath.includes(el)\n }\n\n return el.contains(target)\n}\n\nfunction resolveExclude(doc: Document, exclude: ClickOutsideExclude[]): HTMLElement[] {\n const resolved: HTMLElement[] = []\n\n for (const item of exclude) {\n if (typeof item === 'string') {\n const found = doc.querySelector(item)\n if (found instanceof HTMLElement) resolved.push(found)\n continue\n }\n\n if (typeof item === 'function') {\n const found = item()\n if (found instanceof HTMLElement) resolved.push(found)\n continue\n }\n\n if (item instanceof HTMLElement) {\n resolved.push(item)\n }\n }\n\n return resolved\n}\n\ntype InternalState = {\n options: NormalizedOptions\n doc: Document\n listener: (event: Event) => void\n}\n\nconst states = new WeakMap<HTMLElement, InternalState>()\n\nfunction unbind(el: HTMLElement) {\n const state = states.get(el)\n if (!state) return\n\n for (const event of state.options.events) {\n state.doc.removeEventListener(event, state.listener, state.options.capture)\n }\n\n states.delete(el)\n}\n\nfunction bind(el: HTMLElement, value: ClickOutsideBindingValue | undefined) {\n const options = normalize(value)\n const doc = el.ownerDocument\n\n const listener = (event: Event) => {\n const current = states.get(el)\n if (!current) return\n\n const { enabled, handler, exclude } = current.options\n if (!enabled || !handler) return\n\n if ('button' in (event as any) && typeof (event as any).button === 'number' && (event as any).button !== 0) {\n return\n }\n\n if (!el.isConnected) return\n\n if (isEventInside(el, event)) return\n\n const excluded = resolveExclude(current.doc, exclude)\n for (const ex of excluded) {\n if (isEventInside(ex, event)) return\n }\n\n handler(event as any)\n }\n\n const nextState: InternalState = { options, doc, listener }\n states.set(el, nextState)\n\n if (!options.enabled || !options.handler) return\n\n for (const event of options.events) {\n doc.addEventListener(event, listener, options.capture)\n }\n}\n\n/**\n * `v-click-outside` — обработчик клика вне элемента (например, закрытие дропдауна/модалки).\n */\nexport const vClickOutside: Directive<HTMLElement, ClickOutsideBindingValue> = {\n mounted(el, binding) {\n bind(el, binding.value)\n },\n updated(el, binding) {\n unbind(el)\n bind(el, binding.value)\n },\n unmounted(el) {\n unbind(el)\n },\n}\n"],"mappings":";AA4BA,SAAS,UAAU,OAAgE;AACjF,KAAI,OAAO,UAAU,WACnB,QAAO;EAAE,SAAS;EAAM,SAAS;EAAM,QAAQ,CAAC,QAAQ;EAAE,SAAS;EAAO,SAAS,EAAE;EAAE;AAGzF,KAAI,SAAS,OAAO,UAAU,SAC5B,QAAO;EACL,SAAS,MAAM,WAAW;EAC1B,SAAS,MAAM,WAAW;EAC1B,QAAQ,MAAM,QAAQ,SAAS,MAAM,SAAS,CAAC,QAAQ;EACvD,SAAS,MAAM;EACf,SAAS,MAAM,WAAW,EAAE;EAC7B;AAGH,QAAO;EAAE,SAAS;EAAO,SAAS;EAAM,QAAQ,CAAC,QAAQ;EAAE,SAAS,KAAA;EAAW,SAAS,EAAE;EAAE;;AAG9F,SAAS,cAAc,IAAiB,OAAuB;CAC7D,MAAM,SAAS,MAAM;AACrB,KAAI,CAAC,OAAQ,QAAO;CAEpB,MAAM,eAAgB,MAAc,gBAAgB;AACpD,KAAI,MAAM,QAAQ,aAAa,CAC7B,QAAO,aAAa,SAAS,GAAG;AAGlC,QAAO,GAAG,SAAS,OAAO;;AAG5B,SAAS,eAAe,KAAe,SAA+C;CACpF,MAAM,WAA0B,EAAE;AAElC,MAAK,MAAM,QAAQ,SAAS;AAC1B,MAAI,OAAO,SAAS,UAAU;GAC5B,MAAM,QAAQ,IAAI,cAAc,KAAK;AACrC,OAAI,iBAAiB,YAAa,UAAS,KAAK,MAAM;AACtD;;AAGF,MAAI,OAAO,SAAS,YAAY;GAC9B,MAAM,QAAQ,MAAM;AACpB,OAAI,iBAAiB,YAAa,UAAS,KAAK,MAAM;AACtD;;AAGF,MAAI,gBAAgB,YAClB,UAAS,KAAK,KAAK;;AAIvB,QAAO;;AAST,IAAM,yBAAS,IAAI,SAAqC;AAExD,SAAS,OAAO,IAAiB;CAC/B,MAAM,QAAQ,OAAO,IAAI,GAAG;AAC5B,KAAI,CAAC,MAAO;AAEZ,MAAK,MAAM,SAAS,MAAM,QAAQ,OAChC,OAAM,IAAI,oBAAoB,OAAO,MAAM,UAAU,MAAM,QAAQ,QAAQ;AAG7E,QAAO,OAAO,GAAG;;AAGnB,SAAS,KAAK,IAAiB,OAA6C;CAC1E,MAAM,UAAU,UAAU,MAAM;CAChC,MAAM,MAAM,GAAG;CAEf,MAAM,YAAY,UAAiB;EACjC,MAAM,UAAU,OAAO,IAAI,GAAG;AAC9B,MAAI,CAAC,QAAS;EAEd,MAAM,EAAE,SAAS,SAAS,YAAY,QAAQ;AAC9C,MAAI,CAAC,WAAW,CAAC,QAAS;AAE1B,MAAI,YAAa,SAAiB,OAAQ,MAAc,WAAW,YAAa,MAAc,WAAW,EACvG;AAGF,MAAI,CAAC,GAAG,YAAa;AAErB,MAAI,cAAc,IAAI,MAAM,CAAE;EAE9B,MAAM,WAAW,eAAe,QAAQ,KAAK,QAAQ;AACrD,OAAK,MAAM,MAAM,SACf,KAAI,cAAc,IAAI,MAAM,CAAE;AAGhC,UAAQ,MAAa;;CAGvB,MAAM,YAA2B;EAAE;EAAS;EAAK;EAAU;AAC3D,QAAO,IAAI,IAAI,UAAU;AAEzB,KAAI,CAAC,QAAQ,WAAW,CAAC,QAAQ,QAAS;AAE1C,MAAK,MAAM,SAAS,QAAQ,OAC1B,KAAI,iBAAiB,OAAO,UAAU,QAAQ,QAAQ;;;;;AAO1D,IAAa,gBAAkE;CAC7E,QAAQ,IAAI,SAAS;AACnB,OAAK,IAAI,QAAQ,MAAM;;CAEzB,QAAQ,IAAI,SAAS;AACnB,SAAO,GAAG;AACV,OAAK,IAAI,QAAQ,MAAM;;CAEzB,UAAU,IAAI;AACZ,SAAO,GAAG;;CAEb"}
1
+ {"version":3,"file":"clickOutside.js","names":[],"sources":["../../src/directives/clickOutside.ts"],"sourcesContent":["import type { Directive } from 'vue'\n\nexport type ClickOutsideHandler = (event: MouseEvent | TouchEvent | PointerEvent) => void\n\nexport type ClickOutsideExclude = HTMLElement | string | (() => HTMLElement | null | undefined)\n\nexport type ClickOutsideBindingValue =\n | ClickOutsideHandler\n | {\n handler: ClickOutsideHandler\n /** По умолчанию `true`. */\n enabled?: boolean\n /** По умолчанию `true` (слушаем в capture, чтобы stopPropagation внутри не ломал закрытие). */\n capture?: boolean\n /** Список событий. По умолчанию `['click']`. */\n events?: Array<'click' | 'mousedown' | 'touchstart' | 'pointerdown'>\n /** Элементы/селекторы, клики по которым считаются \"внутри\". */\n exclude?: ClickOutsideExclude[]\n }\n\ntype NormalizedOptions = {\n enabled: boolean\n capture: boolean\n events: Array<'click' | 'mousedown' | 'touchstart' | 'pointerdown'>\n handler: ClickOutsideHandler | undefined\n exclude: ClickOutsideExclude[]\n}\n\nfunction normalize(value: ClickOutsideBindingValue | undefined): NormalizedOptions {\n if (typeof value === 'function') {\n return { enabled: true, capture: true, events: ['click'], handler: value, exclude: [] }\n }\n\n if (value && typeof value === 'object') {\n return {\n enabled: value.enabled ?? true,\n capture: value.capture ?? true,\n events: value.events?.length ? value.events : ['click'],\n handler: value.handler,\n exclude: value.exclude ?? [],\n }\n }\n\n return { enabled: false, capture: true, events: ['click'], handler: undefined, exclude: [] }\n}\n\nfunction isEventInside(el: HTMLElement, event: Event): boolean {\n const target = event.target as Node | null\n if (!target) return false\n\n const composedPath = (event as any).composedPath?.() as EventTarget[] | undefined\n if (Array.isArray(composedPath)) {\n return composedPath.includes(el)\n }\n\n return el.contains(target)\n}\n\nfunction resolveExclude(doc: Document, exclude: ClickOutsideExclude[]): HTMLElement[] {\n const resolved: HTMLElement[] = []\n\n for (const item of exclude) {\n if (typeof item === 'string') {\n const found = doc.querySelector(item)\n if (found instanceof HTMLElement) resolved.push(found)\n continue\n }\n\n if (typeof item === 'function') {\n const found = item()\n if (found instanceof HTMLElement) resolved.push(found)\n continue\n }\n\n if (item instanceof HTMLElement) {\n resolved.push(item)\n }\n }\n\n return resolved\n}\n\ntype InternalState = {\n options: NormalizedOptions\n doc: Document\n listener: (event: Event) => void\n}\n\nconst states = new WeakMap<HTMLElement, InternalState>()\n\nfunction unbind(el: HTMLElement) {\n const state = states.get(el)\n if (!state) return\n\n for (const event of state.options.events) {\n state.doc.removeEventListener(event, state.listener, state.options.capture)\n }\n\n states.delete(el)\n}\n\nfunction bind(el: HTMLElement, value: ClickOutsideBindingValue | undefined) {\n const options = normalize(value)\n const doc = el.ownerDocument\n\n const listener = (event: Event) => {\n const current = states.get(el)\n if (!current) return\n\n const { enabled, handler, exclude } = current.options\n if (!enabled || !handler) return\n\n if ('button' in (event as any) && typeof (event as any).button === 'number' && (event as any).button !== 0) {\n return\n }\n\n if (!el.isConnected) return\n\n if (isEventInside(el, event)) return\n\n const excluded = resolveExclude(current.doc, exclude)\n for (const ex of excluded) {\n if (isEventInside(ex, event)) return\n }\n\n handler(event as any)\n }\n\n const nextState: InternalState = { options, doc, listener }\n states.set(el, nextState)\n\n if (!options.enabled || !options.handler) return\n\n for (const event of options.events) {\n doc.addEventListener(event, listener, options.capture)\n }\n}\n\n/**\n * `v-click-outside` — обработчик клика вне элемента (например, закрытие дропдауна/модалки).\n */\nexport const vClickOutside: Directive<HTMLElement, ClickOutsideBindingValue> = {\n mounted(el, binding) {\n bind(el, binding.value)\n },\n updated(el, binding) {\n unbind(el)\n bind(el, binding.value)\n },\n unmounted(el) {\n unbind(el)\n },\n}\n"],"mappings":";AA4BA,SAAS,UAAU,OAAgE;CACjF,IAAI,OAAO,UAAU,YACnB,OAAO;EAAE,SAAS;EAAM,SAAS;EAAM,QAAQ,CAAC,OAAO;EAAG,SAAS;EAAO,SAAS,CAAC;CAAE;CAGxF,IAAI,SAAS,OAAO,UAAU,UAC5B,OAAO;EACL,SAAS,MAAM,WAAW;EAC1B,SAAS,MAAM,WAAW;EAC1B,QAAQ,MAAM,QAAQ,SAAS,MAAM,SAAS,CAAC,OAAO;EACtD,SAAS,MAAM;EACf,SAAS,MAAM,WAAW,CAAC;CAC7B;CAGF,OAAO;EAAE,SAAS;EAAO,SAAS;EAAM,QAAQ,CAAC,OAAO;EAAG,SAAS,KAAA;EAAW,SAAS,CAAC;CAAE;AAC7F;AAEA,SAAS,cAAc,IAAiB,OAAuB;CAC7D,MAAM,SAAS,MAAM;CACrB,IAAI,CAAC,QAAQ,OAAO;CAEpB,MAAM,eAAgB,MAAc,eAAe;CACnD,IAAI,MAAM,QAAQ,YAAY,GAC5B,OAAO,aAAa,SAAS,EAAE;CAGjC,OAAO,GAAG,SAAS,MAAM;AAC3B;AAEA,SAAS,eAAe,KAAe,SAA+C;CACpF,MAAM,WAA0B,CAAC;CAEjC,KAAK,MAAM,QAAQ,SAAS;EAC1B,IAAI,OAAO,SAAS,UAAU;GAC5B,MAAM,QAAQ,IAAI,cAAc,IAAI;GACpC,IAAI,iBAAiB,aAAa,SAAS,KAAK,KAAK;GACrD;EACF;EAEA,IAAI,OAAO,SAAS,YAAY;GAC9B,MAAM,QAAQ,KAAK;GACnB,IAAI,iBAAiB,aAAa,SAAS,KAAK,KAAK;GACrD;EACF;EAEA,IAAI,gBAAgB,aAClB,SAAS,KAAK,IAAI;CAEtB;CAEA,OAAO;AACT;AAQA,IAAM,yBAAS,IAAI,QAAoC;AAEvD,SAAS,OAAO,IAAiB;CAC/B,MAAM,QAAQ,OAAO,IAAI,EAAE;CAC3B,IAAI,CAAC,OAAO;CAEZ,KAAK,MAAM,SAAS,MAAM,QAAQ,QAChC,MAAM,IAAI,oBAAoB,OAAO,MAAM,UAAU,MAAM,QAAQ,OAAO;CAG5E,OAAO,OAAO,EAAE;AAClB;AAEA,SAAS,KAAK,IAAiB,OAA6C;CAC1E,MAAM,UAAU,UAAU,KAAK;CAC/B,MAAM,MAAM,GAAG;CAEf,MAAM,YAAY,UAAiB;EACjC,MAAM,UAAU,OAAO,IAAI,EAAE;EAC7B,IAAI,CAAC,SAAS;EAEd,MAAM,EAAE,SAAS,SAAS,YAAY,QAAQ;EAC9C,IAAI,CAAC,WAAW,CAAC,SAAS;EAE1B,IAAI,YAAa,SAAiB,OAAQ,MAAc,WAAW,YAAa,MAAc,WAAW,GACvG;EAGF,IAAI,CAAC,GAAG,aAAa;EAErB,IAAI,cAAc,IAAI,KAAK,GAAG;EAE9B,MAAM,WAAW,eAAe,QAAQ,KAAK,OAAO;EACpD,KAAK,MAAM,MAAM,UACf,IAAI,cAAc,IAAI,KAAK,GAAG;EAGhC,QAAQ,KAAY;CACtB;CAEA,MAAM,YAA2B;EAAE;EAAS;EAAK;CAAS;CAC1D,OAAO,IAAI,IAAI,SAAS;CAExB,IAAI,CAAC,QAAQ,WAAW,CAAC,QAAQ,SAAS;CAE1C,KAAK,MAAM,SAAS,QAAQ,QAC1B,IAAI,iBAAiB,OAAO,UAAU,QAAQ,OAAO;AAEzD;;;;AAKA,IAAa,gBAAkE;CAC7E,QAAQ,IAAI,SAAS;EACnB,KAAK,IAAI,QAAQ,KAAK;CACxB;CACA,QAAQ,IAAI,SAAS;EACnB,OAAO,EAAE;EACT,KAAK,IAAI,QAAQ,KAAK;CACxB;CACA,UAAU,IAAI;EACZ,OAAO,EAAE;CACX;AACF"}
@@ -1,4 +1,4 @@
1
- import { l as runFileValidators, u as FileValidationError } from "../chunks/fileValidation-c_iBg74s.js";
1
+ import { l as runFileValidators, u as FileValidationError } from "../chunks/fileValidation-C3WFaWU2.js";
2
2
  //#region src/directives/dropzone.ts
3
3
  function normalize(value) {
4
4
  if (typeof value === "function") return {
@@ -10,7 +10,7 @@ function normalize(value) {
10
10
  onFiles: value,
11
11
  onError: void 0,
12
12
  onStateChange: void 0,
13
- overClass: "ds-dropzone--over"
13
+ overClass: "gr-dropzone--over"
14
14
  };
15
15
  if (value && typeof value === "object") return {
16
16
  enabled: value.enabled ?? true,
@@ -21,7 +21,7 @@ function normalize(value) {
21
21
  onFiles: value.onFiles,
22
22
  onError: value.onError,
23
23
  onStateChange: value.onStateChange,
24
- overClass: value.overClass ?? "ds-dropzone--over"
24
+ overClass: value.overClass ?? "gr-dropzone--over"
25
25
  };
26
26
  return {
27
27
  enabled: false,
@@ -32,7 +32,7 @@ function normalize(value) {
32
32
  onFiles: void 0,
33
33
  onError: void 0,
34
34
  onStateChange: void 0,
35
- overClass: "ds-dropzone--over"
35
+ overClass: "gr-dropzone--over"
36
36
  };
37
37
  }
38
38
  var states = /* @__PURE__ */ new WeakMap();
@@ -112,7 +112,8 @@ function bind(el, value) {
112
112
  if (!files.length) return;
113
113
  (async () => {
114
114
  try {
115
- const { files: picked, issues } = await runFileValidators(files, current.options.validators ?? [], {
115
+ const validators = current.options.validators ?? [];
116
+ const { files: picked, issues } = await runFileValidators(files, validators, {
116
117
  source: "drop",
117
118
  multiple: current.options.multiple
118
119
  });
@@ -1 +1 @@
1
- {"version":3,"file":"dropzone.js","names":[],"sources":["../../src/directives/dropzone.ts"],"sourcesContent":["import type { Directive } from 'vue'\n\nimport type { FileValidator } from '../fileValidation'\n\nimport { FileValidationError, runFileValidators } from '../fileValidation'\n\nexport type DropzoneOnFiles = (files: File[], event: DragEvent) => void | Promise<void>\n\nexport type DropzoneBindingValue =\n | DropzoneOnFiles\n | {\n onFiles: DropzoneOnFiles\n /** По умолчанию `true`. */\n enabled?: boolean\n /** По умолчанию `true`. */\n multiple?: boolean\n\n /** Валидаторы, которые будут запущены перед `onFiles`. */\n validators?: FileValidator[]\n /** По умолчанию `true` (предотвращаем дефолтное поведение браузера при drop). */\n preventDefault?: boolean\n /** По умолчанию `false`. */\n stopPropagation?: boolean\n /** Вызывается, если валидация файлов не прошла. */\n onError?: (error: unknown) => void\n /** Вызывается при изменении состояния drag-over. */\n onStateChange?: (state: { isOver: boolean }) => void\n /** CSS-класс, который навешивается на элемент, пока курсор с файлами над зоной. */\n overClass?: string\n }\n\ntype NormalizedOptions = {\n enabled: boolean\n multiple: boolean\n validators: FileValidator[] | undefined\n preventDefault: boolean\n stopPropagation: boolean\n onFiles: DropzoneOnFiles | undefined\n onError: ((error: unknown) => void) | undefined\n onStateChange: ((state: { isOver: boolean }) => void) | undefined\n overClass: string\n}\n\nfunction normalize(value: DropzoneBindingValue | undefined): NormalizedOptions {\n if (typeof value === 'function') {\n return {\n enabled: true,\n multiple: true,\n validators: undefined,\n preventDefault: true,\n stopPropagation: false,\n onFiles: value,\n onError: undefined,\n onStateChange: undefined,\n overClass: 'ds-dropzone--over',\n }\n }\n\n if (value && typeof value === 'object') {\n return {\n enabled: value.enabled ?? true,\n multiple: value.multiple ?? true,\n validators: value.validators,\n preventDefault: value.preventDefault ?? true,\n stopPropagation: value.stopPropagation ?? false,\n onFiles: value.onFiles,\n onError: value.onError,\n onStateChange: value.onStateChange,\n overClass: value.overClass ?? 'ds-dropzone--over',\n }\n }\n\n return {\n enabled: false,\n multiple: true,\n validators: undefined,\n preventDefault: true,\n stopPropagation: false,\n onFiles: undefined,\n onError: undefined,\n onStateChange: undefined,\n overClass: 'ds-dropzone--over',\n }\n}\n\ntype InternalState = {\n options: NormalizedOptions\n overCounter: number\n isOver: boolean\n onDragEnter: (event: DragEvent) => void\n onDragOver: (event: DragEvent) => void\n onDragLeave: (event: DragEvent) => void\n onDrop: (event: DragEvent) => void\n}\n\nconst states = new WeakMap<HTMLElement, InternalState>()\n\n/**\n * `classList.add/remove` не принимают строки с пробелами/пустые токены —\n * иначе DOM кидает `InvalidCharacterError`. Поэтому всегда токенизируем\n * `overClass` (поддерживая Tailwind-подобные multi-class значения).\n */\nfunction tokenizeClass(value: string): string[] {\n return value.split(/\\s+/).filter(token => token.length > 0)\n}\n\nfunction setOver(el: HTMLElement, next: boolean) {\n const state = states.get(el)\n if (!state) return\n\n // `state.isOver` может рассинхронизироваться с DOM (например, при обновлениях\n // компонента/директивы во время drag-over). Поэтому DOM-состояние всегда\n // приводим к `next`, а коллбек вызываем только при фактическом изменении.\n const wasDomOver = el.dataset.grDropzoneOver === 'true'\n const prev = state.isOver\n\n state.isOver = next\n\n const tokens = tokenizeClass(state.options.overClass)\n if (next) {\n if (tokens.length) el.classList.add(...tokens)\n el.dataset.grDropzoneOver = 'true'\n } else {\n if (tokens.length) el.classList.remove(...tokens)\n delete el.dataset.grDropzoneOver\n }\n\n if (prev !== next || wasDomOver !== next) {\n state.options.onStateChange?.({ isOver: next })\n }\n}\n\nfunction unbind(el: HTMLElement) {\n const state = states.get(el)\n if (!state) return\n\n // Гарантированно очищаем визуальное состояние и счётчики.\n // Это важно, если директива обновлялась/перебиндилась во время DnD.\n state.overCounter = 0\n setOver(el, false)\n\n delete el.dataset.grDropzone\n\n el.removeEventListener('dragenter', state.onDragEnter)\n el.removeEventListener('dragover', state.onDragOver)\n el.removeEventListener('dragleave', state.onDragLeave)\n el.removeEventListener('drop', state.onDrop)\n\n states.delete(el)\n}\n\nfunction bind(el: HTMLElement, value: DropzoneBindingValue | undefined) {\n const options = normalize(value)\n\n const state: InternalState = {\n options,\n overCounter: 0,\n isOver: false,\n onDragEnter(event) {\n const current = states.get(el)\n if (!current?.options.enabled) return\n\n if (current.options.preventDefault) event.preventDefault()\n if (current.options.stopPropagation) event.stopPropagation()\n\n current.overCounter += 1\n setOver(el, true)\n },\n onDragOver(event) {\n const current = states.get(el)\n if (!current?.options.enabled) return\n\n if (current.options.preventDefault) event.preventDefault()\n if (current.options.stopPropagation) event.stopPropagation()\n\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'copy'\n },\n onDragLeave(event) {\n const current = states.get(el)\n if (!current?.options.enabled) return\n\n if (current.options.preventDefault) event.preventDefault()\n if (current.options.stopPropagation) event.stopPropagation()\n\n current.overCounter = Math.max(0, current.overCounter - 1)\n if (current.overCounter === 0) setOver(el, false)\n },\n onDrop(event) {\n const current = states.get(el)\n if (!current?.options.enabled) return\n\n if (current.options.preventDefault) event.preventDefault()\n if (current.options.stopPropagation) event.stopPropagation()\n\n current.overCounter = 0\n setOver(el, false)\n\n const dt = event.dataTransfer\n const files = dt?.files ? Array.prototype.slice.call(dt.files) as File[] : []\n if (!files.length) return\n\n void (async () => {\n try {\n const validators = current.options.validators ?? []\n\n const { files: picked, issues } = await runFileValidators(files, validators, {\n source: 'drop',\n multiple: current.options.multiple,\n })\n\n if (issues.length > 0) {\n current.options.onError?.(new FileValidationError(issues, picked))\n return\n }\n\n if (!picked.length) return\n await current.options.onFiles?.(picked, event)\n } catch (error) {\n current.options.onError?.(error)\n }\n })()\n },\n }\n\n states.set(el, state)\n\n // Base marker.\n el.dataset.grDropzone = 'true'\n\n el.addEventListener('dragenter', state.onDragEnter)\n el.addEventListener('dragover', state.onDragOver)\n el.addEventListener('dragleave', state.onDragLeave)\n el.addEventListener('drop', state.onDrop)\n}\n\nfunction update(el: HTMLElement, value: DropzoneBindingValue | undefined) {\n const state = states.get(el)\n if (!state) {\n bind(el, value)\n return\n }\n\n const prevOverClass = state.options.overClass\n const nextOptions = normalize(value)\n\n state.options = nextOptions\n\n // Если поменялся `overClass`, синхронизируем DOM (учитывая multi-token значения).\n if (prevOverClass !== nextOptions.overClass) {\n const prevTokens = tokenizeClass(prevOverClass)\n if (prevTokens.length) el.classList.remove(...prevTokens)\n if (state.isOver) {\n const nextTokens = tokenizeClass(nextOptions.overClass)\n if (nextTokens.length) el.classList.add(...nextTokens)\n }\n }\n\n // Если директива выключена — сбрасываем состояние.\n if (!nextOptions.enabled) {\n state.overCounter = 0\n setOver(el, false)\n }\n}\n\n/**\n * `v-dropzone` — декларативная DnD-зона для файлов (перетаскивание + drop).\n *\n * Директива не делает загрузку сама — только нормализует события и отдаёт `File[]`.\n */\nexport const vDropzone: Directive<HTMLElement, DropzoneBindingValue> = {\n mounted(el, binding) {\n bind(el, binding.value)\n },\n updated(el, binding) {\n update(el, binding.value)\n },\n unmounted(el) {\n unbind(el)\n },\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"dropzone.js","names":[],"sources":["../../src/directives/dropzone.ts"],"sourcesContent":["import type { Directive } from 'vue'\n\nimport type { FileValidator } from '../fileValidation'\n\nimport { FileValidationError, runFileValidators } from '../fileValidation'\n\nexport type DropzoneOnFiles = (files: File[], event: DragEvent) => void | Promise<void>\n\nexport type DropzoneBindingValue =\n | DropzoneOnFiles\n | {\n onFiles: DropzoneOnFiles\n /** По умолчанию `true`. */\n enabled?: boolean\n /** По умолчанию `true`. */\n multiple?: boolean\n\n /** Валидаторы, которые будут запущены перед `onFiles`. */\n validators?: FileValidator[]\n /** По умолчанию `true` (предотвращаем дефолтное поведение браузера при drop). */\n preventDefault?: boolean\n /** По умолчанию `false`. */\n stopPropagation?: boolean\n /** Вызывается, если валидация файлов не прошла. */\n onError?: (error: unknown) => void\n /** Вызывается при изменении состояния drag-over. */\n onStateChange?: (state: { isOver: boolean }) => void\n /** CSS-класс, который навешивается на элемент, пока курсор с файлами над зоной. */\n overClass?: string\n }\n\ntype NormalizedOptions = {\n enabled: boolean\n multiple: boolean\n validators: FileValidator[] | undefined\n preventDefault: boolean\n stopPropagation: boolean\n onFiles: DropzoneOnFiles | undefined\n onError: ((error: unknown) => void) | undefined\n onStateChange: ((state: { isOver: boolean }) => void) | undefined\n overClass: string\n}\n\nfunction normalize(value: DropzoneBindingValue | undefined): NormalizedOptions {\n if (typeof value === 'function') {\n return {\n enabled: true,\n multiple: true,\n validators: undefined,\n preventDefault: true,\n stopPropagation: false,\n onFiles: value,\n onError: undefined,\n onStateChange: undefined,\n overClass: 'gr-dropzone--over',\n }\n }\n\n if (value && typeof value === 'object') {\n return {\n enabled: value.enabled ?? true,\n multiple: value.multiple ?? true,\n validators: value.validators,\n preventDefault: value.preventDefault ?? true,\n stopPropagation: value.stopPropagation ?? false,\n onFiles: value.onFiles,\n onError: value.onError,\n onStateChange: value.onStateChange,\n overClass: value.overClass ?? 'gr-dropzone--over',\n }\n }\n\n return {\n enabled: false,\n multiple: true,\n validators: undefined,\n preventDefault: true,\n stopPropagation: false,\n onFiles: undefined,\n onError: undefined,\n onStateChange: undefined,\n overClass: 'gr-dropzone--over',\n }\n}\n\ntype InternalState = {\n options: NormalizedOptions\n overCounter: number\n isOver: boolean\n onDragEnter: (event: DragEvent) => void\n onDragOver: (event: DragEvent) => void\n onDragLeave: (event: DragEvent) => void\n onDrop: (event: DragEvent) => void\n}\n\nconst states = new WeakMap<HTMLElement, InternalState>()\n\n/**\n * `classList.add/remove` не принимают строки с пробелами/пустые токены —\n * иначе DOM кидает `InvalidCharacterError`. Поэтому всегда токенизируем\n * `overClass` (поддерживая Tailwind-подобные multi-class значения).\n */\nfunction tokenizeClass(value: string): string[] {\n return value.split(/\\s+/).filter(token => token.length > 0)\n}\n\nfunction setOver(el: HTMLElement, next: boolean) {\n const state = states.get(el)\n if (!state) return\n\n // `state.isOver` может рассинхронизироваться с DOM (например, при обновлениях\n // компонента/директивы во время drag-over). Поэтому DOM-состояние всегда\n // приводим к `next`, а коллбек вызываем только при фактическом изменении.\n const wasDomOver = el.dataset.grDropzoneOver === 'true'\n const prev = state.isOver\n\n state.isOver = next\n\n const tokens = tokenizeClass(state.options.overClass)\n if (next) {\n if (tokens.length) el.classList.add(...tokens)\n el.dataset.grDropzoneOver = 'true'\n } else {\n if (tokens.length) el.classList.remove(...tokens)\n delete el.dataset.grDropzoneOver\n }\n\n if (prev !== next || wasDomOver !== next) {\n state.options.onStateChange?.({ isOver: next })\n }\n}\n\nfunction unbind(el: HTMLElement) {\n const state = states.get(el)\n if (!state) return\n\n // Гарантированно очищаем визуальное состояние и счётчики.\n // Это важно, если директива обновлялась/перебиндилась во время DnD.\n state.overCounter = 0\n setOver(el, false)\n\n delete el.dataset.grDropzone\n\n el.removeEventListener('dragenter', state.onDragEnter)\n el.removeEventListener('dragover', state.onDragOver)\n el.removeEventListener('dragleave', state.onDragLeave)\n el.removeEventListener('drop', state.onDrop)\n\n states.delete(el)\n}\n\nfunction bind(el: HTMLElement, value: DropzoneBindingValue | undefined) {\n const options = normalize(value)\n\n const state: InternalState = {\n options,\n overCounter: 0,\n isOver: false,\n onDragEnter(event) {\n const current = states.get(el)\n if (!current?.options.enabled) return\n\n if (current.options.preventDefault) event.preventDefault()\n if (current.options.stopPropagation) event.stopPropagation()\n\n current.overCounter += 1\n setOver(el, true)\n },\n onDragOver(event) {\n const current = states.get(el)\n if (!current?.options.enabled) return\n\n if (current.options.preventDefault) event.preventDefault()\n if (current.options.stopPropagation) event.stopPropagation()\n\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'copy'\n },\n onDragLeave(event) {\n const current = states.get(el)\n if (!current?.options.enabled) return\n\n if (current.options.preventDefault) event.preventDefault()\n if (current.options.stopPropagation) event.stopPropagation()\n\n current.overCounter = Math.max(0, current.overCounter - 1)\n if (current.overCounter === 0) setOver(el, false)\n },\n onDrop(event) {\n const current = states.get(el)\n if (!current?.options.enabled) return\n\n if (current.options.preventDefault) event.preventDefault()\n if (current.options.stopPropagation) event.stopPropagation()\n\n current.overCounter = 0\n setOver(el, false)\n\n const dt = event.dataTransfer\n const files = dt?.files ? Array.prototype.slice.call(dt.files) as File[] : []\n if (!files.length) return\n\n void (async () => {\n try {\n const validators = current.options.validators ?? []\n\n const { files: picked, issues } = await runFileValidators(files, validators, {\n source: 'drop',\n multiple: current.options.multiple,\n })\n\n if (issues.length > 0) {\n current.options.onError?.(new FileValidationError(issues, picked))\n return\n }\n\n if (!picked.length) return\n await current.options.onFiles?.(picked, event)\n } catch (error) {\n current.options.onError?.(error)\n }\n })()\n },\n }\n\n states.set(el, state)\n\n // Base marker.\n el.dataset.grDropzone = 'true'\n\n el.addEventListener('dragenter', state.onDragEnter)\n el.addEventListener('dragover', state.onDragOver)\n el.addEventListener('dragleave', state.onDragLeave)\n el.addEventListener('drop', state.onDrop)\n}\n\nfunction update(el: HTMLElement, value: DropzoneBindingValue | undefined) {\n const state = states.get(el)\n if (!state) {\n bind(el, value)\n return\n }\n\n const prevOverClass = state.options.overClass\n const nextOptions = normalize(value)\n\n state.options = nextOptions\n\n // Если поменялся `overClass`, синхронизируем DOM (учитывая multi-token значения).\n if (prevOverClass !== nextOptions.overClass) {\n const prevTokens = tokenizeClass(prevOverClass)\n if (prevTokens.length) el.classList.remove(...prevTokens)\n if (state.isOver) {\n const nextTokens = tokenizeClass(nextOptions.overClass)\n if (nextTokens.length) el.classList.add(...nextTokens)\n }\n }\n\n // Если директива выключена — сбрасываем состояние.\n if (!nextOptions.enabled) {\n state.overCounter = 0\n setOver(el, false)\n }\n}\n\n/**\n * `v-dropzone` — декларативная DnD-зона для файлов (перетаскивание + drop).\n *\n * Директива не делает загрузку сама — только нормализует события и отдаёт `File[]`.\n */\nexport const vDropzone: Directive<HTMLElement, DropzoneBindingValue> = {\n mounted(el, binding) {\n bind(el, binding.value)\n },\n updated(el, binding) {\n update(el, binding.value)\n },\n unmounted(el) {\n unbind(el)\n },\n}\n"],"mappings":"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"}
@@ -9,18 +9,21 @@ function isEditableTarget(target) {
9
9
  function normalizeBinding(value) {
10
10
  if (!value) return {
11
11
  enabled: false,
12
- handlers: {}
12
+ handlers: {},
13
+ scope: "global"
13
14
  };
14
15
  if ("handlers" in value) {
15
16
  const v = value;
16
17
  return {
17
18
  enabled: v.enabled ?? true,
18
- handlers: v.handlers ?? {}
19
+ handlers: v.handlers ?? {},
20
+ scope: v.scope ?? "global"
19
21
  };
20
22
  }
21
23
  return {
22
24
  enabled: true,
23
- handlers: value
25
+ handlers: value,
26
+ scope: "global"
24
27
  };
25
28
  }
26
29
  function normalizeKeyToken(token) {
@@ -88,11 +91,18 @@ function resolveEntry(entry) {
88
91
  * ```vue
89
92
  * <div v-hotkey="{ 'Escape': close, 'Ctrl+K': openSearch }" />
90
93
  * ```
94
+ *
95
+ * По умолчанию слушатель глобальный (`window`). Чтобы хоткеи срабатывали только
96
+ * когда фокус внутри элемента, используйте `scope: 'element'`:
97
+ * ```vue
98
+ * <div tabindex="0" v-hotkey="{ handlers: { 'j': next }, scope: 'element' }" />
99
+ * ```
91
100
  */
92
101
  var vHotkey = {
93
102
  mounted(el, binding) {
94
103
  if (typeof window === "undefined") return;
95
- const { enabled, handlers } = normalizeBinding(binding.value);
104
+ const { enabled, handlers, scope } = normalizeBinding(binding.value);
105
+ const target = scope === "element" ? el : window;
96
106
  const state = {
97
107
  enabled,
98
108
  hotkeys: parseHotkeys(handlers),
@@ -115,10 +125,11 @@ var vHotkey = {
115
125
  entry.handler(event);
116
126
  return;
117
127
  }
118
- }
128
+ },
129
+ target
119
130
  };
120
131
  states.set(el, state);
121
- window.addEventListener("keydown", state.listener);
132
+ target.addEventListener("keydown", state.listener);
122
133
  },
123
134
  updated(el, binding) {
124
135
  const state = states.get(el);
@@ -126,11 +137,17 @@ var vHotkey = {
126
137
  const next = normalizeBinding(binding.value);
127
138
  state.enabled = next.enabled;
128
139
  state.hotkeys = parseHotkeys(next.handlers);
140
+ const nextTarget = next.scope === "element" ? el : window;
141
+ if (nextTarget !== state.target) {
142
+ state.target.removeEventListener("keydown", state.listener);
143
+ state.target = nextTarget;
144
+ nextTarget.addEventListener("keydown", state.listener);
145
+ }
129
146
  },
130
147
  unmounted(el) {
131
148
  const state = states.get(el);
132
149
  if (!state) return;
133
- window.removeEventListener("keydown", state.listener);
150
+ state.target.removeEventListener("keydown", state.listener);
134
151
  states.delete(el);
135
152
  }
136
153
  };
@@ -1 +1 @@
1
- {"version":3,"file":"hotkey.js","names":[],"sources":["../../src/directives/hotkey.ts"],"sourcesContent":["import type { Directive } from 'vue'\n\nexport type HotkeyHandler = (event: KeyboardEvent) => void\n\nexport type HotkeyEntry =\n | HotkeyHandler\n | {\n handler: HotkeyHandler\n /** По умолчанию: `true` для комбинаций с Ctrl/Meta/Alt, иначе `false`. */\n preventDefault?: boolean\n /** По умолчанию `false`. */\n stopPropagation?: boolean\n /** Разрешить срабатывать, когда фокус в `input/textarea/[contenteditable]`. */\n allowInEditable?: boolean\n }\n\nexport type HotkeyMap = Record<string, HotkeyEntry>\n\nexport type HotkeyBindingValue =\n | HotkeyMap\n | {\n handlers: HotkeyMap\n enabled?: boolean\n }\n\ntype ParsedHotkey = {\n original: string\n key: string\n ctrl: boolean\n meta: boolean\n alt: boolean\n shift: boolean\n entry: HotkeyEntry\n}\n\ntype InternalState = {\n enabled: boolean\n hotkeys: ParsedHotkey[]\n listener: (event: KeyboardEvent) => void\n}\n\nconst states = new WeakMap<HTMLElement, InternalState>()\n\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false\n if (target.isContentEditable) return true\n\n const tag = target.tagName\n return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT'\n}\n\nfunction normalizeBinding(value: HotkeyBindingValue | undefined) {\n if (!value) return { enabled: false, handlers: {} as HotkeyMap }\n if ('handlers' in (value as any)) {\n const v = value as { handlers: HotkeyMap; enabled?: boolean }\n return { enabled: v.enabled ?? true, handlers: v.handlers ?? {} }\n }\n return { enabled: true, handlers: value as HotkeyMap }\n}\n\nfunction normalizeKeyToken(token: string): string {\n const t = token.trim().toLowerCase()\n if (t === 'esc') return 'Escape'\n if (t === 'escape') return 'Escape'\n if (t === 'space') return ' '\n if (t.length === 1) return t\n return token.trim()\n}\n\nfunction parseHotkeys(map: HotkeyMap): ParsedHotkey[] {\n const parsed: ParsedHotkey[] = []\n\n for (const [combo, entry] of Object.entries(map)) {\n const parts = combo\n .split('+')\n .map(p => p.trim())\n .filter(Boolean)\n\n if (!parts.length) continue\n\n let ctrl = false\n let meta = false\n let alt = false\n let shift = false\n\n const keyToken = parts.at(-1)\n if (!keyToken) continue\n for (const p of parts.slice(0, -1)) {\n const t = p.toLowerCase()\n if (t === 'ctrl' || t === 'control') ctrl = true\n else if (t === 'meta' || t === 'cmd' || t === 'command' || t === '⌘') meta = true\n else if (t === 'alt' || t === 'option') alt = true\n else if (t === 'shift') shift = true\n }\n\n const key = normalizeKeyToken(keyToken)\n parsed.push({ original: combo, key, ctrl, meta, alt, shift, entry })\n }\n\n return parsed\n}\n\nfunction matchKey(expected: string, eventKey: string): boolean {\n if (expected === ' ') return eventKey === ' ' || eventKey === 'Spacebar'\n if (expected.length === 1) return expected.toLowerCase() === eventKey.toLowerCase()\n return expected === eventKey\n}\n\nfunction resolveEntry(entry: HotkeyEntry) {\n if (typeof entry === 'function') {\n return {\n handler: entry,\n preventDefault: undefined as boolean | undefined,\n stopPropagation: false,\n allowInEditable: false,\n }\n }\n\n return {\n handler: entry.handler,\n preventDefault: entry.preventDefault,\n stopPropagation: entry.stopPropagation ?? false,\n allowInEditable: entry.allowInEditable ?? false,\n }\n}\n\n/**\n * `v-hotkey` — горячие клавиши на компонент/страницу.\n *\n * Пример:\n * ```vue\n * <div v-hotkey=\"{ 'Escape': close, 'Ctrl+K': openSearch }\" />\n * ```\n */\nexport const vHotkey: Directive<HTMLElement, HotkeyBindingValue> = {\n mounted(el, binding) {\n if (typeof window === 'undefined') return\n\n const { enabled, handlers } = normalizeBinding(binding.value)\n\n const state: InternalState = {\n enabled,\n hotkeys: parseHotkeys(handlers),\n listener: (event: KeyboardEvent) => {\n const current = states.get(el)\n if (!current?.enabled) return\n if (!el.isConnected) return\n\n const editable = isEditableTarget(event.target)\n\n for (const hk of current.hotkeys) {\n if (hk.ctrl !== event.ctrlKey) continue\n if (hk.meta !== event.metaKey) continue\n if (hk.alt !== event.altKey) continue\n if (hk.shift !== event.shiftKey) continue\n if (!matchKey(hk.key, event.key)) continue\n\n const entry = resolveEntry(hk.entry)\n\n // По умолчанию не перехватываем \"простые\" клавиши во время ввода.\n const hasModifier = hk.ctrl || hk.meta || hk.alt || hk.shift\n if (editable && !entry.allowInEditable && !hasModifier && hk.key !== 'Escape') {\n continue\n }\n\n const preventDefault = entry.preventDefault ?? (hk.ctrl || hk.meta || hk.alt)\n if (preventDefault) event.preventDefault()\n if (entry.stopPropagation) event.stopPropagation()\n\n entry.handler(event)\n return\n }\n },\n }\n\n states.set(el, state)\n window.addEventListener('keydown', state.listener)\n },\n updated(el, binding) {\n const state = states.get(el)\n if (!state) return\n\n const next = normalizeBinding(binding.value)\n state.enabled = next.enabled\n state.hotkeys = parseHotkeys(next.handlers)\n },\n unmounted(el) {\n const state = states.get(el)\n if (!state) return\n window.removeEventListener('keydown', state.listener)\n states.delete(el)\n },\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"hotkey.js","names":[],"sources":["../../src/directives/hotkey.ts"],"sourcesContent":["import type { Directive } from 'vue'\n\nexport type HotkeyHandler = (event: KeyboardEvent) => void\n\nexport type HotkeyEntry =\n | HotkeyHandler\n | {\n handler: HotkeyHandler\n /** По умолчанию: `true` для комбинаций с Ctrl/Meta/Alt, иначе `false`. */\n preventDefault?: boolean\n /** По умолчанию `false`. */\n stopPropagation?: boolean\n /** Разрешить срабатывать, когда фокус в `input/textarea/[contenteditable]`. */\n allowInEditable?: boolean\n }\n\nexport type HotkeyMap = Record<string, HotkeyEntry>\n\n/**\n * Где слушать клавиатуру:\n * - `'global'` (по умолчанию) — слушатель на `window`; хоткеи работают из любого места страницы.\n * - `'element'` — слушатель на самом элементе; хоткеи срабатывают только когда фокус внутри\n * элемента (событие всплывает до него). Элемент должен быть фокусируемым (`tabindex`).\n */\nexport type HotkeyScope = 'global' | 'element'\n\nexport type HotkeyBindingValue =\n | HotkeyMap\n | {\n handlers: HotkeyMap\n enabled?: boolean\n scope?: HotkeyScope\n }\n\ntype ParsedHotkey = {\n original: string\n key: string\n ctrl: boolean\n meta: boolean\n alt: boolean\n shift: boolean\n entry: HotkeyEntry\n}\n\ntype InternalState = {\n enabled: boolean\n hotkeys: ParsedHotkey[]\n listener: (event: KeyboardEvent) => void\n /** Цель, на которой висит слушатель (`window` для 'global', сам `el` для 'element'). */\n target: Window | HTMLElement\n}\n\nconst states = new WeakMap<HTMLElement, InternalState>()\n\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false\n if (target.isContentEditable) return true\n\n const tag = target.tagName\n return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT'\n}\n\nfunction normalizeBinding(value: HotkeyBindingValue | undefined) {\n if (!value) return { enabled: false, handlers: {} as HotkeyMap, scope: 'global' as HotkeyScope }\n if ('handlers' in (value as any)) {\n const v = value as { handlers: HotkeyMap; enabled?: boolean; scope?: HotkeyScope }\n return { enabled: v.enabled ?? true, handlers: v.handlers ?? {}, scope: v.scope ?? 'global' }\n }\n return { enabled: true, handlers: value as HotkeyMap, scope: 'global' as HotkeyScope }\n}\n\nfunction normalizeKeyToken(token: string): string {\n const t = token.trim().toLowerCase()\n if (t === 'esc') return 'Escape'\n if (t === 'escape') return 'Escape'\n if (t === 'space') return ' '\n if (t.length === 1) return t\n return token.trim()\n}\n\nfunction parseHotkeys(map: HotkeyMap): ParsedHotkey[] {\n const parsed: ParsedHotkey[] = []\n\n for (const [combo, entry] of Object.entries(map)) {\n const parts = combo\n .split('+')\n .map(p => p.trim())\n .filter(Boolean)\n\n if (!parts.length) continue\n\n let ctrl = false\n let meta = false\n let alt = false\n let shift = false\n\n const keyToken = parts.at(-1)\n if (!keyToken) continue\n for (const p of parts.slice(0, -1)) {\n const t = p.toLowerCase()\n if (t === 'ctrl' || t === 'control') ctrl = true\n else if (t === 'meta' || t === 'cmd' || t === 'command' || t === '⌘') meta = true\n else if (t === 'alt' || t === 'option') alt = true\n else if (t === 'shift') shift = true\n }\n\n const key = normalizeKeyToken(keyToken)\n parsed.push({ original: combo, key, ctrl, meta, alt, shift, entry })\n }\n\n return parsed\n}\n\nfunction matchKey(expected: string, eventKey: string): boolean {\n if (expected === ' ') return eventKey === ' ' || eventKey === 'Spacebar'\n if (expected.length === 1) return expected.toLowerCase() === eventKey.toLowerCase()\n return expected === eventKey\n}\n\nfunction resolveEntry(entry: HotkeyEntry) {\n if (typeof entry === 'function') {\n return {\n handler: entry,\n preventDefault: undefined as boolean | undefined,\n stopPropagation: false,\n allowInEditable: false,\n }\n }\n\n return {\n handler: entry.handler,\n preventDefault: entry.preventDefault,\n stopPropagation: entry.stopPropagation ?? false,\n allowInEditable: entry.allowInEditable ?? false,\n }\n}\n\n/**\n * `v-hotkey` — горячие клавиши на компонент/страницу.\n *\n * Пример:\n * ```vue\n * <div v-hotkey=\"{ 'Escape': close, 'Ctrl+K': openSearch }\" />\n * ```\n *\n * По умолчанию слушатель глобальный (`window`). Чтобы хоткеи срабатывали только\n * когда фокус внутри элемента, используйте `scope: 'element'`:\n * ```vue\n * <div tabindex=\"0\" v-hotkey=\"{ handlers: { 'j': next }, scope: 'element' }\" />\n * ```\n */\nexport const vHotkey: Directive<HTMLElement, HotkeyBindingValue> = {\n mounted(el, binding) {\n if (typeof window === 'undefined') return\n\n const { enabled, handlers, scope } = normalizeBinding(binding.value)\n const target: Window | HTMLElement = scope === 'element' ? el : window\n\n const state: InternalState = {\n enabled,\n hotkeys: parseHotkeys(handlers),\n listener: (event: KeyboardEvent) => {\n const current = states.get(el)\n if (!current?.enabled) return\n if (!el.isConnected) return\n\n const editable = isEditableTarget(event.target)\n\n for (const hk of current.hotkeys) {\n if (hk.ctrl !== event.ctrlKey) continue\n if (hk.meta !== event.metaKey) continue\n if (hk.alt !== event.altKey) continue\n if (hk.shift !== event.shiftKey) continue\n if (!matchKey(hk.key, event.key)) continue\n\n const entry = resolveEntry(hk.entry)\n\n // По умолчанию не перехватываем \"простые\" клавиши во время ввода.\n const hasModifier = hk.ctrl || hk.meta || hk.alt || hk.shift\n if (editable && !entry.allowInEditable && !hasModifier && hk.key !== 'Escape') {\n continue\n }\n\n const preventDefault = entry.preventDefault ?? (hk.ctrl || hk.meta || hk.alt)\n if (preventDefault) event.preventDefault()\n if (entry.stopPropagation) event.stopPropagation()\n\n entry.handler(event)\n return\n }\n },\n target,\n }\n\n states.set(el, state)\n target.addEventListener('keydown', state.listener as EventListener)\n },\n updated(el, binding) {\n const state = states.get(el)\n if (!state) return\n\n const next = normalizeBinding(binding.value)\n state.enabled = next.enabled\n state.hotkeys = parseHotkeys(next.handlers)\n\n // Смена scope на лету — переносим слушатель на новую цель.\n const nextTarget: Window | HTMLElement = next.scope === 'element' ? el : window\n if (nextTarget !== state.target) {\n state.target.removeEventListener('keydown', state.listener as EventListener)\n state.target = nextTarget\n nextTarget.addEventListener('keydown', state.listener as EventListener)\n }\n },\n unmounted(el) {\n const state = states.get(el)\n if (!state) return\n state.target.removeEventListener('keydown', state.listener as EventListener)\n states.delete(el)\n },\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { t as GrLoading_default } from "../components/GrLoading/chunks/GrLoading-mfyfghxs.js";
1
+ import { t as GrLoading_default } from "../components/GrLoading/chunks/GrLoading--X_7rdbb.js";
2
2
  import { createVNode, render } from "vue";
3
3
  //#region src/directives/loading.ts
4
4
  function isHTMLElement(value) {
@@ -74,7 +74,7 @@ function createLoading(options = {}, fallbackTarget) {
74
74
  const restorePosition = ensurePositionedContainer(target, fullscreen);
75
75
  const restoreOverflow = ensureClippedContainer(target, fullscreen);
76
76
  const mountEl = document.createElement("div");
77
- mountEl.setAttribute("data-ds-loading-host", "");
77
+ mountEl.setAttribute("data-gr-loading-host", "");
78
78
  if (!fullscreen) mountEl.style.borderRadius = "inherit";
79
79
  target.appendChild(mountEl);
80
80
  target.setAttribute("aria-busy", "true");
@@ -1 +1 @@
1
- {"version":3,"file":"loading.js","names":[],"sources":["../../src/directives/loading.ts"],"sourcesContent":["import type { AppContext, Component, Directive } from 'vue'\nimport { createVNode, render } from 'vue'\n\nimport GrLoading from '../components/GrLoading/GrLoading.vue'\n\nexport type LoadingTarget = string | HTMLElement\n\nexport type LoadingOptions = {\n /**\n * Контейнер, куда будет вставлен оверлей.\n * - если не задано, то для директивы используется сам `el`\n * - для ручного вызова (`createLoading`) по умолчанию используется `document.body`\n */\n target?: LoadingTarget\n\n /**\n * Полноэкранный лоадер (рендерится в `document.body`).\n * По умолчанию включается, если `target` = `document.body`.\n */\n fullscreen?: boolean\n\n text?: string\n spinner?: Component\n spinnerClass?: string\n animated?: boolean\n background?: string\n zIndex?: number\n customClass?: string\n\n /**\n * Внутренний контекст Vue-приложения.\n * Нужен, чтобы кастомный `spinner` мог использовать `inject()` даже при ручном `render()`.\n */\n appContext?: AppContext\n}\n\nexport type LoadingController = {\n close: () => void\n setText: (text?: string) => void\n setOptions: (next: Partial<LoadingOptions>) => void\n readonly target: HTMLElement\n}\n\nexport type LoadingBindingValue =\n | boolean\n | (Omit<LoadingOptions, 'appContext'> & {\n loading?: boolean\n })\n\nfunction isHTMLElement(value: unknown): value is HTMLElement {\n return typeof value === 'object' && value !== null && (value as any).nodeType === 1\n}\n\nfunction resolveTarget(input: LoadingTarget | undefined, fallback: HTMLElement): HTMLElement {\n if (!input) return fallback\n\n if (typeof input === 'string') {\n // Prefer searching within the same root (document / document fragment / shadow root)\n // to support components that are not attached to `document` yet (e.g. in unit tests).\n const root = fallback.getRootNode?.() ?? document\n const foundInRoot =\n typeof (root as any).querySelector === 'function' ? ((root as any).querySelector(input) as Element | null) : null\n if (isHTMLElement(foundInRoot)) return foundInRoot\n\n const foundInDocument = document.querySelector(input)\n if (isHTMLElement(foundInDocument)) return foundInDocument\n\n return fallback\n }\n\n if (isHTMLElement(input)) {\n return input\n }\n\n return fallback\n}\n\nfunction resolveFullscreen(options: LoadingOptions, target: HTMLElement): boolean {\n if (options.fullscreen != null) return options.fullscreen\n return target === document.body\n}\n\nfunction ensurePositionedContainer(target: HTMLElement, fullscreen: boolean): () => void {\n if (fullscreen) return () => {}\n\n const prevInline = target.style.position\n const computed = window.getComputedStyle(target)\n const isStatic = computed.position === 'static' || !computed.position\n\n if (isStatic) {\n target.style.position = 'relative'\n return () => {\n target.style.position = prevInline\n }\n }\n\n return () => {}\n}\n\nfunction ensureClippedContainer(target: HTMLElement, fullscreen: boolean): () => void {\n if (fullscreen) return () => {}\n\n const computed = window.getComputedStyle(target)\n // If the target has rounded corners, we must clip its content so the overlay\n // (and its blurred backdrop) never bleeds outside the visible rounded shape.\n const hasRadius = !!computed.borderRadius && computed.borderRadius !== '0px'\n if (!hasRadius) return () => {}\n\n const overflow = computed.overflow\n if (overflow && overflow !== 'visible') return () => {}\n\n const prevInline = target.style.overflow\n target.style.overflow = 'hidden'\n return () => {\n target.style.overflow = prevInline\n }\n}\n\nfunction parseBinding(value: LoadingBindingValue | undefined): { loading: boolean; options: LoadingOptions } {\n if (value === true || value === false) {\n return { loading: value, options: {} }\n }\n\n if (value && typeof value === 'object') {\n const { loading, ...rest } = value as any\n return { loading: loading ?? true, options: rest }\n }\n\n return { loading: false, options: {} }\n}\n\ntype InternalLoadingState = {\n controller?: LoadingController\n target?: HTMLElement\n fullscreen?: boolean\n}\n\nconst STATE_KEY: unique symbol = Symbol('grLoadingState')\n\nfunction getState(el: HTMLElement): InternalLoadingState {\n return ((el as any)[STATE_KEY] ??= {}) as InternalLoadingState\n}\n\nexport function createLoading(options: LoadingOptions = {}, fallbackTarget?: HTMLElement): LoadingController {\n const initialTarget = resolveTarget(options.target, fallbackTarget ?? document.body)\n const fullscreen = resolveFullscreen(options, initialTarget)\n const target = fullscreen ? document.body : initialTarget\n\n const appContext = options.appContext\n\n const restorePosition = ensurePositionedContainer(target, fullscreen)\n const restoreOverflow = ensureClippedContainer(target, fullscreen)\n const mountEl = document.createElement('div')\n mountEl.setAttribute('data-ds-loading-host', '')\n if (!fullscreen) {\n // Host wraps the overlay; make sure rounded corners of the target cascade\n // down to the overlay via `border-radius: inherit`.\n mountEl.style.borderRadius = 'inherit'\n }\n target.appendChild(mountEl)\n target.setAttribute('aria-busy', 'true')\n\n let current: LoadingOptions = { ...options }\n let disposed = false\n\n function doRender(): void {\n if (disposed) return\n\n const vnode = createVNode(GrLoading as any, {\n text: current.text,\n spinner: current.spinner,\n spinnerClass: current.spinnerClass,\n animated: current.animated,\n background: current.background,\n customClass: current.customClass,\n zIndex: current.zIndex,\n fullscreen,\n })\n\n if (appContext) {\n ;(vnode as any).appContext = appContext\n }\n\n render(vnode, mountEl)\n }\n\n function close(): void {\n if (disposed) return\n disposed = true\n\n render(null, mountEl)\n mountEl.remove()\n restoreOverflow()\n restorePosition()\n target.removeAttribute('aria-busy')\n }\n\n function setOptions(next: Partial<LoadingOptions>): void {\n current = {\n ...current,\n ...next,\n }\n doRender()\n }\n\n function setText(text?: string): void {\n setOptions({ text })\n }\n\n doRender()\n\n return {\n close,\n setOptions,\n setText,\n get target() {\n return target\n },\n }\n}\n\nfunction sync(el: HTMLElement, value: LoadingBindingValue | undefined, appContext?: AppContext): void {\n const { loading, options } = parseBinding(value)\n const state = getState(el)\n\n if (!loading) {\n state.controller?.close()\n state.controller = undefined\n state.target = undefined\n state.fullscreen = undefined\n return\n }\n\n const target = resolveTarget(options.target, el)\n const fullscreen = resolveFullscreen(options, target)\n const normalizedTarget = fullscreen ? document.body : target\n\n const shouldRecreate =\n !state.controller\n || state.target !== normalizedTarget\n || state.fullscreen !== fullscreen\n\n if (shouldRecreate) {\n state.controller?.close()\n state.controller = createLoading({ ...options, fullscreen, target: normalizedTarget, appContext }, el)\n state.target = normalizedTarget\n state.fullscreen = fullscreen\n return\n }\n\n const controller = state.controller\n if (!controller) return\n controller.setOptions({ ...options, fullscreen, target: normalizedTarget })\n}\n\nexport const vLoading: Directive<HTMLElement, LoadingBindingValue> = {\n mounted(el, binding) {\n const appContext = (binding.instance as any)?.$?.appContext as AppContext | undefined\n sync(el, binding.value, appContext)\n },\n updated(el, binding) {\n const appContext = (binding.instance as any)?.$?.appContext as AppContext | undefined\n sync(el, binding.value, appContext)\n },\n unmounted(el) {\n const state = getState(el)\n state.controller?.close()\n state.controller = undefined\n state.target = undefined\n state.fullscreen = undefined\n },\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"loading.js","names":[],"sources":["../../src/directives/loading.ts"],"sourcesContent":["import type { AppContext, Component, Directive } from 'vue'\nimport { createVNode, render } from 'vue'\n\nimport GrLoading from '../components/GrLoading/GrLoading.vue'\n\nexport type LoadingTarget = string | HTMLElement\n\nexport type LoadingOptions = {\n /**\n * Контейнер, куда будет вставлен оверлей.\n * - если не задано, то для директивы используется сам `el`\n * - для ручного вызова (`createLoading`) по умолчанию используется `document.body`\n */\n target?: LoadingTarget\n\n /**\n * Полноэкранный лоадер (рендерится в `document.body`).\n * По умолчанию включается, если `target` = `document.body`.\n */\n fullscreen?: boolean\n\n text?: string\n spinner?: Component\n spinnerClass?: string\n animated?: boolean\n background?: string\n zIndex?: number\n customClass?: string\n\n /**\n * Внутренний контекст Vue-приложения.\n * Нужен, чтобы кастомный `spinner` мог использовать `inject()` даже при ручном `render()`.\n */\n appContext?: AppContext\n}\n\nexport type LoadingController = {\n close: () => void\n setText: (text?: string) => void\n setOptions: (next: Partial<LoadingOptions>) => void\n readonly target: HTMLElement\n}\n\nexport type LoadingBindingValue =\n | boolean\n | (Omit<LoadingOptions, 'appContext'> & {\n loading?: boolean\n })\n\nfunction isHTMLElement(value: unknown): value is HTMLElement {\n return typeof value === 'object' && value !== null && (value as any).nodeType === 1\n}\n\nfunction resolveTarget(input: LoadingTarget | undefined, fallback: HTMLElement): HTMLElement {\n if (!input) return fallback\n\n if (typeof input === 'string') {\n // Prefer searching within the same root (document / document fragment / shadow root)\n // to support components that are not attached to `document` yet (e.g. in unit tests).\n const root = fallback.getRootNode?.() ?? document\n const foundInRoot =\n typeof (root as any).querySelector === 'function' ? ((root as any).querySelector(input) as Element | null) : null\n if (isHTMLElement(foundInRoot)) return foundInRoot\n\n const foundInDocument = document.querySelector(input)\n if (isHTMLElement(foundInDocument)) return foundInDocument\n\n return fallback\n }\n\n if (isHTMLElement(input)) {\n return input\n }\n\n return fallback\n}\n\nfunction resolveFullscreen(options: LoadingOptions, target: HTMLElement): boolean {\n if (options.fullscreen != null) return options.fullscreen\n return target === document.body\n}\n\nfunction ensurePositionedContainer(target: HTMLElement, fullscreen: boolean): () => void {\n if (fullscreen) return () => {}\n\n const prevInline = target.style.position\n const computed = window.getComputedStyle(target)\n const isStatic = computed.position === 'static' || !computed.position\n\n if (isStatic) {\n target.style.position = 'relative'\n return () => {\n target.style.position = prevInline\n }\n }\n\n return () => {}\n}\n\nfunction ensureClippedContainer(target: HTMLElement, fullscreen: boolean): () => void {\n if (fullscreen) return () => {}\n\n const computed = window.getComputedStyle(target)\n // If the target has rounded corners, we must clip its content so the overlay\n // (and its blurred backdrop) never bleeds outside the visible rounded shape.\n const hasRadius = !!computed.borderRadius && computed.borderRadius !== '0px'\n if (!hasRadius) return () => {}\n\n const overflow = computed.overflow\n if (overflow && overflow !== 'visible') return () => {}\n\n const prevInline = target.style.overflow\n target.style.overflow = 'hidden'\n return () => {\n target.style.overflow = prevInline\n }\n}\n\nfunction parseBinding(value: LoadingBindingValue | undefined): { loading: boolean; options: LoadingOptions } {\n if (value === true || value === false) {\n return { loading: value, options: {} }\n }\n\n if (value && typeof value === 'object') {\n const { loading, ...rest } = value as any\n return { loading: loading ?? true, options: rest }\n }\n\n return { loading: false, options: {} }\n}\n\ntype InternalLoadingState = {\n controller?: LoadingController\n target?: HTMLElement\n fullscreen?: boolean\n}\n\nconst STATE_KEY: unique symbol = Symbol('grLoadingState')\n\nfunction getState(el: HTMLElement): InternalLoadingState {\n return ((el as any)[STATE_KEY] ??= {}) as InternalLoadingState\n}\n\nexport function createLoading(options: LoadingOptions = {}, fallbackTarget?: HTMLElement): LoadingController {\n const initialTarget = resolveTarget(options.target, fallbackTarget ?? document.body)\n const fullscreen = resolveFullscreen(options, initialTarget)\n const target = fullscreen ? document.body : initialTarget\n\n const appContext = options.appContext\n\n const restorePosition = ensurePositionedContainer(target, fullscreen)\n const restoreOverflow = ensureClippedContainer(target, fullscreen)\n const mountEl = document.createElement('div')\n mountEl.setAttribute('data-gr-loading-host', '')\n if (!fullscreen) {\n // Host wraps the overlay; make sure rounded corners of the target cascade\n // down to the overlay via `border-radius: inherit`.\n mountEl.style.borderRadius = 'inherit'\n }\n target.appendChild(mountEl)\n target.setAttribute('aria-busy', 'true')\n\n let current: LoadingOptions = { ...options }\n let disposed = false\n\n function doRender(): void {\n if (disposed) return\n\n const vnode = createVNode(GrLoading as any, {\n text: current.text,\n spinner: current.spinner,\n spinnerClass: current.spinnerClass,\n animated: current.animated,\n background: current.background,\n customClass: current.customClass,\n zIndex: current.zIndex,\n fullscreen,\n })\n\n if (appContext) {\n ;(vnode as any).appContext = appContext\n }\n\n render(vnode, mountEl)\n }\n\n function close(): void {\n if (disposed) return\n disposed = true\n\n render(null, mountEl)\n mountEl.remove()\n restoreOverflow()\n restorePosition()\n target.removeAttribute('aria-busy')\n }\n\n function setOptions(next: Partial<LoadingOptions>): void {\n current = {\n ...current,\n ...next,\n }\n doRender()\n }\n\n function setText(text?: string): void {\n setOptions({ text })\n }\n\n doRender()\n\n return {\n close,\n setOptions,\n setText,\n get target() {\n return target\n },\n }\n}\n\nfunction sync(el: HTMLElement, value: LoadingBindingValue | undefined, appContext?: AppContext): void {\n const { loading, options } = parseBinding(value)\n const state = getState(el)\n\n if (!loading) {\n state.controller?.close()\n state.controller = undefined\n state.target = undefined\n state.fullscreen = undefined\n return\n }\n\n const target = resolveTarget(options.target, el)\n const fullscreen = resolveFullscreen(options, target)\n const normalizedTarget = fullscreen ? document.body : target\n\n const shouldRecreate =\n !state.controller\n || state.target !== normalizedTarget\n || state.fullscreen !== fullscreen\n\n if (shouldRecreate) {\n state.controller?.close()\n state.controller = createLoading({ ...options, fullscreen, target: normalizedTarget, appContext }, el)\n state.target = normalizedTarget\n state.fullscreen = fullscreen\n return\n }\n\n const controller = state.controller\n if (!controller) return\n controller.setOptions({ ...options, fullscreen, target: normalizedTarget })\n}\n\nexport const vLoading: Directive<HTMLElement, LoadingBindingValue> = {\n mounted(el, binding) {\n const appContext = (binding.instance as any)?.$?.appContext as AppContext | undefined\n sync(el, binding.value, appContext)\n },\n updated(el, binding) {\n const appContext = (binding.instance as any)?.$?.appContext as AppContext | undefined\n sync(el, binding.value, appContext)\n },\n unmounted(el) {\n const state = getState(el)\n state.controller?.close()\n state.controller = undefined\n state.target = undefined\n state.fullscreen = undefined\n },\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { a as allowedExtensionsValidator, c as normalizeFiles, i as allowedMimeTypesValidator, l as runFileValidators, n as maxSizeMbValidator, o as acceptValidator, r as maxFileSizeBytesValidator, s as matchAccept, t as maxTotalSizeBytesValidator, u as FileValidationError } from "../chunks/fileValidation-c_iBg74s.js";
1
+ import { a as allowedExtensionsValidator, c as normalizeFiles, i as allowedMimeTypesValidator, l as runFileValidators, n as maxSizeMbValidator, o as acceptValidator, r as maxFileSizeBytesValidator, s as matchAccept, t as maxTotalSizeBytesValidator, u as FileValidationError } from "../chunks/fileValidation-C3WFaWU2.js";
2
2
  export { FileValidationError, acceptValidator, allowedExtensionsValidator, allowedMimeTypesValidator, matchAccept, maxFileSizeBytesValidator, maxSizeMbValidator, maxTotalSizeBytesValidator, normalizeFiles, runFileValidators };
@@ -1,11 +1,11 @@
1
- import { n as grButtonSafelist } from "./chunks/safelist-DccvJqCE.js";
2
- import { n as grProgressBarSafelist } from "./chunks/config-B0uUCaJW.js";
3
- import { a as granularityThemeNames, i as granularityDefaultThemes, n as createGranularityProvider, r as granularityComponentConfigs, t as GRANULARITY_PROVIDER_ID } from "./chunks/shared-DpjTvFno.js";
1
+ import { n as grButtonSafelist } from "./chunks/safelist-Do2RtzLB.js";
2
+ import { n as grProgressBarSafelist } from "./chunks/config-DnvPqu4g.js";
3
+ import { a as granularityThemeNames, i as granularityDefaultThemes, n as createGranularityProvider, r as granularityComponentConfigs, t as GRANULARITY_PROVIDER_ID } from "./chunks/shared-ChvcQgDl.js";
4
4
  import { defineGranularComponent } from "@feugene/unocss-preset-granular/contract";
5
5
  import { tokenDefinitionsFromCssSync } from "@feugene/unocss-preset-granular/node";
6
6
  //#region src/components/GrButton/config.node.ts
7
- var lightCssUrl$1 = new URL("data:text/css;base64,OnJvb3QgewogIC0tZHMtYnV0dG9uLXByaW1hcnktYmc6IHZhcigtLXByaW1hcnkpOwogIC0tZHMtYnV0dG9uLXByaW1hcnktYmctaG92ZXI6IHZhcigtLXByaW1hcnktaG92ZXIpOwogIC0tZHMtYnV0dG9uLXByaW1hcnktYmctYWN0aXZlOiB2YXIoLS1wcmltYXJ5LWFjdGl2ZSk7CiAgLS1kcy1idXR0b24tcHJpbWFyeS1mZzogdmFyKC0tcHJpbWFyeS1mZyk7CiAgLS1kcy1idXR0b24tcHJpbWFyeS1zb2Z0LWJnOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tcHJpbWFyeSkgMTQlLCB2YXIoLS1iZykpOwogIC0tZHMtYnV0dG9uLXByaW1hcnktc29mdC1iZy1ob3ZlcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLXByaW1hcnkpIDE4JSwgdmFyKC0tYmcpKTsKICAtLWRzLWJ1dHRvbi1wcmltYXJ5LXNvZnQtYmctYWN0aXZlOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tcHJpbWFyeSkgMjQlLCB2YXIoLS1iZykpOwoKICAtLWRzLWJ1dHRvbi1zdWNjZXNzLWJnOiAjMDQ3ODU3OwogIC0tZHMtYnV0dG9uLXN1Y2Nlc3MtYmctaG92ZXI6ICMwMzZjNGQ7CiAgLS1kcy1idXR0b24tc3VjY2Vzcy1iZy1hY3RpdmU6ICMwMjVmNDQ7CiAgLS1kcy1idXR0b24tc3VjY2Vzcy1mZzogdmFyKC0tZHMtc3VjY2Vzcy1mZyk7CiAgLS1kcy1idXR0b24tc3VjY2Vzcy1zb2Z0LWJnOiB2YXIoLS1kcy1zdWNjZXNzLWxpZ2h0KTsKICAtLWRzLWJ1dHRvbi1zdWNjZXNzLXNvZnQtYmctaG92ZXI6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1kcy1zdWNjZXNzKSAyMCUsIHZhcigtLWJnKSk7CiAgLS1kcy1idXR0b24tc3VjY2Vzcy1zb2Z0LWJnLWFjdGl2ZTogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWRzLXN1Y2Nlc3MpIDI2JSwgdmFyKC0tYmcpKTsKCiAgLS1kcy1idXR0b24td2FybmluZy1iZzogI2MyNDEwYzsKICAtLWRzLWJ1dHRvbi13YXJuaW5nLWJnLWhvdmVyOiAjYjUzYjBhOwogIC0tZHMtYnV0dG9uLXdhcm5pbmctYmctYWN0aXZlOiAjOWYzMzA3OwogIC0tZHMtYnV0dG9uLXdhcm5pbmctZmc6IHZhcigtLWRzLXdhcm5pbmctZmcpOwogIC0tZHMtYnV0dG9uLXdhcm5pbmctc29mdC1iZzogdmFyKC0tZHMtd2FybmluZy1saWdodCk7CiAgLS1kcy1idXR0b24td2FybmluZy1zb2Z0LWJnLWhvdmVyOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZHMtd2FybmluZykgMjAlLCB2YXIoLS1iZykpOwogIC0tZHMtYnV0dG9uLXdhcm5pbmctc29mdC1iZy1hY3RpdmU6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1kcy13YXJuaW5nKSAyNiUsIHZhcigtLWJnKSk7CgogIC0tZHMtYnV0dG9uLWRhbmdlci1iZzogdmFyKC0tZHMtZGFuZ2VyKTsKICAtLWRzLWJ1dHRvbi1kYW5nZXItYmctaG92ZXI6IHZhcigtLWRzLWRhbmdlci1ob3Zlcik7CiAgLS1kcy1idXR0b24tZGFuZ2VyLWJnLWFjdGl2ZTogdmFyKC0tZHMtZGFuZ2VyLWFjdGl2ZSk7CiAgLS1kcy1idXR0b24tZGFuZ2VyLWZnOiB2YXIoLS1kcy1kYW5nZXItZmcpOwogIC0tZHMtYnV0dG9uLWRhbmdlci1zb2Z0LWJnOiB2YXIoLS1kcy1kYW5nZXItbGlnaHQpOwogIC0tZHMtYnV0dG9uLWRhbmdlci1zb2Z0LWJnLWhvdmVyOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZHMtZGFuZ2VyKSAyMCUsIHZhcigtLWJnKSk7CiAgLS1kcy1idXR0b24tZGFuZ2VyLXNvZnQtYmctYWN0aXZlOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZHMtZGFuZ2VyKSAyNiUsIHZhcigtLWJnKSk7CgogIC0tZHMtYnV0dG9uLWluZm8tYmc6IHZhcigtLWRzLWluZm8pOwogIC0tZHMtYnV0dG9uLWluZm8tYmctaG92ZXI6IHZhcigtLWRzLWluZm8taG92ZXIpOwogIC0tZHMtYnV0dG9uLWluZm8tYmctYWN0aXZlOiB2YXIoLS1kcy1pbmZvLWFjdGl2ZSk7CiAgLS1kcy1idXR0b24taW5mby1mZzogdmFyKC0tZHMtaW5mby1mZyk7CiAgLS1kcy1idXR0b24taW5mby1zb2Z0LWJnOiB2YXIoLS1kcy1pbmZvLWxpZ2h0KTsKICAtLWRzLWJ1dHRvbi1pbmZvLXNvZnQtYmctaG92ZXI6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1kcy1pbmZvKSAyMCUsIHZhcigtLWJnKSk7CiAgLS1kcy1idXR0b24taW5mby1zb2Z0LWJnLWFjdGl2ZTogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWRzLWluZm8pIDI2JSwgdmFyKC0tYmcpKTsKCiAgLS1kcy1idXR0b24tc2xhdGUtYmc6IHZhcigtLWRzLXNsYXRlKTsKICAtLWRzLWJ1dHRvbi1zbGF0ZS1iZy1ob3ZlcjogdmFyKC0tZHMtc2xhdGUtaG92ZXIpOwogIC0tZHMtYnV0dG9uLXNsYXRlLWJnLWFjdGl2ZTogdmFyKC0tZHMtc2xhdGUtYWN0aXZlKTsKICAtLWRzLWJ1dHRvbi1zbGF0ZS1mZzogdmFyKC0tZHMtc2xhdGUtZmcpOwogIC0tZHMtYnV0dG9uLXNsYXRlLXNvZnQtYmc6IHZhcigtLWRzLXNsYXRlLWxpZ2h0KTsKICAtLWRzLWJ1dHRvbi1zbGF0ZS1zb2Z0LWJnLWhvdmVyOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZHMtc2xhdGUpIDIwJSwgdmFyKC0tYmcpKTsKICAtLWRzLWJ1dHRvbi1zbGF0ZS1zb2Z0LWJnLWFjdGl2ZTogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWRzLXNsYXRlKSAyNiUsIHZhcigtLWJnKSk7CgogIC0tZHMtYnV0dG9uLWF6dXJlLWJnOiAjMDM2OWExOwogIC0tZHMtYnV0dG9uLWF6dXJlLWJnLWhvdmVyOiAjMDc1OTg1OwogIC0tZHMtYnV0dG9uLWF6dXJlLWJnLWFjdGl2ZTogIzBjNGE2ZTsKICAtLWRzLWJ1dHRvbi1henVyZS1mZzogI2ZmZmZmZjsKICAtLWRzLWJ1dHRvbi1henVyZS1zb2Z0LWJnOiB2YXIoLS1kcy1henVyZS1saWdodCk7CiAgLS1kcy1idXR0b24tYXp1cmUtc29mdC1iZy1ob3ZlcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWRzLWF6dXJlKSAyMCUsIHZhcigtLWJnKSk7CiAgLS1kcy1idXR0b24tYXp1cmUtc29mdC1iZy1hY3RpdmU6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1kcy1henVyZSkgMjYlLCB2YXIoLS1iZykpOwp9", "" + import.meta.url).href;
8
- var darkCssUrl$1 = new URL("data:text/css;base64,Ci50aGVtZS1kYXJrLAouZGFyaywKW2RhdGEtdGhlbWU9J2RhcmsnXSB7CiAgLS1kcy1idXR0b24tcHJpbWFyeS1iZzogIzU5NWNlNjsKICAtLWRzLWJ1dHRvbi1wcmltYXJ5LWJnLWhvdmVyOiAjNTA1M2RkOwogIC0tZHMtYnV0dG9uLXByaW1hcnktYmctYWN0aXZlOiAjNDc0YWNmOwogIC0tZHMtYnV0dG9uLXByaW1hcnktZmc6ICNmZmZmZmY7CgogIC0tZHMtYnV0dG9uLXN1Y2Nlc3MtYmc6ICMwNDc4NTc7CiAgLS1kcy1idXR0b24tc3VjY2Vzcy1iZy1ob3ZlcjogIzAzNmM0ZDsKICAtLWRzLWJ1dHRvbi1zdWNjZXNzLWJnLWFjdGl2ZTogIzAyNWY0NDsKICAtLWRzLWJ1dHRvbi1zdWNjZXNzLWZnOiAjZjhmYWZjOwoKICAtLWRzLWJ1dHRvbi13YXJuaW5nLWJnOiAjYzI0MTBjOwogIC0tZHMtYnV0dG9uLXdhcm5pbmctYmctaG92ZXI6ICNiNTNiMGE7CiAgLS1kcy1idXR0b24td2FybmluZy1iZy1hY3RpdmU6ICM5ZjMzMDc7CiAgLS1kcy1idXR0b24td2FybmluZy1mZzogI2Y4ZmFmYzsKCiAgLS1kcy1idXR0b24tZGFuZ2VyLWJnOiAjYjkxYzFjOwogIC0tZHMtYnV0dG9uLWRhbmdlci1iZy1ob3ZlcjogI2E5MTkxOTsKICAtLWRzLWJ1dHRvbi1kYW5nZXItYmctYWN0aXZlOiAjOTMxNTE1OwogIC0tZHMtYnV0dG9uLWRhbmdlci1mZzogI2Y4ZmFmYzsKCiAgLS1kcy1idXR0b24taW5mby1iZzogIzQzMzhjYTsKICAtLWRzLWJ1dHRvbi1pbmZvLWJnLWhvdmVyOiAjM2QzM2JiOwogIC0tZHMtYnV0dG9uLWluZm8tYmctYWN0aXZlOiAjMzYyZGE4OwogIC0tZHMtYnV0dG9uLWluZm8tZmc6ICNmOGZhZmM7CgogIC0tZHMtYnV0dG9uLXNsYXRlLWJnOiAjNDc1NTY5OwogIC0tZHMtYnV0dG9uLXNsYXRlLWJnLWhvdmVyOiAjMzM0MTU1OwogIC0tZHMtYnV0dG9uLXNsYXRlLWJnLWFjdGl2ZTogIzFlMjkzYjsKICAtLWRzLWJ1dHRvbi1zbGF0ZS1mZzogI2Y4ZmFmYzsKCiAgLS1kcy1idXR0b24tYXp1cmUtYmc6ICMwMzY5YTE7CiAgLS1kcy1idXR0b24tYXp1cmUtYmctaG92ZXI6ICMwNzU5ODU7CiAgLS1kcy1idXR0b24tYXp1cmUtYmctYWN0aXZlOiAjMGM0YTZlOwogIC0tZHMtYnV0dG9uLWF6dXJlLWZnOiAjZjhmYWZjOwp9", "" + import.meta.url).href;
7
+ var lightCssUrl$1 = new URL("data:text/css;base64,OnJvb3QgewogIC0tZ3ItYnV0dG9uLXByaW1hcnktYmc6IHZhcigtLXByaW1hcnkpOwogIC0tZ3ItYnV0dG9uLXByaW1hcnktYmctaG92ZXI6IHZhcigtLXByaW1hcnktaG92ZXIpOwogIC0tZ3ItYnV0dG9uLXByaW1hcnktYmctYWN0aXZlOiB2YXIoLS1wcmltYXJ5LWFjdGl2ZSk7CiAgLS1nci1idXR0b24tcHJpbWFyeS1mZzogdmFyKC0tcHJpbWFyeS1mZyk7CiAgLS1nci1idXR0b24tcHJpbWFyeS1zb2Z0LWJnOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tcHJpbWFyeSkgMTQlLCB2YXIoLS1iZykpOwogIC0tZ3ItYnV0dG9uLXByaW1hcnktc29mdC1iZy1ob3ZlcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLXByaW1hcnkpIDE4JSwgdmFyKC0tYmcpKTsKICAtLWdyLWJ1dHRvbi1wcmltYXJ5LXNvZnQtYmctYWN0aXZlOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tcHJpbWFyeSkgMjQlLCB2YXIoLS1iZykpOwoKICAtLWdyLWJ1dHRvbi1zdWNjZXNzLWJnOiAjMDQ3ODU3OwogIC0tZ3ItYnV0dG9uLXN1Y2Nlc3MtYmctaG92ZXI6ICMwMzZjNGQ7CiAgLS1nci1idXR0b24tc3VjY2Vzcy1iZy1hY3RpdmU6ICMwMjVmNDQ7CiAgLS1nci1idXR0b24tc3VjY2Vzcy1mZzogdmFyKC0tZ3Itc3VjY2Vzcy1mZyk7CiAgLS1nci1idXR0b24tc3VjY2Vzcy1zb2Z0LWJnOiB2YXIoLS1nci1zdWNjZXNzLWxpZ2h0KTsKICAtLWdyLWJ1dHRvbi1zdWNjZXNzLXNvZnQtYmctaG92ZXI6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1nci1zdWNjZXNzKSAyMCUsIHZhcigtLWJnKSk7CiAgLS1nci1idXR0b24tc3VjY2Vzcy1zb2Z0LWJnLWFjdGl2ZTogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWdyLXN1Y2Nlc3MpIDI2JSwgdmFyKC0tYmcpKTsKCiAgLS1nci1idXR0b24td2FybmluZy1iZzogI2MyNDEwYzsKICAtLWdyLWJ1dHRvbi13YXJuaW5nLWJnLWhvdmVyOiAjYjUzYjBhOwogIC0tZ3ItYnV0dG9uLXdhcm5pbmctYmctYWN0aXZlOiAjOWYzMzA3OwogIC0tZ3ItYnV0dG9uLXdhcm5pbmctZmc6IHZhcigtLWdyLXdhcm5pbmctZmcpOwogIC0tZ3ItYnV0dG9uLXdhcm5pbmctc29mdC1iZzogdmFyKC0tZ3Itd2FybmluZy1saWdodCk7CiAgLS1nci1idXR0b24td2FybmluZy1zb2Z0LWJnLWhvdmVyOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZ3Itd2FybmluZykgMjAlLCB2YXIoLS1iZykpOwogIC0tZ3ItYnV0dG9uLXdhcm5pbmctc29mdC1iZy1hY3RpdmU6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1nci13YXJuaW5nKSAyNiUsIHZhcigtLWJnKSk7CgogIC0tZ3ItYnV0dG9uLWRhbmdlci1iZzogdmFyKC0tZ3ItZGFuZ2VyKTsKICAtLWdyLWJ1dHRvbi1kYW5nZXItYmctaG92ZXI6IHZhcigtLWdyLWRhbmdlci1ob3Zlcik7CiAgLS1nci1idXR0b24tZGFuZ2VyLWJnLWFjdGl2ZTogdmFyKC0tZ3ItZGFuZ2VyLWFjdGl2ZSk7CiAgLS1nci1idXR0b24tZGFuZ2VyLWZnOiB2YXIoLS1nci1kYW5nZXItZmcpOwogIC0tZ3ItYnV0dG9uLWRhbmdlci1zb2Z0LWJnOiB2YXIoLS1nci1kYW5nZXItbGlnaHQpOwogIC0tZ3ItYnV0dG9uLWRhbmdlci1zb2Z0LWJnLWhvdmVyOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZ3ItZGFuZ2VyKSAyMCUsIHZhcigtLWJnKSk7CiAgLS1nci1idXR0b24tZGFuZ2VyLXNvZnQtYmctYWN0aXZlOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZ3ItZGFuZ2VyKSAyNiUsIHZhcigtLWJnKSk7CgogIC0tZ3ItYnV0dG9uLWluZm8tYmc6IHZhcigtLWdyLWluZm8pOwogIC0tZ3ItYnV0dG9uLWluZm8tYmctaG92ZXI6IHZhcigtLWdyLWluZm8taG92ZXIpOwogIC0tZ3ItYnV0dG9uLWluZm8tYmctYWN0aXZlOiB2YXIoLS1nci1pbmZvLWFjdGl2ZSk7CiAgLS1nci1idXR0b24taW5mby1mZzogdmFyKC0tZ3ItaW5mby1mZyk7CiAgLS1nci1idXR0b24taW5mby1zb2Z0LWJnOiB2YXIoLS1nci1pbmZvLWxpZ2h0KTsKICAtLWdyLWJ1dHRvbi1pbmZvLXNvZnQtYmctaG92ZXI6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1nci1pbmZvKSAyMCUsIHZhcigtLWJnKSk7CiAgLS1nci1idXR0b24taW5mby1zb2Z0LWJnLWFjdGl2ZTogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWdyLWluZm8pIDI2JSwgdmFyKC0tYmcpKTsKCiAgLS1nci1idXR0b24tc2xhdGUtYmc6IHZhcigtLWdyLXNsYXRlKTsKICAtLWdyLWJ1dHRvbi1zbGF0ZS1iZy1ob3ZlcjogdmFyKC0tZ3Itc2xhdGUtaG92ZXIpOwogIC0tZ3ItYnV0dG9uLXNsYXRlLWJnLWFjdGl2ZTogdmFyKC0tZ3Itc2xhdGUtYWN0aXZlKTsKICAtLWdyLWJ1dHRvbi1zbGF0ZS1mZzogdmFyKC0tZ3Itc2xhdGUtZmcpOwogIC0tZ3ItYnV0dG9uLXNsYXRlLXNvZnQtYmc6IHZhcigtLWdyLXNsYXRlLWxpZ2h0KTsKICAtLWdyLWJ1dHRvbi1zbGF0ZS1zb2Z0LWJnLWhvdmVyOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZ3Itc2xhdGUpIDIwJSwgdmFyKC0tYmcpKTsKICAtLWdyLWJ1dHRvbi1zbGF0ZS1zb2Z0LWJnLWFjdGl2ZTogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWdyLXNsYXRlKSAyNiUsIHZhcigtLWJnKSk7CgogIC0tZ3ItYnV0dG9uLWF6dXJlLWJnOiAjMDM2OWExOwogIC0tZ3ItYnV0dG9uLWF6dXJlLWJnLWhvdmVyOiAjMDc1OTg1OwogIC0tZ3ItYnV0dG9uLWF6dXJlLWJnLWFjdGl2ZTogIzBjNGE2ZTsKICAtLWdyLWJ1dHRvbi1henVyZS1mZzogI2ZmZmZmZjsKICAtLWdyLWJ1dHRvbi1henVyZS1zb2Z0LWJnOiB2YXIoLS1nci1henVyZS1saWdodCk7CiAgLS1nci1idXR0b24tYXp1cmUtc29mdC1iZy1ob3ZlcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWdyLWF6dXJlKSAyMCUsIHZhcigtLWJnKSk7CiAgLS1nci1idXR0b24tYXp1cmUtc29mdC1iZy1hY3RpdmU6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1nci1henVyZSkgMjYlLCB2YXIoLS1iZykpOwp9", "" + import.meta.url).href;
8
+ var darkCssUrl$1 = new URL("data:text/css;base64,Ci50aGVtZS1kYXJrLAouZGFyaywKW2RhdGEtdGhlbWU9J2RhcmsnXSB7CiAgLS1nci1idXR0b24tcHJpbWFyeS1iZzogIzU5NWNlNjsKICAtLWdyLWJ1dHRvbi1wcmltYXJ5LWJnLWhvdmVyOiAjNTA1M2RkOwogIC0tZ3ItYnV0dG9uLXByaW1hcnktYmctYWN0aXZlOiAjNDc0YWNmOwogIC0tZ3ItYnV0dG9uLXByaW1hcnktZmc6ICNmZmZmZmY7CgogIC0tZ3ItYnV0dG9uLXN1Y2Nlc3MtYmc6ICMwNDc4NTc7CiAgLS1nci1idXR0b24tc3VjY2Vzcy1iZy1ob3ZlcjogIzAzNmM0ZDsKICAtLWdyLWJ1dHRvbi1zdWNjZXNzLWJnLWFjdGl2ZTogIzAyNWY0NDsKICAtLWdyLWJ1dHRvbi1zdWNjZXNzLWZnOiAjZjhmYWZjOwoKICAtLWdyLWJ1dHRvbi13YXJuaW5nLWJnOiAjYzI0MTBjOwogIC0tZ3ItYnV0dG9uLXdhcm5pbmctYmctaG92ZXI6ICNiNTNiMGE7CiAgLS1nci1idXR0b24td2FybmluZy1iZy1hY3RpdmU6ICM5ZjMzMDc7CiAgLS1nci1idXR0b24td2FybmluZy1mZzogI2Y4ZmFmYzsKCiAgLS1nci1idXR0b24tZGFuZ2VyLWJnOiAjYjkxYzFjOwogIC0tZ3ItYnV0dG9uLWRhbmdlci1iZy1ob3ZlcjogI2E5MTkxOTsKICAtLWdyLWJ1dHRvbi1kYW5nZXItYmctYWN0aXZlOiAjOTMxNTE1OwogIC0tZ3ItYnV0dG9uLWRhbmdlci1mZzogI2Y4ZmFmYzsKCiAgLS1nci1idXR0b24taW5mby1iZzogIzQzMzhjYTsKICAtLWdyLWJ1dHRvbi1pbmZvLWJnLWhvdmVyOiAjM2QzM2JiOwogIC0tZ3ItYnV0dG9uLWluZm8tYmctYWN0aXZlOiAjMzYyZGE4OwogIC0tZ3ItYnV0dG9uLWluZm8tZmc6ICNmOGZhZmM7CgogIC0tZ3ItYnV0dG9uLXNsYXRlLWJnOiAjNDc1NTY5OwogIC0tZ3ItYnV0dG9uLXNsYXRlLWJnLWhvdmVyOiAjMzM0MTU1OwogIC0tZ3ItYnV0dG9uLXNsYXRlLWJnLWFjdGl2ZTogIzFlMjkzYjsKICAtLWdyLWJ1dHRvbi1zbGF0ZS1mZzogI2Y4ZmFmYzsKCiAgLS1nci1idXR0b24tYXp1cmUtYmc6ICMwMzY5YTE7CiAgLS1nci1idXR0b24tYXp1cmUtYmctaG92ZXI6ICMwNzU5ODU7CiAgLS1nci1idXR0b24tYXp1cmUtYmctYWN0aXZlOiAjMGM0YTZlOwogIC0tZ3ItYnV0dG9uLWF6dXJlLWZnOiAjZjhmYWZjOwp9", "" + import.meta.url).href;
9
9
  var grButtonConfig = defineGranularComponent(import.meta.url, {
10
10
  name: "GrButton",
11
11
  safelist: grButtonSafelist,
@@ -16,8 +16,8 @@ var grButtonConfig = defineGranularComponent(import.meta.url, {
16
16
  });
17
17
  //#endregion
18
18
  //#region src/components/GrProgressBar/config.node.ts
19
- var lightCssUrl = new URL("data:text/css;base64,OnJvb3QgewogIC0tcGItYmc6IHZhcigtLXByaW1hcnkpOwogIC0tcGItbmV1dHJhbC1iZzogdmFyKC0tc2Vjb25kYXJ5KTsKICAtLXBiLXN1Y2Nlc3MtYmc6IHZhcigtLWRzLXN1Y2Nlc3MpOwogIC0tcGItd2FybmluZy1iZzogdmFyKC0tZHMtd2FybmluZyk7CiAgLS1wYi1kYW5nZXItYmc6IHZhcigtLWRzLWRhbmdlcik7CiAgLS1wYi1pbmZvLWJnOiB2YXIoLS1kcy1pbmZvKTsKICAtLXBiLXNsYXRlLWJnOiB2YXIoLS1kcy1zbGF0ZSk7CiAgLS1wYi1henVyZS1iZzogdmFyKC0tZHMtYXp1cmUpOwp9Cg==", "" + import.meta.url).href;
20
- var darkCssUrl = new URL("data:text/css;base64,LnRoZW1lLWRhcmssCi5kYXJrLApbZGF0YS10aGVtZT0nZGFyayddIHsKICAtLXBiLWJnOiB2YXIoLS1wcmltYXJ5KTsKICAtLXBiLW5ldXRyYWwtYmc6IHZhcigtLXNlY29uZGFyeSk7CiAgLS1wYi1zdWNjZXNzLWJnOiB2YXIoLS1kcy1zdWNjZXNzKTsKICAtLXBiLXdhcm5pbmctYmc6IHZhcigtLWRzLXdhcm5pbmcpOwogIC0tcGItZGFuZ2VyLWJnOiB2YXIoLS1kcy1kYW5nZXIpOwogIC0tcGItaW5mby1iZzogdmFyKC0tZHMtaW5mbyk7CiAgLS1wYi1zbGF0ZS1iZzogdmFyKC0tZHMtc2xhdGUpOwogIC0tcGItYXp1cmUtYmc6IHZhcigtLWRzLWF6dXJlKTsKfQ==", "" + import.meta.url).href;
19
+ var lightCssUrl = new URL("data:text/css;base64,OnJvb3QgewogIC0tcGItYmc6IHZhcigtLXByaW1hcnkpOwogIC0tcGItbmV1dHJhbC1iZzogdmFyKC0tc2Vjb25kYXJ5KTsKICAtLXBiLXN1Y2Nlc3MtYmc6IHZhcigtLWdyLXN1Y2Nlc3MpOwogIC0tcGItd2FybmluZy1iZzogdmFyKC0tZ3Itd2FybmluZyk7CiAgLS1wYi1kYW5nZXItYmc6IHZhcigtLWdyLWRhbmdlcik7CiAgLS1wYi1pbmZvLWJnOiB2YXIoLS1nci1pbmZvKTsKICAtLXBiLXNsYXRlLWJnOiB2YXIoLS1nci1zbGF0ZSk7CiAgLS1wYi1henVyZS1iZzogdmFyKC0tZ3ItYXp1cmUpOwp9Cg==", "" + import.meta.url).href;
20
+ var darkCssUrl = new URL("data:text/css;base64,LnRoZW1lLWRhcmssCi5kYXJrLApbZGF0YS10aGVtZT0nZGFyayddIHsKICAtLXBiLWJnOiB2YXIoLS1wcmltYXJ5KTsKICAtLXBiLW5ldXRyYWwtYmc6IHZhcigtLXNlY29uZGFyeSk7CiAgLS1wYi1zdWNjZXNzLWJnOiB2YXIoLS1nci1zdWNjZXNzKTsKICAtLXBiLXdhcm5pbmctYmc6IHZhcigtLWdyLXdhcm5pbmcpOwogIC0tcGItZGFuZ2VyLWJnOiB2YXIoLS1nci1kYW5nZXIpOwogIC0tcGItaW5mby1iZzogdmFyKC0tZ3ItaW5mbyk7CiAgLS1wYi1zbGF0ZS1iZzogdmFyKC0tZ3Itc2xhdGUpOwogIC0tcGItYXp1cmUtYmc6IHZhcigtLWdyLWF6dXJlKTsKfQ==", "" + import.meta.url).href;
21
21
  //#endregion
22
22
  //#region src/granular-provider/node.ts
23
23
  var granularityProvider = createGranularityProvider([grButtonConfig, defineGranularComponent(import.meta.url, {
@@ -1 +1 @@
1
- {"version":3,"file":"granular-provider-node.js","names":[],"sources":["../src/components/GrButton/config.node.ts","../src/components/GrProgressBar/config.node.ts","../src/granular-provider/node.ts"],"sourcesContent":["import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\nimport { tokenDefinitionsFromCssSync } from '@feugene/unocss-preset-granular/node'\nimport { grButtonSafelist } from './safelist'\n\nconst lightCssUrl = new URL('./themes/light.css', import.meta.url).href\nconst darkCssUrl = new URL('./themes/dark.css', import.meta.url).href\n\nexport const grButtonConfig = defineGranularComponent(import.meta.url, {\n name: 'GrButton',\n safelist: grButtonSafelist,\n tokenDefinitions: {\n light: tokenDefinitionsFromCssSync(lightCssUrl, { selector: ':root' }),\n dark: tokenDefinitionsFromCssSync(darkCssUrl, { as: '.dark, [data-theme=\"dark\"]' }),\n },\n})\n","import {defineGranularComponent} from '@feugene/unocss-preset-granular/contract'\n\nimport { grProgressBarSafelist } from './safelist'\nimport {tokenDefinitionsFromCssSync} from \"@feugene/unocss-preset-granular/node\";\n\nconst lightCssUrl = new URL('./themes/light.css', import.meta.url).href\nconst darkCssUrl = new URL('./themes/dark.css', import.meta.url).href\n\nexport const grProgressBarConfig = defineGranularComponent(import.meta.url, {\n name: 'GrProgressBar',\n safelist: grProgressBarSafelist,\n tokenDefinitions: {\n light: tokenDefinitionsFromCssSync(lightCssUrl, { selector: ':root' }),\n dark: tokenDefinitionsFromCssSync(darkCssUrl, { as: '.dark, [data-theme=\"dark\"]' }),\n },\n})","// Node-entry granular-provider'а `@feugene/granularity`.\n//\n// От browser-варианта (`./index.ts`) отличается только тем, что для\n// `GrButton` используется `config.node.ts` с `tokenDefinitions`,\n// собранными через `tokenDefinitionsFromCssSync` (требует `node:fs`).\n// Всё остальное — id, `theme.*`, список компонентов, `packageBaseUrl` —\n// приходит из общей фабрики `./shared`.\nimport { grButtonConfig } from '../components/GrButton/config.node'\nimport { grProgressBarConfig } from '../components/GrProgressBar/config.node'\nimport { createGranularityProvider } from './shared'\n\nexport * from './shared'\n\nexport const granularityProvider = createGranularityProvider([grButtonConfig, grProgressBarConfig])\n\nexport default granularityProvider\n"],"mappings":";;;;;;AAIA,IAAM,gBAAc,IAAA,IAAA,q0HAAA,KAAA,OAAA,KAAA,IAA8C,CAAC;AACnE,IAAM,eAAa,IAAA,IAAA,q8CAAA,KAAA,OAAA,KAAA,IAA6C,CAAC;AAEjE,IAAa,iBAAiB,wBAAwB,OAAO,KAAK,KAAK;CACrE,MAAM;CACN,UAAU;CACV,kBAAkB;EAChB,OAAO,4BAA4B,eAAa,EAAE,UAAU,SAAS,CAAC;EACtE,MAAM,4BAA4B,cAAY,EAAE,IAAI,gCAA8B,CAAA;;CAErF,CAAC;;;ACTF,IAAM,cAAc,IAAA,IAAA,yZAAA,KAAA,OAAA,KAAA,IAA8C,CAAC;AACnE,IAAM,aAAa,IAAA,IAAA,qcAAA,KAAA,OAAA,KAAA,IAA6C,CAAC;;;ACOjE,IAAa,sBAAsB,0BAA0B,CAAC,gBDL3B,wBAAwB,OAAO,KAAK,KAAK;CAC1E,MAAM;CACN,UAAU;CACV,kBAAkB;EAChB,OAAO,4BAA4B,aAAa,EAAE,UAAU,SAAS,CAAC;EACtE,MAAM,4BAA4B,YAAY,EAAE,IAAI,gCAA8B,CAAA;;CAErF,CAAA,CCFiG,CAAC"}
1
+ {"version":3,"file":"granular-provider-node.js","names":[],"sources":["../src/components/GrButton/config.node.ts","../src/components/GrProgressBar/config.node.ts","../src/granular-provider/node.ts"],"sourcesContent":["import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\nimport { tokenDefinitionsFromCssSync } from '@feugene/unocss-preset-granular/node'\nimport { grButtonSafelist } from './safelist'\n\nconst lightCssUrl = new URL('./themes/light.css', import.meta.url).href\nconst darkCssUrl = new URL('./themes/dark.css', import.meta.url).href\n\nexport const grButtonConfig = defineGranularComponent(import.meta.url, {\n name: 'GrButton',\n safelist: grButtonSafelist,\n tokenDefinitions: {\n light: tokenDefinitionsFromCssSync(lightCssUrl, { selector: ':root' }),\n dark: tokenDefinitionsFromCssSync(darkCssUrl, { as: '.dark, [data-theme=\"dark\"]' }),\n },\n})\n","import {defineGranularComponent} from '@feugene/unocss-preset-granular/contract'\n\nimport { grProgressBarSafelist } from './safelist'\nimport {tokenDefinitionsFromCssSync} from \"@feugene/unocss-preset-granular/node\";\n\nconst lightCssUrl = new URL('./themes/light.css', import.meta.url).href\nconst darkCssUrl = new URL('./themes/dark.css', import.meta.url).href\n\nexport const grProgressBarConfig = defineGranularComponent(import.meta.url, {\n name: 'GrProgressBar',\n safelist: grProgressBarSafelist,\n tokenDefinitions: {\n light: tokenDefinitionsFromCssSync(lightCssUrl, { selector: ':root' }),\n dark: tokenDefinitionsFromCssSync(darkCssUrl, { as: '.dark, [data-theme=\"dark\"]' }),\n },\n})","// Node-entry granular-provider'а `@feugene/granularity`.\n//\n// От browser-варианта (`./index.ts`) отличается только тем, что для\n// `GrButton` используется `config.node.ts` с `tokenDefinitions`,\n// собранными через `tokenDefinitionsFromCssSync` (требует `node:fs`).\n// Всё остальное — id, `theme.*`, список компонентов, `packageBaseUrl` —\n// приходит из общей фабрики `./shared`.\nimport { grButtonConfig } from '../components/GrButton/config.node'\nimport { grProgressBarConfig } from '../components/GrProgressBar/config.node'\nimport { createGranularityProvider } from './shared'\n\nexport * from './shared'\n\nexport const granularityProvider = createGranularityProvider([grButtonConfig, grProgressBarConfig])\n\nexport default granularityProvider\n"],"mappings":";;;;;;AAIA,IAAM,gBAAc,IAAA,IAAA,q0HAAA,KAAA,OAAA,KAAA,GAAA,CAA8C,CAAC;AACnE,IAAM,eAAa,IAAA,IAAA,q8CAAA,KAAA,OAAA,KAAA,GAAA,CAA6C,CAAC;AAEjE,IAAa,iBAAiB,wBAAwB,OAAO,KAAK,KAAK;CACrE,MAAM;CACN,UAAU;CACV,kBAAkB;EAChB,OAAO,4BAA4B,eAAa,EAAE,UAAU,QAAQ,CAAC;EACrE,MAAM,4BAA4B,cAAY,EAAE,IAAI,+BAA6B,CAAC;CACpF;AACF,CAAC;;;ACTD,IAAM,cAAc,IAAA,IAAA,yZAAA,KAAA,OAAA,KAAA,GAAA,CAA8C,CAAC;AACnE,IAAM,aAAa,IAAA,IAAA,qcAAA,KAAA,OAAA,KAAA,GAAA,CAA6C,CAAC;;;ACOjE,IAAa,sBAAsB,0BAA0B,CAAC,gBDL3B,wBAAwB,OAAO,KAAK,KAAK;CAC1E,MAAM;CACN,UAAU;CACV,kBAAkB;EAChB,OAAO,4BAA4B,aAAa,EAAE,UAAU,QAAQ,CAAC;EACrE,MAAM,4BAA4B,YAAY,EAAE,IAAI,+BAA6B,CAAC;CACpF;AACF,CCF8E,CAAmB,CAAC"}
@@ -1,4 +1,4 @@
1
- import { a as granularityThemeNames, i as granularityDefaultThemes, n as createGranularityProvider, r as granularityComponentConfigs, t as GRANULARITY_PROVIDER_ID } from "./chunks/shared-DpjTvFno.js";
1
+ import { a as granularityThemeNames, i as granularityDefaultThemes, n as createGranularityProvider, r as granularityComponentConfigs, t as GRANULARITY_PROVIDER_ID } from "./chunks/shared-ChvcQgDl.js";
2
2
  //#region src/granular-provider/index.ts
3
3
  var granularityProvider = createGranularityProvider();
4
4
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"granular-provider.js","names":[],"sources":["../src/granular-provider/index.ts"],"sourcesContent":["// Browser-entry granular-provider'а `@feugene/granularity`.\n//\n// Использует облегчённый `GrButton/config.ts` без `tokenDefinitionsFromCssSync`,\n// поэтому при сборке клиентских приложений из этого модуля не протягиваются\n// `node:fs`/`node:url`/`node:path`.\n//\n// Для node-сборок UnoCSS, где нужны точечные token overrides из CSS-файлов\n// тем, используйте `./node.ts` — там в `GrButton` подставляется\n// `config.node.ts` с `tokenDefinitionsFromCssSync`.\nimport {createGranularityProvider} from './shared'\n\nexport * from './shared'\n\nexport const granularityProvider = createGranularityProvider()\n\nexport default granularityProvider\n"],"mappings":";;AAaA,IAAa,sBAAsB,2BAA2B"}
1
+ {"version":3,"file":"granular-provider.js","names":[],"sources":["../src/granular-provider/index.ts"],"sourcesContent":["// Browser-entry granular-provider'а `@feugene/granularity`.\n//\n// Использует облегчённый `GrButton/config.ts` без `tokenDefinitionsFromCssSync`,\n// поэтому при сборке клиентских приложений из этого модуля не протягиваются\n// `node:fs`/`node:url`/`node:path`.\n//\n// Для node-сборок UnoCSS, где нужны точечные token overrides из CSS-файлов\n// тем, используйте `./node.ts` — там в `GrButton` подставляется\n// `config.node.ts` с `tokenDefinitionsFromCssSync`.\nimport {createGranularityProvider} from './shared'\n\nexport * from './shared'\n\nexport const granularityProvider = createGranularityProvider()\n\nexport default granularityProvider\n"],"mappings":";;AAaA,IAAa,sBAAsB,0BAA0B"}
package/dist/i18n/all.js CHANGED
@@ -1,4 +1,4 @@
1
- import { n as ru, r as en, t as es } from "../chunks/es-CISK11Nv.js";
1
+ import { n as ru, r as en, t as es } from "../chunks/es-DBhctWg-.js";
2
2
  //#region src/i18n/all.ts
3
3
  var all = [
4
4
  en,
@@ -1 +1 @@
1
- {"version":3,"file":"all.js","names":[],"sources":["../../src/i18n/all.ts"],"sourcesContent":["/**\n * Aggregated locale loaders for the Granularity package.\n *\n * Imported via the dedicated sub-path `@feugene/granularity/i18n/all`.\n * Use it ONLY in environments where bundle size is not a concern\n * (demos, Storybook, e2e, localization tooling).\n *\n * For production builds always prefer per-locale imports from\n * `@feugene/granularity/i18n` so unused languages can be tree-shaken away.\n *\n * ```ts\n * import all from '@feugene/granularity/i18n/all'\n *\n * createFintI18n({\n * locale: 'en',\n * fallbackLocale: 'en',\n * loaders: all, // == [en, ru, es]\n * })\n * ```\n */\nimport type { LocaleLoaderCollection } from '@feugene/fint-i18n/core'\n\nimport { en } from './messages/en'\nimport { ru } from './messages/ru'\nimport { es } from './messages/es'\n\nexport const all: LocaleLoaderCollection[] = [en, ru, es]\n\nexport default all\n"],"mappings":";;AA0BA,IAAa,MAAgC;CAAC;CAAI;CAAI;CAAG"}
1
+ {"version":3,"file":"all.js","names":[],"sources":["../../src/i18n/all.ts"],"sourcesContent":["/**\n * Aggregated locale loaders for the Granularity package.\n *\n * Imported via the dedicated sub-path `@feugene/granularity/i18n/all`.\n * Use it ONLY in environments where bundle size is not a concern\n * (demos, Storybook, e2e, localization tooling).\n *\n * For production builds always prefer per-locale imports from\n * `@feugene/granularity/i18n` so unused languages can be tree-shaken away.\n *\n * ```ts\n * import all from '@feugene/granularity/i18n/all'\n *\n * createFintI18n({\n * locale: 'en',\n * fallbackLocale: 'en',\n * loaders: all, // == [en, ru, es]\n * })\n * ```\n */\nimport type { LocaleLoaderCollection } from '@feugene/fint-i18n/core'\n\nimport { en } from './messages/en'\nimport { ru } from './messages/ru'\nimport { es } from './messages/es'\n\nexport const all: LocaleLoaderCollection[] = [en, ru, es]\n\nexport default all\n"],"mappings":";;AA0BA,IAAa,MAAgC;CAAC;CAAI;CAAI;AAAE"}
@@ -1,3 +1,3 @@
1
- import { t as GRANULARITY_I18N_KEY } from "../chunks/adapter-BqqjEZGU.js";
2
- import { i as GRANULARITY_I18N_BLOCK, n as ru, r as en, t as es } from "../chunks/es-CISK11Nv.js";
1
+ import { t as GRANULARITY_I18N_KEY } from "../chunks/adapter-CAOxmn2G.js";
2
+ import { i as GRANULARITY_I18N_BLOCK, n as ru, r as en, t as es } from "../chunks/es-DBhctWg-.js";
3
3
  export { GRANULARITY_I18N_BLOCK, GRANULARITY_I18N_KEY, en, es, ru };