@feugene/granularity 0.11.0 → 0.13.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 (527) hide show
  1. package/dist/GrBadge.css +1 -1
  2. package/dist/GrFormFile.css +1 -1
  3. package/dist/GrToaster.css +1 -1
  4. package/dist/GrTree.css +1 -1
  5. package/dist/chunks/{config-ClhKPJvg.js → config-23WtUiAL.js} +1 -1
  6. package/dist/chunks/config-23WtUiAL.js.map +1 -0
  7. package/dist/chunks/config-8Pcutu1j.js.map +1 -0
  8. package/dist/chunks/{config-1uSYl98Y.js → config-B0i5r8kH.js} +1 -1
  9. package/dist/chunks/config-B0i5r8kH.js.map +1 -0
  10. package/dist/chunks/{config-BOlr7qw7.js → config-B5Rknzkd.js} +33 -39
  11. package/dist/chunks/config-B5Rknzkd.js.map +1 -0
  12. package/dist/chunks/config-B7W9VlZ7.js +5 -0
  13. package/dist/chunks/config-B7W9VlZ7.js.map +1 -0
  14. package/dist/chunks/config-BDSHekVC.js +84 -0
  15. package/dist/chunks/config-BDSHekVC.js.map +1 -0
  16. package/dist/chunks/config-BLHqZhy-.js.map +1 -0
  17. package/dist/chunks/{config-eYLZYOUS2.js → config-BMKNHFMD2.js} +15 -15
  18. package/dist/chunks/config-BMKNHFMD2.js.map +1 -0
  19. package/dist/chunks/config-BUHuGBik2.js.map +1 -0
  20. package/dist/chunks/config-BWiPnygb.js +5 -0
  21. package/dist/chunks/config-BWiPnygb.js.map +1 -0
  22. package/dist/chunks/config-BX1JTrkV.js.map +1 -0
  23. package/dist/chunks/config-BZFUM3Ky.js +75 -0
  24. package/dist/chunks/config-BZFUM3Ky.js.map +1 -0
  25. package/dist/chunks/{config-DUcu1D68.js → config-BmNT0Fmx.js} +2 -2
  26. package/dist/chunks/config-BmNT0Fmx.js.map +1 -0
  27. package/dist/chunks/{config-C49QUoJL.js → config-BvVq2gbd.js} +1 -1
  28. package/dist/chunks/{config-C49QUoJL.js.map → config-BvVq2gbd.js.map} +1 -1
  29. package/dist/chunks/{config-CrG1XiE7.js → config-C4hJxXDa.js} +5 -5
  30. package/dist/chunks/config-C4hJxXDa.js.map +1 -0
  31. package/dist/chunks/config-CB4RVt9M.js +66 -0
  32. package/dist/chunks/config-CB4RVt9M.js.map +1 -0
  33. package/dist/chunks/config-COE_vZ-l.js +52 -0
  34. package/dist/chunks/config-COE_vZ-l.js.map +1 -0
  35. package/dist/chunks/{config-CziwTDDL.js → config-CPdmr7tC.js} +1 -1
  36. package/dist/chunks/{config-CziwTDDL.js.map → config-CPdmr7tC.js.map} +1 -1
  37. package/dist/chunks/{config-BIRO0vDJ2.js → config-DPDFYzIa.js} +2 -2
  38. package/dist/chunks/config-DPDFYzIa.js.map +1 -0
  39. package/dist/chunks/{config-DnvPqu4g.js → config-DRKXJ9PW2.js} +1 -1
  40. package/dist/chunks/config-DRKXJ9PW2.js.map +1 -0
  41. package/dist/chunks/config-DToHb81g.js +45 -0
  42. package/dist/chunks/config-DToHb81g.js.map +1 -0
  43. package/dist/chunks/{config-jBp9wVv-.js → config-D_myOZbA.js} +1 -1
  44. package/dist/chunks/{config-jBp9wVv-.js.map → config-D_myOZbA.js.map} +1 -1
  45. package/dist/chunks/{config-D_R56_gT.js → config-Dg_6FTvJ.js} +1 -1
  46. package/dist/chunks/config-Dg_6FTvJ.js.map +1 -0
  47. package/dist/chunks/config-Dlm49Jp5.js +5 -0
  48. package/dist/chunks/config-Dlm49Jp5.js.map +1 -0
  49. package/dist/chunks/config-DpqOnJiz.js.map +1 -0
  50. package/dist/chunks/config-Dqy0rPPO2.js.map +1 -0
  51. package/dist/chunks/config-Droqn55j.js +8 -0
  52. package/dist/chunks/config-Droqn55j.js.map +1 -0
  53. package/dist/chunks/{config-C4snOIXg.js → config-KXuionN3.js} +1 -1
  54. package/dist/chunks/{config-C4snOIXg.js.map → config-KXuionN3.js.map} +1 -1
  55. package/dist/chunks/config-LGrZIdaZ.js.map +1 -0
  56. package/dist/chunks/{config-DezDih8_.js → config-LqDC_rvp.js} +2 -2
  57. package/dist/chunks/config-LqDC_rvp.js.map +1 -0
  58. package/dist/chunks/config-QaIc_gRa2.js.map +1 -0
  59. package/dist/chunks/config-U4m9PSql2.js.map +1 -0
  60. package/dist/chunks/{config-B7IIWGt_2.js → config-XmTv4pnI.js} +2 -2
  61. package/dist/chunks/config-XmTv4pnI.js.map +1 -0
  62. package/dist/chunks/config-eXB87DOi.js +9 -0
  63. package/dist/chunks/config-eXB87DOi.js.map +1 -0
  64. package/dist/chunks/{config-C7NpDrfO.js → config-gZWR75Bh2.js} +1 -1
  65. package/dist/chunks/config-gZWR75Bh2.js.map +1 -0
  66. package/dist/chunks/config-ipvU0lzP.js.map +1 -0
  67. package/dist/chunks/config-xR4XVmcy2.js.map +1 -0
  68. package/dist/chunks/context-Bfrgsluh.js +9 -0
  69. package/dist/chunks/context-Bfrgsluh.js.map +1 -0
  70. package/dist/chunks/context-DdNIxa1w.js +9 -0
  71. package/dist/chunks/context-DdNIxa1w.js.map +1 -0
  72. package/dist/chunks/context-DfWYCBB-.js +129 -0
  73. package/dist/chunks/context-DfWYCBB-.js.map +1 -0
  74. package/dist/chunks/{en-BdtiS2d3.js → en-Cr6EkG8c.js} +52 -4
  75. package/dist/chunks/en-Cr6EkG8c.js.map +1 -0
  76. package/dist/chunks/{es-DBhctWg-.js → es-DuYb1Qju.js} +3 -3
  77. package/dist/chunks/{es-DBhctWg-.js.map → es-DuYb1Qju.js.map} +1 -1
  78. package/dist/chunks/{es-BGRMZbe9.js → es-i08e9Sdo.js} +52 -4
  79. package/dist/chunks/es-i08e9Sdo.js.map +1 -0
  80. package/dist/chunks/{grBadgeStyles-DrycBuKT.js → grBadgeStyles-D3dFjr_N.js} +12 -12
  81. package/dist/chunks/grBadgeStyles-D3dFjr_N.js.map +1 -0
  82. package/dist/chunks/{grButtonStyles-C7Yga_Q1.js → grButtonStyles-DRBgDmOp.js} +28 -28
  83. package/dist/chunks/grButtonStyles-DRBgDmOp.js.map +1 -0
  84. package/dist/chunks/{grDropdownStyles-B_-DKytw.js → grDropdownStyles-HBPkghVr.js} +2 -2
  85. package/dist/chunks/{grDropdownStyles-B_-DKytw.js.map → grDropdownStyles-HBPkghVr.js.map} +1 -1
  86. package/dist/chunks/grModalEscStack-BXk-9mv7.js +43 -0
  87. package/dist/chunks/grModalEscStack-BXk-9mv7.js.map +1 -0
  88. package/dist/chunks/{grModalStyles-DWd3i05Q.js → grModalStyles-D8-shx9A.js} +1 -1
  89. package/dist/chunks/grModalStyles-D8-shx9A.js.map +1 -0
  90. package/dist/chunks/{grSelectStyles-CLK5hRd3.js → grSelectStyles-CwMUQrBZ.js} +12 -12
  91. package/dist/chunks/grSelectStyles-CwMUQrBZ.js.map +1 -0
  92. package/dist/chunks/{grStyle-Blc9otAx.js → grStyle-CdvxTXPH.js} +2 -2
  93. package/dist/chunks/grStyle-CdvxTXPH.js.map +1 -0
  94. package/dist/chunks/{granularityI18n-DoV7Ca2m.js → granularityI18n-SH0I--GW.js} +1 -1
  95. package/dist/chunks/{granularityI18n-DoV7Ca2m.js.map → granularityI18n-SH0I--GW.js.map} +1 -1
  96. package/dist/chunks/{ru-BFCnOiML.js → ru-B5XOOYZt.js} +52 -4
  97. package/dist/chunks/ru-B5XOOYZt.js.map +1 -0
  98. package/dist/chunks/{safelist-Do2RtzLB.js → safelist-BvO8HPnE.js} +1 -1
  99. package/dist/chunks/{safelist-Do2RtzLB.js.map → safelist-BvO8HPnE.js.map} +1 -1
  100. package/dist/chunks/shared-D-v9lit0.js +188 -0
  101. package/dist/chunks/shared-D-v9lit0.js.map +1 -0
  102. package/dist/chunks/{transition-TLFw4KBn.js → useScrollLock-K7kaP2Ud.js} +52 -1
  103. package/dist/chunks/useScrollLock-K7kaP2Ud.js.map +1 -0
  104. package/dist/components/GrAlert/chunks/GrAlert-B9gmpoPC.js +251 -0
  105. package/dist/components/GrAlert/chunks/GrAlert-B9gmpoPC.js.map +1 -0
  106. package/dist/components/GrAlert/index.js +2 -2
  107. package/dist/components/GrAutocomplete/chunks/GrAutocomplete-BVLoQ5tZ.js +499 -0
  108. package/dist/components/GrAutocomplete/chunks/GrAutocomplete-BVLoQ5tZ.js.map +1 -0
  109. package/dist/components/GrAutocomplete/index.js +3 -0
  110. package/dist/components/GrAvatar/chunks/{GrAvatar-96CpTCq5.js → GrAvatar-CTOUVBF7.js} +1 -1
  111. package/dist/components/GrAvatar/chunks/GrAvatar-CTOUVBF7.js.map +1 -0
  112. package/dist/components/GrAvatar/index.js +1 -1
  113. package/dist/components/GrBadge/chunks/{GrBadge-B77XlaqE.js → GrBadge-D1jefy4S.js} +12 -8
  114. package/dist/components/GrBadge/chunks/GrBadge-D1jefy4S.js.map +1 -0
  115. package/dist/components/GrBadge/index.js +2 -2
  116. package/dist/components/GrBadgeWrap/chunks/{GrBadgeWrap-CcktMOdg.js → GrBadgeWrap-DWDxHdiQ.js} +1 -1
  117. package/dist/components/GrBadgeWrap/chunks/GrBadgeWrap-DWDxHdiQ.js.map +1 -0
  118. package/dist/components/GrBadgeWrap/index.js +1 -1
  119. package/dist/components/GrBottomNav/chunks/{GrBottomNav-usuMgG8_.js → GrBottomNav-vSE4LXmk.js} +2 -2
  120. package/dist/components/GrBottomNav/chunks/GrBottomNav-vSE4LXmk.js.map +1 -0
  121. package/dist/components/GrBottomNav/index.js +1 -1
  122. package/dist/components/GrButton/chunks/{GrButton-BlffdeJr.js → GrButton-DCi4CUpo.js} +18 -14
  123. package/dist/components/GrButton/chunks/GrButton-DCi4CUpo.js.map +1 -0
  124. package/dist/components/GrButton/index.js +4 -4
  125. package/dist/components/GrCard/chunks/{GrCard-DUNMkuHW.js → GrCard-CxCjyHMb.js} +1 -1
  126. package/dist/components/GrCard/chunks/GrCard-CxCjyHMb.js.map +1 -0
  127. package/dist/components/GrCard/index.js +1 -1
  128. package/dist/components/GrCheckbox/chunks/{GrCheckbox-DJhzZZdO.js → GrCheckbox-BbIDRXtl.js} +5 -5
  129. package/dist/components/GrCheckbox/chunks/GrCheckbox-BbIDRXtl.js.map +1 -0
  130. package/dist/components/GrCheckbox/index.js +1 -1
  131. package/dist/components/GrCollapse/chunks/{GrCollapse-CPPLh_xU.js → GrCollapse-DApXztn8.js} +6 -6
  132. package/dist/components/GrCollapse/chunks/GrCollapse-DApXztn8.js.map +1 -0
  133. package/dist/components/GrCollapse/index.js +2 -2
  134. package/dist/components/GrCommandPalette/chunks/GrCommandPalette-6OyvNbek.js +410 -0
  135. package/dist/components/GrCommandPalette/chunks/GrCommandPalette-6OyvNbek.js.map +1 -0
  136. package/dist/components/GrCommandPalette/index.js +3 -0
  137. package/dist/components/GrConfigProvider/chunks/GrConfigProvider-BtyeBGm8.js +57 -0
  138. package/dist/components/GrConfigProvider/chunks/GrConfigProvider-BtyeBGm8.js.map +1 -0
  139. package/dist/components/GrConfigProvider/index.js +4 -0
  140. package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-BWYKCsHd.js → GrConfirmDialog-e4120mWw.js} +5 -5
  141. package/dist/components/GrConfirmDialog/chunks/GrConfirmDialog-e4120mWw.js.map +1 -0
  142. package/dist/components/GrConfirmDialog/index.js +1 -1
  143. package/dist/components/GrDataTable/chunks/GrDataTable-C1CzxV0p.js +307 -0
  144. package/dist/components/GrDataTable/chunks/GrDataTable-C1CzxV0p.js.map +1 -0
  145. package/dist/components/GrDataTable/index.js +2 -2
  146. package/dist/components/GrDialog/chunks/{GrDialog-5DAS-1Lb.js → GrDialog-BPMvDHOz.js} +6 -6
  147. package/dist/components/GrDialog/chunks/GrDialog-BPMvDHOz.js.map +1 -0
  148. package/dist/components/GrDialog/index.js +1 -1
  149. package/dist/components/GrDialogService/chunks/{GrDialogService-DY_fmaMu.js → GrDialogService-CYXCTGm3.js} +36 -11
  150. package/dist/components/GrDialogService/chunks/GrDialogService-CYXCTGm3.js.map +1 -0
  151. package/dist/components/GrDialogService/index.js +2 -2
  152. package/dist/components/GrDivider/chunks/GrDivider-BdENZ1w0.js +54 -0
  153. package/dist/components/GrDivider/chunks/GrDivider-BdENZ1w0.js.map +1 -0
  154. package/dist/components/GrDivider/index.js +3 -0
  155. package/dist/components/GrDrawer/chunks/{GrDrawer-D1kzsjXN.js → GrDrawer-KevdZ5BB.js} +41 -17
  156. package/dist/components/GrDrawer/chunks/GrDrawer-KevdZ5BB.js.map +1 -0
  157. package/dist/components/GrDrawer/index.js +2 -2
  158. package/dist/components/GrDropdown/chunks/{GrDropdown-BXb5Cxxf.js → GrDropdown-BKoy8hm-.js} +91 -5
  159. package/dist/components/GrDropdown/chunks/GrDropdown-BKoy8hm-.js.map +1 -0
  160. package/dist/components/GrDropdown/index.js +2 -2
  161. package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-DFEJLPcV.js → GrDropdownMenu-zCatXzmt.js} +11 -11
  162. package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu-zCatXzmt.js.map +1 -0
  163. package/dist/components/GrDropdownMenu/index.js +1 -1
  164. package/dist/components/GrEmptyState/chunks/{GrEmptyState-CA3BiTV7.js → GrEmptyState-CNb0BzjG.js} +3 -3
  165. package/dist/components/GrEmptyState/chunks/GrEmptyState-CNb0BzjG.js.map +1 -0
  166. package/dist/components/GrEmptyState/index.js +1 -1
  167. package/dist/components/GrFileUpload/chunks/{GrFileUpload-DvWPpiJS.js → GrFileUpload-CnLgUGDF.js} +12 -12
  168. package/dist/components/GrFileUpload/chunks/GrFileUpload-CnLgUGDF.js.map +1 -0
  169. package/dist/components/GrFileUpload/index.js +1 -1
  170. package/dist/components/GrForm/chunks/GrForm-CdaFjcyl.js +234 -0
  171. package/dist/components/GrForm/chunks/GrForm-CdaFjcyl.js.map +1 -0
  172. package/dist/components/GrForm/index.js +4 -0
  173. package/dist/components/GrFormField/chunks/GrFormField-CXCDBd99.js +100 -0
  174. package/dist/components/GrFormField/chunks/GrFormField-CXCDBd99.js.map +1 -0
  175. package/dist/components/GrFormField/index.js +3 -2
  176. package/dist/components/GrFormFile/chunks/{GrFormFile-CXcqqdvV.js → GrFormFile-CqacSbUl.js} +9 -9
  177. package/dist/components/GrFormFile/chunks/GrFormFile-CqacSbUl.js.map +1 -0
  178. package/dist/components/GrFormFile/index.js +1 -1
  179. package/dist/components/GrFormSection/chunks/{GrFormSection-Ce21jcgo.js → GrFormSection-C3w9DQJf.js} +1 -1
  180. package/dist/components/GrFormSection/chunks/GrFormSection-C3w9DQJf.js.map +1 -0
  181. package/dist/components/GrFormSection/index.js +1 -1
  182. package/dist/components/GrImageViewer/chunks/{GrImageViewer-OCUIrNh2.js → GrImageViewer-DDLJkvIU.js} +312 -223
  183. package/dist/components/GrImageViewer/chunks/GrImageViewer-DDLJkvIU.js.map +1 -0
  184. package/dist/components/GrImageViewer/index.js +1 -1
  185. package/dist/components/GrInput/chunks/GrInput-C1VBL0dg.js +337 -0
  186. package/dist/components/GrInput/chunks/GrInput-C1VBL0dg.js.map +1 -0
  187. package/dist/components/GrInput/index.js +2 -2
  188. package/dist/components/GrInputTag/chunks/{GrInputTag-zMgFqp2g.js → GrInputTag-BMk9jm42.js} +6 -6
  189. package/dist/components/GrInputTag/chunks/GrInputTag-BMk9jm42.js.map +1 -0
  190. package/dist/components/GrInputTag/index.js +2 -2
  191. package/dist/components/GrKbd/chunks/GrKbd-DTspwtoN.js +22 -0
  192. package/dist/components/GrKbd/chunks/GrKbd-DTspwtoN.js.map +1 -0
  193. package/dist/components/GrKbd/index.js +3 -0
  194. package/dist/components/GrLink/chunks/{GrLink-CYUe-Q8k.js → GrLink-BP0YrnL9.js} +1 -1
  195. package/dist/components/GrLink/chunks/{GrLink-CYUe-Q8k.js.map → GrLink-BP0YrnL9.js.map} +1 -1
  196. package/dist/components/GrLink/index.js +2 -2
  197. package/dist/components/GrList/chunks/{GrList-Dx772Ns4.js → GrList-5RA-tZzE.js} +3 -3
  198. package/dist/components/GrList/chunks/GrList-5RA-tZzE.js.map +1 -0
  199. package/dist/components/GrList/index.js +1 -1
  200. package/dist/components/GrLoading/chunks/{GrLoading--X_7rdbb.js → GrLoading-fRDtVfi7.js} +3 -3
  201. package/dist/components/GrLoading/chunks/GrLoading-fRDtVfi7.js.map +1 -0
  202. package/dist/components/GrLoading/index.js +2 -2
  203. package/dist/components/GrModal/chunks/{GrModal-BkjW9jZS.js → GrModal-BTu1-5eY.js} +4 -57
  204. package/dist/components/GrModal/chunks/GrModal-BTu1-5eY.js.map +1 -0
  205. package/dist/components/GrModal/index.js +3 -3
  206. package/dist/components/GrNavbar/chunks/{GrNavbar-DW3MiIIf.js → GrNavbar-keKT_mIM.js} +3 -3
  207. package/dist/components/GrNavbar/chunks/GrNavbar-keKT_mIM.js.map +1 -0
  208. package/dist/components/GrNavbar/index.js +1 -1
  209. package/dist/components/GrNumberInput/chunks/{GrNumberInput-CldPIWQx.js → GrNumberInput-l9ZOHG9D.js} +112 -28
  210. package/dist/components/GrNumberInput/chunks/GrNumberInput-l9ZOHG9D.js.map +1 -0
  211. package/dist/components/GrNumberInput/index.js +2 -2
  212. package/dist/components/GrPagination/chunks/{GrPagination-Bu9wv6it.js → GrPagination-C5Y69CuK.js} +59 -16
  213. package/dist/components/GrPagination/chunks/GrPagination-C5Y69CuK.js.map +1 -0
  214. package/dist/components/GrPagination/index.js +1 -1
  215. package/dist/components/GrProgressBar/chunks/{GrProgressBar-CC3z-Zqp.js → GrProgressBar-Dqg4Fj9S.js} +2 -2
  216. package/dist/components/GrProgressBar/chunks/GrProgressBar-Dqg4Fj9S.js.map +1 -0
  217. package/dist/components/GrProgressBar/index.js +2 -2
  218. package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-TmWXbpEP.js → GrPromptDialog-DNUjRVB9.js} +7 -7
  219. package/dist/components/GrPromptDialog/chunks/GrPromptDialog-DNUjRVB9.js.map +1 -0
  220. package/dist/components/GrPromptDialog/index.js +2 -2
  221. package/dist/components/GrRadio/chunks/{GrRadio-CPTixXaY.js → GrRadio-DlhxPGqf.js} +5 -7
  222. package/dist/components/GrRadio/chunks/GrRadio-DlhxPGqf.js.map +1 -0
  223. package/dist/components/GrRadio/index.js +2 -2
  224. package/dist/components/GrRadioGroup/chunks/{GrRadioGroup-vKZCbkCp.js → GrRadioGroup-BXt9iw4q.js} +7 -5
  225. package/dist/components/GrRadioGroup/chunks/GrRadioGroup-BXt9iw4q.js.map +1 -0
  226. package/dist/components/GrRadioGroup/index.js +2 -2
  227. package/dist/components/GrRating/chunks/GrRating-Co-3Rk4h.js +241 -0
  228. package/dist/components/GrRating/chunks/GrRating-Co-3Rk4h.js.map +1 -0
  229. package/dist/components/GrRating/index.js +3 -0
  230. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-BWJNe2gr.js → GrResponseErrorBanner-2CvM7Z08.js} +2 -2
  231. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-BWJNe2gr.js.map → GrResponseErrorBanner-2CvM7Z08.js.map} +1 -1
  232. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-Cdu9ekK9.js → GrResponseErrorBanner-C8NGx8pE.js} +3 -3
  233. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-Cdu9ekK9.js.map → GrResponseErrorBanner-C8NGx8pE.js.map} +1 -1
  234. package/dist/components/GrResponseErrorBanner/index.js +2 -2
  235. package/dist/components/GrSegmented/chunks/{GrSegmented-C1y0UXpQ.js → GrSegmented-CTd3n4PA.js} +14 -11
  236. package/dist/components/GrSegmented/chunks/GrSegmented-CTd3n4PA.js.map +1 -0
  237. package/dist/components/GrSegmented/index.js +2 -2
  238. package/dist/components/GrSelect/chunks/{GrSelect-RShK21lK.js → GrSelect-Dn3FgJ3Z.js} +293 -87
  239. package/dist/components/GrSelect/chunks/GrSelect-Dn3FgJ3Z.js.map +1 -0
  240. package/dist/components/GrSelect/index.js +2 -2
  241. package/dist/components/GrSidebar/chunks/{GrSidebar-DkWozzwA.js → GrSidebar-cvnzBfj3.js} +7 -7
  242. package/dist/components/GrSidebar/chunks/GrSidebar-cvnzBfj3.js.map +1 -0
  243. package/dist/components/GrSidebar/index.js +1 -1
  244. package/dist/components/GrSkeleton/chunks/{GrSkeleton-DsN-_CDZ.js → GrSkeleton-BucA5F4J.js} +1 -1
  245. package/dist/components/GrSkeleton/chunks/GrSkeleton-BucA5F4J.js.map +1 -0
  246. package/dist/components/GrSkeleton/index.js +2 -2
  247. package/dist/components/GrSlider/chunks/GrSlider-CzzJ3bD-.js +286 -0
  248. package/dist/components/GrSlider/chunks/GrSlider-CzzJ3bD-.js.map +1 -0
  249. package/dist/components/GrSlider/index.js +3 -0
  250. package/dist/components/GrStatistic/chunks/GrStatistic-gHiAwrX5.js +128 -0
  251. package/dist/components/GrStatistic/chunks/GrStatistic-gHiAwrX5.js.map +1 -0
  252. package/dist/components/GrStatistic/index.js +3 -0
  253. package/dist/components/GrSwitch/chunks/{GrSwitch-DAioyccZ.js → GrSwitch-CJdRvS0s.js} +16 -7
  254. package/dist/components/GrSwitch/chunks/GrSwitch-CJdRvS0s.js.map +1 -0
  255. package/dist/components/GrSwitch/index.js +2 -2
  256. package/dist/components/GrTabPanels/chunks/GrTabPanels-DeEMgb_y.js +68 -0
  257. package/dist/components/GrTabPanels/chunks/GrTabPanels-DeEMgb_y.js.map +1 -0
  258. package/dist/components/GrTabPanels/index.js +3 -0
  259. package/dist/components/GrTable/chunks/{GrTable-Db3hRnKA.js → GrTable-sNvsA8wa.js} +24 -11
  260. package/dist/components/GrTable/chunks/GrTable-sNvsA8wa.js.map +1 -0
  261. package/dist/components/GrTable/index.js +2 -2
  262. package/dist/components/GrTabs/chunks/{GrTabs-Z-FDJUr_.js → GrTabs-BqTak0SR.js} +9 -4
  263. package/dist/components/GrTabs/chunks/GrTabs-BqTak0SR.js.map +1 -0
  264. package/dist/components/GrTabs/index.js +2 -2
  265. package/dist/components/GrTextarea/chunks/{GrTextarea-D56YxhKq.js → GrTextarea-DIYBAPpP.js} +16 -6
  266. package/dist/components/GrTextarea/chunks/GrTextarea-DIYBAPpP.js.map +1 -0
  267. package/dist/components/GrTextarea/index.js +2 -2
  268. package/dist/components/GrToaster/chunks/{GrToaster-eI8YvnIo.js → GrToaster-BVHjIHcM.js} +52 -11
  269. package/dist/components/GrToaster/chunks/GrToaster-BVHjIHcM.js.map +1 -0
  270. package/dist/components/GrToaster/index.js +2 -2
  271. package/dist/components/GrTooltip/chunks/{GrTooltip-BeyZ8ssR.js → GrTooltip-BMKH2lIx.js} +3 -3
  272. package/dist/components/GrTooltip/chunks/GrTooltip-BMKH2lIx.js.map +1 -0
  273. package/dist/components/GrTooltip/index.js +1 -1
  274. package/dist/components/GrTree/chunks/{GrTree-D3ODe2dB.js → GrTree-_12ChXRQ.js} +108 -9
  275. package/dist/components/GrTree/chunks/GrTree-_12ChXRQ.js.map +1 -0
  276. package/dist/components/GrTree/index.js +2 -2
  277. package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-B2xBKs5Q.js → GrTreeSelect-CdaLG7Xq.js} +10 -10
  278. package/dist/components/GrTreeSelect/chunks/GrTreeSelect-CdaLG7Xq.js.map +1 -0
  279. package/dist/components/GrTreeSelect/index.js +2 -2
  280. package/dist/composables/useToast.js +3 -1
  281. package/dist/composables/useToast.js.map +1 -1
  282. package/dist/directives/loading.js +1 -1
  283. package/dist/granular-provider-node.js +6 -6
  284. package/dist/granular-provider-node.js.map +1 -1
  285. package/dist/granular-provider.js +1 -1
  286. package/dist/i18n/all.js +1 -1
  287. package/dist/i18n/index.js +1 -1
  288. package/dist/index.js +112 -87
  289. package/dist/index.js.map +1 -1
  290. package/dist/styles/base.css +30 -8
  291. package/dist/styles/index.css +6 -3
  292. package/dist/styles/preflight.css +8 -4
  293. package/dist/styles/themes/dark.css +52 -40
  294. package/dist/styles/themes/light.css +70 -45
  295. package/dist/styles/tokens.css +20 -20
  296. package/dist/types/src/components/GrAlert/GrAlert.vue.d.ts +26 -14
  297. package/dist/types/src/components/GrAlert/defaults.d.ts +17 -0
  298. package/dist/types/src/components/GrAlert/grAlertStyles.d.ts +55 -0
  299. package/dist/types/src/components/GrAlert/index.d.ts +4 -1
  300. package/dist/types/src/components/GrAutocomplete/GrAutocomplete.vue.d.ts +153 -0
  301. package/dist/types/src/components/GrAutocomplete/config.d.ts +1 -0
  302. package/dist/types/src/components/GrAutocomplete/defaults.d.ts +15 -0
  303. package/dist/types/src/components/GrAutocomplete/grAutocompleteStyles.d.ts +27 -0
  304. package/dist/types/src/components/GrAutocomplete/index.d.ts +6 -0
  305. package/dist/types/src/components/GrAutocomplete/safelist.d.ts +1 -0
  306. package/dist/types/src/components/GrAvatar/GrAvatar.vue.d.ts +1 -1
  307. package/dist/types/src/components/GrBadge/GrBadge.vue.d.ts +7 -7
  308. package/dist/types/src/components/GrBadge/defaults.d.ts +15 -0
  309. package/dist/types/src/components/GrBadge/index.d.ts +1 -0
  310. package/dist/types/src/components/GrBadgeWrap/GrBadgeWrap.vue.d.ts +1 -1
  311. package/dist/types/src/components/GrButton/GrButton.vue.d.ts +12 -12
  312. package/dist/types/src/components/GrButton/defaults.d.ts +25 -0
  313. package/dist/types/src/components/GrButton/grButtonStyles.d.ts +2 -2
  314. package/dist/types/src/components/GrButton/index.d.ts +1 -0
  315. package/dist/types/src/components/GrCheckbox/GrCheckbox.vue.d.ts +4 -4
  316. package/dist/types/src/components/GrCollapse/GrCollapse.vue.d.ts +2 -2
  317. package/dist/types/src/components/GrCollapse/GrCollapseItem.vue.d.ts +1 -1
  318. package/dist/types/src/components/GrCommandPalette/GrCommandPalette.vue.d.ts +128 -0
  319. package/dist/types/src/components/GrCommandPalette/config.d.ts +1 -0
  320. package/dist/types/src/components/GrCommandPalette/filtering.d.ts +35 -0
  321. package/dist/types/src/components/GrCommandPalette/grCommandPaletteStyles.d.ts +20 -0
  322. package/dist/types/src/components/GrCommandPalette/hotkey.d.ts +23 -0
  323. package/dist/types/src/components/GrCommandPalette/index.d.ts +6 -0
  324. package/dist/types/src/components/GrCommandPalette/safelist.d.ts +1 -0
  325. package/dist/types/src/components/GrConfigProvider/GrConfigProvider.vue.d.ts +59 -0
  326. package/dist/types/src/components/GrConfigProvider/config.d.ts +1 -0
  327. package/dist/types/src/components/GrConfigProvider/context.d.ts +131 -0
  328. package/dist/types/src/components/GrConfigProvider/index.d.ts +5 -0
  329. package/dist/types/src/components/GrConfirmDialog/GrConfirmDialog.vue.d.ts +2 -2
  330. package/dist/types/src/components/GrDataTable/GrDataTable.vue.d.ts +48 -4
  331. package/dist/types/src/components/GrDialog/GrDialog.vue.d.ts +1 -1
  332. package/dist/types/src/components/GrDialogService/store.d.ts +18 -0
  333. package/dist/types/src/components/GrDivider/GrDivider.vue.d.ts +58 -0
  334. package/dist/types/src/components/GrDivider/config.d.ts +1 -0
  335. package/dist/types/src/components/GrDivider/index.d.ts +4 -0
  336. package/dist/types/src/components/GrDrawer/GrDrawer.vue.d.ts +5 -5
  337. package/dist/types/src/components/GrDropdown/GrDropdown.vue.d.ts +8 -1
  338. package/dist/types/src/components/GrDropdownMenu/GrDropdownMenu.vue.d.ts +7 -1
  339. package/dist/types/src/components/GrDropdownMenu/GrDropdownMenuItem.vue.d.ts +1 -1
  340. package/dist/types/src/components/GrFileUpload/GrFileUpload.vue.d.ts +3 -3
  341. package/dist/types/src/components/GrForm/GrForm.vue.d.ts +93 -0
  342. package/dist/types/src/components/GrForm/config.d.ts +1 -0
  343. package/dist/types/src/components/GrForm/context.d.ts +27 -0
  344. package/dist/types/src/components/GrForm/index.d.ts +6 -0
  345. package/dist/types/src/components/GrForm/validation.d.ts +52 -0
  346. package/dist/types/src/components/GrFormField/GrFormField.vue.d.ts +25 -2
  347. package/dist/types/src/components/GrFormField/context.d.ts +20 -0
  348. package/dist/types/src/components/GrFormField/index.d.ts +1 -0
  349. package/dist/types/src/components/GrFormFile/GrFormFile.vue.d.ts +4 -4
  350. package/dist/types/src/components/GrImageViewer/GrImageViewer.vue.d.ts +7 -3
  351. package/dist/types/src/components/GrImageViewer/composables/useViewerKeyboard.d.ts +20 -0
  352. package/dist/types/src/components/GrImageViewer/composables/useWheelGesture.d.ts +16 -0
  353. package/dist/types/src/components/GrImageViewer/composables/useZoomPan.d.ts +50 -0
  354. package/dist/types/src/components/GrInput/GrInput.vue.d.ts +49 -10
  355. package/dist/types/src/components/GrInput/defaults.d.ts +18 -0
  356. package/dist/types/src/components/GrInput/grInputStyles.d.ts +1 -1
  357. package/dist/types/src/components/GrInput/index.d.ts +1 -0
  358. package/dist/types/src/components/GrInputTag/GrInputTag.vue.d.ts +3 -3
  359. package/dist/types/src/components/GrKbd/GrKbd.vue.d.ts +46 -0
  360. package/dist/types/src/components/GrKbd/config.d.ts +1 -0
  361. package/dist/types/src/components/GrKbd/index.d.ts +4 -0
  362. package/dist/types/src/components/GrLink/GrLink.vue.d.ts +3 -3
  363. package/dist/types/src/components/GrLink/grLinkStyles.d.ts +3 -3
  364. package/dist/types/src/components/GrModal/grModalStyles.d.ts +1 -1
  365. package/dist/types/src/components/GrNumberInput/GrNumberInput.vue.d.ts +25 -9
  366. package/dist/types/src/components/GrNumberInput/defaults.d.ts +14 -0
  367. package/dist/types/src/components/GrNumberInput/index.d.ts +1 -0
  368. package/dist/types/src/components/GrPagination/GrPagination.vue.d.ts +18 -0
  369. package/dist/types/src/components/GrPromptDialog/GrPromptDialog.vue.d.ts +4 -4
  370. package/dist/types/src/components/GrRadio/GrRadio.vue.d.ts +5 -5
  371. package/dist/types/src/components/GrRadio/defaults.d.ts +14 -0
  372. package/dist/types/src/components/GrRadio/grRadioStyles.d.ts +3 -3
  373. package/dist/types/src/components/GrRadio/index.d.ts +1 -0
  374. package/dist/types/src/components/GrRadioGroup/GrRadioGroup.vue.d.ts +4 -4
  375. package/dist/types/src/components/GrRadioGroup/defaults.d.ts +14 -0
  376. package/dist/types/src/components/GrRadioGroup/index.d.ts +1 -0
  377. package/dist/types/src/components/GrRating/GrRating.vue.d.ts +124 -0
  378. package/dist/types/src/components/GrRating/config.d.ts +1 -0
  379. package/dist/types/src/components/GrRating/defaults.d.ts +14 -0
  380. package/dist/types/src/components/GrRating/grRatingStyles.d.ts +21 -0
  381. package/dist/types/src/components/GrRating/index.d.ts +6 -0
  382. package/dist/types/src/components/GrRating/safelist.d.ts +1 -0
  383. package/dist/types/src/components/GrResponseErrorBanner/GrUploadErrorBanner.vue.d.ts +1 -1
  384. package/dist/types/src/components/GrSegmented/GrSegmented.vue.d.ts +7 -7
  385. package/dist/types/src/components/GrSegmented/defaults.d.ts +15 -0
  386. package/dist/types/src/components/GrSegmented/grSegmentedStyles.d.ts +1 -1
  387. package/dist/types/src/components/GrSegmented/index.d.ts +1 -0
  388. package/dist/types/src/components/GrSelect/GrSelect.vue.d.ts +57 -17
  389. package/dist/types/src/components/GrSelect/defaults.d.ts +17 -0
  390. package/dist/types/src/components/GrSelect/grSelectStyles.d.ts +3 -3
  391. package/dist/types/src/components/GrSelect/index.d.ts +1 -0
  392. package/dist/types/src/components/GrSidebar/GrSidebarItem.vue.d.ts +2 -2
  393. package/dist/types/src/components/GrSkeleton/GrSkeleton.vue.d.ts +1 -1
  394. package/dist/types/src/components/GrSlider/GrSlider.vue.d.ts +88 -0
  395. package/dist/types/src/components/GrSlider/config.d.ts +1 -0
  396. package/dist/types/src/components/GrSlider/defaults.d.ts +14 -0
  397. package/dist/types/src/components/GrSlider/grSliderStyles.d.ts +36 -0
  398. package/dist/types/src/components/GrSlider/index.d.ts +6 -0
  399. package/dist/types/src/components/GrSlider/safelist.d.ts +1 -0
  400. package/dist/types/src/components/GrStatistic/GrStatistic.vue.d.ts +116 -0
  401. package/dist/types/src/components/GrStatistic/config.d.ts +1 -0
  402. package/dist/types/src/components/GrStatistic/formatStatisticValue.d.ts +16 -0
  403. package/dist/types/src/components/GrStatistic/grStatisticStyles.d.ts +24 -0
  404. package/dist/types/src/components/GrStatistic/index.d.ts +6 -0
  405. package/dist/types/src/components/GrStatistic/safelist.d.ts +1 -0
  406. package/dist/types/src/components/GrSwitch/GrSwitch.vue.d.ts +4 -4
  407. package/dist/types/src/components/GrSwitch/defaults.d.ts +14 -0
  408. package/dist/types/src/components/GrSwitch/grSwitchStyles.d.ts +2 -2
  409. package/dist/types/src/components/GrSwitch/index.d.ts +1 -0
  410. package/dist/types/src/components/GrTabPanels/GrTabPanel.vue.d.ts +46 -0
  411. package/dist/types/src/components/GrTabPanels/GrTabPanels.vue.d.ts +51 -0
  412. package/dist/types/src/components/GrTabPanels/config.d.ts +5 -0
  413. package/dist/types/src/components/GrTabPanels/context.d.ts +9 -0
  414. package/dist/types/src/components/GrTabPanels/index.d.ts +6 -0
  415. package/dist/types/src/components/GrTable/GrTable.vue.d.ts +16 -0
  416. package/dist/types/src/components/GrTabs/GrTabs.vue.d.ts +6 -0
  417. package/dist/types/src/components/GrTextarea/GrTextarea.vue.d.ts +5 -5
  418. package/dist/types/src/components/GrToaster/GrToaster.vue.d.ts +19 -2
  419. package/dist/types/src/components/GrToaster/index.d.ts +1 -1
  420. package/dist/types/src/components/GrTooltip/GrTooltip.vue.d.ts +1 -1
  421. package/dist/types/src/components/GrTree/grTreeInteractionContext.d.ts +2 -0
  422. package/dist/types/src/components/GrTreeSelect/GrTreeSelect.vue.d.ts +1 -1
  423. package/dist/types/src/components/GrTreeSelect/grTreeSelectStyles.d.ts +1 -1
  424. package/dist/types/src/composables/internal/useScrollLock.d.ts +24 -0
  425. package/dist/types/src/composables/useToast.d.ts +24 -0
  426. package/dist/types/src/granular-provider/shared.d.ts +10 -0
  427. package/dist/types/src/i18n/messages/en.d.ts +84 -0
  428. package/dist/types/src/i18n/messages/es.d.ts +84 -0
  429. package/dist/types/src/i18n/messages/ru.d.ts +84 -0
  430. package/dist/types/src/index.d.ts +10 -0
  431. package/dist/web-types.json +1642 -356
  432. package/package.json +41 -1
  433. package/dist/chunks/config-1uSYl98Y.js.map +0 -1
  434. package/dist/chunks/config-8Pcutu1j2.js.map +0 -1
  435. package/dist/chunks/config-B7IIWGt_2.js.map +0 -1
  436. package/dist/chunks/config-BIRO0vDJ2.js.map +0 -1
  437. package/dist/chunks/config-BLHqZhy-2.js.map +0 -1
  438. package/dist/chunks/config-BOlr7qw7.js.map +0 -1
  439. package/dist/chunks/config-BUHuGBik.js.map +0 -1
  440. package/dist/chunks/config-BX1JTrkV2.js.map +0 -1
  441. package/dist/chunks/config-C7NpDrfO.js.map +0 -1
  442. package/dist/chunks/config-ClhKPJvg.js.map +0 -1
  443. package/dist/chunks/config-Cpi9Mh2J.js.map +0 -1
  444. package/dist/chunks/config-CrG1XiE7.js.map +0 -1
  445. package/dist/chunks/config-DUcu1D68.js.map +0 -1
  446. package/dist/chunks/config-D_R56_gT.js.map +0 -1
  447. package/dist/chunks/config-DezDih8_.js.map +0 -1
  448. package/dist/chunks/config-DnvPqu4g.js.map +0 -1
  449. package/dist/chunks/config-DpqOnJiz2.js.map +0 -1
  450. package/dist/chunks/config-LGrZIdaZ2.js.map +0 -1
  451. package/dist/chunks/config-QaIc_gRa.js.map +0 -1
  452. package/dist/chunks/config-U4m9PSql.js.map +0 -1
  453. package/dist/chunks/config-eYLZYOUS2.js.map +0 -1
  454. package/dist/chunks/config-ipvU0lzP2.js.map +0 -1
  455. package/dist/chunks/config-xR4XVmcy.js.map +0 -1
  456. package/dist/chunks/en-BdtiS2d3.js.map +0 -1
  457. package/dist/chunks/es-BGRMZbe9.js.map +0 -1
  458. package/dist/chunks/grBadgeStyles-DrycBuKT.js.map +0 -1
  459. package/dist/chunks/grButtonStyles-C7Yga_Q1.js.map +0 -1
  460. package/dist/chunks/grModalStyles-DWd3i05Q.js.map +0 -1
  461. package/dist/chunks/grSelectStyles-CLK5hRd3.js.map +0 -1
  462. package/dist/chunks/grStyle-Blc9otAx.js.map +0 -1
  463. package/dist/chunks/ru-BFCnOiML.js.map +0 -1
  464. package/dist/chunks/shared-ChvcQgDl.js +0 -168
  465. package/dist/chunks/shared-ChvcQgDl.js.map +0 -1
  466. package/dist/chunks/transition-TLFw4KBn.js.map +0 -1
  467. package/dist/components/GrAlert/chunks/GrAlert-DPJSU_fG.js +0 -163
  468. package/dist/components/GrAlert/chunks/GrAlert-DPJSU_fG.js.map +0 -1
  469. package/dist/components/GrAvatar/chunks/GrAvatar-96CpTCq5.js.map +0 -1
  470. package/dist/components/GrBadge/chunks/GrBadge-B77XlaqE.js.map +0 -1
  471. package/dist/components/GrBadgeWrap/chunks/GrBadgeWrap-CcktMOdg.js.map +0 -1
  472. package/dist/components/GrBottomNav/chunks/GrBottomNav-usuMgG8_.js.map +0 -1
  473. package/dist/components/GrButton/chunks/GrButton-BlffdeJr.js.map +0 -1
  474. package/dist/components/GrCard/chunks/GrCard-DUNMkuHW.js.map +0 -1
  475. package/dist/components/GrCheckbox/chunks/GrCheckbox-DJhzZZdO.js.map +0 -1
  476. package/dist/components/GrCollapse/chunks/GrCollapse-CPPLh_xU.js.map +0 -1
  477. package/dist/components/GrConfirmDialog/chunks/GrConfirmDialog-BWYKCsHd.js.map +0 -1
  478. package/dist/components/GrDataTable/chunks/GrDataTable-ptbARmJ3.js +0 -179
  479. package/dist/components/GrDataTable/chunks/GrDataTable-ptbARmJ3.js.map +0 -1
  480. package/dist/components/GrDialog/chunks/GrDialog-5DAS-1Lb.js.map +0 -1
  481. package/dist/components/GrDialogService/chunks/GrDialogService-DY_fmaMu.js.map +0 -1
  482. package/dist/components/GrDrawer/chunks/GrDrawer-D1kzsjXN.js.map +0 -1
  483. package/dist/components/GrDropdown/chunks/GrDropdown-BXb5Cxxf.js.map +0 -1
  484. package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu-DFEJLPcV.js.map +0 -1
  485. package/dist/components/GrEmptyState/chunks/GrEmptyState-CA3BiTV7.js.map +0 -1
  486. package/dist/components/GrFileUpload/chunks/GrFileUpload-DvWPpiJS.js.map +0 -1
  487. package/dist/components/GrFormField/chunks/GrFormField-BujNQrw8.js +0 -35
  488. package/dist/components/GrFormField/chunks/GrFormField-BujNQrw8.js.map +0 -1
  489. package/dist/components/GrFormFile/chunks/GrFormFile-CXcqqdvV.js.map +0 -1
  490. package/dist/components/GrFormSection/chunks/GrFormSection-Ce21jcgo.js.map +0 -1
  491. package/dist/components/GrImageViewer/chunks/GrImageViewer-OCUIrNh2.js.map +0 -1
  492. package/dist/components/GrInput/chunks/GrInput-C8pOJgCi.js +0 -188
  493. package/dist/components/GrInput/chunks/GrInput-C8pOJgCi.js.map +0 -1
  494. package/dist/components/GrInputTag/chunks/GrInputTag-zMgFqp2g.js.map +0 -1
  495. package/dist/components/GrList/chunks/GrList-Dx772Ns4.js.map +0 -1
  496. package/dist/components/GrLoading/chunks/GrLoading--X_7rdbb.js.map +0 -1
  497. package/dist/components/GrModal/chunks/GrModal-BkjW9jZS.js.map +0 -1
  498. package/dist/components/GrNavbar/chunks/GrNavbar-DW3MiIIf.js.map +0 -1
  499. package/dist/components/GrNumberInput/chunks/GrNumberInput-CldPIWQx.js.map +0 -1
  500. package/dist/components/GrPagination/chunks/GrPagination-Bu9wv6it.js.map +0 -1
  501. package/dist/components/GrProgressBar/chunks/GrProgressBar-CC3z-Zqp.js.map +0 -1
  502. package/dist/components/GrPromptDialog/chunks/GrPromptDialog-TmWXbpEP.js.map +0 -1
  503. package/dist/components/GrRadio/chunks/GrRadio-CPTixXaY.js.map +0 -1
  504. package/dist/components/GrRadioGroup/chunks/GrRadioGroup-vKZCbkCp.js.map +0 -1
  505. package/dist/components/GrSegmented/chunks/GrSegmented-C1y0UXpQ.js.map +0 -1
  506. package/dist/components/GrSelect/chunks/GrSelect-RShK21lK.js.map +0 -1
  507. package/dist/components/GrSidebar/chunks/GrSidebar-DkWozzwA.js.map +0 -1
  508. package/dist/components/GrSkeleton/chunks/GrSkeleton-DsN-_CDZ.js.map +0 -1
  509. package/dist/components/GrSwitch/chunks/GrSwitch-DAioyccZ.js.map +0 -1
  510. package/dist/components/GrTable/chunks/GrTable-Db3hRnKA.js.map +0 -1
  511. package/dist/components/GrTabs/chunks/GrTabs-Z-FDJUr_.js.map +0 -1
  512. package/dist/components/GrTextarea/chunks/GrTextarea-D56YxhKq.js.map +0 -1
  513. package/dist/components/GrToaster/chunks/GrToaster-eI8YvnIo.js.map +0 -1
  514. package/dist/components/GrTooltip/chunks/GrTooltip-BeyZ8ssR.js.map +0 -1
  515. package/dist/components/GrTree/chunks/GrTree-D3ODe2dB.js.map +0 -1
  516. package/dist/components/GrTreeSelect/chunks/GrTreeSelect-B2xBKs5Q.js.map +0 -1
  517. package/dist/chunks/{config-8Pcutu1j2.js → config-8Pcutu1j.js} +0 -0
  518. package/dist/chunks/{config-BLHqZhy-2.js → config-BLHqZhy-.js} +0 -0
  519. package/dist/chunks/{config-BUHuGBik.js → config-BUHuGBik2.js} +0 -0
  520. package/dist/chunks/{config-BX1JTrkV2.js → config-BX1JTrkV.js} +0 -0
  521. package/dist/chunks/{config-DpqOnJiz2.js → config-DpqOnJiz.js} +0 -0
  522. package/dist/chunks/{config-Cpi9Mh2J.js → config-Dqy0rPPO2.js} +1 -1
  523. /package/dist/chunks/{config-LGrZIdaZ2.js → config-LGrZIdaZ.js} +0 -0
  524. /package/dist/chunks/{config-QaIc_gRa.js → config-QaIc_gRa2.js} +0 -0
  525. /package/dist/chunks/{config-U4m9PSql.js → config-U4m9PSql2.js} +0 -0
  526. /package/dist/chunks/{config-ipvU0lzP2.js → config-ipvU0lzP.js} +0 -0
  527. /package/dist/chunks/{config-xR4XVmcy.js → config-xR4XVmcy2.js} +0 -0
