@feugene/granularity 0.26.0 → 0.27.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 (578) hide show
  1. package/dist/chunks/classTokens-8v2XC74x.js +16 -0
  2. package/dist/chunks/classTokens-8v2XC74x.js.map +1 -0
  3. package/dist/chunks/{config-Bpt9Xbxm.js → config-2ZHRsdOc.js} +2 -2
  4. package/dist/chunks/config-2ZHRsdOc.js.map +1 -0
  5. package/dist/chunks/{config-D6W1rnlp.js → config-B0uvcTPH.js} +1 -1
  6. package/dist/chunks/{config-D6W1rnlp.js.map → config-B0uvcTPH.js.map} +1 -1
  7. package/dist/chunks/{config-Bsh948nP.js → config-B3J0alyY.js} +1 -1
  8. package/dist/chunks/{config-Bsh948nP.js.map → config-B3J0alyY.js.map} +1 -1
  9. package/dist/chunks/{config-ScuvHw6k.js → config-B5SBUa6u.js} +1 -1
  10. package/dist/chunks/{config-ScuvHw6k.js.map → config-B5SBUa6u.js.map} +1 -1
  11. package/dist/chunks/{config-BeZRuonp.js → config-BDSaD-5p.js} +1 -1
  12. package/dist/chunks/{config-BeZRuonp.js.map → config-BDSaD-5p.js.map} +1 -1
  13. package/dist/chunks/{config-Dgj1Q6JY.js → config-BEO7brpO.js} +3 -3
  14. package/dist/chunks/config-BEO7brpO.js.map +1 -0
  15. package/dist/chunks/{config-B84z1aos.js → config-BHcS5Cwm.js} +1 -1
  16. package/dist/chunks/{config-B84z1aos.js.map → config-BHcS5Cwm.js.map} +1 -1
  17. package/dist/chunks/{config-DA6SnEoy.js → config-BRESvs9g.js} +2 -2
  18. package/dist/chunks/{config-DA6SnEoy.js.map → config-BRESvs9g.js.map} +1 -1
  19. package/dist/chunks/{config-CN2ULSQL.js → config-BTmfQFwi.js} +5 -5
  20. package/dist/chunks/config-BTmfQFwi.js.map +1 -0
  21. package/dist/chunks/{config-DtgYuGUn2.js → config-BTwYMQaz2.js} +5 -3
  22. package/dist/chunks/config-BTwYMQaz2.js.map +1 -0
  23. package/dist/chunks/{config-QJ54_fcM.js → config-BaWANzzB.js} +1 -1
  24. package/dist/chunks/{config-QJ54_fcM.js.map → config-BaWANzzB.js.map} +1 -1
  25. package/dist/chunks/{config-COvrUfhR.js → config-BcXX7S7B.js} +5 -5
  26. package/dist/chunks/config-BcXX7S7B.js.map +1 -0
  27. package/dist/chunks/{config-COpuWGr_.js → config-Bd7QfiGj.js} +1 -1
  28. package/dist/chunks/{config-COpuWGr_.js.map → config-Bd7QfiGj.js.map} +1 -1
  29. package/dist/chunks/{config-BDfTXHo1.js → config-BhfNgyWL.js} +2 -2
  30. package/dist/chunks/{config-BDfTXHo1.js.map → config-BhfNgyWL.js.map} +1 -1
  31. package/dist/chunks/{config-CjnbevbD.js → config-Bjn30smH.js} +1 -1
  32. package/dist/chunks/{config-CjnbevbD.js.map → config-Bjn30smH.js.map} +1 -1
  33. package/dist/chunks/{config-CN970ZcJ.js → config-BlJa1Mj9.js} +13 -13
  34. package/dist/chunks/config-BlJa1Mj9.js.map +1 -0
  35. package/dist/chunks/{config-DU2DNSRx.js → config-BoUI0t-t.js} +1 -1
  36. package/dist/chunks/{config-DU2DNSRx.js.map → config-BoUI0t-t.js.map} +1 -1
  37. package/dist/chunks/{config-BN4sXYXn.js → config-BqT6PMzO.js} +7 -14
  38. package/dist/chunks/config-BqT6PMzO.js.map +1 -0
  39. package/dist/chunks/config-BuGlNPE9.js.map +1 -0
  40. package/dist/chunks/{config-MRvhUl-O.js → config-CJzmDHfI.js} +1 -1
  41. package/dist/chunks/{config-MRvhUl-O.js.map → config-CJzmDHfI.js.map} +1 -1
  42. package/dist/chunks/{config-DGWFal5h.js → config-CLjjjPZj.js} +7 -7
  43. package/dist/chunks/config-CLjjjPZj.js.map +1 -0
  44. package/dist/chunks/{config-Cl4ST6Qd.js → config-CQLNjc9X2.js} +2 -2
  45. package/dist/chunks/config-CQLNjc9X2.js.map +1 -0
  46. package/dist/chunks/{config-vSji8w90.js → config-CWtfxkM9.js} +9 -9
  47. package/dist/chunks/config-CWtfxkM9.js.map +1 -0
  48. package/dist/chunks/{config-DKISz9gR.js → config-CWthWcWY.js} +2 -2
  49. package/dist/chunks/{config-DKISz9gR.js.map → config-CWthWcWY.js.map} +1 -1
  50. package/dist/chunks/{config-Iu684VNI.js → config-CZPDPJlg.js} +1 -1
  51. package/dist/chunks/{config-Iu684VNI.js.map → config-CZPDPJlg.js.map} +1 -1
  52. package/dist/chunks/{config-DAX8Deh1.js → config-CbEbLyDE.js} +3 -3
  53. package/dist/chunks/config-CbEbLyDE.js.map +1 -0
  54. package/dist/chunks/{config-D94Z9po5.js → config-ChPg-BQv.js} +2 -2
  55. package/dist/chunks/config-ChPg-BQv.js.map +1 -0
  56. package/dist/chunks/{config-DSJY6aEl.js → config-CjKpUcmy.js} +17 -17
  57. package/dist/chunks/config-CjKpUcmy.js.map +1 -0
  58. package/dist/chunks/{config-BIa3ilQm.js → config-CjWOTgLL.js} +4 -4
  59. package/dist/chunks/{config-BIa3ilQm.js.map → config-CjWOTgLL.js.map} +1 -1
  60. package/dist/chunks/{config-rkcKArZQ.js → config-CnYdE3HZ2.js} +5 -5
  61. package/dist/chunks/config-CnYdE3HZ2.js.map +1 -0
  62. package/dist/chunks/{config-BE6n20np.js → config-CvbVM4ep.js} +1 -1
  63. package/dist/chunks/{config-BE6n20np.js.map → config-CvbVM4ep.js.map} +1 -1
  64. package/dist/chunks/{config-9PYRZlKE.js → config-D0NzGYaE.js} +6 -6
  65. package/dist/chunks/config-D0NzGYaE.js.map +1 -0
  66. package/dist/chunks/{config-CKULiuvc.js → config-D0W8mGFD.js} +4 -4
  67. package/dist/chunks/{config-CKULiuvc.js.map → config-D0W8mGFD.js.map} +1 -1
  68. package/dist/chunks/{config-CY0_6cMi.js → config-D82r782v.js} +1 -1
  69. package/dist/chunks/{config-CY0_6cMi.js.map → config-D82r782v.js.map} +1 -1
  70. package/dist/chunks/config-DBmdgoVf2.js.map +1 -0
  71. package/dist/chunks/{config-WTNhdh6T.js → config-DCq4JySZ.js} +2 -2
  72. package/dist/chunks/{config-WTNhdh6T.js.map → config-DCq4JySZ.js.map} +1 -1
  73. package/dist/chunks/{config-C8tVRv8i.js → config-DGC00bTp.js} +13 -13
  74. package/dist/chunks/config-DGC00bTp.js.map +1 -0
  75. package/dist/chunks/{config-BsPDQ0dS.js → config-DIDz_E5m.js} +9 -9
  76. package/dist/chunks/config-DIDz_E5m.js.map +1 -0
  77. package/dist/chunks/{config-Dguto_6o.js → config-DM0lsduD.js} +6 -6
  78. package/dist/chunks/config-DM0lsduD.js.map +1 -0
  79. package/dist/chunks/{config-BfsBepkH.js → config-DNDgp9bB.js} +5 -5
  80. package/dist/chunks/config-DNDgp9bB.js.map +1 -0
  81. package/dist/chunks/{config-DpeQchsV.js → config-DO8mjeIo.js} +2 -2
  82. package/dist/chunks/{config-DpeQchsV.js.map → config-DO8mjeIo.js.map} +1 -1
  83. package/dist/chunks/{config-Baj7Wvx-.js → config-DRbojEzO.js} +4 -4
  84. package/dist/chunks/config-DRbojEzO.js.map +1 -0
  85. package/dist/chunks/{config-CQzGyi1C.js → config-DWL81-aM.js} +1 -1
  86. package/dist/chunks/{config-CQzGyi1C.js.map → config-DWL81-aM.js.map} +1 -1
  87. package/dist/chunks/{config-esdviAPL.js → config-DZCUPHPU.js} +1 -1
  88. package/dist/chunks/{config-esdviAPL.js.map → config-DZCUPHPU.js.map} +1 -1
  89. package/dist/chunks/{config-DKdlqXiY.js → config-DcfWZOi5.js} +5 -5
  90. package/dist/chunks/config-DcfWZOi5.js.map +1 -0
  91. package/dist/chunks/{config-BC8d_smz.js → config-DeyT9dJl.js} +3 -3
  92. package/dist/chunks/{config-BC8d_smz.js.map → config-DeyT9dJl.js.map} +1 -1
  93. package/dist/chunks/{config-Cwd3yjRw.js → config-DnF472Ox.js} +6 -4
  94. package/dist/chunks/config-DnF472Ox.js.map +1 -0
  95. package/dist/chunks/{config-B_qi4Fma.js → config-DolULhjJ.js} +5 -5
  96. package/dist/chunks/config-DolULhjJ.js.map +1 -0
  97. package/dist/chunks/{config-CIcynHGr.js → config-DpAYidyY2.js} +1 -1
  98. package/dist/chunks/config-DpAYidyY2.js.map +1 -0
  99. package/dist/chunks/{config-DYgfMrIF.js → config-Dpk-eVkS.js} +1 -1
  100. package/dist/chunks/{config-DYgfMrIF.js.map → config-Dpk-eVkS.js.map} +1 -1
  101. package/dist/chunks/config-Dv_r92GL.js +35 -0
  102. package/dist/chunks/config-Dv_r92GL.js.map +1 -0
  103. package/dist/chunks/{config-B4w5gBD0.js → config-DwABJHEo.js} +2 -2
  104. package/dist/chunks/config-DwABJHEo.js.map +1 -0
  105. package/dist/chunks/{config-zjeAJ4ho2.js → config-MmPym-Z72.js} +5 -5
  106. package/dist/chunks/config-MmPym-Z72.js.map +1 -0
  107. package/dist/chunks/{config-DCFvmHEv.js → config-T3-DMXYm.js} +9 -7
  108. package/dist/chunks/config-T3-DMXYm.js.map +1 -0
  109. package/dist/chunks/{config-BoNR7_PD.js → config-Yy67uWHY.js} +1 -1
  110. package/dist/chunks/{config-BoNR7_PD.js.map → config-Yy67uWHY.js.map} +1 -1
  111. package/dist/chunks/{config-BFJIxE8b.js → config-Z5LeUXys.js} +1 -1
  112. package/dist/chunks/{config-BFJIxE8b.js.map → config-Z5LeUXys.js.map} +1 -1
  113. package/dist/chunks/{config-DWN4x6_e.js → config-_QF0O1vq.js} +9 -9
  114. package/dist/chunks/config-_QF0O1vq.js.map +1 -0
  115. package/dist/chunks/{config-Cp0DE0GH.js → config-_jO3q1Le.js} +1 -1
  116. package/dist/chunks/{config-Cp0DE0GH.js.map → config-_jO3q1Le.js.map} +1 -1
  117. package/dist/chunks/{config-DGCMHPCR.js → config-g8-JGZ_Y.js} +1 -1
  118. package/dist/chunks/{config-DGCMHPCR.js.map → config-g8-JGZ_Y.js.map} +1 -1
  119. package/dist/chunks/{config-BTCOJO5z2.js → config-jyr6AIZt2.js} +3 -3
  120. package/dist/chunks/{config-BTCOJO5z2.js.map → config-jyr6AIZt2.js.map} +1 -1
  121. package/dist/chunks/{config-BtXRpAtq.js → config-mlheIMtV.js} +3 -6
  122. package/dist/chunks/config-mlheIMtV.js.map +1 -0
  123. package/dist/chunks/{config-BEVBsvni2.js → config-rLkc9Zn2.js} +1 -1
  124. package/dist/chunks/config-rLkc9Zn2.js.map +1 -0
  125. package/dist/chunks/{config-T3qdQBgU.js → config-tiUtEn4Q.js} +1 -1
  126. package/dist/chunks/{config-T3qdQBgU.js.map → config-tiUtEn4Q.js.map} +1 -1
  127. package/dist/chunks/{config-BViooYNv.js → config-uzUuosv7.js} +7 -2
  128. package/dist/chunks/config-uzUuosv7.js.map +1 -0
  129. package/dist/chunks/{config-BbY2SKGE.js → config-vYMJ3Cr1.js} +11 -9
  130. package/dist/chunks/config-vYMJ3Cr1.js.map +1 -0
  131. package/dist/chunks/context-BfIQv7m1.js.map +1 -0
  132. package/dist/chunks/{generated-CJe6hdiE.js → generated-DJ2dJ__C.js} +48 -0
  133. package/dist/chunks/generated-DJ2dJ__C.js.map +1 -0
  134. package/dist/chunks/{grBadgeStyles-C1S56Alo.js → grBadgeStyles-D8Mz73B5.js} +4 -4
  135. package/dist/chunks/grBadgeStyles-D8Mz73B5.js.map +1 -0
  136. package/dist/chunks/{config-D7zgE_Gr.js → grChipStyles-3JZApw03.js} +21 -43
  137. package/dist/chunks/grChipStyles-3JZApw03.js.map +1 -0
  138. package/dist/chunks/{grDropdownMenuStyles-D1LOkdVj.js → grDropdownMenuStyles-DG3aYHkT.js} +3 -3
  139. package/dist/chunks/grDropdownMenuStyles-DG3aYHkT.js.map +1 -0
  140. package/dist/chunks/{grIconStyles-BwJrml2L.js → grIconStyles-B6BRqUld.js} +1 -1
  141. package/dist/chunks/{grIconStyles-BwJrml2L.js.map → grIconStyles-B6BRqUld.js.map} +1 -1
  142. package/dist/chunks/{grInputStyles-CJeMhUe5.js → grInputStyles-CAk3xKIb.js} +4 -4
  143. package/dist/chunks/grInputStyles-CAk3xKIb.js.map +1 -0
  144. package/dist/chunks/{grKbdStyles-CeZhGQHr.js → grKbdStyles-DENu8pUK.js} +5 -0
  145. package/dist/chunks/grKbdStyles-DENu8pUK.js.map +1 -0
  146. package/dist/chunks/{grLinkStyles-BoL8QYcV.js → grLinkStyles-FME_qMpi.js} +4 -4
  147. package/dist/chunks/grLinkStyles-FME_qMpi.js.map +1 -0
  148. package/dist/chunks/{grLoadingStyles-DEmji2wv.js → grLoadingStyles-CnQaf5ry.js} +1 -1
  149. package/dist/chunks/{grLoadingStyles-DEmji2wv.js.map → grLoadingStyles-CnQaf5ry.js.map} +1 -1
  150. package/dist/chunks/{grPopoverStyles-Cke_BZsM.js → grPopoverStyles-Djh5RNhn.js} +4 -4
  151. package/dist/chunks/grPopoverStyles-Djh5RNhn.js.map +1 -0
  152. package/dist/chunks/{grRadioStyles-BTjGNhtU.js → grRadioStyles-D4gnU65n.js} +4 -4
  153. package/dist/chunks/grRadioStyles-D4gnU65n.js.map +1 -0
  154. package/dist/chunks/{grSelectStyles-eTz4uPMP.js → grSelectStyles-Cdtd10eY.js} +9 -9
  155. package/dist/chunks/grSelectStyles-Cdtd10eY.js.map +1 -0
  156. package/dist/chunks/{grTableStyles-C-iaqQUN.js → grTableStyles-uuMPSOBR.js} +2 -2
  157. package/dist/chunks/{grTableStyles-C-iaqQUN.js.map → grTableStyles-uuMPSOBR.js.map} +1 -1
  158. package/dist/chunks/{grTextareaStyles-iOcHuVMM.js → grTextareaStyles-Bp35BGna.js} +4 -4
  159. package/dist/chunks/grTextareaStyles-Bp35BGna.js.map +1 -0
  160. package/dist/chunks/{granular-provider-BaHkLjFX.js → granular-provider-DvvRayEh.js} +67 -67
  161. package/dist/chunks/{granular-provider-BaHkLjFX.js.map → granular-provider-DvvRayEh.js.map} +1 -1
  162. package/dist/chunks/numericStep-Bq2lj4ew.js +23 -0
  163. package/dist/chunks/numericStep-Bq2lj4ew.js.map +1 -0
  164. package/dist/chunks/overlayTransition-0Fj5tQbq.js +36 -0
  165. package/dist/chunks/overlayTransition-0Fj5tQbq.js.map +1 -0
  166. package/dist/chunks/{safelist-CudBLyAD.js → safelist-BOq5Li7p.js} +1 -1
  167. package/dist/chunks/{safelist-CudBLyAD.js.map → safelist-BOq5Li7p.js.map} +1 -1
  168. package/dist/chunks/{safelist-DOfCQR5O.js → safelist-CtiHPgrj.js} +2 -2
  169. package/dist/chunks/{safelist-DOfCQR5O.js.map → safelist-CtiHPgrj.js.map} +1 -1
  170. package/dist/chunks/{safelist-CkF4v7DC.js → safelist-Y3zrlhOa.js} +1 -1
  171. package/dist/chunks/{safelist-CkF4v7DC.js.map → safelist-Y3zrlhOa.js.map} +1 -1
  172. package/dist/chunks/{useMenuItemsFocus-OyOnIAlr.js → useMenuItemsFocus-B6TldmGf.js} +1 -43
  173. package/dist/chunks/useMenuItemsFocus-B6TldmGf.js.map +1 -0
  174. package/dist/chunks/useTypeahead-mxPtPBf2.js +44 -0
  175. package/dist/chunks/useTypeahead-mxPtPBf2.js.map +1 -0
  176. package/dist/components/GrAlert/chunks/{GrAlert-B21QGele.js → GrAlert-FAVf-ksH.js} +1 -1
  177. package/dist/components/GrAlert/chunks/{GrAlert-B21QGele.js.map → GrAlert-FAVf-ksH.js.map} +1 -1
  178. package/dist/components/GrAlert/index.js +1 -1
  179. package/dist/components/GrAutocomplete/chunks/{GrAutocomplete-D9c9BNFg.js → GrAutocomplete-BwhUTqmG.js} +88 -81
  180. package/dist/components/GrAutocomplete/chunks/GrAutocomplete-BwhUTqmG.js.map +1 -0
  181. package/dist/components/GrAutocomplete/index.js +2 -2
  182. package/dist/components/GrAutocomplete/styles.css +1 -1
  183. package/dist/components/GrAvatar/chunks/{GrAvatar-BbdKRX8i.js → GrAvatar-CNmLmgcr.js} +1 -1
  184. package/dist/components/GrAvatar/chunks/{GrAvatar-BbdKRX8i.js.map → GrAvatar-CNmLmgcr.js.map} +1 -1
  185. package/dist/components/GrAvatar/index.js +2 -2
  186. package/dist/components/GrBadge/chunks/{GrBadge-_9rCHuE1.js → GrBadge-BM3f9PME.js} +2 -2
  187. package/dist/components/GrBadge/chunks/GrBadge-BM3f9PME.js.map +1 -0
  188. package/dist/components/GrBadge/index.js +3 -3
  189. package/dist/components/GrBadge/styles.css +1 -1
  190. package/dist/components/GrBadgeWrap/chunks/{GrBadgeWrap-DDoFQscR.js → GrBadgeWrap-B-A3PRkE.js} +1 -1
  191. package/dist/components/GrBadgeWrap/chunks/GrBadgeWrap-B-A3PRkE.js.map +1 -0
  192. package/dist/components/GrBadgeWrap/index.js +2 -2
  193. package/dist/components/GrBottomNav/chunks/{GrBottomNav-JUu4ylYv.js → GrBottomNav-wtFatLjB.js} +1 -1
  194. package/dist/components/GrBottomNav/chunks/{GrBottomNav-JUu4ylYv.js.map → GrBottomNav-wtFatLjB.js.map} +1 -1
  195. package/dist/components/GrBottomNav/index.js +2 -2
  196. package/dist/components/GrBreadcrumbs/chunks/{GrBreadcrumbs-CQ44iU2o.js → GrBreadcrumbs-jtSnMEtg.js} +2 -2
  197. package/dist/components/GrBreadcrumbs/chunks/{GrBreadcrumbs-CQ44iU2o.js.map → GrBreadcrumbs-jtSnMEtg.js.map} +1 -1
  198. package/dist/components/GrBreadcrumbs/index.js +2 -2
  199. package/dist/components/GrButton/chunks/{GrButton-DCz-Wn-V.js → GrButton-Bw2AH4uX.js} +1 -1
  200. package/dist/components/GrButton/chunks/GrButton-Bw2AH4uX.js.map +1 -0
  201. package/dist/components/GrButton/index.js +3 -3
  202. package/dist/components/GrButtonGroup/chunks/{GrButtonGroup-BQo5VQ_c.js → GrButtonGroup-CKyiAV8K.js} +1 -1
  203. package/dist/components/GrButtonGroup/chunks/GrButtonGroup-CKyiAV8K.js.map +1 -0
  204. package/dist/components/GrButtonGroup/index.js +3 -3
  205. package/dist/components/GrCard/chunks/{GrCard-aQIjk6I9.js → GrCard-DR3ehBt8.js} +1 -1
  206. package/dist/components/GrCard/chunks/GrCard-DR3ehBt8.js.map +1 -0
  207. package/dist/components/GrCard/index.js +2 -2
  208. package/dist/components/GrCheckbox/index.js +1 -1
  209. package/dist/components/GrCheckboxGroup/index.js +1 -1
  210. package/dist/components/GrChip/chunks/{GrChip-BnL2FedO.js → GrChip-Df4orxRH.js} +15 -4
  211. package/dist/components/GrChip/chunks/GrChip-Df4orxRH.js.map +1 -0
  212. package/dist/components/GrChip/index.js +2 -2
  213. package/dist/components/GrChipGroup/chunks/{GrChipGroup-DefmSdY9.js → GrChipGroup-C78Vcwos.js} +2 -2
  214. package/dist/components/GrChipGroup/chunks/{GrChipGroup-DefmSdY9.js.map → GrChipGroup-C78Vcwos.js.map} +1 -1
  215. package/dist/components/GrChipGroup/index.js +2 -2
  216. package/dist/components/GrCodeBlock/chunks/{GrCodeBlock-CyptiEo4.js → GrCodeBlock-Dkvkr91t.js} +2 -2
  217. package/dist/components/GrCodeBlock/chunks/{GrCodeBlock-CyptiEo4.js.map → GrCodeBlock-Dkvkr91t.js.map} +1 -1
  218. package/dist/components/GrCodeBlock/index.js +2 -2
  219. package/dist/components/GrCollapse/chunks/{GrCollapse-DUROgAgc.js → GrCollapse-CytiA2Sx.js} +3 -3
  220. package/dist/components/GrCollapse/chunks/{GrCollapse-DUROgAgc.js.map → GrCollapse-CytiA2Sx.js.map} +1 -1
  221. package/dist/components/GrCollapse/index.js +2 -2
  222. package/dist/components/GrColorPicker/chunks/{GrColorPicker-CDaJRVIM.js → GrColorPicker-0n_KGeUy.js} +4 -4
  223. package/dist/components/GrColorPicker/chunks/{GrColorPicker-CDaJRVIM.js.map → GrColorPicker-0n_KGeUy.js.map} +1 -1
  224. package/dist/components/GrColorPicker/index.js +2 -2
  225. package/dist/components/GrCommandPalette/chunks/{GrCommandPalette-BPsVN_XU.js → GrCommandPalette-C5abL2Y7.js} +3 -3
  226. package/dist/components/GrCommandPalette/chunks/GrCommandPalette-C5abL2Y7.js.map +1 -0
  227. package/dist/components/GrCommandPalette/index.js +2 -2
  228. package/dist/components/GrCommandPalette/styles.css +1 -1
  229. package/dist/components/GrConfigProvider/chunks/GrConfigProvider-BF7R3hgg.js.map +1 -1
  230. package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-CwXNLyzk.js → GrConfirmDialog-B9mIU78E.js} +4 -4
  231. package/dist/components/GrConfirmDialog/chunks/GrConfirmDialog-B9mIU78E.js.map +1 -0
  232. package/dist/components/GrConfirmDialog/index.js +1 -1
  233. package/dist/components/GrContextMenu/chunks/{GrContextMenu-BbAJholy.js → GrContextMenu-DDAUvrDK.js} +3 -3
  234. package/dist/components/GrContextMenu/chunks/GrContextMenu-DDAUvrDK.js.map +1 -0
  235. package/dist/components/GrContextMenu/index.js +1 -1
  236. package/dist/components/GrDataTable/chunks/{GrDataTable-NRbrXpdx.js → GrDataTable-DU00V44y.js} +14 -4
  237. package/dist/components/GrDataTable/chunks/GrDataTable-DU00V44y.js.map +1 -0
  238. package/dist/components/GrDataTable/index.js +2 -2
  239. package/dist/components/GrDelta/chunks/{GrDelta-NE5HhXoo.js → GrDelta-04j9WmEY.js} +0 -0
  240. package/dist/components/GrDelta/chunks/{GrDelta-NE5HhXoo.js.map → GrDelta-04j9WmEY.js.map} +1 -1
  241. package/dist/components/GrDelta/index.js +2 -2
  242. package/dist/components/GrDescriptionList/chunks/{GrDescriptionList-1mICfrqX.js → GrDescriptionList-BMeCgFV3.js} +1 -1
  243. package/dist/components/GrDescriptionList/chunks/GrDescriptionList-BMeCgFV3.js.map +1 -0
  244. package/dist/components/GrDescriptionList/index.js +2 -2
  245. package/dist/components/GrDialog/chunks/{GrDialog-5Y5K87ss.js → GrDialog-bOUDYfmh.js} +2 -2
  246. package/dist/components/GrDialog/chunks/GrDialog-bOUDYfmh.js.map +1 -0
  247. package/dist/components/GrDialog/index.js +2 -2
  248. package/dist/components/GrDialogService/chunks/{GrDialogService-CHVR4sOk.js → GrDialogService-B--br5so.js} +4 -4
  249. package/dist/components/GrDialogService/chunks/{GrDialogService-CHVR4sOk.js.map → GrDialogService-B--br5so.js.map} +1 -1
  250. package/dist/components/GrDialogService/index.js +1 -1
  251. package/dist/components/GrDivider/chunks/{GrDivider-CAhm9jbE.js → GrDivider-BXavGcMX.js} +1 -1
  252. package/dist/components/GrDivider/chunks/GrDivider-BXavGcMX.js.map +1 -0
  253. package/dist/components/GrDivider/index.js +2 -2
  254. package/dist/components/GrDrawer/chunks/{GrDrawer-CXy3-SVd.js → GrDrawer-BCreL-eq.js} +3 -3
  255. package/dist/components/GrDrawer/chunks/{GrDrawer-CXy3-SVd.js.map → GrDrawer-BCreL-eq.js.map} +1 -1
  256. package/dist/components/GrDrawer/index.js +2 -2
  257. package/dist/components/GrDropdown/chunks/{GrDropdown-BfTmdPyh.js → GrDropdown-13Wt9eB_.js} +16 -8
  258. package/dist/components/GrDropdown/chunks/GrDropdown-13Wt9eB_.js.map +1 -0
  259. package/dist/components/GrDropdown/index.js +2 -2
  260. package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-l5HEqzjr.js → GrDropdownMenu-5zoOL8Oj.js} +3 -3
  261. package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu-5zoOL8Oj.js.map +1 -0
  262. package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenuList-BGA_xNVo.js → GrDropdownMenuList-CT_1TQJo.js} +1 -1
  263. package/dist/components/GrDropdownMenu/chunks/GrDropdownMenuList-CT_1TQJo.js.map +1 -0
  264. package/dist/components/GrDropdownMenu/index.js +3 -3
  265. package/dist/components/GrEmptyState/chunks/{GrEmptyState-CS9do8eM.js → GrEmptyState-D4T5pzXA.js} +2 -2
  266. package/dist/components/GrEmptyState/chunks/{GrEmptyState-CS9do8eM.js.map → GrEmptyState-D4T5pzXA.js.map} +1 -1
  267. package/dist/components/GrEmptyState/index.js +2 -2
  268. package/dist/components/GrFilePreview/chunks/{GrFilePreview-D0Bt-0nn.js → GrFilePreview-C9Z7hMK8.js} +1 -1
  269. package/dist/components/GrFilePreview/chunks/{GrFilePreview-D0Bt-0nn.js.map → GrFilePreview-C9Z7hMK8.js.map} +1 -1
  270. package/dist/components/GrFilePreview/index.js +2 -2
  271. package/dist/components/GrFileUpload/chunks/{GrFileUpload-wNXzHb5N.js → GrFileUpload-FjbaYGjL.js} +2 -2
  272. package/dist/components/GrFileUpload/chunks/{GrFileUpload-wNXzHb5N.js.map → GrFileUpload-FjbaYGjL.js.map} +1 -1
  273. package/dist/components/GrFileUpload/index.js +2 -2
  274. package/dist/components/GrForm/chunks/{GrForm-CAlJg-wb.js → GrForm-CrnfCsgj.js} +8 -2
  275. package/dist/components/GrForm/chunks/GrForm-CrnfCsgj.js.map +1 -0
  276. package/dist/components/GrForm/index.js +1 -1
  277. package/dist/components/GrFormField/chunks/GrFormField-DSylU7IU.js.map +1 -1
  278. package/dist/components/GrFormField/index.js +1 -1
  279. package/dist/components/GrFormFile/chunks/{GrFormFile-DhVkB2gm.js → GrFormFile-ChdKlN83.js} +3 -3
  280. package/dist/components/GrFormFile/chunks/{GrFormFile-DhVkB2gm.js.map → GrFormFile-ChdKlN83.js.map} +1 -1
  281. package/dist/components/GrFormFile/index.js +2 -2
  282. package/dist/components/GrFormSection/chunks/{GrFormSection-CdGWvzXO.js → GrFormSection-ejieOg9H.js} +1 -1
  283. package/dist/components/GrFormSection/chunks/{GrFormSection-CdGWvzXO.js.map → GrFormSection-ejieOg9H.js.map} +1 -1
  284. package/dist/components/GrFormSection/index.js +2 -2
  285. package/dist/components/GrIcon/chunks/{GrIcon-bQwtZtYT.js → GrIcon-Bn1XEriL.js} +1 -1
  286. package/dist/components/GrIcon/chunks/GrIcon-Bn1XEriL.js.map +1 -0
  287. package/dist/components/GrIcon/index.js +2 -2
  288. package/dist/components/GrImageViewer/chunks/{GrImageViewer-ng7el4wn.js → GrImageViewer-COUcpOgR.js} +2 -2
  289. package/dist/components/GrImageViewer/chunks/GrImageViewer-COUcpOgR.js.map +1 -0
  290. package/dist/components/GrImageViewer/index.js +2 -2
  291. package/dist/components/GrInput/chunks/{GrInput-Bb_pxqpT.js → GrInput-c53iltz0.js} +1 -1
  292. package/dist/components/GrInput/chunks/{GrInput-Bb_pxqpT.js.map → GrInput-c53iltz0.js.map} +1 -1
  293. package/dist/components/GrInput/index.js +2 -2
  294. package/dist/components/GrInputTag/chunks/{GrInputTag-UI8kIB_F.js → GrInputTag-LP3smqOv.js} +46 -49
  295. package/dist/components/GrInputTag/chunks/GrInputTag-LP3smqOv.js.map +1 -0
  296. package/dist/components/GrInputTag/index.js +2 -2
  297. package/dist/components/GrJsonViewer/chunks/{GrJsonViewer-jk3ylOTc.js → GrJsonViewer-ClTvjlFx.js} +4 -4
  298. package/dist/components/GrJsonViewer/chunks/{GrJsonViewer-jk3ylOTc.js.map → GrJsonViewer-ClTvjlFx.js.map} +1 -1
  299. package/dist/components/GrJsonViewer/index.js +2 -2
  300. package/dist/components/GrKbd/chunks/{GrKbd-BXbhsH0M.js → GrKbd-D2ga1H9i.js} +1 -1
  301. package/dist/components/GrKbd/chunks/{GrKbd-BXbhsH0M.js.map → GrKbd-D2ga1H9i.js.map} +1 -1
  302. package/dist/components/GrKbd/index.js +2 -2
  303. package/dist/components/GrLink/chunks/{GrLink-BQb7U4so.js → GrLink-DAGCFYO7.js} +2 -2
  304. package/dist/components/GrLink/chunks/GrLink-DAGCFYO7.js.map +1 -0
  305. package/dist/components/GrLink/index.js +2 -2
  306. package/dist/components/GrList/chunks/{GrList-B5bclmHV.js → GrList-DrXrKU37.js} +3 -3
  307. package/dist/components/GrList/chunks/GrList-DrXrKU37.js.map +1 -0
  308. package/dist/components/GrList/index.js +2 -2
  309. package/dist/components/GrList/styles.css +1 -1
  310. package/dist/components/GrLoading/chunks/{GrLoading-DeBFTvFX.js → GrLoading-DDD8WAIH.js} +2 -2
  311. package/dist/components/GrLoading/chunks/{GrLoading-DeBFTvFX.js.map → GrLoading-DDD8WAIH.js.map} +1 -1
  312. package/dist/components/GrLoading/index.js +2 -2
  313. package/dist/components/GrModal/index.js +1 -1
  314. package/dist/components/GrNavbar/chunks/{GrNavbar-DPj30sHX.js → GrNavbar-DhswlYyh.js} +3 -3
  315. package/dist/components/GrNavbar/chunks/{GrNavbar-DPj30sHX.js.map → GrNavbar-DhswlYyh.js.map} +1 -1
  316. package/dist/components/GrNavbar/index.js +2 -2
  317. package/dist/components/GrNumberInput/chunks/{GrNumberInput-V2mZvDDC.js → GrNumberInput-Daud9Jdm.js} +3 -14
  318. package/dist/components/GrNumberInput/chunks/GrNumberInput-Daud9Jdm.js.map +1 -0
  319. package/dist/components/GrNumberInput/index.js +2 -2
  320. package/dist/components/GrPagination/chunks/{GrPagination-DG7kp6VL.js → GrPagination-CaNTZc-v.js} +3 -3
  321. package/dist/components/GrPagination/chunks/{GrPagination-DG7kp6VL.js.map → GrPagination-CaNTZc-v.js.map} +1 -1
  322. package/dist/components/GrPagination/index.js +2 -2
  323. package/dist/components/GrPopover/chunks/{GrPopover-DDChM1jD.js → GrPopover-CofG-Tfe.js} +16 -8
  324. package/dist/components/GrPopover/chunks/GrPopover-CofG-Tfe.js.map +1 -0
  325. package/dist/components/GrPopover/index.js +2 -2
  326. package/dist/components/GrProgressBar/index.js +1 -1
  327. package/dist/components/GrProgressCircle/chunks/{GrProgressCircle-BeUx1g1f.js → GrProgressCircle-D3yWXYDa.js} +1 -1
  328. package/dist/components/GrProgressCircle/chunks/{GrProgressCircle-BeUx1g1f.js.map → GrProgressCircle-D3yWXYDa.js.map} +1 -1
  329. package/dist/components/GrProgressCircle/index.js +2 -2
  330. package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-BGuMUzlv.js → GrPromptDialog-DMhALhSS.js} +6 -6
  331. package/dist/components/GrPromptDialog/chunks/GrPromptDialog-DMhALhSS.js.map +1 -0
  332. package/dist/components/GrPromptDialog/index.js +1 -1
  333. package/dist/components/GrRadio/chunks/{GrRadio-BdhknbO8.js → GrRadio-C_rESc5g.js} +1 -1
  334. package/dist/components/GrRadio/chunks/GrRadio-C_rESc5g.js.map +1 -0
  335. package/dist/components/GrRadio/index.js +2 -2
  336. package/dist/components/GrRadioGroup/chunks/{GrRadioGroup-7w4bXIg_.js → GrRadioGroup-CdQO4G-U.js} +2 -2
  337. package/dist/components/GrRadioGroup/chunks/{GrRadioGroup-7w4bXIg_.js.map → GrRadioGroup-CdQO4G-U.js.map} +1 -1
  338. package/dist/components/GrRadioGroup/index.js +1 -1
  339. package/dist/components/GrRating/chunks/{GrRating-BSEtaibx.js → GrRating-IEiTOdnF.js} +1 -1
  340. package/dist/components/GrRating/chunks/{GrRating-BSEtaibx.js.map → GrRating-IEiTOdnF.js.map} +1 -1
  341. package/dist/components/GrRating/index.js +2 -2
  342. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-DA4q90Zt.js → GrResponseErrorBanner-C_skObtv.js} +1 -1
  343. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-DA4q90Zt.js.map → GrResponseErrorBanner-C_skObtv.js.map} +1 -1
  344. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-BhP-xw2P.js → GrResponseErrorBanner-DudGc9LO.js} +4 -4
  345. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-BhP-xw2P.js.map → GrResponseErrorBanner-DudGc9LO.js.map} +1 -1
  346. package/dist/components/GrResponseErrorBanner/index.js +2 -2
  347. package/dist/components/GrSegmented/chunks/{GrSegmented-DKpo3cnC.js → GrSegmented-CB-VR-yL.js} +1 -1
  348. package/dist/components/GrSegmented/chunks/{GrSegmented-DKpo3cnC.js.map → GrSegmented-CB-VR-yL.js.map} +1 -1
  349. package/dist/components/GrSegmented/index.js +2 -2
  350. package/dist/components/GrSelect/chunks/{GrSelect-BA1wfX3c.js → GrSelect-BE1VNTiY.js} +96 -89
  351. package/dist/components/GrSelect/chunks/GrSelect-BE1VNTiY.js.map +1 -0
  352. package/dist/components/GrSelect/index.js +2 -2
  353. package/dist/components/GrSelect/styles.css +1 -1
  354. package/dist/components/GrSidebar/chunks/{GrSidebar-DY-LgIbS.js → GrSidebar-DxPhIiWs.js} +3 -3
  355. package/dist/components/GrSidebar/chunks/{GrSidebar-DY-LgIbS.js.map → GrSidebar-DxPhIiWs.js.map} +1 -1
  356. package/dist/components/GrSidebar/index.js +2 -2
  357. package/dist/components/GrSlider/chunks/{GrSlider-s99yAyz6.js → GrSlider-DJfeEl4h.js} +5 -4
  358. package/dist/components/GrSlider/chunks/GrSlider-DJfeEl4h.js.map +1 -0
  359. package/dist/components/GrSlider/index.js +2 -2
  360. package/dist/components/GrSortableList/chunks/{GrSortableList-BMXyxmRc.js → GrSortableList-DGs3Pi2J.js} +2 -2
  361. package/dist/components/GrSortableList/chunks/{GrSortableList-BMXyxmRc.js.map → GrSortableList-DGs3Pi2J.js.map} +1 -1
  362. package/dist/components/GrSortableList/index.js +2 -2
  363. package/dist/components/GrSplitter/chunks/{GrSplitter-B9_JrT7q.js → GrSplitter-MltjaADn.js} +1 -1
  364. package/dist/components/GrSplitter/chunks/{GrSplitter-B9_JrT7q.js.map → GrSplitter-MltjaADn.js.map} +1 -1
  365. package/dist/components/GrSplitter/index.js +2 -2
  366. package/dist/components/GrStatistic/chunks/{GrStatistic-BJQv5aOS.js → GrStatistic-qHVasK37.js} +2 -2
  367. package/dist/components/GrStatistic/chunks/GrStatistic-qHVasK37.js.map +1 -0
  368. package/dist/components/GrStatistic/index.js +2 -2
  369. package/dist/components/GrSteps/chunks/{GrSteps-Cce4rfr3.js → GrSteps-C2jxpZoN.js} +1 -1
  370. package/dist/components/GrSteps/chunks/{GrSteps-Cce4rfr3.js.map → GrSteps-C2jxpZoN.js.map} +1 -1
  371. package/dist/components/GrSteps/index.js +2 -2
  372. package/dist/components/GrSwitch/chunks/{GrSwitch-CHiIj9GT.js → GrSwitch-KRlRMwgp.js} +1 -1
  373. package/dist/components/GrSwitch/chunks/{GrSwitch-CHiIj9GT.js.map → GrSwitch-KRlRMwgp.js.map} +1 -1
  374. package/dist/components/GrSwitch/index.js +2 -2
  375. package/dist/components/GrTabPanels/chunks/GrTabPanels-BZQS8-JM.js.map +1 -1
  376. package/dist/components/GrTable/chunks/{GrTable-f3qCWa99.js → GrTable-Zcdz2St_.js} +1 -1
  377. package/dist/components/GrTable/chunks/GrTable-Zcdz2St_.js.map +1 -0
  378. package/dist/components/GrTable/index.js +2 -2
  379. package/dist/components/GrTabs/chunks/{GrTabs-CBHZkOFY.js → GrTabs-ugDnkk-2.js} +2 -2
  380. package/dist/components/GrTabs/chunks/{GrTabs-CBHZkOFY.js.map → GrTabs-ugDnkk-2.js.map} +1 -1
  381. package/dist/components/GrTabs/index.js +2 -2
  382. package/dist/components/GrTextarea/chunks/{GrTextarea-CNnkcIG1.js → GrTextarea-KREK75Bu.js} +1 -1
  383. package/dist/components/GrTextarea/chunks/{GrTextarea-CNnkcIG1.js.map → GrTextarea-KREK75Bu.js.map} +1 -1
  384. package/dist/components/GrTextarea/index.js +2 -2
  385. package/dist/components/GrTimeline/chunks/{GrTimeline-DIDdkTn7.js → GrTimeline-BiHpArsg.js} +1 -1
  386. package/dist/components/GrTimeline/chunks/{GrTimeline-DIDdkTn7.js.map → GrTimeline-BiHpArsg.js.map} +1 -1
  387. package/dist/components/GrTimeline/index.js +2 -2
  388. package/dist/components/GrToaster/chunks/{GrToaster-CC49q3a4.js → GrToaster-CUi3ldJ0.js} +6 -6
  389. package/dist/components/GrToaster/chunks/GrToaster-CUi3ldJ0.js.map +1 -0
  390. package/dist/components/GrToaster/index.js +2 -2
  391. package/dist/components/GrToaster/styles.css +1 -1
  392. package/dist/components/GrTooltip/chunks/{GrTooltip-B6AwE_UX.js → GrTooltip-BKFjqu0E.js} +4 -4
  393. package/dist/components/GrTooltip/chunks/GrTooltip-BKFjqu0E.js.map +1 -0
  394. package/dist/components/GrTooltip/index.js +2 -2
  395. package/dist/components/GrTree/chunks/{GrTree-J5q8aCya.js → GrTree-D5ozu6U4.js} +15 -25
  396. package/dist/components/GrTree/chunks/GrTree-D5ozu6U4.js.map +1 -0
  397. package/dist/components/GrTree/index.js +1 -1
  398. package/dist/components/GrTree/styles.css +1 -1
  399. package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-DEfxWAc3.js → GrTreeSelect-Db_uKdNa.js} +18 -10
  400. package/dist/components/GrTreeSelect/chunks/GrTreeSelect-Db_uKdNa.js.map +1 -0
  401. package/dist/components/GrTreeSelect/index.js +2 -2
  402. package/dist/components/GrValue/chunks/{GrValue-CZsuZ4x-.js → GrValue-ezkQM05Q.js} +1 -1
  403. package/dist/components/GrValue/chunks/{GrValue-CZsuZ4x-.js.map → GrValue-ezkQM05Q.js.map} +1 -1
  404. package/dist/components/GrValue/index.js +2 -2
  405. package/dist/directives/loading.js +1 -1
  406. package/dist/granular-provider-node.js +1 -1
  407. package/dist/granular-provider.js +1 -1
  408. package/dist/index.js +143 -143
  409. package/dist/styles/tokens.css +11 -0
  410. package/dist/theme.js +1 -1
  411. package/dist/tokens.js +1 -1
  412. package/dist/types/components/GrAutocomplete/GrAutocomplete.vue.d.ts +4 -3
  413. package/dist/types/components/GrAutocomplete/grAutocompleteStyles.d.ts +2 -2
  414. package/dist/types/components/GrBadge/GrBadge.vue.d.ts +3 -3
  415. package/dist/types/components/GrBadgeWrap/GrBadgeWrap.vue.d.ts +3 -3
  416. package/dist/types/components/GrBadgeWrap/grBadgeWrapStyles.d.ts +1 -1
  417. package/dist/types/components/GrBottomNav/grBottomNavStyles.d.ts +1 -1
  418. package/dist/types/components/GrButton/GrButton.vue.d.ts +7 -7
  419. package/dist/types/components/GrButtonGroup/GrButtonGroup.vue.d.ts +3 -3
  420. package/dist/types/components/GrCard/GrCard.vue.d.ts +7 -9
  421. package/dist/types/components/GrCheckbox/GrCheckbox.vue.d.ts +1 -1
  422. package/dist/types/components/GrCheckboxGroup/GrCheckboxGroup.vue.d.ts +1 -1
  423. package/dist/types/components/GrChip/GrChip.vue.d.ts +19 -1
  424. package/dist/types/components/GrChip/grChipStyles.d.ts +10 -6
  425. package/dist/types/components/GrChipGroup/GrChipGroup.vue.d.ts +2 -2
  426. package/dist/types/components/GrCollapse/GrCollapseItem.vue.d.ts +9 -11
  427. package/dist/types/components/GrColorPicker/GrColorPicker.vue.d.ts +1 -1
  428. package/dist/types/components/GrCommandPalette/GrCommandPalette.vue.d.ts +13 -13
  429. package/dist/types/components/GrCommandPalette/grCommandPaletteStyles.d.ts +5 -5
  430. package/dist/types/components/GrConfigProvider/GrConfigProvider.vue.d.ts +3 -3
  431. package/dist/types/components/GrConfirmDialog/GrConfirmDialog.vue.d.ts +9 -9
  432. package/dist/types/components/GrContextMenu/GrContextMenu.vue.d.ts +9 -9
  433. package/dist/types/components/GrDataTable/GrDataTable.vue.d.ts +9 -17
  434. package/dist/types/components/GrDescriptionList/GrDescriptionList.vue.d.ts +16 -13
  435. package/dist/types/components/GrDialog/GrDialogFooter.vue.d.ts +3 -3
  436. package/dist/types/components/GrDivider/GrDivider.vue.d.ts +3 -3
  437. package/dist/types/components/GrDrawer/grDrawerStyles.d.ts +1 -1
  438. package/dist/types/components/GrDropdown/GrDropdown.vue.d.ts +16 -20
  439. package/dist/types/components/GrDropdownMenu/GrDropdownMenu.vue.d.ts +16 -19
  440. package/dist/types/components/GrDropdownMenu/GrDropdownMenuColumn.vue.d.ts +3 -3
  441. package/dist/types/components/GrDropdownMenu/GrDropdownMenuColumns.vue.d.ts +3 -3
  442. package/dist/types/components/GrDropdownMenu/GrDropdownMenuGroup.vue.d.ts +3 -3
  443. package/dist/types/components/GrDropdownMenu/GrDropdownMenuHeader.vue.d.ts +3 -3
  444. package/dist/types/components/GrDropdownMenu/GrDropdownMenuItem.vue.d.ts +7 -7
  445. package/dist/types/components/GrDropdownMenu/GrDropdownMenuList.vue.d.ts +3 -3
  446. package/dist/types/components/GrDropdownMenu/grDropdownMenuStyles.d.ts +3 -3
  447. package/dist/types/components/GrForm/GrForm.vue.d.ts +5 -1
  448. package/dist/types/components/GrFormField/GrFormField.vue.d.ts +11 -11
  449. package/dist/types/components/GrFormFile/GrFormFile.vue.d.ts +1 -1
  450. package/dist/types/components/GrFormSection/grFormSectionStyles.d.ts +2 -2
  451. package/dist/types/components/GrIcon/GrIcon.vue.d.ts +3 -3
  452. package/dist/types/components/GrImageViewer/GrImageViewer.vue.d.ts +6 -25
  453. package/dist/types/components/GrInput/GrInput.vue.d.ts +1 -1
  454. package/dist/types/components/GrInput/grInputStyles.d.ts +4 -4
  455. package/dist/types/components/GrInputTag/GrInputTag.vue.d.ts +2 -2
  456. package/dist/types/components/GrInputTag/grInputTagStyles.d.ts +0 -6
  457. package/dist/types/components/GrKbd/GrKbd.vue.d.ts +3 -3
  458. package/dist/types/components/GrKbd/grKbdStyles.d.ts +5 -0
  459. package/dist/types/components/GrLink/GrLink.vue.d.ts +3 -3
  460. package/dist/types/components/GrList/GrList.vue.d.ts +12 -6
  461. package/dist/types/components/GrList/GrListItem.vue.d.ts +9 -9
  462. package/dist/types/components/GrList/grListStyles.d.ts +3 -3
  463. package/dist/types/components/GrNavbar/grNavbarStyles.d.ts +1 -1
  464. package/dist/types/components/GrNumberInput/GrNumberInput.vue.d.ts +1 -1
  465. package/dist/types/components/GrNumberInput/numberInputMath.d.ts +1 -6
  466. package/dist/types/components/GrPopover/GrPopover.vue.d.ts +16 -17
  467. package/dist/types/components/GrPromptDialog/GrPromptDialog.vue.d.ts +9 -9
  468. package/dist/types/components/GrRadio/GrRadio.vue.d.ts +6 -8
  469. package/dist/types/components/GrRadioGroup/GrRadioGroup.vue.d.ts +1 -1
  470. package/dist/types/components/GrRating/GrRating.vue.d.ts +1 -1
  471. package/dist/types/components/GrSegmented/GrSegmented.vue.d.ts +1 -1
  472. package/dist/types/components/GrSelect/grSelectStyles.d.ts +1 -1
  473. package/dist/types/components/GrSidebar/GrSidebar.vue.d.ts +7 -7
  474. package/dist/types/components/GrSidebar/grSidebarStyles.d.ts +4 -4
  475. package/dist/types/components/GrSlider/GrSlider.vue.d.ts +1 -1
  476. package/dist/types/components/GrSortableList/grSortableListStyles.d.ts +2 -2
  477. package/dist/types/components/GrSplitter/GrSplitter.vue.d.ts +1 -1
  478. package/dist/types/components/GrStatistic/GrStatistic.vue.d.ts +13 -13
  479. package/dist/types/components/GrSteps/grStepsStyles.d.ts +2 -2
  480. package/dist/types/components/GrSwitch/GrSwitch.vue.d.ts +1 -1
  481. package/dist/types/components/GrTabPanels/GrTabPanel.vue.d.ts +3 -3
  482. package/dist/types/components/GrTabPanels/GrTabPanels.vue.d.ts +3 -3
  483. package/dist/types/components/GrTable/GrTable.vue.d.ts +13 -13
  484. package/dist/types/components/GrTextarea/GrTextarea.vue.d.ts +1 -1
  485. package/dist/types/components/GrTreeSelect/grTreeSelectStyles.d.ts +1 -1
  486. package/dist/types/components/shared/classTokens.d.ts +8 -0
  487. package/dist/types/components/shared/numericStep.d.ts +14 -0
  488. package/dist/types/components/shared/overlayTransition.d.ts +33 -0
  489. package/dist/web-types.json +292 -218
  490. package/package.json +2 -2
  491. package/tokens/foundation.json +41 -1
  492. package/dist/chunks/classTokens-BzazaERD.js +0 -6
  493. package/dist/chunks/classTokens-BzazaERD.js.map +0 -1
  494. package/dist/chunks/config-9PYRZlKE.js.map +0 -1
  495. package/dist/chunks/config-B4w5gBD0.js.map +0 -1
  496. package/dist/chunks/config-BEVBsvni2.js.map +0 -1
  497. package/dist/chunks/config-BN4sXYXn.js.map +0 -1
  498. package/dist/chunks/config-BViooYNv.js.map +0 -1
  499. package/dist/chunks/config-B_qi4Fma.js.map +0 -1
  500. package/dist/chunks/config-Baj7Wvx-.js.map +0 -1
  501. package/dist/chunks/config-BbY2SKGE.js.map +0 -1
  502. package/dist/chunks/config-BfsBepkH.js.map +0 -1
  503. package/dist/chunks/config-Bpt9Xbxm.js.map +0 -1
  504. package/dist/chunks/config-BsPDQ0dS.js.map +0 -1
  505. package/dist/chunks/config-BtXRpAtq.js.map +0 -1
  506. package/dist/chunks/config-BuGlNPE92.js.map +0 -1
  507. package/dist/chunks/config-C8tVRv8i.js.map +0 -1
  508. package/dist/chunks/config-CIcynHGr.js.map +0 -1
  509. package/dist/chunks/config-CN2ULSQL.js.map +0 -1
  510. package/dist/chunks/config-CN970ZcJ.js.map +0 -1
  511. package/dist/chunks/config-COvrUfhR.js.map +0 -1
  512. package/dist/chunks/config-Cl4ST6Qd.js.map +0 -1
  513. package/dist/chunks/config-Cwd3yjRw.js.map +0 -1
  514. package/dist/chunks/config-D7zgE_Gr.js.map +0 -1
  515. package/dist/chunks/config-D94Z9po5.js.map +0 -1
  516. package/dist/chunks/config-DAX8Deh1.js.map +0 -1
  517. package/dist/chunks/config-DBmdgoVf.js.map +0 -1
  518. package/dist/chunks/config-DCFvmHEv.js.map +0 -1
  519. package/dist/chunks/config-DGWFal5h.js.map +0 -1
  520. package/dist/chunks/config-DKdlqXiY.js.map +0 -1
  521. package/dist/chunks/config-DSJY6aEl.js.map +0 -1
  522. package/dist/chunks/config-DWN4x6_e.js.map +0 -1
  523. package/dist/chunks/config-Dgj1Q6JY.js.map +0 -1
  524. package/dist/chunks/config-Dguto_6o.js.map +0 -1
  525. package/dist/chunks/config-DtgYuGUn2.js.map +0 -1
  526. package/dist/chunks/config-rkcKArZQ.js.map +0 -1
  527. package/dist/chunks/config-vSji8w90.js.map +0 -1
  528. package/dist/chunks/config-zjeAJ4ho2.js.map +0 -1
  529. package/dist/chunks/context-BfIQv7m12.js.map +0 -1
  530. package/dist/chunks/generated-CJe6hdiE.js.map +0 -1
  531. package/dist/chunks/grBadgeStyles-C1S56Alo.js.map +0 -1
  532. package/dist/chunks/grDropdownMenuStyles-D1LOkdVj.js.map +0 -1
  533. package/dist/chunks/grInputStyles-CJeMhUe5.js.map +0 -1
  534. package/dist/chunks/grKbdStyles-CeZhGQHr.js.map +0 -1
  535. package/dist/chunks/grLinkStyles-BoL8QYcV.js.map +0 -1
  536. package/dist/chunks/grPopoverStyles-Cke_BZsM.js.map +0 -1
  537. package/dist/chunks/grRadioStyles-BTjGNhtU.js.map +0 -1
  538. package/dist/chunks/grSelectStyles-eTz4uPMP.js.map +0 -1
  539. package/dist/chunks/grTextareaStyles-iOcHuVMM.js.map +0 -1
  540. package/dist/chunks/useMenuItemsFocus-OyOnIAlr.js.map +0 -1
  541. package/dist/components/GrAutocomplete/chunks/GrAutocomplete-D9c9BNFg.js.map +0 -1
  542. package/dist/components/GrBadge/chunks/GrBadge-_9rCHuE1.js.map +0 -1
  543. package/dist/components/GrBadgeWrap/chunks/GrBadgeWrap-DDoFQscR.js.map +0 -1
  544. package/dist/components/GrButton/chunks/GrButton-DCz-Wn-V.js.map +0 -1
  545. package/dist/components/GrButtonGroup/chunks/GrButtonGroup-BQo5VQ_c.js.map +0 -1
  546. package/dist/components/GrCard/chunks/GrCard-aQIjk6I9.js.map +0 -1
  547. package/dist/components/GrChip/chunks/GrChip-BnL2FedO.js.map +0 -1
  548. package/dist/components/GrCommandPalette/chunks/GrCommandPalette-BPsVN_XU.js.map +0 -1
  549. package/dist/components/GrConfirmDialog/chunks/GrConfirmDialog-CwXNLyzk.js.map +0 -1
  550. package/dist/components/GrContextMenu/chunks/GrContextMenu-BbAJholy.js.map +0 -1
  551. package/dist/components/GrDataTable/chunks/GrDataTable-NRbrXpdx.js.map +0 -1
  552. package/dist/components/GrDescriptionList/chunks/GrDescriptionList-1mICfrqX.js.map +0 -1
  553. package/dist/components/GrDialog/chunks/GrDialog-5Y5K87ss.js.map +0 -1
  554. package/dist/components/GrDivider/chunks/GrDivider-CAhm9jbE.js.map +0 -1
  555. package/dist/components/GrDropdown/chunks/GrDropdown-BfTmdPyh.js.map +0 -1
  556. package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu-l5HEqzjr.js.map +0 -1
  557. package/dist/components/GrDropdownMenu/chunks/GrDropdownMenuList-BGA_xNVo.js.map +0 -1
  558. package/dist/components/GrForm/chunks/GrForm-CAlJg-wb.js.map +0 -1
  559. package/dist/components/GrIcon/chunks/GrIcon-bQwtZtYT.js.map +0 -1
  560. package/dist/components/GrImageViewer/chunks/GrImageViewer-ng7el4wn.js.map +0 -1
  561. package/dist/components/GrInputTag/chunks/GrInputTag-UI8kIB_F.js.map +0 -1
  562. package/dist/components/GrLink/chunks/GrLink-BQb7U4so.js.map +0 -1
  563. package/dist/components/GrList/chunks/GrList-B5bclmHV.js.map +0 -1
  564. package/dist/components/GrNumberInput/chunks/GrNumberInput-V2mZvDDC.js.map +0 -1
  565. package/dist/components/GrPopover/chunks/GrPopover-DDChM1jD.js.map +0 -1
  566. package/dist/components/GrPromptDialog/chunks/GrPromptDialog-BGuMUzlv.js.map +0 -1
  567. package/dist/components/GrRadio/chunks/GrRadio-BdhknbO8.js.map +0 -1
  568. package/dist/components/GrSelect/chunks/GrSelect-BA1wfX3c.js.map +0 -1
  569. package/dist/components/GrSlider/chunks/GrSlider-s99yAyz6.js.map +0 -1
  570. package/dist/components/GrStatistic/chunks/GrStatistic-BJQv5aOS.js.map +0 -1
  571. package/dist/components/GrTable/chunks/GrTable-f3qCWa99.js.map +0 -1
  572. package/dist/components/GrToaster/chunks/GrToaster-CC49q3a4.js.map +0 -1
  573. package/dist/components/GrTooltip/chunks/GrTooltip-B6AwE_UX.js.map +0 -1
  574. package/dist/components/GrTree/chunks/GrTree-J5q8aCya.js.map +0 -1
  575. package/dist/components/GrTreeSelect/chunks/GrTreeSelect-DEfxWAc3.js.map +0 -1
  576. /package/dist/chunks/{config-BuGlNPE92.js → config-BuGlNPE9.js} +0 -0
  577. /package/dist/chunks/{config-DBmdgoVf.js → config-DBmdgoVf2.js} +0 -0
  578. /package/dist/chunks/{context-BfIQv7m12.js → context-BfIQv7m1.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"GrProgressCircle-BeUx1g1f.js","names":[],"sources":["../../../../src/components/GrProgressCircle/geometry.ts","../../../../src/components/GrProgressCircle/GrProgressCircle.vue","../../../../src/components/GrProgressCircle/GrProgressCircle.vue"],"sourcesContent":["/**\n * Геометрия дуги прогресса. Без Vue — проверяется без монтирования.\n *\n * Все размеры в единицах `viewBox` 100×100: разметка не зависит от того, каким\n * `size` кольцо выводится, а масштабирование остаётся делом CSS.\n */\n\nexport const GR_PROGRESS_CIRCLE_SHAPES = ['circle', 'dashboard'] as const\n\nexport type GrProgressCircleShape = typeof GR_PROGRESS_CIRCLE_SHAPES[number]\n\n/** Сторона `viewBox`; центр — в её половине. */\nexport const VIEW_BOX = 100\n\n/** Доля окружности под дугой: у «дашборда» снизу вырез в четверть. */\nconst ARC_FRACTION: Record<GrProgressCircleShape, number> = {\n circle: 1,\n dashboard: 0.75,\n}\n\n/**\n * Угол начала дуги. `<circle>` в SVG стартует с трёх часов и идёт по часовой:\n * кольцу нужен старт с двенадцати, «дашборду» — так, чтобы вырез сел строго\n * вниз и симметрично.\n */\nconst ROTATION: Record<GrProgressCircleShape, number> = {\n circle: -90,\n dashboard: 135,\n}\n\nexport interface GrArcGeometry {\n /** Радиус с поправкой на толщину: обводка рисуется по обе стороны линии. */\n radius: number\n circumference: number\n /** Длина дорожки — вся окружность либо её часть у «дашборда». */\n arcLength: number\n /** `stroke-dasharray` дорожки. */\n trackDashArray: string\n /** `stroke-dasharray` дуги значения. */\n valueDashArray: string\n rotation: number\n}\n\nexport function clampProgress(value: number): number {\n if (!Number.isFinite(value))\n return 0\n\n return Math.min(100, Math.max(0, value))\n}\n\n/**\n * Дуга задаётся одним штрихом нужной длины и заведомо большим пробелом за ним,\n * а не парой `dasharray` + `dashoffset`: смещение пришлось бы пересчитывать под\n * каждую форму, и ошибка в нём видна только глазом на конкретной ступени.\n */\nexport function arcGeometry(\n shape: GrProgressCircleShape,\n thickness: number,\n value: number,\n): GrArcGeometry {\n const safeThickness = Math.max(1, Math.min(VIEW_BOX / 2, thickness))\n const radius = VIEW_BOX / 2 - safeThickness / 2\n const circumference = 2 * Math.PI * radius\n const arcLength = circumference * ARC_FRACTION[shape]\n const progress = clampProgress(value) / 100\n\n return {\n radius,\n circumference,\n arcLength,\n trackDashArray: `${arcLength} ${circumference}`,\n valueDashArray: `${arcLength * progress} ${circumference}`,\n rotation: ROTATION[shape],\n }\n}\n","<script setup lang=\"ts\">\nimport { computed, useSlots } from 'vue'\n\nimport IconCheck from '~icons/lucide/check'\nimport IconError from '~icons/lucide/x'\n\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\nimport { hasMeaningfulSlotContent } from '../shared/slotNodes'\nimport { arcGeometry, clampProgress, VIEW_BOX, type GrProgressCircleShape } from './geometry'\nimport {\n centerClass,\n diameterBySize,\n grProgressCircleArcColor,\n rootClass,\n statusIconSizeBySize,\n svgClass,\n thicknessBySize,\n valueClass,\n valueTextSizeBySize,\n type GrProgressCircleSize,\n type GrProgressCircleTone,\n} from './grProgressCircleStyles'\n\nexport type { GrProgressCircleShape } from './geometry'\nexport type { GrProgressCircleSize, GrProgressCircleTone } from './grProgressCircleStyles'\n\n/**\n * Пропы {@link GrProgressCircle}.\n *\n * Круговой индикатор: определённый режим по `value`, неопределённый по\n * `indeterminate`, замкнутое кольцо или дуга-«дашборд».\n */\nexport interface GrProgressCircleProps {\n /** Текущее значение `0..100`; выходящие за границы клампятся, `NaN` → `0`. */\n value?: number\n /** Прогресс неизвестен: дуга бежит по кругу, значение наружу не объявляется. */\n indeterminate?: boolean\n /** Замкнутое кольцо или дуга с вырезом снизу. */\n shape?: GrProgressCircleShape\n /** Показать значение в центре кольца. Слот по умолчанию сильнее. */\n showValue?: boolean\n /** Свой формат значения. Управляет и подписью, и `aria-valuetext`. */\n formatValue?: (value: number) => string\n /** На завершении — галочка, при `tone=\"danger\"` — крест вместо значения. */\n statusIcon?: boolean\n /** Метка для скринридера (обязательна, если рядом нет видимого заголовка). */\n ariaLabel?: string\n /** Цветовая тональность дуги. */\n tone?: GrProgressCircleTone\n /** Диаметр кольца по шкале пакета. */\n size?: GrProgressCircleSize\n /** Толщина обводки в процентах диаметра. Не задана — по ступени `size`. */\n thickness?: number\n /** Убрать дорожку: поверх картинки пустая часть кольца только шумит. */\n trackless?: boolean\n}\n\nconst props = withDefaults(defineProps<GrProgressCircleProps>(), {\n value: 0,\n indeterminate: false,\n showValue: false,\n formatValue: undefined,\n statusIcon: false,\n ariaLabel: undefined,\n thickness: undefined,\n // `undefined`, а не готовые значения: иначе `componentDefaults` до них не дошли бы.\n shape: undefined,\n tone: undefined,\n size: undefined,\n trackless: undefined,\n})\n\ndefineSlots<{\n /** Содержимое центра вместо значения: иконка, две строки, кнопка отмены. */\n default?: (props: { value: number }) => any\n}>()\n\nconst slots = useSlots()\n\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrProgressCircle' })\nconst resolvedTone = useGrComponentProp('GrProgressCircle', 'tone', () => props.tone, 'primary')\nconst resolvedShape = useGrComponentProp('GrProgressCircle', 'shape', () => props.shape, 'circle')\nconst resolvedTrackless = useGrComponentProp('GrProgressCircle', 'trackless', () => props.trackless, false)\n\nconst safe = computed(() => clampProgress(props.value))\n\nconst thickness = computed(() => props.thickness ?? thicknessBySize[resolvedSize.value])\n\nconst arc = computed(() => arcGeometry(resolvedShape.value, thickness.value, safe.value))\n\nconst rootStyle = computed(() => ({\n width: `var(--gr-progress-circle-size, ${diameterBySize[resolvedSize.value]})`,\n height: `var(--gr-progress-circle-size, ${diameterBySize[resolvedSize.value]})`,\n}))\n\nconst arcStyle = computed(() => ({\n transform: `rotate(${arc.value.rotation}deg)`,\n transformOrigin: '50% 50%',\n}))\n\nconst arcColor = computed(() => grProgressCircleArcColor(resolvedTone.value))\n\n/**\n * `aria-valuetext` нужен только со своим форматом: «45» при `aria-valuemax=\"100\"`\n * диктор и так читает как проценты.\n */\nconst valueText = computed(() => (props.formatValue ? props.formatValue(safe.value) : undefined))\nconst valueLabel = computed(() => valueText.value ?? `${Math.round(safe.value)}%`)\n\nconst isComplete = computed(() => !props.indeterminate && safe.value >= 100)\nconst isFailed = computed(() => resolvedTone.value === 'danger')\n\n/**\n * Приоритет центра: слот сильнее иконки итога, иконка итога — значения.\n *\n * Считается по содержимому слота, а не по факту его передачи: слот с `v-if`\n * (кнопка отмены, живущая только на время загрузки) приходит комментарием, и\n * центр остался бы пустым вместо значения.\n */\nconst hasSlotContent = computed(() => hasMeaningfulSlotContent(slots.default?.({ value: safe.value }) ?? []))\nconst showStatusIcon = computed(() => !hasSlotContent.value && props.statusIcon && (isComplete.value || isFailed.value))\nconst showValueLabel = computed(() => !hasSlotContent.value && props.showValue && !props.indeterminate && !showStatusIcon.value)\nconst hasCenter = computed(() => hasSlotContent.value || showStatusIcon.value || showValueLabel.value)\n</script>\n\n<template>\n <div\n data-gr-progress-circle\n :data-tone=\"resolvedTone\"\n :data-shape=\"resolvedShape\"\n :class=\"rootClass\"\n :style=\"rootStyle\"\n >\n <div\n data-gr-progress-circle-widget\n :data-gr-progress-circle-indeterminate=\"indeterminate ? '' : undefined\"\n role=\"progressbar\"\n class=\"h-full w-full\"\n :aria-label=\"ariaLabel\"\n :aria-valuenow=\"indeterminate ? undefined : safe\"\n :aria-valuetext=\"indeterminate ? undefined : valueText\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n >\n <svg\n :class=\"svgClass\"\n :viewBox=\"`0 0 ${VIEW_BOX} ${VIEW_BOX}`\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <circle\n v-if=\"!resolvedTrackless\"\n data-gr-progress-circle-track\n :cx=\"VIEW_BOX / 2\"\n :cy=\"VIEW_BOX / 2\"\n :r=\"arc.radius\"\n fill=\"none\"\n :stroke-width=\"thickness\"\n :stroke-dasharray=\"arc.trackDashArray\"\n :style=\"arcStyle\"\n />\n\n <!-- Нулевая дуга при круглом торце нарисовалась бы точкой — «начали». -->\n <circle\n v-if=\"indeterminate || safe > 0\"\n data-gr-progress-circle-arc\n :cx=\"VIEW_BOX / 2\"\n :cy=\"VIEW_BOX / 2\"\n :r=\"arc.radius\"\n fill=\"none\"\n :stroke=\"arcColor\"\n :stroke-width=\"thickness\"\n :stroke-dasharray=\"indeterminate ? `${arc.circumference * 0.25} ${arc.circumference}` : arc.valueDashArray\"\n :style=\"arcStyle\"\n />\n </svg>\n </div>\n\n <!--\n Центр — сосед виджета, а не его потомок: `role=\"progressbar\"` объявляет\n потомков презентационными, и кнопка «Отменить» внутри кольца стала бы\n `nested-interactive`.\n -->\n <div\n v-if=\"hasCenter\"\n data-gr-progress-circle-center\n :class=\"centerClass\"\n :style=\"{ fontSize: `var(--gr-progress-circle-value-size, ${valueTextSizeBySize[resolvedSize]})` }\"\n >\n <slot v-if=\"hasSlotContent\" :value=\"safe\" />\n\n <component\n :is=\"isComplete ? IconCheck : IconError\"\n v-else-if=\"showStatusIcon\"\n data-gr-progress-circle-status\n aria-hidden=\"true\"\n :class=\"statusIconSizeBySize[resolvedSize]\"\n :style=\"{ color: arcColor }\"\n />\n\n <span\n v-else-if=\"showValueLabel\"\n data-gr-progress-circle-value\n :class=\"valueClass\"\n >{{ valueLabel }}</span>\n </div>\n </div>\n</template>\n\n<style>\n[data-gr-progress-circle-track] {\n stroke: var(--gr-progress-circle-track, var(--gr-muted));\n}\n\n[data-gr-progress-circle-arc] {\n stroke-linecap: var(--gr-progress-circle-cap, round);\n transition: stroke-dasharray var(--gr-duration-base) var(--gr-ease-out);\n}\n\n/* Оба кадра заданы явно: иначе стартом становится инлайновый поворот дуги, и\n каждый оборот заканчивался бы скачком. */\n@keyframes gr-progress-circle-spin {\n from {\n transform: rotate(0deg);\n }\n\n to {\n transform: rotate(360deg);\n }\n}\n\n[data-gr-progress-circle-indeterminate] [data-gr-progress-circle-arc] {\n animation-name: gr-progress-circle-spin;\n animation-duration: var(--gr-progress-indeterminate-duration, 1.4s);\n animation-timing-function: linear;\n animation-iteration-count: infinite;\n transition: none;\n}\n\n/*\n * Замерев в исходном кадре, четверть кольца читалась бы как «прогресс 25 %».\n * Замкнутая нейтральная дорожка не притворяется ни нулём, ни завершением: она\n * говорит «работа идёт, значение неизвестно» — тот же приём, что у полосы.\n */\n@media (prefers-reduced-motion: reduce) {\n [data-gr-progress-circle-indeterminate] [data-gr-progress-circle-arc] {\n animation: none;\n stroke: var(--gr-progress-indeterminate-bg, var(--gr-muted-fg));\n stroke-dasharray: none;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, useSlots } from 'vue'\n\nimport IconCheck from '~icons/lucide/check'\nimport IconError from '~icons/lucide/x'\n\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\nimport { hasMeaningfulSlotContent } from '../shared/slotNodes'\nimport { arcGeometry, clampProgress, VIEW_BOX, type GrProgressCircleShape } from './geometry'\nimport {\n centerClass,\n diameterBySize,\n grProgressCircleArcColor,\n rootClass,\n statusIconSizeBySize,\n svgClass,\n thicknessBySize,\n valueClass,\n valueTextSizeBySize,\n type GrProgressCircleSize,\n type GrProgressCircleTone,\n} from './grProgressCircleStyles'\n\nexport type { GrProgressCircleShape } from './geometry'\nexport type { GrProgressCircleSize, GrProgressCircleTone } from './grProgressCircleStyles'\n\n/**\n * Пропы {@link GrProgressCircle}.\n *\n * Круговой индикатор: определённый режим по `value`, неопределённый по\n * `indeterminate`, замкнутое кольцо или дуга-«дашборд».\n */\nexport interface GrProgressCircleProps {\n /** Текущее значение `0..100`; выходящие за границы клампятся, `NaN` → `0`. */\n value?: number\n /** Прогресс неизвестен: дуга бежит по кругу, значение наружу не объявляется. */\n indeterminate?: boolean\n /** Замкнутое кольцо или дуга с вырезом снизу. */\n shape?: GrProgressCircleShape\n /** Показать значение в центре кольца. Слот по умолчанию сильнее. */\n showValue?: boolean\n /** Свой формат значения. Управляет и подписью, и `aria-valuetext`. */\n formatValue?: (value: number) => string\n /** На завершении — галочка, при `tone=\"danger\"` — крест вместо значения. */\n statusIcon?: boolean\n /** Метка для скринридера (обязательна, если рядом нет видимого заголовка). */\n ariaLabel?: string\n /** Цветовая тональность дуги. */\n tone?: GrProgressCircleTone\n /** Диаметр кольца по шкале пакета. */\n size?: GrProgressCircleSize\n /** Толщина обводки в процентах диаметра. Не задана — по ступени `size`. */\n thickness?: number\n /** Убрать дорожку: поверх картинки пустая часть кольца только шумит. */\n trackless?: boolean\n}\n\nconst props = withDefaults(defineProps<GrProgressCircleProps>(), {\n value: 0,\n indeterminate: false,\n showValue: false,\n formatValue: undefined,\n statusIcon: false,\n ariaLabel: undefined,\n thickness: undefined,\n // `undefined`, а не готовые значения: иначе `componentDefaults` до них не дошли бы.\n shape: undefined,\n tone: undefined,\n size: undefined,\n trackless: undefined,\n})\n\ndefineSlots<{\n /** Содержимое центра вместо значения: иконка, две строки, кнопка отмены. */\n default?: (props: { value: number }) => any\n}>()\n\nconst slots = useSlots()\n\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrProgressCircle' })\nconst resolvedTone = useGrComponentProp('GrProgressCircle', 'tone', () => props.tone, 'primary')\nconst resolvedShape = useGrComponentProp('GrProgressCircle', 'shape', () => props.shape, 'circle')\nconst resolvedTrackless = useGrComponentProp('GrProgressCircle', 'trackless', () => props.trackless, false)\n\nconst safe = computed(() => clampProgress(props.value))\n\nconst thickness = computed(() => props.thickness ?? thicknessBySize[resolvedSize.value])\n\nconst arc = computed(() => arcGeometry(resolvedShape.value, thickness.value, safe.value))\n\nconst rootStyle = computed(() => ({\n width: `var(--gr-progress-circle-size, ${diameterBySize[resolvedSize.value]})`,\n height: `var(--gr-progress-circle-size, ${diameterBySize[resolvedSize.value]})`,\n}))\n\nconst arcStyle = computed(() => ({\n transform: `rotate(${arc.value.rotation}deg)`,\n transformOrigin: '50% 50%',\n}))\n\nconst arcColor = computed(() => grProgressCircleArcColor(resolvedTone.value))\n\n/**\n * `aria-valuetext` нужен только со своим форматом: «45» при `aria-valuemax=\"100\"`\n * диктор и так читает как проценты.\n */\nconst valueText = computed(() => (props.formatValue ? props.formatValue(safe.value) : undefined))\nconst valueLabel = computed(() => valueText.value ?? `${Math.round(safe.value)}%`)\n\nconst isComplete = computed(() => !props.indeterminate && safe.value >= 100)\nconst isFailed = computed(() => resolvedTone.value === 'danger')\n\n/**\n * Приоритет центра: слот сильнее иконки итога, иконка итога — значения.\n *\n * Считается по содержимому слота, а не по факту его передачи: слот с `v-if`\n * (кнопка отмены, живущая только на время загрузки) приходит комментарием, и\n * центр остался бы пустым вместо значения.\n */\nconst hasSlotContent = computed(() => hasMeaningfulSlotContent(slots.default?.({ value: safe.value }) ?? []))\nconst showStatusIcon = computed(() => !hasSlotContent.value && props.statusIcon && (isComplete.value || isFailed.value))\nconst showValueLabel = computed(() => !hasSlotContent.value && props.showValue && !props.indeterminate && !showStatusIcon.value)\nconst hasCenter = computed(() => hasSlotContent.value || showStatusIcon.value || showValueLabel.value)\n</script>\n\n<template>\n <div\n data-gr-progress-circle\n :data-tone=\"resolvedTone\"\n :data-shape=\"resolvedShape\"\n :class=\"rootClass\"\n :style=\"rootStyle\"\n >\n <div\n data-gr-progress-circle-widget\n :data-gr-progress-circle-indeterminate=\"indeterminate ? '' : undefined\"\n role=\"progressbar\"\n class=\"h-full w-full\"\n :aria-label=\"ariaLabel\"\n :aria-valuenow=\"indeterminate ? undefined : safe\"\n :aria-valuetext=\"indeterminate ? undefined : valueText\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n >\n <svg\n :class=\"svgClass\"\n :viewBox=\"`0 0 ${VIEW_BOX} ${VIEW_BOX}`\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <circle\n v-if=\"!resolvedTrackless\"\n data-gr-progress-circle-track\n :cx=\"VIEW_BOX / 2\"\n :cy=\"VIEW_BOX / 2\"\n :r=\"arc.radius\"\n fill=\"none\"\n :stroke-width=\"thickness\"\n :stroke-dasharray=\"arc.trackDashArray\"\n :style=\"arcStyle\"\n />\n\n <!-- Нулевая дуга при круглом торце нарисовалась бы точкой — «начали». -->\n <circle\n v-if=\"indeterminate || safe > 0\"\n data-gr-progress-circle-arc\n :cx=\"VIEW_BOX / 2\"\n :cy=\"VIEW_BOX / 2\"\n :r=\"arc.radius\"\n fill=\"none\"\n :stroke=\"arcColor\"\n :stroke-width=\"thickness\"\n :stroke-dasharray=\"indeterminate ? `${arc.circumference * 0.25} ${arc.circumference}` : arc.valueDashArray\"\n :style=\"arcStyle\"\n />\n </svg>\n </div>\n\n <!--\n Центр — сосед виджета, а не его потомок: `role=\"progressbar\"` объявляет\n потомков презентационными, и кнопка «Отменить» внутри кольца стала бы\n `nested-interactive`.\n -->\n <div\n v-if=\"hasCenter\"\n data-gr-progress-circle-center\n :class=\"centerClass\"\n :style=\"{ fontSize: `var(--gr-progress-circle-value-size, ${valueTextSizeBySize[resolvedSize]})` }\"\n >\n <slot v-if=\"hasSlotContent\" :value=\"safe\" />\n\n <component\n :is=\"isComplete ? IconCheck : IconError\"\n v-else-if=\"showStatusIcon\"\n data-gr-progress-circle-status\n aria-hidden=\"true\"\n :class=\"statusIconSizeBySize[resolvedSize]\"\n :style=\"{ color: arcColor }\"\n />\n\n <span\n v-else-if=\"showValueLabel\"\n data-gr-progress-circle-value\n :class=\"valueClass\"\n >{{ valueLabel }}</span>\n </div>\n </div>\n</template>\n\n<style>\n[data-gr-progress-circle-track] {\n stroke: var(--gr-progress-circle-track, var(--gr-muted));\n}\n\n[data-gr-progress-circle-arc] {\n stroke-linecap: var(--gr-progress-circle-cap, round);\n transition: stroke-dasharray var(--gr-duration-base) var(--gr-ease-out);\n}\n\n/* Оба кадра заданы явно: иначе стартом становится инлайновый поворот дуги, и\n каждый оборот заканчивался бы скачком. */\n@keyframes gr-progress-circle-spin {\n from {\n transform: rotate(0deg);\n }\n\n to {\n transform: rotate(360deg);\n }\n}\n\n[data-gr-progress-circle-indeterminate] [data-gr-progress-circle-arc] {\n animation-name: gr-progress-circle-spin;\n animation-duration: var(--gr-progress-indeterminate-duration, 1.4s);\n animation-timing-function: linear;\n animation-iteration-count: infinite;\n transition: none;\n}\n\n/*\n * Замерев в исходном кадре, четверть кольца читалась бы как «прогресс 25 %».\n * Замкнутая нейтральная дорожка не притворяется ни нулём, ни завершением: она\n * говорит «работа идёт, значение неизвестно» — тот же приём, что у полосы.\n */\n@media (prefers-reduced-motion: reduce) {\n [data-gr-progress-circle-indeterminate] [data-gr-progress-circle-arc] {\n animation: none;\n stroke: var(--gr-progress-indeterminate-bg, var(--gr-muted-fg));\n stroke-dasharray: none;\n }\n}\n</style>\n"],"mappings":"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"}
