@feugene/granularity 0.26.0 → 0.27.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (581) 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-CE-xtNP-.js} +4 -4
  223. package/dist/components/GrColorPicker/chunks/{GrColorPicker-CDaJRVIM.js.map → GrColorPicker-CE-xtNP-.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-k4SYIv64.js} +4 -4
  249. package/dist/components/GrDialogService/chunks/{GrDialogService-CHVR4sOk.js.map → GrDialogService-k4SYIv64.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-BqqoEl1b.js} +2 -2
  292. package/dist/components/GrInput/chunks/GrInput-BqqoEl1b.js.map +1 -0
  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-BoldivFc.js} +4 -4
  298. package/dist/components/GrJsonViewer/chunks/{GrJsonViewer-jk3ylOTc.js.map → GrJsonViewer-BoldivFc.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-kQhWlfs-.js} +3 -3
  321. package/dist/components/GrPagination/chunks/{GrPagination-DG7kp6VL.js.map → GrPagination-kQhWlfs-.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-D1ADRFxx.js} +6 -6
  331. package/dist/components/GrPromptDialog/chunks/GrPromptDialog-D1ADRFxx.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-D-KU9Lx_.js} +96 -89
  351. package/dist/components/GrSelect/chunks/GrSelect-D-KU9Lx_.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-g_OOSkh7.js} +5 -2
  373. package/dist/components/GrSwitch/chunks/GrSwitch-g_OOSkh7.js.map +1 -0
  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-CS1WQWsT.js} +18 -10
  400. package/dist/components/GrTreeSelect/chunks/GrTreeSelect-CS1WQWsT.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 +10 -2
  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/GrRadioGroup/index.d.ts +1 -1
  471. package/dist/types/components/GrRating/GrRating.vue.d.ts +1 -1
  472. package/dist/types/components/GrSegmented/GrSegmented.vue.d.ts +1 -1
  473. package/dist/types/components/GrSelect/grSelectStyles.d.ts +1 -1
  474. package/dist/types/components/GrSidebar/GrSidebar.vue.d.ts +7 -7
  475. package/dist/types/components/GrSidebar/grSidebarStyles.d.ts +4 -4
  476. package/dist/types/components/GrSlider/GrSlider.vue.d.ts +1 -1
  477. package/dist/types/components/GrSortableList/grSortableListStyles.d.ts +2 -2
  478. package/dist/types/components/GrSplitter/GrSplitter.vue.d.ts +1 -1
  479. package/dist/types/components/GrStatistic/GrStatistic.vue.d.ts +13 -13
  480. package/dist/types/components/GrSteps/grStepsStyles.d.ts +2 -2
  481. package/dist/types/components/GrSwitch/GrSwitch.vue.d.ts +10 -2
  482. package/dist/types/components/GrTabPanels/GrTabPanel.vue.d.ts +3 -3
  483. package/dist/types/components/GrTabPanels/GrTabPanels.vue.d.ts +3 -3
  484. package/dist/types/components/GrTable/GrTable.vue.d.ts +13 -13
  485. package/dist/types/components/GrTextarea/GrTextarea.vue.d.ts +1 -1
  486. package/dist/types/components/GrTreeSelect/grTreeSelectStyles.d.ts +1 -1
  487. package/dist/types/components/shared/classTokens.d.ts +8 -0
  488. package/dist/types/components/shared/numericStep.d.ts +14 -0
  489. package/dist/types/components/shared/overlayTransition.d.ts +33 -0
  490. package/dist/web-types.json +305 -229
  491. package/package.json +3 -3
  492. package/tokens/foundation.json +41 -1
  493. package/dist/chunks/classTokens-BzazaERD.js +0 -6
  494. package/dist/chunks/classTokens-BzazaERD.js.map +0 -1
  495. package/dist/chunks/config-9PYRZlKE.js.map +0 -1
  496. package/dist/chunks/config-B4w5gBD0.js.map +0 -1
  497. package/dist/chunks/config-BEVBsvni2.js.map +0 -1
  498. package/dist/chunks/config-BN4sXYXn.js.map +0 -1
  499. package/dist/chunks/config-BViooYNv.js.map +0 -1
  500. package/dist/chunks/config-B_qi4Fma.js.map +0 -1
  501. package/dist/chunks/config-Baj7Wvx-.js.map +0 -1
  502. package/dist/chunks/config-BbY2SKGE.js.map +0 -1
  503. package/dist/chunks/config-BfsBepkH.js.map +0 -1
  504. package/dist/chunks/config-Bpt9Xbxm.js.map +0 -1
  505. package/dist/chunks/config-BsPDQ0dS.js.map +0 -1
  506. package/dist/chunks/config-BtXRpAtq.js.map +0 -1
  507. package/dist/chunks/config-BuGlNPE92.js.map +0 -1
  508. package/dist/chunks/config-C8tVRv8i.js.map +0 -1
  509. package/dist/chunks/config-CIcynHGr.js.map +0 -1
  510. package/dist/chunks/config-CN2ULSQL.js.map +0 -1
  511. package/dist/chunks/config-CN970ZcJ.js.map +0 -1
  512. package/dist/chunks/config-COvrUfhR.js.map +0 -1
  513. package/dist/chunks/config-Cl4ST6Qd.js.map +0 -1
  514. package/dist/chunks/config-Cwd3yjRw.js.map +0 -1
  515. package/dist/chunks/config-D7zgE_Gr.js.map +0 -1
  516. package/dist/chunks/config-D94Z9po5.js.map +0 -1
  517. package/dist/chunks/config-DAX8Deh1.js.map +0 -1
  518. package/dist/chunks/config-DBmdgoVf.js.map +0 -1
  519. package/dist/chunks/config-DCFvmHEv.js.map +0 -1
  520. package/dist/chunks/config-DGWFal5h.js.map +0 -1
  521. package/dist/chunks/config-DKdlqXiY.js.map +0 -1
  522. package/dist/chunks/config-DSJY6aEl.js.map +0 -1
  523. package/dist/chunks/config-DWN4x6_e.js.map +0 -1
  524. package/dist/chunks/config-Dgj1Q6JY.js.map +0 -1
  525. package/dist/chunks/config-Dguto_6o.js.map +0 -1
  526. package/dist/chunks/config-DtgYuGUn2.js.map +0 -1
  527. package/dist/chunks/config-rkcKArZQ.js.map +0 -1
  528. package/dist/chunks/config-vSji8w90.js.map +0 -1
  529. package/dist/chunks/config-zjeAJ4ho2.js.map +0 -1
  530. package/dist/chunks/context-BfIQv7m12.js.map +0 -1
  531. package/dist/chunks/generated-CJe6hdiE.js.map +0 -1
  532. package/dist/chunks/grBadgeStyles-C1S56Alo.js.map +0 -1
  533. package/dist/chunks/grDropdownMenuStyles-D1LOkdVj.js.map +0 -1
  534. package/dist/chunks/grInputStyles-CJeMhUe5.js.map +0 -1
  535. package/dist/chunks/grKbdStyles-CeZhGQHr.js.map +0 -1
  536. package/dist/chunks/grLinkStyles-BoL8QYcV.js.map +0 -1
  537. package/dist/chunks/grPopoverStyles-Cke_BZsM.js.map +0 -1
  538. package/dist/chunks/grRadioStyles-BTjGNhtU.js.map +0 -1
  539. package/dist/chunks/grSelectStyles-eTz4uPMP.js.map +0 -1
  540. package/dist/chunks/grTextareaStyles-iOcHuVMM.js.map +0 -1
  541. package/dist/chunks/useMenuItemsFocus-OyOnIAlr.js.map +0 -1
  542. package/dist/components/GrAutocomplete/chunks/GrAutocomplete-D9c9BNFg.js.map +0 -1
  543. package/dist/components/GrBadge/chunks/GrBadge-_9rCHuE1.js.map +0 -1
  544. package/dist/components/GrBadgeWrap/chunks/GrBadgeWrap-DDoFQscR.js.map +0 -1
  545. package/dist/components/GrButton/chunks/GrButton-DCz-Wn-V.js.map +0 -1
  546. package/dist/components/GrButtonGroup/chunks/GrButtonGroup-BQo5VQ_c.js.map +0 -1
  547. package/dist/components/GrCard/chunks/GrCard-aQIjk6I9.js.map +0 -1
  548. package/dist/components/GrChip/chunks/GrChip-BnL2FedO.js.map +0 -1
  549. package/dist/components/GrCommandPalette/chunks/GrCommandPalette-BPsVN_XU.js.map +0 -1
  550. package/dist/components/GrConfirmDialog/chunks/GrConfirmDialog-CwXNLyzk.js.map +0 -1
  551. package/dist/components/GrContextMenu/chunks/GrContextMenu-BbAJholy.js.map +0 -1
  552. package/dist/components/GrDataTable/chunks/GrDataTable-NRbrXpdx.js.map +0 -1
  553. package/dist/components/GrDescriptionList/chunks/GrDescriptionList-1mICfrqX.js.map +0 -1
  554. package/dist/components/GrDialog/chunks/GrDialog-5Y5K87ss.js.map +0 -1
  555. package/dist/components/GrDivider/chunks/GrDivider-CAhm9jbE.js.map +0 -1
  556. package/dist/components/GrDropdown/chunks/GrDropdown-BfTmdPyh.js.map +0 -1
  557. package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu-l5HEqzjr.js.map +0 -1
  558. package/dist/components/GrDropdownMenu/chunks/GrDropdownMenuList-BGA_xNVo.js.map +0 -1
  559. package/dist/components/GrForm/chunks/GrForm-CAlJg-wb.js.map +0 -1
  560. package/dist/components/GrIcon/chunks/GrIcon-bQwtZtYT.js.map +0 -1
  561. package/dist/components/GrImageViewer/chunks/GrImageViewer-ng7el4wn.js.map +0 -1
  562. package/dist/components/GrInput/chunks/GrInput-Bb_pxqpT.js.map +0 -1
  563. package/dist/components/GrInputTag/chunks/GrInputTag-UI8kIB_F.js.map +0 -1
  564. package/dist/components/GrLink/chunks/GrLink-BQb7U4so.js.map +0 -1
  565. package/dist/components/GrList/chunks/GrList-B5bclmHV.js.map +0 -1
  566. package/dist/components/GrNumberInput/chunks/GrNumberInput-V2mZvDDC.js.map +0 -1
  567. package/dist/components/GrPopover/chunks/GrPopover-DDChM1jD.js.map +0 -1
  568. package/dist/components/GrPromptDialog/chunks/GrPromptDialog-BGuMUzlv.js.map +0 -1
  569. package/dist/components/GrRadio/chunks/GrRadio-BdhknbO8.js.map +0 -1
  570. package/dist/components/GrSelect/chunks/GrSelect-BA1wfX3c.js.map +0 -1
  571. package/dist/components/GrSlider/chunks/GrSlider-s99yAyz6.js.map +0 -1
  572. package/dist/components/GrStatistic/chunks/GrStatistic-BJQv5aOS.js.map +0 -1
  573. package/dist/components/GrSwitch/chunks/GrSwitch-CHiIj9GT.js.map +0 -1
  574. package/dist/components/GrTable/chunks/GrTable-f3qCWa99.js.map +0 -1
  575. package/dist/components/GrToaster/chunks/GrToaster-CC49q3a4.js.map +0 -1
  576. package/dist/components/GrTooltip/chunks/GrTooltip-B6AwE_UX.js.map +0 -1
  577. package/dist/components/GrTree/chunks/GrTree-J5q8aCya.js.map +0 -1
  578. package/dist/components/GrTreeSelect/chunks/GrTreeSelect-DEfxWAc3.js.map +0 -1
  579. /package/dist/chunks/{config-BuGlNPE92.js → config-BuGlNPE9.js} +0 -0
  580. /package/dist/chunks/{config-DBmdgoVf.js → config-DBmdgoVf2.js} +0 -0
  581. /package/dist/chunks/{context-BfIQv7m12.js → context-BfIQv7m1.js} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"GrCard-aQIjk6I9.js","names":["$slots"],"sources":["../../../../src/components/GrCard/GrCard.vue","../../../../src/components/GrCard/GrCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, markRaw, useId, useSlots, type Component } from 'vue'\n\nimport { useGrComponentProp } from '../GrConfigProvider/context'\n\nimport {\n cardDescriptionClass,\n cardTitleClass,\n grCardRootClass,\n ownHeaderPaddingClass,\n paddingClass,\n sectionDividerBottomClass,\n sectionDividerTopClass,\n type GrCardHeadingLevel,\n type GrCardPadding,\n type GrCardVariant,\n} from './grCardStyles'\n\nexport type { GrCardHeadingLevel, GrCardPadding, GrCardVariant } from './grCardStyles'\n\nexport interface GrCardProps {\n /**\n * Внутренние отступы. По умолчанию `none`: карточка — поверхность, а её\n * содержимое (`GrCollapse`, `GrList`) само знает про свои отступы.\n */\n padding?: GrCardPadding\n /** `elevated` — рамка, фон и тень; `outlined` — без тени; `ghost` — без рамки. */\n variant?: GrCardVariant\n /** Свой корневой тег (`RouterLink`, `Link` от Inertia). Сильнее `href`. */\n as?: string | Component\n /** Карточка-ссылка. */\n href?: string\n /** Карточка-кнопка: интерактивна вся поверхность. */\n clickable?: boolean\n /** Подсветка при наведении без интерактивности. */\n hoverable?: boolean\n /** Классы обёртки тела — она появляется вместе с секциями. */\n bodyClass?: string\n /**\n * Заголовок карточки — настоящий `h2`…`h6`, а не жирная строка: отчёт из\n * шести карточек иначе не обойти по структуре, после `h1` страницы в нём\n * нет ни одного заголовка.\n */\n title?: string\n /** Пояснение под заголовком. */\n description?: string\n /** Уровень заголовка под структуру страницы. Не задан — из `GrConfigProvider`, иначе `3`. */\n headingLevel?: GrCardHeadingLevel\n}\n\nexport interface GrCardEmits {\n (e: 'click', event: MouseEvent): void\n}\n\nconst props = withDefaults(defineProps<GrCardProps>(), {\n // Настраивается через `GrConfigProvider`; дефолты — в резолверах ниже.\n padding: undefined,\n variant: undefined,\n as: undefined,\n href: undefined,\n clickable: false,\n hoverable: false,\n bodyClass: undefined,\n title: undefined,\n description: undefined,\n headingLevel: undefined,\n})\n\nconst emit = defineEmits<GrCardEmits>()\n\nconst slots = useSlots()\n\nconst resolvedPadding = useGrComponentProp('GrCard', 'padding', () => props.padding, 'none')\nconst resolvedVariant = useGrComponentProp('GrCard', 'variant', () => props.variant, 'elevated')\n\nconst isInteractive = computed(() => !!props.as || !!props.href || props.clickable)\n\nconst rootTag = computed<string | Component>(() => {\n if (props.as)\n return typeof props.as === 'string' ? props.as : markRaw(props.as)\n\n if (props.href)\n return 'a'\n\n return props.clickable ? 'button' : 'div'\n})\n\n/**\n * Компонент-ссылка (`Link` от Inertia, `RouterLink`) рендерит `<a>` сам, и без\n * `href` он ведёт в никуда. Строковый тег, кроме `a`, атрибут не понимает —\n * там он и гасится.\n */\nconst rootHref = computed(() => (\n typeof rootTag.value === 'string' && rootTag.value !== 'a' ? undefined : props.href\n))\n\nconst headingLevel = useGrComponentProp('GrCard', 'headingLevel', () => props.headingLevel, 3)\n\n/**\n * Заголовок внутри `<button>` невалиден: контент-модель кнопки — phrasing\n * content. Кликабельная карточка печатает подпись `<span>`, а структура\n * страницы в этом случае собирается ссылкой в заголовке рядом с `hoverable`.\n */\nlet headingInButtonWarned = false\n\nconst headingTag = computed(() => {\n if (rootTag.value !== 'button') return `h${headingLevel.value}`\n\n if (!headingInButtonWarned && __GR_DEV__) {\n headingInButtonWarned = true\n console.warn(\n '[GrCard] `title` внутри `clickable` печатается `<span>`: заголовок в '\n + '`<button>` невалиден по HTML. Нужен заголовок в структуре страницы — '\n + 'замените `clickable` на `hoverable` и поставьте ссылку в сам заголовок.',\n )\n }\n\n return 'span'\n})\n\nconst titleId = useId()\nconst descriptionId = useId()\n\n// `#header` сильнее пропов: нестандартная шапка не обязана объяснять, почему\n// она не `title`.\nconst hasOwnHeader = computed(() => Boolean(slots.header))\nconst hasTitle = computed(() => !hasOwnHeader.value && Boolean(props.title))\nconst hasDescription = computed(() => !hasOwnHeader.value && Boolean(props.description))\nconst hasHeadingBlock = computed(() => hasTitle.value || hasDescription.value)\n\n/**\n * Обёртки появляются, только когда их попросили: карточка без секций остаётся\n * одним `<div>` со слотом внутри — ровно тем, что рендерили `GrCollapse` и\n * `GrList` до появления пропов.\n */\nconst hasSections = computed(() => Boolean(\n slots.header || slots.footer || props.bodyClass || hasHeadingBlock.value,\n))\n\n/**\n * Имя карточки-ссылки. Без него доступным именем становится всё содержимое\n * подряд — заголовок, описание и тело одной строкой.\n */\nconst rootLabelledBy = computed(() => (isInteractive.value && hasTitle.value ? titleId : undefined))\nconst rootDescribedBy = computed(() => (isInteractive.value && hasDescription.value ? descriptionId : undefined))\n\nconst rootClass = computed(() => grCardRootClass({\n variant: resolvedVariant.value,\n // С секциями отступ принадлежит каждой из них, а не поверхности целиком.\n padding: hasSections.value ? 'none' : resolvedPadding.value,\n interactive: isInteractive.value,\n hoverable: props.hoverable,\n}))\n\nconst sectionPaddingClass = computed(() => paddingClass[resolvedPadding.value])\n\n/**\n * Карточка отбивает то, что рисует сама. Шапка из `title` — её собственная, и\n * отступ ей полагается независимо от `padding`. Слот `#header` сильнее пропов и\n * заменяет шапку целиком: там отступы принадлежат тому, кто её наполнил, —\n * иначе потребитель со своими отступами внутри слота получил бы двойные.\n */\nconst headerClass = computed(() => [\n hasOwnHeader.value ? sectionPaddingClass.value : ownHeaderPaddingClass,\n sectionDividerBottomClass,\n].filter(Boolean).join(' '))\nconst footerClass = computed(() => [sectionPaddingClass.value, sectionDividerTopClass].filter(Boolean).join(' '))\nconst bodySectionClass = computed(() => [sectionPaddingClass.value, props.bodyClass].filter(Boolean).join(' '))\n\nfunction onClick(event: MouseEvent): void {\n emit('click', event)\n}\n</script>\n\n<template>\n <component\n :is=\"rootTag\"\n data-gr-card\n :type=\"rootTag === 'button' ? 'button' : undefined\"\n :href=\"rootHref\"\n :class=\"rootClass\"\n :aria-labelledby=\"rootLabelledBy\"\n :aria-describedby=\"rootDescribedBy\"\n @click=\"onClick\"\n >\n <template v-if=\"hasSections\">\n <div v-if=\"hasOwnHeader || hasHeadingBlock\" data-gr-card-header :class=\"headerClass\">\n <slot name=\"header\">\n <component\n :is=\"headingTag\"\n v-if=\"hasTitle\"\n :id=\"titleId\"\n data-gr-card-title\n :class=\"cardTitleClass\"\n >\n {{ title }}\n </component>\n\n <p\n v-if=\"hasDescription\"\n :id=\"descriptionId\"\n data-gr-card-description\n :class=\"cardDescriptionClass\"\n >\n {{ description }}\n </p>\n </slot>\n </div>\n\n <div data-gr-card-body :class=\"bodySectionClass\">\n <slot />\n </div>\n\n <div v-if=\"$slots.footer\" data-gr-card-footer :class=\"footerClass\">\n <slot name=\"footer\" />\n </div>\n </template>\n\n <slot v-else />\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, markRaw, useId, useSlots, type Component } from 'vue'\n\nimport { useGrComponentProp } from '../GrConfigProvider/context'\n\nimport {\n cardDescriptionClass,\n cardTitleClass,\n grCardRootClass,\n ownHeaderPaddingClass,\n paddingClass,\n sectionDividerBottomClass,\n sectionDividerTopClass,\n type GrCardHeadingLevel,\n type GrCardPadding,\n type GrCardVariant,\n} from './grCardStyles'\n\nexport type { GrCardHeadingLevel, GrCardPadding, GrCardVariant } from './grCardStyles'\n\nexport interface GrCardProps {\n /**\n * Внутренние отступы. По умолчанию `none`: карточка — поверхность, а её\n * содержимое (`GrCollapse`, `GrList`) само знает про свои отступы.\n */\n padding?: GrCardPadding\n /** `elevated` — рамка, фон и тень; `outlined` — без тени; `ghost` — без рамки. */\n variant?: GrCardVariant\n /** Свой корневой тег (`RouterLink`, `Link` от Inertia). Сильнее `href`. */\n as?: string | Component\n /** Карточка-ссылка. */\n href?: string\n /** Карточка-кнопка: интерактивна вся поверхность. */\n clickable?: boolean\n /** Подсветка при наведении без интерактивности. */\n hoverable?: boolean\n /** Классы обёртки тела — она появляется вместе с секциями. */\n bodyClass?: string\n /**\n * Заголовок карточки — настоящий `h2`…`h6`, а не жирная строка: отчёт из\n * шести карточек иначе не обойти по структуре, после `h1` страницы в нём\n * нет ни одного заголовка.\n */\n title?: string\n /** Пояснение под заголовком. */\n description?: string\n /** Уровень заголовка под структуру страницы. Не задан — из `GrConfigProvider`, иначе `3`. */\n headingLevel?: GrCardHeadingLevel\n}\n\nexport interface GrCardEmits {\n (e: 'click', event: MouseEvent): void\n}\n\nconst props = withDefaults(defineProps<GrCardProps>(), {\n // Настраивается через `GrConfigProvider`; дефолты — в резолверах ниже.\n padding: undefined,\n variant: undefined,\n as: undefined,\n href: undefined,\n clickable: false,\n hoverable: false,\n bodyClass: undefined,\n title: undefined,\n description: undefined,\n headingLevel: undefined,\n})\n\nconst emit = defineEmits<GrCardEmits>()\n\nconst slots = useSlots()\n\nconst resolvedPadding = useGrComponentProp('GrCard', 'padding', () => props.padding, 'none')\nconst resolvedVariant = useGrComponentProp('GrCard', 'variant', () => props.variant, 'elevated')\n\nconst isInteractive = computed(() => !!props.as || !!props.href || props.clickable)\n\nconst rootTag = computed<string | Component>(() => {\n if (props.as)\n return typeof props.as === 'string' ? props.as : markRaw(props.as)\n\n if (props.href)\n return 'a'\n\n return props.clickable ? 'button' : 'div'\n})\n\n/**\n * Компонент-ссылка (`Link` от Inertia, `RouterLink`) рендерит `<a>` сам, и без\n * `href` он ведёт в никуда. Строковый тег, кроме `a`, атрибут не понимает —\n * там он и гасится.\n */\nconst rootHref = computed(() => (\n typeof rootTag.value === 'string' && rootTag.value !== 'a' ? undefined : props.href\n))\n\nconst headingLevel = useGrComponentProp('GrCard', 'headingLevel', () => props.headingLevel, 3)\n\n/**\n * Заголовок внутри `<button>` невалиден: контент-модель кнопки — phrasing\n * content. Кликабельная карточка печатает подпись `<span>`, а структура\n * страницы в этом случае собирается ссылкой в заголовке рядом с `hoverable`.\n */\nlet headingInButtonWarned = false\n\nconst headingTag = computed(() => {\n if (rootTag.value !== 'button') return `h${headingLevel.value}`\n\n if (!headingInButtonWarned && __GR_DEV__) {\n headingInButtonWarned = true\n console.warn(\n '[GrCard] `title` внутри `clickable` печатается `<span>`: заголовок в '\n + '`<button>` невалиден по HTML. Нужен заголовок в структуре страницы — '\n + 'замените `clickable` на `hoverable` и поставьте ссылку в сам заголовок.',\n )\n }\n\n return 'span'\n})\n\nconst titleId = useId()\nconst descriptionId = useId()\n\n// `#header` сильнее пропов: нестандартная шапка не обязана объяснять, почему\n// она не `title`.\nconst hasOwnHeader = computed(() => Boolean(slots.header))\nconst hasTitle = computed(() => !hasOwnHeader.value && Boolean(props.title))\nconst hasDescription = computed(() => !hasOwnHeader.value && Boolean(props.description))\nconst hasHeadingBlock = computed(() => hasTitle.value || hasDescription.value)\n\n/**\n * Обёртки появляются, только когда их попросили: карточка без секций остаётся\n * одним `<div>` со слотом внутри — ровно тем, что рендерили `GrCollapse` и\n * `GrList` до появления пропов.\n */\nconst hasSections = computed(() => Boolean(\n slots.header || slots.footer || props.bodyClass || hasHeadingBlock.value,\n))\n\n/**\n * Имя карточки-ссылки. Без него доступным именем становится всё содержимое\n * подряд — заголовок, описание и тело одной строкой.\n */\nconst rootLabelledBy = computed(() => (isInteractive.value && hasTitle.value ? titleId : undefined))\nconst rootDescribedBy = computed(() => (isInteractive.value && hasDescription.value ? descriptionId : undefined))\n\nconst rootClass = computed(() => grCardRootClass({\n variant: resolvedVariant.value,\n // С секциями отступ принадлежит каждой из них, а не поверхности целиком.\n padding: hasSections.value ? 'none' : resolvedPadding.value,\n interactive: isInteractive.value,\n hoverable: props.hoverable,\n}))\n\nconst sectionPaddingClass = computed(() => paddingClass[resolvedPadding.value])\n\n/**\n * Карточка отбивает то, что рисует сама. Шапка из `title` — её собственная, и\n * отступ ей полагается независимо от `padding`. Слот `#header` сильнее пропов и\n * заменяет шапку целиком: там отступы принадлежат тому, кто её наполнил, —\n * иначе потребитель со своими отступами внутри слота получил бы двойные.\n */\nconst headerClass = computed(() => [\n hasOwnHeader.value ? sectionPaddingClass.value : ownHeaderPaddingClass,\n sectionDividerBottomClass,\n].filter(Boolean).join(' '))\nconst footerClass = computed(() => [sectionPaddingClass.value, sectionDividerTopClass].filter(Boolean).join(' '))\nconst bodySectionClass = computed(() => [sectionPaddingClass.value, props.bodyClass].filter(Boolean).join(' '))\n\nfunction onClick(event: MouseEvent): void {\n emit('click', event)\n}\n</script>\n\n<template>\n <component\n :is=\"rootTag\"\n data-gr-card\n :type=\"rootTag === 'button' ? 'button' : undefined\"\n :href=\"rootHref\"\n :class=\"rootClass\"\n :aria-labelledby=\"rootLabelledBy\"\n :aria-describedby=\"rootDescribedBy\"\n @click=\"onClick\"\n >\n <template v-if=\"hasSections\">\n <div v-if=\"hasOwnHeader || hasHeadingBlock\" data-gr-card-header :class=\"headerClass\">\n <slot name=\"header\">\n <component\n :is=\"headingTag\"\n v-if=\"hasTitle\"\n :id=\"titleId\"\n data-gr-card-title\n :class=\"cardTitleClass\"\n >\n {{ title }}\n </component>\n\n <p\n v-if=\"hasDescription\"\n :id=\"descriptionId\"\n data-gr-card-description\n :class=\"cardDescriptionClass\"\n >\n {{ description }}\n </p>\n </slot>\n </div>\n\n <div data-gr-card-body :class=\"bodySectionClass\">\n <slot />\n </div>\n\n <div v-if=\"$slots.footer\" data-gr-card-footer :class=\"footerClass\">\n <slot name=\"footer\" />\n </div>\n </template>\n\n <slot v-else />\n </component>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsDA,MAAM,QAAQ;EAcd,MAAM,OAAO;EAEb,MAAM,QAAQ,SAAS;EAEvB,MAAM,kBAAkB,mBAAmB,UAAU,iBAAiB,MAAM,SAAS,MAAM;EAC3F,MAAM,kBAAkB,mBAAmB,UAAU,iBAAiB,MAAM,SAAS,UAAU;EAE/F,MAAM,gBAAgB,eAAe,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,MAAM,QAAQ,MAAM,SAAS;EAElF,MAAM,UAAU,eAAmC;GACjD,IAAI,MAAM,IACR,OAAO,OAAO,MAAM,OAAO,WAAW,MAAM,KAAK,QAAQ,MAAM,EAAE;GAEnE,IAAI,MAAM,MACR,OAAO;GAET,OAAO,MAAM,YAAY,WAAW;EACtC,CAAC;;;;;;EAOD,MAAM,WAAW,eACf,OAAO,QAAQ,UAAU,YAAY,QAAQ,UAAU,MAAM,KAAA,IAAY,MAAM,IAChF;EAED,MAAM,eAAe,mBAAmB,UAAU,sBAAsB,MAAM,cAAc,CAAC;;;;;;EAO7F,IAAI,wBAAwB;EAE5B,MAAM,aAAa,eAAe;GAChC,IAAI,QAAQ,UAAU,UAAU,OAAO,IAAI,aAAa;GAExD,IAAI,CAAC,yBAAA,OAAA,YAAA,eAAA,QAAA,IAAA,aAAA,cAAqC;IACxC,wBAAwB;IACxB,QAAQ,KACN,mNAGF;GACF;GAEA,OAAO;EACT,CAAC;EAED,MAAM,UAAU,MAAM;EACtB,MAAM,gBAAgB,MAAM;EAI5B,MAAM,eAAe,eAAe,QAAQ,MAAM,MAAM,CAAC;EACzD,MAAM,WAAW,eAAe,CAAC,aAAa,SAAS,QAAQ,MAAM,KAAK,CAAC;EAC3E,MAAM,iBAAiB,eAAe,CAAC,aAAa,SAAS,QAAQ,MAAM,WAAW,CAAC;EACvF,MAAM,kBAAkB,eAAe,SAAS,SAAS,eAAe,KAAK;;;;;;EAO7E,MAAM,cAAc,eAAe,QACjC,MAAM,UAAU,MAAM,UAAU,MAAM,aAAa,gBAAgB,KACrE,CAAC;;;;;EAMD,MAAM,iBAAiB,eAAgB,cAAc,SAAS,SAAS,QAAQ,UAAU,KAAA,CAAU;EACnG,MAAM,kBAAkB,eAAgB,cAAc,SAAS,eAAe,QAAQ,gBAAgB,KAAA,CAAU;EAEhH,MAAM,YAAY,eAAe,gBAAgB;GAC/C,SAAS,gBAAgB;GAEzB,SAAS,YAAY,QAAQ,SAAS,gBAAgB;GACtD,aAAa,cAAc;GAC3B,WAAW,MAAM;EACnB,CAAC,CAAC;EAEF,MAAM,sBAAsB,eAAe,aAAa,gBAAgB,MAAM;;;;;;;EAQ9E,MAAM,cAAc,eAAe,CACjC,aAAa,QAAQ,oBAAoB,QAAQ,uBACjD,yBACF,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC;EAC3B,MAAM,cAAc,eAAe,CAAC,oBAAoB,OAAO,sBAAsB,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC;EAChH,MAAM,mBAAmB,eAAe,CAAC,oBAAoB,OAAO,MAAM,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC;EAE9G,SAAS,QAAQ,OAAyB;GACxC,KAAK,SAAS,KAAK;EACrB;;uBAIE,YA4CY,wBA3CL,QAAA,KAAO,GAAA;IACZ,gBAAA;IACC,MAAM,QAAA,UAAO,WAAA,WAA2B,KAAA;IACxC,MAAM,SAAA;IACN,OAAK,eAAE,UAAA,KAAS;IAChB,mBAAiB,eAAA;IACjB,oBAAkB,gBAAA;IACX;;2BAiCG,CA/BK,YAAA,SAAA,UAAA,GAAhB,mBA+BW,UAAA,EAAA,KAAA,EAAA,GAAA;KA9BE,aAAA,SAAgB,gBAAA,SAAA,UAAA,GAA3B,mBAqBM,OAAA;;MArBsC,uBAAA;MAAqB,OAAK,eAAE,YAAA,KAAW;SACjF,WAmBO,KAAA,QAAA,UAAA,CAAA,SAAA,CAhBG,SAAA,SAAA,UAAA,GAFR,YAQY,wBAPL,WAAA,KAAU,GAAA;;MAEd,IAAI,MAAA,OAAA;MACL,sBAAA;MACC,OAAK,eAAE,MAAA,cAAA,CAAc;;6BAEX,CAAA,gBAAA,gBAAR,QAAA,KAAK,GAAA,CAAA,CAAA,CAAA;;6DAIF,eAAA,SAAA,UAAA,GADR,mBAOI,KAAA;;MALD,IAAI,MAAA,aAAA;MACL,4BAAA;MACC,OAAK,eAAE,MAAA,oBAAA,CAAoB;wBAEzB,QAAA,WAAW,GAAA,IAAA,UAAA,KAAA,mBAAA,IAAA,IAAA,CAAA,CAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA;KAKpB,mBAEM,OAAA;MAFD,qBAAA;MAAmB,OAAK,eAAE,iBAAA,KAAgB;SAC7C,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA;KAGCA,KAAAA,OAAO,UAAA,UAAA,GAAlB,mBAEM,OAAA;;MAFoB,uBAAA;MAAqB,OAAK,eAAE,YAAA,KAAW;SAC/D,WAAsB,KAAA,QAAA,QAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA;cAI1B,WAAe,KAAA,QAAA,WAAA,CAAA,GAAA,KAAA,GAAA,KAAA,GAAA,CAAA,CAAA,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"GrChip-BnL2FedO.js","names":["$slots"],"sources":["../../../../src/components/GrChip/GrChip.vue","../../../../src/components/GrChip/GrChip.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, inject, onBeforeUnmount, ref } from 'vue'\n\nimport IconClose from '~icons/lucide/x'\n\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\n\nimport type { GrChipValue } from './grChipGroupContext'\nimport { GR_CHIP_GROUP_CONTEXT } from './grChipGroupContext'\nimport type { GrChipRadius, GrChipSize, GrChipTone } from './grChipStyles'\nimport {\n chipCloseButtonClass,\n chipCloseClass,\n chipIconClass,\n chipIconSizeClassBySize,\n chipLabelClass,\n grChipClass,\n} from './grChipStyles'\n\n/**\n * Интерактивный тег: снимаемый, выбираемый, с иконкой.\n *\n * От `GrBadge` отличается не видом, а природой: бейдж — метка, чип — виджет.\n * Поэтому цвета и радиусы взяты у бейджа как есть (в одном ряду они обязаны\n * совпадать), а роль, клавиатура и размеры — свои.\n */\nexport interface GrChipProps {\n /** Значение чипа в группе. Вне `GrChipGroup` не используется. */\n value?: GrChipValue\n /**\n * Подпись. Нужна отдельно от слота: из неё собирается имя кнопки снятия —\n * «Убрать» на двадцати кнопках подряд не даёт выбрать нужную.\n */\n label?: string\n tone?: GrChipTone\n dark?: boolean\n size?: GrChipSize\n radius?: GrChipRadius\n /** Чип становится переключателем: `aria-pressed`, `Enter`/`Space`. */\n selectable?: boolean\n /** Состояние переключателя вне группы. Внутри группы значение ведёт группа. */\n selected?: boolean\n /** Крестик. Внутри виджета он не кнопка — см. блок про роли ниже. */\n closable?: boolean\n disabled?: boolean\n /** Доступное имя, когда подпись не объясняет назначения. */\n ariaLabel?: string\n /** Имя кнопки снятия целиком. Перебивает собранное из `label`. */\n removeLabel?: string\n}\n\nexport interface GrChipEmits {\n (e: 'update:selected', value: boolean): void\n (e: 'remove'): void\n}\n\nconst props = withDefaults(defineProps<GrChipProps>(), {\n value: undefined,\n label: undefined,\n // Дефолты живут в резолверах ниже: Vue подставил бы свой раньше, чем\n // компонент заглянет в `GrConfigProvider`.\n tone: undefined,\n dark: undefined,\n size: undefined,\n radius: undefined,\n selectable: false,\n selected: false,\n closable: false,\n disabled: false,\n ariaLabel: undefined,\n removeLabel: undefined,\n})\n\nconst emit = defineEmits<GrChipEmits>()\n\ndefineSlots<{\n /** Подпись чипа. Внутри выбираемого чипа — только фразовое содержимое. */\n default?: () => unknown\n /** Иконка перед подписью. */\n icon?: () => unknown\n}>()\n\nconst { t } = useGranularityTranslations()\n\nconst group = inject(GR_CHIP_GROUP_CONTEXT, null)\nconst rootEl = ref<HTMLElement | null>(null)\n\nconst inGroup = computed(() => group !== null && props.value !== undefined)\n\nconst isDisabled = computed(() => props.disabled || (group?.disabled.value ?? false))\nconst isReadonly = computed(() => group?.readonly.value ?? false)\n\n/**\n * Чип — виджет ровно тогда, когда по нему кликают.\n *\n * От этого зависит вся разметка: у виджета роль, `tabindex` и клавиатура, а\n * крестик внутри него перестаёт быть кнопкой.\n */\nconst isInteractive = computed(() => inGroup.value || props.selectable)\n\nconst isSelected = computed(() => {\n if (inGroup.value && props.value !== undefined) return group!.isSelected(props.value)\n return props.selected\n})\n\nconst isClosable = computed(() => {\n if (isReadonly.value || isDisabled.value) return false\n return props.closable || (inGroup.value ? group!.closable.value : false)\n})\n\n// Приоритет: локальный проп → значение группы → `GrConfigProvider` → дефолт.\n// Группа специфичнее конфига, поэтому её значение подаётся как «локальное».\nconst resolvedSize = useGrComponentSize<GrChipSize>(\n () => props.size ?? (inGroup.value ? group!.size.value : undefined),\n { component: 'GrChip' },\n)\nconst resolvedTone = useGrComponentProp(\n 'GrChip',\n 'tone',\n () => props.tone ?? (inGroup.value ? group!.tone.value : undefined),\n 'neutral',\n)\nconst resolvedRadius = useGrComponentProp(\n 'GrChip',\n 'radius',\n () => props.radius ?? (inGroup.value ? group!.radius.value : undefined),\n 'round',\n)\nconst resolvedDark = useGrComponentProp(\n 'GrChip',\n 'dark',\n () => props.dark ?? (inGroup.value ? group!.dark.value : undefined),\n false,\n)\n\nconst rootClass = computed(() => grChipClass({\n tone: resolvedTone.value,\n dark: resolvedDark.value,\n size: resolvedSize.value,\n radius: resolvedRadius.value,\n interactive: isInteractive.value && !isReadonly.value,\n selected: isSelected.value,\n disabled: isDisabled.value,\n}))\n\nconst iconSizeClass = computed(() => chipIconSizeClassBySize[resolvedSize.value])\n\nconst removeTitle = computed(() => {\n if (props.removeLabel) return props.removeLabel\n if (props.label) return t('gr.chip.removeNamed', 'Remove {label}', { label: props.label })\n return t('gr.chip.remove', 'Remove')\n})\n\n/**\n * Роль чипа задаёт группа, а не потребитель.\n *\n * Одиночный переключатель — кнопка с `aria-pressed`; в группе роль зависит от\n * множественности выбора: `radio` в одиночной (образец — `GrSegmented`),\n * `option` во множественной, где контейнер объявлен `listbox` c\n * `aria-multiselectable`.\n */\nconst chipRole = computed(() => {\n if (!inGroup.value) return undefined\n return group!.selection.value === 'single' ? 'radio' : 'option'\n})\n\nconst tabindex = computed(() => {\n if (!isInteractive.value) return undefined\n if (isDisabled.value) return -1\n if (!inGroup.value || props.value === undefined) return 0\n return group!.rovingValue.value === props.value ? 0 : -1\n})\n\nfunction toggle(): void {\n if (isDisabled.value || isReadonly.value) return\n\n if (inGroup.value && props.value !== undefined) {\n group!.toggle(props.value)\n return\n }\n\n if (props.selectable) emit('update:selected', !props.selected)\n}\n\nfunction requestRemove(): void {\n if (!isClosable.value) return\n\n emit('remove')\n if (inGroup.value && props.value !== undefined) group!.requestRemove(props.value)\n}\n\n/**\n * Крестик внутри виджета — не кнопка, поэтому его клик приходит сюда же и\n * разбирается по цели. Тот же приём у `GrTabs`: внутрь роли-виджета вложенная\n * кнопка запрещена (axe: `nested-interactive`), а `<button>` внутри `<button>`\n * невалиден и по контент-модели HTML.\n */\nfunction onRootClick(event: MouseEvent): void {\n if (isDisabled.value) return\n\n if (event.target instanceof Element && event.target.closest('[data-gr-chip-close]')) {\n requestRemove()\n return\n }\n\n toggle()\n}\n\nfunction onRootKeydown(event: KeyboardEvent): void {\n if (isDisabled.value) return\n\n // Навигация принадлежит группе: состав знает только она.\n if (inGroup.value && group!.handleNavigationKeys(event)) return\n\n if (event.key === 'Delete' || event.key === 'Backspace') {\n if (!isClosable.value) return\n event.preventDefault()\n requestRemove()\n }\n}\n\nif (group) {\n const unregister = group.register({\n value: () => props.value as GrChipValue,\n disabled: () => isDisabled.value,\n el: () => rootEl.value,\n })\n onBeforeUnmount(unregister)\n}\n\ndefineExpose({\n focus: () => rootEl.value?.focus(),\n blur: () => rootEl.value?.blur(),\n})\n</script>\n\n<template>\n <component\n :is=\"isInteractive ? 'button' : 'span'\"\n ref=\"rootEl\"\n data-gr-chip\n :type=\"isInteractive ? 'button' : undefined\"\n :class=\"rootClass\"\n :role=\"chipRole\"\n :data-value=\"value\"\n :aria-label=\"ariaLabel\"\n :aria-checked=\"chipRole === 'radio' ? (isSelected ? 'true' : 'false') : undefined\"\n :aria-selected=\"chipRole === 'option' ? (isSelected ? 'true' : 'false') : undefined\"\n :aria-pressed=\"isInteractive && !chipRole ? (isSelected ? 'true' : 'false') : undefined\"\n :aria-disabled=\"isDisabled ? 'true' : undefined\"\n :disabled=\"isInteractive && isDisabled ? true : undefined\"\n :aria-keyshortcuts=\"isInteractive && isClosable ? 'Delete' : undefined\"\n :tabindex=\"tabindex\"\n @click=\"isInteractive ? onRootClick($event) : undefined\"\n @keydown=\"isInteractive ? onRootKeydown($event) : undefined\"\n >\n <span v-if=\"$slots.icon\" data-gr-chip-icon :class=\"[chipIconClass, iconSizeClass]\">\n <slot name=\"icon\" />\n </span>\n\n <span data-gr-chip-label :class=\"chipLabelClass\">\n <slot>{{ label }}</slot>\n </span>\n\n <!--\n Крестик существует в двух видах, и различитель — роль самого чипа.\n Виджет: `<span aria-hidden>` вне таб-порядка, снятие идёт `Delete`/`Backspace`.\n Не виджет: настоящая кнопка со своей остановкой `Tab` и своим именем.\n -->\n <span\n v-if=\"isClosable && isInteractive\"\n data-gr-chip-close\n :class=\"[chipCloseClass, iconSizeClass]\"\n :title=\"removeTitle\"\n aria-hidden=\"true\"\n >\n <IconClose class=\"h-full w-full\" />\n </span>\n\n <button\n v-else-if=\"isClosable\"\n data-gr-chip-close\n type=\"button\"\n :class=\"[chipCloseButtonClass, iconSizeClass]\"\n :aria-label=\"removeTitle\"\n @mousedown.prevent.stop\n @click.stop=\"requestRemove()\"\n >\n <IconClose class=\"h-full w-full\" />\n </button>\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject, onBeforeUnmount, ref } from 'vue'\n\nimport IconClose from '~icons/lucide/x'\n\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\n\nimport type { GrChipValue } from './grChipGroupContext'\nimport { GR_CHIP_GROUP_CONTEXT } from './grChipGroupContext'\nimport type { GrChipRadius, GrChipSize, GrChipTone } from './grChipStyles'\nimport {\n chipCloseButtonClass,\n chipCloseClass,\n chipIconClass,\n chipIconSizeClassBySize,\n chipLabelClass,\n grChipClass,\n} from './grChipStyles'\n\n/**\n * Интерактивный тег: снимаемый, выбираемый, с иконкой.\n *\n * От `GrBadge` отличается не видом, а природой: бейдж — метка, чип — виджет.\n * Поэтому цвета и радиусы взяты у бейджа как есть (в одном ряду они обязаны\n * совпадать), а роль, клавиатура и размеры — свои.\n */\nexport interface GrChipProps {\n /** Значение чипа в группе. Вне `GrChipGroup` не используется. */\n value?: GrChipValue\n /**\n * Подпись. Нужна отдельно от слота: из неё собирается имя кнопки снятия —\n * «Убрать» на двадцати кнопках подряд не даёт выбрать нужную.\n */\n label?: string\n tone?: GrChipTone\n dark?: boolean\n size?: GrChipSize\n radius?: GrChipRadius\n /** Чип становится переключателем: `aria-pressed`, `Enter`/`Space`. */\n selectable?: boolean\n /** Состояние переключателя вне группы. Внутри группы значение ведёт группа. */\n selected?: boolean\n /** Крестик. Внутри виджета он не кнопка — см. блок про роли ниже. */\n closable?: boolean\n disabled?: boolean\n /** Доступное имя, когда подпись не объясняет назначения. */\n ariaLabel?: string\n /** Имя кнопки снятия целиком. Перебивает собранное из `label`. */\n removeLabel?: string\n}\n\nexport interface GrChipEmits {\n (e: 'update:selected', value: boolean): void\n (e: 'remove'): void\n}\n\nconst props = withDefaults(defineProps<GrChipProps>(), {\n value: undefined,\n label: undefined,\n // Дефолты живут в резолверах ниже: Vue подставил бы свой раньше, чем\n // компонент заглянет в `GrConfigProvider`.\n tone: undefined,\n dark: undefined,\n size: undefined,\n radius: undefined,\n selectable: false,\n selected: false,\n closable: false,\n disabled: false,\n ariaLabel: undefined,\n removeLabel: undefined,\n})\n\nconst emit = defineEmits<GrChipEmits>()\n\ndefineSlots<{\n /** Подпись чипа. Внутри выбираемого чипа — только фразовое содержимое. */\n default?: () => unknown\n /** Иконка перед подписью. */\n icon?: () => unknown\n}>()\n\nconst { t } = useGranularityTranslations()\n\nconst group = inject(GR_CHIP_GROUP_CONTEXT, null)\nconst rootEl = ref<HTMLElement | null>(null)\n\nconst inGroup = computed(() => group !== null && props.value !== undefined)\n\nconst isDisabled = computed(() => props.disabled || (group?.disabled.value ?? false))\nconst isReadonly = computed(() => group?.readonly.value ?? false)\n\n/**\n * Чип — виджет ровно тогда, когда по нему кликают.\n *\n * От этого зависит вся разметка: у виджета роль, `tabindex` и клавиатура, а\n * крестик внутри него перестаёт быть кнопкой.\n */\nconst isInteractive = computed(() => inGroup.value || props.selectable)\n\nconst isSelected = computed(() => {\n if (inGroup.value && props.value !== undefined) return group!.isSelected(props.value)\n return props.selected\n})\n\nconst isClosable = computed(() => {\n if (isReadonly.value || isDisabled.value) return false\n return props.closable || (inGroup.value ? group!.closable.value : false)\n})\n\n// Приоритет: локальный проп → значение группы → `GrConfigProvider` → дефолт.\n// Группа специфичнее конфига, поэтому её значение подаётся как «локальное».\nconst resolvedSize = useGrComponentSize<GrChipSize>(\n () => props.size ?? (inGroup.value ? group!.size.value : undefined),\n { component: 'GrChip' },\n)\nconst resolvedTone = useGrComponentProp(\n 'GrChip',\n 'tone',\n () => props.tone ?? (inGroup.value ? group!.tone.value : undefined),\n 'neutral',\n)\nconst resolvedRadius = useGrComponentProp(\n 'GrChip',\n 'radius',\n () => props.radius ?? (inGroup.value ? group!.radius.value : undefined),\n 'round',\n)\nconst resolvedDark = useGrComponentProp(\n 'GrChip',\n 'dark',\n () => props.dark ?? (inGroup.value ? group!.dark.value : undefined),\n false,\n)\n\nconst rootClass = computed(() => grChipClass({\n tone: resolvedTone.value,\n dark: resolvedDark.value,\n size: resolvedSize.value,\n radius: resolvedRadius.value,\n interactive: isInteractive.value && !isReadonly.value,\n selected: isSelected.value,\n disabled: isDisabled.value,\n}))\n\nconst iconSizeClass = computed(() => chipIconSizeClassBySize[resolvedSize.value])\n\nconst removeTitle = computed(() => {\n if (props.removeLabel) return props.removeLabel\n if (props.label) return t('gr.chip.removeNamed', 'Remove {label}', { label: props.label })\n return t('gr.chip.remove', 'Remove')\n})\n\n/**\n * Роль чипа задаёт группа, а не потребитель.\n *\n * Одиночный переключатель — кнопка с `aria-pressed`; в группе роль зависит от\n * множественности выбора: `radio` в одиночной (образец — `GrSegmented`),\n * `option` во множественной, где контейнер объявлен `listbox` c\n * `aria-multiselectable`.\n */\nconst chipRole = computed(() => {\n if (!inGroup.value) return undefined\n return group!.selection.value === 'single' ? 'radio' : 'option'\n})\n\nconst tabindex = computed(() => {\n if (!isInteractive.value) return undefined\n if (isDisabled.value) return -1\n if (!inGroup.value || props.value === undefined) return 0\n return group!.rovingValue.value === props.value ? 0 : -1\n})\n\nfunction toggle(): void {\n if (isDisabled.value || isReadonly.value) return\n\n if (inGroup.value && props.value !== undefined) {\n group!.toggle(props.value)\n return\n }\n\n if (props.selectable) emit('update:selected', !props.selected)\n}\n\nfunction requestRemove(): void {\n if (!isClosable.value) return\n\n emit('remove')\n if (inGroup.value && props.value !== undefined) group!.requestRemove(props.value)\n}\n\n/**\n * Крестик внутри виджета — не кнопка, поэтому его клик приходит сюда же и\n * разбирается по цели. Тот же приём у `GrTabs`: внутрь роли-виджета вложенная\n * кнопка запрещена (axe: `nested-interactive`), а `<button>` внутри `<button>`\n * невалиден и по контент-модели HTML.\n */\nfunction onRootClick(event: MouseEvent): void {\n if (isDisabled.value) return\n\n if (event.target instanceof Element && event.target.closest('[data-gr-chip-close]')) {\n requestRemove()\n return\n }\n\n toggle()\n}\n\nfunction onRootKeydown(event: KeyboardEvent): void {\n if (isDisabled.value) return\n\n // Навигация принадлежит группе: состав знает только она.\n if (inGroup.value && group!.handleNavigationKeys(event)) return\n\n if (event.key === 'Delete' || event.key === 'Backspace') {\n if (!isClosable.value) return\n event.preventDefault()\n requestRemove()\n }\n}\n\nif (group) {\n const unregister = group.register({\n value: () => props.value as GrChipValue,\n disabled: () => isDisabled.value,\n el: () => rootEl.value,\n })\n onBeforeUnmount(unregister)\n}\n\ndefineExpose({\n focus: () => rootEl.value?.focus(),\n blur: () => rootEl.value?.blur(),\n})\n</script>\n\n<template>\n <component\n :is=\"isInteractive ? 'button' : 'span'\"\n ref=\"rootEl\"\n data-gr-chip\n :type=\"isInteractive ? 'button' : undefined\"\n :class=\"rootClass\"\n :role=\"chipRole\"\n :data-value=\"value\"\n :aria-label=\"ariaLabel\"\n :aria-checked=\"chipRole === 'radio' ? (isSelected ? 'true' : 'false') : undefined\"\n :aria-selected=\"chipRole === 'option' ? (isSelected ? 'true' : 'false') : undefined\"\n :aria-pressed=\"isInteractive && !chipRole ? (isSelected ? 'true' : 'false') : undefined\"\n :aria-disabled=\"isDisabled ? 'true' : undefined\"\n :disabled=\"isInteractive && isDisabled ? true : undefined\"\n :aria-keyshortcuts=\"isInteractive && isClosable ? 'Delete' : undefined\"\n :tabindex=\"tabindex\"\n @click=\"isInteractive ? onRootClick($event) : undefined\"\n @keydown=\"isInteractive ? onRootKeydown($event) : undefined\"\n >\n <span v-if=\"$slots.icon\" data-gr-chip-icon :class=\"[chipIconClass, iconSizeClass]\">\n <slot name=\"icon\" />\n </span>\n\n <span data-gr-chip-label :class=\"chipLabelClass\">\n <slot>{{ label }}</slot>\n </span>\n\n <!--\n Крестик существует в двух видах, и различитель — роль самого чипа.\n Виджет: `<span aria-hidden>` вне таб-порядка, снятие идёт `Delete`/`Backspace`.\n Не виджет: настоящая кнопка со своей остановкой `Tab` и своим именем.\n -->\n <span\n v-if=\"isClosable && isInteractive\"\n data-gr-chip-close\n :class=\"[chipCloseClass, iconSizeClass]\"\n :title=\"removeTitle\"\n aria-hidden=\"true\"\n >\n <IconClose class=\"h-full w-full\" />\n </span>\n\n <button\n v-else-if=\"isClosable\"\n data-gr-chip-close\n type=\"button\"\n :class=\"[chipCloseButtonClass, iconSizeClass]\"\n :aria-label=\"removeTitle\"\n @mousedown.prevent.stop\n @click.stop=\"requestRemove()\"\n >\n <IconClose class=\"h-full w-full\" />\n </button>\n </component>\n</template>\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"GrCommandPalette-BPsVN_XU.js","names":["$emit","$slots"],"sources":["../../../../src/components/GrCommandPalette/filtering.ts","../../../../src/components/GrCommandPalette/GrCommandPalette.vue","../../../../src/components/GrCommandPalette/GrCommandPalette.vue"],"sourcesContent":["import type { Component } from 'vue'\n\nimport { matchesQueryParts, normalizeOptionQuery } from '../shared/optionFilter'\n\n/** Команда палитры. `id` обязателен — он же ключ рендера и цель `aria-activedescendant`. */\nexport type GrCommandItem = {\n id: string\n label: string\n /** Пояснение под меткой. */\n description?: string\n /**\n * Иконка команды: Vue-компонент либо класс иконки вашей UnoCSS-сборки\n * (`'i-lucide-file-plus'` — тогда нужен ваш `presetIcons`).\n */\n icon?: string | Component\n /** Подсказка сочетания клавиш — массив клавиш, каждая рисуется отдельным `GrKbd`. */\n shortcut?: string[]\n /** Заголовок группы, под которой команда показывается в списке. */\n group?: string\n /** Дополнительные слова для поиска (синонимы, транслитерация). */\n keywords?: string[]\n disabled?: boolean\n}\n\n/** Команды, сгруппированные для рендера: порядок групп — порядок первого вхождения. */\nexport type GrCommandGroup = {\n /** `undefined` — команды без группы (рендерятся без заголовка). */\n name: string | undefined\n items: GrCommandItem[]\n}\n\nexport type GrCommandFilter = (item: GrCommandItem, query: string) => boolean\n\n/**\n * Матчер по умолчанию: подстрока (без учёта регистра) в метке, описании,\n * названии группы или ключевых словах.\n *\n * Набор полей у команды шире, чем у опции списка, а сам подстрочный матч — тот\n * же самый на весь пакет (`shared/optionFilter.ts`).\n */\nexport function matchCommandItem(item: GrCommandItem, query: string): boolean {\n const parts = [item.label, item.description, item.group, ...(item.keywords ?? [])]\n\n return matchesQueryParts(parts, normalizeOptionQuery(query))\n}\n\nexport function filterCommandItems(\n items: GrCommandItem[],\n query: string,\n filter: GrCommandFilter = matchCommandItem,\n): GrCommandItem[] {\n if (!query.trim()) return items\n return items.filter(item => filter(item, query))\n}\n\n/**\n * Раскладывает плоский список по группам, сохраняя порядок первого появления\n * группы. Команды без `group` собираются в единственную безымянную группу,\n * которая остаётся на своём месте в общем порядке.\n */\nexport function groupCommandItems(items: GrCommandItem[]): GrCommandGroup[] {\n const groups: GrCommandGroup[] = []\n const byName = new Map<string | undefined, GrCommandGroup>()\n\n for (const item of items) {\n const name = item.group || undefined\n let group = byName.get(name)\n if (!group) {\n group = { name, items: [] }\n byName.set(name, group)\n groups.push(group)\n }\n group.items.push(item)\n }\n\n return groups\n}\n\n/** Кусок текста для подсветки: `match` — попал в запрос. */\nexport type GrCommandMatchSegment = {\n text: string\n match: boolean\n}\n\n/**\n * Режет текст на сегменты по вхождению запроса (без учёта регистра).\n *\n * Совпадения нет — один сегмент целиком: свой `filter` вправе матчить по\n * `keywords`, и тогда в метке подсвечивать нечего. Регистр исходного текста\n * сохраняется — подсветка не должна менять то, что читает пользователь.\n */\nexport function splitCommandMatch(text: string, query: string): GrCommandMatchSegment[] {\n const needle = query.trim().toLowerCase()\n if (!needle || !text) return [{ text, match: false }]\n\n const segments: GrCommandMatchSegment[] = []\n const haystack = text.toLowerCase()\n let from = 0\n\n while (from < text.length) {\n const at = haystack.indexOf(needle, from)\n if (at < 0) break\n\n if (at > from) segments.push({ text: text.slice(from, at), match: false })\n segments.push({ text: text.slice(at, at + needle.length), match: true })\n from = at + needle.length\n }\n\n if (!segments.length) return [{ text, match: false }]\n if (from < text.length) segments.push({ text: text.slice(from), match: false })\n\n return segments\n}\n\n/**\n * Поднимает «недавние» команды в отдельную группу наверх, сохраняя порядок\n * `recentIds`, и убирает их из остального списка — иначе одна и та же команда\n * оказалась бы в списке дважды, а `id` у неё один.\n */\nexport function withRecentCommands(\n groups: GrCommandGroup[],\n items: GrCommandItem[],\n recentIds: string[],\n title: string,\n): GrCommandGroup[] {\n if (!recentIds.length) return groups\n\n const byId = new Map(items.map(item => [item.id, item]))\n const recent: GrCommandItem[] = []\n const taken = new Set<string>()\n\n for (const id of recentIds) {\n const item = byId.get(id)\n if (!item || taken.has(id)) continue\n recent.push(item)\n taken.add(id)\n }\n\n if (!recent.length) return groups\n\n const rest = groups\n .map(group => ({ ...group, items: group.items.filter(item => !taken.has(item.id)) }))\n .filter(group => group.items.length > 0)\n\n return [{ name: title, items: recent }, ...rest]\n}\n\n/** Идентификаторы, встретившиеся больше одного раза. */\nexport function findDuplicateCommandIds(items: GrCommandItem[]): string[] {\n const seen = new Set<string>()\n const duplicates = new Set<string>()\n\n for (const item of items) {\n if (seen.has(item.id)) duplicates.add(item.id)\n else seen.add(item.id)\n }\n\n return [...duplicates]\n}\n","<script setup lang=\"ts\">\nimport { useGrComponentProp } from '../GrConfigProvider/context'\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, useId, watch } from 'vue'\n\nimport { useVirtualList } from '../../composables/useVirtualList'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport { isComposingEvent } from '../../internal/keyboard'\nimport { useComboboxNavigation } from '../../composables/useComboboxNavigation'\nimport { iconClass, iconTag } from '../shared/icon'\nimport GrKbd from '../GrKbd/GrKbd.vue'\nimport GrModal from '../GrModal/GrModal.vue'\n\nimport {\n filterCommandItems,\n findDuplicateCommandIds,\n groupCommandItems,\n matchCommandItem,\n splitCommandMatch,\n withRecentCommands,\n type GrCommandFilter,\n type GrCommandItem,\n} from './filtering'\nimport {\n formatCommandHotkey,\n isAppleDevice,\n matchesCommandHotkey,\n parseCommandHotkey,\n} from '../shared/hotkey'\nimport {\n commandEmptyClass,\n commandFooterClass,\n commandGroupLabelClass,\n commandItemClass,\n commandItemDescriptionClass,\n commandItemMutedClass,\n commandMatchClass,\n commandPaletteModalSizeBySize,\n commandSearchInputClass,\n commandSearchRowClass,\n type GrCommandPaletteSize,\n} from './grCommandPaletteStyles'\n\nimport IconLoaderCircle from '~icons/lucide/loader-circle'\nimport IconSearch from '~icons/lucide/search'\n\nexport type { GrCommandFilter, GrCommandGroup, GrCommandItem } from './filtering'\nexport type { GrCommandPaletteSize } from './grCommandPaletteStyles'\n\n/**\n * Публичный GR-примитив «Command palette» (⌘K) — модальный поиск по командам\n * приложения с группировкой, подсказками сочетаний и клавиатурной навигацией.\n *\n * A11y: WAI-ARIA combobox поверх модалки — `role=\"combobox\"` на поле ввода,\n * `role=\"listbox\"` на списке, `aria-activedescendant` на активной команде\n * (фокус остаётся в поле). Esc, фокус-ловушка и блокировка скролла приходят\n * из `GrModal`.\n *\n * Открытие по глобальному сочетанию (`hotkey`, по умолчанию `mod+k` — Cmd на\n * macOS, Ctrl на прочих) компонент берёт на себя; передайте `hotkey: null`,\n * чтобы управлять открытием только через `v-model`.\n */\nexport interface GrCommandPaletteProps {\n /** Открыта ли палитра. */\n modelValue: boolean\n /** Плоский список команд; группировка — по полю `group` самой команды. */\n items?: GrCommandItem[]\n /**\n * Недавние команды: пока запрос пуст, они поднимаются отдельной группой\n * наверх в этом порядке и не дублируются ниже.\n */\n recentIds?: string[]\n placeholder?: string\n size?: GrCommandPaletteSize\n /** Глобальное сочетание открытия. `null` — не вешать слушатель. */\n hotkey?: string | null\n /** Локальная фильтрация по запросу. `false` — фильтрует владелец по событию `search`. */\n filterable?: boolean\n /** Кастомный матчер локальной фильтрации. */\n filter?: GrCommandFilter\n /** Внешне управляемое состояние загрузки (для remote-поиска). */\n loading?: boolean\n /** Закрывать палитру после выбора команды. */\n closeOnSelect?: boolean\n /** Максимальная высота списка, px. */\n maxHeight?: number\n /**\n * Виртуализация списка: в DOM живёт только окно вокруг вьюпорта. Высоту окна\n * задаёт `maxHeight`.\n *\n * Включается осознанно: на сотне команд выигрыша нет, а в разметке остаётся\n * только окно — вместе с ним меняется и то, что находит `querySelector`\n * потребителя. Профильный сценарий — палитра приложения на тысячи команд.\n */\n virtual?: boolean\n /** Показывать подсказку сочетания в поле ввода. */\n showHotkeyHint?: boolean\n emptyText?: string\n ariaLabel?: string\n}\n\nexport interface GrCommandPaletteEmits {\n (e: 'update:modelValue', value: boolean): void\n /** Команда выбрана (клик или Enter). */\n (e: 'select', item: GrCommandItem): void\n /** Поисковый запрос изменился — точка входа для remote-поиска. */\n (e: 'search', query: string): void\n}\n\nimport './defaults'\n\nconst props = withDefaults(\n defineProps<GrCommandPaletteProps>(),\n {\n items: undefined,\n recentIds: undefined,\n placeholder: undefined,\n // Дефолт `size` живёт в резолвере ниже, а не здесь: Vue подставил бы его\n // до того, как компонент заглянет в `GrConfigProvider`.\n size: undefined,\n hotkey: 'mod+k',\n filterable: true,\n filter: undefined,\n loading: false,\n closeOnSelect: true,\n maxHeight: 360,\n virtual: false,\n showHotkeyHint: true,\n emptyText: undefined,\n ariaLabel: undefined,\n },\n)\n\nconst emit = defineEmits<GrCommandPaletteEmits>()\n\nconst { t } = useGranularityTranslations()\n\nconst resolvedPlaceholder = computed(() => props.placeholder ?? t('gr.commandPalette.placeholder', 'Type a command or search…'))\nconst resolvedEmptyText = computed(() => props.emptyText ?? t('gr.commandPalette.empty', 'Nothing found'))\nconst resolvedAriaLabel = computed(() => props.ariaLabel ?? t('gr.commandPalette.label', 'Command palette'))\nconst loadingText = computed(() => t('gr.commandPalette.loading', 'Loading…'))\nconst recentTitle = computed(() => t('gr.commandPalette.recent', 'Recent'))\n\nconst query = ref('')\nconst inputEl = ref<HTMLInputElement | null>(null)\nconst listboxId = useId()\n\nconst itemsResolved = computed<GrCommandItem[]>(() => props.items ?? [])\n\nconst filteredItems = computed<GrCommandItem[]>(() =>\n props.filterable\n ? filterCommandItems(itemsResolved.value, query.value, props.filter ?? matchCommandItem)\n : itemsResolved.value,\n)\n\nconst groups = computed(() => {\n const grouped = groupCommandItems(filteredItems.value)\n\n // С непустым запросом секции «недавние» нет: там правит релевантность, а не\n // история — иначе первая же буква уводила бы взгляд не туда.\n if (query.value.trim()) return grouped\n\n return withRecentCommands(grouped, filteredItems.value, props.recentIds ?? [], recentTitle.value)\n})\n\n/**\n * Порядок обхода стрелками совпадает с порядком на экране: «недавние» стоят\n * первыми, значит и первая стрелка ведёт туда же.\n */\nconst orderedItems = computed(() => groups.value.flatMap(group => group.items))\n\n/** Плоский список того, что реально выбирается — по нему ходят стрелки. */\nconst navigableItems = computed(() => orderedItems.value.filter(item => !item.disabled))\n\nfunction itemDomId(id: string): string {\n return `${listboxId}-item-${id}`\n}\n\n/**\n * Виртуализация списка.\n *\n * Набор — плоский поток строк экрана: заголовок группы занимает такую же\n * строку, как команда, поэтому входит в него наравне. Вложенную структуру\n * рендер пересобирает уже из окна.\n */\n\n/** Оценки высоты строк. Команда крупнее заголовка; дальше уточняются замером. */\nconst ITEM_SIZE_ESTIMATE = 44\nconst GROUP_LABEL_SIZE_ESTIMATE = 28\n\ntype PaletteRow =\n | { kind: 'label', groupIndex: number }\n | { kind: 'item', groupIndex: number, item: GrCommandItem, posInSet: number, setSize: number }\n\nconst listEl = ref<HTMLElement | null>(null)\n\nconst paletteRows = computed<PaletteRow[]>(() => {\n const rows: PaletteRow[] = []\n\n groups.value.forEach((group, groupIndex) => {\n if (group.name) rows.push({ kind: 'label', groupIndex })\n\n group.items.forEach((item, index) => {\n rows.push({\n kind: 'item',\n groupIndex,\n item,\n // Набор — группа, а не весь список: по ARIA позиция отсчитывается от неё.\n posInSet: index + 1,\n setSize: group.items.length,\n })\n })\n })\n\n return rows\n})\n\nconst virtualizer = useVirtualList({\n container: listEl,\n count: () => (props.virtual ? paletteRows.value.length : 0),\n // Запрос пересобирает набор строк — замеры прошлого набора невалидны.\n source: () => paletteRows.value,\n itemSize: index => (paletteRows.value[index]?.kind === 'label' ? GROUP_LABEL_SIZE_ESTIMATE : ITEM_SIZE_ESTIMATE),\n // Список закрытой палитры не смонтирован вовсе: `clientHeight` взять неоткуда.\n // `maxHeight` можно перебить `--gr-command-list-max-height` — тогда точная\n // высота приедет с первым замером, а это останется оценкой первого рендера.\n viewportSize: () => props.maxHeight,\n})\n\n/**\n * Группы к отрисовке. При виртуализации пересобираются из среза `paletteRows`:\n * группа, начатая выше окна, всё равно открывается — иначе её команды остались\n * бы прямыми потомками listbox'а, что роль запрещает.\n */\ntype RenderedGroup = {\n key: string\n groupIndex: number\n name: string | undefined\n labelVisible: boolean\n /** Позиция строки заголовка в `paletteRows` — по ней его замеряет виртуализатор. */\n labelRowIndex?: number\n items: { item: GrCommandItem, rowIndex: number, posInSet: number, setSize: number }[]\n}\n\nconst renderedGroups = computed<RenderedGroup[]>(() => {\n const rows = paletteRows.value\n\n const from = props.virtual ? virtualizer.range.value.start : 0\n const to = props.virtual ? Math.min(rows.length, virtualizer.range.value.end) : rows.length\n\n const result: RenderedGroup[] = []\n let current: RenderedGroup | undefined\n\n for (let rowIndex = from; rowIndex < to; rowIndex++) {\n const row = rows[rowIndex]!\n const group = groups.value[row.groupIndex]\n\n if (!current || current.groupIndex !== row.groupIndex) {\n current = {\n key: group?.name ?? `__ungrouped-${row.groupIndex}`,\n groupIndex: row.groupIndex,\n name: group?.name,\n labelVisible: false,\n items: [],\n }\n result.push(current)\n }\n\n if (row.kind === 'label') {\n current.labelVisible = true\n current.labelRowIndex = rowIndex\n continue\n }\n\n current.items.push({ item: row.item, rowIndex, posInSet: row.posInSet, setSize: row.setSize })\n }\n\n return result\n})\n\n/** ARIA набора: объявляем только при виртуализации — иначе набор виден по DOM. */\nfunction itemSetProps(entry: { posInSet: number, setSize: number }): Record<string, number> | undefined {\n if (!props.virtual) return undefined\n return { 'aria-setsize': entry.setSize, 'aria-posinset': entry.posInSet }\n}\n\n\n/** Сегменты подсветки: совпавшее с запросом рисуется `<mark>`. */\nfunction matchSegments(text: string): ReturnType<typeof splitCommandMatch> {\n return splitCommandMatch(text, props.filterable ? query.value : '')\n}\n\nasync function scrollActiveIntoView(item: GrCommandItem): Promise<void> {\n // Вне окна активной команды в DOM нет: `getElementById` вернул бы `null`,\n // прокрутка не случилась бы, а `aria-activedescendant` указал бы в пустоту.\n if (props.virtual) {\n const rowIndex = paletteRows.value.findIndex(row => row.kind === 'item' && row.item.id === item.id)\n if (rowIndex >= 0) virtualizer.scrollToIndex(rowIndex)\n }\n\n await nextTick()\n document.getElementById(itemDomId(item.id))?.scrollIntoView?.({ block: 'nearest' })\n}\n\nconst {\n activeItem,\n activeDescendantId,\n setActive,\n reset: resetActive,\n handleNavigationKeys,\n} = useComboboxNavigation<GrCommandItem>({\n items: () => navigableItems.value,\n open: () => props.modelValue,\n idOf: item => itemDomId(item.id),\n scrollTo: item => scrollActiveIntoView(item),\n})\n\n// Палитра всегда стартует с первой команды — и при монтировании открытой тоже.\nresetActive(0)\n\nfunction isActive(item: GrCommandItem): boolean {\n return activeItem.value?.id === item.id\n}\n\n// Активной становится первая команда, когда список изменился **по содержимому**.\n// Следить за идентичностью массива нельзя: родитель, отдающий `:items` инлайн-\n// выражением, пересоздаёт его на каждый посторонний ререндер — и выбранная\n// стрелками команда прыгала бы в начало.\n// Разделитель — пробел, а не запятая: `id` вправе её содержать, и «a,b» + «c»\n// дало бы тот же ключ, что «a» + «b,c».\nwatch(\n () => orderedItems.value.map(item => item.id).join(' '),\n () => resetActive(0),\n)\n\n// `id` — ключ рендера и цель `aria-activedescendant`: дубли дают одинаковые\n// DOM-id, и фокус уезжает не на ту команду.\nwatch(\n itemsResolved,\n (items) => {\n if (!__GR_DEV__) return\n const duplicates = findDuplicateCommandIds(items)\n if (!duplicates.length) return\n\n console.warn(\n `[GrCommandPalette] повторяющиеся id команд: ${duplicates.join(', ')}. `\n + 'Из-за одинаковых DOM-id `aria-activedescendant` укажет не на ту команду.',\n )\n },\n { immediate: true },\n)\n\nfunction open(): void {\n emit('update:modelValue', true)\n}\n\nfunction close(): void {\n emit('update:modelValue', false)\n}\n\nfunction toggle(): void {\n emit('update:modelValue', !props.modelValue)\n}\n\nfunction selectItem(item: GrCommandItem): void {\n if (item.disabled) return\n emit('select', item)\n if (props.closeOnSelect) close()\n}\n\nfunction onItemHover(item: GrCommandItem): void {\n const index = navigableItems.value.indexOf(item)\n if (index >= 0) setActive(index)\n}\n\nfunction onInput(event: Event): void {\n query.value = (event.target as HTMLInputElement).value\n emit('search', query.value.trim())\n}\n\nfunction onKeydown(event: KeyboardEvent): void {\n // Клавиша во время IME-композиции принадлежит композиции: Enter коммитит её,\n // стрелки ходят по кандидатам.\n if (isComposingEvent(event)) return\n\n if (handleNavigationKeys(event)) return\n\n switch (event.key) {\n case 'Enter':\n if (!activeItem.value) break\n event.preventDefault()\n selectItem(activeItem.value)\n break\n }\n}\n\n// ————— Открытие: сброс запроса и выбора.\nwatch(\n () => props.modelValue,\n (open) => {\n if (!open) return\n\n query.value = ''\n resetActive(0)\n },\n)\n\n// Фокус в поле — отдельным наблюдателем, и по появлению самого поля: содержимое\n// панели рождается вместе с ней, и по одному лишь пропу фокусировать нечего.\n// Ловушка фокуса `GrModal` этот выбор не перебивает — фокус, уже стоящий внутри\n// слоя, она считает осознанным.\nwatch(\n [() => props.modelValue, inputEl],\n ([open]) => {\n if (open) inputEl.value?.focus()\n },\n { flush: 'post' },\n)\n\n// ————— Глобальное сочетание открытия.\nconst parsedHotkey = computed(() => (props.hotkey ? parseCommandHotkey(props.hotkey) : null))\n\n// Платформа определяется только после монтирования: на сервере `navigator` нет,\n// и первый рендер обязан совпасть с серверным. Иначе сервер отдаёт `Ctrl`,\n// клиент на macOS рисует `⌘`, и гидрация расходится по тексту подсказки.\nconst isApple = ref(false)\n\nconst hotkeyHint = computed(() =>\n props.showHotkeyHint && parsedHotkey.value ? formatCommandHotkey(parsedHotkey.value, isApple.value) : [],\n)\n\nfunction onWindowKeydown(event: KeyboardEvent): void {\n const hotkey = parsedHotkey.value\n if (!hotkey || !matchesCommandHotkey(event, hotkey, isApple.value)) return\n event.preventDefault()\n toggle()\n}\n\nonMounted(() => {\n if (typeof window === 'undefined') return\n isApple.value = isAppleDevice()\n window.addEventListener('keydown', onWindowKeydown)\n})\n\nonBeforeUnmount(() => {\n if (typeof window !== 'undefined') window.removeEventListener('keydown', onWindowKeydown)\n})\n\n// Эффективный размер: локальный проп → `GrConfigProvider` → дефолт компонента.\nconst resolvedSize = useGrComponentProp('GrCommandPalette', 'size', () => props.size, 'lg')\n\nconst modalSize = computed(() => commandPaletteModalSizeBySize[resolvedSize.value])\nconst listStyle = computed(() => ({ maxHeight: `var(--gr-command-list-max-height, ${props.maxHeight}px)` }))\n\nconst listStyleWithSpacers = computed(() => {\n const base = listStyle.value\n if (!props.virtual) return base\n\n return {\n ...base,\n ...virtualizer.spacerStyle.value,\n }\n})\n\ndefineExpose({ open, close, toggle })\n</script>\n\n<template>\n <GrModal\n :model-value=\"modelValue\"\n :size=\"modalSize\"\n @update:model-value=\"$emit('update:modelValue', $event)\"\n >\n <div data-gr-command-palette :aria-label=\"resolvedAriaLabel\">\n <div data-gr-command-palette-search :class=\"commandSearchRowClass\">\n <IconSearch class=\"block h-4 w-4 shrink-0 text-[var(--gr-muted-fg)]\" aria-hidden=\"true\" />\n\n <input\n ref=\"inputEl\"\n data-gr-command-palette-input\n data-testid=\"gr-command-palette-input\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"list\"\n aria-expanded=\"true\"\n :aria-label=\"resolvedAriaLabel\"\n :aria-controls=\"listboxId\"\n :aria-activedescendant=\"activeDescendantId\"\n :value=\"query\"\n :placeholder=\"resolvedPlaceholder\"\n :class=\"commandSearchInputClass\"\n @input=\"onInput\"\n @keydown=\"onKeydown\"\n >\n\n <span v-if=\"loading\" class=\"shrink-0 text-[var(--gr-muted-fg)]\" aria-hidden=\"true\">\n <IconLoaderCircle class=\"block h-4 w-4 animate-spin\" />\n </span>\n <span v-else-if=\"hotkeyHint.length\" class=\"shrink-0\" aria-hidden=\"true\">\n <GrKbd :keys=\"hotkeyHint\" size=\"sm\" />\n </span>\n </div>\n\n <div\n :id=\"listboxId\"\n ref=\"listEl\"\n data-gr-command-palette-list\n data-testid=\"gr-command-palette-list\"\n :data-gr-virtual=\"virtual ? '' : undefined\"\n class=\"overflow-y-auto p-2\"\n :style=\"listStyleWithSpacers\"\n role=\"listbox\"\n :aria-label=\"resolvedAriaLabel\"\n >\n <!-- Прямыми потомками listbox могут быть только `role=\"group\"`: заголовок\n группы лежит внутри неё и объявлен презентационным (имя группе он\n даёт через `aria-labelledby`), иначе ломается `aria-required-children`.\n\n При виртуализации окно может начаться ниже заголовка — тогда его в\n DOM нет, и имя группы идёт напрямую в `aria-label`. -->\n <div\n v-for=\"group in renderedGroups\"\n :key=\"group.key\"\n role=\"group\"\n :aria-labelledby=\"group.name && group.labelVisible ? `${listboxId}-group-${group.groupIndex}` : undefined\"\n :aria-label=\"group.name && !group.labelVisible ? group.name : undefined\"\n >\n <div\n v-if=\"group.name && group.labelVisible\"\n :id=\"`${listboxId}-group-${group.groupIndex}`\"\n :ref=\"(el) => virtual && group.labelRowIndex !== undefined && virtualizer.measure(group.labelRowIndex, el as Element | null)\"\n data-gr-command-palette-group\n role=\"presentation\"\n :class=\"commandGroupLabelClass\"\n >\n {{ group.name }}\n </div>\n\n <div>\n <div\n v-for=\"entry in group.items\"\n :id=\"itemDomId(entry.item.id)\"\n :key=\"entry.item.id\"\n :ref=\"(el) => virtual && virtualizer.measure(entry.rowIndex, el as Element | null)\"\n data-gr-command-palette-item\n :data-testid=\"`gr-command-palette-item-${entry.item.id}`\"\n role=\"option\"\n v-bind=\"itemSetProps(entry)\"\n :aria-selected=\"isActive(entry.item) ? 'true' : 'false'\"\n :aria-disabled=\"entry.item.disabled ? 'true' : undefined\"\n :class=\"commandItemClass({ active: isActive(entry.item), disabled: Boolean(entry.item.disabled) })\"\n @click=\"selectItem(entry.item)\"\n @mousemove=\"onItemHover(entry.item)\"\n >\n <slot name=\"item\" :item=\"entry.item\" :active=\"isActive(entry.item)\">\n <component\n :is=\"iconTag(entry.item.icon)\"\n v-if=\"entry.item.icon\"\n class=\"block h-4 w-4 shrink-0\"\n :class=\"[iconClass(entry.item.icon), commandItemMutedClass(Boolean(entry.item.disabled))]\"\n aria-hidden=\"true\"\n />\n <span class=\"min-w-0 flex-1\">\n <span class=\"block truncate\">\n <template v-for=\"(segment, index) in matchSegments(entry.item.label)\" :key=\"index\">\n <mark v-if=\"segment.match\" :class=\"commandMatchClass\">{{ segment.text }}</mark>\n <template v-else>{{ segment.text }}</template>\n </template>\n </span>\n <span\n v-if=\"entry.item.description\"\n :class=\"[commandItemDescriptionClass, commandItemMutedClass(Boolean(entry.item.disabled))]\"\n >\n <template v-for=\"(segment, index) in matchSegments(entry.item.description)\" :key=\"index\">\n <mark v-if=\"segment.match\" :class=\"commandMatchClass\">{{ segment.text }}</mark>\n <template v-else>{{ segment.text }}</template>\n </template>\n </span>\n </span>\n <span v-if=\"entry.item.shortcut?.length\" class=\"shrink-0\">\n <GrKbd :keys=\"entry.item.shortcut\" size=\"sm\" />\n </span>\n </slot>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Состояния объявляются живым регионом: `aria-label` на generic-элементе\n большинство AT игнорируют, и загрузка осталась бы неозвученной. Регион\n один на оба состояния и лежит вне listbox — внутри он стал бы его\n недопустимым потомком. -->\n <div\n v-if=\"loading || !filteredItems.length\"\n data-gr-command-palette-empty\n data-testid=\"gr-command-palette-empty\"\n role=\"status\"\n aria-live=\"polite\"\n :class=\"commandEmptyClass\"\n >\n <template v-if=\"loading\">\n {{ loadingText }}\n </template>\n <slot v-else name=\"empty\" :query=\"query\">\n {{ resolvedEmptyText }}\n </slot>\n </div>\n\n <div v-if=\"$slots.footer\" data-gr-command-palette-footer :class=\"commandFooterClass\">\n <slot name=\"footer\" />\n </div>\n </div>\n </GrModal>\n</template>\n\n<style scoped>\n/*\n * Распорки виртуального списка.\n *\n * Не `padding` контейнера: `max-height` меряет ту же коробку. Не обёртка внутри\n * listbox'а: прямыми потомками роли обязаны быть только группы. Не отступы\n * крайних строк: при прыжке прокрутки строки заменяются целиком, и распорка\n * исчезла бы вместе с ними.\n *\n * `display: block` обязателен: список палитры — блочный поток, а псевдоэлемент\n * по умолчанию строчный, и строчная коробка игнорирует `height` — распорка\n * молча не создалась бы вовсе.\n */\n[data-gr-virtual]::before,\n[data-gr-virtual]::after {\n content: '';\n display: block;\n flex: none;\n}\n\n[data-gr-virtual]::before {\n height: var(--gr-virtual-before, 0px);\n}\n\n[data-gr-virtual]::after {\n height: var(--gr-virtual-after, 0px);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useGrComponentProp } from '../GrConfigProvider/context'\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, useId, watch } from 'vue'\n\nimport { useVirtualList } from '../../composables/useVirtualList'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport { isComposingEvent } from '../../internal/keyboard'\nimport { useComboboxNavigation } from '../../composables/useComboboxNavigation'\nimport { iconClass, iconTag } from '../shared/icon'\nimport GrKbd from '../GrKbd/GrKbd.vue'\nimport GrModal from '../GrModal/GrModal.vue'\n\nimport {\n filterCommandItems,\n findDuplicateCommandIds,\n groupCommandItems,\n matchCommandItem,\n splitCommandMatch,\n withRecentCommands,\n type GrCommandFilter,\n type GrCommandItem,\n} from './filtering'\nimport {\n formatCommandHotkey,\n isAppleDevice,\n matchesCommandHotkey,\n parseCommandHotkey,\n} from '../shared/hotkey'\nimport {\n commandEmptyClass,\n commandFooterClass,\n commandGroupLabelClass,\n commandItemClass,\n commandItemDescriptionClass,\n commandItemMutedClass,\n commandMatchClass,\n commandPaletteModalSizeBySize,\n commandSearchInputClass,\n commandSearchRowClass,\n type GrCommandPaletteSize,\n} from './grCommandPaletteStyles'\n\nimport IconLoaderCircle from '~icons/lucide/loader-circle'\nimport IconSearch from '~icons/lucide/search'\n\nexport type { GrCommandFilter, GrCommandGroup, GrCommandItem } from './filtering'\nexport type { GrCommandPaletteSize } from './grCommandPaletteStyles'\n\n/**\n * Публичный GR-примитив «Command palette» (⌘K) — модальный поиск по командам\n * приложения с группировкой, подсказками сочетаний и клавиатурной навигацией.\n *\n * A11y: WAI-ARIA combobox поверх модалки — `role=\"combobox\"` на поле ввода,\n * `role=\"listbox\"` на списке, `aria-activedescendant` на активной команде\n * (фокус остаётся в поле). Esc, фокус-ловушка и блокировка скролла приходят\n * из `GrModal`.\n *\n * Открытие по глобальному сочетанию (`hotkey`, по умолчанию `mod+k` — Cmd на\n * macOS, Ctrl на прочих) компонент берёт на себя; передайте `hotkey: null`,\n * чтобы управлять открытием только через `v-model`.\n */\nexport interface GrCommandPaletteProps {\n /** Открыта ли палитра. */\n modelValue: boolean\n /** Плоский список команд; группировка — по полю `group` самой команды. */\n items?: GrCommandItem[]\n /**\n * Недавние команды: пока запрос пуст, они поднимаются отдельной группой\n * наверх в этом порядке и не дублируются ниже.\n */\n recentIds?: string[]\n placeholder?: string\n size?: GrCommandPaletteSize\n /** Глобальное сочетание открытия. `null` — не вешать слушатель. */\n hotkey?: string | null\n /** Локальная фильтрация по запросу. `false` — фильтрует владелец по событию `search`. */\n filterable?: boolean\n /** Кастомный матчер локальной фильтрации. */\n filter?: GrCommandFilter\n /** Внешне управляемое состояние загрузки (для remote-поиска). */\n loading?: boolean\n /** Закрывать палитру после выбора команды. */\n closeOnSelect?: boolean\n /** Максимальная высота списка, px. */\n maxHeight?: number\n /**\n * Виртуализация списка: в DOM живёт только окно вокруг вьюпорта. Высоту окна\n * задаёт `maxHeight`.\n *\n * Включается осознанно: на сотне команд выигрыша нет, а в разметке остаётся\n * только окно — вместе с ним меняется и то, что находит `querySelector`\n * потребителя. Профильный сценарий — палитра приложения на тысячи команд.\n */\n virtual?: boolean\n /** Показывать подсказку сочетания в поле ввода. */\n showHotkeyHint?: boolean\n emptyText?: string\n ariaLabel?: string\n}\n\nexport interface GrCommandPaletteEmits {\n (e: 'update:modelValue', value: boolean): void\n /** Команда выбрана (клик или Enter). */\n (e: 'select', item: GrCommandItem): void\n /** Поисковый запрос изменился — точка входа для remote-поиска. */\n (e: 'search', query: string): void\n}\n\nimport './defaults'\n\nconst props = withDefaults(\n defineProps<GrCommandPaletteProps>(),\n {\n items: undefined,\n recentIds: undefined,\n placeholder: undefined,\n // Дефолт `size` живёт в резолвере ниже, а не здесь: Vue подставил бы его\n // до того, как компонент заглянет в `GrConfigProvider`.\n size: undefined,\n hotkey: 'mod+k',\n filterable: true,\n filter: undefined,\n loading: false,\n closeOnSelect: true,\n maxHeight: 360,\n virtual: false,\n showHotkeyHint: true,\n emptyText: undefined,\n ariaLabel: undefined,\n },\n)\n\nconst emit = defineEmits<GrCommandPaletteEmits>()\n\nconst { t } = useGranularityTranslations()\n\nconst resolvedPlaceholder = computed(() => props.placeholder ?? t('gr.commandPalette.placeholder', 'Type a command or search…'))\nconst resolvedEmptyText = computed(() => props.emptyText ?? t('gr.commandPalette.empty', 'Nothing found'))\nconst resolvedAriaLabel = computed(() => props.ariaLabel ?? t('gr.commandPalette.label', 'Command palette'))\nconst loadingText = computed(() => t('gr.commandPalette.loading', 'Loading…'))\nconst recentTitle = computed(() => t('gr.commandPalette.recent', 'Recent'))\n\nconst query = ref('')\nconst inputEl = ref<HTMLInputElement | null>(null)\nconst listboxId = useId()\n\nconst itemsResolved = computed<GrCommandItem[]>(() => props.items ?? [])\n\nconst filteredItems = computed<GrCommandItem[]>(() =>\n props.filterable\n ? filterCommandItems(itemsResolved.value, query.value, props.filter ?? matchCommandItem)\n : itemsResolved.value,\n)\n\nconst groups = computed(() => {\n const grouped = groupCommandItems(filteredItems.value)\n\n // С непустым запросом секции «недавние» нет: там правит релевантность, а не\n // история — иначе первая же буква уводила бы взгляд не туда.\n if (query.value.trim()) return grouped\n\n return withRecentCommands(grouped, filteredItems.value, props.recentIds ?? [], recentTitle.value)\n})\n\n/**\n * Порядок обхода стрелками совпадает с порядком на экране: «недавние» стоят\n * первыми, значит и первая стрелка ведёт туда же.\n */\nconst orderedItems = computed(() => groups.value.flatMap(group => group.items))\n\n/** Плоский список того, что реально выбирается — по нему ходят стрелки. */\nconst navigableItems = computed(() => orderedItems.value.filter(item => !item.disabled))\n\nfunction itemDomId(id: string): string {\n return `${listboxId}-item-${id}`\n}\n\n/**\n * Виртуализация списка.\n *\n * Набор — плоский поток строк экрана: заголовок группы занимает такую же\n * строку, как команда, поэтому входит в него наравне. Вложенную структуру\n * рендер пересобирает уже из окна.\n */\n\n/** Оценки высоты строк. Команда крупнее заголовка; дальше уточняются замером. */\nconst ITEM_SIZE_ESTIMATE = 44\nconst GROUP_LABEL_SIZE_ESTIMATE = 28\n\ntype PaletteRow =\n | { kind: 'label', groupIndex: number }\n | { kind: 'item', groupIndex: number, item: GrCommandItem, posInSet: number, setSize: number }\n\nconst listEl = ref<HTMLElement | null>(null)\n\nconst paletteRows = computed<PaletteRow[]>(() => {\n const rows: PaletteRow[] = []\n\n groups.value.forEach((group, groupIndex) => {\n if (group.name) rows.push({ kind: 'label', groupIndex })\n\n group.items.forEach((item, index) => {\n rows.push({\n kind: 'item',\n groupIndex,\n item,\n // Набор — группа, а не весь список: по ARIA позиция отсчитывается от неё.\n posInSet: index + 1,\n setSize: group.items.length,\n })\n })\n })\n\n return rows\n})\n\nconst virtualizer = useVirtualList({\n container: listEl,\n count: () => (props.virtual ? paletteRows.value.length : 0),\n // Запрос пересобирает набор строк — замеры прошлого набора невалидны.\n source: () => paletteRows.value,\n itemSize: index => (paletteRows.value[index]?.kind === 'label' ? GROUP_LABEL_SIZE_ESTIMATE : ITEM_SIZE_ESTIMATE),\n // Список закрытой палитры не смонтирован вовсе: `clientHeight` взять неоткуда.\n // `maxHeight` можно перебить `--gr-command-list-max-height` — тогда точная\n // высота приедет с первым замером, а это останется оценкой первого рендера.\n viewportSize: () => props.maxHeight,\n})\n\n/**\n * Группы к отрисовке. При виртуализации пересобираются из среза `paletteRows`:\n * группа, начатая выше окна, всё равно открывается — иначе её команды остались\n * бы прямыми потомками listbox'а, что роль запрещает.\n */\ntype RenderedGroup = {\n key: string\n groupIndex: number\n name: string | undefined\n labelVisible: boolean\n /** Позиция строки заголовка в `paletteRows` — по ней его замеряет виртуализатор. */\n labelRowIndex?: number\n items: { item: GrCommandItem, rowIndex: number, posInSet: number, setSize: number }[]\n}\n\nconst renderedGroups = computed<RenderedGroup[]>(() => {\n const rows = paletteRows.value\n\n const from = props.virtual ? virtualizer.range.value.start : 0\n const to = props.virtual ? Math.min(rows.length, virtualizer.range.value.end) : rows.length\n\n const result: RenderedGroup[] = []\n let current: RenderedGroup | undefined\n\n for (let rowIndex = from; rowIndex < to; rowIndex++) {\n const row = rows[rowIndex]!\n const group = groups.value[row.groupIndex]\n\n if (!current || current.groupIndex !== row.groupIndex) {\n current = {\n key: group?.name ?? `__ungrouped-${row.groupIndex}`,\n groupIndex: row.groupIndex,\n name: group?.name,\n labelVisible: false,\n items: [],\n }\n result.push(current)\n }\n\n if (row.kind === 'label') {\n current.labelVisible = true\n current.labelRowIndex = rowIndex\n continue\n }\n\n current.items.push({ item: row.item, rowIndex, posInSet: row.posInSet, setSize: row.setSize })\n }\n\n return result\n})\n\n/** ARIA набора: объявляем только при виртуализации — иначе набор виден по DOM. */\nfunction itemSetProps(entry: { posInSet: number, setSize: number }): Record<string, number> | undefined {\n if (!props.virtual) return undefined\n return { 'aria-setsize': entry.setSize, 'aria-posinset': entry.posInSet }\n}\n\n\n/** Сегменты подсветки: совпавшее с запросом рисуется `<mark>`. */\nfunction matchSegments(text: string): ReturnType<typeof splitCommandMatch> {\n return splitCommandMatch(text, props.filterable ? query.value : '')\n}\n\nasync function scrollActiveIntoView(item: GrCommandItem): Promise<void> {\n // Вне окна активной команды в DOM нет: `getElementById` вернул бы `null`,\n // прокрутка не случилась бы, а `aria-activedescendant` указал бы в пустоту.\n if (props.virtual) {\n const rowIndex = paletteRows.value.findIndex(row => row.kind === 'item' && row.item.id === item.id)\n if (rowIndex >= 0) virtualizer.scrollToIndex(rowIndex)\n }\n\n await nextTick()\n document.getElementById(itemDomId(item.id))?.scrollIntoView?.({ block: 'nearest' })\n}\n\nconst {\n activeItem,\n activeDescendantId,\n setActive,\n reset: resetActive,\n handleNavigationKeys,\n} = useComboboxNavigation<GrCommandItem>({\n items: () => navigableItems.value,\n open: () => props.modelValue,\n idOf: item => itemDomId(item.id),\n scrollTo: item => scrollActiveIntoView(item),\n})\n\n// Палитра всегда стартует с первой команды — и при монтировании открытой тоже.\nresetActive(0)\n\nfunction isActive(item: GrCommandItem): boolean {\n return activeItem.value?.id === item.id\n}\n\n// Активной становится первая команда, когда список изменился **по содержимому**.\n// Следить за идентичностью массива нельзя: родитель, отдающий `:items` инлайн-\n// выражением, пересоздаёт его на каждый посторонний ререндер — и выбранная\n// стрелками команда прыгала бы в начало.\n// Разделитель — пробел, а не запятая: `id` вправе её содержать, и «a,b» + «c»\n// дало бы тот же ключ, что «a» + «b,c».\nwatch(\n () => orderedItems.value.map(item => item.id).join(' '),\n () => resetActive(0),\n)\n\n// `id` — ключ рендера и цель `aria-activedescendant`: дубли дают одинаковые\n// DOM-id, и фокус уезжает не на ту команду.\nwatch(\n itemsResolved,\n (items) => {\n if (!__GR_DEV__) return\n const duplicates = findDuplicateCommandIds(items)\n if (!duplicates.length) return\n\n console.warn(\n `[GrCommandPalette] повторяющиеся id команд: ${duplicates.join(', ')}. `\n + 'Из-за одинаковых DOM-id `aria-activedescendant` укажет не на ту команду.',\n )\n },\n { immediate: true },\n)\n\nfunction open(): void {\n emit('update:modelValue', true)\n}\n\nfunction close(): void {\n emit('update:modelValue', false)\n}\n\nfunction toggle(): void {\n emit('update:modelValue', !props.modelValue)\n}\n\nfunction selectItem(item: GrCommandItem): void {\n if (item.disabled) return\n emit('select', item)\n if (props.closeOnSelect) close()\n}\n\nfunction onItemHover(item: GrCommandItem): void {\n const index = navigableItems.value.indexOf(item)\n if (index >= 0) setActive(index)\n}\n\nfunction onInput(event: Event): void {\n query.value = (event.target as HTMLInputElement).value\n emit('search', query.value.trim())\n}\n\nfunction onKeydown(event: KeyboardEvent): void {\n // Клавиша во время IME-композиции принадлежит композиции: Enter коммитит её,\n // стрелки ходят по кандидатам.\n if (isComposingEvent(event)) return\n\n if (handleNavigationKeys(event)) return\n\n switch (event.key) {\n case 'Enter':\n if (!activeItem.value) break\n event.preventDefault()\n selectItem(activeItem.value)\n break\n }\n}\n\n// ————— Открытие: сброс запроса и выбора.\nwatch(\n () => props.modelValue,\n (open) => {\n if (!open) return\n\n query.value = ''\n resetActive(0)\n },\n)\n\n// Фокус в поле — отдельным наблюдателем, и по появлению самого поля: содержимое\n// панели рождается вместе с ней, и по одному лишь пропу фокусировать нечего.\n// Ловушка фокуса `GrModal` этот выбор не перебивает — фокус, уже стоящий внутри\n// слоя, она считает осознанным.\nwatch(\n [() => props.modelValue, inputEl],\n ([open]) => {\n if (open) inputEl.value?.focus()\n },\n { flush: 'post' },\n)\n\n// ————— Глобальное сочетание открытия.\nconst parsedHotkey = computed(() => (props.hotkey ? parseCommandHotkey(props.hotkey) : null))\n\n// Платформа определяется только после монтирования: на сервере `navigator` нет,\n// и первый рендер обязан совпасть с серверным. Иначе сервер отдаёт `Ctrl`,\n// клиент на macOS рисует `⌘`, и гидрация расходится по тексту подсказки.\nconst isApple = ref(false)\n\nconst hotkeyHint = computed(() =>\n props.showHotkeyHint && parsedHotkey.value ? formatCommandHotkey(parsedHotkey.value, isApple.value) : [],\n)\n\nfunction onWindowKeydown(event: KeyboardEvent): void {\n const hotkey = parsedHotkey.value\n if (!hotkey || !matchesCommandHotkey(event, hotkey, isApple.value)) return\n event.preventDefault()\n toggle()\n}\n\nonMounted(() => {\n if (typeof window === 'undefined') return\n isApple.value = isAppleDevice()\n window.addEventListener('keydown', onWindowKeydown)\n})\n\nonBeforeUnmount(() => {\n if (typeof window !== 'undefined') window.removeEventListener('keydown', onWindowKeydown)\n})\n\n// Эффективный размер: локальный проп → `GrConfigProvider` → дефолт компонента.\nconst resolvedSize = useGrComponentProp('GrCommandPalette', 'size', () => props.size, 'lg')\n\nconst modalSize = computed(() => commandPaletteModalSizeBySize[resolvedSize.value])\nconst listStyle = computed(() => ({ maxHeight: `var(--gr-command-list-max-height, ${props.maxHeight}px)` }))\n\nconst listStyleWithSpacers = computed(() => {\n const base = listStyle.value\n if (!props.virtual) return base\n\n return {\n ...base,\n ...virtualizer.spacerStyle.value,\n }\n})\n\ndefineExpose({ open, close, toggle })\n</script>\n\n<template>\n <GrModal\n :model-value=\"modelValue\"\n :size=\"modalSize\"\n @update:model-value=\"$emit('update:modelValue', $event)\"\n >\n <div data-gr-command-palette :aria-label=\"resolvedAriaLabel\">\n <div data-gr-command-palette-search :class=\"commandSearchRowClass\">\n <IconSearch class=\"block h-4 w-4 shrink-0 text-[var(--gr-muted-fg)]\" aria-hidden=\"true\" />\n\n <input\n ref=\"inputEl\"\n data-gr-command-palette-input\n data-testid=\"gr-command-palette-input\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"list\"\n aria-expanded=\"true\"\n :aria-label=\"resolvedAriaLabel\"\n :aria-controls=\"listboxId\"\n :aria-activedescendant=\"activeDescendantId\"\n :value=\"query\"\n :placeholder=\"resolvedPlaceholder\"\n :class=\"commandSearchInputClass\"\n @input=\"onInput\"\n @keydown=\"onKeydown\"\n >\n\n <span v-if=\"loading\" class=\"shrink-0 text-[var(--gr-muted-fg)]\" aria-hidden=\"true\">\n <IconLoaderCircle class=\"block h-4 w-4 animate-spin\" />\n </span>\n <span v-else-if=\"hotkeyHint.length\" class=\"shrink-0\" aria-hidden=\"true\">\n <GrKbd :keys=\"hotkeyHint\" size=\"sm\" />\n </span>\n </div>\n\n <div\n :id=\"listboxId\"\n ref=\"listEl\"\n data-gr-command-palette-list\n data-testid=\"gr-command-palette-list\"\n :data-gr-virtual=\"virtual ? '' : undefined\"\n class=\"overflow-y-auto p-2\"\n :style=\"listStyleWithSpacers\"\n role=\"listbox\"\n :aria-label=\"resolvedAriaLabel\"\n >\n <!-- Прямыми потомками listbox могут быть только `role=\"group\"`: заголовок\n группы лежит внутри неё и объявлен презентационным (имя группе он\n даёт через `aria-labelledby`), иначе ломается `aria-required-children`.\n\n При виртуализации окно может начаться ниже заголовка — тогда его в\n DOM нет, и имя группы идёт напрямую в `aria-label`. -->\n <div\n v-for=\"group in renderedGroups\"\n :key=\"group.key\"\n role=\"group\"\n :aria-labelledby=\"group.name && group.labelVisible ? `${listboxId}-group-${group.groupIndex}` : undefined\"\n :aria-label=\"group.name && !group.labelVisible ? group.name : undefined\"\n >\n <div\n v-if=\"group.name && group.labelVisible\"\n :id=\"`${listboxId}-group-${group.groupIndex}`\"\n :ref=\"(el) => virtual && group.labelRowIndex !== undefined && virtualizer.measure(group.labelRowIndex, el as Element | null)\"\n data-gr-command-palette-group\n role=\"presentation\"\n :class=\"commandGroupLabelClass\"\n >\n {{ group.name }}\n </div>\n\n <div>\n <div\n v-for=\"entry in group.items\"\n :id=\"itemDomId(entry.item.id)\"\n :key=\"entry.item.id\"\n :ref=\"(el) => virtual && virtualizer.measure(entry.rowIndex, el as Element | null)\"\n data-gr-command-palette-item\n :data-testid=\"`gr-command-palette-item-${entry.item.id}`\"\n role=\"option\"\n v-bind=\"itemSetProps(entry)\"\n :aria-selected=\"isActive(entry.item) ? 'true' : 'false'\"\n :aria-disabled=\"entry.item.disabled ? 'true' : undefined\"\n :class=\"commandItemClass({ active: isActive(entry.item), disabled: Boolean(entry.item.disabled) })\"\n @click=\"selectItem(entry.item)\"\n @mousemove=\"onItemHover(entry.item)\"\n >\n <slot name=\"item\" :item=\"entry.item\" :active=\"isActive(entry.item)\">\n <component\n :is=\"iconTag(entry.item.icon)\"\n v-if=\"entry.item.icon\"\n class=\"block h-4 w-4 shrink-0\"\n :class=\"[iconClass(entry.item.icon), commandItemMutedClass(Boolean(entry.item.disabled))]\"\n aria-hidden=\"true\"\n />\n <span class=\"min-w-0 flex-1\">\n <span class=\"block truncate\">\n <template v-for=\"(segment, index) in matchSegments(entry.item.label)\" :key=\"index\">\n <mark v-if=\"segment.match\" :class=\"commandMatchClass\">{{ segment.text }}</mark>\n <template v-else>{{ segment.text }}</template>\n </template>\n </span>\n <span\n v-if=\"entry.item.description\"\n :class=\"[commandItemDescriptionClass, commandItemMutedClass(Boolean(entry.item.disabled))]\"\n >\n <template v-for=\"(segment, index) in matchSegments(entry.item.description)\" :key=\"index\">\n <mark v-if=\"segment.match\" :class=\"commandMatchClass\">{{ segment.text }}</mark>\n <template v-else>{{ segment.text }}</template>\n </template>\n </span>\n </span>\n <span v-if=\"entry.item.shortcut?.length\" class=\"shrink-0\">\n <GrKbd :keys=\"entry.item.shortcut\" size=\"sm\" />\n </span>\n </slot>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Состояния объявляются живым регионом: `aria-label` на generic-элементе\n большинство AT игнорируют, и загрузка осталась бы неозвученной. Регион\n один на оба состояния и лежит вне listbox — внутри он стал бы его\n недопустимым потомком. -->\n <div\n v-if=\"loading || !filteredItems.length\"\n data-gr-command-palette-empty\n data-testid=\"gr-command-palette-empty\"\n role=\"status\"\n aria-live=\"polite\"\n :class=\"commandEmptyClass\"\n >\n <template v-if=\"loading\">\n {{ loadingText }}\n </template>\n <slot v-else name=\"empty\" :query=\"query\">\n {{ resolvedEmptyText }}\n </slot>\n </div>\n\n <div v-if=\"$slots.footer\" data-gr-command-palette-footer :class=\"commandFooterClass\">\n <slot name=\"footer\" />\n </div>\n </div>\n </GrModal>\n</template>\n\n<style scoped>\n/*\n * Распорки виртуального списка.\n *\n * Не `padding` контейнера: `max-height` меряет ту же коробку. Не обёртка внутри\n * listbox'а: прямыми потомками роли обязаны быть только группы. Не отступы\n * крайних строк: при прыжке прокрутки строки заменяются целиком, и распорка\n * исчезла бы вместе с ними.\n *\n * `display: block` обязателен: список палитры — блочный поток, а псевдоэлемент\n * по умолчанию строчный, и строчная коробка игнорирует `height` — распорка\n * молча не создалась бы вовсе.\n */\n[data-gr-virtual]::before,\n[data-gr-virtual]::after {\n content: '';\n display: block;\n flex: none;\n}\n\n[data-gr-virtual]::before {\n height: var(--gr-virtual-before, 0px);\n}\n\n[data-gr-virtual]::after {\n height: var(--gr-virtual-after, 0px);\n}\n</style>\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"GrConfirmDialog-CwXNLyzk.js","names":[],"sources":["../../../../src/components/GrConfirmDialog/GrConfirmDialog.vue","../../../../src/components/GrConfirmDialog/GrConfirmDialog.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * GrConfirmDialog — GR-примитив диалога подтверждения поверх `GrDialog`.\n *\n * Синхронизирован с `GrDialog`/`GrPromptDialog` по набору проп-проксирования:\n * `size`, `closeOnBackdrop`, `closeOnEsc`, `showHeader`, `showCloseButton`,\n * `headerConfig`, `footerConfig`, `bodyConfig`, `closeLabel`.\n *\n * Клик по «Confirm»/«Cancel» эмитит одноимённое событие и закрывает диалог\n * через `update:modelValue`.\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 GrResponseErrorBanner from '../GrResponseErrorBanner/GrResponseErrorBanner.vue'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport type { GrButtonSize, GrButtonTone, GrButtonVariant } from '../GrButton'\nimport type { GrDialogSectionConfig, GrDialogSize } from '../GrDialog'\nimport type { ResponseErrorInfo } from '../GrResponseErrorBanner'\n\n/** Какое действие получает фокус при открытии окна. */\nexport type GrConfirmDialogFocusAction = 'confirm' | 'cancel' | 'none'\n\nexport interface GrConfirmDialogProps {\n modelValue: boolean\n title?: string\n description?: 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 confirmVariant?: GrButtonVariant\n confirmTone?: GrButtonTone\n /**\n * Структура ошибки ответа сервера для показа в теле диалога\n * (через `GrResponseErrorBanner`). Используется императивным\n * `useDialogService` для async-`onConfirm`. `null` — блок скрыт.\n */\n error?: ResponseErrorInfo | null\n /** Состояние загрузки кнопки Confirm (async-`onConfirm` in-flight). */\n confirmLoading?: boolean\n /** Принудительно дизейблит кнопку Confirm. */\n confirmDisabled?: boolean\n /**\n * Закрывать ли диалог автоматически по клику Confirm. По умолчанию `true`\n * (историческое поведение). `false` — отдаёт управление закрытием наружу\n * (нужно `useDialogService`, который ждёт результат async-`onConfirm`).\n */\n closeOnConfirm?: boolean\n /**\n * Какое действие получает фокус при открытии. По умолчанию «Отмена»:\n * подтверждение бывает деструктивным, и `Enter` сразу после открытия не\n * должен его запускать. `none` оставляет фокус на панели окна.\n *\n * Имя не `initialFocus` намеренно: у `GrModal`/`GrDrawer` так называется\n * проп с элементом, а здесь выбирается действие.\n */\n focusAction?: GrConfirmDialogFocusAction\n /**\n * Запрет закрытия «мягкими» способами (Esc, клик по бэкдропу), пока идёт\n * подтверждение (`confirmLoading`). Кнопка закрытия и «Отмена» остаются:\n * окно без единого выхода — ловушка.\n */\n persistent?: boolean\n}\n\nexport interface GrConfirmDialogEmits {\n (e: 'update:modelValue', value: boolean): void\n (e: 'confirm'): void\n (e: 'cancel'): void\n}\n\nimport './defaults'\n\nconst props = withDefaults(defineProps<GrConfirmDialogProps>(), {\n title: undefined,\n description: 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 confirmVariant: 'primary',\n confirmTone: 'primary',\n error: null,\n confirmLoading: false,\n confirmDisabled: false,\n closeOnConfirm: true,\n focusAction: 'cancel',\n persistent: false,\n})\n\n// Эффективный размер: локальный проп → `GrConfigProvider` → дефолт компонента.\nconst resolvedSize = useGrComponentProp('GrConfirmDialog', 'size', () => props.size, 'md')\n\nconst emit = defineEmits<GrConfirmDialogEmits>()\n\n// Дефолты берём из общего i18n-блока пакета (fallback — англ.), а не хардкодим.\nconst { t } = useGranularityTranslations()\nconst resolvedTitle = computed(() => props.title ?? t('gr.dialog.confirm.title', 'Confirm'))\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: (value: boolean) => emit('update:modelValue', value),\n})\n\nconst confirmButtonRef = ref<InstanceType<typeof GrButton> | null>(null)\nconst cancelButtonRef = ref<InstanceType<typeof GrButton> | null>(null)\n\n// Пока подтверждение в полёте, случайное движение не должно оборвать операцию.\nconst softCloseBlocked = computed(() => props.persistent && props.confirmLoading)\nconst resolvedCloseOnBackdrop = computed(() => (softCloseBlocked.value ? false : props.closeOnBackdrop))\nconst resolvedCloseOnEsc = computed(() => (softCloseBlocked.value ? false : props.closeOnEsc))\n\n/**\n * Фокус ставит содержимое после отрисовки, а не проп `initialFocus` у\n * `GrModal`: кнопка рождается внутри поддерева диалога, и возврат её же пропом\n * наверх замыкает рендер в цикл (проверено на `GrPromptDialog`).\n *\n * Молчит, когда фокусировать нечего: со своим слотом `#footer` кнопок с\n * рефами в DOM нет, и фокус остаётся на панели — это корректный исход, а не\n * повод падать.\n */\nfunction focusAction(): void {\n if (props.focusAction === 'confirm') confirmButtonRef.value?.focus()\n else if (props.focusAction === 'cancel') cancelButtonRef.value?.focus()\n}\n\n// Источник — не только `modelValue`, но и сами кнопки: содержимое панели\n// появляется на такт позже открытия, и фокус по фиксированному `nextTick`\n// приходился на момент, когда фокусировать ещё нечего.\nwatch(\n [() => props.modelValue, cancelButtonRef, confirmButtonRef],\n () => {\n if (!props.modelValue || props.focusAction === 'none') return\n focusAction()\n },\n // `immediate`: окно могут смонтировать уже открытым — смены пропа тогда нет.\n { immediate: true, flush: 'post' },\n)\n\nfunction onCancel(): void {\n emit('cancel')\n emit('update:modelValue', false)\n}\n\nfunction onConfirm(): void {\n emit('confirm')\n if (props.closeOnConfirm)\n emit('update:modelValue', false)\n}\n</script>\n\n<template>\n <GrDialog\n v-model=\"open\"\n :title=\"resolvedTitle\"\n :size=\"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)] text-[var(--gr-muted-fg)]\">\n {{ description }}\n </div>\n </slot>\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 ref=\"cancelButtonRef\" data-testid=\"gr-confirm-cancel\" variant=\"outline\" :size=\"buttonSize\" @click=\"onCancel\">\n {{ resolvedCancelText }}\n </GrButton>\n <GrButton\n ref=\"confirmButtonRef\"\n data-testid=\"gr-confirm-confirm\"\n :variant=\"confirmVariant\"\n :tone=\"confirmTone\"\n :size=\"buttonSize\"\n :loading=\"confirmLoading\"\n :disabled=\"confirmDisabled\"\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 * GrConfirmDialog — GR-примитив диалога подтверждения поверх `GrDialog`.\n *\n * Синхронизирован с `GrDialog`/`GrPromptDialog` по набору проп-проксирования:\n * `size`, `closeOnBackdrop`, `closeOnEsc`, `showHeader`, `showCloseButton`,\n * `headerConfig`, `footerConfig`, `bodyConfig`, `closeLabel`.\n *\n * Клик по «Confirm»/«Cancel» эмитит одноимённое событие и закрывает диалог\n * через `update:modelValue`.\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 GrResponseErrorBanner from '../GrResponseErrorBanner/GrResponseErrorBanner.vue'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport type { GrButtonSize, GrButtonTone, GrButtonVariant } from '../GrButton'\nimport type { GrDialogSectionConfig, GrDialogSize } from '../GrDialog'\nimport type { ResponseErrorInfo } from '../GrResponseErrorBanner'\n\n/** Какое действие получает фокус при открытии окна. */\nexport type GrConfirmDialogFocusAction = 'confirm' | 'cancel' | 'none'\n\nexport interface GrConfirmDialogProps {\n modelValue: boolean\n title?: string\n description?: 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 confirmVariant?: GrButtonVariant\n confirmTone?: GrButtonTone\n /**\n * Структура ошибки ответа сервера для показа в теле диалога\n * (через `GrResponseErrorBanner`). Используется императивным\n * `useDialogService` для async-`onConfirm`. `null` — блок скрыт.\n */\n error?: ResponseErrorInfo | null\n /** Состояние загрузки кнопки Confirm (async-`onConfirm` in-flight). */\n confirmLoading?: boolean\n /** Принудительно дизейблит кнопку Confirm. */\n confirmDisabled?: boolean\n /**\n * Закрывать ли диалог автоматически по клику Confirm. По умолчанию `true`\n * (историческое поведение). `false` — отдаёт управление закрытием наружу\n * (нужно `useDialogService`, который ждёт результат async-`onConfirm`).\n */\n closeOnConfirm?: boolean\n /**\n * Какое действие получает фокус при открытии. По умолчанию «Отмена»:\n * подтверждение бывает деструктивным, и `Enter` сразу после открытия не\n * должен его запускать. `none` оставляет фокус на панели окна.\n *\n * Имя не `initialFocus` намеренно: у `GrModal`/`GrDrawer` так называется\n * проп с элементом, а здесь выбирается действие.\n */\n focusAction?: GrConfirmDialogFocusAction\n /**\n * Запрет закрытия «мягкими» способами (Esc, клик по бэкдропу), пока идёт\n * подтверждение (`confirmLoading`). Кнопка закрытия и «Отмена» остаются:\n * окно без единого выхода — ловушка.\n */\n persistent?: boolean\n}\n\nexport interface GrConfirmDialogEmits {\n (e: 'update:modelValue', value: boolean): void\n (e: 'confirm'): void\n (e: 'cancel'): void\n}\n\nimport './defaults'\n\nconst props = withDefaults(defineProps<GrConfirmDialogProps>(), {\n title: undefined,\n description: 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 confirmVariant: 'primary',\n confirmTone: 'primary',\n error: null,\n confirmLoading: false,\n confirmDisabled: false,\n closeOnConfirm: true,\n focusAction: 'cancel',\n persistent: false,\n})\n\n// Эффективный размер: локальный проп → `GrConfigProvider` → дефолт компонента.\nconst resolvedSize = useGrComponentProp('GrConfirmDialog', 'size', () => props.size, 'md')\n\nconst emit = defineEmits<GrConfirmDialogEmits>()\n\n// Дефолты берём из общего i18n-блока пакета (fallback — англ.), а не хардкодим.\nconst { t } = useGranularityTranslations()\nconst resolvedTitle = computed(() => props.title ?? t('gr.dialog.confirm.title', 'Confirm'))\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: (value: boolean) => emit('update:modelValue', value),\n})\n\nconst confirmButtonRef = ref<InstanceType<typeof GrButton> | null>(null)\nconst cancelButtonRef = ref<InstanceType<typeof GrButton> | null>(null)\n\n// Пока подтверждение в полёте, случайное движение не должно оборвать операцию.\nconst softCloseBlocked = computed(() => props.persistent && props.confirmLoading)\nconst resolvedCloseOnBackdrop = computed(() => (softCloseBlocked.value ? false : props.closeOnBackdrop))\nconst resolvedCloseOnEsc = computed(() => (softCloseBlocked.value ? false : props.closeOnEsc))\n\n/**\n * Фокус ставит содержимое после отрисовки, а не проп `initialFocus` у\n * `GrModal`: кнопка рождается внутри поддерева диалога, и возврат её же пропом\n * наверх замыкает рендер в цикл (проверено на `GrPromptDialog`).\n *\n * Молчит, когда фокусировать нечего: со своим слотом `#footer` кнопок с\n * рефами в DOM нет, и фокус остаётся на панели — это корректный исход, а не\n * повод падать.\n */\nfunction focusAction(): void {\n if (props.focusAction === 'confirm') confirmButtonRef.value?.focus()\n else if (props.focusAction === 'cancel') cancelButtonRef.value?.focus()\n}\n\n// Источник — не только `modelValue`, но и сами кнопки: содержимое панели\n// появляется на такт позже открытия, и фокус по фиксированному `nextTick`\n// приходился на момент, когда фокусировать ещё нечего.\nwatch(\n [() => props.modelValue, cancelButtonRef, confirmButtonRef],\n () => {\n if (!props.modelValue || props.focusAction === 'none') return\n focusAction()\n },\n // `immediate`: окно могут смонтировать уже открытым — смены пропа тогда нет.\n { immediate: true, flush: 'post' },\n)\n\nfunction onCancel(): void {\n emit('cancel')\n emit('update:modelValue', false)\n}\n\nfunction onConfirm(): void {\n emit('confirm')\n if (props.closeOnConfirm)\n emit('update:modelValue', false)\n}\n</script>\n\n<template>\n <GrDialog\n v-model=\"open\"\n :title=\"resolvedTitle\"\n :size=\"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)] text-[var(--gr-muted-fg)]\">\n {{ description }}\n </div>\n </slot>\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 ref=\"cancelButtonRef\" data-testid=\"gr-confirm-cancel\" variant=\"outline\" :size=\"buttonSize\" @click=\"onCancel\">\n {{ resolvedCancelText }}\n </GrButton>\n <GrButton\n ref=\"confirmButtonRef\"\n data-testid=\"gr-confirm-confirm\"\n :variant=\"confirmVariant\"\n :tone=\"confirmTone\"\n :size=\"buttonSize\"\n :loading=\"confirmLoading\"\n :disabled=\"confirmDisabled\"\n @click=\"onConfirm\"\n >\n {{ resolvedConfirmText }}\n </GrButton>\n </div>\n </slot>\n </template>\n </GrDialog>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqFA,MAAM,QAAQ;EA4Bd,MAAM,eAAe,mBAAmB,mBAAmB,cAAc,MAAM,MAAM,IAAI;EAEzF,MAAM,OAAO;EAGb,MAAM,EAAE,MAAM,2BAA2B;EACzC,MAAM,gBAAgB,eAAe,MAAM,SAAS,EAAE,2BAA2B,SAAS,CAAC;EAC3F,MAAM,qBAAqB,eAAe,MAAM,cAAc,EAAE,mBAAmB,OAAO,CAAC;EAC3F,MAAM,sBAAsB,eAAe,MAAM,eAAe,EAAE,qBAAqB,SAAS,CAAC;EACjG,MAAM,qBAAqB,eAAe,MAAM,cAAc,EAAE,oBAAoB,QAAQ,CAAC;EAE7F,MAAM,OAAO,SAAS;GACpB,WAAW,MAAM;GACjB,MAAM,UAAmB,KAAK,qBAAqB,KAAK;EAC1D,CAAC;EAED,MAAM,mBAAmB,IAA0C,IAAI;EACvE,MAAM,kBAAkB,IAA0C,IAAI;EAGtE,MAAM,mBAAmB,eAAe,MAAM,cAAc,MAAM,cAAc;EAChF,MAAM,0BAA0B,eAAgB,iBAAiB,QAAQ,QAAQ,MAAM,eAAgB;EACvG,MAAM,qBAAqB,eAAgB,iBAAiB,QAAQ,QAAQ,MAAM,UAAW;;;;;;;;;;EAW7F,SAAS,cAAoB;GAC3B,IAAI,MAAM,gBAAgB,WAAW,iBAAiB,OAAO,MAAM;QAC9D,IAAI,MAAM,gBAAgB,UAAU,gBAAgB,OAAO,MAAM;EACxE;EAKA,MACE;SAAO,MAAM;GAAY;GAAiB;EAAgB,SACpD;GACJ,IAAI,CAAC,MAAM,cAAc,MAAM,gBAAgB,QAAQ;GACvD,YAAY;EACd,GAEA;GAAE,WAAW;GAAM,OAAO;EAAO,CACnC;EAEA,SAAS,WAAiB;GACxB,KAAK,QAAQ;GACb,KAAK,qBAAqB,KAAK;EACjC;EAEA,SAAS,YAAkB;GACzB,KAAK,SAAS;GACd,IAAI,MAAM,gBACR,KAAK,qBAAqB,KAAK;EACnC;;uBAIE,YA8CW,kBAAA;gBA7CA,KAAA;sEAAI,QAAA;IACZ,OAAO,cAAA;IACP,MAAM,MAAA,YAAA;IACN,qBAAmB,wBAAA;IACnB,gBAAc,mBAAA;IACd,eAAa,QAAA;IACb,qBAAmB,QAAA;IACnB,iBAAe,QAAA;IACf,iBAAe,QAAA;IACf,eAAa,QAAA;IACb,eAAa,mBAAA;;IAcH,QAAM,cAmBR,CAlBP,WAkBO,KAAA,QAAA,UAAA,CAAA,SAAA,CAjBL,mBAgBM,OAhBN,YAgBM,CAfJ,YAEW,kBAAA;cAFG;KAAJ,KAAI;KAAkB,eAAY;KAAoB,SAAQ;KAAW,MAAM,QAAA;KAAa,SAAO;;4BACnF,CAAA,gBAAA,gBAArB,mBAAA,KAAkB,GAAA,CAAA,CAAA,CAAA;;qBAEvB,YAWW,kBAAA;cAVL;KAAJ,KAAI;KACJ,eAAY;KACX,SAAS,QAAA;KACT,MAAM,QAAA;KACN,MAAM,QAAA;KACN,SAAS,QAAA;KACT,UAAU,QAAA;KACV,SAAO;;4BAEiB,CAAA,gBAAA,gBAAtB,oBAAA,KAAmB,GAAA,CAAA,CAAA,CAAA;;;;;;;;;2BAlBxB,CAVN,mBAUM,OAVN,YAUM,CATJ,WAIO,KAAA,QAAA,WAAA,CAAA,SAAA,CAHM,QAAA,eAAA,UAAA,GAAX,mBAEM,OAFN,YAEM,gBADD,QAAA,WAAW,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA,CAAA,CAAA,GAIlB,WAEO,KAAA,QAAA,SAAA,EAFa,OAAO,QAAA,MAAK,SAEzB,CADwB,QAAA,SAAA,UAAA,GAA7B,YAA0E,+BAAA;;KAArC,OAAO,QAAA;KAAQ,eAAa"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"GrContextMenu-BbAJholy.js","names":[],"sources":["../../../../src/components/GrContextMenu/contextMenuAnchor.ts","../../../../src/components/GrContextMenu/GrContextMenu.vue","../../../../src/components/GrContextMenu/GrContextMenu.vue"],"sourcesContent":["import type { GrFloatingAnchorRect } from '../../composables/useFloating'\n\n/** Точка курсора — якорь нулевого размера. */\nexport function anchorFromPointer(event: MouseEvent): GrFloatingAnchorRect {\n return { x: event.clientX, y: event.clientY }\n}\n\n/**\n * Прямоугольник элемента — якорь клавиатурного вызова.\n *\n * Не угол и не точка: меню, вызванное с клавиатуры, принадлежит **строке**, и\n * при нехватке места снизу обязано перевернуться относительно неё целиком.\n */\nexport function anchorFromElement(element: Element): GrFloatingAnchorRect {\n const rect = element.getBoundingClientRect()\n\n return { x: rect.left, y: rect.top, width: rect.width, height: rect.height }\n}\n\n/**\n * `contextmenu` пришёл с клавиатуры, а не от мыши.\n *\n * Браузеры порождают это событие и для `Shift+F10`, но координаты в нём\n * бесполезны: то угол элемента, то нули. Признаков два сразу, потому что по\n * отдельности каждый ошибается — правый клик всегда `button === 2`, а\n * клавиатурный вызов всегда без «числа кликов».\n */\nexport function isKeyboardContextMenu(event: MouseEvent): boolean {\n return event.button !== 2 && event.detail === 0\n}\n\n/**\n * Пользователь просит нативное меню браузера.\n *\n * `Shift`+правый клик — де-факто escape-hatch, в Firefox задокументированный.\n * `ctrlKey` сюда не входит намеренно: на macOS Ctrl+клик **и есть** правый\n * клик, и меню перестало бы открываться у части пользователей.\n */\nexport function wantsNativeMenu(event: MouseEvent): boolean {\n return event.shiftKey\n}\n\n/** Клавиатурный запрос контекстного меню: `Shift+F10` или клавиша `ContextMenu`. */\nexport function isContextMenuKey(event: KeyboardEvent): boolean {\n return event.key === 'ContextMenu' || (event.key === 'F10' && event.shiftKey)\n}\n","<script setup lang=\"ts\">\n/**\n * GrContextMenu — меню по правому клику.\n *\n * Отличие от `GrDropdownMenu` не в содержимом, а в том, откуда меню растёт: у\n * дропдауна есть триггер-элемент, здесь — точка курсора, которой в DOM нет.\n * Поэтому слой берётся у `GrPopover` в якорном режиме, а не собирается заново.\n *\n * A11y: панель — `role=\"menu\"` с доступным именем, пункты приезжают из\n * `GrDropdownMenu` вместе со своими ролями. Меню, открываемое только правым\n * кликом, недоступно с клавиатуры, поэтому обёртка ловит `Shift+F10` и клавишу\n * `ContextMenu` — это условие приёмки, а не удобство.\n */\nimport { computed, nextTick, onBeforeUnmount, ref, useSlots, watch } from 'vue'\n\nimport { useControlledOpen } from '../../composables/internal/useControlledOpen'\nimport { useMenuItemsFocus } from '../../composables/internal/useMenuItemsFocus'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport { isEditableTarget } from '../../internal/keyboard'\nimport GrDropdownMenuEntries from '../GrDropdownMenu/GrDropdownMenuEntries.vue'\nimport GrDropdownMenuList from '../GrDropdownMenu/GrDropdownMenuList.vue'\nimport type { GrDropdownMenuAction, GrDropdownMenuEntry } from '../GrDropdownMenu/menuModel'\nimport { isMenuAction, isMenuSection } from '../GrDropdownMenu/menuModel'\nimport GrPopover from '../GrPopover/GrPopover.vue'\nimport type { GrFloatingAnchorRect, UseFloatingPlacement } from '../../composables/useFloating'\n\nimport {\n anchorFromElement,\n anchorFromPointer,\n isContextMenuKey,\n isKeyboardContextMenu,\n wantsNativeMenu,\n} from './contextMenuAnchor'\n\n/** Чем открывается меню. `manual` — только императивно, из кода потребителя. */\nexport type GrContextMenuTrigger = 'contextmenu' | 'manual'\n\n/** Откуда пришло открытие: указатель, клавиатура или вызов из кода. */\nexport type GrContextMenuSource = 'pointer' | 'keyboard' | 'api'\n\nexport interface GrContextMenuOpenContext {\n source: GrContextMenuSource\n /** По чему кликнули или что было в фокусе — отсюда потребитель берёт строку. */\n target: HTMLElement | null\n anchor: GrFloatingAnchorRect\n event: MouseEvent | KeyboardEvent | null\n}\n\nexport interface GrContextMenuProps {\n /** Декларативное меню. Слот `#content` сильнее. */\n items?: GrDropdownMenuEntry[]\n /** Открыто ли меню. Без пропа компонент ведёт состояние сам. */\n open?: boolean\n trigger?: GrContextMenuTrigger\n disabled?: boolean\n placement?: UseFloatingPlacement\n /** Зазор от якоря. Ноль по умолчанию: меню липнет к курсору. */\n offsetPx?: number\n /** Меню из коротких слов не должно быть шириной в слово. */\n minWidth?: number | string\n ariaLabel?: string\n labelledBy?: string\n teleportTo?: string | HTMLElement\n contentClass?: string\n listClass?: string\n dividers?: boolean\n /**\n * Закрывать при прокрутке страницы. Якорь — точка вьюпорта, и панель осталась\n * бы висеть на экране, пока контент под ней уезжает. Так же ведут себя\n * нативные меню.\n */\n closeOnScroll?: boolean\n /** Пропускать `Shift`+правый клик к браузеру. */\n allowNativeMenu?: boolean\n}\n\nexport interface GrContextMenuEmits {\n (e: 'update:open', value: boolean): void\n /**\n * Меню собирается открыться у этой цели. Приходит **до** открытия, чтобы\n * потребитель успел пересобрать `items` под неё: пункты для папки и для файла\n * разные, а узнать цель иначе неоткуда. Пустая модель после этого просто не\n * откроется — отдельный способ отменить открытие не нужен.\n */\n (e: 'beforeOpen', context: GrContextMenuOpenContext): void\n (e: 'select', item: GrDropdownMenuAction): void\n}\n\nconst props = withDefaults(defineProps<GrContextMenuProps>(), {\n items: undefined,\n open: undefined,\n trigger: 'contextmenu',\n disabled: false,\n placement: 'bottom-start',\n offsetPx: 0,\n minWidth: '11rem',\n ariaLabel: undefined,\n labelledBy: undefined,\n teleportTo: undefined,\n contentClass: undefined,\n listClass: undefined,\n dividers: false,\n closeOnScroll: true,\n allowNativeMenu: true,\n})\n\nconst emit = defineEmits<GrContextMenuEmits>()\n\nconst slots = useSlots()\nconst { t } = useGranularityTranslations()\n\nconst { open: isOpen, setOpen } = useControlledOpen(\n () => props.open,\n next => emit('update:open', next),\n)\n\nconst areaEl = ref<HTMLElement | null>(null)\nconst listRef = ref<{ $el?: HTMLElement } | null>(null)\nconst anchor = ref<GrFloatingAnchorRect | null>(null)\n\nconst resolvedAriaLabel = computed(() => props.ariaLabel ?? t('gr.contextMenu.label', 'Context menu'))\n\nconst listStyle = computed(() => ({\n minWidth: typeof props.minWidth === 'number' ? `${props.minWidth}px` : props.minWidth,\n}))\n\n/**\n * Меню без единого действия не открывается: фокусировать в нём нечего, и оно\n * становится ловушкой, из которой есть только Esc.\n */\nconst isEmpty = computed(() => {\n if (slots.content)\n return false\n\n return (props.items ?? []).every(entry => !isMenuAction(entry)\n && (!isMenuSection(entry) || entry.items.length === 0))\n})\n\nconst menu = useMenuItemsFocus({\n container: () => listRef.value?.$el ?? null,\n close: () => close(),\n})\n\nfunction panelOf(): HTMLElement | null {\n return listRef.value?.$el?.closest('[data-gr-popover-panel]') ?? null\n}\n\nfunction isInsidePanel(target: EventTarget | null): boolean {\n return target instanceof Node && (panelOf()?.contains(target) ?? false)\n}\n\nasync function openWith(context: GrContextMenuOpenContext): Promise<void> {\n if (props.disabled)\n return\n\n anchor.value = context.anchor\n emit('beforeOpen', context)\n\n // Тик между уведомлением и открытием — не перестраховка: `items` доезжают сюда\n // пропом, то есть следующим рендером родителя. Без ожидания меню под узел\n // дерева открылось бы с пунктами от предыдущей цели.\n await nextTick()\n\n if (isEmpty.value)\n return\n\n setOpen(true)\n\n await nextTick()\n menu.focusAt(0)\n}\n\n/** Открыть у точки курсора или у произвольного прямоугольника вьюпорта. */\nfunction openAt(at: MouseEvent | GrFloatingAnchorRect): void {\n const fromPointer = at instanceof MouseEvent\n\n void openWith({\n source: fromPointer ? 'pointer' : 'api',\n target: fromPointer ? (at.target as HTMLElement | null) : null,\n anchor: fromPointer ? anchorFromPointer(at) : at,\n event: fromPointer ? at : null,\n })\n}\n\n/** Открыть у прямоугольника элемента — клавиатурный путь для внешних композитов. */\nfunction openAtElement(element: Element): void {\n void openWith({\n source: 'api',\n target: element instanceof HTMLElement ? element : null,\n anchor: anchorFromElement(element),\n event: null,\n })\n}\n\nfunction open(): void {\n if (anchor.value)\n void openWith({ source: 'api', target: null, anchor: anchor.value, event: null })\n else if (areaEl.value)\n openAtElement(areaEl.value)\n}\n\nfunction close(): void {\n setOpen(false)\n menu.reset()\n}\n\nfunction toggle(): void {\n isOpen.value ? close() : open()\n}\n\nfunction onSelect(item: GrDropdownMenuAction): void {\n emit('select', item)\n}\n\nfunction onAreaContextMenu(event: MouseEvent): void {\n if (props.trigger !== 'contextmenu' || props.disabled)\n return\n\n if (props.allowNativeMenu && wantsNativeMenu(event))\n return\n\n event.preventDefault()\n // Вложенные области: побеждает ближайшая к цели, как в нативных приложениях.\n event.stopPropagation()\n\n if (isKeyboardContextMenu(event)) {\n const target = (document.activeElement as HTMLElement | null) ?? areaEl.value\n if (target) openAtElement(target)\n return\n }\n\n openAt(event)\n}\n\n/**\n * `trigger` здесь намеренно не проверяется: `manual` отключает открытие\n * указателем, а клавиатурный путь оставить обязан — иначе меню недоступно с\n * клавиатуры в принципе, и потребителю пришлось бы писать этот обработчик\n * заново на каждой странице.\n */\nfunction onAreaKeydown(event: KeyboardEvent): void {\n if (props.disabled)\n return\n\n if (!isContextMenuKey(event))\n return\n\n // В поле ввода нативное меню (орфография, буфер) полезнее нашего.\n if (isEditableTarget(event.target))\n return\n\n // Отмена keydown гасит `contextmenu`, который браузер породил бы следом:\n // без неё меню открылось бы дважды и второй раз — по координатам, а не по\n // прямоугольнику строки.\n event.preventDefault()\n\n const target = (document.activeElement as HTMLElement | null) ?? areaEl.value\n if (!target)\n return\n\n void openWith({\n source: 'keyboard',\n target,\n anchor: anchorFromElement(target),\n event,\n })\n}\n\n/**\n * Правый клик мимо меню его не закрывает: `v-click-outside` отбрасывает всё,\n * что не левая кнопка, а `contextmenu` вообще не порождает `click`. Ослаблять\n * директиву нельзя — гард бережёт дропдауны, — поэтому слушаем сами.\n */\nfunction onDocumentContextMenu(event: MouseEvent): void {\n if (isInsidePanel(event.target)) {\n event.preventDefault()\n return\n }\n\n // Внутри своей области меню не закрываем: обработчик области перенесёт его к\n // новой точке, а закрытие с последующим открытием мигало бы панелью.\n if (event.target instanceof Node && areaEl.value?.contains(event.target))\n return\n\n close()\n}\n\nfunction onDocumentScroll(event: Event): void {\n if (isInsidePanel(event.target))\n return\n\n close()\n}\n\nlet scrollFrame: number | undefined\n\nfunction stopListening(): void {\n if (scrollFrame !== undefined) {\n cancelAnimationFrame(scrollFrame)\n scrollFrame = undefined\n }\n\n window.removeEventListener('contextmenu', onDocumentContextMenu, true)\n window.removeEventListener('scroll', onDocumentScroll, true)\n}\n\nwatch(isOpen, (next) => {\n if (typeof window === 'undefined')\n return\n\n if (!next) {\n stopListening()\n return\n }\n\n window.addEventListener('contextmenu', onDocumentContextMenu, true)\n\n // Слушатель прокрутки — со следующего кадра: само открытие прокручивает\n // страницу (браузер подтягивает в вид то, по чему кликнули и что получило\n // фокус), и меню закрывало бы само себя ровно в момент появления.\n if (props.closeOnScroll) {\n scrollFrame = requestAnimationFrame(() => {\n scrollFrame = undefined\n window.addEventListener('scroll', onDocumentScroll, { capture: true, passive: true })\n })\n }\n})\n\nonBeforeUnmount(() => {\n if (typeof window === 'undefined')\n return\n\n stopListening()\n})\n\ndefineExpose({ openAt, openAtElement, open, close, toggle })\n</script>\n\n<template>\n <div data-gr-context-menu>\n <div\n v-if=\"slots.default\"\n ref=\"areaEl\"\n data-gr-context-menu-area\n @contextmenu=\"onAreaContextMenu\"\n @keydown=\"onAreaKeydown\"\n >\n <slot :open=\"isOpen\" />\n </div>\n\n <GrPopover\n :open=\"isOpen\"\n :anchor=\"anchor\"\n :placement=\"placement\"\n :offset-px=\"offsetPx\"\n :teleport-to=\"teleportTo\"\n :content-class=\"contentClass\"\n :aria-label=\"labelledBy ? undefined : resolvedAriaLabel\"\n :labelled-by=\"labelledBy\"\n role=\"menu\"\n trigger=\"manual\"\n padding=\"none\"\n close-on-content-click\n :auto-focus=\"false\"\n @update:open=\"setOpen($event)\"\n >\n <template #content=\"{ close: closePanel }\">\n <GrDropdownMenuList\n ref=\"listRef\"\n class=\"p-1\"\n :style=\"listStyle\"\n :dividers=\"dividers\"\n :class=\"listClass\"\n @keydown=\"menu.onKeydown\"\n >\n <slot name=\"content\" :close=\"closePanel\">\n <GrDropdownMenuEntries :items=\"items\" @select=\"onSelect\" />\n </slot>\n </GrDropdownMenuList>\n </template>\n </GrPopover>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * GrContextMenu — меню по правому клику.\n *\n * Отличие от `GrDropdownMenu` не в содержимом, а в том, откуда меню растёт: у\n * дропдауна есть триггер-элемент, здесь — точка курсора, которой в DOM нет.\n * Поэтому слой берётся у `GrPopover` в якорном режиме, а не собирается заново.\n *\n * A11y: панель — `role=\"menu\"` с доступным именем, пункты приезжают из\n * `GrDropdownMenu` вместе со своими ролями. Меню, открываемое только правым\n * кликом, недоступно с клавиатуры, поэтому обёртка ловит `Shift+F10` и клавишу\n * `ContextMenu` — это условие приёмки, а не удобство.\n */\nimport { computed, nextTick, onBeforeUnmount, ref, useSlots, watch } from 'vue'\n\nimport { useControlledOpen } from '../../composables/internal/useControlledOpen'\nimport { useMenuItemsFocus } from '../../composables/internal/useMenuItemsFocus'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport { isEditableTarget } from '../../internal/keyboard'\nimport GrDropdownMenuEntries from '../GrDropdownMenu/GrDropdownMenuEntries.vue'\nimport GrDropdownMenuList from '../GrDropdownMenu/GrDropdownMenuList.vue'\nimport type { GrDropdownMenuAction, GrDropdownMenuEntry } from '../GrDropdownMenu/menuModel'\nimport { isMenuAction, isMenuSection } from '../GrDropdownMenu/menuModel'\nimport GrPopover from '../GrPopover/GrPopover.vue'\nimport type { GrFloatingAnchorRect, UseFloatingPlacement } from '../../composables/useFloating'\n\nimport {\n anchorFromElement,\n anchorFromPointer,\n isContextMenuKey,\n isKeyboardContextMenu,\n wantsNativeMenu,\n} from './contextMenuAnchor'\n\n/** Чем открывается меню. `manual` — только императивно, из кода потребителя. */\nexport type GrContextMenuTrigger = 'contextmenu' | 'manual'\n\n/** Откуда пришло открытие: указатель, клавиатура или вызов из кода. */\nexport type GrContextMenuSource = 'pointer' | 'keyboard' | 'api'\n\nexport interface GrContextMenuOpenContext {\n source: GrContextMenuSource\n /** По чему кликнули или что было в фокусе — отсюда потребитель берёт строку. */\n target: HTMLElement | null\n anchor: GrFloatingAnchorRect\n event: MouseEvent | KeyboardEvent | null\n}\n\nexport interface GrContextMenuProps {\n /** Декларативное меню. Слот `#content` сильнее. */\n items?: GrDropdownMenuEntry[]\n /** Открыто ли меню. Без пропа компонент ведёт состояние сам. */\n open?: boolean\n trigger?: GrContextMenuTrigger\n disabled?: boolean\n placement?: UseFloatingPlacement\n /** Зазор от якоря. Ноль по умолчанию: меню липнет к курсору. */\n offsetPx?: number\n /** Меню из коротких слов не должно быть шириной в слово. */\n minWidth?: number | string\n ariaLabel?: string\n labelledBy?: string\n teleportTo?: string | HTMLElement\n contentClass?: string\n listClass?: string\n dividers?: boolean\n /**\n * Закрывать при прокрутке страницы. Якорь — точка вьюпорта, и панель осталась\n * бы висеть на экране, пока контент под ней уезжает. Так же ведут себя\n * нативные меню.\n */\n closeOnScroll?: boolean\n /** Пропускать `Shift`+правый клик к браузеру. */\n allowNativeMenu?: boolean\n}\n\nexport interface GrContextMenuEmits {\n (e: 'update:open', value: boolean): void\n /**\n * Меню собирается открыться у этой цели. Приходит **до** открытия, чтобы\n * потребитель успел пересобрать `items` под неё: пункты для папки и для файла\n * разные, а узнать цель иначе неоткуда. Пустая модель после этого просто не\n * откроется — отдельный способ отменить открытие не нужен.\n */\n (e: 'beforeOpen', context: GrContextMenuOpenContext): void\n (e: 'select', item: GrDropdownMenuAction): void\n}\n\nconst props = withDefaults(defineProps<GrContextMenuProps>(), {\n items: undefined,\n open: undefined,\n trigger: 'contextmenu',\n disabled: false,\n placement: 'bottom-start',\n offsetPx: 0,\n minWidth: '11rem',\n ariaLabel: undefined,\n labelledBy: undefined,\n teleportTo: undefined,\n contentClass: undefined,\n listClass: undefined,\n dividers: false,\n closeOnScroll: true,\n allowNativeMenu: true,\n})\n\nconst emit = defineEmits<GrContextMenuEmits>()\n\nconst slots = useSlots()\nconst { t } = useGranularityTranslations()\n\nconst { open: isOpen, setOpen } = useControlledOpen(\n () => props.open,\n next => emit('update:open', next),\n)\n\nconst areaEl = ref<HTMLElement | null>(null)\nconst listRef = ref<{ $el?: HTMLElement } | null>(null)\nconst anchor = ref<GrFloatingAnchorRect | null>(null)\n\nconst resolvedAriaLabel = computed(() => props.ariaLabel ?? t('gr.contextMenu.label', 'Context menu'))\n\nconst listStyle = computed(() => ({\n minWidth: typeof props.minWidth === 'number' ? `${props.minWidth}px` : props.minWidth,\n}))\n\n/**\n * Меню без единого действия не открывается: фокусировать в нём нечего, и оно\n * становится ловушкой, из которой есть только Esc.\n */\nconst isEmpty = computed(() => {\n if (slots.content)\n return false\n\n return (props.items ?? []).every(entry => !isMenuAction(entry)\n && (!isMenuSection(entry) || entry.items.length === 0))\n})\n\nconst menu = useMenuItemsFocus({\n container: () => listRef.value?.$el ?? null,\n close: () => close(),\n})\n\nfunction panelOf(): HTMLElement | null {\n return listRef.value?.$el?.closest('[data-gr-popover-panel]') ?? null\n}\n\nfunction isInsidePanel(target: EventTarget | null): boolean {\n return target instanceof Node && (panelOf()?.contains(target) ?? false)\n}\n\nasync function openWith(context: GrContextMenuOpenContext): Promise<void> {\n if (props.disabled)\n return\n\n anchor.value = context.anchor\n emit('beforeOpen', context)\n\n // Тик между уведомлением и открытием — не перестраховка: `items` доезжают сюда\n // пропом, то есть следующим рендером родителя. Без ожидания меню под узел\n // дерева открылось бы с пунктами от предыдущей цели.\n await nextTick()\n\n if (isEmpty.value)\n return\n\n setOpen(true)\n\n await nextTick()\n menu.focusAt(0)\n}\n\n/** Открыть у точки курсора или у произвольного прямоугольника вьюпорта. */\nfunction openAt(at: MouseEvent | GrFloatingAnchorRect): void {\n const fromPointer = at instanceof MouseEvent\n\n void openWith({\n source: fromPointer ? 'pointer' : 'api',\n target: fromPointer ? (at.target as HTMLElement | null) : null,\n anchor: fromPointer ? anchorFromPointer(at) : at,\n event: fromPointer ? at : null,\n })\n}\n\n/** Открыть у прямоугольника элемента — клавиатурный путь для внешних композитов. */\nfunction openAtElement(element: Element): void {\n void openWith({\n source: 'api',\n target: element instanceof HTMLElement ? element : null,\n anchor: anchorFromElement(element),\n event: null,\n })\n}\n\nfunction open(): void {\n if (anchor.value)\n void openWith({ source: 'api', target: null, anchor: anchor.value, event: null })\n else if (areaEl.value)\n openAtElement(areaEl.value)\n}\n\nfunction close(): void {\n setOpen(false)\n menu.reset()\n}\n\nfunction toggle(): void {\n isOpen.value ? close() : open()\n}\n\nfunction onSelect(item: GrDropdownMenuAction): void {\n emit('select', item)\n}\n\nfunction onAreaContextMenu(event: MouseEvent): void {\n if (props.trigger !== 'contextmenu' || props.disabled)\n return\n\n if (props.allowNativeMenu && wantsNativeMenu(event))\n return\n\n event.preventDefault()\n // Вложенные области: побеждает ближайшая к цели, как в нативных приложениях.\n event.stopPropagation()\n\n if (isKeyboardContextMenu(event)) {\n const target = (document.activeElement as HTMLElement | null) ?? areaEl.value\n if (target) openAtElement(target)\n return\n }\n\n openAt(event)\n}\n\n/**\n * `trigger` здесь намеренно не проверяется: `manual` отключает открытие\n * указателем, а клавиатурный путь оставить обязан — иначе меню недоступно с\n * клавиатуры в принципе, и потребителю пришлось бы писать этот обработчик\n * заново на каждой странице.\n */\nfunction onAreaKeydown(event: KeyboardEvent): void {\n if (props.disabled)\n return\n\n if (!isContextMenuKey(event))\n return\n\n // В поле ввода нативное меню (орфография, буфер) полезнее нашего.\n if (isEditableTarget(event.target))\n return\n\n // Отмена keydown гасит `contextmenu`, который браузер породил бы следом:\n // без неё меню открылось бы дважды и второй раз — по координатам, а не по\n // прямоугольнику строки.\n event.preventDefault()\n\n const target = (document.activeElement as HTMLElement | null) ?? areaEl.value\n if (!target)\n return\n\n void openWith({\n source: 'keyboard',\n target,\n anchor: anchorFromElement(target),\n event,\n })\n}\n\n/**\n * Правый клик мимо меню его не закрывает: `v-click-outside` отбрасывает всё,\n * что не левая кнопка, а `contextmenu` вообще не порождает `click`. Ослаблять\n * директиву нельзя — гард бережёт дропдауны, — поэтому слушаем сами.\n */\nfunction onDocumentContextMenu(event: MouseEvent): void {\n if (isInsidePanel(event.target)) {\n event.preventDefault()\n return\n }\n\n // Внутри своей области меню не закрываем: обработчик области перенесёт его к\n // новой точке, а закрытие с последующим открытием мигало бы панелью.\n if (event.target instanceof Node && areaEl.value?.contains(event.target))\n return\n\n close()\n}\n\nfunction onDocumentScroll(event: Event): void {\n if (isInsidePanel(event.target))\n return\n\n close()\n}\n\nlet scrollFrame: number | undefined\n\nfunction stopListening(): void {\n if (scrollFrame !== undefined) {\n cancelAnimationFrame(scrollFrame)\n scrollFrame = undefined\n }\n\n window.removeEventListener('contextmenu', onDocumentContextMenu, true)\n window.removeEventListener('scroll', onDocumentScroll, true)\n}\n\nwatch(isOpen, (next) => {\n if (typeof window === 'undefined')\n return\n\n if (!next) {\n stopListening()\n return\n }\n\n window.addEventListener('contextmenu', onDocumentContextMenu, true)\n\n // Слушатель прокрутки — со следующего кадра: само открытие прокручивает\n // страницу (браузер подтягивает в вид то, по чему кликнули и что получило\n // фокус), и меню закрывало бы само себя ровно в момент появления.\n if (props.closeOnScroll) {\n scrollFrame = requestAnimationFrame(() => {\n scrollFrame = undefined\n window.addEventListener('scroll', onDocumentScroll, { capture: true, passive: true })\n })\n }\n})\n\nonBeforeUnmount(() => {\n if (typeof window === 'undefined')\n return\n\n stopListening()\n})\n\ndefineExpose({ openAt, openAtElement, open, close, toggle })\n</script>\n\n<template>\n <div data-gr-context-menu>\n <div\n v-if=\"slots.default\"\n ref=\"areaEl\"\n data-gr-context-menu-area\n @contextmenu=\"onAreaContextMenu\"\n @keydown=\"onAreaKeydown\"\n >\n <slot :open=\"isOpen\" />\n </div>\n\n <GrPopover\n :open=\"isOpen\"\n :anchor=\"anchor\"\n :placement=\"placement\"\n :offset-px=\"offsetPx\"\n :teleport-to=\"teleportTo\"\n :content-class=\"contentClass\"\n :aria-label=\"labelledBy ? undefined : resolvedAriaLabel\"\n :labelled-by=\"labelledBy\"\n role=\"menu\"\n trigger=\"manual\"\n padding=\"none\"\n close-on-content-click\n :auto-focus=\"false\"\n @update:open=\"setOpen($event)\"\n >\n <template #content=\"{ close: closePanel }\">\n <GrDropdownMenuList\n ref=\"listRef\"\n class=\"p-1\"\n :style=\"listStyle\"\n :dividers=\"dividers\"\n :class=\"listClass\"\n @keydown=\"menu.onKeydown\"\n >\n <slot name=\"content\" :close=\"closePanel\">\n <GrDropdownMenuEntries :items=\"items\" @select=\"onSelect\" />\n </slot>\n </GrDropdownMenuList>\n </template>\n </GrPopover>\n </div>\n</template>\n"],"mappings":"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"}