@feugene/granularity 0.12.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 (496) 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-1uSYl98Y2.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-BX1JTrkV.js.map +1 -0
  21. package/dist/chunks/config-BXtAmU3s.js.map +1 -0
  22. package/dist/chunks/config-BZFUM3Ky.js +75 -0
  23. package/dist/chunks/config-BZFUM3Ky.js.map +1 -0
  24. package/dist/chunks/{config-DUcu1D682.js → config-BmNT0Fmx.js} +2 -2
  25. package/dist/chunks/config-BmNT0Fmx.js.map +1 -0
  26. package/dist/chunks/{config-C49QUoJL.js → config-BvVq2gbd.js} +1 -1
  27. package/dist/chunks/{config-C49QUoJL.js.map → config-BvVq2gbd.js.map} +1 -1
  28. package/dist/chunks/{config-CrG1XiE72.js → config-C4hJxXDa.js} +5 -5
  29. package/dist/chunks/config-C4hJxXDa.js.map +1 -0
  30. package/dist/chunks/config-CB4RVt9M.js +66 -0
  31. package/dist/chunks/config-CB4RVt9M.js.map +1 -0
  32. package/dist/chunks/config-CGHLoBlH2.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-BIRO0vDJ.js → config-DPDFYzIa.js} +2 -2
  38. package/dist/chunks/config-DPDFYzIa.js.map +1 -0
  39. package/dist/chunks/{config-DnvPqu4g2.js → config-DRKXJ9PW2.js} +1 -1
  40. package/dist/chunks/{config-DnvPqu4g2.js.map → config-DRKXJ9PW2.js.map} +1 -1
  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-Dqy0rPPO2.js.map +1 -0
  48. package/dist/chunks/config-Droqn55j.js +8 -0
  49. package/dist/chunks/config-Droqn55j.js.map +1 -0
  50. package/dist/chunks/config-JpHA4Xx0.js.map +1 -0
  51. package/dist/chunks/{config-C4snOIXg.js → config-KXuionN3.js} +1 -1
  52. package/dist/chunks/{config-C4snOIXg.js.map → config-KXuionN3.js.map} +1 -1
  53. package/dist/chunks/{config-DezDih8_.js → config-LqDC_rvp.js} +2 -2
  54. package/dist/chunks/config-LqDC_rvp.js.map +1 -0
  55. package/dist/chunks/config-QaIc_gRa2.js.map +1 -0
  56. package/dist/chunks/config-U4m9PSql2.js.map +1 -0
  57. package/dist/chunks/{config-B7IIWGt_2.js → config-XmTv4pnI.js} +2 -2
  58. package/dist/chunks/config-XmTv4pnI.js.map +1 -0
  59. package/dist/chunks/config-eXB87DOi.js.map +1 -0
  60. package/dist/chunks/{config-C7NpDrfO.js → config-gZWR75Bh2.js} +1 -1
  61. package/dist/chunks/config-gZWR75Bh2.js.map +1 -0
  62. package/dist/chunks/config-ipvU0lzP.js.map +1 -0
  63. package/dist/chunks/config-xR4XVmcy2.js.map +1 -0
  64. package/dist/chunks/context-Bfrgsluh.js +9 -0
  65. package/dist/chunks/context-Bfrgsluh.js.map +1 -0
  66. package/dist/chunks/context-DfWYCBB-.js +129 -0
  67. package/dist/chunks/context-DfWYCBB-.js.map +1 -0
  68. package/dist/chunks/{en-CfkDa4GX.js → en-Cr6EkG8c.js} +46 -4
  69. package/dist/chunks/en-Cr6EkG8c.js.map +1 -0
  70. package/dist/chunks/{es-CgaLnFYx.js → es-DuYb1Qju.js} +3 -3
  71. package/dist/chunks/{es-CgaLnFYx.js.map → es-DuYb1Qju.js.map} +1 -1
  72. package/dist/chunks/{es-FkgECuCm.js → es-i08e9Sdo.js} +46 -4
  73. package/dist/chunks/es-i08e9Sdo.js.map +1 -0
  74. package/dist/chunks/{grBadgeStyles-DrycBuKT.js → grBadgeStyles-D3dFjr_N.js} +12 -12
  75. package/dist/chunks/grBadgeStyles-D3dFjr_N.js.map +1 -0
  76. package/dist/chunks/{grButtonStyles-C7Yga_Q1.js → grButtonStyles-DRBgDmOp.js} +28 -28
  77. package/dist/chunks/grButtonStyles-DRBgDmOp.js.map +1 -0
  78. package/dist/chunks/{grDropdownStyles-B_-DKytw.js → grDropdownStyles-HBPkghVr.js} +2 -2
  79. package/dist/chunks/{grDropdownStyles-B_-DKytw.js.map → grDropdownStyles-HBPkghVr.js.map} +1 -1
  80. package/dist/chunks/{grModalStyles-DWd3i05Q.js → grModalStyles-D8-shx9A.js} +1 -1
  81. package/dist/chunks/grModalStyles-D8-shx9A.js.map +1 -0
  82. package/dist/chunks/{grSelectStyles-CLK5hRd3.js → grSelectStyles-CwMUQrBZ.js} +12 -12
  83. package/dist/chunks/grSelectStyles-CwMUQrBZ.js.map +1 -0
  84. package/dist/chunks/{grStyle-Blc9otAx.js → grStyle-CdvxTXPH.js} +2 -2
  85. package/dist/chunks/grStyle-CdvxTXPH.js.map +1 -0
  86. package/dist/chunks/{granularityI18n-DoV7Ca2m.js → granularityI18n-SH0I--GW.js} +1 -1
  87. package/dist/chunks/{granularityI18n-DoV7Ca2m.js.map → granularityI18n-SH0I--GW.js.map} +1 -1
  88. package/dist/chunks/{ru-Bl8CxpEa.js → ru-B5XOOYZt.js} +46 -4
  89. package/dist/chunks/ru-B5XOOYZt.js.map +1 -0
  90. package/dist/chunks/{safelist-Do2RtzLB.js → safelist-BvO8HPnE.js} +1 -1
  91. package/dist/chunks/{safelist-Do2RtzLB.js.map → safelist-BvO8HPnE.js.map} +1 -1
  92. package/dist/chunks/shared-D-v9lit0.js +188 -0
  93. package/dist/chunks/shared-D-v9lit0.js.map +1 -0
  94. package/dist/components/GrAlert/chunks/GrAlert-B9gmpoPC.js +251 -0
  95. package/dist/components/GrAlert/chunks/GrAlert-B9gmpoPC.js.map +1 -0
  96. package/dist/components/GrAlert/index.js +2 -2
  97. package/dist/components/GrAutocomplete/chunks/GrAutocomplete-BVLoQ5tZ.js +499 -0
  98. package/dist/components/GrAutocomplete/chunks/GrAutocomplete-BVLoQ5tZ.js.map +1 -0
  99. package/dist/components/GrAutocomplete/index.js +3 -0
  100. package/dist/components/GrAvatar/chunks/{GrAvatar-96CpTCq5.js → GrAvatar-CTOUVBF7.js} +1 -1
  101. package/dist/components/GrAvatar/chunks/GrAvatar-CTOUVBF7.js.map +1 -0
  102. package/dist/components/GrAvatar/index.js +1 -1
  103. package/dist/components/GrBadge/chunks/{GrBadge-B77XlaqE.js → GrBadge-D1jefy4S.js} +12 -8
  104. package/dist/components/GrBadge/chunks/GrBadge-D1jefy4S.js.map +1 -0
  105. package/dist/components/GrBadge/index.js +2 -2
  106. package/dist/components/GrBadgeWrap/chunks/{GrBadgeWrap-CcktMOdg.js → GrBadgeWrap-DWDxHdiQ.js} +1 -1
  107. package/dist/components/GrBadgeWrap/chunks/GrBadgeWrap-DWDxHdiQ.js.map +1 -0
  108. package/dist/components/GrBadgeWrap/index.js +1 -1
  109. package/dist/components/GrBottomNav/chunks/{GrBottomNav-usuMgG8_.js → GrBottomNav-vSE4LXmk.js} +2 -2
  110. package/dist/components/GrBottomNav/chunks/GrBottomNav-vSE4LXmk.js.map +1 -0
  111. package/dist/components/GrBottomNav/index.js +1 -1
  112. package/dist/components/GrButton/chunks/{GrButton-BlffdeJr.js → GrButton-DCi4CUpo.js} +18 -14
  113. package/dist/components/GrButton/chunks/GrButton-DCi4CUpo.js.map +1 -0
  114. package/dist/components/GrButton/index.js +4 -4
  115. package/dist/components/GrCard/chunks/{GrCard-DUNMkuHW.js → GrCard-CxCjyHMb.js} +1 -1
  116. package/dist/components/GrCard/chunks/GrCard-CxCjyHMb.js.map +1 -0
  117. package/dist/components/GrCard/index.js +1 -1
  118. package/dist/components/GrCheckbox/chunks/{GrCheckbox-DJhzZZdO.js → GrCheckbox-BbIDRXtl.js} +5 -5
  119. package/dist/components/GrCheckbox/chunks/GrCheckbox-BbIDRXtl.js.map +1 -0
  120. package/dist/components/GrCheckbox/index.js +1 -1
  121. package/dist/components/GrCollapse/chunks/{GrCollapse-CPPLh_xU.js → GrCollapse-DApXztn8.js} +6 -6
  122. package/dist/components/GrCollapse/chunks/GrCollapse-DApXztn8.js.map +1 -0
  123. package/dist/components/GrCollapse/index.js +2 -2
  124. package/dist/components/GrCommandPalette/chunks/GrCommandPalette-6OyvNbek.js +410 -0
  125. package/dist/components/GrCommandPalette/chunks/GrCommandPalette-6OyvNbek.js.map +1 -0
  126. package/dist/components/GrCommandPalette/index.js +3 -0
  127. package/dist/components/GrConfigProvider/chunks/GrConfigProvider-BtyeBGm8.js +57 -0
  128. package/dist/components/GrConfigProvider/chunks/GrConfigProvider-BtyeBGm8.js.map +1 -0
  129. package/dist/components/GrConfigProvider/index.js +4 -0
  130. package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-D8CkOtqv.js → GrConfirmDialog-e4120mWw.js} +5 -5
  131. package/dist/components/GrConfirmDialog/chunks/GrConfirmDialog-e4120mWw.js.map +1 -0
  132. package/dist/components/GrConfirmDialog/index.js +2 -2
  133. package/dist/components/GrDataTable/chunks/{GrDataTable-Ds5OeGat.js → GrDataTable-C1CzxV0p.js} +127 -25
  134. package/dist/components/GrDataTable/chunks/GrDataTable-C1CzxV0p.js.map +1 -0
  135. package/dist/components/GrDataTable/index.js +2 -2
  136. package/dist/components/GrDialog/chunks/{GrDialog-Ctucxju9.js → GrDialog-BPMvDHOz.js} +5 -5
  137. package/dist/components/GrDialog/chunks/GrDialog-BPMvDHOz.js.map +1 -0
  138. package/dist/components/GrDialog/index.js +1 -1
  139. package/dist/components/GrDialogService/chunks/{GrDialogService-CU1Fbonc.js → GrDialogService-CYXCTGm3.js} +36 -11
  140. package/dist/components/GrDialogService/chunks/GrDialogService-CYXCTGm3.js.map +1 -0
  141. package/dist/components/GrDialogService/index.js +2 -2
  142. package/dist/components/GrDivider/chunks/{GrDivider-5bcE-BB4.js → GrDivider-BdENZ1w0.js} +5 -5
  143. package/dist/components/GrDivider/chunks/GrDivider-BdENZ1w0.js.map +1 -0
  144. package/dist/components/GrDivider/index.js +1 -1
  145. package/dist/components/GrDrawer/chunks/{GrDrawer-SLGKCY2A.js → GrDrawer-KevdZ5BB.js} +5 -5
  146. package/dist/components/GrDrawer/chunks/GrDrawer-KevdZ5BB.js.map +1 -0
  147. package/dist/components/GrDrawer/index.js +2 -2
  148. package/dist/components/GrDropdown/chunks/{GrDropdown-BnDMYP8v.js → GrDropdown-BKoy8hm-.js} +1 -1
  149. package/dist/components/GrDropdown/chunks/{GrDropdown-BnDMYP8v.js.map → GrDropdown-BKoy8hm-.js.map} +1 -1
  150. package/dist/components/GrDropdown/index.js +2 -2
  151. package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu--g9Vofcq.js → GrDropdownMenu-zCatXzmt.js} +11 -11
  152. package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu-zCatXzmt.js.map +1 -0
  153. package/dist/components/GrDropdownMenu/index.js +1 -1
  154. package/dist/components/GrEmptyState/chunks/{GrEmptyState-CA3BiTV7.js → GrEmptyState-CNb0BzjG.js} +3 -3
  155. package/dist/components/GrEmptyState/chunks/GrEmptyState-CNb0BzjG.js.map +1 -0
  156. package/dist/components/GrEmptyState/index.js +1 -1
  157. package/dist/components/GrFileUpload/chunks/{GrFileUpload-DvWPpiJS.js → GrFileUpload-CnLgUGDF.js} +12 -12
  158. package/dist/components/GrFileUpload/chunks/GrFileUpload-CnLgUGDF.js.map +1 -0
  159. package/dist/components/GrFileUpload/index.js +1 -1
  160. package/dist/components/GrForm/chunks/GrForm-CdaFjcyl.js +234 -0
  161. package/dist/components/GrForm/chunks/GrForm-CdaFjcyl.js.map +1 -0
  162. package/dist/components/GrForm/index.js +4 -0
  163. package/dist/components/GrFormField/chunks/{GrFormField-DnfMHx_U.js → GrFormField-CXCDBd99.js} +41 -14
  164. package/dist/components/GrFormField/chunks/GrFormField-CXCDBd99.js.map +1 -0
  165. package/dist/components/GrFormField/index.js +1 -1
  166. package/dist/components/GrFormFile/chunks/{GrFormFile-CXcqqdvV.js → GrFormFile-CqacSbUl.js} +9 -9
  167. package/dist/components/GrFormFile/chunks/GrFormFile-CqacSbUl.js.map +1 -0
  168. package/dist/components/GrFormFile/index.js +1 -1
  169. package/dist/components/GrFormSection/chunks/{GrFormSection-Ce21jcgo.js → GrFormSection-C3w9DQJf.js} +1 -1
  170. package/dist/components/GrFormSection/chunks/GrFormSection-C3w9DQJf.js.map +1 -0
  171. package/dist/components/GrFormSection/index.js +1 -1
  172. package/dist/components/GrImageViewer/chunks/{GrImageViewer-Dla9IBkd.js → GrImageViewer-DDLJkvIU.js} +1 -1
  173. package/dist/components/GrImageViewer/chunks/{GrImageViewer-Dla9IBkd.js.map → GrImageViewer-DDLJkvIU.js.map} +1 -1
  174. package/dist/components/GrImageViewer/index.js +1 -1
  175. package/dist/components/GrInput/chunks/{GrInput-B8dd3JaA.js → GrInput-C1VBL0dg.js} +18 -15
  176. package/dist/components/GrInput/chunks/GrInput-C1VBL0dg.js.map +1 -0
  177. package/dist/components/GrInput/index.js +2 -2
  178. package/dist/components/GrInputTag/chunks/{GrInputTag-zMgFqp2g.js → GrInputTag-BMk9jm42.js} +6 -6
  179. package/dist/components/GrInputTag/chunks/GrInputTag-BMk9jm42.js.map +1 -0
  180. package/dist/components/GrInputTag/index.js +2 -2
  181. package/dist/components/GrKbd/chunks/{GrKbd-BEoYxWhE.js → GrKbd-DTspwtoN.js} +1 -1
  182. package/dist/components/GrKbd/chunks/GrKbd-DTspwtoN.js.map +1 -0
  183. package/dist/components/GrKbd/index.js +1 -1
  184. package/dist/components/GrLink/chunks/{GrLink-CYUe-Q8k.js → GrLink-BP0YrnL9.js} +1 -1
  185. package/dist/components/GrLink/chunks/{GrLink-CYUe-Q8k.js.map → GrLink-BP0YrnL9.js.map} +1 -1
  186. package/dist/components/GrLink/index.js +2 -2
  187. package/dist/components/GrList/chunks/{GrList-Dx772Ns4.js → GrList-5RA-tZzE.js} +3 -3
  188. package/dist/components/GrList/chunks/GrList-5RA-tZzE.js.map +1 -0
  189. package/dist/components/GrList/index.js +1 -1
  190. package/dist/components/GrLoading/chunks/{GrLoading--X_7rdbb.js → GrLoading-fRDtVfi7.js} +3 -3
  191. package/dist/components/GrLoading/chunks/GrLoading-fRDtVfi7.js.map +1 -0
  192. package/dist/components/GrLoading/index.js +2 -2
  193. package/dist/components/GrModal/chunks/{GrModal-C0GZrHN3.js → GrModal-BTu1-5eY.js} +1 -1
  194. package/dist/components/GrModal/chunks/{GrModal-C0GZrHN3.js.map → GrModal-BTu1-5eY.js.map} +1 -1
  195. package/dist/components/GrModal/index.js +3 -3
  196. package/dist/components/GrNavbar/chunks/{GrNavbar-DW3MiIIf.js → GrNavbar-keKT_mIM.js} +3 -3
  197. package/dist/components/GrNavbar/chunks/GrNavbar-keKT_mIM.js.map +1 -0
  198. package/dist/components/GrNavbar/index.js +1 -1
  199. package/dist/components/GrNumberInput/chunks/{GrNumberInput-DxCEvL7V.js → GrNumberInput-l9ZOHG9D.js} +19 -17
  200. package/dist/components/GrNumberInput/chunks/GrNumberInput-l9ZOHG9D.js.map +1 -0
  201. package/dist/components/GrNumberInput/index.js +2 -2
  202. package/dist/components/GrPagination/chunks/{GrPagination-mlyfLjQY.js → GrPagination-C5Y69CuK.js} +59 -16
  203. package/dist/components/GrPagination/chunks/GrPagination-C5Y69CuK.js.map +1 -0
  204. package/dist/components/GrPagination/index.js +2 -2
  205. package/dist/components/GrProgressBar/chunks/{GrProgressBar-CC3z-Zqp.js → GrProgressBar-Dqg4Fj9S.js} +2 -2
  206. package/dist/components/GrProgressBar/chunks/GrProgressBar-Dqg4Fj9S.js.map +1 -0
  207. package/dist/components/GrProgressBar/index.js +2 -2
  208. package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-C-_BMNuY.js → GrPromptDialog-DNUjRVB9.js} +7 -7
  209. package/dist/components/GrPromptDialog/chunks/GrPromptDialog-DNUjRVB9.js.map +1 -0
  210. package/dist/components/GrPromptDialog/index.js +2 -2
  211. package/dist/components/GrRadio/chunks/{GrRadio-Dr-pvs_9.js → GrRadio-DlhxPGqf.js} +5 -7
  212. package/dist/components/GrRadio/chunks/GrRadio-DlhxPGqf.js.map +1 -0
  213. package/dist/components/GrRadio/index.js +2 -2
  214. package/dist/components/GrRadioGroup/chunks/{GrRadioGroup-nOdvfV_g.js → GrRadioGroup-BXt9iw4q.js} +7 -5
  215. package/dist/components/GrRadioGroup/chunks/GrRadioGroup-BXt9iw4q.js.map +1 -0
  216. package/dist/components/GrRadioGroup/index.js +2 -2
  217. package/dist/components/GrRating/chunks/GrRating-Co-3Rk4h.js +241 -0
  218. package/dist/components/GrRating/chunks/GrRating-Co-3Rk4h.js.map +1 -0
  219. package/dist/components/GrRating/index.js +3 -0
  220. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-BWJNe2gr.js → GrResponseErrorBanner-2CvM7Z08.js} +2 -2
  221. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-BWJNe2gr.js.map → GrResponseErrorBanner-2CvM7Z08.js.map} +1 -1
  222. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-Cdu9ekK9.js → GrResponseErrorBanner-C8NGx8pE.js} +3 -3
  223. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-Cdu9ekK9.js.map → GrResponseErrorBanner-C8NGx8pE.js.map} +1 -1
  224. package/dist/components/GrResponseErrorBanner/index.js +2 -2
  225. package/dist/components/GrSegmented/chunks/{GrSegmented-C1y0UXpQ.js → GrSegmented-CTd3n4PA.js} +14 -11
  226. package/dist/components/GrSegmented/chunks/GrSegmented-CTd3n4PA.js.map +1 -0
  227. package/dist/components/GrSegmented/index.js +2 -2
  228. package/dist/components/GrSelect/chunks/{GrSelect-BVCmitqa.js → GrSelect-Dn3FgJ3Z.js} +161 -75
  229. package/dist/components/GrSelect/chunks/GrSelect-Dn3FgJ3Z.js.map +1 -0
  230. package/dist/components/GrSelect/index.js +2 -2
  231. package/dist/components/GrSidebar/chunks/{GrSidebar-DkWozzwA.js → GrSidebar-cvnzBfj3.js} +7 -7
  232. package/dist/components/GrSidebar/chunks/GrSidebar-cvnzBfj3.js.map +1 -0
  233. package/dist/components/GrSidebar/index.js +2 -2
  234. package/dist/components/GrSkeleton/chunks/{GrSkeleton-DsN-_CDZ.js → GrSkeleton-BucA5F4J.js} +1 -1
  235. package/dist/components/GrSkeleton/chunks/GrSkeleton-BucA5F4J.js.map +1 -0
  236. package/dist/components/GrSkeleton/index.js +2 -2
  237. package/dist/components/GrSlider/chunks/GrSlider-CzzJ3bD-.js +286 -0
  238. package/dist/components/GrSlider/chunks/GrSlider-CzzJ3bD-.js.map +1 -0
  239. package/dist/components/GrSlider/index.js +3 -0
  240. package/dist/components/GrStatistic/chunks/GrStatistic-gHiAwrX5.js +128 -0
  241. package/dist/components/GrStatistic/chunks/GrStatistic-gHiAwrX5.js.map +1 -0
  242. package/dist/components/GrStatistic/index.js +3 -0
  243. package/dist/components/GrSwitch/chunks/{GrSwitch-DAioyccZ.js → GrSwitch-CJdRvS0s.js} +16 -7
  244. package/dist/components/GrSwitch/chunks/GrSwitch-CJdRvS0s.js.map +1 -0
  245. package/dist/components/GrSwitch/index.js +2 -2
  246. package/dist/components/GrTabPanels/chunks/{GrTabPanels-DbKybwe-.js → GrTabPanels-DeEMgb_y.js} +1 -1
  247. package/dist/components/GrTabPanels/chunks/{GrTabPanels-DbKybwe-.js.map → GrTabPanels-DeEMgb_y.js.map} +1 -1
  248. package/dist/components/GrTabPanels/index.js +2 -2
  249. package/dist/components/GrTable/chunks/{GrTable-Db3hRnKA.js → GrTable-sNvsA8wa.js} +24 -11
  250. package/dist/components/GrTable/chunks/GrTable-sNvsA8wa.js.map +1 -0
  251. package/dist/components/GrTable/index.js +2 -2
  252. package/dist/components/GrTabs/chunks/{GrTabs-DsLwWoRz.js → GrTabs-BqTak0SR.js} +3 -3
  253. package/dist/components/GrTabs/chunks/GrTabs-BqTak0SR.js.map +1 -0
  254. package/dist/components/GrTabs/index.js +2 -2
  255. package/dist/components/GrTextarea/chunks/{GrTextarea-CKukGlNl.js → GrTextarea-DIYBAPpP.js} +2 -2
  256. package/dist/components/GrTextarea/chunks/GrTextarea-DIYBAPpP.js.map +1 -0
  257. package/dist/components/GrTextarea/index.js +2 -2
  258. package/dist/components/GrToaster/chunks/{GrToaster-L2cu6cSR.js → GrToaster-BVHjIHcM.js} +51 -10
  259. package/dist/components/GrToaster/chunks/GrToaster-BVHjIHcM.js.map +1 -0
  260. package/dist/components/GrToaster/index.js +1 -1
  261. package/dist/components/GrTooltip/chunks/{GrTooltip-BeyZ8ssR.js → GrTooltip-BMKH2lIx.js} +3 -3
  262. package/dist/components/GrTooltip/chunks/GrTooltip-BMKH2lIx.js.map +1 -0
  263. package/dist/components/GrTooltip/index.js +1 -1
  264. package/dist/components/GrTree/chunks/{GrTree-B2_yW6g1.js → GrTree-_12ChXRQ.js} +3 -3
  265. package/dist/components/GrTree/chunks/GrTree-_12ChXRQ.js.map +1 -0
  266. package/dist/components/GrTree/index.js +1 -1
  267. package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-0aM62xyu.js → GrTreeSelect-CdaLG7Xq.js} +10 -10
  268. package/dist/components/GrTreeSelect/chunks/GrTreeSelect-CdaLG7Xq.js.map +1 -0
  269. package/dist/components/GrTreeSelect/index.js +2 -2
  270. package/dist/composables/useToast.js +3 -1
  271. package/dist/composables/useToast.js.map +1 -1
  272. package/dist/directives/loading.js +1 -1
  273. package/dist/granular-provider-node.js +6 -6
  274. package/dist/granular-provider-node.js.map +1 -1
  275. package/dist/granular-provider.js +1 -1
  276. package/dist/i18n/all.js +1 -1
  277. package/dist/i18n/index.js +1 -1
  278. package/dist/index.js +111 -93
  279. package/dist/index.js.map +1 -1
  280. package/dist/styles/base.css +2 -2
  281. package/dist/styles/index.css +6 -3
  282. package/dist/styles/preflight.css +3 -3
  283. package/dist/styles/themes/dark.css +52 -40
  284. package/dist/styles/themes/light.css +70 -45
  285. package/dist/styles/tokens.css +20 -20
  286. package/dist/types/src/components/GrAlert/GrAlert.vue.d.ts +26 -14
  287. package/dist/types/src/components/GrAlert/defaults.d.ts +17 -0
  288. package/dist/types/src/components/GrAlert/grAlertStyles.d.ts +55 -0
  289. package/dist/types/src/components/GrAlert/index.d.ts +4 -1
  290. package/dist/types/src/components/GrAutocomplete/GrAutocomplete.vue.d.ts +153 -0
  291. package/dist/types/src/components/GrAutocomplete/config.d.ts +1 -0
  292. package/dist/types/src/components/GrAutocomplete/defaults.d.ts +15 -0
  293. package/dist/types/src/components/GrAutocomplete/grAutocompleteStyles.d.ts +27 -0
  294. package/dist/types/src/components/GrAutocomplete/index.d.ts +6 -0
  295. package/dist/types/src/components/GrAutocomplete/safelist.d.ts +1 -0
  296. package/dist/types/src/components/GrAvatar/GrAvatar.vue.d.ts +1 -1
  297. package/dist/types/src/components/GrBadge/GrBadge.vue.d.ts +7 -7
  298. package/dist/types/src/components/GrBadge/defaults.d.ts +15 -0
  299. package/dist/types/src/components/GrBadge/index.d.ts +1 -0
  300. package/dist/types/src/components/GrBadgeWrap/GrBadgeWrap.vue.d.ts +1 -1
  301. package/dist/types/src/components/GrButton/GrButton.vue.d.ts +12 -12
  302. package/dist/types/src/components/GrButton/defaults.d.ts +25 -0
  303. package/dist/types/src/components/GrButton/grButtonStyles.d.ts +2 -2
  304. package/dist/types/src/components/GrButton/index.d.ts +1 -0
  305. package/dist/types/src/components/GrCheckbox/GrCheckbox.vue.d.ts +4 -4
  306. package/dist/types/src/components/GrCollapse/GrCollapse.vue.d.ts +2 -2
  307. package/dist/types/src/components/GrCollapse/GrCollapseItem.vue.d.ts +1 -1
  308. package/dist/types/src/components/GrCommandPalette/GrCommandPalette.vue.d.ts +128 -0
  309. package/dist/types/src/components/GrCommandPalette/config.d.ts +1 -0
  310. package/dist/types/src/components/GrCommandPalette/filtering.d.ts +35 -0
  311. package/dist/types/src/components/GrCommandPalette/grCommandPaletteStyles.d.ts +20 -0
  312. package/dist/types/src/components/GrCommandPalette/hotkey.d.ts +23 -0
  313. package/dist/types/src/components/GrCommandPalette/index.d.ts +6 -0
  314. package/dist/types/src/components/GrCommandPalette/safelist.d.ts +1 -0
  315. package/dist/types/src/components/GrConfigProvider/GrConfigProvider.vue.d.ts +59 -0
  316. package/dist/types/src/components/GrConfigProvider/config.d.ts +1 -0
  317. package/dist/types/src/components/GrConfigProvider/context.d.ts +131 -0
  318. package/dist/types/src/components/GrConfigProvider/index.d.ts +5 -0
  319. package/dist/types/src/components/GrConfirmDialog/GrConfirmDialog.vue.d.ts +2 -2
  320. package/dist/types/src/components/GrDataTable/GrDataTable.vue.d.ts +20 -0
  321. package/dist/types/src/components/GrDialog/GrDialog.vue.d.ts +1 -1
  322. package/dist/types/src/components/GrDialogService/store.d.ts +18 -0
  323. package/dist/types/src/components/GrDrawer/GrDrawer.vue.d.ts +1 -1
  324. package/dist/types/src/components/GrDropdown/GrDropdown.vue.d.ts +1 -1
  325. package/dist/types/src/components/GrDropdownMenu/GrDropdownMenu.vue.d.ts +1 -1
  326. package/dist/types/src/components/GrDropdownMenu/GrDropdownMenuItem.vue.d.ts +1 -1
  327. package/dist/types/src/components/GrFileUpload/GrFileUpload.vue.d.ts +3 -3
  328. package/dist/types/src/components/GrForm/GrForm.vue.d.ts +93 -0
  329. package/dist/types/src/components/GrForm/config.d.ts +1 -0
  330. package/dist/types/src/components/GrForm/context.d.ts +27 -0
  331. package/dist/types/src/components/GrForm/index.d.ts +6 -0
  332. package/dist/types/src/components/GrForm/validation.d.ts +52 -0
  333. package/dist/types/src/components/GrFormField/GrFormField.vue.d.ts +11 -1
  334. package/dist/types/src/components/GrFormFile/GrFormFile.vue.d.ts +4 -4
  335. package/dist/types/src/components/GrImageViewer/GrImageViewer.vue.d.ts +3 -3
  336. package/dist/types/src/components/GrInput/GrInput.vue.d.ts +12 -12
  337. package/dist/types/src/components/GrInput/defaults.d.ts +18 -0
  338. package/dist/types/src/components/GrInput/grInputStyles.d.ts +1 -1
  339. package/dist/types/src/components/GrInput/index.d.ts +1 -0
  340. package/dist/types/src/components/GrInputTag/GrInputTag.vue.d.ts +3 -3
  341. package/dist/types/src/components/GrLink/GrLink.vue.d.ts +3 -3
  342. package/dist/types/src/components/GrLink/grLinkStyles.d.ts +3 -3
  343. package/dist/types/src/components/GrModal/grModalStyles.d.ts +1 -1
  344. package/dist/types/src/components/GrNumberInput/GrNumberInput.vue.d.ts +10 -10
  345. package/dist/types/src/components/GrNumberInput/defaults.d.ts +14 -0
  346. package/dist/types/src/components/GrNumberInput/index.d.ts +1 -0
  347. package/dist/types/src/components/GrPagination/GrPagination.vue.d.ts +18 -0
  348. package/dist/types/src/components/GrPromptDialog/GrPromptDialog.vue.d.ts +4 -4
  349. package/dist/types/src/components/GrRadio/GrRadio.vue.d.ts +5 -5
  350. package/dist/types/src/components/GrRadio/defaults.d.ts +14 -0
  351. package/dist/types/src/components/GrRadio/grRadioStyles.d.ts +3 -3
  352. package/dist/types/src/components/GrRadio/index.d.ts +1 -0
  353. package/dist/types/src/components/GrRadioGroup/GrRadioGroup.vue.d.ts +4 -4
  354. package/dist/types/src/components/GrRadioGroup/defaults.d.ts +14 -0
  355. package/dist/types/src/components/GrRadioGroup/index.d.ts +1 -0
  356. package/dist/types/src/components/GrRating/GrRating.vue.d.ts +124 -0
  357. package/dist/types/src/components/GrRating/config.d.ts +1 -0
  358. package/dist/types/src/components/GrRating/defaults.d.ts +14 -0
  359. package/dist/types/src/components/GrRating/grRatingStyles.d.ts +21 -0
  360. package/dist/types/src/components/GrRating/index.d.ts +6 -0
  361. package/dist/types/src/components/GrRating/safelist.d.ts +1 -0
  362. package/dist/types/src/components/GrResponseErrorBanner/GrUploadErrorBanner.vue.d.ts +1 -1
  363. package/dist/types/src/components/GrSegmented/GrSegmented.vue.d.ts +7 -7
  364. package/dist/types/src/components/GrSegmented/defaults.d.ts +15 -0
  365. package/dist/types/src/components/GrSegmented/grSegmentedStyles.d.ts +1 -1
  366. package/dist/types/src/components/GrSegmented/index.d.ts +1 -0
  367. package/dist/types/src/components/GrSelect/GrSelect.vue.d.ts +57 -17
  368. package/dist/types/src/components/GrSelect/defaults.d.ts +17 -0
  369. package/dist/types/src/components/GrSelect/grSelectStyles.d.ts +3 -3
  370. package/dist/types/src/components/GrSelect/index.d.ts +1 -0
  371. package/dist/types/src/components/GrSidebar/GrSidebarItem.vue.d.ts +2 -2
  372. package/dist/types/src/components/GrSkeleton/GrSkeleton.vue.d.ts +1 -1
  373. package/dist/types/src/components/GrSlider/GrSlider.vue.d.ts +88 -0
  374. package/dist/types/src/components/GrSlider/config.d.ts +1 -0
  375. package/dist/types/src/components/GrSlider/defaults.d.ts +14 -0
  376. package/dist/types/src/components/GrSlider/grSliderStyles.d.ts +36 -0
  377. package/dist/types/src/components/GrSlider/index.d.ts +6 -0
  378. package/dist/types/src/components/GrSlider/safelist.d.ts +1 -0
  379. package/dist/types/src/components/GrStatistic/GrStatistic.vue.d.ts +116 -0
  380. package/dist/types/src/components/GrStatistic/config.d.ts +1 -0
  381. package/dist/types/src/components/GrStatistic/formatStatisticValue.d.ts +16 -0
  382. package/dist/types/src/components/GrStatistic/grStatisticStyles.d.ts +24 -0
  383. package/dist/types/src/components/GrStatistic/index.d.ts +6 -0
  384. package/dist/types/src/components/GrStatistic/safelist.d.ts +1 -0
  385. package/dist/types/src/components/GrSwitch/GrSwitch.vue.d.ts +4 -4
  386. package/dist/types/src/components/GrSwitch/defaults.d.ts +14 -0
  387. package/dist/types/src/components/GrSwitch/grSwitchStyles.d.ts +2 -2
  388. package/dist/types/src/components/GrSwitch/index.d.ts +1 -0
  389. package/dist/types/src/components/GrTable/GrTable.vue.d.ts +16 -0
  390. package/dist/types/src/components/GrTextarea/GrTextarea.vue.d.ts +5 -5
  391. package/dist/types/src/components/GrToaster/GrToaster.vue.d.ts +19 -2
  392. package/dist/types/src/components/GrToaster/index.d.ts +1 -1
  393. package/dist/types/src/components/GrTooltip/GrTooltip.vue.d.ts +1 -1
  394. package/dist/types/src/components/GrTreeSelect/GrTreeSelect.vue.d.ts +1 -1
  395. package/dist/types/src/components/GrTreeSelect/grTreeSelectStyles.d.ts +1 -1
  396. package/dist/types/src/composables/useToast.d.ts +24 -0
  397. package/dist/types/src/granular-provider/shared.d.ts +7 -0
  398. package/dist/types/src/i18n/messages/en.d.ts +74 -0
  399. package/dist/types/src/i18n/messages/es.d.ts +74 -0
  400. package/dist/types/src/i18n/messages/ru.d.ts +74 -0
  401. package/dist/types/src/index.d.ts +7 -0
  402. package/dist/web-types.json +1308 -271
  403. package/package.json +29 -1
  404. package/dist/chunks/config-1uSYl98Y2.js.map +0 -1
  405. package/dist/chunks/config-8Pcutu1j2.js.map +0 -1
  406. package/dist/chunks/config-B7IIWGt_2.js.map +0 -1
  407. package/dist/chunks/config-BIRO0vDJ.js.map +0 -1
  408. package/dist/chunks/config-BLHqZhy-2.js.map +0 -1
  409. package/dist/chunks/config-BOlr7qw7.js.map +0 -1
  410. package/dist/chunks/config-BUHuGBik.js.map +0 -1
  411. package/dist/chunks/config-BX1JTrkV2.js.map +0 -1
  412. package/dist/chunks/config-BXtAmU3s2.js.map +0 -1
  413. package/dist/chunks/config-C7NpDrfO.js.map +0 -1
  414. package/dist/chunks/config-CGHLoBlH.js.map +0 -1
  415. package/dist/chunks/config-ClhKPJvg.js.map +0 -1
  416. package/dist/chunks/config-Cpi9Mh2J.js.map +0 -1
  417. package/dist/chunks/config-CrG1XiE72.js.map +0 -1
  418. package/dist/chunks/config-DUcu1D682.js.map +0 -1
  419. package/dist/chunks/config-D_R56_gT.js.map +0 -1
  420. package/dist/chunks/config-DezDih8_.js.map +0 -1
  421. package/dist/chunks/config-JpHA4Xx02.js.map +0 -1
  422. package/dist/chunks/config-QaIc_gRa.js.map +0 -1
  423. package/dist/chunks/config-U4m9PSql.js.map +0 -1
  424. package/dist/chunks/config-eXB87DOi2.js.map +0 -1
  425. package/dist/chunks/config-eYLZYOUS2.js.map +0 -1
  426. package/dist/chunks/config-ipvU0lzP2.js.map +0 -1
  427. package/dist/chunks/config-xR4XVmcy.js.map +0 -1
  428. package/dist/chunks/en-CfkDa4GX.js.map +0 -1
  429. package/dist/chunks/es-FkgECuCm.js.map +0 -1
  430. package/dist/chunks/grBadgeStyles-DrycBuKT.js.map +0 -1
  431. package/dist/chunks/grButtonStyles-C7Yga_Q1.js.map +0 -1
  432. package/dist/chunks/grModalStyles-DWd3i05Q.js.map +0 -1
  433. package/dist/chunks/grSelectStyles-CLK5hRd3.js.map +0 -1
  434. package/dist/chunks/grStyle-Blc9otAx.js.map +0 -1
  435. package/dist/chunks/ru-Bl8CxpEa.js.map +0 -1
  436. package/dist/chunks/shared-B6Ay2081.js +0 -174
  437. package/dist/chunks/shared-B6Ay2081.js.map +0 -1
  438. package/dist/components/GrAlert/chunks/GrAlert-DPJSU_fG.js +0 -163
  439. package/dist/components/GrAlert/chunks/GrAlert-DPJSU_fG.js.map +0 -1
  440. package/dist/components/GrAvatar/chunks/GrAvatar-96CpTCq5.js.map +0 -1
  441. package/dist/components/GrBadge/chunks/GrBadge-B77XlaqE.js.map +0 -1
  442. package/dist/components/GrBadgeWrap/chunks/GrBadgeWrap-CcktMOdg.js.map +0 -1
  443. package/dist/components/GrBottomNav/chunks/GrBottomNav-usuMgG8_.js.map +0 -1
  444. package/dist/components/GrButton/chunks/GrButton-BlffdeJr.js.map +0 -1
  445. package/dist/components/GrCard/chunks/GrCard-DUNMkuHW.js.map +0 -1
  446. package/dist/components/GrCheckbox/chunks/GrCheckbox-DJhzZZdO.js.map +0 -1
  447. package/dist/components/GrCollapse/chunks/GrCollapse-CPPLh_xU.js.map +0 -1
  448. package/dist/components/GrConfirmDialog/chunks/GrConfirmDialog-D8CkOtqv.js.map +0 -1
  449. package/dist/components/GrDataTable/chunks/GrDataTable-Ds5OeGat.js.map +0 -1
  450. package/dist/components/GrDialog/chunks/GrDialog-Ctucxju9.js.map +0 -1
  451. package/dist/components/GrDialogService/chunks/GrDialogService-CU1Fbonc.js.map +0 -1
  452. package/dist/components/GrDivider/chunks/GrDivider-5bcE-BB4.js.map +0 -1
  453. package/dist/components/GrDrawer/chunks/GrDrawer-SLGKCY2A.js.map +0 -1
  454. package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu--g9Vofcq.js.map +0 -1
  455. package/dist/components/GrEmptyState/chunks/GrEmptyState-CA3BiTV7.js.map +0 -1
  456. package/dist/components/GrFileUpload/chunks/GrFileUpload-DvWPpiJS.js.map +0 -1
  457. package/dist/components/GrFormField/chunks/GrFormField-DnfMHx_U.js.map +0 -1
  458. package/dist/components/GrFormFile/chunks/GrFormFile-CXcqqdvV.js.map +0 -1
  459. package/dist/components/GrFormSection/chunks/GrFormSection-Ce21jcgo.js.map +0 -1
  460. package/dist/components/GrInput/chunks/GrInput-B8dd3JaA.js.map +0 -1
  461. package/dist/components/GrInputTag/chunks/GrInputTag-zMgFqp2g.js.map +0 -1
  462. package/dist/components/GrKbd/chunks/GrKbd-BEoYxWhE.js.map +0 -1
  463. package/dist/components/GrList/chunks/GrList-Dx772Ns4.js.map +0 -1
  464. package/dist/components/GrLoading/chunks/GrLoading--X_7rdbb.js.map +0 -1
  465. package/dist/components/GrNavbar/chunks/GrNavbar-DW3MiIIf.js.map +0 -1
  466. package/dist/components/GrNumberInput/chunks/GrNumberInput-DxCEvL7V.js.map +0 -1
  467. package/dist/components/GrPagination/chunks/GrPagination-mlyfLjQY.js.map +0 -1
  468. package/dist/components/GrProgressBar/chunks/GrProgressBar-CC3z-Zqp.js.map +0 -1
  469. package/dist/components/GrPromptDialog/chunks/GrPromptDialog-C-_BMNuY.js.map +0 -1
  470. package/dist/components/GrRadio/chunks/GrRadio-Dr-pvs_9.js.map +0 -1
  471. package/dist/components/GrRadioGroup/chunks/GrRadioGroup-nOdvfV_g.js.map +0 -1
  472. package/dist/components/GrSegmented/chunks/GrSegmented-C1y0UXpQ.js.map +0 -1
  473. package/dist/components/GrSelect/chunks/GrSelect-BVCmitqa.js.map +0 -1
  474. package/dist/components/GrSidebar/chunks/GrSidebar-DkWozzwA.js.map +0 -1
  475. package/dist/components/GrSkeleton/chunks/GrSkeleton-DsN-_CDZ.js.map +0 -1
  476. package/dist/components/GrSwitch/chunks/GrSwitch-DAioyccZ.js.map +0 -1
  477. package/dist/components/GrTable/chunks/GrTable-Db3hRnKA.js.map +0 -1
  478. package/dist/components/GrTabs/chunks/GrTabs-DsLwWoRz.js.map +0 -1
  479. package/dist/components/GrTextarea/chunks/GrTextarea-CKukGlNl.js.map +0 -1
  480. package/dist/components/GrToaster/chunks/GrToaster-L2cu6cSR.js.map +0 -1
  481. package/dist/components/GrTooltip/chunks/GrTooltip-BeyZ8ssR.js.map +0 -1
  482. package/dist/components/GrTree/chunks/GrTree-B2_yW6g1.js.map +0 -1
  483. package/dist/components/GrTreeSelect/chunks/GrTreeSelect-0aM62xyu.js.map +0 -1
  484. package/dist/chunks/{config-8Pcutu1j2.js → config-8Pcutu1j.js} +0 -0
  485. package/dist/chunks/{config-BLHqZhy-2.js → config-BLHqZhy-.js} +0 -0
  486. package/dist/chunks/{config-BUHuGBik.js → config-BUHuGBik2.js} +0 -0
  487. package/dist/chunks/{config-BX1JTrkV2.js → config-BX1JTrkV.js} +0 -0
  488. package/dist/chunks/{config-BXtAmU3s2.js → config-BXtAmU3s.js} +0 -0
  489. package/dist/chunks/{config-CGHLoBlH.js → config-CGHLoBlH2.js} +0 -0
  490. package/dist/chunks/{config-Cpi9Mh2J.js → config-Dqy0rPPO2.js} +1 -1
  491. /package/dist/chunks/{config-JpHA4Xx02.js → config-JpHA4Xx0.js} +0 -0
  492. /package/dist/chunks/{config-QaIc_gRa.js → config-QaIc_gRa2.js} +0 -0
  493. /package/dist/chunks/{config-U4m9PSql.js → config-U4m9PSql2.js} +0 -0
  494. /package/dist/chunks/{config-eXB87DOi2.js → config-eXB87DOi.js} +0 -0
  495. /package/dist/chunks/{config-ipvU0lzP2.js → config-ipvU0lzP.js} +0 -0
  496. /package/dist/chunks/{config-xR4XVmcy.js → config-xR4XVmcy2.js} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrPagination-C5Y69CuK.js","names":[],"sources":["../../../../src/components/GrPagination/GrPagination.vue","../../../../src/components/GrPagination/GrPagination.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\n\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport GrButton from '../GrButton/GrButton.vue'\nimport GrSelect from '../GrSelect/GrSelect.vue'\n\n/**\n * Пропы пагинации.\n *\n * `total` интерпретируется как общее количество элементов; число страниц\n * вычисляется из `total` и `pageSize`. Номера усекаются многоточием\n * (алгоритм boundary/sibling, как у MUI): всегда видны первая/последняя страница\n * и `siblingCount` соседей вокруг текущей.\n */\nexport interface GrPaginationProps {\n page: number\n pageSize: number\n total: number\n pageSizes?: number[]\n /** Сколько соседних страниц показывать вокруг текущей. По умолчанию `1`. */\n siblingCount?: number\n /** Сколько крайних страниц всегда показывать с каждого края. По умолчанию `1`. */\n boundaryCount?: number\n /**\n * Компактный вариант: вместо нумерованных страниц показывается индикатор\n * «текущая / всего» — удобно для узких мест (мобайл, тулбары таблиц).\n */\n compact?: boolean\n /** Показывать поле «перейти к странице» с быстрым переходом по вводу номера. */\n showJumper?: boolean\n /** i18n-подпись перед полем перехода. По умолчанию — `gr.pagination.jumpTo`. */\n jumperLabel?: string\n}\n\nconst { t } = useGranularityTranslations()\n\nconst props = withDefaults(defineProps<GrPaginationProps>(), {\n pageSizes: () => [10, 20, 50],\n siblingCount: 1,\n boundaryCount: 1,\n compact: false,\n showJumper: false,\n jumperLabel: undefined,\n})\n\nconst emit = defineEmits<{\n (e: 'update:page', value: number): void\n (e: 'update:pageSize', value: number): void\n}>()\n\nconst pageCount = computed(() => Math.max(1, Math.ceil(props.total / props.pageSize)))\n\n// Контролируемый компонент: если `total`/`pageSize` уменьшились и текущая `page`\n// вышла за диапазон — просим родителя подтянуть её к последней странице.\nwatch(pageCount, (count) => {\n if (props.page > count)\n emit('update:page', count)\n})\n\nconst pageSizeModel = computed({\n get: () => String(props.pageSize),\n set: (value: string) => emit('update:pageSize', Number(value)),\n})\n\nconst pageSizeOptions = computed(() =>\n props.pageSizes.map(pageSize => ({\n value: String(pageSize),\n label: String(pageSize),\n })),\n)\n\ntype PaginationItem = number | 'ellipsis-start' | 'ellipsis-end'\n\nfunction range(start: number, end: number): number[] {\n const list: number[] = []\n for (let page = start; page <= end; page += 1)\n list.push(page)\n return list\n}\n\n// Алгоритм usePagination как в MUI: крайние `boundaryCount` страниц + `siblingCount`\n// соседей вокруг текущей, разрывы схлопываются в многоточие. Одиночный «пропущенный»\n// номер показываем как номер, а не как «…» (визуально ровнее).\nconst items = computed<PaginationItem[]>(() => {\n const count = pageCount.value\n const current = props.page\n const boundaryCount = Math.max(0, props.boundaryCount)\n const siblingCount = Math.max(0, props.siblingCount)\n\n const startPages = range(1, Math.min(boundaryCount, count))\n const endPages = range(Math.max(count - boundaryCount + 1, boundaryCount + 1), count)\n\n const siblingsStart = Math.max(\n Math.min(current - siblingCount, count - boundaryCount - siblingCount * 2 - 1),\n boundaryCount + 2,\n )\n const siblingsEnd = Math.min(\n Math.max(current + siblingCount, boundaryCount + siblingCount * 2 + 2),\n endPages.length > 0 ? endPages[0] - 2 : count - 1,\n )\n\n return [\n ...startPages,\n ...(siblingsStart > boundaryCount + 2\n ? ['ellipsis-start' as const]\n : boundaryCount + 1 < count - boundaryCount\n ? [boundaryCount + 1]\n : []),\n ...range(siblingsStart, siblingsEnd),\n ...(siblingsEnd < count - boundaryCount - 1\n ? ['ellipsis-end' as const]\n : count - boundaryCount > boundaryCount\n ? [count - boundaryCount]\n : []),\n ...endPages,\n ]\n})\n\nfunction goTo(page: number): void {\n emit('update:page', page)\n}\n\nfunction prev(): void {\n goTo(Math.max(1, props.page - 1))\n}\n\nfunction next(): void {\n goTo(Math.min(pageCount.value, props.page + 1))\n}\n\nfunction first(): void {\n goTo(1)\n}\n\nfunction last(): void {\n goTo(pageCount.value)\n}\n\n// «Перейти к странице»: клампим введённый номер к диапазону [1, pageCount]\n// и сбрасываем поле после перехода.\nconst jumperValue = ref('')\n\nfunction submitJumper(): void {\n const parsed = Number.parseInt(jumperValue.value, 10)\n jumperValue.value = ''\n if (Number.isNaN(parsed))\n return\n\n goTo(Math.min(pageCount.value, Math.max(1, parsed)))\n}\n\nconst resolvedJumperLabel = computed(() => props.jumperLabel ?? t('gr.pagination.jumpTo', 'Go to'))\n</script>\n\n<template>\n <div\n class=\"flex flex-wrap items-center justify-end gap-3\"\n data-gr-pagination\n role=\"navigation\"\n :aria-label=\"t('gr.pagination.label', 'Pagination')\"\n >\n <div class=\"min-w-[100px]\">\n <GrSelect\n v-model=\"pageSizeModel\"\n :options=\"pageSizeOptions\"\n :aria-label=\"t('gr.pagination.pageSize', 'Page size')\"\n />\n </div>\n\n <GrButton variant=\"ghost\" size=\"sm\" :disabled=\"page <= 1\" :aria-label=\"t('gr.pagination.first', 'First page')\" data-gr-pagination-first @click=\"first\">\n «\n </GrButton>\n\n <GrButton variant=\"ghost\" size=\"sm\" :disabled=\"page <= 1\" data-gr-pagination-prev @click=\"prev\">\n {{ t('gr.pagination.prev', 'Prev') }}\n </GrButton>\n\n <!-- Компактный вариант: индикатор «текущая / всего» вместо нумерованных страниц. -->\n <div\n v-if=\"compact\"\n data-gr-pagination-compact\n class=\"px-2 text-sm text-[var(--gr-fg)] tabular-nums\"\n aria-live=\"polite\"\n >\n {{ page }} / {{ pageCount }}\n </div>\n\n <div v-else class=\"flex items-center gap-1\">\n <template v-for=\"(item, index) in items\" :key=\"index\">\n <span\n v-if=\"item === 'ellipsis-start' || item === 'ellipsis-end'\"\n data-gr-pagination-ellipsis\n aria-hidden=\"true\"\n class=\"h-8 min-w-8 px-1 grid place-items-center text-sm text-[var(--gr-muted-fg)]\"\n >…</span>\n <button\n v-else\n type=\"button\"\n data-gr-pagination-page\n :aria-current=\"item === page ? 'page' : undefined\"\n :aria-label=\"t('gr.pagination.page', 'Page {n}', { n: item })\"\n class=\"h-8 min-w-8 px-2 rounded-md text-sm font-600 transition-colors duration-150 focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]\"\n :class=\"item === page ? 'bg-[var(--gr-primary)] text-[var(--gr-primary-fg)]' : 'text-[var(--gr-muted-fg)] hover:bg-[var(--gr-muted)] hover:text-[var(--gr-fg)]'\"\n @click=\"goTo(item)\"\n >\n {{ item }}\n </button>\n </template>\n </div>\n\n <GrButton variant=\"ghost\" size=\"sm\" :disabled=\"page >= pageCount\" data-gr-pagination-next @click=\"next\">\n {{ t('gr.pagination.next', 'Next') }}\n </GrButton>\n\n <GrButton variant=\"ghost\" size=\"sm\" :disabled=\"page >= pageCount\" :aria-label=\"t('gr.pagination.last', 'Last page')\" data-gr-pagination-last @click=\"last\">\n »\n </GrButton>\n\n <!-- «Перейти к странице»: Enter или blur применяют введённый номер. -->\n <div v-if=\"showJumper\" class=\"flex items-center gap-2 text-sm text-[var(--gr-muted-fg)]\">\n <span>{{ resolvedJumperLabel }}</span>\n <input\n v-model=\"jumperValue\"\n type=\"number\"\n min=\"1\"\n :max=\"pageCount\"\n inputmode=\"numeric\"\n data-gr-pagination-jumper\n :aria-label=\"resolvedJumperLabel\"\n class=\"h-8 w-14 rounded-md border border-[var(--gr-brd)] bg-[var(--gr-bg)] px-2 text-center text-sm text-[var(--gr-fg)] tabular-nums transition-colors duration-150 focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]\"\n @keydown.enter=\"submitJumper\"\n @blur=\"submitJumper\"\n >\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\n\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport GrButton from '../GrButton/GrButton.vue'\nimport GrSelect from '../GrSelect/GrSelect.vue'\n\n/**\n * Пропы пагинации.\n *\n * `total` интерпретируется как общее количество элементов; число страниц\n * вычисляется из `total` и `pageSize`. Номера усекаются многоточием\n * (алгоритм boundary/sibling, как у MUI): всегда видны первая/последняя страница\n * и `siblingCount` соседей вокруг текущей.\n */\nexport interface GrPaginationProps {\n page: number\n pageSize: number\n total: number\n pageSizes?: number[]\n /** Сколько соседних страниц показывать вокруг текущей. По умолчанию `1`. */\n siblingCount?: number\n /** Сколько крайних страниц всегда показывать с каждого края. По умолчанию `1`. */\n boundaryCount?: number\n /**\n * Компактный вариант: вместо нумерованных страниц показывается индикатор\n * «текущая / всего» — удобно для узких мест (мобайл, тулбары таблиц).\n */\n compact?: boolean\n /** Показывать поле «перейти к странице» с быстрым переходом по вводу номера. */\n showJumper?: boolean\n /** i18n-подпись перед полем перехода. По умолчанию — `gr.pagination.jumpTo`. */\n jumperLabel?: string\n}\n\nconst { t } = useGranularityTranslations()\n\nconst props = withDefaults(defineProps<GrPaginationProps>(), {\n pageSizes: () => [10, 20, 50],\n siblingCount: 1,\n boundaryCount: 1,\n compact: false,\n showJumper: false,\n jumperLabel: undefined,\n})\n\nconst emit = defineEmits<{\n (e: 'update:page', value: number): void\n (e: 'update:pageSize', value: number): void\n}>()\n\nconst pageCount = computed(() => Math.max(1, Math.ceil(props.total / props.pageSize)))\n\n// Контролируемый компонент: если `total`/`pageSize` уменьшились и текущая `page`\n// вышла за диапазон — просим родителя подтянуть её к последней странице.\nwatch(pageCount, (count) => {\n if (props.page > count)\n emit('update:page', count)\n})\n\nconst pageSizeModel = computed({\n get: () => String(props.pageSize),\n set: (value: string) => emit('update:pageSize', Number(value)),\n})\n\nconst pageSizeOptions = computed(() =>\n props.pageSizes.map(pageSize => ({\n value: String(pageSize),\n label: String(pageSize),\n })),\n)\n\ntype PaginationItem = number | 'ellipsis-start' | 'ellipsis-end'\n\nfunction range(start: number, end: number): number[] {\n const list: number[] = []\n for (let page = start; page <= end; page += 1)\n list.push(page)\n return list\n}\n\n// Алгоритм usePagination как в MUI: крайние `boundaryCount` страниц + `siblingCount`\n// соседей вокруг текущей, разрывы схлопываются в многоточие. Одиночный «пропущенный»\n// номер показываем как номер, а не как «…» (визуально ровнее).\nconst items = computed<PaginationItem[]>(() => {\n const count = pageCount.value\n const current = props.page\n const boundaryCount = Math.max(0, props.boundaryCount)\n const siblingCount = Math.max(0, props.siblingCount)\n\n const startPages = range(1, Math.min(boundaryCount, count))\n const endPages = range(Math.max(count - boundaryCount + 1, boundaryCount + 1), count)\n\n const siblingsStart = Math.max(\n Math.min(current - siblingCount, count - boundaryCount - siblingCount * 2 - 1),\n boundaryCount + 2,\n )\n const siblingsEnd = Math.min(\n Math.max(current + siblingCount, boundaryCount + siblingCount * 2 + 2),\n endPages.length > 0 ? endPages[0] - 2 : count - 1,\n )\n\n return [\n ...startPages,\n ...(siblingsStart > boundaryCount + 2\n ? ['ellipsis-start' as const]\n : boundaryCount + 1 < count - boundaryCount\n ? [boundaryCount + 1]\n : []),\n ...range(siblingsStart, siblingsEnd),\n ...(siblingsEnd < count - boundaryCount - 1\n ? ['ellipsis-end' as const]\n : count - boundaryCount > boundaryCount\n ? [count - boundaryCount]\n : []),\n ...endPages,\n ]\n})\n\nfunction goTo(page: number): void {\n emit('update:page', page)\n}\n\nfunction prev(): void {\n goTo(Math.max(1, props.page - 1))\n}\n\nfunction next(): void {\n goTo(Math.min(pageCount.value, props.page + 1))\n}\n\nfunction first(): void {\n goTo(1)\n}\n\nfunction last(): void {\n goTo(pageCount.value)\n}\n\n// «Перейти к странице»: клампим введённый номер к диапазону [1, pageCount]\n// и сбрасываем поле после перехода.\nconst jumperValue = ref('')\n\nfunction submitJumper(): void {\n const parsed = Number.parseInt(jumperValue.value, 10)\n jumperValue.value = ''\n if (Number.isNaN(parsed))\n return\n\n goTo(Math.min(pageCount.value, Math.max(1, parsed)))\n}\n\nconst resolvedJumperLabel = computed(() => props.jumperLabel ?? t('gr.pagination.jumpTo', 'Go to'))\n</script>\n\n<template>\n <div\n class=\"flex flex-wrap items-center justify-end gap-3\"\n data-gr-pagination\n role=\"navigation\"\n :aria-label=\"t('gr.pagination.label', 'Pagination')\"\n >\n <div class=\"min-w-[100px]\">\n <GrSelect\n v-model=\"pageSizeModel\"\n :options=\"pageSizeOptions\"\n :aria-label=\"t('gr.pagination.pageSize', 'Page size')\"\n />\n </div>\n\n <GrButton variant=\"ghost\" size=\"sm\" :disabled=\"page <= 1\" :aria-label=\"t('gr.pagination.first', 'First page')\" data-gr-pagination-first @click=\"first\">\n «\n </GrButton>\n\n <GrButton variant=\"ghost\" size=\"sm\" :disabled=\"page <= 1\" data-gr-pagination-prev @click=\"prev\">\n {{ t('gr.pagination.prev', 'Prev') }}\n </GrButton>\n\n <!-- Компактный вариант: индикатор «текущая / всего» вместо нумерованных страниц. -->\n <div\n v-if=\"compact\"\n data-gr-pagination-compact\n class=\"px-2 text-sm text-[var(--gr-fg)] tabular-nums\"\n aria-live=\"polite\"\n >\n {{ page }} / {{ pageCount }}\n </div>\n\n <div v-else class=\"flex items-center gap-1\">\n <template v-for=\"(item, index) in items\" :key=\"index\">\n <span\n v-if=\"item === 'ellipsis-start' || item === 'ellipsis-end'\"\n data-gr-pagination-ellipsis\n aria-hidden=\"true\"\n class=\"h-8 min-w-8 px-1 grid place-items-center text-sm text-[var(--gr-muted-fg)]\"\n >…</span>\n <button\n v-else\n type=\"button\"\n data-gr-pagination-page\n :aria-current=\"item === page ? 'page' : undefined\"\n :aria-label=\"t('gr.pagination.page', 'Page {n}', { n: item })\"\n class=\"h-8 min-w-8 px-2 rounded-md text-sm font-600 transition-colors duration-150 focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]\"\n :class=\"item === page ? 'bg-[var(--gr-primary)] text-[var(--gr-primary-fg)]' : 'text-[var(--gr-muted-fg)] hover:bg-[var(--gr-muted)] hover:text-[var(--gr-fg)]'\"\n @click=\"goTo(item)\"\n >\n {{ item }}\n </button>\n </template>\n </div>\n\n <GrButton variant=\"ghost\" size=\"sm\" :disabled=\"page >= pageCount\" data-gr-pagination-next @click=\"next\">\n {{ t('gr.pagination.next', 'Next') }}\n </GrButton>\n\n <GrButton variant=\"ghost\" size=\"sm\" :disabled=\"page >= pageCount\" :aria-label=\"t('gr.pagination.last', 'Last page')\" data-gr-pagination-last @click=\"last\">\n »\n </GrButton>\n\n <!-- «Перейти к странице»: Enter или blur применяют введённый номер. -->\n <div v-if=\"showJumper\" class=\"flex items-center gap-2 text-sm text-[var(--gr-muted-fg)]\">\n <span>{{ resolvedJumperLabel }}</span>\n <input\n v-model=\"jumperValue\"\n type=\"number\"\n min=\"1\"\n :max=\"pageCount\"\n inputmode=\"numeric\"\n data-gr-pagination-jumper\n :aria-label=\"resolvedJumperLabel\"\n class=\"h-8 w-14 rounded-md border border-[var(--gr-brd)] bg-[var(--gr-bg)] px-2 text-center text-sm text-[var(--gr-fg)] tabular-nums transition-colors duration-150 focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]\"\n @keydown.enter=\"submitJumper\"\n @blur=\"submitJumper\"\n >\n </div>\n </div>\n</template>\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { t as GrPagination_default } from "./chunks/GrPagination-mlyfLjQY.js";