@@ -1,8 +1,11 @@
1
- import { t as GrButton_default } from "../../GrButton/chunks/GrButton-BlffdeJr.js";
2
- import { n as coreResponseErrorParsers, r as createResponseErrorClassifier, s as responseErrorParserPresets } from "../../GrResponseErrorBanner/chunks/GrResponseErrorBanner-Cdu9ekK9.js";
3
- import { t as GrConfirmDialog_default } from "../../GrConfirmDialog/chunks/GrConfirmDialog-BWYKCsHd.js";
4
- import { t as GrPromptDialog_default } from "../../GrPromptDialog/chunks/GrPromptDialog-TmWXbpEP.js";
5
- import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, getCurrentInstance, mergeProps, nextTick, onBeforeUnmount, openBlock, reactive, ref, render, shallowRef, toDisplayString, watch, withCtx } from "vue";
1
+ import { n as GR_CONFIG_KEY, s as useGrConfig } from "../../../chunks/context-DfWYCBB-.js";
2
+ import { t as GRANULARITY_I18N_KEY } from "../../../chunks/adapter-CAOxmn2G.js";
3
+ import { t as resolveGranularityI18n } from "../../../chunks/granularityI18n-SH0I--GW.js";
4
+ import { t as GrButton_default } from "../../GrButton/chunks/GrButton-DCi4CUpo.js";
5
+ import { n as coreResponseErrorParsers, r as createResponseErrorClassifier, s as responseErrorParserPresets } from "../../GrResponseErrorBanner/chunks/GrResponseErrorBanner-C8NGx8pE.js";
6
+ import { t as GrConfirmDialog_default } from "../../GrConfirmDialog/chunks/GrConfirmDialog-e4120mWw.js";
7
+ import { t as GrPromptDialog_default } from "../../GrPromptDialog/chunks/GrPromptDialog-DNUjRVB9.js";
8
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, getCurrentInstance, markRaw, mergeProps, nextTick, onBeforeUnmount, openBlock, provide, reactive, ref, render, shallowRef, toDisplayString, watch, withCtx } from "vue";
6
9
  //#region src/components/GrDialogService/store.ts