1
+ {"version":3,"file":"GrProgressCircle-D3yWXYDa.js","names":[],"sources":["../../../../src/components/GrProgressCircle/geometry.ts","../../../../src/components/GrProgressCircle/GrProgressCircle.vue","../../../../src/components/GrProgressCircle/GrProgressCircle.vue"],"sourcesContent":["/**\n * Геометрия дуги прогресса. Без Vue — проверяется без монтирования.\n *\n * Все размеры в единицах `viewBox` 100×100: разметка не зависит от того, каким\n * `size` кольцо выводится, а масштабирование остаётся делом CSS.\n */\n\nexport const GR_PROGRESS_CIRCLE_SHAPES = ['circle', 'dashboard'] as const\n\nexport type GrProgressCircleShape = typeof GR_PROGRESS_CIRCLE_SHAPES[number]\n\n/** Сторона `viewBox`; центр — в её половине. */\nexport const VIEW_BOX = 100\n\n/** Доля окружности под дугой: у «дашборда» снизу вырез в четверть. */\nconst ARC_FRACTION: Record<GrProgressCircleShape, number> = {\n circle: 1,\n dashboard: 0.75,\n}\n\n/**\n * Угол начала дуги. `<circle>` в SVG стартует с трёх часов и идёт по часовой:\n * кольцу нужен старт с двенадцати, «дашборду» — так, чтобы вырез сел строго\n * вниз и симметрично.\n */\nconst ROTATION: Record<GrProgressCircleShape, number> = {\n circle: -90,\n dashboard: 135,\n}\n\nexport interface GrArcGeometry {\n /** Радиус с поправкой на толщину: обводка рисуется по обе стороны линии. */\n radius: number\n circumference: number\n /** Длина дорожки — вся окружность либо её часть у «дашборда». */\n arcLength: number\n /** `stroke-dasharray` дорожки. */\n trackDashArray: string\n /** `stroke-dasharray` дуги значения. */\n valueDashArray: string\n rotation: number\n}\n\nexport function clampProgress(value: number): number {\n if (!Number.isFinite(value))\n return 0\n\n return Math.min(100, Math.max(0, value))\n}\n\n/**\n * Дуга задаётся одним штрихом нужной длины и заведомо большим пробелом за ним,\n * а не парой `dasharray` + `dashoffset`: смещение пришлось бы пересчитывать под\n * каждую форму, и ошибка в нём видна только глазом на конкретной ступени.\n */\nexport function arcGeometry(\n shape: GrProgressCircleShape,\n thickness: number,\n value: number,\n): GrArcGeometry {\n const safeThickness = Math.max(1, Math.min(VIEW_BOX / 2, thickness))\n const radius = VIEW_BOX / 2 - safeThickness / 2\n const circumference = 2 * Math.PI * radius\n const arcLength = circumference * ARC_FRACTION[shape]\n const progress = clampProgress(value) / 100\n\n return {\n radius,\n circumference,\n arcLength,\n trackDashArray: `${arcLength} ${circumference}`,\n valueDashArray: `${arcLength * progress} ${circumference}`,\n rotation: ROTATION[shape],\n }\n}\n","<script setup lang=\"ts\">\nimport { computed, useSlots } from 'vue'\n\nimport IconCheck from '~icons/lucide/check'\nimport IconError from '~icons/lucide/x'\n\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\nimport { hasMeaningfulSlotContent } from '../shared/slotNodes'\nimport { arcGeometry, clampProgress, VIEW_BOX, type GrProgressCircleShape } from './geometry'\nimport {\n centerClass,\n diameterBySize,\n grProgressCircleArcColor,\n rootClass,\n statusIconSizeBySize,\n svgClass,\n thicknessBySize,\n valueClass,\n valueTextSizeBySize,\n type GrProgressCircleSize,\n type GrProgressCircleTone,\n} from './grProgressCircleStyles'\n\nexport type { GrProgressCircleShape } from './geometry'\nexport type { GrProgressCircleSize, GrProgressCircleTone } from './grProgressCircleStyles'\n\n/**\n * Пропы {@link GrProgressCircle}.\n *\n * Круговой индикатор: определённый режим по `value`, неопределённый по\n * `indeterminate`, замкнутое кольцо или дуга-«дашборд».\n */\nexport interface GrProgressCircleProps {\n /** Текущее значение `0..100`; выходящие за границы клампятся, `NaN` → `0`. */\n value?: number\n /** Прогресс неизвестен: дуга бежит по кругу, значение наружу не объявляется. */\n indeterminate?: boolean\n /** Замкнутое кольцо или дуга с вырезом снизу. */\n shape?: GrProgressCircleShape\n /** Показать значение в центре кольца. Слот по умолчанию сильнее. */\n showValue?: boolean\n /** Свой формат значения. Управляет и подписью, и `aria-valuetext`. */\n formatValue?: (value: number) => string\n /** На завершении — галочка, при `tone=\"danger\"` — крест вместо значения. */\n statusIcon?: boolean\n /** Метка для скринридера (обязательна, если рядом нет видимого заголовка). */\n ariaLabel?: string\n /** Цветовая тональность дуги. */\n tone?: GrProgressCircleTone\n /** Диаметр кольца по шкале пакета. */\n size?: GrProgressCircleSize\n /** Толщина обводки в процентах диаметра. Не задана — по ступени `size`. */\n thickness?: number\n /** Убрать дорожку: поверх картинки пустая часть кольца только шумит. */\n trackless?: boolean\n}\n\nconst props = withDefaults(defineProps<GrProgressCircleProps>(), {\n value: 0,\n indeterminate: false,\n showValue: false,\n formatValue: undefined,\n statusIcon: false,\n ariaLabel: undefined,\n thickness: undefined,\n // `undefined`, а не готовые значения: иначе `componentDefaults` до них не дошли бы.\n shape: undefined,\n tone: undefined,\n size: undefined,\n trackless: undefined,\n})\n\ndefineSlots<{\n /** Содержимое центра вместо значения: иконка, две строки, кнопка отмены. */\n default?: (props: { value: number }) => any\n}>()\n\nconst slots = useSlots()\n\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrProgressCircle' })\nconst resolvedTone = useGrComponentProp('GrProgressCircle', 'tone', () => props.tone, 'primary')\nconst resolvedShape = useGrComponentProp('GrProgressCircle', 'shape', () => props.shape, 'circle')\nconst resolvedTrackless = useGrComponentProp('GrProgressCircle', 'trackless', () => props.trackless, false)\n\nconst safe = computed(() => clampProgress(props.value))\n\nconst thickness = computed(() => props.thickness ?? thicknessBySize[resolvedSize.value])\n\nconst arc = computed(() => arcGeometry(resolvedShape.value, thickness.value, safe.value))\n\nconst rootStyle = computed(() => ({\n width: `var(--gr-progress-circle-size, ${diameterBySize[resolvedSize.value]})`,\n height: `var(--gr-progress-circle-size, ${diameterBySize[resolvedSize.value]})`,\n}))\n\nconst arcStyle = computed(() => ({\n transform: `rotate(${arc.value.rotation}deg)`,\n transformOrigin: '50% 50%',\n}))\n\nconst arcColor = computed(() => grProgressCircleArcColor(resolvedTone.value))\n\n/**\n * `aria-valuetext` нужен только со своим форматом: «45» при `aria-valuemax=\"100\"`\n * диктор и так читает как проценты.\n */\nconst valueText = computed(() => (props.formatValue ? props.formatValue(safe.value) : undefined))\nconst valueLabel = computed(() => valueText.value ?? `${Math.round(safe.value)}%`)\n\nconst isComplete = computed(() => !props.indeterminate && safe.value >= 100)\nconst isFailed = computed(() => resolvedTone.value === 'danger')\n\n/**\n * Приоритет центра: слот сильнее иконки итога, иконка итога — значения.\n *\n * Считается по содержимому слота, а не по факту его передачи: слот с `v-if`\n * (кнопка отмены, живущая только на время загрузки) приходит комментарием, и\n * центр остался бы пустым вместо значения.\n */\nconst hasSlotContent = computed(() => hasMeaningfulSlotContent(slots.default?.({ value: safe.value }) ?? []))\nconst showStatusIcon = computed(() => !hasSlotContent.value && props.statusIcon && (isComplete.value || isFailed.value))\nconst showValueLabel = computed(() => !hasSlotContent.value && props.showValue && !props.indeterminate && !showStatusIcon.value)\nconst hasCenter = computed(() => hasSlotContent.value || showStatusIcon.value || showValueLabel.value)\n</script>\n\n<template>\n <div\n data-gr-progress-circle\n :data-tone=\"resolvedTone\"\n :data-shape=\"resolvedShape\"\n :class=\"rootClass\"\n :style=\"rootStyle\"\n >\n <div\n data-gr-progress-circle-widget\n :data-gr-progress-circle-indeterminate=\"indeterminate ? '' : undefined\"\n role=\"progressbar\"\n class=\"h-full w-full\"\n :aria-label=\"ariaLabel\"\n :aria-valuenow=\"indeterminate ? undefined : safe\"\n :aria-valuetext=\"indeterminate ? undefined : valueText\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n >\n <svg\n :class=\"svgClass\"\n :viewBox=\"`0 0 ${VIEW_BOX} ${VIEW_BOX}`\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <circle\n v-if=\"!resolvedTrackless\"\n data-gr-progress-circle-track\n :cx=\"VIEW_BOX / 2\"\n :cy=\"VIEW_BOX / 2\"\n :r=\"arc.radius\"\n fill=\"none\"\n :stroke-width=\"thickness\"\n :stroke-dasharray=\"arc.trackDashArray\"\n :style=\"arcStyle\"\n />\n\n <!-- Нулевая дуга при круглом торце нарисовалась бы точкой — «начали». -->\n <circle\n v-if=\"indeterminate || safe > 0\"\n data-gr-progress-circle-arc\n :cx=\"VIEW_BOX / 2\"\n :cy=\"VIEW_BOX / 2\"\n :r=\"arc.radius\"\n fill=\"none\"\n :stroke=\"arcColor\"\n :stroke-width=\"thickness\"\n :stroke-dasharray=\"indeterminate ? `${arc.circumference * 0.25} ${arc.circumference}` : arc.valueDashArray\"\n :style=\"arcStyle\"\n />\n </svg>\n </div>\n\n <!--\n Центр — сосед виджета, а не его потомок: `role=\"progressbar\"` объявляет\n потомков презентационными, и кнопка «Отменить» внутри кольца стала бы\n `nested-interactive`.\n -->\n <div\n v-if=\"hasCenter\"\n data-gr-progress-circle-center\n :class=\"centerClass\"\n :style=\"{ fontSize: `var(--gr-progress-circle-value-size, ${valueTextSizeBySize[resolvedSize]})` }\"\n >\n <slot v-if=\"hasSlotContent\" :value=\"safe\" />\n\n <component\n :is=\"isComplete ? IconCheck : IconError\"\n v-else-if=\"showStatusIcon\"\n data-gr-progress-circle-status\n aria-hidden=\"true\"\n :class=\"statusIconSizeBySize[resolvedSize]\"\n :style=\"{ color: arcColor }\"\n />\n\n <span\n v-else-if=\"showValueLabel\"\n data-gr-progress-circle-value\n :class=\"valueClass\"\n >{{ valueLabel }}</span>\n </div>\n </div>\n</template>\n\n<style>\n[data-gr-progress-circle-track] {\n stroke: var(--gr-progress-circle-track, var(--gr-muted));\n}\n\n[data-gr-progress-circle-arc] {\n stroke-linecap: var(--gr-progress-circle-cap, round);\n transition: stroke-dasharray var(--gr-duration-base) var(--gr-ease-out);\n}\n\n/* Оба кадра заданы явно: иначе стартом становится инлайновый поворот дуги, и\n каждый оборот заканчивался бы скачком. */\n@keyframes gr-progress-circle-spin {\n from {\n transform: rotate(0deg);\n }\n\n to {\n transform: rotate(360deg);\n }\n}\n\n[data-gr-progress-circle-indeterminate] [data-gr-progress-circle-arc] {\n animation-name: gr-progress-circle-spin;\n animation-duration: var(--gr-progress-indeterminate-duration, 1.4s);\n animation-timing-function: linear;\n animation-iteration-count: infinite;\n transition: none;\n}\n\n/*\n * Замерев в исходном кадре, четверть кольца читалась бы как «прогресс 25 %».\n * Замкнутая нейтральная дорожка не притворяется ни нулём, ни завершением: она\n * говорит «работа идёт, значение неизвестно» — тот же приём, что у полосы.\n */\n@media (prefers-reduced-motion: reduce) {\n [data-gr-progress-circle-indeterminate] [data-gr-progress-circle-arc] {\n animation: none;\n stroke: var(--gr-progress-indeterminate-bg, var(--gr-muted-fg));\n stroke-dasharray: none;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, useSlots } from 'vue'\n\nimport IconCheck from '~icons/lucide/check'\nimport IconError from '~icons/lucide/x'\n\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\nimport { hasMeaningfulSlotContent } from '../shared/slotNodes'\nimport { arcGeometry, clampProgress, VIEW_BOX, type GrProgressCircleShape } from './geometry'\nimport {\n centerClass,\n diameterBySize,\n grProgressCircleArcColor,\n rootClass,\n statusIconSizeBySize,\n svgClass,\n thicknessBySize,\n valueClass,\n valueTextSizeBySize,\n type GrProgressCircleSize,\n type GrProgressCircleTone,\n} from './grProgressCircleStyles'\n\nexport type { GrProgressCircleShape } from './geometry'\nexport type { GrProgressCircleSize, GrProgressCircleTone } from './grProgressCircleStyles'\n\n/**\n * Пропы {@link GrProgressCircle}.\n *\n * Круговой индикатор: определённый режим по `value`, неопределённый по\n * `indeterminate`, замкнутое кольцо или дуга-«дашборд».\n */\nexport interface GrProgressCircleProps {\n /** Текущее значение `0..100`; выходящие за границы клампятся, `NaN` → `0`. */\n value?: number\n /** Прогресс неизвестен: дуга бежит по кругу, значение наружу не объявляется. */\n indeterminate?: boolean\n /** Замкнутое кольцо или дуга с вырезом снизу. */\n shape?: GrProgressCircleShape\n /** Показать значение в центре кольца. Слот по умолчанию сильнее. */\n showValue?: boolean\n /** Свой формат значения. Управляет и подписью, и `aria-valuetext`. */\n formatValue?: (value: number) => string\n /** На завершении — галочка, при `tone=\"danger\"` — крест вместо значения. */\n statusIcon?: boolean\n /** Метка для скринридера (обязательна, если рядом нет видимого заголовка). */\n ariaLabel?: string\n /** Цветовая тональность дуги. */\n tone?: GrProgressCircleTone\n /** Диаметр кольца по шкале пакета. */\n size?: GrProgressCircleSize\n /** Толщина обводки в процентах диаметра. Не задана — по ступени `size`. */\n thickness?: number\n /** Убрать дорожку: поверх картинки пустая часть кольца только шумит. */\n trackless?: boolean\n}\n\nconst props = withDefaults(defineProps<GrProgressCircleProps>(), {\n value: 0,\n indeterminate: false,\n showValue: false,\n formatValue: undefined,\n statusIcon: false,\n ariaLabel: undefined,\n thickness: undefined,\n // `undefined`, а не готовые значения: иначе `componentDefaults` до них не дошли бы.\n shape: undefined,\n tone: undefined,\n size: undefined,\n trackless: undefined,\n})\n\ndefineSlots<{\n /** Содержимое центра вместо значения: иконка, две строки, кнопка отмены. */\n default?: (props: { value: number }) => any\n}>()\n\nconst slots = useSlots()\n\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrProgressCircle' })\nconst resolvedTone = useGrComponentProp('GrProgressCircle', 'tone', () => props.tone, 'primary')\nconst resolvedShape = useGrComponentProp('GrProgressCircle', 'shape', () => props.shape, 'circle')\nconst resolvedTrackless = useGrComponentProp('GrProgressCircle', 'trackless', () => props.trackless, false)\n\nconst safe = computed(() => clampProgress(props.value))\n\nconst thickness = computed(() => props.thickness ?? thicknessBySize[resolvedSize.value])\n\nconst arc = computed(() => arcGeometry(resolvedShape.value, thickness.value, safe.value))\n\nconst rootStyle = computed(() => ({\n width: `var(--gr-progress-circle-size, ${diameterBySize[resolvedSize.value]})`,\n height: `var(--gr-progress-circle-size, ${diameterBySize[resolvedSize.value]})`,\n}))\n\nconst arcStyle = computed(() => ({\n transform: `rotate(${arc.value.rotation}deg)`,\n transformOrigin: '50% 50%',\n}))\n\nconst arcColor = computed(() => grProgressCircleArcColor(resolvedTone.value))\n\n/**\n * `aria-valuetext` нужен только со своим форматом: «45» при `aria-valuemax=\"100\"`\n * диктор и так читает как проценты.\n */\nconst valueText = computed(() => (props.formatValue ? props.formatValue(safe.value) : undefined))\nconst valueLabel = computed(() => valueText.value ?? `${Math.round(safe.value)}%`)\n\nconst isComplete = computed(() => !props.indeterminate && safe.value >= 100)\nconst isFailed = computed(() => resolvedTone.value === 'danger')\n\n/**\n * Приоритет центра: слот сильнее иконки итога, иконка итога — значения.\n *\n * Считается по содержимому слота, а не по факту его передачи: слот с `v-if`\n * (кнопка отмены, живущая только на время загрузки) приходит комментарием, и\n * центр остался бы пустым вместо значения.\n */\nconst hasSlotContent = computed(() => hasMeaningfulSlotContent(slots.default?.({ value: safe.value }) ?? []))\nconst showStatusIcon = computed(() => !hasSlotContent.value && props.statusIcon && (isComplete.value || isFailed.value))\nconst showValueLabel = computed(() => !hasSlotContent.value && props.showValue && !props.indeterminate && !showStatusIcon.value)\nconst hasCenter = computed(() => hasSlotContent.value || showStatusIcon.value || showValueLabel.value)\n</script>\n\n<template>\n <div\n data-gr-progress-circle\n :data-tone=\"resolvedTone\"\n :data-shape=\"resolvedShape\"\n :class=\"rootClass\"\n :style=\"rootStyle\"\n >\n <div\n data-gr-progress-circle-widget\n :data-gr-progress-circle-indeterminate=\"indeterminate ? '' : undefined\"\n role=\"progressbar\"\n class=\"h-full w-full\"\n :aria-label=\"ariaLabel\"\n :aria-valuenow=\"indeterminate ? undefined : safe\"\n :aria-valuetext=\"indeterminate ? undefined : valueText\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n >\n <svg\n :class=\"svgClass\"\n :viewBox=\"`0 0 ${VIEW_BOX} ${VIEW_BOX}`\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <circle\n v-if=\"!resolvedTrackless\"\n data-gr-progress-circle-track\n :cx=\"VIEW_BOX / 2\"\n :cy=\"VIEW_BOX / 2\"\n :r=\"arc.radius\"\n fill=\"none\"\n :stroke-width=\"thickness\"\n :stroke-dasharray=\"arc.trackDashArray\"\n :style=\"arcStyle\"\n />\n\n <!-- Нулевая дуга при круглом торце нарисовалась бы точкой — «начали». -->\n <circle\n v-if=\"indeterminate || safe > 0\"\n data-gr-progress-circle-arc\n :cx=\"VIEW_BOX / 2\"\n :cy=\"VIEW_BOX / 2\"\n :r=\"arc.radius\"\n fill=\"none\"\n :stroke=\"arcColor\"\n :stroke-width=\"thickness\"\n :stroke-dasharray=\"indeterminate ? `${arc.circumference * 0.25} ${arc.circumference}` : arc.valueDashArray\"\n :style=\"arcStyle\"\n />\n </svg>\n </div>\n\n <!--\n Центр — сосед виджета, а не его потомок: `role=\"progressbar\"` объявляет\n потомков презентационными, и кнопка «Отменить» внутри кольца стала бы\n `nested-interactive`.\n -->\n <div\n v-if=\"hasCenter\"\n data-gr-progress-circle-center\n :class=\"centerClass\"\n :style=\"{ fontSize: `var(--gr-progress-circle-value-size, ${valueTextSizeBySize[resolvedSize]})` }\"\n >\n <slot v-if=\"hasSlotContent\" :value=\"safe\" />\n\n <component\n :is=\"isComplete ? IconCheck : IconError\"\n v-else-if=\"showStatusIcon\"\n data-gr-progress-circle-status\n aria-hidden=\"true\"\n :class=\"statusIconSizeBySize[resolvedSize]\"\n :style=\"{ color: arcColor }\"\n />\n\n <span\n v-else-if=\"showValueLabel\"\n data-gr-progress-circle-value\n :class=\"valueClass\"\n >{{ valueLabel }}</span>\n </div>\n </div>\n</template>\n\n<style>\n[data-gr-progress-circle-track] {\n stroke: var(--gr-progress-circle-track, var(--gr-muted));\n}\n\n[data-gr-progress-circle-arc] {\n stroke-linecap: var(--gr-progress-circle-cap, round);\n transition: stroke-dasharray var(--gr-duration-base) var(--gr-ease-out);\n}\n\n/* Оба кадра заданы явно: иначе стартом становится инлайновый поворот дуги, и\n каждый оборот заканчивался бы скачком. */\n@keyframes gr-progress-circle-spin {\n from {\n transform: rotate(0deg);\n }\n\n to {\n transform: rotate(360deg);\n }\n}\n\n[data-gr-progress-circle-indeterminate] [data-gr-progress-circle-arc] {\n animation-name: gr-progress-circle-spin;\n animation-duration: var(--gr-progress-indeterminate-duration, 1.4s);\n animation-timing-function: linear;\n animation-iteration-count: infinite;\n transition: none;\n}\n\n/*\n * Замерев в исходном кадре, четверть кольца читалась бы как «прогресс 25 %».\n * Замкнутая нейтральная дорожка не притворяется ни нулём, ни завершением: она\n * говорит «работа идёт, значение неизвестно» — тот же приём, что у полосы.\n */\n@media (prefers-reduced-motion: reduce) {\n [data-gr-progress-circle-indeterminate] [data-gr-progress-circle-arc] {\n animation: none;\n stroke: var(--gr-progress-indeterminate-bg, var(--gr-muted-fg));\n stroke-dasharray: none;\n }\n}\n</style>\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { t as GrProgressCircle_default } from "./chunks/GrProgressCircle-BeUx1g1f.js";
2
- import { n as grProgressCircleSafelist, t as grProgressCircleConfig } from "../../chunks/config-MRvhUl-O.js";
1
+ import { t as GrProgressCircle_default } from "./chunks/GrProgressCircle-D3yWXYDa.js";
2
+ import { n as grProgressCircleSafelist, t as grProgressCircleConfig } from "../../chunks/config-CJzmDHfI.js";
3
3
  export { GrProgressCircle_default as GrProgressCircle, GrProgressCircle_default as default, grProgressCircleConfig, grProgressCircleSafelist };
@@ -1,18 +1,18 @@
1
1
  import { i as useGrComponentProp } from "../../../chunks/context-CTbuwcYs.js";
2
2
  import { n as useGranularityTranslations } from "../../../chunks/granularityI18n-BC5zsj_d.js";
3
- import { t as GrButton_default } from "../../GrButton/chunks/GrButton-DCz-Wn-V.js";
4
- import { t as GrInput_default } from "../../GrInput/chunks/GrInput-Bb_pxqpT.js";
5
- import { t as GrDialog_default } from "../../GrDialog/chunks/GrDialog-5Y5K87ss.js";
6
- import { t as GrResponseErrorBanner_default } from "../../GrResponseErrorBanner/chunks/GrResponseErrorBanner-BhP-xw2P.js";
3
+ import { t as GrButton_default } from "../../GrButton/chunks/GrButton-Bw2AH4uX.js";
4
+ import { t as GrInput_default } from "../../GrInput/chunks/GrInput-c53iltz0.js";
5
+ import { t as GrDialog_default } from "../../GrDialog/chunks/GrDialog-bOUDYfmh.js";
6
+ import { t as GrResponseErrorBanner_default } from "../../GrResponseErrorBanner/chunks/GrResponseErrorBanner-DudGc9LO.js";
7
7
  import { t as GrFormField_default } from "../../GrFormField/chunks/GrFormField-DSylU7IU.js";
8
- import { t as GrTextarea_default } from "../../GrTextarea/chunks/GrTextarea-CNnkcIG1.js";
8
+ import { t as GrTextarea_default } from "../../GrTextarea/chunks/GrTextarea-KREK75Bu.js";
9
9
  import { i as rulesForTrigger, o as runFieldRules, t as createGrFormMessageResolver } from "../../../chunks/validation-5HhpanPP.js";
10
10
  import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, ref, renderSlot, toDisplayString, unref, watch, withCtx, withKeys } from "vue";
11
11
  //#region src/components/GrPromptDialog/GrPromptDialog.vue?vue&type=script&setup=true&lang.ts
12
12
  var _hoisted_1 = { class: "grid gap-4" };
13
13
  var _hoisted_2 = {
14
14
  key: 0,
15
- class: "text-[length:var(--gr-control-text-md)] text-[var(--gr-muted-fg)]"
15
+ class: "text-[length:var(--gr-control-text-md)] leading-[var(--gr-control-leading-md)] text-[var(--gr-muted-fg)]"
16
16
  };
17
17
  var _hoisted_3 = { class: "flex items-center justify-end gap-3" };
18
18
  //#endregion
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrPromptDialog-DMhALhSS.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 *\n * Проверки сверх `required` описываются пропом `rules` — тем же движком, что и\n * у `GrForm`: третий частный случай валидации в пакете заводить незачем.\n */\nimport { useGrComponentProp } from '../GrConfigProvider/context'\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 GrTextarea from '../GrTextarea/GrTextarea.vue'\nimport GrResponseErrorBanner from '../GrResponseErrorBanner/GrResponseErrorBanner.vue'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\n// Именованные импорты чистых функций: разметки не тянут, поэтому в\n// `config.dependencies` не объявляются (см. правило про зависимости).\nimport { createGrFormMessageResolver, rulesForTrigger, runFieldRules } from '../GrForm/validation'\nimport type { GrFormRule, GrFormTrigger } from '../GrForm/validation'\nimport type { GrButtonSize, GrButtonTone, GrButtonVariant } from '../GrButton'\nimport type { GrDialogSectionConfig, GrDialogSize } from '../GrDialog'\n\n/**\n * Тип поля выводим из самого `GrInput`, а не заводим ему именованный алиас:\n * алиас в пропе `GrInput` заменил бы в таблице API витрины список допустимых\n * значений на своё имя — документация стала бы беднее ради удобства обёртки.\n */\ntype GrInputType = NonNullable<InstanceType<typeof GrInput>['$props']['type']>\nimport type { ResponseErrorInfo } from '../GrResponseErrorBanner'\nimport type { InputHTMLAttributes } from 'vue'\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 inputType?: GrInputType\n /** Программная клавиатура на мобильных. */\n inputmode?: InputHTMLAttributes['inputmode']\n /** Ограничение длины; со `showCount` рисуется счётчик. */\n maxlength?: number\n showCount?: boolean\n /** Многострочный ввод: вместо `GrInput` рисуется `GrTextarea`. */\n multiline?: boolean\n /** Высота многострочного поля в строках. */\n rows?: number\n /** Автоподбор высоты многострочного поля под содержимое. */\n autosize?: boolean\n /**\n * Правила проверки значения — те же, что у `GrForm` (`required`, `type`,\n * `min`/`max`/`len`, `pattern`, свой в т.ч. асинхронный `validator`).\n * Прогоняются на blur (после первого касания) и на подтверждении.\n */\n rules?: GrFormRule | GrFormRule[]\n /**\n * Структура ошибки ответа сервера для показа общим блоком в теле диалога\n * (через `GrResponseErrorBanner`). `null` — блок скрыт.\n */\n error?: ResponseErrorInfo | null\n /**\n * Внешняя ошибка поля ввода (например, серверная валидация). Имеет приоритет\n * над встроенной проверкой. `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 * Запрет закрытия «мягкими» способами (Esc, клик по бэкдропу), пока идёт\n * подтверждение или проверка `rules`. Кнопка закрытия и «Отмена» остаются:\n * окно без единого выхода — ловушка.\n */\n persistent?: boolean\n}\n\nexport interface GrPromptDialogEmits {\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\nimport './defaults'\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` живёт в резолвере ниже, а не здесь: Vue подставил бы его\n // до того, как компонент заглянет в `GrConfigProvider`.\n size: undefined,\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 inputType: 'text',\n inputmode: undefined,\n maxlength: undefined,\n showCount: false,\n multiline: false,\n rows: undefined,\n autosize: false,\n rules: undefined,\n error: null,\n fieldError: null,\n confirmLoading: false,\n confirmDisabled: false,\n closeOnConfirm: true,\n persistent: false,\n})\n\n// Эффективный размер: локальный проп → `GrConfigProvider` → дефолт компонента.\nconst resolvedSize = useGrComponentProp('GrPromptDialog', 'size', () => props.size, 'md')\n\nconst emit = defineEmits<GrPromptDialogEmits>()\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)\nconst textareaRef = ref<InstanceType<typeof GrTextarea> | null>(null)\n\n/** Ошибка последнего прогона `rules`; `required` считается отдельно и мгновенно. */\nconst ruleError = ref<string | undefined>(undefined)\nconst validating = ref(false)\n\n// Сторож устаревших прогонов: асинхронное правило может ответить после того,\n// как значение уже сменилось, и дописать чужую ошибку.\nlet validationRun = 0\n\nwatch(\n () => props.modelValue,\n (isOpen) => {\n if (!isOpen) return\n\n touched.value = false\n ruleError.value = undefined\n validationRun += 1\n },\n)\n\nconst resolveMessage = createGrFormMessageResolver(t)\n\nconst normalizedRules = computed<GrFormRule[]>(() => {\n if (!props.rules) return []\n return Array.isArray(props.rules) ? props.rules : [props.rules]\n})\n\nconst requiredError = computed(() => {\n if (!props.required) return undefined\n return valueModel.value.trim().length > 0 ? undefined : resolvedRequiredErrorText.value\n})\n\nconst canConfirm = computed(() => !requiredError.value)\n\nconst validationError = computed(() => {\n if (!touched.value) return undefined\n return requiredError.value ?? ruleError.value\n})\n\n// Внешняя ошибка поля (серверная валидация) имеет приоритет над встроенной.\nconst fieldErrorMessage = computed(() => props.fieldError ?? validationError.value ?? undefined)\n\n/**\n * Прогоняет `rules` для триггера. Возвращает сообщение или `undefined`.\n * `required` здесь не участвует: он синхронный и считается отдельно, чтобы\n * пустое поле блокировало кнопку без похода в асинхронный движок.\n */\nasync function runRules(trigger: GrFormTrigger): Promise<string | undefined> {\n const rules = rulesForTrigger(normalizedRules.value, trigger)\n if (!rules.length) return undefined\n\n const run = ++validationRun\n validating.value = true\n try {\n const message = await runFieldRules(valueModel.value, rules, { value: valueModel.value }, resolveMessage)\n // Ответ устарел — значение или сам диалог успели смениться.\n if (run !== validationRun) return undefined\n\n ruleError.value = message\n return message\n }\n finally {\n if (run === validationRun) validating.value = false\n }\n}\n\nfunction onBlur(): void {\n touched.value = true\n void runRules('blur')\n}\n\n// Пока подтверждение или проверка в полёте, случайное движение не должно\n// оборвать операцию.\nconst softCloseBlocked = computed(() => props.persistent && (props.confirmLoading || validating.value))\nconst resolvedCloseOnBackdrop = computed(() => (softCloseBlocked.value ? false : props.closeOnBackdrop))\nconst resolvedCloseOnEsc = computed(() => (softCloseBlocked.value ? false : props.closeOnEsc))\n\nfunction onCancel(): void {\n emit('cancel')\n emit('update:modelValue', false)\n}\n\nfunction focusField(): void {\n if (props.multiline) textareaRef.value?.focus()\n else inputRef.value?.focus()\n}\n\nasync function onConfirm(): Promise<void> {\n touched.value = true\n\n if (!canConfirm.value) {\n focusField()\n return\n }\n\n if (await runRules('submit')) {\n focusField()\n return\n }\n\n emit('confirm', valueModel.value)\n if (props.closeOnConfirm)\n emit('update:modelValue', false)\n}\n\n/**\n * `Enter` подтверждает — базовое ожидание от окна, единственный смысл которого\n * ввести одно значение. В многострочном режиме `Enter` остаётся переводом\n * строки, поэтому обработчик висит только на однострочном поле.\n */\nfunction onEnter(): void {\n void onConfirm()\n}\n\n// Фокус в поле, а не на панель: диалог существует ровно ради ввода.\n//\n// Через `initialFocus` у `GrModal` это не решается: элемент рождается внутри\n// поддерева диалога, и возврат его же пропом наверх замыкает рендер в цикл\n// («Maximum recursive updates» — проверено). Поэтому фокус ставит содержимое,\n// после отрисовки (`flush: 'post'` + кадр), то есть заведомо позже, чем\n// ловушка фокуса `GrModal` переводит фокус на панель.\n// Источник — не только `modelValue`, но и само поле: содержимое панели\n// появляется на такт позже открытия, и фокус по фиксированному `nextTick`\n// приходился на момент, когда фокусировать ещё нечего.\nwatch(\n [() => props.modelValue, inputRef, textareaRef],\n () => {\n if (!props.modelValue) return\n focusField()\n },\n // `immediate`: окно могут смонтировать уже открытым — тогда смены пропа не\n // будет вовсе, и без этого фокус остался бы на панели.\n { immediate: true, flush: 'post' },\n)\n\ndefineSlots<{\n /** Содержимое диалога вместо пропа `message`. */\n default?: () => any\n /** Разбор ошибки вместо встроенного баннера. */\n error?: (props: { error: ResponseErrorInfo | null }) => any\n /** Кнопки диалога вместо пары «отмена и подтверждение». */\n footer?: () => any\n}>()\n\n</script>\n\n<template>\n <GrDialog\n v-model=\"open\"\n :title=\"resolvedTitle\"\n :size=\"resolvedSize\"\n :close-on-backdrop=\"resolvedCloseOnBackdrop\"\n :close-on-esc=\"resolvedCloseOnEsc\"\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-[length:var(--gr-control-text-md)] leading-[var(--gr-control-leading-md)] text-[var(--gr-muted-fg)]\">\n {{ description }}\n </div>\n </slot>\n\n <!-- `id` полю не задаём: `GrFormField` генерирует его сам, а поле читает\n из контекста. Литеральный id ломал два открытых диалога сразу. -->\n <GrFormField :label=\"resolvedLabel\" :error=\"fieldErrorMessage\">\n <GrTextarea\n v-if=\"multiline\"\n ref=\"textareaRef\"\n v-model=\"valueModel\"\n data-testid=\"gr-prompt-input\"\n :placeholder=\"placeholder\"\n :rows=\"rows\"\n :autosize=\"autosize\"\n :maxlength=\"maxlength\"\n :show-count=\"showCount\"\n :invalid=\"!!fieldErrorMessage\"\n @blur=\"onBlur\"\n />\n <GrInput\n v-else\n ref=\"inputRef\"\n v-model=\"valueModel\"\n data-testid=\"gr-prompt-input\"\n :type=\"inputType\"\n :inputmode=\"inputmode\"\n :placeholder=\"placeholder\"\n :maxlength=\"maxlength\"\n :show-count=\"showCount\"\n :invalid=\"!!fieldErrorMessage\"\n @blur=\"onBlur\"\n @keydown.enter=\"onEnter\"\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 || validating\"\n :disabled=\"confirmDisabled || (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 *\n * Проверки сверх `required` описываются пропом `rules` — тем же движком, что и\n * у `GrForm`: третий частный случай валидации в пакете заводить незачем.\n */\nimport { useGrComponentProp } from '../GrConfigProvider/context'\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 GrTextarea from '../GrTextarea/GrTextarea.vue'\nimport GrResponseErrorBanner from '../GrResponseErrorBanner/GrResponseErrorBanner.vue'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\n// Именованные импорты чистых функций: разметки не тянут, поэтому в\n// `config.dependencies` не объявляются (см. правило про зависимости).\nimport { createGrFormMessageResolver, rulesForTrigger, runFieldRules } from '../GrForm/validation'\nimport type { GrFormRule, GrFormTrigger } from '../GrForm/validation'\nimport type { GrButtonSize, GrButtonTone, GrButtonVariant } from '../GrButton'\nimport type { GrDialogSectionConfig, GrDialogSize } from '../GrDialog'\n\n/**\n * Тип поля выводим из самого `GrInput`, а не заводим ему именованный алиас:\n * алиас в пропе `GrInput` заменил бы в таблице API витрины список допустимых\n * значений на своё имя — документация стала бы беднее ради удобства обёртки.\n */\ntype GrInputType = NonNullable<InstanceType<typeof GrInput>['$props']['type']>\nimport type { ResponseErrorInfo } from '../GrResponseErrorBanner'\nimport type { InputHTMLAttributes } from 'vue'\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 inputType?: GrInputType\n /** Программная клавиатура на мобильных. */\n inputmode?: InputHTMLAttributes['inputmode']\n /** Ограничение длины; со `showCount` рисуется счётчик. */\n maxlength?: number\n showCount?: boolean\n /** Многострочный ввод: вместо `GrInput` рисуется `GrTextarea`. */\n multiline?: boolean\n /** Высота многострочного поля в строках. */\n rows?: number\n /** Автоподбор высоты многострочного поля под содержимое. */\n autosize?: boolean\n /**\n * Правила проверки значения — те же, что у `GrForm` (`required`, `type`,\n * `min`/`max`/`len`, `pattern`, свой в т.ч. асинхронный `validator`).\n * Прогоняются на blur (после первого касания) и на подтверждении.\n */\n rules?: GrFormRule | GrFormRule[]\n /**\n * Структура ошибки ответа сервера для показа общим блоком в теле диалога\n * (через `GrResponseErrorBanner`). `null` — блок скрыт.\n */\n error?: ResponseErrorInfo | null\n /**\n * Внешняя ошибка поля ввода (например, серверная валидация). Имеет приоритет\n * над встроенной проверкой. `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 * Запрет закрытия «мягкими» способами (Esc, клик по бэкдропу), пока идёт\n * подтверждение или проверка `rules`. Кнопка закрытия и «Отмена» остаются:\n * окно без единого выхода — ловушка.\n */\n persistent?: boolean\n}\n\nexport interface GrPromptDialogEmits {\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\nimport './defaults'\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` живёт в резолвере ниже, а не здесь: Vue подставил бы его\n // до того, как компонент заглянет в `GrConfigProvider`.\n size: undefined,\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 inputType: 'text',\n inputmode: undefined,\n maxlength: undefined,\n showCount: false,\n multiline: false,\n rows: undefined,\n autosize: false,\n rules: undefined,\n error: null,\n fieldError: null,\n confirmLoading: false,\n confirmDisabled: false,\n closeOnConfirm: true,\n persistent: false,\n})\n\n// Эффективный размер: локальный проп → `GrConfigProvider` → дефолт компонента.\nconst resolvedSize = useGrComponentProp('GrPromptDialog', 'size', () => props.size, 'md')\n\nconst emit = defineEmits<GrPromptDialogEmits>()\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)\nconst textareaRef = ref<InstanceType<typeof GrTextarea> | null>(null)\n\n/** Ошибка последнего прогона `rules`; `required` считается отдельно и мгновенно. */\nconst ruleError = ref<string | undefined>(undefined)\nconst validating = ref(false)\n\n// Сторож устаревших прогонов: асинхронное правило может ответить после того,\n// как значение уже сменилось, и дописать чужую ошибку.\nlet validationRun = 0\n\nwatch(\n () => props.modelValue,\n (isOpen) => {\n if (!isOpen) return\n\n touched.value = false\n ruleError.value = undefined\n validationRun += 1\n },\n)\n\nconst resolveMessage = createGrFormMessageResolver(t)\n\nconst normalizedRules = computed<GrFormRule[]>(() => {\n if (!props.rules) return []\n return Array.isArray(props.rules) ? props.rules : [props.rules]\n})\n\nconst requiredError = computed(() => {\n if (!props.required) return undefined\n return valueModel.value.trim().length > 0 ? undefined : resolvedRequiredErrorText.value\n})\n\nconst canConfirm = computed(() => !requiredError.value)\n\nconst validationError = computed(() => {\n if (!touched.value) return undefined\n return requiredError.value ?? ruleError.value\n})\n\n// Внешняя ошибка поля (серверная валидация) имеет приоритет над встроенной.\nconst fieldErrorMessage = computed(() => props.fieldError ?? validationError.value ?? undefined)\n\n/**\n * Прогоняет `rules` для триггера. Возвращает сообщение или `undefined`.\n * `required` здесь не участвует: он синхронный и считается отдельно, чтобы\n * пустое поле блокировало кнопку без похода в асинхронный движок.\n */\nasync function runRules(trigger: GrFormTrigger): Promise<string | undefined> {\n const rules = rulesForTrigger(normalizedRules.value, trigger)\n if (!rules.length) return undefined\n\n const run = ++validationRun\n validating.value = true\n try {\n const message = await runFieldRules(valueModel.value, rules, { value: valueModel.value }, resolveMessage)\n // Ответ устарел — значение или сам диалог успели смениться.\n if (run !== validationRun) return undefined\n\n ruleError.value = message\n return message\n }\n finally {\n if (run === validationRun) validating.value = false\n }\n}\n\nfunction onBlur(): void {\n touched.value = true\n void runRules('blur')\n}\n\n// Пока подтверждение или проверка в полёте, случайное движение не должно\n// оборвать операцию.\nconst softCloseBlocked = computed(() => props.persistent && (props.confirmLoading || validating.value))\nconst resolvedCloseOnBackdrop = computed(() => (softCloseBlocked.value ? false : props.closeOnBackdrop))\nconst resolvedCloseOnEsc = computed(() => (softCloseBlocked.value ? false : props.closeOnEsc))\n\nfunction onCancel(): void {\n emit('cancel')\n emit('update:modelValue', false)\n}\n\nfunction focusField(): void {\n if (props.multiline) textareaRef.value?.focus()\n else inputRef.value?.focus()\n}\n\nasync function onConfirm(): Promise<void> {\n touched.value = true\n\n if (!canConfirm.value) {\n focusField()\n return\n }\n\n if (await runRules('submit')) {\n focusField()\n return\n }\n\n emit('confirm', valueModel.value)\n if (props.closeOnConfirm)\n emit('update:modelValue', false)\n}\n\n/**\n * `Enter` подтверждает — базовое ожидание от окна, единственный смысл которого\n * ввести одно значение. В многострочном режиме `Enter` остаётся переводом\n * строки, поэтому обработчик висит только на однострочном поле.\n */\nfunction onEnter(): void {\n void onConfirm()\n}\n\n// Фокус в поле, а не на панель: диалог существует ровно ради ввода.\n//\n// Через `initialFocus` у `GrModal` это не решается: элемент рождается внутри\n// поддерева диалога, и возврат его же пропом наверх замыкает рендер в цикл\n// («Maximum recursive updates» — проверено). Поэтому фокус ставит содержимое,\n// после отрисовки (`flush: 'post'` + кадр), то есть заведомо позже, чем\n// ловушка фокуса `GrModal` переводит фокус на панель.\n// Источник — не только `modelValue`, но и само поле: содержимое панели\n// появляется на такт позже открытия, и фокус по фиксированному `nextTick`\n// приходился на момент, когда фокусировать ещё нечего.\nwatch(\n [() => props.modelValue, inputRef, textareaRef],\n () => {\n if (!props.modelValue) return\n focusField()\n },\n // `immediate`: окно могут смонтировать уже открытым — тогда смены пропа не\n // будет вовсе, и без этого фокус остался бы на панели.\n { immediate: true, flush: 'post' },\n)\n\ndefineSlots<{\n /** Содержимое диалога вместо пропа `message`. */\n default?: () => any\n /** Разбор ошибки вместо встроенного баннера. */\n error?: (props: { error: ResponseErrorInfo | null }) => any\n /** Кнопки диалога вместо пары «отмена и подтверждение». */\n footer?: () => any\n}>()\n\n</script>\n\n<template>\n <GrDialog\n v-model=\"open\"\n :title=\"resolvedTitle\"\n :size=\"resolvedSize\"\n :close-on-backdrop=\"resolvedCloseOnBackdrop\"\n :close-on-esc=\"resolvedCloseOnEsc\"\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-[length:var(--gr-control-text-md)] leading-[var(--gr-control-leading-md)] text-[var(--gr-muted-fg)]\">\n {{ description }}\n </div>\n </slot>\n\n <!-- `id` полю не задаём: `GrFormField` генерирует его сам, а поле читает\n из контекста. Литеральный id ломал два открытых диалога сразу. -->\n <GrFormField :label=\"resolvedLabel\" :error=\"fieldErrorMessage\">\n <GrTextarea\n v-if=\"multiline\"\n ref=\"textareaRef\"\n v-model=\"valueModel\"\n data-testid=\"gr-prompt-input\"\n :placeholder=\"placeholder\"\n :rows=\"rows\"\n :autosize=\"autosize\"\n :maxlength=\"maxlength\"\n :show-count=\"showCount\"\n :invalid=\"!!fieldErrorMessage\"\n @blur=\"onBlur\"\n />\n <GrInput\n v-else\n ref=\"inputRef\"\n v-model=\"valueModel\"\n data-testid=\"gr-prompt-input\"\n :type=\"inputType\"\n :inputmode=\"inputmode\"\n :placeholder=\"placeholder\"\n :maxlength=\"maxlength\"\n :show-count=\"showCount\"\n :invalid=\"!!fieldErrorMessage\"\n @blur=\"onBlur\"\n @keydown.enter=\"onEnter\"\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 || validating\"\n :disabled=\"confirmDisabled || (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-BGuMUzlv.js";
1
+ import { t as GrPromptDialog_default } from "./chunks/GrPromptDialog-DMhALhSS.js";
2
2
  import { t as grPromptDialogConfig } from "../../chunks/config-C0Ea9ePP.js";
3
3
  export { GrPromptDialog_default as GrPromptDialog, GrPromptDialog_default as default, grPromptDialogConfig };
@@ -1,5 +1,5 @@
1
1
  import { a as useGrComponentSize } from "../../../chunks/context-CTbuwcYs.js";
2
- import { S as grRadioRootClass, a as grRadioControlClass, d as grRadioDotBaseClass, h as grRadioDotSizes, p as grRadioDotClass, t as grRadioButtonClass, u as grRadioDescriptionSizes, y as grRadioLabelClassFor } from "../../../chunks/grRadioStyles-BTjGNhtU.js";
2
+ import { S as grRadioRootClass, a as grRadioControlClass, d as grRadioDotBaseClass, h as grRadioDotSizes, p as grRadioDotClass, t as grRadioButtonClass, u as grRadioDescriptionSizes, y as grRadioLabelClassFor } from "../../../chunks/grRadioStyles-D4gnU65n.js";
3
3
  import { computed, createCommentVNode, createElementBlock, createElementVNode, defineComponent, inject, normalizeClass, onUnmounted, openBlock, ref, renderSlot, unref, useId, useSlots, withKeys, withModifiers } from "vue";
4
4
  //#region src/components/GrRadio/grRadioGroupContext.ts
5
5
  var GR_RADIO_GROUP_CONTEXT = Symbol("GR_RADIO_GROUP_CONTEXT");
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrRadio-C_rESc5g.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\n/**\n * Значение переключателя. Не только строка: перечисления в реальных формах —\n * это id числом или флаг. Объекты сюда намеренно не входят: значение уходит в\n * `data-value` и в скрытый input нативной формы, а значит должно иметь\n * однозначное строковое представление.\n */\nexport type GrRadioValue = string | number | boolean\n\nexport type GrRadioEntry = {\n value: () => GrRadioValue\n disabled: () => boolean\n /**\n * Корневой узел переключателя. Геттер, а не значение: регистрация идёт в\n * `setup`, когда элемента ещё нет. Благодаря ему группа переносит фокус, не\n * обходя DOM селекторами.\n */\n el: () => HTMLElement | null\n}\n\nexport type GrRadioGroupContext = {\n modelValue: ComputedRef<GrRadioValue>\n name: ComputedRef<string | undefined>\n disabled: ComputedRef<boolean>\n /**\n * Только для чтения: выбор видно, но он не меняется. У роли `radio` нет\n * `aria-readonly` — состояние объявляет сама группа, переключателю остаётся\n * не прикидываться кликабельным.\n */\n readonly: ComputedRef<boolean>\n /** Ошибка группы: до вида переключателя она доходит только через контекст. */\n invalid: ComputedRef<boolean>\n size: ComputedRef<GrButtonSize>\n setValue: (value: GrRadioValue) => void\n /**\n * Регистрация переключателя в группе. Порядок регистрации совпадает с\n * порядком в документе (setup детей идёт сверху вниз), поэтому группа знает\n * состав и в slot-режиме, и на сервере — без обхода DOM.\n */\n register: (entry: GrRadioEntry) => () => void\n /**\n * Значение переключателя, который держит `tabindex=\"0\"`. Roving tabindex\n * WAI-ARIA: группа — одна остановка Tab, внутрь попадают стрелками. Если не\n * выбрано ничего, остановкой становится первый доступный переключатель.\n */\n rovingValue: ComputedRef<GrRadioValue | undefined>\n /**\n * Стрелки, `Home`, `End`: переносят выбор и фокус на соседний доступный\n * переключатель. Вернул `true` — клавиша обработана (с `preventDefault`).\n * Кольцо ведёт группа, а не переключатель: только она знает состав.\n */\n handleNavigationKeys: (event: KeyboardEvent) => boolean\n}\n\nexport const GR_RADIO_GROUP_CONTEXT: InjectionKey<GrRadioGroupContext> = Symbol('GR_RADIO_GROUP_CONTEXT')\n","<script setup lang=\"ts\">\nimport { computed, inject, onUnmounted, ref, useId, useSlots } from 'vue'\n\nimport { useGrComponentSize } from '../GrConfigProvider/context'\n\nimport type { GrButtonSize, GrButtonTone, GrButtonVariant } from '../GrButton'\n\nimport {\n grRadioButtonClass,\n grRadioControlClass,\n grRadioDescriptionSizes,\n grRadioDotBaseClass,\n grRadioDotClass,\n grRadioDotSizes,\n grRadioLabelClassFor,\n grRadioRootClass,\n type GrRadioVariant,\n} from './grRadioStyles'\nimport { GR_RADIO_GROUP_CONTEXT, type GrRadioValue } from './grRadioGroupContext'\n\nexport type { GrRadioValue } from './grRadioGroupContext'\n\n/**\n * GrRadio — одиночный элемент группы выбора.\n *\n * Может работать автономно (через `v-model`) либо внутри `GrRadioGroup`\n * (тогда `modelValue`/`disabled`/`size`/`name`/`invalid` приходят через `inject`).\n *\n * @prop value — значение этого элемента, сравнивается с `modelValue` группы.\n * @prop variant — визуальное представление: `radiobox` (круг+dot) или `button` (стиль `GrButton`).\n *\n * Доступным контролом является сам элемент с `role=\"radio\"`: он держит фокус,\n * `aria-checked` и клавиатуру. Внутрь него ничего интерактивного не вкладывается —\n * `role=\"radio\"` объявляет потомков презентационными, и вложенный native `<input>`\n * (даже скрытый и с `tabindex=\"-1\"`) ломает виджет для скринридеров и падает\n * в axe на `nested-interactive`. Для отправки нативной формой рядом рендерится\n * `input[type=\"hidden\"]` — он не фокусируется и не является интерактивным.\n */\nexport interface GrRadioProps {\n value: GrRadioValue\n modelValue?: GrRadioValue\n disabled?: boolean\n /** Визуальное и ARIA-состояние ошибки. Складывается с `invalid` группы. */\n invalid?: 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\nexport interface GrRadioEmits {\n (e: 'update:modelValue', value: GrRadioValue): void\n}\n\nconst props = withDefaults(defineProps<GrRadioProps>(), {\n modelValue: undefined,\n disabled: undefined,\n invalid: false,\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<GrRadioEmits>()\n\nconst slots = useSlots()\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 resolvedReadonly = computed(() => group?.readonly.value ?? false)\n\n// «Или», а не `??`: ошибку может объявить и группа, и сам переключатель.\nconst resolvedInvalid = computed(() => props.invalid || (group?.invalid.value ?? false))\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\n/** В DOM значение живёт строкой: `data-value` и скрытый input иначе не умеют. */\nconst domValue = computed(() => String(props.value))\n\n// Нативная форма получает значение только от выбранного и не-disabled элемента —\n// ровно как поступил бы native radio. Без `name` отправлять нечего.\nconst submitsValue = computed(\n () => checked.value && !resolvedDisabled.value && Boolean(resolvedName.value),\n)\n\nconst descriptionId = useId()\nconst hasDescription = computed(() => Boolean(slots.description))\n\nconst buttonClassName = computed(() => {\n return grRadioButtonClass({\n checked: checked.value,\n disabled: resolvedDisabled.value,\n readonly: resolvedReadonly.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({\n disabled: resolvedDisabled.value,\n readonly: resolvedReadonly.value,\n}))\nconst controlClassName = computed(() => grRadioControlClass({\n size: resolvedSize.value,\n checked: checked.value,\n disabled: resolvedDisabled.value,\n invalid: resolvedInvalid.value,\n}))\nconst dotClassName = computed(() => grRadioDotClass({\n checked: checked.value,\n disabled: resolvedDisabled.value,\n}))\nconst labelClassName = computed(() => grRadioLabelClassFor(resolvedSize.value, checked.value))\nconst dotSizeClassName = computed(() => grRadioDotSizes[resolvedSize.value])\nconst descriptionClassName = computed(() => grRadioDescriptionSizes[resolvedSize.value])\n\nfunction setValue(next: GrRadioValue): 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\n// Паттерн radiogroup: группа — одна остановка Tab, внутрь попадают стрелками.\n// Вне группы (одиночный `GrRadio`) переключатель остаётся обычной остановкой.\nconst rovingTabindex = computed(() => {\n if (resolvedDisabled.value) return -1\n if (!group) return 0\n return group.rovingValue.value === props.value ? 0 : -1\n})\n\nconst rootEl = ref<HTMLElement | null>(null)\n\n/** Кольцо ведёт группа: только она знает состав и порядок. */\nfunction onKeydown(event: KeyboardEvent): void {\n if (!group || resolvedDisabled.value) return\n\n group.handleNavigationKeys(event)\n}\n\nconst unregister = group?.register({\n value: () => props.value,\n disabled: () => resolvedDisabled.value,\n el: () => rootEl.value,\n})\n\nonUnmounted(() => unregister?.())\n\ndefineSlots<{\n /** Подпись переключателя вместо пропа `label`. */\n default?: () => any\n /** Пояснение под подписью. */\n description?: () => any\n}>()\n\n</script>\n\n<template>\n <div\n v-if=\"variant === 'button'\"\n :id=\"id\"\n ref=\"rootEl\"\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 :aria-invalid=\"resolvedInvalid ? 'true' : undefined\"\n :aria-required=\"required ? 'true' : undefined\"\n :data-value=\"domValue\"\n :tabindex=\"rovingTabindex\"\n :class=\"buttonClassName\"\n @click=\"onButtonClick\"\n @keydown.space.prevent=\"onButtonClick\"\n @keydown.enter.prevent=\"onButtonClick\"\n @keydown=\"onKeydown\"\n >\n <input\n v-if=\"submitsValue\"\n type=\"hidden\"\n :name=\"resolvedName\"\n :value=\"domValue\"\n :form=\"form\"\n >\n\n <slot />\n </div>\n\n <div\n v-else\n :id=\"id\"\n ref=\"rootEl\"\n data-gr-radio\n role=\"radio\"\n :aria-checked=\"checked ? 'true' : 'false'\"\n :aria-label=\"ariaLabel\"\n :aria-disabled=\"resolvedDisabled ? 'true' : undefined\"\n :aria-invalid=\"resolvedInvalid ? 'true' : undefined\"\n :aria-required=\"required ? 'true' : undefined\"\n :aria-describedby=\"hasDescription ? descriptionId : undefined\"\n :data-value=\"domValue\"\n :tabindex=\"rovingTabindex\"\n class=\"inline-flex items-start gap-2 select-none focus-visible:outline-none focus-visible:rounded-[var(--gr-radius-md)] 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 @keydown=\"onKeydown\"\n >\n <input\n v-if=\"submitsValue\"\n type=\"hidden\"\n :name=\"resolvedName\"\n :value=\"domValue\"\n :form=\"form\"\n >\n\n <span\n data-gr-radio-control\n aria-hidden=\"true\"\n class=\"mt-0.5 shrink-0 rounded-[var(--gr-radius-full)] border flex items-center justify-center transition-colors duration-[var(--gr-duration-fast)]\"\n :class=\"controlClassName\"\n >\n <span\n data-gr-radio-dot\n :class=\"[grRadioDotBaseClass, dotSizeClassName, dotClassName]\"\n />\n </span>\n\n <span class=\"grid gap-0.5\">\n <span data-gr-radio-label :class=\"labelClassName\">\n <slot />\n </span>\n\n <span\n v-if=\"hasDescription\"\n :id=\"descriptionId\"\n data-gr-radio-description\n :class=\"descriptionClassName\"\n >\n <slot name=\"description\" />\n </span>\n </span>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject, onUnmounted, ref, useId, useSlots } from 'vue'\n\nimport { useGrComponentSize } from '../GrConfigProvider/context'\n\nimport type { GrButtonSize, GrButtonTone, GrButtonVariant } from '../GrButton'\n\nimport {\n grRadioButtonClass,\n grRadioControlClass,\n grRadioDescriptionSizes,\n grRadioDotBaseClass,\n grRadioDotClass,\n grRadioDotSizes,\n grRadioLabelClassFor,\n grRadioRootClass,\n type GrRadioVariant,\n} from './grRadioStyles'\nimport { GR_RADIO_GROUP_CONTEXT, type GrRadioValue } from './grRadioGroupContext'\n\nexport type { GrRadioValue } from './grRadioGroupContext'\n\n/**\n * GrRadio — одиночный элемент группы выбора.\n *\n * Может работать автономно (через `v-model`) либо внутри `GrRadioGroup`\n * (тогда `modelValue`/`disabled`/`size`/`name`/`invalid` приходят через `inject`).\n *\n * @prop value — значение этого элемента, сравнивается с `modelValue` группы.\n * @prop variant — визуальное представление: `radiobox` (круг+dot) или `button` (стиль `GrButton`).\n *\n * Доступным контролом является сам элемент с `role=\"radio\"`: он держит фокус,\n * `aria-checked` и клавиатуру. Внутрь него ничего интерактивного не вкладывается —\n * `role=\"radio\"` объявляет потомков презентационными, и вложенный native `<input>`\n * (даже скрытый и с `tabindex=\"-1\"`) ломает виджет для скринридеров и падает\n * в axe на `nested-interactive`. Для отправки нативной формой рядом рендерится\n * `input[type=\"hidden\"]` — он не фокусируется и не является интерактивным.\n */\nexport interface GrRadioProps {\n value: GrRadioValue\n modelValue?: GrRadioValue\n disabled?: boolean\n /** Визуальное и ARIA-состояние ошибки. Складывается с `invalid` группы. */\n invalid?: 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\nexport interface GrRadioEmits {\n (e: 'update:modelValue', value: GrRadioValue): void\n}\n\nconst props = withDefaults(defineProps<GrRadioProps>(), {\n modelValue: undefined,\n disabled: undefined,\n invalid: false,\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<GrRadioEmits>()\n\nconst slots = useSlots()\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 resolvedReadonly = computed(() => group?.readonly.value ?? false)\n\n// «Или», а не `??`: ошибку может объявить и группа, и сам переключатель.\nconst resolvedInvalid = computed(() => props.invalid || (group?.invalid.value ?? false))\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\n/** В DOM значение живёт строкой: `data-value` и скрытый input иначе не умеют. */\nconst domValue = computed(() => String(props.value))\n\n// Нативная форма получает значение только от выбранного и не-disabled элемента —\n// ровно как поступил бы native radio. Без `name` отправлять нечего.\nconst submitsValue = computed(\n () => checked.value && !resolvedDisabled.value && Boolean(resolvedName.value),\n)\n\nconst descriptionId = useId()\nconst hasDescription = computed(() => Boolean(slots.description))\n\nconst buttonClassName = computed(() => {\n return grRadioButtonClass({\n checked: checked.value,\n disabled: resolvedDisabled.value,\n readonly: resolvedReadonly.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({\n disabled: resolvedDisabled.value,\n readonly: resolvedReadonly.value,\n}))\nconst controlClassName = computed(() => grRadioControlClass({\n size: resolvedSize.value,\n checked: checked.value,\n disabled: resolvedDisabled.value,\n invalid: resolvedInvalid.value,\n}))\nconst dotClassName = computed(() => grRadioDotClass({\n checked: checked.value,\n disabled: resolvedDisabled.value,\n}))\nconst labelClassName = computed(() => grRadioLabelClassFor(resolvedSize.value, checked.value))\nconst dotSizeClassName = computed(() => grRadioDotSizes[resolvedSize.value])\nconst descriptionClassName = computed(() => grRadioDescriptionSizes[resolvedSize.value])\n\nfunction setValue(next: GrRadioValue): 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\n// Паттерн radiogroup: группа — одна остановка Tab, внутрь попадают стрелками.\n// Вне группы (одиночный `GrRadio`) переключатель остаётся обычной остановкой.\nconst rovingTabindex = computed(() => {\n if (resolvedDisabled.value) return -1\n if (!group) return 0\n return group.rovingValue.value === props.value ? 0 : -1\n})\n\nconst rootEl = ref<HTMLElement | null>(null)\n\n/** Кольцо ведёт группа: только она знает состав и порядок. */\nfunction onKeydown(event: KeyboardEvent): void {\n if (!group || resolvedDisabled.value) return\n\n group.handleNavigationKeys(event)\n}\n\nconst unregister = group?.register({\n value: () => props.value,\n disabled: () => resolvedDisabled.value,\n el: () => rootEl.value,\n})\n\nonUnmounted(() => unregister?.())\n\ndefineSlots<{\n /** Подпись переключателя вместо пропа `label`. */\n default?: () => any\n /** Пояснение под подписью. */\n description?: () => any\n}>()\n\n</script>\n\n<template>\n <div\n v-if=\"variant === 'button'\"\n :id=\"id\"\n ref=\"rootEl\"\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 :aria-invalid=\"resolvedInvalid ? 'true' : undefined\"\n :aria-required=\"required ? 'true' : undefined\"\n :data-value=\"domValue\"\n :tabindex=\"rovingTabindex\"\n :class=\"buttonClassName\"\n @click=\"onButtonClick\"\n @keydown.space.prevent=\"onButtonClick\"\n @keydown.enter.prevent=\"onButtonClick\"\n @keydown=\"onKeydown\"\n >\n <input\n v-if=\"submitsValue\"\n type=\"hidden\"\n :name=\"resolvedName\"\n :value=\"domValue\"\n :form=\"form\"\n >\n\n <slot />\n </div>\n\n <div\n v-else\n :id=\"id\"\n ref=\"rootEl\"\n data-gr-radio\n role=\"radio\"\n :aria-checked=\"checked ? 'true' : 'false'\"\n :aria-label=\"ariaLabel\"\n :aria-disabled=\"resolvedDisabled ? 'true' : undefined\"\n :aria-invalid=\"resolvedInvalid ? 'true' : undefined\"\n :aria-required=\"required ? 'true' : undefined\"\n :aria-describedby=\"hasDescription ? descriptionId : undefined\"\n :data-value=\"domValue\"\n :tabindex=\"rovingTabindex\"\n class=\"inline-flex items-start gap-2 select-none focus-visible:outline-none focus-visible:rounded-[var(--gr-radius-md)] 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 @keydown=\"onKeydown\"\n >\n <input\n v-if=\"submitsValue\"\n type=\"hidden\"\n :name=\"resolvedName\"\n :value=\"domValue\"\n :form=\"form\"\n >\n\n <span\n data-gr-radio-control\n aria-hidden=\"true\"\n class=\"mt-0.5 shrink-0 rounded-[var(--gr-radius-full)] border flex items-center justify-center transition-colors duration-[var(--gr-duration-fast)]\"\n :class=\"controlClassName\"\n >\n <span\n data-gr-radio-dot\n :class=\"[grRadioDotBaseClass, dotSizeClassName, dotClassName]\"\n />\n </span>\n\n <span class=\"grid gap-0.5\">\n <span data-gr-radio-label :class=\"labelClassName\">\n <slot />\n </span>\n\n <span\n v-if=\"hasDescription\"\n :id=\"descriptionId\"\n data-gr-radio-description\n :class=\"descriptionClassName\"\n >\n <slot name=\"description\" />\n </span>\n </span>\n </div>\n</template>\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { t as GrRadio_default } from "./chunks/GrRadio-BdhknbO8.js";
2
- import { n as grRadioSafelist, t as grRadioConfig } from "../../chunks/config-BTCOJO5z2.js";
1
+ import { t as GrRadio_default } from "./chunks/GrRadio-C_rESc5g.js";
2
+ import { n as grRadioSafelist, t as grRadioConfig } from "../../chunks/config-jyr6AIZt2.js";
3
3
  export { GrRadio_default as GrRadio, GrRadio_default as default, grRadioConfig, grRadioSafelist };
@@ -2,9 +2,9 @@ import { a as useGrComponentSize } from "../../../chunks/context-CTbuwcYs.js";
2
2
  import { n as useGrFormFieldContext } from "../../../chunks/context-DdNIxa1w.js";
3
3
  import { useGrFormControl } from "../../../composables/useGrFormControl.js";
4
4
  import { t as useFocusWithin } from "../../../chunks/useFocusWithin-BwHE0rzm.js";
5
- import { t as GrButtonGroup_default } from "../../GrButtonGroup/chunks/GrButtonGroup-BQo5VQ_c.js";
6
5
  import { useRovingFocus } from "../../../composables/useRovingFocus.js";
7
- import { n as GR_RADIO_GROUP_CONTEXT, t as GrRadio_default } from "../../GrRadio/chunks/GrRadio-BdhknbO8.js";
6
+ import { t as GrButtonGroup_default } from "../../GrButtonGroup/chunks/GrButtonGroup-CKyiAV8K.js";
7
+ import { n as GR_RADIO_GROUP_CONTEXT, t as GrRadio_default } from "../../GrRadio/chunks/GrRadio-C_rESc5g.js";
8
8
  import { Fragment, computed, createBlock, createElementBlock, createSlots, createTextVNode, defineComponent, nextTick, normalizeClass, openBlock, provide, ref, renderList, renderSlot, toDisplayString, unref, withCtx } from "vue";
9
9
  //#region src/components/GrRadioGroup/GrRadioGroup.vue?vue&type=script&setup=true&lang.ts
10
10
  var _hoisted_1 = [
@@ -1 +1 @@
1
- {"version":3,"file":"GrRadioGroup-7w4bXIg_.js","names":["$slots"],"sources":["../../../../src/components/GrRadioGroup/GrRadioGroup.vue","../../../../src/components/GrRadioGroup/GrRadioGroup.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, nextTick, provide, ref } from 'vue'\n\nimport { useGrComponentSize } from '../GrConfigProvider/context'\nimport { useGrFormFieldContext } from '../GrFormField/context'\nimport { useGrFormControl } from '../../composables/useGrFormControl'\nimport { useRovingFocus } from '../../composables/useRovingFocus'\nimport { useFocusWithin } from '../../composables/internal/useFocusWithin'\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/grRadioGroupContext'\nimport type { GrRadioEntry, GrRadioValue } from '../GrRadio/grRadioGroupContext'\n\nexport type GrRadioGroupVariant = 'radiobox' | 'button'\nexport type GrRadioGroupOrientation = 'vertical' | 'horizontal'\nexport interface GrRadioGroupOption {\n value: GrRadioValue\n label: string\n /** Отключить одну опцию, не переходя на слот. */\n disabled?: boolean\n /** Пояснение под подписью. Рисуется только в варианте `radiobox`. */\n description?: string\n}\n\n/**\n * GrRadioGroup — контейнер группы `GrRadio`.\n *\n * Может работать как через слот (ручной рендер `GrRadio`), так и через проп `options`.\n * Предоставляет дочерним `GrRadio` общий `modelValue`/`disabled`/`size`/`name` через `inject`.\n */\nexport interface GrRadioGroupProps {\n modelValue: GrRadioValue\n options?: GrRadioGroupOption[]\n name?: string\n disabled?: boolean\n /** Только для чтения: выбор видно, но он не меняется. */\n readonly?: boolean\n /** Визуальное и ARIA-состояние ошибки. */\n invalid?: boolean\n /** Обязательное поле (`aria-required`). */\n required?: boolean\n variant?: GrRadioGroupVariant\n /**\n * Раскладка варианта `radiobox`. Кнопочный вариант всегда горизонтальный —\n * его собирает `GrButtonGroup`.\n */\n orientation?: GrRadioGroupOrientation\n size?: GrButtonSize\n ariaLabel?: string\n}\n\nexport interface GrRadioGroupEmits {\n (e: 'update:modelValue', value: GrRadioValue): void\n (e: 'change', value: GrRadioValue): void\n (e: 'focus', event: FocusEvent): void\n (e: 'blur', event: FocusEvent): void\n}\n\nconst props = withDefaults(defineProps<GrRadioGroupProps>(), {\n options: undefined,\n name: undefined,\n disabled: false,\n readonly: false,\n invalid: false,\n required: false,\n variant: 'radiobox',\n orientation: 'vertical',\n size: undefined,\n ariaLabel: undefined,\n})\n\n// Эффективный размер группы: локальный проп → `GrConfigProvider` → `md`.\n// Дочерние `GrRadio` получают уже разрешённое значение через контекст, поэтому\n// провайдер работает и для них — без второго чтения конфига.\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrRadioGroup' })\n\n// Контекст `GrFormField`. Группа — не labelable-элемент, поэтому имя приходит\n// через `aria-labelledby` на подпись поля, а не через `<label for>`.\nconst field = useGrFormFieldContext()\nconst fieldId = computed(() => field?.id.value)\nconst describedBy = computed(() => field?.describedById.value)\nconst {\n disabled: isDisabled,\n invalid: isInvalid, required: isRequired, readonly: isReadonly } = useGrFormControl(() => props)\nconst labelledBy = computed(() => (props.ariaLabel ? undefined : field?.labelId.value))\n\nconst emit = defineEmits<GrRadioGroupEmits>()\ndefineSlots<{\n /** Собственная разметка переключателей вместо генерации из `options`. */\n default?: () => any\n}>()\n\n\nfunction setValue(next: GrRadioValue): void {\n if (isDisabled.value || isReadonly.value)\n return\n emit('update:modelValue', next)\n emit('change', next)\n}\n\nconst listClass = computed(() => (props.orientation === 'horizontal'\n ? 'flex flex-wrap items-start gap-x-6 gap-y-2'\n : 'grid gap-2'))\n\nconst rootEl = ref<HTMLElement | null>(null)\n\n// Фокус ходит между радиокнопками: без границы каждая стрелка давала бы\n// потребителю пару `blur` + `focus`.\nconst { onFocusIn, onFocusOut } = useFocusWithin(rootEl, {\n enter: event => emit('focus', event),\n leave: event => emit('blur', event),\n})\n\ndefineExpose({ focus, blur })\n\nconst entries = ref<GrRadioEntry[]>([])\n\nfunction register(entry: GrRadioEntry): () => void {\n entries.value.push(entry)\n return () => {\n const index = entries.value.indexOf(entry)\n if (index >= 0) entries.value.splice(index, 1)\n }\n}\n\nfunction entryOf(value: GrRadioValue): GrRadioEntry | undefined {\n return entries.value.find(entry => entry.value() === value)\n}\n\n/**\n * Кольцо roving-фокуса. Живёт в группе, а не в переключателе: состав знает\n * только она. Обе оси работают всегда — требование паттерна `radiogroup`,\n * стрелки зациклены, выключенные перешагиваются.\n */\nconst roving = useRovingFocus<GrRadioValue>({\n items: () => entries.value.map(entry => entry.value()),\n elementFor: value => entryOf(value)?.el() ?? null,\n isDisabled: value => entryOf(value)?.disabled() ?? true,\n orientation: () => 'both',\n skipDisabled: () => true,\n // Выбранное значение держит остановку `Tab` — но только пока переключатель\n // доступен: на выключенном `GrRadio` ставит `tabindex=\"-1\"` сам, и остановка\n // на нём означала бы, что `Tab` не приводит никуда.\n initialKey: () => {\n const entry = entryOf(props.modelValue)\n return entry && !entry.disabled() ? props.modelValue : undefined\n },\n // В `radiogroup` стрелка переносит выбор, а не только фокус.\n onMove: value => setValue(value),\n // Выбор меняет разметку: фокус ставим по перерисовке, иначе следующая\n // стрелка отсчитывалась бы от прежнего элемента.\n beforeFocus: () => nextTick(),\n})\n\n/** Императивный фокус ведёт на текущую остановку `Tab`, а не на первый элемент. */\nfunction rovingElement(): HTMLElement | null {\n const value = roving.rovingKey.value\n return value === undefined ? null : entryOf(value)?.el() ?? null\n}\n\nfunction focus(): void {\n rovingElement()?.focus()\n}\n\nfunction blur(): void {\n rovingElement()?.blur()\n}\n\nprovide(GR_RADIO_GROUP_CONTEXT, {\n modelValue: computed(() => props.modelValue),\n name: computed(() => props.name),\n disabled: computed(() => isDisabled.value),\n readonly: isReadonly,\n invalid: isInvalid,\n size: resolvedSize,\n setValue,\n register,\n rovingValue: roving.rovingKey,\n handleNavigationKeys: roving.handleNavigationKeys,\n})\n</script>\n\n<template>\n <div\n :id=\"fieldId\"\n ref=\"rootEl\"\n data-gr-radio-group\n role=\"radiogroup\"\n :aria-label=\"ariaLabel\"\n :aria-labelledby=\"labelledBy\"\n :aria-describedby=\"describedBy\"\n :aria-invalid=\"isInvalid ? 'true' : undefined\"\n :aria-required=\"isRequired ? 'true' : undefined\"\n :aria-readonly=\"isReadonly ? 'true' : undefined\"\n :aria-disabled=\"isDisabled ? 'true' : undefined\"\n @focusin=\"onFocusIn\"\n @focusout=\"onFocusOut\"\n >\n <template v-if=\"$slots.default\">\n <GrButtonGroup v-if=\"variant === 'button'\">\n <slot />\n </GrButtonGroup>\n <div v-else :class=\"listClass\">\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=\"String(opt.value)\"\n :value=\"opt.value\"\n :disabled=\"opt.disabled\"\n variant=\"button\"\n :size=\"resolvedSize\"\n >\n {{ opt.label }}\n </GrRadio>\n </GrButtonGroup>\n <div v-else :class=\"listClass\">\n <GrRadio\n v-for=\"opt in options ?? []\"\n :key=\"String(opt.value)\"\n :value=\"opt.value\"\n :disabled=\"opt.disabled\"\n >\n {{ opt.label }}\n\n <template v-if=\"opt.description\" #description>\n {{ opt.description }}\n </template>\n </GrRadio>\n </div>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, provide, ref } from 'vue'\n\nimport { useGrComponentSize } from '../GrConfigProvider/context'\nimport { useGrFormFieldContext } from '../GrFormField/context'\nimport { useGrFormControl } from '../../composables/useGrFormControl'\nimport { useRovingFocus } from '../../composables/useRovingFocus'\nimport { useFocusWithin } from '../../composables/internal/useFocusWithin'\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/grRadioGroupContext'\nimport type { GrRadioEntry, GrRadioValue } from '../GrRadio/grRadioGroupContext'\n\nexport type GrRadioGroupVariant = 'radiobox' | 'button'\nexport type GrRadioGroupOrientation = 'vertical' | 'horizontal'\nexport interface GrRadioGroupOption {\n value: GrRadioValue\n label: string\n /** Отключить одну опцию, не переходя на слот. */\n disabled?: boolean\n /** Пояснение под подписью. Рисуется только в варианте `radiobox`. */\n description?: string\n}\n\n/**\n * GrRadioGroup — контейнер группы `GrRadio`.\n *\n * Может работать как через слот (ручной рендер `GrRadio`), так и через проп `options`.\n * Предоставляет дочерним `GrRadio` общий `modelValue`/`disabled`/`size`/`name` через `inject`.\n */\nexport interface GrRadioGroupProps {\n modelValue: GrRadioValue\n options?: GrRadioGroupOption[]\n name?: string\n disabled?: boolean\n /** Только для чтения: выбор видно, но он не меняется. */\n readonly?: boolean\n /** Визуальное и ARIA-состояние ошибки. */\n invalid?: boolean\n /** Обязательное поле (`aria-required`). */\n required?: boolean\n variant?: GrRadioGroupVariant\n /**\n * Раскладка варианта `radiobox`. Кнопочный вариант всегда горизонтальный —\n * его собирает `GrButtonGroup`.\n */\n orientation?: GrRadioGroupOrientation\n size?: GrButtonSize\n ariaLabel?: string\n}\n\nexport interface GrRadioGroupEmits {\n (e: 'update:modelValue', value: GrRadioValue): void\n (e: 'change', value: GrRadioValue): void\n (e: 'focus', event: FocusEvent): void\n (e: 'blur', event: FocusEvent): void\n}\n\nconst props = withDefaults(defineProps<GrRadioGroupProps>(), {\n options: undefined,\n name: undefined,\n disabled: false,\n readonly: false,\n invalid: false,\n required: false,\n variant: 'radiobox',\n orientation: 'vertical',\n size: undefined,\n ariaLabel: undefined,\n})\n\n// Эффективный размер группы: локальный проп → `GrConfigProvider` → `md`.\n// Дочерние `GrRadio` получают уже разрешённое значение через контекст, поэтому\n// провайдер работает и для них — без второго чтения конфига.\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrRadioGroup' })\n\n// Контекст `GrFormField`. Группа — не labelable-элемент, поэтому имя приходит\n// через `aria-labelledby` на подпись поля, а не через `<label for>`.\nconst field = useGrFormFieldContext()\nconst fieldId = computed(() => field?.id.value)\nconst describedBy = computed(() => field?.describedById.value)\nconst {\n disabled: isDisabled,\n invalid: isInvalid, required: isRequired, readonly: isReadonly } = useGrFormControl(() => props)\nconst labelledBy = computed(() => (props.ariaLabel ? undefined : field?.labelId.value))\n\nconst emit = defineEmits<GrRadioGroupEmits>()\ndefineSlots<{\n /** Собственная разметка переключателей вместо генерации из `options`. */\n default?: () => any\n}>()\n\n\nfunction setValue(next: GrRadioValue): void {\n if (isDisabled.value || isReadonly.value)\n return\n emit('update:modelValue', next)\n emit('change', next)\n}\n\nconst listClass = computed(() => (props.orientation === 'horizontal'\n ? 'flex flex-wrap items-start gap-x-6 gap-y-2'\n : 'grid gap-2'))\n\nconst rootEl = ref<HTMLElement | null>(null)\n\n// Фокус ходит между радиокнопками: без границы каждая стрелка давала бы\n// потребителю пару `blur` + `focus`.\nconst { onFocusIn, onFocusOut } = useFocusWithin(rootEl, {\n enter: event => emit('focus', event),\n leave: event => emit('blur', event),\n})\n\ndefineExpose({ focus, blur })\n\nconst entries = ref<GrRadioEntry[]>([])\n\nfunction register(entry: GrRadioEntry): () => void {\n entries.value.push(entry)\n return () => {\n const index = entries.value.indexOf(entry)\n if (index >= 0) entries.value.splice(index, 1)\n }\n}\n\nfunction entryOf(value: GrRadioValue): GrRadioEntry | undefined {\n return entries.value.find(entry => entry.value() === value)\n}\n\n/**\n * Кольцо roving-фокуса. Живёт в группе, а не в переключателе: состав знает\n * только она. Обе оси работают всегда — требование паттерна `radiogroup`,\n * стрелки зациклены, выключенные перешагиваются.\n */\nconst roving = useRovingFocus<GrRadioValue>({\n items: () => entries.value.map(entry => entry.value()),\n elementFor: value => entryOf(value)?.el() ?? null,\n isDisabled: value => entryOf(value)?.disabled() ?? true,\n orientation: () => 'both',\n skipDisabled: () => true,\n // Выбранное значение держит остановку `Tab` — но только пока переключатель\n // доступен: на выключенном `GrRadio` ставит `tabindex=\"-1\"` сам, и остановка\n // на нём означала бы, что `Tab` не приводит никуда.\n initialKey: () => {\n const entry = entryOf(props.modelValue)\n return entry && !entry.disabled() ? props.modelValue : undefined\n },\n // В `radiogroup` стрелка переносит выбор, а не только фокус.\n onMove: value => setValue(value),\n // Выбор меняет разметку: фокус ставим по перерисовке, иначе следующая\n // стрелка отсчитывалась бы от прежнего элемента.\n beforeFocus: () => nextTick(),\n})\n\n/** Императивный фокус ведёт на текущую остановку `Tab`, а не на первый элемент. */\nfunction rovingElement(): HTMLElement | null {\n const value = roving.rovingKey.value\n return value === undefined ? null : entryOf(value)?.el() ?? null\n}\n\nfunction focus(): void {\n rovingElement()?.focus()\n}\n\nfunction blur(): void {\n rovingElement()?.blur()\n}\n\nprovide(GR_RADIO_GROUP_CONTEXT, {\n modelValue: computed(() => props.modelValue),\n name: computed(() => props.name),\n disabled: computed(() => isDisabled.value),\n readonly: isReadonly,\n invalid: isInvalid,\n size: resolvedSize,\n setValue,\n register,\n rovingValue: roving.rovingKey,\n handleNavigationKeys: roving.handleNavigationKeys,\n})\n</script>\n\n<template>\n <div\n :id=\"fieldId\"\n ref=\"rootEl\"\n data-gr-radio-group\n role=\"radiogroup\"\n :aria-label=\"ariaLabel\"\n :aria-labelledby=\"labelledBy\"\n :aria-describedby=\"describedBy\"\n :aria-invalid=\"isInvalid ? 'true' : undefined\"\n :aria-required=\"isRequired ? 'true' : undefined\"\n :aria-readonly=\"isReadonly ? 'true' : undefined\"\n :aria-disabled=\"isDisabled ? 'true' : undefined\"\n @focusin=\"onFocusIn\"\n @focusout=\"onFocusOut\"\n >\n <template v-if=\"$slots.default\">\n <GrButtonGroup v-if=\"variant === 'button'\">\n <slot />\n </GrButtonGroup>\n <div v-else :class=\"listClass\">\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=\"String(opt.value)\"\n :value=\"opt.value\"\n :disabled=\"opt.disabled\"\n variant=\"button\"\n :size=\"resolvedSize\"\n >\n {{ opt.label }}\n </GrRadio>\n </GrButtonGroup>\n <div v-else :class=\"listClass\">\n <GrRadio\n v-for=\"opt in options ?? []\"\n :key=\"String(opt.value)\"\n :value=\"opt.value\"\n :disabled=\"opt.disabled\"\n >\n {{ opt.label }}\n\n <template v-if=\"opt.description\" #description>\n {{ opt.description }}\n </template>\n </GrRadio>\n </div>\n </template>\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"GrRadioGroup-CdQO4G-U.js","names":["$slots"],"sources":["../../../../src/components/GrRadioGroup/GrRadioGroup.vue","../../../../src/components/GrRadioGroup/GrRadioGroup.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, nextTick, provide, ref } from 'vue'\n\nimport { useGrComponentSize } from '../GrConfigProvider/context'\nimport { useGrFormFieldContext } from '../GrFormField/context'\nimport { useGrFormControl } from '../../composables/useGrFormControl'\nimport { useRovingFocus } from '../../composables/useRovingFocus'\nimport { useFocusWithin } from '../../composables/internal/useFocusWithin'\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/grRadioGroupContext'\nimport type { GrRadioEntry, GrRadioValue } from '../GrRadio/grRadioGroupContext'\n\nexport type GrRadioGroupVariant = 'radiobox' | 'button'\nexport type GrRadioGroupOrientation = 'vertical' | 'horizontal'\nexport interface GrRadioGroupOption {\n value: GrRadioValue\n label: string\n /** Отключить одну опцию, не переходя на слот. */\n disabled?: boolean\n /** Пояснение под подписью. Рисуется только в варианте `radiobox`. */\n description?: string\n}\n\n/**\n * GrRadioGroup — контейнер группы `GrRadio`.\n *\n * Может работать как через слот (ручной рендер `GrRadio`), так и через проп `options`.\n * Предоставляет дочерним `GrRadio` общий `modelValue`/`disabled`/`size`/`name` через `inject`.\n */\nexport interface GrRadioGroupProps {\n modelValue: GrRadioValue\n options?: GrRadioGroupOption[]\n name?: string\n disabled?: boolean\n /** Только для чтения: выбор видно, но он не меняется. */\n readonly?: boolean\n /** Визуальное и ARIA-состояние ошибки. */\n invalid?: boolean\n /** Обязательное поле (`aria-required`). */\n required?: boolean\n variant?: GrRadioGroupVariant\n /**\n * Раскладка варианта `radiobox`. Кнопочный вариант всегда горизонтальный —\n * его собирает `GrButtonGroup`.\n */\n orientation?: GrRadioGroupOrientation\n size?: GrButtonSize\n ariaLabel?: string\n}\n\nexport interface GrRadioGroupEmits {\n (e: 'update:modelValue', value: GrRadioValue): void\n (e: 'change', value: GrRadioValue): void\n (e: 'focus', event: FocusEvent): void\n (e: 'blur', event: FocusEvent): void\n}\n\nconst props = withDefaults(defineProps<GrRadioGroupProps>(), {\n options: undefined,\n name: undefined,\n disabled: false,\n readonly: false,\n invalid: false,\n required: false,\n variant: 'radiobox',\n orientation: 'vertical',\n size: undefined,\n ariaLabel: undefined,\n})\n\n// Эффективный размер группы: локальный проп → `GrConfigProvider` → `md`.\n// Дочерние `GrRadio` получают уже разрешённое значение через контекст, поэтому\n// провайдер работает и для них — без второго чтения конфига.\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrRadioGroup' })\n\n// Контекст `GrFormField`. Группа — не labelable-элемент, поэтому имя приходит\n// через `aria-labelledby` на подпись поля, а не через `<label for>`.\nconst field = useGrFormFieldContext()\nconst fieldId = computed(() => field?.id.value)\nconst describedBy = computed(() => field?.describedById.value)\nconst {\n disabled: isDisabled,\n invalid: isInvalid, required: isRequired, readonly: isReadonly } = useGrFormControl(() => props)\nconst labelledBy = computed(() => (props.ariaLabel ? undefined : field?.labelId.value))\n\nconst emit = defineEmits<GrRadioGroupEmits>()\ndefineSlots<{\n /** Собственная разметка переключателей вместо генерации из `options`. */\n default?: () => any\n}>()\n\n\nfunction setValue(next: GrRadioValue): void {\n if (isDisabled.value || isReadonly.value)\n return\n emit('update:modelValue', next)\n emit('change', next)\n}\n\nconst listClass = computed(() => (props.orientation === 'horizontal'\n ? 'flex flex-wrap items-start gap-x-6 gap-y-2'\n : 'grid gap-2'))\n\nconst rootEl = ref<HTMLElement | null>(null)\n\n// Фокус ходит между радиокнопками: без границы каждая стрелка давала бы\n// потребителю пару `blur` + `focus`.\nconst { onFocusIn, onFocusOut } = useFocusWithin(rootEl, {\n enter: event => emit('focus', event),\n leave: event => emit('blur', event),\n})\n\ndefineExpose({ focus, blur })\n\nconst entries = ref<GrRadioEntry[]>([])\n\nfunction register(entry: GrRadioEntry): () => void {\n entries.value.push(entry)\n return () => {\n const index = entries.value.indexOf(entry)\n if (index >= 0) entries.value.splice(index, 1)\n }\n}\n\nfunction entryOf(value: GrRadioValue): GrRadioEntry | undefined {\n return entries.value.find(entry => entry.value() === value)\n}\n\n/**\n * Кольцо roving-фокуса. Живёт в группе, а не в переключателе: состав знает\n * только она. Обе оси работают всегда — требование паттерна `radiogroup`,\n * стрелки зациклены, выключенные перешагиваются.\n */\nconst roving = useRovingFocus<GrRadioValue>({\n items: () => entries.value.map(entry => entry.value()),\n elementFor: value => entryOf(value)?.el() ?? null,\n isDisabled: value => entryOf(value)?.disabled() ?? true,\n orientation: () => 'both',\n skipDisabled: () => true,\n // Выбранное значение держит остановку `Tab` — но только пока переключатель\n // доступен: на выключенном `GrRadio` ставит `tabindex=\"-1\"` сам, и остановка\n // на нём означала бы, что `Tab` не приводит никуда.\n initialKey: () => {\n const entry = entryOf(props.modelValue)\n return entry && !entry.disabled() ? props.modelValue : undefined\n },\n // В `radiogroup` стрелка переносит выбор, а не только фокус.\n onMove: value => setValue(value),\n // Выбор меняет разметку: фокус ставим по перерисовке, иначе следующая\n // стрелка отсчитывалась бы от прежнего элемента.\n beforeFocus: () => nextTick(),\n})\n\n/** Императивный фокус ведёт на текущую остановку `Tab`, а не на первый элемент. */\nfunction rovingElement(): HTMLElement | null {\n const value = roving.rovingKey.value\n return value === undefined ? null : entryOf(value)?.el() ?? null\n}\n\nfunction focus(): void {\n rovingElement()?.focus()\n}\n\nfunction blur(): void {\n rovingElement()?.blur()\n}\n\nprovide(GR_RADIO_GROUP_CONTEXT, {\n modelValue: computed(() => props.modelValue),\n name: computed(() => props.name),\n disabled: computed(() => isDisabled.value),\n readonly: isReadonly,\n invalid: isInvalid,\n size: resolvedSize,\n setValue,\n register,\n rovingValue: roving.rovingKey,\n handleNavigationKeys: roving.handleNavigationKeys,\n})\n</script>\n\n<template>\n <div\n :id=\"fieldId\"\n ref=\"rootEl\"\n data-gr-radio-group\n role=\"radiogroup\"\n :aria-label=\"ariaLabel\"\n :aria-labelledby=\"labelledBy\"\n :aria-describedby=\"describedBy\"\n :aria-invalid=\"isInvalid ? 'true' : undefined\"\n :aria-required=\"isRequired ? 'true' : undefined\"\n :aria-readonly=\"isReadonly ? 'true' : undefined\"\n :aria-disabled=\"isDisabled ? 'true' : undefined\"\n @focusin=\"onFocusIn\"\n @focusout=\"onFocusOut\"\n >\n <template v-if=\"$slots.default\">\n <GrButtonGroup v-if=\"variant === 'button'\">\n <slot />\n </GrButtonGroup>\n <div v-else :class=\"listClass\">\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=\"String(opt.value)\"\n :value=\"opt.value\"\n :disabled=\"opt.disabled\"\n variant=\"button\"\n :size=\"resolvedSize\"\n >\n {{ opt.label }}\n </GrRadio>\n </GrButtonGroup>\n <div v-else :class=\"listClass\">\n <GrRadio\n v-for=\"opt in options ?? []\"\n :key=\"String(opt.value)\"\n :value=\"opt.value\"\n :disabled=\"opt.disabled\"\n >\n {{ opt.label }}\n\n <template v-if=\"opt.description\" #description>\n {{ opt.description }}\n </template>\n </GrRadio>\n </div>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, provide, ref } from 'vue'\n\nimport { useGrComponentSize } from '../GrConfigProvider/context'\nimport { useGrFormFieldContext } from '../GrFormField/context'\nimport { useGrFormControl } from '../../composables/useGrFormControl'\nimport { useRovingFocus } from '../../composables/useRovingFocus'\nimport { useFocusWithin } from '../../composables/internal/useFocusWithin'\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/grRadioGroupContext'\nimport type { GrRadioEntry, GrRadioValue } from '../GrRadio/grRadioGroupContext'\n\nexport type GrRadioGroupVariant = 'radiobox' | 'button'\nexport type GrRadioGroupOrientation = 'vertical' | 'horizontal'\nexport interface GrRadioGroupOption {\n value: GrRadioValue\n label: string\n /** Отключить одну опцию, не переходя на слот. */\n disabled?: boolean\n /** Пояснение под подписью. Рисуется только в варианте `radiobox`. */\n description?: string\n}\n\n/**\n * GrRadioGroup — контейнер группы `GrRadio`.\n *\n * Может работать как через слот (ручной рендер `GrRadio`), так и через проп `options`.\n * Предоставляет дочерним `GrRadio` общий `modelValue`/`disabled`/`size`/`name` через `inject`.\n */\nexport interface GrRadioGroupProps {\n modelValue: GrRadioValue\n options?: GrRadioGroupOption[]\n name?: string\n disabled?: boolean\n /** Только для чтения: выбор видно, но он не меняется. */\n readonly?: boolean\n /** Визуальное и ARIA-состояние ошибки. */\n invalid?: boolean\n /** Обязательное поле (`aria-required`). */\n required?: boolean\n variant?: GrRadioGroupVariant\n /**\n * Раскладка варианта `radiobox`. Кнопочный вариант всегда горизонтальный —\n * его собирает `GrButtonGroup`.\n */\n orientation?: GrRadioGroupOrientation\n size?: GrButtonSize\n ariaLabel?: string\n}\n\nexport interface GrRadioGroupEmits {\n (e: 'update:modelValue', value: GrRadioValue): void\n (e: 'change', value: GrRadioValue): void\n (e: 'focus', event: FocusEvent): void\n (e: 'blur', event: FocusEvent): void\n}\n\nconst props = withDefaults(defineProps<GrRadioGroupProps>(), {\n options: undefined,\n name: undefined,\n disabled: false,\n readonly: false,\n invalid: false,\n required: false,\n variant: 'radiobox',\n orientation: 'vertical',\n size: undefined,\n ariaLabel: undefined,\n})\n\n// Эффективный размер группы: локальный проп → `GrConfigProvider` → `md`.\n// Дочерние `GrRadio` получают уже разрешённое значение через контекст, поэтому\n// провайдер работает и для них — без второго чтения конфига.\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrRadioGroup' })\n\n// Контекст `GrFormField`. Группа — не labelable-элемент, поэтому имя приходит\n// через `aria-labelledby` на подпись поля, а не через `<label for>`.\nconst field = useGrFormFieldContext()\nconst fieldId = computed(() => field?.id.value)\nconst describedBy = computed(() => field?.describedById.value)\nconst {\n disabled: isDisabled,\n invalid: isInvalid, required: isRequired, readonly: isReadonly } = useGrFormControl(() => props)\nconst labelledBy = computed(() => (props.ariaLabel ? undefined : field?.labelId.value))\n\nconst emit = defineEmits<GrRadioGroupEmits>()\ndefineSlots<{\n /** Собственная разметка переключателей вместо генерации из `options`. */\n default?: () => any\n}>()\n\n\nfunction setValue(next: GrRadioValue): void {\n if (isDisabled.value || isReadonly.value)\n return\n emit('update:modelValue', next)\n emit('change', next)\n}\n\nconst listClass = computed(() => (props.orientation === 'horizontal'\n ? 'flex flex-wrap items-start gap-x-6 gap-y-2'\n : 'grid gap-2'))\n\nconst rootEl = ref<HTMLElement | null>(null)\n\n// Фокус ходит между радиокнопками: без границы каждая стрелка давала бы\n// потребителю пару `blur` + `focus`.\nconst { onFocusIn, onFocusOut } = useFocusWithin(rootEl, {\n enter: event => emit('focus', event),\n leave: event => emit('blur', event),\n})\n\ndefineExpose({ focus, blur })\n\nconst entries = ref<GrRadioEntry[]>([])\n\nfunction register(entry: GrRadioEntry): () => void {\n entries.value.push(entry)\n return () => {\n const index = entries.value.indexOf(entry)\n if (index >= 0) entries.value.splice(index, 1)\n }\n}\n\nfunction entryOf(value: GrRadioValue): GrRadioEntry | undefined {\n return entries.value.find(entry => entry.value() === value)\n}\n\n/**\n * Кольцо roving-фокуса. Живёт в группе, а не в переключателе: состав знает\n * только она. Обе оси работают всегда — требование паттерна `radiogroup`,\n * стрелки зациклены, выключенные перешагиваются.\n */\nconst roving = useRovingFocus<GrRadioValue>({\n items: () => entries.value.map(entry => entry.value()),\n elementFor: value => entryOf(value)?.el() ?? null,\n isDisabled: value => entryOf(value)?.disabled() ?? true,\n orientation: () => 'both',\n skipDisabled: () => true,\n // Выбранное значение держит остановку `Tab` — но только пока переключатель\n // доступен: на выключенном `GrRadio` ставит `tabindex=\"-1\"` сам, и остановка\n // на нём означала бы, что `Tab` не приводит никуда.\n initialKey: () => {\n const entry = entryOf(props.modelValue)\n return entry && !entry.disabled() ? props.modelValue : undefined\n },\n // В `radiogroup` стрелка переносит выбор, а не только фокус.\n onMove: value => setValue(value),\n // Выбор меняет разметку: фокус ставим по перерисовке, иначе следующая\n // стрелка отсчитывалась бы от прежнего элемента.\n beforeFocus: () => nextTick(),\n})\n\n/** Императивный фокус ведёт на текущую остановку `Tab`, а не на первый элемент. */\nfunction rovingElement(): HTMLElement | null {\n const value = roving.rovingKey.value\n return value === undefined ? null : entryOf(value)?.el() ?? null\n}\n\nfunction focus(): void {\n rovingElement()?.focus()\n}\n\nfunction blur(): void {\n rovingElement()?.blur()\n}\n\nprovide(GR_RADIO_GROUP_CONTEXT, {\n modelValue: computed(() => props.modelValue),\n name: computed(() => props.name),\n disabled: computed(() => isDisabled.value),\n readonly: isReadonly,\n invalid: isInvalid,\n size: resolvedSize,\n setValue,\n register,\n rovingValue: roving.rovingKey,\n handleNavigationKeys: roving.handleNavigationKeys,\n})\n</script>\n\n<template>\n <div\n :id=\"fieldId\"\n ref=\"rootEl\"\n data-gr-radio-group\n role=\"radiogroup\"\n :aria-label=\"ariaLabel\"\n :aria-labelledby=\"labelledBy\"\n :aria-describedby=\"describedBy\"\n :aria-invalid=\"isInvalid ? 'true' : undefined\"\n :aria-required=\"isRequired ? 'true' : undefined\"\n :aria-readonly=\"isReadonly ? 'true' : undefined\"\n :aria-disabled=\"isDisabled ? 'true' : undefined\"\n @focusin=\"onFocusIn\"\n @focusout=\"onFocusOut\"\n >\n <template v-if=\"$slots.default\">\n <GrButtonGroup v-if=\"variant === 'button'\">\n <slot />\n </GrButtonGroup>\n <div v-else :class=\"listClass\">\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=\"String(opt.value)\"\n :value=\"opt.value\"\n :disabled=\"opt.disabled\"\n variant=\"button\"\n :size=\"resolvedSize\"\n >\n {{ opt.label }}\n </GrRadio>\n </GrButtonGroup>\n <div v-else :class=\"listClass\">\n <GrRadio\n v-for=\"opt in options ?? []\"\n :key=\"String(opt.value)\"\n :value=\"opt.value\"\n :disabled=\"opt.disabled\"\n >\n {{ opt.label }}\n\n <template v-if=\"opt.description\" #description>\n {{ opt.description }}\n </template>\n </GrRadio>\n </div>\n </template>\n </div>\n</template>\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { t as GrRadioGroup_default } from "./chunks/GrRadioGroup-7w4bXIg_.js";
1
+ import { t as GrRadioGroup_default } from "./chunks/GrRadioGroup-CdQO4G-U.js";
2
2
  import { t as grRadioGroupConfig } from "../../chunks/config-QaIc_gRa.js";
3
3
  export { GrRadioGroup_default as GrRadioGroup, GrRadioGroup_default as default, grRadioGroupConfig };
@@ -3,7 +3,7 @@ import { n as useGranularityTranslations } from "../../../chunks/granularityI18n
3
3
  import { n as useGrFormFieldContext } from "../../../chunks/context-DdNIxa1w.js";
4
4
  import { useGrFormControl } from "../../../composables/useGrFormControl.js";
5
5
  import { n as iconTag, t as iconClass } from "../../../chunks/icon-Dag2tIMs.js";
6
- import { a as ratingSymbolClass, i as ratingRootClass, o as ratingTextSizeBySize, r as ratingFillClassByTone, s as ratingVoidClass } from "../../../chunks/config-Baj7Wvx-.js";
6
+ import { a as ratingSymbolClass, i as ratingRootClass, o as ratingTextSizeBySize, r as ratingFillClassByTone, s as ratingVoidClass } from "../../../chunks/config-DRbojEzO.js";
7
7
  import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, defineComponent, normalizeClass, normalizeStyle, openBlock, ref, renderList, renderSlot, resolveDynamicComponent, toDisplayString, unref } from "vue";
8
8
  //#region src/components/GrRating/GrRating.vue?vue&type=script&setup=true&lang.ts
9
9
  var _hoisted_1 = ["name", "value"];