2
- import { t as grPaginationConfig } from "../../chunks/config-JpHA4Xx02.js";
1
+ import { t as GrPagination_default } from "./chunks/GrPagination-C5Y69CuK.js";
2
+ import { t as grPaginationConfig } from "../../chunks/config-JpHA4Xx0.js";
3
3
  export { GrPagination_default as GrPagination, GrPagination_default as default, grPaginationConfig };
@@ -1,4 +1,4 @@
1
- import { t as grProgressBarFillClass } from "../../../chunks/grStyle-Blc9otAx.js";
1
+ import { t as grProgressBarFillClass } from "../../../chunks/grStyle-CdvxTXPH.js";
2
2
  import { computed, createElementBlock, createElementVNode, defineComponent, normalizeClass, normalizeStyle, openBlock } from "vue";
3
3
  //#region src/components/GrProgressBar/GrProgressBar.vue?vue&type=script&setup=true&lang.ts
4
4
  var _hoisted_1 = ["aria-label", "aria-valuenow"];
@@ -26,7 +26,7 @@ var GrProgressBar_default = /* @__PURE__ */ defineComponent({
26
26
  "aria-valuenow": safe.value,
27
27
  "aria-valuemin": "0",
28
28
  "aria-valuemax": "100",
29
- class: "h-2 w-full rounded-full bg-[var(--muted)] border border-[var(--brd)] overflow-hidden"
29
+ class: "h-2 w-full rounded-full bg-[var(--gr-muted)] border border-[var(--gr-brd)] overflow-hidden"
30
30
  }, [createElementVNode("div", {
31
31
  "data-gr-progress-bar-fill": "",
32
32
  class: normalizeClass(["h-full", fillClassName.value]),
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrProgressBar-Dqg4Fj9S.js","names":[],"sources":["../../../../src/components/GrProgressBar/GrProgressBar.vue","../../../../src/components/GrProgressBar/GrProgressBar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport { grProgressBarFillClass, type GrProgressBarTone } from './grStyle'\n\n/**\n * GrProgressBar — линейный индикатор прогресса.\n *\n * @prop value — текущее значение `0..100`; выходящие за границы значения клампятся, `NaN` → `0`.\n * @prop ariaLabel — метка для скринридера (обязательна, если рядом нет видимого заголовка).\n * @prop tone — цветовая тональность заливки (CSS-переменная из `tokens.css`).\n */\nexport interface GrProgressBarProps {\n value: number\n ariaLabel?: string\n tone?: GrProgressBarTone\n}\n\nconst props = withDefaults(defineProps<GrProgressBarProps>(), {\n ariaLabel: undefined,\n tone: 'primary',\n})\n\nconst safe = computed(() => {\n if (Number.isNaN(props.value))\n return 0\n return Math.min(100, Math.max(0, props.value))\n})\n\nconst fillClassName = computed(() => grProgressBarFillClass(props.tone))\n</script>\n\n<template>\n <div\n data-gr-progress-bar\n role=\"progressbar\"\n :aria-label=\"ariaLabel\"\n :aria-valuenow=\"safe\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n class=\"h-2 w-full rounded-full bg-[var(--gr-muted)] border border-[var(--gr-brd)] overflow-hidden\"\n >\n <div\n data-gr-progress-bar-fill\n class=\"h-full\"\n :class=\"fillClassName\"\n :style=\"{ width: `${safe}%` }\"\n />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport { grProgressBarFillClass, type GrProgressBarTone } from './grStyle'\n\n/**\n * GrProgressBar — линейный индикатор прогресса.\n *\n * @prop value — текущее значение `0..100`; выходящие за границы значения клампятся, `NaN` → `0`.\n * @prop ariaLabel — метка для скринридера (обязательна, если рядом нет видимого заголовка).\n * @prop tone — цветовая тональность заливки (CSS-переменная из `tokens.css`).\n */\nexport interface GrProgressBarProps {\n value: number\n ariaLabel?: string\n tone?: GrProgressBarTone\n}\n\nconst props = withDefaults(defineProps<GrProgressBarProps>(), {\n ariaLabel: undefined,\n tone: 'primary',\n})\n\nconst safe = computed(() => {\n if (Number.isNaN(props.value))\n return 0\n return Math.min(100, Math.max(0, props.value))\n})\n\nconst fillClassName = computed(() => grProgressBarFillClass(props.tone))\n</script>\n\n<template>\n <div\n data-gr-progress-bar\n role=\"progressbar\"\n :aria-label=\"ariaLabel\"\n :aria-valuenow=\"safe\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n class=\"h-2 w-full rounded-full bg-[var(--gr-muted)] border border-[var(--gr-brd)] overflow-hidden\"\n >\n <div\n data-gr-progress-bar-fill\n class=\"h-full\"\n :class=\"fillClassName\"\n :style=\"{ width: `${safe}%` }\"\n />\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;EAkBA,MAAM,QAAQ;EAKd,MAAM,OAAO,eAAe;GAC1B,IAAI,OAAO,MAAM,MAAM,KAAK,GAC1B,OAAO;GACT,OAAO,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,MAAM,KAAK,CAAC;EAC/C,CAAC;EAED,MAAM,gBAAgB,eAAe,uBAAuB,MAAM,IAAI,CAAC;;uBAIrE,mBAeM,OAAA;IAdJ,wBAAA;IACA,MAAK;IACJ,cAAY,QAAA;IACZ,iBAAe,KAAA;IAChB,iBAAc;IACd,iBAAc;IACd,OAAM;OAEN,mBAKE,OAAA;IAJA,6BAAA;IACA,OAAK,eAAA,CAAC,UACE,cAAA,KAAa,CAAA;IACpB,OAAK,eAAA,EAAA,OAAA,GAAc,KAAA,MAAI,GAAA,CAAA"}
@@ -1,3 +1,3 @@
1
- import { t as GrProgressBar_default } from "./chunks/GrProgressBar-CC3z-Zqp.js";
2
- import { n as grProgressBarSafelist, t as grProgressBarConfig } from "../../chunks/config-DnvPqu4g2.js";
1
+ import { t as GrProgressBar_default } from "./chunks/GrProgressBar-Dqg4Fj9S.js";
2
+ import { n as grProgressBarSafelist, t as grProgressBarConfig } from "../../chunks/config-DRKXJ9PW2.js";
3
3
  export { GrProgressBar_default as GrProgressBar, GrProgressBar_default as default, grProgressBarConfig, grProgressBarSafelist };
@@ -1,15 +1,15 @@
1
- import { t as useGranularityTranslations } from "../../../chunks/granularityI18n-DoV7Ca2m.js";
2
- import { t as GrButton_default } from "../../GrButton/chunks/GrButton-BlffdeJr.js";
3
- import { t as GrDialog_default } from "../../GrDialog/chunks/GrDialog-Ctucxju9.js";
4
- import { t as GrResponseErrorBanner_default } from "../../GrResponseErrorBanner/chunks/GrResponseErrorBanner-Cdu9ekK9.js";
5
- import { t as GrFormField_default } from "../../GrFormField/chunks/GrFormField-DnfMHx_U.js";
6
- import { t as GrInput_default } from "../../GrInput/chunks/GrInput-B8dd3JaA.js";
1
+ import { n as useGranularityTranslations } from "../../../chunks/granularityI18n-SH0I--GW.js";
2
+ import { t as GrButton_default } from "../../GrButton/chunks/GrButton-DCi4CUpo.js";
3
+ import { t as GrDialog_default } from "../../GrDialog/chunks/GrDialog-BPMvDHOz.js";
4
+ import { t as GrResponseErrorBanner_default } from "../../GrResponseErrorBanner/chunks/GrResponseErrorBanner-C8NGx8pE.js";
5
+ import { t as GrFormField_default } from "../../GrFormField/chunks/GrFormField-CXCDBd99.js";
6
+ import { t as GrInput_default } from "../../GrInput/chunks/GrInput-C1VBL0dg.js";
7
7
  import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, ref, renderSlot, toDisplayString, watch, withCtx } from "vue";
8
8
  //#region src/components/GrPromptDialog/GrPromptDialog.vue?vue&type=script&setup=true&lang.ts
9
9
  var _hoisted_1 = { class: "grid gap-4" };
10
10
  var _hoisted_2 = {
11
11
  key: 0,
12
- class: "text-[14px] text-[var(--muted-fg)]"
12
+ class: "text-[14px] text-[var(--gr-muted-fg)]"
13
13
  };
14
14
  var _hoisted_3 = { class: "flex items-center justify-end gap-3" };
15
15
  //#endregion
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrPromptDialog-DNUjRVB9.js","names":[],"sources":["../../../../src/components/GrPromptDialog/GrPromptDialog.vue","../../../../src/components/GrPromptDialog/GrPromptDialog.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * GrPromptDialog — GR-примитив диалога ввода значения поверх `GrDialog`.\n *\n * Синхронизирован с `GrDialog` по набору проп-проксирования:\n * `size`, `closeOnBackdrop`, `closeOnEsc`, `showHeader`, `showCloseButton`,\n * `headerConfig`, `footerConfig`, `bodyConfig`, `closeLabel`.\n *\n * Поведение `required=true` (по умолчанию): пустое значение подсвечивается\n * ошибкой только после первого «касания» (blur или попытка confirm),\n * чтобы не шуметь при открытии.\n */\nimport { computed, ref, watch } from 'vue'\n\nimport GrButton from '../GrButton/GrButton.vue'\nimport GrDialog from '../GrDialog/GrDialog.vue'\nimport GrFormField from '../GrFormField/GrFormField.vue'\nimport GrInput from '../GrInput/GrInput.vue'\nimport GrResponseErrorBanner from '../GrResponseErrorBanner/GrResponseErrorBanner.vue'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport type { GrButtonSize, GrButtonTone, GrButtonVariant } from '../GrButton'\nimport type { GrDialogSectionConfig, GrDialogSize } from '../GrDialog'\nimport type { ResponseErrorInfo } from '../GrResponseErrorBanner'\n\nexport interface GrPromptDialogProps {\n modelValue: boolean\n value: string\n title?: string\n description?: string\n label?: string\n placeholder?: string\n closeOnBackdrop?: boolean\n closeOnEsc?: boolean\n showHeader?: boolean\n showCloseButton?: boolean\n size?: GrDialogSize\n headerConfig?: GrDialogSectionConfig\n footerConfig?: GrDialogSectionConfig\n bodyConfig?: GrDialogSectionConfig\n /** A11y-лейбл кнопки закрытия (i18n). */\n closeLabel?: string\n buttonSize?: GrButtonSize\n confirmText?: string\n cancelText?: string\n /** Текст ошибки для пустого значения при `required=true` (i18n). */\n requiredErrorText?: string\n confirmVariant?: GrButtonVariant\n confirmTone?: GrButtonTone\n required?: boolean\n /**\n * Структура ошибки ответа сервера для показа общим блоком в теле диалога\n * (через `GrResponseErrorBanner`). `null` — блок скрыт.\n */\n error?: ResponseErrorInfo | null\n /**\n * Внешняя ошибка поля ввода (например, серверная валидация). Имеет приоритет\n * над встроенной проверкой `required`. `null`/`undefined` — нет внешней ошибки.\n */\n fieldError?: string | null\n /** Состояние загрузки кнопки Confirm (async-`onConfirm` in-flight). */\n confirmLoading?: boolean\n /** Принудительно дизейблит кнопку Confirm. */\n confirmDisabled?: boolean\n /**\n * Закрывать ли диалог автоматически по клику Confirm. По умолчанию `true`.\n * `false` — отдаёт управление закрытием наружу (нужно `useDialogService`).\n */\n closeOnConfirm?: boolean\n}\n\nconst props = withDefaults(defineProps<GrPromptDialogProps>(), {\n title: undefined,\n description: undefined,\n label: undefined,\n placeholder: undefined,\n closeOnBackdrop: true,\n closeOnEsc: true,\n showHeader: true,\n showCloseButton: true,\n size: 'md',\n headerConfig: undefined,\n footerConfig: undefined,\n bodyConfig: undefined,\n closeLabel: undefined,\n buttonSize: undefined,\n confirmText: undefined,\n cancelText: undefined,\n requiredErrorText: undefined,\n confirmVariant: 'primary',\n confirmTone: 'primary',\n required: true,\n error: null,\n fieldError: null,\n confirmLoading: false,\n confirmDisabled: false,\n closeOnConfirm: true,\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: boolean): void\n (e: 'update:value', value: string): void\n (e: 'confirm', value: string): void\n (e: 'cancel'): void\n}>()\n\n// Дефолты берём из общего i18n-блока пакета (fallback — англ.), а не хардкодим.\nconst { t } = useGranularityTranslations()\nconst resolvedTitle = computed(() => props.title ?? t('gr.dialog.prompt.title', 'Prompt'))\nconst resolvedLabel = computed(() => props.label ?? t('gr.dialog.prompt.label', 'Value'))\nconst resolvedRequiredErrorText = computed(() => props.requiredErrorText ?? t('gr.dialog.prompt.required', 'Enter a value.'))\nconst resolvedCloseLabel = computed(() => props.closeLabel ?? t('gr.common.close', 'Close'))\nconst resolvedConfirmText = computed(() => props.confirmText ?? t('gr.common.confirm', 'Confirm'))\nconst resolvedCancelText = computed(() => props.cancelText ?? t('gr.common.cancel', 'Cancel'))\n\nconst open = computed({\n get: () => props.modelValue,\n set: (v: boolean) => emit('update:modelValue', v),\n})\n\nconst valueModel = computed({\n get: () => props.value,\n set: (v: string) => emit('update:value', v),\n})\n\nconst touched = ref(false)\nconst inputRef = ref<InstanceType<typeof GrInput> | null>(null)\n\nwatch(\n () => props.modelValue,\n (v) => {\n if (v) touched.value = false\n },\n)\n\nconst canConfirm = computed(() => {\n if (!props.required) return true\n return valueModel.value.trim().length > 0\n})\n\nconst validationError = computed(() => {\n if (!props.required) return undefined\n if (!touched.value) return undefined\n return valueModel.value.trim().length > 0\n ? undefined\n : resolvedRequiredErrorText.value\n})\n\n// Внешняя ошибка поля (серверная валидация) имеет приоритет над встроенной.\nconst fieldErrorMessage = computed(() => props.fieldError ?? validationError.value ?? undefined)\n\nfunction onCancel(): void {\n emit('cancel')\n emit('update:modelValue', false)\n}\n\nfunction onConfirm(): void {\n if (!canConfirm.value) {\n touched.value = true\n inputRef.value?.focus()\n return\n }\n\n emit('confirm', valueModel.value)\n if (props.closeOnConfirm)\n emit('update:modelValue', false)\n}\n</script>\n\n<template>\n <GrDialog\n v-model=\"open\"\n :title=\"resolvedTitle\"\n :size=\"size\"\n :close-on-backdrop=\"closeOnBackdrop\"\n :close-on-esc=\"closeOnEsc\"\n :show-header=\"showHeader\"\n :show-close-button=\"showCloseButton\"\n :header-config=\"headerConfig\"\n :footer-config=\"footerConfig\"\n :body-config=\"bodyConfig\"\n :close-label=\"resolvedCloseLabel\"\n >\n <div class=\"grid gap-4\">\n <slot>\n <div v-if=\"description\" class=\"text-[14px] text-[var(--gr-muted-fg)]\">\n {{ description }}\n </div>\n </slot>\n\n <GrFormField :label=\"resolvedLabel\" :error=\"fieldErrorMessage\" for-id=\"gr-prompt-input\">\n <GrInput\n id=\"gr-prompt-input\"\n ref=\"inputRef\"\n v-model=\"valueModel\"\n data-testid=\"gr-prompt-input\"\n :placeholder=\"placeholder\"\n :invalid=\"!!fieldErrorMessage\"\n @blur=\"touched = true\"\n />\n </GrFormField>\n\n <slot name=\"error\" :error=\"error\">\n <GrResponseErrorBanner v-if=\"error\" :error=\"error\" :can-dismiss=\"false\" />\n </slot>\n </div>\n\n <template #footer>\n <slot name=\"footer\">\n <div class=\"flex items-center justify-end gap-3\">\n <GrButton data-testid=\"gr-prompt-cancel\" variant=\"outline\" :size=\"buttonSize\" @click=\"onCancel\">\n {{ resolvedCancelText }}\n </GrButton>\n <GrButton\n data-testid=\"gr-prompt-confirm\"\n :variant=\"confirmVariant\"\n :tone=\"confirmTone\"\n :size=\"buttonSize\"\n :loading=\"confirmLoading\"\n :disabled=\"confirmDisabled || (required && touched && !canConfirm)\"\n @click=\"onConfirm\"\n >\n {{ resolvedConfirmText }}\n </GrButton>\n </div>\n </slot>\n </template>\n </GrDialog>\n</template>\n","<script setup lang=\"ts\">\n/**\n * GrPromptDialog — GR-примитив диалога ввода значения поверх `GrDialog`.\n *\n * Синхронизирован с `GrDialog` по набору проп-проксирования:\n * `size`, `closeOnBackdrop`, `closeOnEsc`, `showHeader`, `showCloseButton`,\n * `headerConfig`, `footerConfig`, `bodyConfig`, `closeLabel`.\n *\n * Поведение `required=true` (по умолчанию): пустое значение подсвечивается\n * ошибкой только после первого «касания» (blur или попытка confirm),\n * чтобы не шуметь при открытии.\n */\nimport { computed, ref, watch } from 'vue'\n\nimport GrButton from '../GrButton/GrButton.vue'\nimport GrDialog from '../GrDialog/GrDialog.vue'\nimport GrFormField from '../GrFormField/GrFormField.vue'\nimport GrInput from '../GrInput/GrInput.vue'\nimport GrResponseErrorBanner from '../GrResponseErrorBanner/GrResponseErrorBanner.vue'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport type { GrButtonSize, GrButtonTone, GrButtonVariant } from '../GrButton'\nimport type { GrDialogSectionConfig, GrDialogSize } from '../GrDialog'\nimport type { ResponseErrorInfo } from '../GrResponseErrorBanner'\n\nexport interface GrPromptDialogProps {\n modelValue: boolean\n value: string\n title?: string\n description?: string\n label?: string\n placeholder?: string\n closeOnBackdrop?: boolean\n closeOnEsc?: boolean\n showHeader?: boolean\n showCloseButton?: boolean\n size?: GrDialogSize\n headerConfig?: GrDialogSectionConfig\n footerConfig?: GrDialogSectionConfig\n bodyConfig?: GrDialogSectionConfig\n /** A11y-лейбл кнопки закрытия (i18n). */\n closeLabel?: string\n buttonSize?: GrButtonSize\n confirmText?: string\n cancelText?: string\n /** Текст ошибки для пустого значения при `required=true` (i18n). */\n requiredErrorText?: string\n confirmVariant?: GrButtonVariant\n confirmTone?: GrButtonTone\n required?: boolean\n /**\n * Структура ошибки ответа сервера для показа общим блоком в теле диалога\n * (через `GrResponseErrorBanner`). `null` — блок скрыт.\n */\n error?: ResponseErrorInfo | null\n /**\n * Внешняя ошибка поля ввода (например, серверная валидация). Имеет приоритет\n * над встроенной проверкой `required`. `null`/`undefined` — нет внешней ошибки.\n */\n fieldError?: string | null\n /** Состояние загрузки кнопки Confirm (async-`onConfirm` in-flight). */\n confirmLoading?: boolean\n /** Принудительно дизейблит кнопку Confirm. */\n confirmDisabled?: boolean\n /**\n * Закрывать ли диалог автоматически по клику Confirm. По умолчанию `true`.\n * `false` — отдаёт управление закрытием наружу (нужно `useDialogService`).\n */\n closeOnConfirm?: boolean\n}\n\nconst props = withDefaults(defineProps<GrPromptDialogProps>(), {\n title: undefined,\n description: undefined,\n label: undefined,\n placeholder: undefined,\n closeOnBackdrop: true,\n closeOnEsc: true,\n showHeader: true,\n showCloseButton: true,\n size: 'md',\n headerConfig: undefined,\n footerConfig: undefined,\n bodyConfig: undefined,\n closeLabel: undefined,\n buttonSize: undefined,\n confirmText: undefined,\n cancelText: undefined,\n requiredErrorText: undefined,\n confirmVariant: 'primary',\n confirmTone: 'primary',\n required: true,\n error: null,\n fieldError: null,\n confirmLoading: false,\n confirmDisabled: false,\n closeOnConfirm: true,\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: boolean): void\n (e: 'update:value', value: string): void\n (e: 'confirm', value: string): void\n (e: 'cancel'): void\n}>()\n\n// Дефолты берём из общего i18n-блока пакета (fallback — англ.), а не хардкодим.\nconst { t } = useGranularityTranslations()\nconst resolvedTitle = computed(() => props.title ?? t('gr.dialog.prompt.title', 'Prompt'))\nconst resolvedLabel = computed(() => props.label ?? t('gr.dialog.prompt.label', 'Value'))\nconst resolvedRequiredErrorText = computed(() => props.requiredErrorText ?? t('gr.dialog.prompt.required', 'Enter a value.'))\nconst resolvedCloseLabel = computed(() => props.closeLabel ?? t('gr.common.close', 'Close'))\nconst resolvedConfirmText = computed(() => props.confirmText ?? t('gr.common.confirm', 'Confirm'))\nconst resolvedCancelText = computed(() => props.cancelText ?? t('gr.common.cancel', 'Cancel'))\n\nconst open = computed({\n get: () => props.modelValue,\n set: (v: boolean) => emit('update:modelValue', v),\n})\n\nconst valueModel = computed({\n get: () => props.value,\n set: (v: string) => emit('update:value', v),\n})\n\nconst touched = ref(false)\nconst inputRef = ref<InstanceType<typeof GrInput> | null>(null)\n\nwatch(\n () => props.modelValue,\n (v) => {\n if (v) touched.value = false\n },\n)\n\nconst canConfirm = computed(() => {\n if (!props.required) return true\n return valueModel.value.trim().length > 0\n})\n\nconst validationError = computed(() => {\n if (!props.required) return undefined\n if (!touched.value) return undefined\n return valueModel.value.trim().length > 0\n ? undefined\n : resolvedRequiredErrorText.value\n})\n\n// Внешняя ошибка поля (серверная валидация) имеет приоритет над встроенной.\nconst fieldErrorMessage = computed(() => props.fieldError ?? validationError.value ?? undefined)\n\nfunction onCancel(): void {\n emit('cancel')\n emit('update:modelValue', false)\n}\n\nfunction onConfirm(): void {\n if (!canConfirm.value) {\n touched.value = true\n inputRef.value?.focus()\n return\n }\n\n emit('confirm', valueModel.value)\n if (props.closeOnConfirm)\n emit('update:modelValue', false)\n}\n</script>\n\n<template>\n <GrDialog\n v-model=\"open\"\n :title=\"resolvedTitle\"\n :size=\"size\"\n :close-on-backdrop=\"closeOnBackdrop\"\n :close-on-esc=\"closeOnEsc\"\n :show-header=\"showHeader\"\n :show-close-button=\"showCloseButton\"\n :header-config=\"headerConfig\"\n :footer-config=\"footerConfig\"\n :body-config=\"bodyConfig\"\n :close-label=\"resolvedCloseLabel\"\n >\n <div class=\"grid gap-4\">\n <slot>\n <div v-if=\"description\" class=\"text-[14px] text-[var(--gr-muted-fg)]\">\n {{ description }}\n </div>\n </slot>\n\n <GrFormField :label=\"resolvedLabel\" :error=\"fieldErrorMessage\" for-id=\"gr-prompt-input\">\n <GrInput\n id=\"gr-prompt-input\"\n ref=\"inputRef\"\n v-model=\"valueModel\"\n data-testid=\"gr-prompt-input\"\n :placeholder=\"placeholder\"\n :invalid=\"!!fieldErrorMessage\"\n @blur=\"touched = true\"\n />\n </GrFormField>\n\n <slot name=\"error\" :error=\"error\">\n <GrResponseErrorBanner v-if=\"error\" :error=\"error\" :can-dismiss=\"false\" />\n </slot>\n </div>\n\n <template #footer>\n <slot name=\"footer\">\n <div class=\"flex items-center justify-end gap-3\">\n <GrButton data-testid=\"gr-prompt-cancel\" variant=\"outline\" :size=\"buttonSize\" @click=\"onCancel\">\n {{ resolvedCancelText }}\n </GrButton>\n <GrButton\n data-testid=\"gr-prompt-confirm\"\n :variant=\"confirmVariant\"\n :tone=\"confirmTone\"\n :size=\"buttonSize\"\n :loading=\"confirmLoading\"\n :disabled=\"confirmDisabled || (required && touched && !canConfirm)\"\n @click=\"onConfirm\"\n >\n {{ resolvedConfirmText }}\n </GrButton>\n </div>\n </slot>\n </template>\n </GrDialog>\n</template>\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { t as GrPromptDialog_default } from "./chunks/GrPromptDialog-C-_BMNuY.js";
2
- import { t as grPromptDialogConfig } from "../../chunks/config-BUHuGBik.js";
1
+ import { t as GrPromptDialog_default } from "./chunks/GrPromptDialog-DNUjRVB9.js";
2
+ import { t as grPromptDialogConfig } from "../../chunks/config-BUHuGBik2.js";
3
3
  export { GrPromptDialog_default as GrPromptDialog, GrPromptDialog_default as default, grPromptDialogConfig };
@@ -1,4 +1,5 @@
1
- import { a as grRadioDotBaseClass, i as grRadioControlClass, o as grRadioDotClass, r as grRadioButtonClass, s as grRadioRootClass } from "../../../chunks/config-CrG1XiE72.js";
1
+ import { o as useGrComponentSize } from "../../../chunks/context-DfWYCBB-.js";
2
+ import { a as grRadioDotBaseClass, i as grRadioControlClass, o as grRadioDotClass, r as grRadioButtonClass, s as grRadioRootClass } from "../../../chunks/config-C4hJxXDa.js";
2
3
  import { computed, createElementBlock, createElementVNode, defineComponent, inject, normalizeClass, openBlock, renderSlot, unref, withKeys, withModifiers } from "vue";
3
4
  //#region src/components/GrRadio/grRadioGroupContext.ts
4
5
  var GR_RADIO_GROUP_CONTEXT = Symbol("GR_RADIO_GROUP_CONTEXT");
@@ -36,7 +37,7 @@ var _hoisted_4 = [
36
37
  "required",
37
38
  "form"
38
39
  ];
39
- var _hoisted_5 = { class: "text-sm text-[var(--muted-fg)]" };
40
+ var _hoisted_5 = { class: "text-sm text-[var(--gr-muted-fg)]" };
40
41
  //#endregion
41
42
  //#region src/components/GrRadio/GrRadio.vue
42
43
  var GrRadio_default = /* @__PURE__ */ defineComponent({
@@ -87,10 +88,7 @@ var GrRadio_default = /* @__PURE__ */ defineComponent({
87
88
  if (props.name) return props.name;
88
89
  return group?.name.value;
89
90
  });
90
- const resolvedSize = computed(() => {
91
- if (props.size) return props.size;
92
- return group?.size.value ?? "md";
93
- });
91
+ const resolvedSize = useGrComponentSize(() => props.size ?? group?.size.value, { component: "GrRadio" });
94
92
  const checked = computed(() => resolvedModelValue.value === props.value);
95
93
  const buttonClassName = computed(() => {
96
94
  return grRadioButtonClass({
@@ -150,7 +148,7 @@ var GrRadio_default = /* @__PURE__ */ defineComponent({
150
148
  "aria-label": __props.ariaLabel,
151
149
  "aria-disabled": resolvedDisabled.value ? "true" : void 0,
152
150
  tabindex: resolvedDisabled.value ? -1 : 0,
153
- class: normalizeClass(["inline-flex items-center gap-2 select-none focus-visible:outline-none focus-visible:rounded-[8px] focus-visible:shadow-[0_0_0_2px_var(--ring),0_0_0_4px_var(--bg)]", rootClassName.value]),
151
+ class: normalizeClass(["inline-flex items-center gap-2 select-none focus-visible:outline-none focus-visible:rounded-[8px] focus-visible:shadow-[0_0_0_2px_var(--gr-ring),0_0_0_4px_var(--gr-bg)]", rootClassName.value]),
154
152
  onClick: onButtonClick,
155
153
  onKeydown: [withKeys(withModifiers(onButtonClick, ["prevent"]), ["space"]), withKeys(withModifiers(onButtonClick, ["prevent"]), ["enter"])]
156
154
  }, [
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrRadio-DlhxPGqf.js","names":[],"sources":["../../../../src/components/GrRadio/grRadioGroupContext.ts","../../../../src/components/GrRadio/GrRadio.vue","../../../../src/components/GrRadio/GrRadio.vue"],"sourcesContent":["import type { ComputedRef, InjectionKey } from 'vue'\n\nimport type { GrButtonSize } from '../GrButton/grButtonStyles'\n\nexport type GrRadioGroupContext = {\n modelValue: ComputedRef<string>\n name: ComputedRef<string | undefined>\n disabled: ComputedRef<boolean>\n size: ComputedRef<GrButtonSize>\n setValue: (value: string) => void\n}\n\nexport const GR_RADIO_GROUP_CONTEXT: InjectionKey<GrRadioGroupContext> = Symbol('GR_RADIO_GROUP_CONTEXT')","<script setup lang=\"ts\">\nimport { computed, inject } from 'vue'\n\nimport { useGrComponentSize } from '../GrConfigProvider/context'\n\nimport type { GrButtonSize, GrButtonTone, GrButtonVariant } from '../GrButton'\n\nimport {\n grRadioButtonClass,\n grRadioControlClass,\n grRadioDotBaseClass,\n grRadioDotClass,\n grRadioRootClass,\n type GrRadioVariant,\n} from './grRadioStyles'\nimport { GR_RADIO_GROUP_CONTEXT } from './grRadioGroupContext'\n\n/**\n * GrRadio — одиночный элемент группы выбора.\n *\n * Может работать автономно (через `v-model`) либо внутри `GrRadioGroup`\n * (тогда `modelValue`/`disabled`/`size`/`name` приходят через `inject`).\n *\n * @prop value — значение этого элемента, сравнивается с `modelValue` группы.\n * @prop variant — визуальное представление: `radiobox` (круг+dot) или `button` (стиль `GrButton`).\n */\nexport interface GrRadioProps {\n value: string\n modelValue?: string\n disabled?: boolean\n name?: string\n required?: boolean\n form?: string\n id?: string\n size?: GrButtonSize\n variant?: GrRadioVariant\n buttonVariant?: GrButtonVariant\n buttonTone?: GrButtonTone\n selectedButtonVariant?: GrButtonVariant\n selectedButtonTone?: GrButtonTone\n ariaLabel?: string\n}\n\nconst hiddenInputStyle = {\n position: 'absolute',\n opacity: '0',\n width: '0',\n height: '0',\n pointerEvents: 'none',\n} as const\n\nconst props = withDefaults(defineProps<GrRadioProps>(), {\n modelValue: undefined,\n disabled: undefined,\n name: undefined,\n required: false,\n form: undefined,\n id: undefined,\n size: undefined,\n variant: 'radiobox',\n buttonVariant: 'outline',\n buttonTone: 'neutral',\n selectedButtonVariant: 'primary',\n selectedButtonTone: 'primary',\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: string): void\n}>()\n\nconst group = inject(GR_RADIO_GROUP_CONTEXT, null)\n\nconst resolvedModelValue = computed(() => {\n if (props.modelValue !== undefined)\n return props.modelValue\n\n return group?.modelValue.value ?? ''\n})\n\nconst resolvedDisabled = computed(() => {\n if (props.disabled !== undefined)\n return props.disabled\n\n return group?.disabled.value ?? false\n})\n\nconst resolvedName = computed(() => {\n if (props.name)\n return props.name\n\n return group?.name.value\n})\n\n// Приоритет: локальный проп → размер группы → `GrConfigProvider` → `md`.\n// Группа специфичнее конфига, поэтому её значение подаётся как «локальное».\nconst resolvedSize = useGrComponentSize(\n () => props.size ?? group?.size.value,\n { component: 'GrRadio' },\n)\n\nconst checked = computed(() => resolvedModelValue.value === props.value)\n\nconst buttonClassName = computed(() => {\n return grRadioButtonClass({\n checked: checked.value,\n disabled: resolvedDisabled.value,\n size: resolvedSize.value,\n buttonVariant: props.buttonVariant,\n buttonTone: props.buttonTone,\n selectedButtonVariant: props.selectedButtonVariant,\n selectedButtonTone: props.selectedButtonTone,\n })\n})\n\nconst rootClassName = computed(() => grRadioRootClass(resolvedDisabled.value))\nconst controlClassName = computed(() => grRadioControlClass(checked.value))\nconst dotClassName = computed(() => grRadioDotClass(checked.value))\n\nfunction setValue(next: string): void {\n if (resolvedDisabled.value)\n return\n\n if (props.modelValue !== undefined) {\n emit('update:modelValue', next)\n return\n }\n\n group?.setValue(next)\n}\n\nfunction onButtonClick(): void {\n setValue(props.value)\n}\n</script>\n\n<template>\n <div\n v-if=\"variant === 'button'\"\n data-gr-button\n data-gr-radio\n role=\"radio\"\n :aria-checked=\"checked ? 'true' : 'false'\"\n :aria-label=\"ariaLabel\"\n :aria-disabled=\"resolvedDisabled ? 'true' : undefined\"\n :tabindex=\"resolvedDisabled ? -1 : 0\"\n :class=\"buttonClassName\"\n @click=\"onButtonClick\"\n @keydown.space.prevent=\"onButtonClick\"\n @keydown.enter.prevent=\"onButtonClick\"\n >\n <input\n :id=\"id\"\n type=\"radio\"\n :checked=\"checked\"\n :disabled=\"resolvedDisabled\"\n :name=\"resolvedName\"\n :value=\"value\"\n :required=\"required\"\n :form=\"form\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n :style=\"hiddenInputStyle\"\n >\n\n <slot />\n </div>\n\n <div\n v-else\n data-gr-radio\n role=\"radio\"\n :aria-checked=\"checked ? 'true' : 'false'\"\n :aria-label=\"ariaLabel\"\n :aria-disabled=\"resolvedDisabled ? 'true' : undefined\"\n :tabindex=\"resolvedDisabled ? -1 : 0\"\n class=\"inline-flex items-center gap-2 select-none focus-visible:outline-none focus-visible:rounded-[8px] focus-visible:shadow-[0_0_0_2px_var(--gr-ring),0_0_0_4px_var(--gr-bg)]\"\n :class=\"rootClassName\"\n @click=\"onButtonClick\"\n @keydown.space.prevent=\"onButtonClick\"\n @keydown.enter.prevent=\"onButtonClick\"\n >\n <input\n :id=\"id\"\n type=\"radio\"\n :checked=\"checked\"\n :disabled=\"resolvedDisabled\"\n :name=\"resolvedName\"\n :value=\"value\"\n :required=\"required\"\n :form=\"form\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n :style=\"hiddenInputStyle\"\n >\n\n <span\n data-gr-radio-control\n aria-hidden=\"true\"\n class=\"h-4 w-4 rounded-full border flex items-center justify-center transition-colors duration-150\"\n :class=\"controlClassName\"\n >\n <span\n data-gr-radio-dot\n :class=\"[grRadioDotBaseClass, dotClassName]\"\n />\n </span>\n\n <span class=\"text-sm text-[var(--gr-muted-fg)]\">\n <slot />\n </span>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject } from 'vue'\n\nimport { useGrComponentSize } from '../GrConfigProvider/context'\n\nimport type { GrButtonSize, GrButtonTone, GrButtonVariant } from '../GrButton'\n\nimport {\n grRadioButtonClass,\n grRadioControlClass,\n grRadioDotBaseClass,\n grRadioDotClass,\n grRadioRootClass,\n type GrRadioVariant,\n} from './grRadioStyles'\nimport { GR_RADIO_GROUP_CONTEXT } from './grRadioGroupContext'\n\n/**\n * GrRadio — одиночный элемент группы выбора.\n *\n * Может работать автономно (через `v-model`) либо внутри `GrRadioGroup`\n * (тогда `modelValue`/`disabled`/`size`/`name` приходят через `inject`).\n *\n * @prop value — значение этого элемента, сравнивается с `modelValue` группы.\n * @prop variant — визуальное представление: `radiobox` (круг+dot) или `button` (стиль `GrButton`).\n */\nexport interface GrRadioProps {\n value: string\n modelValue?: string\n disabled?: boolean\n name?: string\n required?: boolean\n form?: string\n id?: string\n size?: GrButtonSize\n variant?: GrRadioVariant\n buttonVariant?: GrButtonVariant\n buttonTone?: GrButtonTone\n selectedButtonVariant?: GrButtonVariant\n selectedButtonTone?: GrButtonTone\n ariaLabel?: string\n}\n\nconst hiddenInputStyle = {\n position: 'absolute',\n opacity: '0',\n width: '0',\n height: '0',\n pointerEvents: 'none',\n} as const\n\nconst props = withDefaults(defineProps<GrRadioProps>(), {\n modelValue: undefined,\n disabled: undefined,\n name: undefined,\n required: false,\n form: undefined,\n id: undefined,\n size: undefined,\n variant: 'radiobox',\n buttonVariant: 'outline',\n buttonTone: 'neutral',\n selectedButtonVariant: 'primary',\n selectedButtonTone: 'primary',\n ariaLabel: undefined,\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: string): void\n}>()\n\nconst group = inject(GR_RADIO_GROUP_CONTEXT, null)\n\nconst resolvedModelValue = computed(() => {\n if (props.modelValue !== undefined)\n return props.modelValue\n\n return group?.modelValue.value ?? ''\n})\n\nconst resolvedDisabled = computed(() => {\n if (props.disabled !== undefined)\n return props.disabled\n\n return group?.disabled.value ?? false\n})\n\nconst resolvedName = computed(() => {\n if (props.name)\n return props.name\n\n return group?.name.value\n})\n\n// Приоритет: локальный проп → размер группы → `GrConfigProvider` → `md`.\n// Группа специфичнее конфига, поэтому её значение подаётся как «локальное».\nconst resolvedSize = useGrComponentSize(\n () => props.size ?? group?.size.value,\n { component: 'GrRadio' },\n)\n\nconst checked = computed(() => resolvedModelValue.value === props.value)\n\nconst buttonClassName = computed(() => {\n return grRadioButtonClass({\n checked: checked.value,\n disabled: resolvedDisabled.value,\n size: resolvedSize.value,\n buttonVariant: props.buttonVariant,\n buttonTone: props.buttonTone,\n selectedButtonVariant: props.selectedButtonVariant,\n selectedButtonTone: props.selectedButtonTone,\n })\n})\n\nconst rootClassName = computed(() => grRadioRootClass(resolvedDisabled.value))\nconst controlClassName = computed(() => grRadioControlClass(checked.value))\nconst dotClassName = computed(() => grRadioDotClass(checked.value))\n\nfunction setValue(next: string): void {\n if (resolvedDisabled.value)\n return\n\n if (props.modelValue !== undefined) {\n emit('update:modelValue', next)\n return\n }\n\n group?.setValue(next)\n}\n\nfunction onButtonClick(): void {\n setValue(props.value)\n}\n</script>\n\n<template>\n <div\n v-if=\"variant === 'button'\"\n data-gr-button\n data-gr-radio\n role=\"radio\"\n :aria-checked=\"checked ? 'true' : 'false'\"\n :aria-label=\"ariaLabel\"\n :aria-disabled=\"resolvedDisabled ? 'true' : undefined\"\n :tabindex=\"resolvedDisabled ? -1 : 0\"\n :class=\"buttonClassName\"\n @click=\"onButtonClick\"\n @keydown.space.prevent=\"onButtonClick\"\n @keydown.enter.prevent=\"onButtonClick\"\n >\n <input\n :id=\"id\"\n type=\"radio\"\n :checked=\"checked\"\n :disabled=\"resolvedDisabled\"\n :name=\"resolvedName\"\n :value=\"value\"\n :required=\"required\"\n :form=\"form\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n :style=\"hiddenInputStyle\"\n >\n\n <slot />\n </div>\n\n <div\n v-else\n data-gr-radio\n role=\"radio\"\n :aria-checked=\"checked ? 'true' : 'false'\"\n :aria-label=\"ariaLabel\"\n :aria-disabled=\"resolvedDisabled ? 'true' : undefined\"\n :tabindex=\"resolvedDisabled ? -1 : 0\"\n class=\"inline-flex items-center gap-2 select-none focus-visible:outline-none focus-visible:rounded-[8px] focus-visible:shadow-[0_0_0_2px_var(--gr-ring),0_0_0_4px_var(--gr-bg)]\"\n :class=\"rootClassName\"\n @click=\"onButtonClick\"\n @keydown.space.prevent=\"onButtonClick\"\n @keydown.enter.prevent=\"onButtonClick\"\n >\n <input\n :id=\"id\"\n type=\"radio\"\n :checked=\"checked\"\n :disabled=\"resolvedDisabled\"\n :name=\"resolvedName\"\n :value=\"value\"\n :required=\"required\"\n :form=\"form\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n :style=\"hiddenInputStyle\"\n >\n\n <span\n data-gr-radio-control\n aria-hidden=\"true\"\n class=\"h-4 w-4 rounded-full border flex items-center justify-center transition-colors duration-150\"\n :class=\"controlClassName\"\n >\n <span\n data-gr-radio-dot\n :class=\"[grRadioDotBaseClass, dotClassName]\"\n />\n </span>\n\n <span class=\"text-sm text-[var(--gr-muted-fg)]\">\n <slot />\n </span>\n </div>\n</template>\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { n as grRadioSafelist, t as grRadioConfig } from "../../chunks/config-CrG1XiE72.js";
2
- import { n as GR_RADIO_GROUP_CONTEXT, t as GrRadio_default } from "./chunks/GrRadio-Dr-pvs_9.js";
1
+ import { n as grRadioSafelist, t as grRadioConfig } from "../../chunks/config-C4hJxXDa.js";
2
+ import { n as GR_RADIO_GROUP_CONTEXT, t as GrRadio_default } from "./chunks/GrRadio-DlhxPGqf.js";
3
3
  export { GR_RADIO_GROUP_CONTEXT, GrRadio_default as GrRadio, GrRadio_default as default, grRadioConfig, grRadioSafelist };
@@ -1,6 +1,7 @@
1
+ import { o as useGrComponentSize } from "../../../chunks/context-DfWYCBB-.js";
1
2
  import { t as GrButtonGroup_default } from "../../GrButtonGroup/chunks/GrButtonGroup-Bs9dEKfA.js";
2
- import { n as GR_RADIO_GROUP_CONTEXT, t as GrRadio_default } from "../../GrRadio/chunks/GrRadio-Dr-pvs_9.js";
3
- import { Fragment, computed, createBlock, createElementBlock, createTextVNode, defineComponent, openBlock, provide, renderList, renderSlot, toDisplayString, withCtx } from "vue";
3
+ import { n as GR_RADIO_GROUP_CONTEXT, t as GrRadio_default } from "../../GrRadio/chunks/GrRadio-DlhxPGqf.js";
4
+ import { Fragment, computed, createBlock, createElementBlock, createTextVNode, defineComponent, openBlock, provide, renderList, renderSlot, toDisplayString, unref, withCtx } from "vue";
4
5
  //#region src/components/GrRadioGroup/GrRadioGroup.vue?vue&type=script&setup=true&lang.ts
5
6
  var _hoisted_1 = ["aria-label", "aria-disabled"];
6
7
  var _hoisted_2 = {
@@ -24,12 +25,13 @@ var GrRadioGroup_default = /* @__PURE__ */ defineComponent({
24
25
  default: false
25
26
  },
26
27
  variant: { default: "radiobox" },
27
- size: { default: "md" },
28
+ size: { default: void 0 },
28
29
  ariaLabel: { default: void 0 }
29
30
  },
30
31
  emits: ["update:modelValue"],
31
32
  setup(__props, { emit: __emit }) {
32
33
  const props = __props;
34
+ const resolvedSize = useGrComponentSize(() => props.size, { component: "GrRadioGroup" });
33
35
  const emit = __emit;
34
36
  function setValue(next) {
35
37
  if (props.disabled) return;
@@ -39,7 +41,7 @@ var GrRadioGroup_default = /* @__PURE__ */ defineComponent({
39
41
  modelValue: computed(() => props.modelValue),
40
42
  name: computed(() => props.name),
41
43
  disabled: computed(() => props.disabled),
42
- size: computed(() => props.size),
44
+ size: resolvedSize,
43
45
  setValue
44
46
  });
45
47
  return (_ctx, _cache) => {
@@ -57,7 +59,7 @@ var GrRadioGroup_default = /* @__PURE__ */ defineComponent({
57
59
  key: opt.value,
58
60
  value: opt.value,
59
61
  variant: "button",
60
- size: __props.size
62
+ size: unref(resolvedSize)
61
63
  }, {
62
64
  default: withCtx(() => [createTextVNode(toDisplayString(opt.label), 1)]),
63
65
  _: 2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrRadioGroup-BXt9iw4q.js","names":["$slots"],"sources":["../../../../src/components/GrRadioGroup/GrRadioGroup.vue","../../../../src/components/GrRadioGroup/GrRadioGroup.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, provide } from 'vue'\n\nimport { useGrComponentSize } from '../GrConfigProvider/context'\n\nimport type { GrButtonSize } from '../GrButton'\nimport GrButtonGroup from '../GrButtonGroup/GrButtonGroup.vue'\nimport GrRadio from '../GrRadio/GrRadio.vue'\nimport { GR_RADIO_GROUP_CONTEXT } from '../GrRadio'\n\nexport type GrRadioGroupVariant = 'radiobox' | 'button'\nexport interface GrRadioGroupOption { value: string, label: string }\n\n/**\n * GrRadioGroup — контейнер группы `GrRadio`.\n *\n * Может работать как через слот (ручной рендер `GrRadio`), так и через проп `options`.\n * Предоставляет дочерним `GrRadio` общий `modelValue`/`disabled`/`size`/`name` через `inject`.\n */\nexport interface GrRadioGroupProps {\n modelValue: string\n options?: GrRadioGroupOption[]\n name?: string\n disabled?: boolean\n variant?: GrRadioGroupVariant\n size?: GrButtonSize\n ariaLabel?: string\n}\n\nconst props = withDefaults(defineProps<GrRadioGroupProps>(), {\n options: undefined,\n name: undefined,\n disabled: false,\n variant: 'radiobox',\n size: undefined,\n ariaLabel: undefined,\n})\n\n// Эффективный размер группы: локальный проп → `GrConfigProvider` → `md`.\n// Дочерние `GrRadio` получают уже разрешённое значение через контекст, поэтому\n// провайдер работает и для них — без второго чтения конфига.\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrRadioGroup' })\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: string): void\n}>()\n\nfunction setValue(next: string): void {\n if (props.disabled)\n return\n emit('update:modelValue', next)\n}\n\nprovide(GR_RADIO_GROUP_CONTEXT, {\n modelValue: computed(() => props.modelValue),\n name: computed(() => props.name),\n disabled: computed(() => props.disabled),\n size: resolvedSize,\n setValue,\n})\n</script>\n\n<template>\n <div\n data-gr-radio-group\n role=\"radiogroup\"\n :aria-label=\"ariaLabel\"\n :aria-disabled=\"disabled ? 'true' : undefined\"\n >\n <template v-if=\"$slots.default\">\n <GrButtonGroup v-if=\"variant === 'button'\">\n <slot />\n </GrButtonGroup>\n <div v-else class=\"grid gap-2\">\n <slot />\n </div>\n </template>\n <template v-else>\n <GrButtonGroup v-if=\"variant === 'button'\">\n <GrRadio\n v-for=\"opt in options ?? []\"\n :key=\"opt.value\"\n :value=\"opt.value\"\n variant=\"button\"\n :size=\"resolvedSize\"\n >\n {{ opt.label }}\n </GrRadio>\n </GrButtonGroup>\n <div v-else class=\"grid gap-2\">\n <GrRadio v-for=\"opt in options ?? []\" :key=\"opt.value\" :value=\"opt.value\">\n {{ opt.label }}\n </GrRadio>\n </div>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, provide } from 'vue'\n\nimport { useGrComponentSize } from '../GrConfigProvider/context'\n\nimport type { GrButtonSize } from '../GrButton'\nimport GrButtonGroup from '../GrButtonGroup/GrButtonGroup.vue'\nimport GrRadio from '../GrRadio/GrRadio.vue'\nimport { GR_RADIO_GROUP_CONTEXT } from '../GrRadio'\n\nexport type GrRadioGroupVariant = 'radiobox' | 'button'\nexport interface GrRadioGroupOption { value: string, label: string }\n\n/**\n * GrRadioGroup — контейнер группы `GrRadio`.\n *\n * Может работать как через слот (ручной рендер `GrRadio`), так и через проп `options`.\n * Предоставляет дочерним `GrRadio` общий `modelValue`/`disabled`/`size`/`name` через `inject`.\n */\nexport interface GrRadioGroupProps {\n modelValue: string\n options?: GrRadioGroupOption[]\n name?: string\n disabled?: boolean\n variant?: GrRadioGroupVariant\n size?: GrButtonSize\n ariaLabel?: string\n}\n\nconst props = withDefaults(defineProps<GrRadioGroupProps>(), {\n options: undefined,\n name: undefined,\n disabled: false,\n variant: 'radiobox',\n size: undefined,\n ariaLabel: undefined,\n})\n\n// Эффективный размер группы: локальный проп → `GrConfigProvider` → `md`.\n// Дочерние `GrRadio` получают уже разрешённое значение через контекст, поэтому\n// провайдер работает и для них — без второго чтения конфига.\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrRadioGroup' })\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: string): void\n}>()\n\nfunction setValue(next: string): void {\n if (props.disabled)\n return\n emit('update:modelValue', next)\n}\n\nprovide(GR_RADIO_GROUP_CONTEXT, {\n modelValue: computed(() => props.modelValue),\n name: computed(() => props.name),\n disabled: computed(() => props.disabled),\n size: resolvedSize,\n setValue,\n})\n</script>\n\n<template>\n <div\n data-gr-radio-group\n role=\"radiogroup\"\n :aria-label=\"ariaLabel\"\n :aria-disabled=\"disabled ? 'true' : undefined\"\n >\n <template v-if=\"$slots.default\">\n <GrButtonGroup v-if=\"variant === 'button'\">\n <slot />\n </GrButtonGroup>\n <div v-else class=\"grid gap-2\">\n <slot />\n </div>\n </template>\n <template v-else>\n <GrButtonGroup v-if=\"variant === 'button'\">\n <GrRadio\n v-for=\"opt in options ?? []\"\n :key=\"opt.value\"\n :value=\"opt.value\"\n variant=\"button\"\n :size=\"resolvedSize\"\n >\n {{ opt.label }}\n </GrRadio>\n </GrButtonGroup>\n <div v-else class=\"grid gap-2\">\n <GrRadio v-for=\"opt in options ?? []\" :key=\"opt.value\" :value=\"opt.value\">\n {{ opt.label }}\n </GrRadio>\n </div>\n </template>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6BA,MAAM,QAAQ;EAYd,MAAM,eAAe,yBAAyB,MAAM,MAAM,EAAE,WAAW,eAAe,CAAC;EAEvF,MAAM,OAAO;EAIb,SAAS,SAAS,MAAoB;GACpC,IAAI,MAAM,UACR;GACF,KAAK,qBAAqB,IAAI;EAChC;EAEA,QAAQ,wBAAwB;GAC9B,YAAY,eAAe,MAAM,UAAU;GAC3C,MAAM,eAAe,MAAM,IAAI;GAC/B,UAAU,eAAe,MAAM,QAAQ;GACvC,MAAM;GACN;EACF,CAAC;;uBAIC,mBAgCM,OAAA;IA/BJ,uBAAA;IACA,MAAK;IACJ,cAAY,QAAA;IACZ,iBAAe,QAAA,WAAQ,SAAY,KAAA;OAEpBA,KAAAA,OAAO,WAAA,UAAA,GAAvB,mBAOW,UAAA,EAAA,KAAA,EAAA,GAAA,CANY,QAAA,YAAO,YAAA,UAAA,GAA5B,YAEgB,uBAAA,EAAA,KAAA,EAAA,GAAA;2BADN,CAAR,WAAQ,KAAA,QAAA,SAAA,CAAA,CAAA;;uBAEV,mBAEM,OAFN,YAEM,CADJ,WAAQ,KAAA,QAAA,SAAA,CAAA,CAAA,EAAA,GAAA,EAAA,MAAA,UAAA,GAGZ,mBAiBW,UAAA,EAAA,KAAA,EAAA,GAAA,CAhBY,QAAA,YAAO,YAAA,UAAA,GAA5B,YAUgB,uBAAA,EAAA,KAAA,EAAA,GAAA;2BARgB,EAAA,UAAA,IAAA,GAD9B,mBAQU,UAAA,MAAA,WAPM,QAAA,WAAO,CAAA,IAAd,QAAG;yBADZ,YAQU,iBAAA;MANP,KAAK,IAAI;MACT,OAAO,IAAI;MACZ,SAAQ;MACP,MAAM,MAAA,YAAA;;6BAEQ,CAAA,gBAAA,gBAAZ,IAAI,KAAK,GAAA,CAAA,CAAA,CAAA;;;;;uBAGhB,mBAIM,OAJN,YAIM,EAAA,UAAA,IAAA,GAHJ,mBAEU,UAAA,MAAA,WAFa,QAAA,WAAO,CAAA,IAAd,QAAG;wBAAnB,YAEU,iBAAA;KAF6B,KAAK,IAAI;KAAQ,OAAO,IAAI;;4BAClD,CAAA,gBAAA,gBAAZ,IAAI,KAAK,GAAA,CAAA,CAAA,CAAA"}
@@ -1,3 +1,3 @@
1
- import { t as GrRadioGroup_default } from "./chunks/GrRadioGroup-nOdvfV_g.js";
2
- import { t as grRadioGroupConfig } from "../../chunks/config-QaIc_gRa.js";
1
+ import { t as GrRadioGroup_default } from "./chunks/GrRadioGroup-BXt9iw4q.js";
2
+ import { t as grRadioGroupConfig } from "../../chunks/config-QaIc_gRa2.js";
3
3
  export { GrRadioGroup_default as GrRadioGroup, GrRadioGroup_default as default, grRadioGroupConfig };
@@ -0,0 +1,241 @@
1
+ import { o as useGrComponentSize } from "../../../chunks/context-DfWYCBB-.js";
2
+ import { n as useGranularityTranslations } from "../../../chunks/granularityI18n-SH0I--GW.js";
3
+ import { n as useGrFormFieldContext } from "../../../chunks/context-DdNIxa1w.js";
4
+ import { a as ratingSymbolClass, i as ratingRootClass, o as ratingTextSizeBySize, r as ratingFillClassByTone, s as ratingVoidClass } from "../../../chunks/config-CB4RVt9M.js";
5
+ import { Fragment, computed, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, defineComponent, normalizeClass, normalizeStyle, openBlock, ref, renderList, renderSlot, toDisplayString, unref } from "vue";
6
+ //#region src/components/GrRating/GrRating.vue?vue&type=script&setup=true&lang.ts
7
+ var _hoisted_1 = [
8
+ "id",
9
+ "role",
10
+ "tabindex",
11
+ "aria-label",
12
+ "aria-valuemin",
13
+ "aria-valuemax",
14
+ "aria-valuenow",
15
+ "aria-valuetext",
16
+ "aria-orientation",
17
+ "aria-disabled",
18
+ "aria-invalid",
19
+ "aria-describedby",
20
+ "aria-required"
21
+ ];
22
+ var _hoisted_2 = [
23
+ "data-testid",
24
+ "onClick",
25
+ "onMousemove"
26
+ ];
27
+ var _hoisted_3 = {
28
+ key: 1,
29
+ viewBox: "0 0 24 24",
30
+ fill: "currentColor",
31
+ class: "block h-full w-full"
32
+ };
33
+ var _hoisted_4 = {
34
+ key: 1,
35
+ viewBox: "0 0 24 24",
36
+ fill: "currentColor",
37
+ class: "block h-full w-full"
38
+ };
39
+ //#endregion
40
+ //#region src/components/GrRating/GrRating.vue
41
+ var GrRating_default = /* @__PURE__ */ defineComponent({
42
+ __name: "GrRating",
43
+ props: {
44
+ modelValue: {},
45
+ max: { default: 5 },
46
+ size: { default: void 0 },
47
+ tone: { default: "warning" },
48
+ allowHalf: {
49
+ type: Boolean,
50
+ default: false
51
+ },
52
+ readonly: {
53
+ type: Boolean,
54
+ default: false
55
+ },
56
+ disabled: {
57
+ type: Boolean,
58
+ default: false
59
+ },
60
+ clearable: {
61
+ type: Boolean,
62
+ default: false
63
+ },
64
+ icon: { default: void 0 },
65
+ showText: {
66
+ type: Boolean,
67
+ default: false
68
+ },
69
+ formatText: {
70
+ type: Function,
71
+ default: void 0
72
+ },
73
+ ariaLabel: { default: void 0 }
74
+ },
75
+ emits: [
76
+ "update:modelValue",
77
+ "change",
78
+ "hoverChange"
79
+ ],
80
+ setup(__props, { emit: __emit }) {
81
+ const props = __props;
82
+ const resolvedSize = useGrComponentSize(() => props.size, {
83
+ component: "GrRating",
84
+ supported: [
85
+ "sm",
86
+ "md",
87
+ "lg"
88
+ ]
89
+ });
90
+ const emit = __emit;
91
+ const { t } = useGranularityTranslations();
92
+ const field = useGrFormFieldContext();
93
+ const resolvedId = computed(() => field?.id.value);
94
+ const isInvalid = computed(() => Boolean(field?.invalid.value));
95
+ const describedBy = computed(() => field?.describedById.value);
96
+ const isRequired = computed(() => Boolean(field?.required.value));
97
+ /** Ввод возможен: не readonly и не disabled. */
98
+ const interactive = computed(() => !props.readonly && !props.disabled);
99
+ /**
100
+ * Роль контрола (`slider`) сохраняется и в `disabled` — отключённый слайдер это
101
+ * штатный ARIA-паттерн. А вот `readonly` — это уже не контрол, а картинка с
102
+ * подписью: на `role="img"` атрибуты `aria-value*`/`aria-disabled` запрещены
103
+ * (axe: `aria-allowed-attr`), поэтому там их не выводим вовсе.
104
+ */
105
+ const asSlider = computed(() => !props.readonly);
106
+ const step = computed(() => props.allowHalf ? .5 : 1);
107
+ const hoverValue = ref(null);
108
+ const displayValue = computed(() => hoverValue.value ?? clamp(props.modelValue));
109
+ function clamp(value) {
110
+ if (!Number.isFinite(value)) return 0;
111
+ return Math.min(props.max, Math.max(0, value));
112
+ }
113
+ /** Доля заливки символа с индексом `index` (0..1). */
114
+ function fillRatio(index) {
115
+ return Math.min(1, Math.max(0, displayValue.value - index));
116
+ }
117
+ const symbols = computed(() => Array.from({ length: props.max }, (_, index) => index));
118
+ const valueText = computed(() => t("gr.rating.valueText", "{value} of {max}", {
119
+ value: displayValue.value,
120
+ max: props.max
121
+ }));
122
+ const resolvedAriaLabel = computed(() => props.ariaLabel ?? t("gr.rating.label", "Rating"));
123
+ const text = computed(() => props.formatText ? props.formatText(displayValue.value) : String(displayValue.value));
124
+ /** Значение, соответствующее позиции курсора внутри символа `index`. */
125
+ function valueAt(index, event) {
126
+ if (!props.allowHalf) return index + 1;
127
+ const rect = event.currentTarget.getBoundingClientRect();
128
+ return rect.width > 0 && event.clientX - rect.left < rect.width / 2 ? index + .5 : index + 1;
129
+ }
130
+ function commit(value) {
131
+ const next = clamp(value);
132
+ if (next !== props.modelValue) emit("update:modelValue", next);
133
+ emit("change", next);
134
+ }
135
+ function onSymbolClick(index, event) {
136
+ if (!interactive.value) return;
137
+ const next = valueAt(index, event);
138
+ commit(props.clearable && next === props.modelValue ? 0 : next);
139
+ }
140
+ function onSymbolMouseMove(index, event) {
141
+ if (!interactive.value) return;
142
+ const next = valueAt(index, event);
143
+ if (next === hoverValue.value) return;
144
+ hoverValue.value = next;
145
+ emit("hoverChange", next);
146
+ }
147
+ function onMouseLeave() {
148
+ if (hoverValue.value === null) return;
149
+ hoverValue.value = null;
150
+ emit("hoverChange", null);
151
+ }
152
+ function onKeydown(event) {
153
+ if (!interactive.value) return;
154
+ const current = clamp(props.modelValue);
155
+ let next = null;
156
+ switch (event.key) {
157
+ case "ArrowRight":
158
+ case "ArrowUp":
159
+ next = current + step.value;
160
+ break;
161
+ case "ArrowLeft":
162
+ case "ArrowDown":
163
+ next = current - step.value;
164
+ break;
165
+ case "Home":
166
+ next = 0;
167
+ break;
168
+ case "End":
169
+ next = props.max;
170
+ break;
171
+ default: return;
172
+ }
173
+ event.preventDefault();
174
+ commit(next);
175
+ }
176
+ return (_ctx, _cache) => {
177
+ return openBlock(), createElementBlock("div", {
178
+ "data-gr-rating": "",
179
+ class: "inline-flex items-center gap-2",
180
+ onMouseleave: onMouseLeave
181
+ }, [createElementVNode("div", {
182
+ id: resolvedId.value,
183
+ "data-gr-rating-scale": "",
184
+ "data-testid": "gr-rating-scale",
185
+ class: normalizeClass(unref(ratingRootClass)({
186
+ size: unref(resolvedSize),
187
+ disabled: __props.disabled,
188
+ interactive: interactive.value
189
+ })),
190
+ role: asSlider.value ? "slider" : "img",
191
+ tabindex: asSlider.value ? __props.disabled ? -1 : 0 : void 0,
192
+ "aria-label": asSlider.value ? resolvedAriaLabel.value : `${resolvedAriaLabel.value}: ${valueText.value}`,
193
+ "aria-valuemin": asSlider.value ? 0 : void 0,
194
+ "aria-valuemax": asSlider.value ? __props.max : void 0,
195
+ "aria-valuenow": asSlider.value ? displayValue.value : void 0,
196
+ "aria-valuetext": asSlider.value ? valueText.value : void 0,
197
+ "aria-orientation": asSlider.value ? "horizontal" : void 0,
198
+ "aria-disabled": asSlider.value && __props.disabled ? "true" : void 0,
199
+ "aria-invalid": asSlider.value && isInvalid.value ? "true" : void 0,
200
+ "aria-describedby": asSlider.value ? describedBy.value : void 0,
201
+ "aria-required": asSlider.value && isRequired.value ? "true" : void 0,
202
+ onKeydown
203
+ }, [(openBlock(true), createElementBlock(Fragment, null, renderList(symbols.value, (index) => {
204
+ return openBlock(), createElementBlock("span", {
205
+ key: index,
206
+ "data-gr-rating-symbol": "",
207
+ "data-testid": `gr-rating-symbol-${index}`,
208
+ class: normalizeClass(unref(ratingSymbolClass)(unref(resolvedSize))),
209
+ onClick: ($event) => onSymbolClick(index, $event),
210
+ onMousemove: ($event) => onSymbolMouseMove(index, $event)
211
+ }, [createElementVNode("span", {
212
+ class: normalizeClass(["block h-full w-full", unref(ratingVoidClass)]),
213
+ "aria-hidden": "true"
214
+ }, [renderSlot(_ctx.$slots, "symbol", {
215
+ index,
216
+ filled: false
217
+ }, () => [__props.icon ? (openBlock(), createElementBlock("span", {
218
+ key: 0,
219
+ class: normalizeClass(["block h-full w-full", __props.icon])
220
+ }, null, 2)) : (openBlock(), createElementBlock("svg", _hoisted_3, [..._cache[0] || (_cache[0] = [createElementVNode("path", { d: "M12 2.5l2.9 6.1 6.6.9-4.8 4.7 1.2 6.6L12 17.7 6.1 20.8l1.2-6.6L2.5 9.5l6.6-.9z" }, null, -1)])]))])], 2), createElementVNode("span", {
221
+ "data-gr-rating-fill": "",
222
+ class: normalizeClass(["pointer-events-none absolute inset-y-0 left-0 overflow-hidden", unref(ratingFillClassByTone)[__props.tone]]),
223
+ style: normalizeStyle({ width: `${fillRatio(index) * 100}%` }),
224
+ "aria-hidden": "true"
225
+ }, [createElementVNode("span", { class: normalizeClass(unref(ratingSymbolClass)(unref(resolvedSize))) }, [renderSlot(_ctx.$slots, "symbol", {
226
+ index,
227
+ filled: true
228
+ }, () => [__props.icon ? (openBlock(), createElementBlock("span", {
229
+ key: 0,
230
+ class: normalizeClass(["block h-full w-full", __props.icon])
231
+ }, null, 2)) : (openBlock(), createElementBlock("svg", _hoisted_4, [..._cache[1] || (_cache[1] = [createElementVNode("path", { d: "M12 2.5l2.9 6.1 6.6.9-4.8 4.7 1.2 6.6L12 17.7 6.1 20.8l1.2-6.6L2.5 9.5l6.6-.9z" }, null, -1)])]))])], 2)], 6)], 42, _hoisted_2);
232
+ }), 128))], 42, _hoisted_1), __props.showText || _ctx.$slots.text ? (openBlock(), createElementBlock("span", {
233
+ key: 0,
234
+ "data-gr-rating-text": "",
235
+ class: normalizeClass(["text-[var(--gr-muted-fg)] [font-variant-numeric:tabular-nums]", unref(ratingTextSizeBySize)[unref(resolvedSize)]])
236
+ }, [renderSlot(_ctx.$slots, "text", { value: displayValue.value }, () => [createTextVNode(toDisplayString(text.value), 1)])], 2)) : createCommentVNode("", true)], 32);
237
+ };
238
+ }
239
+ });
240
+ //#endregion
241
+ export { GrRating_default as t };