7
10
  /**
8
11
  * Модульный синглтон очереди диалогов: единый источник правды для всех
@@ -33,6 +36,20 @@ var GrDialogServiceHost_default = /* @__PURE__ */ defineComponent({
33
36
  * сервера через цепочку парсеров `GrResponseErrorBanner`.
34
37
  */
35
38
  const active = computed(() => dialogQueue[0] ?? null);
39
+ const EMPTY_DEFAULTS = Object.freeze({});
40
+ provide(GR_CONFIG_KEY, {
41
+ size: computed(() => active.value?.config?.size.value),
42
+ componentDefaults: computed(() => active.value?.config?.componentDefaults.value ?? EMPTY_DEFAULTS)
43
+ });
44
+ const hostI18n = resolveGranularityI18n();
45
+ provide(GRANULARITY_I18N_KEY, {
46
+ t: (key, params) => {
47
+ return (active.value?.i18n ?? hostI18n)?.t(key, params) ?? key;
48
+ },
49
+ get locale() {
50
+ return (active.value?.i18n ?? hostI18n)?.locale;
51
+ }
52
+ });
36
53
  const open = ref(false);
37
54
  const loading = ref(false);
38
55
  const currentError = shallowRef(null);
@@ -324,9 +341,10 @@ function teardownDialogService() {
324
341
  container = null;
325
342
  }
326
343
  mounted = false;
344
+ cachedAppContext = null;
327
345
  dialogQueue.splice(0, dialogQueue.length);
328
346
  }
329
- function enqueue(kind, message, options, onConfirm) {
347
+ function enqueue(kind, message, options, onConfirm, captured) {
330
348
  if (typeof window === "undefined" || typeof document === "undefined") throw new Error("[granularity] useDialogService is client-only and cannot be called during SSR (it mounts a host into document.body). Guard imperative dialog calls behind a client-side check.");
331
349
  ensureMounted(options.appContext ?? cachedAppContext);
332
350
  const id = makeDialogId();
@@ -343,7 +361,9 @@ function enqueue(kind, message, options, onConfirm) {
343
361
  message
344
362
  },
345
363
  onConfirm,
346
- resolve: resolveFn
364
+ resolve: resolveFn,
365
+ config: captured.config,
366
+ i18n: captured.i18n
347
367
  };
348
368
  dialogQueue.push(request);
349
369
  const close = () => {
@@ -388,20 +408,25 @@ function mergeErrorDefaults(defaults, options) {
388
408
  function useDialogService(defaults = {}) {
389
409
  const instance = getCurrentInstance();
390
410
  if (instance?.appContext && !cachedAppContext) cachedAppContext = instance.appContext;
411
+ const capturedI18n = instance ? resolveGranularityI18n() : null;
412
+ const captured = {
413
+ config: instance ? markRaw(useGrConfig()) : null,
414
+ i18n: capturedI18n ? markRaw(capturedI18n) : null
415
+ };
391
416
  function confirm(message, options = {}) {
392
- const { promise, close } = enqueue("confirm", message, mergeErrorDefaults(defaults, options), options.onConfirm);
417
+ const { promise, close } = enqueue("confirm", message, mergeErrorDefaults(defaults, options), options.onConfirm, captured);
393
418
  return withClose(promise.then((r) => r.action === "confirm"), close);
394
419
  }
395
420
  function alert(message, options = {}) {
396
- const { promise, close } = enqueue("alert", message, mergeErrorDefaults(defaults, options), options.onConfirm);
421
+ const { promise, close } = enqueue("alert", message, mergeErrorDefaults(defaults, options), options.onConfirm, captured);
397
422
  return withClose(promise.then(() => void 0), close);
398
423
  }
399
424
  function prompt(message, options = {}) {
400
- const { promise, close } = enqueue("prompt", message, mergeErrorDefaults(defaults, options), options.onConfirm);
425
+ const { promise, close } = enqueue("prompt", message, mergeErrorDefaults(defaults, options), options.onConfirm, captured);
401
426
  return withClose(promise.then((r) => r.action === "confirm" ? r.value ?? "" : null), close);
402
427
  }
403
428
  function open(kind, message, options = {}) {
404
- const { promise, close } = enqueue(kind, message, mergeErrorDefaults(defaults, options), options.onConfirm);
429
+ const { promise, close } = enqueue(kind, message, mergeErrorDefaults(defaults, options), options.onConfirm, captured);
405
430
  return withClose(promise, close);
406
431
  }
407
432
  function closeAll() {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrDialogService-CYXCTGm3.js","names":[],"sources":["../../../../src/components/GrDialogService/store.ts","../../../../src/components/GrDialogService/GrDialogServiceHost.vue","../../../../src/components/GrDialogService/GrDialogServiceHost.vue","../../../../src/components/GrDialogService/useDialogService.ts"],"sourcesContent":["import { reactive } from 'vue'\nimport type { Raw } from 'vue'\n\nimport type { GrConfigContext } from '../GrConfigProvider/context'\nimport type { GranularityI18nLike } from '../../internal/granularityI18n'\n\nimport type {\n DialogBaseOptions,\n DialogKind,\n DialogOnConfirm,\n DialogResult,\n} from './types'\n\n/**\n * Внутреннее описание одного запроса диалога в очереди. Создаётся методами\n * сервиса (`confirm`/`alert`/`prompt`/`open`) и потребляется хостом\n * (`GrDialogServiceHost`), который рендерит «голову» очереди (FIFO).\n */\nexport interface DialogRequest {\n id: string\n kind: DialogKind\n message: string\n options: DialogBaseOptions\n onConfirm?: DialogOnConfirm<any>\n /** Резолвит промис вызова детальным результатом `{ action, value }`. */\n resolve: (result: DialogResult<any>) => void\n /**\n * Конфиг и i18n, захваченные в месте вызова сервиса (в `setup`, где вызывающий\n * компонент ещё находится внутри дерева провайдера). Хост монтируется в\n * `document.body` вне дерева, поэтому сам их не увидит — см.\n * `SPEC-GrConfig-resolver.md`.\n *\n * Лежат в запросе, а не в модульной переменной: два поддерева с разными\n * провайдерами должны получать каждое свой конфиг.\n *\n * `Raw<…>` обязателен: очередь — `reactive`, а он разворачивает вложенные рефы.\n * Без `markRaw` контекст превратился бы в объект значений, `size.value` стало\n * бы `undefined`, и мост молча перестал бы работать.\n */\n config?: Raw<GrConfigContext> | null\n i18n?: Raw<GranularityI18nLike> | null\n}\n\n/**\n * Модульный синглтон очереди диалогов: единый источник правды для всех\n * вызовов сервиса. Хост-компонент рендерит только `queue[0]` — это\n * сериализует диалоги (FIFO) и исключает конкуренцию за фокус-трап.\n */\nexport const dialogQueue = reactive<DialogRequest[]>([])\n\nlet counter = 0\n\nexport function makeDialogId(): string {\n counter += 1\n return `gr-dialog-${Date.now()}-${counter}`\n}\n","<script setup lang=\"ts\">\n/**\n * GrDialogServiceHost — внутренний компонент-оркестратор императивного\n * `useDialogService`. Не предназначен для прямого использования в шаблонах.\n *\n * Рендерит «голову» очереди `dialogQueue` (FIFO-сериализация), переиспользуя\n * декларативные `GrConfirmDialog`/`GrPromptDialog`. Управляет состоянием\n * загрузки и ошибок во время async-`onConfirm`, прогоняя «сырые» ответы\n * сервера через цепочку парсеров `GrResponseErrorBanner`.\n */\nimport { computed, nextTick, onBeforeUnmount, provide, ref, shallowRef, watch } from 'vue'\n\nimport GrButton from '../GrButton/GrButton.vue'\nimport GrConfirmDialog from '../GrConfirmDialog/GrConfirmDialog.vue'\nimport GrPromptDialog from '../GrPromptDialog/GrPromptDialog.vue'\nimport {\n coreResponseErrorParsers,\n createResponseErrorClassifier,\n responseErrorParserPresets,\n} from '../GrResponseErrorBanner'\nimport type { ResponseErrorInfo } from '../GrResponseErrorBanner'\n\nimport { GR_CONFIG_KEY, type GrComponentDefaults, type GrConfigContext } from '../GrConfigProvider/context'\nimport { GRANULARITY_I18N_KEY } from '../../i18n/adapter'\nimport { resolveGranularityI18n } from '../../internal/granularityI18n'\n\nimport { dialogQueue } from './store'\nimport type { DialogRequest } from './store'\nimport type { DialogCloseAction, DialogConfirmContext } from './types'\n\nconst active = computed<DialogRequest | null>(() => dialogQueue[0] ?? null)\n\n// ————— Мост конфига и i18n.\n//\n// Хост рендерится через `render(vnode, container)` в `document.body`, то есть вне\n// дерева компонентов. Vue в этом случае берёт `provides` только из `appContext`,\n// куда попадает лишь `app.provide()` — значения от `<GrConfigProvider>` до сюда\n// не доходят. Поэтому вызов сервиса захватывает их в `setup` и кладёт в запрос, а\n// хост раздаёт вниз конфиг **активного** запроса.\n//\n// Раздаём производный контекст, а не захваченный объект: хост один на всё\n// приложение и живёт между вызовами, а запросы приходят из разных поддеревьев с\n// разными провайдерами. Реактивность при этом сохраняется — внутри лежат те же\n// рефы, что и у исходного провайдера.\nconst EMPTY_DEFAULTS: GrComponentDefaults = Object.freeze({})\n\nprovide<GrConfigContext>(GR_CONFIG_KEY, {\n size: computed(() => active.value?.config?.size.value),\n componentDefaults: computed(() => active.value?.config?.componentDefaults.value ?? EMPTY_DEFAULTS),\n})\n\n// i18n: тот же приём. Адаптер хоста (из `appContext`) остаётся запасным вариантом,\n// если вызов пришёл без захваченного — так установка через `app.use()` продолжает\n// работать как раньше.\nconst hostI18n = resolveGranularityI18n()\n\nprovide(GRANULARITY_I18N_KEY, {\n t: (key: string, params?: Record<string, unknown>) => {\n const adapter = active.value?.i18n ?? hostI18n\n // Вернуть сам ключ — принятый в пакете сигнал «перевода нет»: потребитель\n // подставит свой fallback-текст (см. `useGranularityTranslations`).\n return adapter?.t(key, params) ?? key\n },\n get locale() {\n return (active.value?.i18n ?? hostI18n)?.locale\n },\n})\n\nconst open = ref(false)\nconst loading = ref(false)\nconst currentError = shallowRef<ResponseErrorInfo | null>(null)\nconst fieldError = ref<string | null>(null)\nconst promptValue = ref('')\n\nlet controller: AbortController | null = null\nlet finishing = false\nlet externalAbortCleanup: (() => void) | null = null\n\nfunction resetState(): void {\n loading.value = false\n currentError.value = null\n fieldError.value = null\n finishing = false\n}\n\nfunction buildClassifier(req: DialogRequest) {\n const opts = req.options\n const parsers = typeof opts.errorParsers === 'function'\n ? opts.errorParsers(responseErrorParserPresets)\n : opts.errorParsers ?? coreResponseErrorParsers\n\n return createResponseErrorClassifier({\n parsers,\n texts: opts.errorTexts,\n messageKey: opts.errorMessageKey,\n })\n}\n\nwatch(\n () => active.value?.id,\n (id) => {\n cleanupExternalAbort()\n resetState()\n\n const req = active.value\n if (!req || !id) {\n open.value = false\n return\n }\n\n promptValue.value = req.options && 'value' in req.options\n ? ((req.options as { value?: string }).value ?? '')\n : ''\n\n controller = new AbortController()\n\n // Внешний AbortSignal закрывает диалог как `close`.\n const sig = req.options.signal\n if (sig) {\n if (sig.aborted) {\n finish('close')\n return\n }\n const onAbort = () => finish('close')\n sig.addEventListener('abort', onAbort)\n externalAbortCleanup = () => sig.removeEventListener('abort', onAbort)\n }\n\n void nextTick(() => {\n open.value = true\n })\n },\n)\n\nfunction cleanupExternalAbort(): void {\n externalAbortCleanup?.()\n externalAbortCleanup = null\n}\n\nfunction finish(action: DialogCloseAction, value?: unknown): void {\n const req = active.value\n if (!req || finishing) return\n finishing = true\n\n open.value = false\n controller?.abort()\n controller = null\n cleanupExternalAbort()\n\n req.resolve({ action, value })\n\n // Снимаем «голову» очереди на следующем тике — watch откроет следующий диалог.\n void nextTick(() => {\n const index = dialogQueue.findIndex(item => item.id === req.id)\n if (index >= 0) dialogQueue.splice(index, 1)\n })\n}\n\nfunction buildContext(req: DialogRequest, value: unknown): DialogConfirmContext<any> & { _errorSet: () => boolean } {\n let errorSet = false\n\n const setError = (message: string | null): void => {\n if (message == null) {\n currentError.value = null\n return\n }\n errorSet = true\n currentError.value = { kind: 'unknown', message, raw: message }\n }\n\n const setFieldError = (field: string, message: string | null): void => {\n if (message == null) {\n fieldError.value = null\n return\n }\n errorSet = true\n fieldError.value = message\n }\n\n const clearErrors = (): void => {\n currentError.value = null\n fieldError.value = null\n }\n\n const setRawError = async (raw: unknown, meta?: Record<string, unknown>): Promise<ResponseErrorInfo | null> => {\n const info = await buildClassifier(req)(raw, meta)\n if (req.kind === 'prompt' && info.fieldErrors?.length) {\n const match = info.fieldErrors.find(f => f.field === 'value') ?? info.fieldErrors[0]\n fieldError.value = match.messages.join(' ')\n }\n currentError.value = info\n errorSet = true\n return info\n }\n\n return {\n value,\n signal: controller!.signal,\n setError,\n setRawError,\n setFieldError,\n clearErrors,\n setLoading: (v: boolean) => { loading.value = v },\n close: (action: DialogCloseAction = 'close') => finish(action),\n _errorSet: () => errorSet,\n }\n}\n\nasync function handleConfirm(): Promise<void> {\n const req = active.value\n if (!req) return\n\n const value = req.kind === 'prompt' ? promptValue.value : undefined\n\n if (!req.onConfirm) {\n finish('confirm', value)\n return\n }\n\n currentError.value = null\n fieldError.value = null\n loading.value = true\n\n const ctx = buildContext(req, value)\n\n try {\n const result = await req.onConfirm(ctx)\n loading.value = false\n if (finishing) return // ctx.close уже завершил диалог\n if (result === false) return // оставить открытым без ошибки\n if (currentError.value || fieldError.value || ctx._errorSet()) return // есть ошибка — не закрывать\n finish('confirm', value)\n }\n catch (error) {\n loading.value = false\n if (finishing) return\n if (!ctx._errorSet()) await ctx.setRawError(error)\n // оставить диалог открытым с показанной ошибкой\n }\n}\n\nfunction handleCancel(): void {\n finish('cancel')\n}\n\nfunction handleModelUpdate(value: boolean): void {\n if (!value) finish('close')\n}\n\nonBeforeUnmount(() => {\n cleanupExternalAbort()\n controller?.abort()\n})\n\n// Прокидываемые в дочерний диалог общие пропы.\nconst sharedProps = computed(() => {\n const o = active.value?.options ?? {}\n return {\n title: o.title,\n size: o.size,\n closeOnBackdrop: o.closeOnBackdrop,\n closeOnEsc: o.closeOnEsc,\n showHeader: o.showHeader,\n showCloseButton: o.showCloseButton,\n headerConfig: o.headerConfig,\n footerConfig: o.footerConfig,\n bodyConfig: o.bodyConfig,\n closeLabel: o.closeLabel,\n buttonSize: o.buttonSize,\n confirmText: o.confirmText,\n confirmVariant: o.confirmVariant,\n confirmTone: o.confirmTone,\n }\n})\n</script>\n\n<template>\n <template v-if=\"active\">\n <!-- prompt -->\n <GrPromptDialog\n v-if=\"active.kind === 'prompt'\"\n v-bind=\"sharedProps\"\n v-model:value=\"promptValue\"\n :model-value=\"open\"\n :description=\"active.options.message ?? active.options.description\"\n :label=\"(active.options as any).label\"\n :placeholder=\"(active.options as any).placeholder\"\n :required=\"(active.options as any).required ?? false\"\n :required-error-text=\"(active.options as any).requiredErrorText\"\n :cancel-text=\"(active.options as any).cancelText\"\n :error=\"currentError\"\n :field-error=\"fieldError\"\n :confirm-loading=\"loading\"\n :close-on-confirm=\"false\"\n @update:model-value=\"handleModelUpdate\"\n @confirm=\"handleConfirm\"\n @cancel=\"handleCancel\"\n />\n\n <!-- alert: confirm-диалог без кнопки Cancel -->\n <GrConfirmDialog\n v-else-if=\"active.kind === 'alert'\"\n :model-value=\"open\"\n v-bind=\"sharedProps\"\n :description=\"active.options.message ?? active.options.description\"\n :error=\"currentError\"\n :confirm-loading=\"loading\"\n :close-on-confirm=\"false\"\n @update:model-value=\"handleModelUpdate\"\n @confirm=\"handleConfirm\"\n >\n <template #footer>\n <div class=\"flex items-center justify-end gap-3\">\n <GrButton\n data-testid=\"gr-alert-confirm\"\n :variant=\"sharedProps.confirmVariant ?? 'primary'\"\n :tone=\"sharedProps.confirmTone ?? 'primary'\"\n :size=\"sharedProps.buttonSize\"\n :loading=\"loading\"\n @click=\"handleConfirm\"\n >\n {{ sharedProps.confirmText ?? 'OK' }}\n </GrButton>\n </div>\n </template>\n </GrConfirmDialog>\n\n <!-- confirm -->\n <GrConfirmDialog\n v-else\n :model-value=\"open\"\n v-bind=\"sharedProps\"\n :description=\"active.options.message ?? active.options.description\"\n :cancel-text=\"(active.options as any).cancelText\"\n :error=\"currentError\"\n :confirm-loading=\"loading\"\n :close-on-confirm=\"false\"\n @update:model-value=\"handleModelUpdate\"\n @confirm=\"handleConfirm\"\n @cancel=\"handleCancel\"\n />\n </template>\n</template>\n","<script setup lang=\"ts\">\n/**\n * GrDialogServiceHost — внутренний компонент-оркестратор императивного\n * `useDialogService`. Не предназначен для прямого использования в шаблонах.\n *\n * Рендерит «голову» очереди `dialogQueue` (FIFO-сериализация), переиспользуя\n * декларативные `GrConfirmDialog`/`GrPromptDialog`. Управляет состоянием\n * загрузки и ошибок во время async-`onConfirm`, прогоняя «сырые» ответы\n * сервера через цепочку парсеров `GrResponseErrorBanner`.\n */\nimport { computed, nextTick, onBeforeUnmount, provide, ref, shallowRef, watch } from 'vue'\n\nimport GrButton from '../GrButton/GrButton.vue'\nimport GrConfirmDialog from '../GrConfirmDialog/GrConfirmDialog.vue'\nimport GrPromptDialog from '../GrPromptDialog/GrPromptDialog.vue'\nimport {\n coreResponseErrorParsers,\n createResponseErrorClassifier,\n responseErrorParserPresets,\n} from '../GrResponseErrorBanner'\nimport type { ResponseErrorInfo } from '../GrResponseErrorBanner'\n\nimport { GR_CONFIG_KEY, type GrComponentDefaults, type GrConfigContext } from '../GrConfigProvider/context'\nimport { GRANULARITY_I18N_KEY } from '../../i18n/adapter'\nimport { resolveGranularityI18n } from '../../internal/granularityI18n'\n\nimport { dialogQueue } from './store'\nimport type { DialogRequest } from './store'\nimport type { DialogCloseAction, DialogConfirmContext } from './types'\n\nconst active = computed<DialogRequest | null>(() => dialogQueue[0] ?? null)\n\n// ————— Мост конфига и i18n.\n//\n// Хост рендерится через `render(vnode, container)` в `document.body`, то есть вне\n// дерева компонентов. Vue в этом случае берёт `provides` только из `appContext`,\n// куда попадает лишь `app.provide()` — значения от `<GrConfigProvider>` до сюда\n// не доходят. Поэтому вызов сервиса захватывает их в `setup` и кладёт в запрос, а\n// хост раздаёт вниз конфиг **активного** запроса.\n//\n// Раздаём производный контекст, а не захваченный объект: хост один на всё\n// приложение и живёт между вызовами, а запросы приходят из разных поддеревьев с\n// разными провайдерами. Реактивность при этом сохраняется — внутри лежат те же\n// рефы, что и у исходного провайдера.\nconst EMPTY_DEFAULTS: GrComponentDefaults = Object.freeze({})\n\nprovide<GrConfigContext>(GR_CONFIG_KEY, {\n size: computed(() => active.value?.config?.size.value),\n componentDefaults: computed(() => active.value?.config?.componentDefaults.value ?? EMPTY_DEFAULTS),\n})\n\n// i18n: тот же приём. Адаптер хоста (из `appContext`) остаётся запасным вариантом,\n// если вызов пришёл без захваченного — так установка через `app.use()` продолжает\n// работать как раньше.\nconst hostI18n = resolveGranularityI18n()\n\nprovide(GRANULARITY_I18N_KEY, {\n t: (key: string, params?: Record<string, unknown>) => {\n const adapter = active.value?.i18n ?? hostI18n\n // Вернуть сам ключ — принятый в пакете сигнал «перевода нет»: потребитель\n // подставит свой fallback-текст (см. `useGranularityTranslations`).\n return adapter?.t(key, params) ?? key\n },\n get locale() {\n return (active.value?.i18n ?? hostI18n)?.locale\n },\n})\n\nconst open = ref(false)\nconst loading = ref(false)\nconst currentError = shallowRef<ResponseErrorInfo | null>(null)\nconst fieldError = ref<string | null>(null)\nconst promptValue = ref('')\n\nlet controller: AbortController | null = null\nlet finishing = false\nlet externalAbortCleanup: (() => void) | null = null\n\nfunction resetState(): void {\n loading.value = false\n currentError.value = null\n fieldError.value = null\n finishing = false\n}\n\nfunction buildClassifier(req: DialogRequest) {\n const opts = req.options\n const parsers = typeof opts.errorParsers === 'function'\n ? opts.errorParsers(responseErrorParserPresets)\n : opts.errorParsers ?? coreResponseErrorParsers\n\n return createResponseErrorClassifier({\n parsers,\n texts: opts.errorTexts,\n messageKey: opts.errorMessageKey,\n })\n}\n\nwatch(\n () => active.value?.id,\n (id) => {\n cleanupExternalAbort()\n resetState()\n\n const req = active.value\n if (!req || !id) {\n open.value = false\n return\n }\n\n promptValue.value = req.options && 'value' in req.options\n ? ((req.options as { value?: string }).value ?? '')\n : ''\n\n controller = new AbortController()\n\n // Внешний AbortSignal закрывает диалог как `close`.\n const sig = req.options.signal\n if (sig) {\n if (sig.aborted) {\n finish('close')\n return\n }\n const onAbort = () => finish('close')\n sig.addEventListener('abort', onAbort)\n externalAbortCleanup = () => sig.removeEventListener('abort', onAbort)\n }\n\n void nextTick(() => {\n open.value = true\n })\n },\n)\n\nfunction cleanupExternalAbort(): void {\n externalAbortCleanup?.()\n externalAbortCleanup = null\n}\n\nfunction finish(action: DialogCloseAction, value?: unknown): void {\n const req = active.value\n if (!req || finishing) return\n finishing = true\n\n open.value = false\n controller?.abort()\n controller = null\n cleanupExternalAbort()\n\n req.resolve({ action, value })\n\n // Снимаем «голову» очереди на следующем тике — watch откроет следующий диалог.\n void nextTick(() => {\n const index = dialogQueue.findIndex(item => item.id === req.id)\n if (index >= 0) dialogQueue.splice(index, 1)\n })\n}\n\nfunction buildContext(req: DialogRequest, value: unknown): DialogConfirmContext<any> & { _errorSet: () => boolean } {\n let errorSet = false\n\n const setError = (message: string | null): void => {\n if (message == null) {\n currentError.value = null\n return\n }\n errorSet = true\n currentError.value = { kind: 'unknown', message, raw: message }\n }\n\n const setFieldError = (field: string, message: string | null): void => {\n if (message == null) {\n fieldError.value = null\n return\n }\n errorSet = true\n fieldError.value = message\n }\n\n const clearErrors = (): void => {\n currentError.value = null\n fieldError.value = null\n }\n\n const setRawError = async (raw: unknown, meta?: Record<string, unknown>): Promise<ResponseErrorInfo | null> => {\n const info = await buildClassifier(req)(raw, meta)\n if (req.kind === 'prompt' && info.fieldErrors?.length) {\n const match = info.fieldErrors.find(f => f.field === 'value') ?? info.fieldErrors[0]\n fieldError.value = match.messages.join(' ')\n }\n currentError.value = info\n errorSet = true\n return info\n }\n\n return {\n value,\n signal: controller!.signal,\n setError,\n setRawError,\n setFieldError,\n clearErrors,\n setLoading: (v: boolean) => { loading.value = v },\n close: (action: DialogCloseAction = 'close') => finish(action),\n _errorSet: () => errorSet,\n }\n}\n\nasync function handleConfirm(): Promise<void> {\n const req = active.value\n if (!req) return\n\n const value = req.kind === 'prompt' ? promptValue.value : undefined\n\n if (!req.onConfirm) {\n finish('confirm', value)\n return\n }\n\n currentError.value = null\n fieldError.value = null\n loading.value = true\n\n const ctx = buildContext(req, value)\n\n try {\n const result = await req.onConfirm(ctx)\n loading.value = false\n if (finishing) return // ctx.close уже завершил диалог\n if (result === false) return // оставить открытым без ошибки\n if (currentError.value || fieldError.value || ctx._errorSet()) return // есть ошибка — не закрывать\n finish('confirm', value)\n }\n catch (error) {\n loading.value = false\n if (finishing) return\n if (!ctx._errorSet()) await ctx.setRawError(error)\n // оставить диалог открытым с показанной ошибкой\n }\n}\n\nfunction handleCancel(): void {\n finish('cancel')\n}\n\nfunction handleModelUpdate(value: boolean): void {\n if (!value) finish('close')\n}\n\nonBeforeUnmount(() => {\n cleanupExternalAbort()\n controller?.abort()\n})\n\n// Прокидываемые в дочерний диалог общие пропы.\nconst sharedProps = computed(() => {\n const o = active.value?.options ?? {}\n return {\n title: o.title,\n size: o.size,\n closeOnBackdrop: o.closeOnBackdrop,\n closeOnEsc: o.closeOnEsc,\n showHeader: o.showHeader,\n showCloseButton: o.showCloseButton,\n headerConfig: o.headerConfig,\n footerConfig: o.footerConfig,\n bodyConfig: o.bodyConfig,\n closeLabel: o.closeLabel,\n buttonSize: o.buttonSize,\n confirmText: o.confirmText,\n confirmVariant: o.confirmVariant,\n confirmTone: o.confirmTone,\n }\n})\n</script>\n\n<template>\n <template v-if=\"active\">\n <!-- prompt -->\n <GrPromptDialog\n v-if=\"active.kind === 'prompt'\"\n v-bind=\"sharedProps\"\n v-model:value=\"promptValue\"\n :model-value=\"open\"\n :description=\"active.options.message ?? active.options.description\"\n :label=\"(active.options as any).label\"\n :placeholder=\"(active.options as any).placeholder\"\n :required=\"(active.options as any).required ?? false\"\n :required-error-text=\"(active.options as any).requiredErrorText\"\n :cancel-text=\"(active.options as any).cancelText\"\n :error=\"currentError\"\n :field-error=\"fieldError\"\n :confirm-loading=\"loading\"\n :close-on-confirm=\"false\"\n @update:model-value=\"handleModelUpdate\"\n @confirm=\"handleConfirm\"\n @cancel=\"handleCancel\"\n />\n\n <!-- alert: confirm-диалог без кнопки Cancel -->\n <GrConfirmDialog\n v-else-if=\"active.kind === 'alert'\"\n :model-value=\"open\"\n v-bind=\"sharedProps\"\n :description=\"active.options.message ?? active.options.description\"\n :error=\"currentError\"\n :confirm-loading=\"loading\"\n :close-on-confirm=\"false\"\n @update:model-value=\"handleModelUpdate\"\n @confirm=\"handleConfirm\"\n >\n <template #footer>\n <div class=\"flex items-center justify-end gap-3\">\n <GrButton\n data-testid=\"gr-alert-confirm\"\n :variant=\"sharedProps.confirmVariant ?? 'primary'\"\n :tone=\"sharedProps.confirmTone ?? 'primary'\"\n :size=\"sharedProps.buttonSize\"\n :loading=\"loading\"\n @click=\"handleConfirm\"\n >\n {{ sharedProps.confirmText ?? 'OK' }}\n </GrButton>\n </div>\n </template>\n </GrConfirmDialog>\n\n <!-- confirm -->\n <GrConfirmDialog\n v-else\n :model-value=\"open\"\n v-bind=\"sharedProps\"\n :description=\"active.options.message ?? active.options.description\"\n :cancel-text=\"(active.options as any).cancelText\"\n :error=\"currentError\"\n :confirm-loading=\"loading\"\n :close-on-confirm=\"false\"\n @update:model-value=\"handleModelUpdate\"\n @confirm=\"handleConfirm\"\n @cancel=\"handleCancel\"\n />\n </template>\n</template>\n","import { createVNode, getCurrentInstance, markRaw, render } from 'vue'\nimport type { AppContext, Raw } from 'vue'\n\nimport GrDialogServiceHost from './GrDialogServiceHost.vue'\nimport { useGrConfig, type GrConfigContext } from '../GrConfigProvider/context'\nimport { resolveGranularityI18n, type GranularityI18nLike } from '../../internal/granularityI18n'\nimport { dialogQueue, makeDialogId } from './store'\nimport type { DialogRequest } from './store'\nimport type {\n DialogAlertOptions,\n DialogBaseOptions,\n DialogConfirmOptions,\n DialogKind,\n DialogOnConfirm,\n DialogPromise,\n DialogPromptOptions,\n DialogResult,\n DialogService,\n DialogServiceDefaults,\n} from './types'\n\n/**\n * `useDialogService` — императивный сервис диалогов (в духе Element Plus\n * `ElMessageBox`). Позволяет вызывать `confirm`/`alert`/`prompt` из `<script>`\n * или `.ts` без вставки компонента в шаблон.\n *\n * Поверх существующих `GrConfirmDialog`/`GrPromptDialog`: лениво монтирует\n * единый хост (`GrDialogServiceHost`) в `document.body`, наследуя контекст\n * приложения (i18n / тема / `granular-provider`). Диалоги сериализуются\n * очередью FIFO.\n */\n\nlet mounted = false\nlet container: HTMLElement | null = null\nlet cachedAppContext: AppContext | null = null\n\nfunction ensureMounted(appContext?: AppContext | null): void {\n if (typeof window === 'undefined' || typeof document === 'undefined') return\n\n if (appContext) cachedAppContext = appContext\n if (mounted) return\n\n container = document.createElement('div')\n container.setAttribute('data-gr-dialog-service-host', '')\n document.body.appendChild(container)\n\n const vnode = createVNode(GrDialogServiceHost)\n vnode.appContext = cachedAppContext ?? null\n render(vnode, container)\n mounted = true\n}\n\n/** Тестовая/служебная очистка смонтированного хоста. */\nexport function teardownDialogService(): void {\n if (container) {\n render(null, container)\n container.remove()\n container = null\n }\n mounted = false\n // Сбрасываем и кэш контекста приложения: без этого он переживает teardown и\n // протекает в следующее приложение (в тестах — в следующий тест), из-за чего\n // диалог может подхватить чужие provides и проверка соврёт.\n cachedAppContext = null\n dialogQueue.splice(0, dialogQueue.length)\n}\n\n/** Контекст, захваченный вызовом `useDialogService()` внутри `setup`. */\ntype CapturedContext = {\n config: Raw<GrConfigContext> | null\n i18n: Raw<GranularityI18nLike> | null\n}\n\nfunction enqueue(\n kind: DialogKind,\n message: string,\n options: DialogBaseOptions,\n onConfirm: DialogOnConfirm<any> | undefined,\n captured: CapturedContext,\n): { promise: Promise<DialogResult<any>>, close: () => void } {\n // Императивный сервис клиент-only: монтирует хост в `document.body`. В SSR\n // выполнять его нельзя — модульная очередь (`dialogQueue`) мутировалась бы на\n // сервере и текла между запросами. Явно запрещаем вместо тихого no-op.\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n throw new Error(\n '[granularity] useDialogService is client-only and cannot be called during SSR '\n + '(it mounts a host into document.body). Guard imperative dialog calls behind a client-side check.',\n )\n }\n\n ensureMounted(options.appContext ?? cachedAppContext)\n\n const id = makeDialogId()\n let resolveFn!: (result: DialogResult<any>) => void\n const promise = new Promise<DialogResult<any>>((resolve) => {\n resolveFn = resolve\n })\n\n const request: DialogRequest = {\n id,\n kind,\n message,\n options: { ...options, message },\n onConfirm,\n resolve: resolveFn,\n config: captured.config,\n i18n: captured.i18n,\n }\n\n dialogQueue.push(request)\n\n const close = (): void => {\n const index = dialogQueue.findIndex(item => item.id === id)\n if (index < 0) return\n dialogQueue.splice(index, 1)\n resolveFn({ action: 'close' })\n }\n\n return { promise, close }\n}\n\nfunction withClose<T>(promise: Promise<T>, close: () => void): DialogPromise<T> {\n const result = promise as DialogPromise<T>\n result.close = close\n return result\n}\n\nfunction mergeErrorDefaults(\n defaults: DialogServiceDefaults,\n options: DialogBaseOptions,\n): DialogBaseOptions {\n return {\n size: defaults.size,\n confirmText: defaults.confirmText,\n confirmVariant: defaults.confirmVariant,\n confirmTone: defaults.confirmTone,\n buttonSize: defaults.buttonSize,\n closeOnBackdrop: defaults.closeOnBackdrop,\n closeOnEsc: defaults.closeOnEsc,\n errorParsers: defaults.errorParsers,\n errorTexts: defaults.errorTexts,\n errorMessageKey: defaults.errorMessageKey,\n fieldLabels: defaults.fieldLabels,\n ...options,\n }\n}\n\n/**\n * Создаёт сервис диалогов. Опциональные `defaults` применяются ко всем\n * вызовам (можно переопределить в каждом конкретном вызове).\n *\n * Контекст приложения кэшируется автоматически при первом вызове внутри\n * `setup`. Для вызовов вне компонента используйте `setAppContext`.\n */\nexport function useDialogService(defaults: DialogServiceDefaults = {}): DialogService {\n // Авто-кэш appContext из текущего компонента (если вызвано в setup).\n const instance = getCurrentInstance()\n if (instance?.appContext && !cachedAppContext) {\n cachedAppContext = instance.appContext\n }\n\n // Конфиг и i18n захватываем здесь и только здесь: `inject` работает лишь в\n // `setup`, а хост монтируется вне дерева и сам до провайдера не дотянется.\n // Храним в замыкании сервиса, а не в модульной переменной, — иначе два\n // поддерева с разными провайдерами делили бы конфиг первого.\n // i18n захватываем не «на всякий случай»: дочерний `GrConfirmDialog` сам зовёт\n // `useGranularityTranslations()`, но его `inject` из хоста уходит в\n // `appContext.provides` — то есть видит только установку через `app.use()`.\n // Адаптер, переданный пропом `<GrConfigProvider i18n>`, живёт в дереве, и без\n // захвата диалог откатился бы на встроенные английские строки.\n //\n // `markRaw` — потому что дальше контекст ложится в `reactive`-очередь, а она\n // разворачивает вложенные рефы (см. комментарий в `store.ts`).\n const capturedI18n = instance ? resolveGranularityI18n() : null\n const captured: CapturedContext = {\n config: instance ? markRaw(useGrConfig()) : null,\n i18n: capturedI18n ? markRaw(capturedI18n) : null,\n }\n\n function confirm(message: string, options: DialogConfirmOptions = {}): DialogPromise<boolean> {\n const merged = mergeErrorDefaults(defaults, options)\n const { promise, close } = enqueue('confirm', message, merged, options.onConfirm, captured)\n return withClose(promise.then(r => r.action === 'confirm'), close)\n }\n\n function alert(message: string, options: DialogAlertOptions = {}): DialogPromise<void> {\n const merged = mergeErrorDefaults(defaults, options)\n const { promise, close } = enqueue('alert', message, merged, options.onConfirm, captured)\n return withClose(promise.then(() => undefined), close)\n }\n\n function prompt(message: string, options: DialogPromptOptions = {}): DialogPromise<string | null> {\n const merged = mergeErrorDefaults(defaults, options)\n const { promise, close } = enqueue('prompt', message, merged, options.onConfirm, captured)\n return withClose(\n promise.then(r => (r.action === 'confirm' ? ((r.value as string) ?? '') : null)),\n close,\n )\n }\n\n function open<V = unknown>(\n kind: DialogKind,\n message: string,\n options: DialogBaseOptions = {},\n ): DialogPromise<DialogResult<V>> {\n const merged = mergeErrorDefaults(defaults, options)\n const { promise, close } = enqueue(kind, message, merged, (options as DialogConfirmOptions).onConfirm, captured)\n return withClose(promise as Promise<DialogResult<V>>, close)\n }\n\n function closeAll(): void {\n while (dialogQueue.length > 0) {\n const request = dialogQueue.pop()!\n request.resolve({ action: 'close' })\n }\n }\n\n function setAppContext(ctx: AppContext | null): void {\n cachedAppContext = ctx\n }\n\n return { confirm, alert, prompt, open, closeAll, setAppContext }\n}\n\n/** Готовый синглтон-сервис с дефолтными настройками. */\nexport const dialogService: DialogService = useDialogService()\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { i as GrDialogServiceHost_default, n as teardownDialogService, r as useDialogService, t as dialogService } from "./chunks/GrDialogService-DY_fmaMu.js";
2
- import { t as grDialogServiceConfig } from "../../chunks/config-BX1JTrkV2.js";
1
+ import { i as GrDialogServiceHost_default, n as teardownDialogService, r as useDialogService, t as dialogService } from "./chunks/GrDialogService-CYXCTGm3.js";
2
+ import { t as grDialogServiceConfig } from "../../chunks/config-BX1JTrkV.js";
3
3
  export { GrDialogServiceHost_default as GrDialogServiceHost, dialogService, grDialogServiceConfig, teardownDialogService, useDialogService };
@@ -0,0 +1,54 @@
1
+ import { computed, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, defineComponent, openBlock, renderSlot, toDisplayString, useSlots } from "vue";
2
+ //#region src/components/GrDivider/GrDivider.vue?vue&type=script&setup=true&lang.ts
3
+ var _hoisted_1 = {
4
+ key: 0,
5
+ "data-gr-divider": "",
6
+ role: "separator",
7
+ "aria-orientation": "vertical",
8
+ class: "inline-block w-px self-stretch bg-[var(--gr-brd)]"
9
+ };
10
+ var _hoisted_2 = {
11
+ key: 1,
12
+ "data-gr-divider": "",
13
+ role: "separator",
14
+ "aria-orientation": "horizontal",
15
+ class: "flex w-full items-center gap-3 text-xs text-[var(--gr-muted-fg)]"
16
+ };
17
+ var _hoisted_3 = {
18
+ key: 0,
19
+ class: "h-px flex-1 bg-[var(--gr-brd)]"
20
+ };
21
+ var _hoisted_4 = { class: "shrink-0" };
22
+ var _hoisted_5 = {
23
+ key: 1,
24
+ class: "h-px flex-1 bg-[var(--gr-brd)]"
25
+ };
26
+ var _hoisted_6 = {
27
+ key: 2,
28
+ "data-gr-divider": "",
29
+ class: "h-px w-full border-0 bg-[var(--gr-brd)]"
30
+ };
31
+ //#endregion
32
+ //#region src/components/GrDivider/GrDivider.vue
33
+ var GrDivider_default = /* @__PURE__ */ defineComponent({
34
+ __name: "GrDivider",
35
+ props: {
36
+ orientation: { default: "horizontal" },
37
+ label: { default: void 0 },
38
+ align: { default: "center" }
39
+ },
40
+ setup(__props) {
41
+ const props = __props;
42
+ const slots = useSlots();
43
+ const hasLabel = computed(() => props.orientation === "horizontal" && (Boolean(props.label) || Boolean(slots.default)));
44
+ return (_ctx, _cache) => {
45
+ return __props.orientation === "vertical" ? (openBlock(), createElementBlock("div", _hoisted_1)) : hasLabel.value ? (openBlock(), createElementBlock("div", _hoisted_2, [
46
+ __props.align !== "start" ? (openBlock(), createElementBlock("span", _hoisted_3)) : createCommentVNode("", true),
47
+ createElementVNode("span", _hoisted_4, [renderSlot(_ctx.$slots, "default", {}, () => [createTextVNode(toDisplayString(__props.label), 1)])]),
48
+ __props.align !== "end" ? (openBlock(), createElementBlock("span", _hoisted_5)) : createCommentVNode("", true)
49
+ ])) : (openBlock(), createElementBlock("hr", _hoisted_6));
50
+ };
51
+ }
52
+ });
53
+ //#endregion
54
+ export { GrDivider_default as t };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrDivider-BdENZ1w0.js","names":[],"sources":["../../../../src/components/GrDivider/GrDivider.vue","../../../../src/components/GrDivider/GrDivider.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, useSlots } from 'vue'\n\n/**\n * GrDivider — разделитель контента.\n *\n * - `orientation=\"horizontal\"` (по умолчанию) — линия на всю ширину; с `label`\n * или default-слотом рисует текст по центру/краю между отрезками линии.\n * - `orientation=\"vertical\"` — тонкая вертикальная линия (для inline-разделения,\n * например в тулбарах).\n */\nexport type GrDividerOrientation = 'horizontal' | 'vertical'\nexport type GrDividerAlign = 'start' | 'center' | 'end'\n\nconst props = withDefaults(\n defineProps<{\n orientation?: GrDividerOrientation\n label?: string\n align?: GrDividerAlign\n }>(),\n {\n orientation: 'horizontal',\n label: undefined,\n align: 'center',\n },\n)\n\nconst slots = useSlots()\nconst hasLabel = computed(() =>\n props.orientation === 'horizontal' && (Boolean(props.label) || Boolean(slots.default)),\n)\n</script>\n\n<template>\n <div\n v-if=\"orientation === 'vertical'\"\n data-gr-divider\n role=\"separator\"\n aria-orientation=\"vertical\"\n class=\"inline-block w-px self-stretch bg-[var(--gr-brd)]\"\n />\n\n <div\n v-else-if=\"hasLabel\"\n data-gr-divider\n role=\"separator\"\n aria-orientation=\"horizontal\"\n class=\"flex w-full items-center gap-3 text-xs text-[var(--gr-muted-fg)]\"\n >\n <span v-if=\"align !== 'start'\" class=\"h-px flex-1 bg-[var(--gr-brd)]\" />\n <span class=\"shrink-0\"><slot>{{ label }}</slot></span>\n <span v-if=\"align !== 'end'\" class=\"h-px flex-1 bg-[var(--gr-brd)]\" />\n </div>\n\n <hr\n v-else\n data-gr-divider\n class=\"h-px w-full border-0 bg-[var(--gr-brd)]\"\n >\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useSlots } from 'vue'\n\n/**\n * GrDivider — разделитель контента.\n *\n * - `orientation=\"horizontal\"` (по умолчанию) — линия на всю ширину; с `label`\n * или default-слотом рисует текст по центру/краю между отрезками линии.\n * - `orientation=\"vertical\"` — тонкая вертикальная линия (для inline-разделения,\n * например в тулбарах).\n */\nexport type GrDividerOrientation = 'horizontal' | 'vertical'\nexport type GrDividerAlign = 'start' | 'center' | 'end'\n\nconst props = withDefaults(\n defineProps<{\n orientation?: GrDividerOrientation\n label?: string\n align?: GrDividerAlign\n }>(),\n {\n orientation: 'horizontal',\n label: undefined,\n align: 'center',\n },\n)\n\nconst slots = useSlots()\nconst hasLabel = computed(() =>\n props.orientation === 'horizontal' && (Boolean(props.label) || Boolean(slots.default)),\n)\n</script>\n\n<template>\n <div\n v-if=\"orientation === 'vertical'\"\n data-gr-divider\n role=\"separator\"\n aria-orientation=\"vertical\"\n class=\"inline-block w-px self-stretch bg-[var(--gr-brd)]\"\n />\n\n <div\n v-else-if=\"hasLabel\"\n data-gr-divider\n role=\"separator\"\n aria-orientation=\"horizontal\"\n class=\"flex w-full items-center gap-3 text-xs text-[var(--gr-muted-fg)]\"\n >\n <span v-if=\"align !== 'start'\" class=\"h-px flex-1 bg-[var(--gr-brd)]\" />\n <span class=\"shrink-0\"><slot>{{ label }}</slot></span>\n <span v-if=\"align !== 'end'\" class=\"h-px flex-1 bg-[var(--gr-brd)]\" />\n </div>\n\n <hr\n v-else\n data-gr-divider\n class=\"h-px w-full border-0 bg-[var(--gr-brd)]\"\n >\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAcA,MAAM,QAAQ;EAad,MAAM,QAAQ,SAAS;EACvB,MAAM,WAAW,eACf,MAAM,gBAAgB,iBAAiB,QAAQ,MAAM,KAAK,KAAK,QAAQ,MAAM,OAAO,EACtF;;UAKU,QAAA,gBAAW,cAAA,UAAA,GADnB,mBAME,OANF,UAME,KAGW,SAAA,SAAA,UAAA,GADb,mBAUM,OAVN,YAUM;IAHQ,QAAA,UAAK,WAAA,UAAA,GAAjB,mBAAwE,QAAxE,UAAwE,KAAA,mBAAA,IAAA,IAAA;IACxE,mBAAsD,QAAtD,YAAsD,CAA/B,WAAwB,KAAA,QAAA,WAAA,CAAA,SAAA,CAAA,gBAAA,gBAAf,QAAA,KAAK,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IACzB,QAAA,UAAK,SAAA,UAAA,GAAjB,mBAAsE,QAAtE,UAAsE,KAAA,mBAAA,IAAA,IAAA;uBAGxE,mBAIC,MAJD,UAIC"}
@@ -0,0 +1,3 @@
1
+ import { t as GrDivider_default } from "./chunks/GrDivider-BdENZ1w0.js";
2
+ import { t as grDividerConfig } from "../../chunks/config-BWiPnygb.js";
3
+ export { GrDivider_default as GrDivider, GrDivider_default as default, grDividerConfig };
@@ -1,15 +1,16 @@
1
1
  import { t as x_default } from "../../../chunks/x-2KXnqxiD.js";
2
- import { t as useGranularityTranslations } from "../../../chunks/granularityI18n-DoV7Ca2m.js";
3
- import { t as GrButton_default } from "../../GrButton/chunks/GrButton-BlffdeJr.js";
2
+ import { n as useGranularityTranslations } from "../../../chunks/granularityI18n-SH0I--GW.js";
3
+ import { t as GrButton_default } from "../../GrButton/chunks/GrButton-DCi4CUpo.js";
4
4
  import { t as GrIcon_default } from "../../GrIcon/chunks/GrIcon-D9AWQLk2.js";
5
- import { a as Ve, n as he, o as Ye, r as Ge, t as Se } from "../../../chunks/transition-TLFw4KBn.js";
6
- import { i as grDrawerPanelEnterFrom, r as grDrawerPanelClass } from "../../../chunks/config-DUcu1D68.js";
7
- import { Teleport, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, renderSlot, toDisplayString, unref, useId, withCtx } from "vue";
5
+ import { i as Ge, n as Se, o as Ve, r as he, s as Ye, t as useScrollLock } from "../../../chunks/useScrollLock-K7kaP2Ud.js";
6
+ import { n as removeGrModalEsc, t as pushGrModalEsc } from "../../../chunks/grModalEscStack-BXk-9mv7.js";
7
+ import { i as grDrawerPanelEnterFrom, r as grDrawerPanelClass } from "../../../chunks/config-BmNT0Fmx.js";
8
+ import { Teleport, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, onBeforeUnmount, openBlock, renderSlot, toDisplayString, unref, useId, watch, withCtx } from "vue";
8
9
  //#region src/components/GrDrawer/GrDrawer.vue?vue&type=script&setup=true&lang.ts
9
10
  var _hoisted_1 = { class: "fixed inset-0" };
10
11
  var _hoisted_2 = {
11
12
  "data-gr-drawer-header": "",
12
- class: "px-5 py-4 border-b border-[var(--brd)] flex items-center justify-between gap-4"
13
+ class: "px-5 py-4 border-b border-[var(--gr-brd)] flex items-center justify-between gap-4"
13
14
  };
14
15
  var _hoisted_3 = {
15
16
  "data-gr-drawer-body": "",
@@ -19,7 +20,7 @@ var _hoisted_4 = { class: "p-5" };
19
20
  var _hoisted_5 = {
20
21
  key: 0,
21
22
  "data-gr-drawer-footer": "",
22
- class: "px-5 py-4 border-t border-[var(--brd)]"
23
+ class: "px-5 py-4 border-t border-[var(--gr-brd)]"
23
24
  };
24
25
  //#endregion
25
26
  //#region src/components/GrDrawer/GrDrawer.vue
@@ -48,6 +49,7 @@ var GrDrawer_default = /* @__PURE__ */ defineComponent({
48
49
  const resolvedCloseLabel = computed(() => props.closeLabel ?? t("gr.common.close", "Close"));
49
50
  const emit = __emit;
50
51
  const titleId = useId();
52
+ const isClient = typeof window !== "undefined";
51
53
  const panelClass = computed(() => {
52
54
  return grDrawerPanelClass({
53
55
  side: props.side,
@@ -66,15 +68,38 @@ var GrDrawer_default = /* @__PURE__ */ defineComponent({
66
68
  if (!props.closeOnBackdrop) return;
67
69
  close();
68
70
  }
69
- function onKeydown(e) {
70
- if (e.key !== "Escape") return;
71
- if (!props.closeOnEsc) return;
72
- e.stopPropagation();
73
- e.preventDefault();
74
- close();
71
+ const { lock: lockBodyScroll, unlock: unlockBodyScroll } = useScrollLock();
72
+ let escEntryId = null;
73
+ function registerEsc() {
74
+ if (escEntryId !== null) return;
75
+ escEntryId = pushGrModalEsc({
76
+ shouldClose: () => props.closeOnEsc,
77
+ close
78
+ });
75
79
  }
80
+ function unregisterEsc() {
81
+ if (escEntryId === null) return;
82
+ removeGrModalEsc(escEntryId);
83
+ escEntryId = null;
84
+ }
85
+ watch(() => props.modelValue, (value) => {
86
+ if (value) {
87
+ lockBodyScroll();
88
+ registerEsc();
89
+ } else {
90
+ unlockBodyScroll();
91
+ unregisterEsc();
92
+ }
93
+ }, { immediate: true });
94
+ onBeforeUnmount(() => {
95
+ unlockBodyScroll();
96
+ unregisterEsc();
97
+ });
76
98
  return (_ctx, _cache) => {
77
- return openBlock(), createBlock(Teleport, { to: "body" }, [createVNode(unref(Se), {
99
+ return openBlock(), createBlock(Teleport, {
100
+ to: "body",
101
+ disabled: !isClient
102
+ }, [createVNode(unref(Se), {
78
103
  show: __props.modelValue,
79
104
  as: "template"
80
105
  }, {
@@ -84,8 +109,7 @@ var GrDrawer_default = /* @__PURE__ */ defineComponent({
84
109
  class: "fixed inset-0 z-50",
85
110
  static: true,
86
111
  "aria-labelledby": unref(titleId),
87
- onClose: onDialogClose,
88
- onKeydown
112
+ onClose: onDialogClose
89
113
  }, {
90
114
  default: withCtx(() => [createElementVNode("div", _hoisted_1, [createVNode(unref(he), {
91
115
  as: "template",
@@ -152,7 +176,7 @@ var GrDrawer_default = /* @__PURE__ */ defineComponent({
152
176
  _: 3
153
177
  }, 8, ["aria-labelledby"])]),
154
178
  _: 3
155
- }, 8, ["show"])]);
179
+ }, 8, ["show"])], 8, ["disabled"]);
156
180
  };
157
181
  }
158
182
  });
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrDrawer-KevdZ5BB.js","names":["$slots"],"sources":["../../../../src/components/GrDrawer/GrDrawer.vue","../../../../src/components/GrDrawer/GrDrawer.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, useId, watch } from 'vue'\nimport { Dialog, DialogPanel, DialogTitle, TransitionChild, TransitionRoot } from '@headlessui/vue'\n\nimport GrButton from '../GrButton/GrButton.vue'\nimport GrIcon from '../GrIcon/GrIcon.vue'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\n// Переиспользуем инфраструктуру оверлеев GrModal: общий Esc-стек (Esc закрывает\n// верхний оверлей независимо от дерева рендера) и reference-counted scroll-lock.\nimport { pushGrModalEsc, removeGrModalEsc } from '../GrModal/grModalEscStack'\nimport { useScrollLock } from '../../composables/internal/useScrollLock'\nimport {\n grDrawerPanelClass,\n grDrawerPanelEnterFrom,\n type GrDrawerSide,\n type GrDrawerSize,\n} from './grDrawerStyles'\n\nimport IconClose from '~icons/lucide/x'\n\nexport interface GrDrawerProps {\n /** Контроль открытия через v-model. */\n modelValue: boolean\n /** Заголовок; если передан — покажется в хедере. Можно переопределить слотом `#title`. */\n title?: string\n /** Закрывать при клике по бэкдропу / через HeadlessUI close. */\n closeOnBackdrop?: boolean\n /** Закрывать по Esc. */\n closeOnEsc?: boolean\n /** Сторона, с которой выезжает панель. */\n side?: GrDrawerSide\n /** Размер панели. */\n size?: GrDrawerSize\n /** i18n-friendly aria-label для кнопки закрытия. */\n closeLabel?: string\n}\n\nconst props = withDefaults(defineProps<GrDrawerProps>(), {\n title: undefined,\n closeOnBackdrop: true,\n closeOnEsc: true,\n side: 'right',\n size: 'md',\n closeLabel: undefined,\n})\n\nconst { t } = useGranularityTranslations()\nconst resolvedTitle = computed(() => props.title ?? t('gr.drawer.title', 'Drawer'))\nconst resolvedCloseLabel = computed(() => props.closeLabel ?? t('gr.common.close', 'Close'))\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: boolean): void\n}>()\n\nconst titleId = useId()\n\n// SSR-guard: на сервере `document.body` недоступен — отключаем teleport\n// (в клиенте включаем после маунта). Раньше `<teleport to=\"body\">` без\n// `:disabled` падал при SSR — расхождение с GrModal.\nconst isClient = typeof window !== 'undefined'\n\nconst panelClass = computed(() => {\n return grDrawerPanelClass({ side: props.side, size: props.size })\n})\n\nconst panelEnterFrom = computed(() => grDrawerPanelEnterFrom(props.side))\n\nfunction close(): void {\n emit('update:modelValue', false)\n}\n\nfunction onDialogClose(): void {\n if (!props.closeOnBackdrop) return\n close()\n}\n\nfunction onOverlayClick(): void {\n if (!props.closeOnBackdrop) return\n close()\n}\n\n// ————— Esc через общий стек оверлеев + scroll-lock, синхронно с открытием.\nconst { lock: lockBodyScroll, unlock: unlockBodyScroll } = useScrollLock()\n\nlet escEntryId: number | null = null\n\nfunction registerEsc(): void {\n if (escEntryId !== null) return\n escEntryId = pushGrModalEsc({\n shouldClose: () => props.closeOnEsc,\n close,\n })\n}\n\nfunction unregisterEsc(): void {\n if (escEntryId === null) return\n removeGrModalEsc(escEntryId)\n escEntryId = null\n}\n\nwatch(\n () => props.modelValue,\n (value) => {\n if (value) {\n lockBodyScroll()\n registerEsc()\n }\n else {\n unlockBodyScroll()\n unregisterEsc()\n }\n },\n { immediate: true },\n)\n\nonBeforeUnmount(() => {\n unlockBodyScroll()\n unregisterEsc()\n})\n</script>\n\n<template>\n <teleport to=\"body\" :disabled=\"!isClient\">\n <TransitionRoot :show=\"modelValue\" as=\"template\">\n <Dialog\n as=\"div\"\n data-gr-drawer\n class=\"fixed inset-0 z-50\"\n :static=\"true\"\n :aria-labelledby=\"titleId\"\n @close=\"onDialogClose\"\n >\n <div class=\"fixed inset-0\">\n <TransitionChild\n as=\"template\"\n enter=\"duration-200 ease-out\"\n enter-from=\"opacity-0\"\n enter-to=\"opacity-100\"\n leave=\"duration-150 ease-in\"\n leave-from=\"opacity-100\"\n leave-to=\"opacity-0\"\n >\n <div\n data-gr-drawer-overlay\n class=\"fixed inset-0 bg-black/40\"\n aria-hidden=\"true\"\n @click=\"onOverlayClick\"\n />\n </TransitionChild>\n\n <TransitionChild\n as=\"template\"\n enter=\"duration-200 ease-out\"\n :enter-from=\"panelEnterFrom\"\n enter-to=\"translate-x-0\"\n leave=\"duration-150 ease-in\"\n leave-from=\"translate-x-0\"\n :leave-to=\"panelEnterFrom\"\n >\n <DialogPanel\n data-gr-drawer-panel\n tabindex=\"-1\"\n class=\"fixed inset-y-0 flex flex-col\"\n :class=\"panelClass\"\n >\n <div\n data-gr-drawer-header\n class=\"px-5 py-4 border-b border-[var(--gr-brd)] flex items-center justify-between gap-4\"\n >\n <DialogTitle :id=\"titleId\" as=\"div\" data-gr-drawer-title class=\"text-[14px] font-700 min-w-0 truncate\">\n <slot name=\"title\">\n {{ resolvedTitle }}\n </slot>\n </DialogTitle>\n\n <GrButton\n variant=\"ghost\"\n size=\"sm\"\n square\n :aria-label=\"resolvedCloseLabel\"\n @click=\"close\"\n >\n <GrIcon size=\"sm\" aria-hidden=\"true\">\n <IconClose />\n </GrIcon>\n </GrButton>\n </div>\n\n <div data-gr-drawer-body class=\"flex-1 overflow-y-auto\">\n <div class=\"p-5\">\n <slot />\n </div>\n </div>\n\n <div\n v-if=\"$slots.footer\"\n data-gr-drawer-footer\n class=\"px-5 py-4 border-t border-[var(--gr-brd)]\"\n >\n <slot name=\"footer\" />\n </div>\n </DialogPanel>\n </TransitionChild>\n </div>\n </Dialog>\n </TransitionRoot>\n </teleport>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, useId, watch } from 'vue'\nimport { Dialog, DialogPanel, DialogTitle, TransitionChild, TransitionRoot } from '@headlessui/vue'\n\nimport GrButton from '../GrButton/GrButton.vue'\nimport GrIcon from '../GrIcon/GrIcon.vue'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\n// Переиспользуем инфраструктуру оверлеев GrModal: общий Esc-стек (Esc закрывает\n// верхний оверлей независимо от дерева рендера) и reference-counted scroll-lock.\nimport { pushGrModalEsc, removeGrModalEsc } from '../GrModal/grModalEscStack'\nimport { useScrollLock } from '../../composables/internal/useScrollLock'\nimport {\n grDrawerPanelClass,\n grDrawerPanelEnterFrom,\n type GrDrawerSide,\n type GrDrawerSize,\n} from './grDrawerStyles'\n\nimport IconClose from '~icons/lucide/x'\n\nexport interface GrDrawerProps {\n /** Контроль открытия через v-model. */\n modelValue: boolean\n /** Заголовок; если передан — покажется в хедере. Можно переопределить слотом `#title`. */\n title?: string\n /** Закрывать при клике по бэкдропу / через HeadlessUI close. */\n closeOnBackdrop?: boolean\n /** Закрывать по Esc. */\n closeOnEsc?: boolean\n /** Сторона, с которой выезжает панель. */\n side?: GrDrawerSide\n /** Размер панели. */\n size?: GrDrawerSize\n /** i18n-friendly aria-label для кнопки закрытия. */\n closeLabel?: string\n}\n\nconst props = withDefaults(defineProps<GrDrawerProps>(), {\n title: undefined,\n closeOnBackdrop: true,\n closeOnEsc: true,\n side: 'right',\n size: 'md',\n closeLabel: undefined,\n})\n\nconst { t } = useGranularityTranslations()\nconst resolvedTitle = computed(() => props.title ?? t('gr.drawer.title', 'Drawer'))\nconst resolvedCloseLabel = computed(() => props.closeLabel ?? t('gr.common.close', 'Close'))\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: boolean): void\n}>()\n\nconst titleId = useId()\n\n// SSR-guard: на сервере `document.body` недоступен — отключаем teleport\n// (в клиенте включаем после маунта). Раньше `<teleport to=\"body\">` без\n// `:disabled` падал при SSR — расхождение с GrModal.\nconst isClient = typeof window !== 'undefined'\n\nconst panelClass = computed(() => {\n return grDrawerPanelClass({ side: props.side, size: props.size })\n})\n\nconst panelEnterFrom = computed(() => grDrawerPanelEnterFrom(props.side))\n\nfunction close(): void {\n emit('update:modelValue', false)\n}\n\nfunction onDialogClose(): void {\n if (!props.closeOnBackdrop) return\n close()\n}\n\nfunction onOverlayClick(): void {\n if (!props.closeOnBackdrop) return\n close()\n}\n\n// ————— Esc через общий стек оверлеев + scroll-lock, синхронно с открытием.\nconst { lock: lockBodyScroll, unlock: unlockBodyScroll } = useScrollLock()\n\nlet escEntryId: number | null = null\n\nfunction registerEsc(): void {\n if (escEntryId !== null) return\n escEntryId = pushGrModalEsc({\n shouldClose: () => props.closeOnEsc,\n close,\n })\n}\n\nfunction unregisterEsc(): void {\n if (escEntryId === null) return\n removeGrModalEsc(escEntryId)\n escEntryId = null\n}\n\nwatch(\n () => props.modelValue,\n (value) => {\n if (value) {\n lockBodyScroll()\n registerEsc()\n }\n else {\n unlockBodyScroll()\n unregisterEsc()\n }\n },\n { immediate: true },\n)\n\nonBeforeUnmount(() => {\n unlockBodyScroll()\n unregisterEsc()\n})\n</script>\n\n<template>\n <teleport to=\"body\" :disabled=\"!isClient\">\n <TransitionRoot :show=\"modelValue\" as=\"template\">\n <Dialog\n as=\"div\"\n data-gr-drawer\n class=\"fixed inset-0 z-50\"\n :static=\"true\"\n :aria-labelledby=\"titleId\"\n @close=\"onDialogClose\"\n >\n <div class=\"fixed inset-0\">\n <TransitionChild\n as=\"template\"\n enter=\"duration-200 ease-out\"\n enter-from=\"opacity-0\"\n enter-to=\"opacity-100\"\n leave=\"duration-150 ease-in\"\n leave-from=\"opacity-100\"\n leave-to=\"opacity-0\"\n >\n <div\n data-gr-drawer-overlay\n class=\"fixed inset-0 bg-black/40\"\n aria-hidden=\"true\"\n @click=\"onOverlayClick\"\n />\n </TransitionChild>\n\n <TransitionChild\n as=\"template\"\n enter=\"duration-200 ease-out\"\n :enter-from=\"panelEnterFrom\"\n enter-to=\"translate-x-0\"\n leave=\"duration-150 ease-in\"\n leave-from=\"translate-x-0\"\n :leave-to=\"panelEnterFrom\"\n >\n <DialogPanel\n data-gr-drawer-panel\n tabindex=\"-1\"\n class=\"fixed inset-y-0 flex flex-col\"\n :class=\"panelClass\"\n >\n <div\n data-gr-drawer-header\n class=\"px-5 py-4 border-b border-[var(--gr-brd)] flex items-center justify-between gap-4\"\n >\n <DialogTitle :id=\"titleId\" as=\"div\" data-gr-drawer-title class=\"text-[14px] font-700 min-w-0 truncate\">\n <slot name=\"title\">\n {{ resolvedTitle }}\n </slot>\n </DialogTitle>\n\n <GrButton\n variant=\"ghost\"\n size=\"sm\"\n square\n :aria-label=\"resolvedCloseLabel\"\n @click=\"close\"\n >\n <GrIcon size=\"sm\" aria-hidden=\"true\">\n <IconClose />\n </GrIcon>\n </GrButton>\n </div>\n\n <div data-gr-drawer-body class=\"flex-1 overflow-y-auto\">\n <div class=\"p-5\">\n <slot />\n </div>\n </div>\n\n <div\n v-if=\"$slots.footer\"\n data-gr-drawer-footer\n class=\"px-5 py-4 border-t border-[var(--gr-brd)]\"\n >\n <slot name=\"footer\" />\n </div>\n </DialogPanel>\n </TransitionChild>\n </div>\n </Dialog>\n </TransitionRoot>\n </teleport>\n</template>\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { n as grDrawerSafelist, t as grDrawerConfig } from "../../chunks/config-DUcu1D68.js";
2
- import { t as GrDrawer_default } from "./chunks/GrDrawer-D1kzsjXN.js";
1
+ import { n as grDrawerSafelist, t as grDrawerConfig } from "../../chunks/config-BmNT0Fmx.js";
2
+ import { t as GrDrawer_default } from "./chunks/GrDrawer-KevdZ5BB.js";
3
3
  export { GrDrawer_default as GrDrawer, GrDrawer_default as default, grDrawerConfig, grDrawerSafelist };
@@ -1,10 +1,11 @@
1
1
  import { vClickOutside } from "../../../directives/clickOutside.js";
2
2
  import { t as useFloating } from "../../../chunks/useFloating-DtM6TyE4.js";
3
3
  import { t as useEscapeToClose } from "../../../chunks/useEscapeToClose-C2t_S1gh.js";
4
- import { n as grDropdownOriginClass, r as grDropdownWidthClass, t as grDropdownContentClass } from "../../../chunks/grDropdownStyles-B_-DKytw.js";
5
- import { Teleport, Transition, computed, createBlock, createElementBlock, createElementVNode, createVNode, defineComponent, normalizeClass, normalizeStyle, openBlock, ref, renderSlot, unref, vShow, watch, withCtx, withDirectives } from "vue";
4
+ import { n as grDropdownOriginClass, r as grDropdownWidthClass, t as grDropdownContentClass } from "../../../chunks/grDropdownStyles-HBPkghVr.js";
5
+ import { Teleport, Transition, computed, createBlock, createElementBlock, createElementVNode, createVNode, defineComponent, nextTick, normalizeClass, normalizeStyle, openBlock, ref, renderSlot, unref, useId, vShow, watch, withCtx, withDirectives } from "vue";
6
6
  //#region src/components/GrDropdown/GrDropdown.vue?vue&type=script&setup=true&lang.ts
7
7
  var _hoisted_1 = { "data-gr-dropdown": "" };
8
+ var _hoisted_2 = ["id"];
8
9
  //#endregion
9
10
  //#region src/components/GrDropdown/GrDropdown.vue
10
11
  var GrDropdown_default = /* @__PURE__ */ defineComponent({
@@ -25,6 +26,84 @@ var GrDropdown_default = /* @__PURE__ */ defineComponent({
25
26
  const rootEl = ref(null);
26
27
  const panelEl = ref(null);
27
28
  const clickOutsideExclude = [() => panelEl.value];
29
+ const panelId = useId();
30
+ let triggerFocusEl = null;
31
+ function panelItems() {
32
+ const root = panelEl.value;
33
+ if (!root) return [];
34
+ return Array.from(root.querySelectorAll("[role=\"menuitem\"], a[href], button:not([disabled]), [tabindex]:not([tabindex=\"-1\"])")).filter((el) => el.offsetParent !== null || el === document.activeElement);
35
+ }
36
+ function focusItemAt(index) {
37
+ const items = panelItems();
38
+ if (items.length === 0) return;
39
+ items[(index + items.length) % items.length]?.focus();
40
+ }
41
+ async function openWithFocus(first) {
42
+ triggerFocusEl = document.activeElement ?? null;
43
+ open.value = true;
44
+ await nextTick();
45
+ focusItemAt(first ? 0 : -1);
46
+ }
47
+ function returnFocusToTrigger() {
48
+ const target = triggerFocusEl;
49
+ triggerFocusEl = null;
50
+ target?.focus?.();
51
+ }
52
+ /**
53
+ * Пропсы для реального фокусируемого триггера (кнопки). Консьюмер биндит их на
54
+ * элемент внутри слота `#trigger`: `<button v-bind="triggerProps">`. Даёт
55
+ * `aria-haspopup`/`aria-expanded`/`aria-controls` и клавиатуру (Enter/Space/стрелки).
56
+ */
57
+ const triggerProps = computed(() => ({
58
+ "aria-haspopup": "menu",
59
+ "aria-expanded": open.value,
60
+ "aria-controls": open.value ? panelId : void 0,
61
+ "onKeydown": onTriggerKeydown
62
+ }));
63
+ function onTriggerKeydown(event) {
64
+ switch (event.key) {
65
+ case "Enter":
66
+ case " ":
67
+ case "ArrowDown":
68
+ event.preventDefault();
69
+ openWithFocus(true);
70
+ break;
71
+ case "ArrowUp":
72
+ event.preventDefault();
73
+ openWithFocus(false);
74
+ break;
75
+ case "Escape":
76
+ if (open.value) {
77
+ event.preventDefault();
78
+ close();
79
+ }
80
+ break;
81
+ }
82
+ }
83
+ function onPanelKeydown(event) {
84
+ const currentIndex = panelItems().indexOf(document.activeElement);
85
+ switch (event.key) {
86
+ case "ArrowDown":
87
+ event.preventDefault();
88
+ focusItemAt(currentIndex + 1);
89
+ break;
90
+ case "ArrowUp":
91
+ event.preventDefault();
92
+ focusItemAt(currentIndex - 1);
93
+ break;
94
+ case "Home":
95
+ event.preventDefault();
96
+ focusItemAt(0);
97
+ break;
98
+ case "End":
99
+ event.preventDefault();
100
+ focusItemAt(-1);
101
+ break;
102
+ case "Tab":
103
+ close();
104
+ break;
105
+ }
106
+ }
28
107
  const placementByAlign = {
29
108
  left: "bottom-start",
30
109
  right: "bottom-end",
@@ -38,7 +117,9 @@ var GrDropdown_default = /* @__PURE__ */ defineComponent({
38
117
  open.value = !open.value;
39
118
  }
40
119
  function close() {
120
+ const wasOpen = open.value;
41
121
  open.value = false;
122
+ if (wasOpen) returnFocusToTrigger();
42
123
  }
43
124
  useEscapeToClose(open, close);
44
125
  watch(() => props.align, () => {
@@ -62,7 +143,8 @@ var GrDropdown_default = /* @__PURE__ */ defineComponent({
62
143
  }, [renderSlot(_ctx.$slots, "trigger", {
63
144
  open: open.value,
64
145
  toggle,
65
- close
146
+ close,
147
+ triggerProps: triggerProps.value
66
148
  })])), [[unref(vClickOutside), {
67
149
  handler: close,
68
150
  enabled: open.value,
@@ -76,16 +158,20 @@ var GrDropdown_default = /* @__PURE__ */ defineComponent({
76
158
  "leave-to-class": "transform opacity-0 scale-95"
77
159
  }, {
78
160
  default: withCtx(() => [withDirectives(createElementVNode("div", {
161
+ id: unref(panelId),
79
162
  ref_key: "panelEl",
80
163
  ref: panelEl,
81
164
  "data-gr-dropdown-panel": "",
165
+ role: "menu",
166
+ tabindex: "-1",
82
167
  class: normalizeClass(panelClasses.value),
83
168
  style: normalizeStyle(unref(floatingStyle)),
84
- onClick: onContentClick
169
+ onClick: onContentClick,
170
+ onKeydown: onPanelKeydown
85
171
  }, [createElementVNode("div", {
86
172
  "data-gr-dropdown-content": "",
87
173
  class: normalizeClass(contentClasses.value)
88
- }, [renderSlot(_ctx.$slots, "content", { close })], 2)], 6), [[vShow, open.value]])]),
174
+ }, [renderSlot(_ctx.$slots, "content", { close })], 2)], 46, _hoisted_2), [[vShow, open.value]])]),
89
175
  _: 3
90
176
  })], 8, ["to"]))]);
91
177
  };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrDropdown-BKoy8hm-.js","names":[],"sources":["../../../../src/components/GrDropdown/GrDropdown.vue","../../../../src/components/GrDropdown/GrDropdown.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, nextTick, ref, useId, watch } from 'vue'\n\nimport { vClickOutside } from '../../directives'\nimport { useFloating } from '../../composables/internal/useFloating'\nimport { useEscapeToClose } from '../../composables/internal/useEscapeToClose'\nimport {\n grDropdownContentClass,\n grDropdownOriginClass,\n grDropdownWidthClass,\n type GrDropdownAlign,\n type GrDropdownWidth,\n} from './grDropdownStyles'\n\nexport interface GrDropdownProps {\n /** Выравнивание панели относительно триггера. */\n align?: GrDropdownAlign\n /** Ширина панели (tailwind-токены `w-*` или `auto`). */\n width?: GrDropdownWidth\n /** Закрывать панель по клику внутри content. */\n closeOnContentClick?: boolean\n /** Дополнительные классы контейнера content. */\n contentClass?: string\n /** Куда телепортировать панель (`body` по умолчанию). */\n teleportTo?: string | HTMLElement\n}\n\nconst props = withDefaults(defineProps<GrDropdownProps>(), {\n align: 'right',\n width: '48',\n closeOnContentClick: true,\n contentClass: '',\n teleportTo: 'body',\n})\n\nconst open = ref(false)\nconst rootEl = ref<HTMLElement | null>(null)\nconst panelEl = ref<HTMLElement | null>(null)\nconst clickOutsideExclude = [() => panelEl.value]\n\nconst panelId = useId()\n\n// Элемент триггера, которому вернём фокус при закрытии (клавиатурный сценарий).\nlet triggerFocusEl: HTMLElement | null = null\n\n// Фокусируемые пункты панели для клавиатурной навигации (roving-фокус).\nfunction panelItems(): HTMLElement[] {\n const root = panelEl.value\n if (!root)\n return []\n const selector = '[role=\"menuitem\"], a[href], button:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n return Array.from(root.querySelectorAll<HTMLElement>(selector)).filter(el => el.offsetParent !== null || el === document.activeElement)\n}\n\nfunction focusItemAt(index: number): void {\n const items = panelItems()\n if (items.length === 0)\n return\n const clamped = (index + items.length) % items.length\n items[clamped]?.focus()\n}\n\nasync function openWithFocus(first: boolean): Promise<void> {\n triggerFocusEl = (document.activeElement as HTMLElement) ?? null\n open.value = true\n await nextTick()\n focusItemAt(first ? 0 : -1)\n}\n\nfunction returnFocusToTrigger(): void {\n const target = triggerFocusEl\n triggerFocusEl = null\n target?.focus?.()\n}\n\n/**\n * Пропсы для реального фокусируемого триггера (кнопки). Консьюмер биндит их на\n * элемент внутри слота `#trigger`: `<button v-bind=\"triggerProps\">`. Даёт\n * `aria-haspopup`/`aria-expanded`/`aria-controls` и клавиатуру (Enter/Space/стрелки).\n */\nconst triggerProps = computed(() => ({\n 'aria-haspopup': 'menu' as const,\n 'aria-expanded': open.value,\n 'aria-controls': open.value ? panelId : undefined,\n 'onKeydown': onTriggerKeydown,\n}))\n\nfunction onTriggerKeydown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'Enter':\n case ' ':\n case 'ArrowDown':\n event.preventDefault()\n void openWithFocus(true)\n break\n case 'ArrowUp':\n event.preventDefault()\n void openWithFocus(false)\n break\n case 'Escape':\n if (open.value) {\n event.preventDefault()\n close()\n }\n break\n }\n}\n\nfunction onPanelKeydown(event: KeyboardEvent): void {\n const items = panelItems()\n const currentIndex = items.indexOf(document.activeElement as HTMLElement)\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n focusItemAt(currentIndex + 1)\n break\n case 'ArrowUp':\n event.preventDefault()\n focusItemAt(currentIndex - 1)\n break\n case 'Home':\n event.preventDefault()\n focusItemAt(0)\n break\n case 'End':\n event.preventDefault()\n focusItemAt(-1)\n break\n case 'Tab':\n close()\n break\n }\n}\n\n// `align='right'` — правый край панели совпадает с правым краем триггера (bottom-end);\n// `align='left'` — левые края (bottom-start); `align='center'` — floating-ui сам\n// центрирует панель под триггером при обычном `'bottom'` без суффикса.\nconst placementByAlign: Record<GrDropdownAlign, 'bottom-start' | 'bottom-end' | 'bottom'> = {\n left: 'bottom-start',\n right: 'bottom-end',\n center: 'bottom',\n}\n\nconst { floatingStyle, resolvedPlacement, update: updateFloatingPosition } = useFloating(\n rootEl,\n panelEl,\n open,\n {\n placement: () => placementByAlign[props.align],\n zIndexVar: '--gr-z-dropdown',\n },\n)\n\nfunction toggle(): void {\n open.value = !open.value\n}\n\nfunction close(): void {\n const wasOpen = open.value\n open.value = false\n // Возвращаем фокус на триггер только если панель была открыта с клавиатуры.\n if (wasOpen)\n returnFocusToTrigger()\n}\n\nuseEscapeToClose(open, close)\n\nwatch(\n () => props.align,\n () => {\n if (open.value) updateFloatingPosition()\n },\n)\n\nconst widthClass = computed(() => grDropdownWidthClass(props.width))\n\nconst contentClasses = computed(() => grDropdownContentClass(props.contentClass))\n\nconst panelClasses = computed(() => {\n return [widthClass.value, grDropdownOriginClass(resolvedPlacement.value)].filter(Boolean)\n})\n\nfunction onContentClick(): void {\n if (props.closeOnContentClick) {\n close()\n }\n}\n</script>\n\n<template>\n <div data-gr-dropdown>\n <div\n ref=\"rootEl\"\n v-click-outside=\"{ handler: close, enabled: open, exclude: clickOutsideExclude }\"\n data-gr-dropdown-trigger\n class=\"inline-block max-w-full\"\n @click=\"toggle\"\n >\n <slot name=\"trigger\" :open=\"open\" :toggle=\"toggle\" :close=\"close\" :triggerProps=\"triggerProps\" />\n </div>\n\n <teleport :to=\"teleportTo\">\n <transition\n enter-active-class=\"transition ease-out duration-150\"\n enter-from-class=\"transform opacity-0 scale-95\"\n enter-to-class=\"transform opacity-100 scale-100\"\n leave-active-class=\"transition ease-in duration-100\"\n leave-from-class=\"transform opacity-100 scale-100\"\n leave-to-class=\"transform opacity-0 scale-95\"\n >\n <div\n v-show=\"open\"\n :id=\"panelId\"\n ref=\"panelEl\"\n data-gr-dropdown-panel\n role=\"menu\"\n tabindex=\"-1\"\n :class=\"panelClasses\"\n :style=\"floatingStyle\"\n @click=\"onContentClick\"\n @keydown=\"onPanelKeydown\"\n >\n <div data-gr-dropdown-content :class=\"contentClasses\">\n <slot name=\"content\" :close=\"close\" />\n </div>\n </div>\n </transition>\n </teleport>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, ref, useId, watch } from 'vue'\n\nimport { vClickOutside } from '../../directives'\nimport { useFloating } from '../../composables/internal/useFloating'\nimport { useEscapeToClose } from '../../composables/internal/useEscapeToClose'\nimport {\n grDropdownContentClass,\n grDropdownOriginClass,\n grDropdownWidthClass,\n type GrDropdownAlign,\n type GrDropdownWidth,\n} from './grDropdownStyles'\n\nexport interface GrDropdownProps {\n /** Выравнивание панели относительно триггера. */\n align?: GrDropdownAlign\n /** Ширина панели (tailwind-токены `w-*` или `auto`). */\n width?: GrDropdownWidth\n /** Закрывать панель по клику внутри content. */\n closeOnContentClick?: boolean\n /** Дополнительные классы контейнера content. */\n contentClass?: string\n /** Куда телепортировать панель (`body` по умолчанию). */\n teleportTo?: string | HTMLElement\n}\n\nconst props = withDefaults(defineProps<GrDropdownProps>(), {\n align: 'right',\n width: '48',\n closeOnContentClick: true,\n contentClass: '',\n teleportTo: 'body',\n})\n\nconst open = ref(false)\nconst rootEl = ref<HTMLElement | null>(null)\nconst panelEl = ref<HTMLElement | null>(null)\nconst clickOutsideExclude = [() => panelEl.value]\n\nconst panelId = useId()\n\n// Элемент триггера, которому вернём фокус при закрытии (клавиатурный сценарий).\nlet triggerFocusEl: HTMLElement | null = null\n\n// Фокусируемые пункты панели для клавиатурной навигации (roving-фокус).\nfunction panelItems(): HTMLElement[] {\n const root = panelEl.value\n if (!root)\n return []\n const selector = '[role=\"menuitem\"], a[href], button:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n return Array.from(root.querySelectorAll<HTMLElement>(selector)).filter(el => el.offsetParent !== null || el === document.activeElement)\n}\n\nfunction focusItemAt(index: number): void {\n const items = panelItems()\n if (items.length === 0)\n return\n const clamped = (index + items.length) % items.length\n items[clamped]?.focus()\n}\n\nasync function openWithFocus(first: boolean): Promise<void> {\n triggerFocusEl = (document.activeElement as HTMLElement) ?? null\n open.value = true\n await nextTick()\n focusItemAt(first ? 0 : -1)\n}\n\nfunction returnFocusToTrigger(): void {\n const target = triggerFocusEl\n triggerFocusEl = null\n target?.focus?.()\n}\n\n/**\n * Пропсы для реального фокусируемого триггера (кнопки). Консьюмер биндит их на\n * элемент внутри слота `#trigger`: `<button v-bind=\"triggerProps\">`. Даёт\n * `aria-haspopup`/`aria-expanded`/`aria-controls` и клавиатуру (Enter/Space/стрелки).\n */\nconst triggerProps = computed(() => ({\n 'aria-haspopup': 'menu' as const,\n 'aria-expanded': open.value,\n 'aria-controls': open.value ? panelId : undefined,\n 'onKeydown': onTriggerKeydown,\n}))\n\nfunction onTriggerKeydown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'Enter':\n case ' ':\n case 'ArrowDown':\n event.preventDefault()\n void openWithFocus(true)\n break\n case 'ArrowUp':\n event.preventDefault()\n void openWithFocus(false)\n break\n case 'Escape':\n if (open.value) {\n event.preventDefault()\n close()\n }\n break\n }\n}\n\nfunction onPanelKeydown(event: KeyboardEvent): void {\n const items = panelItems()\n const currentIndex = items.indexOf(document.activeElement as HTMLElement)\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n focusItemAt(currentIndex + 1)\n break\n case 'ArrowUp':\n event.preventDefault()\n focusItemAt(currentIndex - 1)\n break\n case 'Home':\n event.preventDefault()\n focusItemAt(0)\n break\n case 'End':\n event.preventDefault()\n focusItemAt(-1)\n break\n case 'Tab':\n close()\n break\n }\n}\n\n// `align='right'` — правый край панели совпадает с правым краем триггера (bottom-end);\n// `align='left'` — левые края (bottom-start); `align='center'` — floating-ui сам\n// центрирует панель под триггером при обычном `'bottom'` без суффикса.\nconst placementByAlign: Record<GrDropdownAlign, 'bottom-start' | 'bottom-end' | 'bottom'> = {\n left: 'bottom-start',\n right: 'bottom-end',\n center: 'bottom',\n}\n\nconst { floatingStyle, resolvedPlacement, update: updateFloatingPosition } = useFloating(\n rootEl,\n panelEl,\n open,\n {\n placement: () => placementByAlign[props.align],\n zIndexVar: '--gr-z-dropdown',\n },\n)\n\nfunction toggle(): void {\n open.value = !open.value\n}\n\nfunction close(): void {\n const wasOpen = open.value\n open.value = false\n // Возвращаем фокус на триггер только если панель была открыта с клавиатуры.\n if (wasOpen)\n returnFocusToTrigger()\n}\n\nuseEscapeToClose(open, close)\n\nwatch(\n () => props.align,\n () => {\n if (open.value) updateFloatingPosition()\n },\n)\n\nconst widthClass = computed(() => grDropdownWidthClass(props.width))\n\nconst contentClasses = computed(() => grDropdownContentClass(props.contentClass))\n\nconst panelClasses = computed(() => {\n return [widthClass.value, grDropdownOriginClass(resolvedPlacement.value)].filter(Boolean)\n})\n\nfunction onContentClick(): void {\n if (props.closeOnContentClick) {\n close()\n }\n}\n</script>\n\n<template>\n <div data-gr-dropdown>\n <div\n ref=\"rootEl\"\n v-click-outside=\"{ handler: close, enabled: open, exclude: clickOutsideExclude }\"\n data-gr-dropdown-trigger\n class=\"inline-block max-w-full\"\n @click=\"toggle\"\n >\n <slot name=\"trigger\" :open=\"open\" :toggle=\"toggle\" :close=\"close\" :triggerProps=\"triggerProps\" />\n </div>\n\n <teleport :to=\"teleportTo\">\n <transition\n enter-active-class=\"transition ease-out duration-150\"\n enter-from-class=\"transform opacity-0 scale-95\"\n enter-to-class=\"transform opacity-100 scale-100\"\n leave-active-class=\"transition ease-in duration-100\"\n leave-from-class=\"transform opacity-100 scale-100\"\n leave-to-class=\"transform opacity-0 scale-95\"\n >\n <div\n v-show=\"open\"\n :id=\"panelId\"\n ref=\"panelEl\"\n data-gr-dropdown-panel\n role=\"menu\"\n tabindex=\"-1\"\n :class=\"panelClasses\"\n :style=\"floatingStyle\"\n @click=\"onContentClick\"\n @keydown=\"onPanelKeydown\"\n >\n <div data-gr-dropdown-content :class=\"contentClasses\">\n <slot name=\"content\" :close=\"close\" />\n </div>\n </div>\n </transition>\n </teleport>\n </div>\n</template>\n"],"mappings":"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"}