@feugene/granularity 0.36.0 → 0.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (367) hide show
  1. package/dist/chunks/config-2ZHRsdOc.js.map +1 -1
  2. package/dist/chunks/config-2vrOFn2f.js.map +1 -1
  3. package/dist/chunks/config-3bQeQvqd.js.map +1 -1
  4. package/dist/chunks/config-87fszqnD.js.map +1 -1
  5. package/dist/chunks/config-8Pcutu1j.js.map +1 -1
  6. package/dist/chunks/config-A-bBiotF.js.map +1 -1
  7. package/dist/chunks/config-B0uvcTPH.js.map +1 -1
  8. package/dist/chunks/config-B3J0alyY.js.map +1 -1
  9. package/dist/chunks/config-B5SBUa6u.js.map +1 -1
  10. package/dist/chunks/config-B7W9VlZ7.js.map +1 -1
  11. package/dist/chunks/config-BDSaD-5p.js.map +1 -1
  12. package/dist/chunks/config-BEO7brpO.js.map +1 -1
  13. package/dist/chunks/config-BNu8lFQB.js.map +1 -1
  14. package/dist/chunks/config-BRESvs9g.js.map +1 -1
  15. package/dist/chunks/config-BTmfQFwi.js.map +1 -1
  16. package/dist/chunks/{config-CuQmUkMw2.js → config-BUNxHnEz.js} +1 -1
  17. package/dist/chunks/config-BUNxHnEz.js.map +1 -0
  18. package/dist/chunks/config-BaWANzzB.js.map +1 -1
  19. package/dist/chunks/config-BcXX7S7B.js.map +1 -1
  20. package/dist/chunks/config-Bd7QfiGj.js.map +1 -1
  21. package/dist/chunks/config-BhfNgyWL.js.map +1 -1
  22. package/dist/chunks/config-Bjn30smH.js.map +1 -1
  23. package/dist/chunks/config-BlJa1Mj9.js.map +1 -1
  24. package/dist/chunks/config-BoUI0t-t.js.map +1 -1
  25. package/dist/chunks/config-BqT6PMzO.js.map +1 -1
  26. package/dist/chunks/config-BscVxZR3.js.map +1 -1
  27. package/dist/chunks/config-BuGlNPE9.js.map +1 -1
  28. package/dist/chunks/config-C0Ea9ePP.js.map +1 -1
  29. package/dist/chunks/config-C0Eu8jpG.js.map +1 -1
  30. package/dist/chunks/config-CDat1wXf.js.map +1 -1
  31. package/dist/chunks/config-CIkdsWUk.js.map +1 -1
  32. package/dist/chunks/config-CJzmDHfI.js.map +1 -1
  33. package/dist/chunks/config-CLjjjPZj.js.map +1 -1
  34. package/dist/chunks/config-CMNfZO7S.js.map +1 -1
  35. package/dist/chunks/config-CQLNjc9X.js.map +1 -0
  36. package/dist/chunks/config-CT4lP6S4.js.map +1 -1
  37. package/dist/chunks/config-CWtfxkM9.js.map +1 -1
  38. package/dist/chunks/config-CYthTVK2.js.map +1 -1
  39. package/dist/chunks/config-CZPDPJlg.js.map +1 -1
  40. package/dist/chunks/config-CbEbLyDE.js.map +1 -1
  41. package/dist/chunks/config-ChPg-BQv.js.map +1 -1
  42. package/dist/chunks/config-CjKpUcmy.js.map +1 -1
  43. package/dist/chunks/config-CjWOTgLL.js.map +1 -1
  44. package/dist/chunks/config-CjXjhphs.js.map +1 -1
  45. package/dist/chunks/config-CnYdE3HZ.js.map +1 -0
  46. package/dist/chunks/config-CsCUuukB.js.map +1 -1
  47. package/dist/chunks/config-CvbVM4ep.js.map +1 -1
  48. package/dist/chunks/config-D0NzGYaE.js.map +1 -1
  49. package/dist/chunks/config-D0W8mGFD.js.map +1 -1
  50. package/dist/chunks/config-D82r782v.js.map +1 -1
  51. package/dist/chunks/config-DBi0GVce.js.map +1 -1
  52. package/dist/chunks/config-DBmdgoVf.js.map +1 -0
  53. package/dist/chunks/config-DCq4JySZ.js.map +1 -1
  54. package/dist/chunks/config-DGC00bTp.js.map +1 -1
  55. package/dist/chunks/config-DIDz_E5m.js.map +1 -1
  56. package/dist/chunks/config-DM0lsduD.js.map +1 -1
  57. package/dist/chunks/config-DNDgp9bB.js.map +1 -1
  58. package/dist/chunks/config-DOYz_SVK.js.map +1 -1
  59. package/dist/chunks/config-DRbojEzO.js.map +1 -1
  60. package/dist/chunks/config-DUNH02Fg.js.map +1 -1
  61. package/dist/chunks/config-DUbbGcfw.js.map +1 -1
  62. package/dist/chunks/config-DVCNvhIG.js.map +1 -0
  63. package/dist/chunks/config-DWL81-aM.js.map +1 -1
  64. package/dist/chunks/config-DZCUPHPU.js.map +1 -1
  65. package/dist/chunks/config-DeyT9dJl.js.map +1 -1
  66. package/dist/chunks/config-DolULhjJ.js.map +1 -1
  67. package/dist/chunks/config-DpAYidyY.js.map +1 -0
  68. package/dist/chunks/config-Droqn55j.js.map +1 -1
  69. package/dist/chunks/config-DwABJHEo.js.map +1 -1
  70. package/dist/chunks/config-E1cTyRVV.js.map +1 -1
  71. package/dist/chunks/config-MmPym-Z7.js.map +1 -0
  72. package/dist/chunks/config-QaIc_gRa.js.map +1 -1
  73. package/dist/chunks/config-Yy67uWHY.js.map +1 -1
  74. package/dist/chunks/config-Z5LeUXys.js.map +1 -1
  75. package/dist/chunks/config-_jbgsFpw.js.map +1 -1
  76. package/dist/chunks/config-eXB87DOi.js.map +1 -1
  77. package/dist/chunks/config-rLkc9Zn2.js.map +1 -1
  78. package/dist/chunks/{context-CTbuwcYs.js → context-CPMRfwVr.js} +1 -1
  79. package/dist/chunks/{context-CTbuwcYs.js.map → context-CPMRfwVr.js.map} +1 -1
  80. package/dist/chunks/devHook-CiqijpNM.js +44 -0
  81. package/dist/chunks/devHook-CiqijpNM.js.map +1 -0
  82. package/dist/chunks/{grRadioStyles-DGL2QLy6.js → grRadioStyles-BwRyCjQQ.js} +4 -2
  83. package/dist/chunks/{grRadioStyles-DGL2QLy6.js.map → grRadioStyles-BwRyCjQQ.js.map} +1 -1
  84. package/dist/chunks/{granular-provider-Bp_BCBnr.js → granular-provider-DP2gk0oa.js} +9 -8
  85. package/dist/chunks/{granular-provider-Bp_BCBnr.js.map → granular-provider-DP2gk0oa.js.map} +1 -1
  86. package/dist/chunks/{overlayStack-0CZS99Da.js → overlayStack-DH4Z7am1.js} +45 -25
  87. package/dist/chunks/overlayStack-DH4Z7am1.js.map +1 -0
  88. package/dist/chunks/{renamedProp-BwcN-SJg.js → renamedProp-Dy96tT-F.js} +1 -1
  89. package/dist/chunks/{renamedProp-BwcN-SJg.js.map → renamedProp-Dy96tT-F.js.map} +1 -1
  90. package/dist/chunks/{useModalOverlay-BnAGZpcI.js → useModalOverlay-ACRkflzx.js} +3 -3
  91. package/dist/chunks/{useModalOverlay-BnAGZpcI.js.map → useModalOverlay-ACRkflzx.js.map} +1 -1
  92. package/dist/chunks/{usePortalTarget-C0p-mhaM.js → usePortalTarget-BhrRgdqW.js} +1 -1
  93. package/dist/chunks/{usePortalTarget-C0p-mhaM.js.map → usePortalTarget-BhrRgdqW.js.map} +1 -1
  94. package/dist/chunks/{validation-5HhpanPP.js → validation-BDjqsuGB.js} +1 -1
  95. package/dist/chunks/{validation-5HhpanPP.js.map → validation-BDjqsuGB.js.map} +1 -1
  96. package/dist/components/GrAlert/chunks/{GrAlert-FAVf-ksH.js → GrAlert-D72y1IEh.js} +1 -1
  97. package/dist/components/GrAlert/chunks/{GrAlert-FAVf-ksH.js.map → GrAlert-D72y1IEh.js.map} +1 -1
  98. package/dist/components/GrAlert/index.js +1 -1
  99. package/dist/components/GrAutocomplete/chunks/{GrAutocomplete-BQsSE7sj.js → GrAutocomplete-BpmFmpKs.js} +4 -6
  100. package/dist/components/GrAutocomplete/chunks/{GrAutocomplete-BQsSE7sj.js.map → GrAutocomplete-BpmFmpKs.js.map} +1 -1
  101. package/dist/components/GrAutocomplete/index.js +1 -1
  102. package/dist/components/GrAvatar/chunks/{GrAvatar-CNmLmgcr.js → GrAvatar-dWEXiCJG.js} +1 -1
  103. package/dist/components/GrAvatar/chunks/{GrAvatar-CNmLmgcr.js.map → GrAvatar-dWEXiCJG.js.map} +1 -1
  104. package/dist/components/GrAvatar/index.js +1 -1
  105. package/dist/components/GrBadge/chunks/{GrBadge-DpUDXKbq.js → GrBadge-DBeQXEir.js} +2 -2
  106. package/dist/components/GrBadge/chunks/{GrBadge-DpUDXKbq.js.map → GrBadge-DBeQXEir.js.map} +1 -1
  107. package/dist/components/GrBadge/index.js +1 -1
  108. package/dist/components/GrBadgeWrap/chunks/{GrBadgeWrap-B-A3PRkE.js → GrBadgeWrap-wdfxaXiu.js} +3 -1
  109. package/dist/components/GrBadgeWrap/chunks/{GrBadgeWrap-B-A3PRkE.js.map → GrBadgeWrap-wdfxaXiu.js.map} +1 -1
  110. package/dist/components/GrBadgeWrap/index.js +1 -1
  111. package/dist/components/GrBottomNav/chunks/{GrBottomNav-wtFatLjB.js → GrBottomNav-nE08pVUJ.js} +1 -1
  112. package/dist/components/GrBottomNav/chunks/{GrBottomNav-wtFatLjB.js.map → GrBottomNav-nE08pVUJ.js.map} +1 -1
  113. package/dist/components/GrBottomNav/index.js +1 -1
  114. package/dist/components/GrBreadcrumbs/chunks/{GrBreadcrumbs-DRDNan_n.js → GrBreadcrumbs-DOpwY2EF.js} +3 -3
  115. package/dist/components/GrBreadcrumbs/chunks/{GrBreadcrumbs-DRDNan_n.js.map → GrBreadcrumbs-DOpwY2EF.js.map} +1 -1
  116. package/dist/components/GrBreadcrumbs/index.js +1 -1
  117. package/dist/components/GrButton/chunks/{GrButton-7GP0zObj.js → GrButton-CS4TqMtG.js} +1 -1
  118. package/dist/components/GrButton/chunks/{GrButton-7GP0zObj.js.map → GrButton-CS4TqMtG.js.map} +1 -1
  119. package/dist/components/GrButton/index.js +1 -1
  120. package/dist/components/GrButtonGroup/chunks/GrButtonGroup-CKyiAV8K.js.map +1 -1
  121. package/dist/components/GrButtonGroup/index.js +1 -1
  122. package/dist/components/GrCard/chunks/{GrCard-BttXz1pQ.js → GrCard-Ck5--lMF.js} +2 -2
  123. package/dist/components/GrCard/chunks/{GrCard-BttXz1pQ.js.map → GrCard-Ck5--lMF.js.map} +1 -1
  124. package/dist/components/GrCard/index.js +1 -1
  125. package/dist/components/GrCheckbox/chunks/{GrCheckbox-CEcHIsXM.js → GrCheckbox-Dp201frb.js} +1 -1
  126. package/dist/components/GrCheckbox/chunks/{GrCheckbox-CEcHIsXM.js.map → GrCheckbox-Dp201frb.js.map} +1 -1
  127. package/dist/components/GrCheckbox/index.js +1 -1
  128. package/dist/components/GrCheckboxGroup/chunks/{GrCheckboxGroup-BOwrVcFr.js → GrCheckboxGroup-IpqG5qwm.js} +2 -2
  129. package/dist/components/GrCheckboxGroup/chunks/{GrCheckboxGroup-BOwrVcFr.js.map → GrCheckboxGroup-IpqG5qwm.js.map} +1 -1
  130. package/dist/components/GrCheckboxGroup/index.js +1 -1
  131. package/dist/components/GrChip/chunks/{GrChip-BTivtwff.js → GrChip-CKqyzYcv.js} +10 -7
  132. package/dist/components/GrChip/chunks/{GrChip-BTivtwff.js.map → GrChip-CKqyzYcv.js.map} +1 -1
  133. package/dist/components/GrChip/index.js +1 -1
  134. package/dist/components/GrChipGroup/chunks/{GrChipGroup-C78Vcwos.js → GrChipGroup-dDGwnC04.js} +1 -1
  135. package/dist/components/GrChipGroup/chunks/{GrChipGroup-C78Vcwos.js.map → GrChipGroup-dDGwnC04.js.map} +1 -1
  136. package/dist/components/GrChipGroup/index.js +1 -1
  137. package/dist/components/GrCodeBlock/chunks/{GrCodeBlock-Dp0eEBTZ.js → GrCodeBlock-BUOwKwQE.js} +2 -2
  138. package/dist/components/GrCodeBlock/chunks/{GrCodeBlock-Dp0eEBTZ.js.map → GrCodeBlock-BUOwKwQE.js.map} +1 -1
  139. package/dist/components/GrCodeBlock/index.js +1 -1
  140. package/dist/components/GrCollapse/chunks/{GrCollapse-BlW6ybdL.js → GrCollapse-DWH3QAnU.js} +6 -5
  141. package/dist/components/GrCollapse/chunks/{GrCollapse-BlW6ybdL.js.map → GrCollapse-DWH3QAnU.js.map} +1 -1
  142. package/dist/components/GrCollapse/index.js +1 -1
  143. package/dist/components/GrColorPicker/chunks/{GrColorPicker-B-L4CWMt.js → GrColorPicker-BwzRLs-i.js} +4 -4
  144. package/dist/components/GrColorPicker/chunks/{GrColorPicker-B-L4CWMt.js.map → GrColorPicker-BwzRLs-i.js.map} +1 -1
  145. package/dist/components/GrColorPicker/index.js +1 -1
  146. package/dist/components/GrCommandPalette/chunks/{GrCommandPalette-8HkYmMVP.js → GrCommandPalette-CnzPuoIM.js} +7 -7
  147. package/dist/components/GrCommandPalette/chunks/{GrCommandPalette-8HkYmMVP.js.map → GrCommandPalette-CnzPuoIM.js.map} +1 -1
  148. package/dist/components/GrCommandPalette/index.js +1 -1
  149. package/dist/components/GrConfigProvider/chunks/{GrConfigProvider-BF7R3hgg.js → GrConfigProvider-t9x2UToH.js} +13 -12
  150. package/dist/components/GrConfigProvider/chunks/{GrConfigProvider-BF7R3hgg.js.map → GrConfigProvider-t9x2UToH.js.map} +1 -1
  151. package/dist/components/GrConfigProvider/index.js +2 -2
  152. package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-CZEO2JR4.js → GrConfirmDialog-e15nFI8M.js} +4 -4
  153. package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-CZEO2JR4.js.map → GrConfirmDialog-e15nFI8M.js.map} +1 -1
  154. package/dist/components/GrConfirmDialog/index.js +1 -1
  155. package/dist/components/GrContextMenu/chunks/{GrContextMenu-DlFWm0eW.js → GrContextMenu-RpxMHQXH.js} +1 -1
  156. package/dist/components/GrContextMenu/chunks/{GrContextMenu-DlFWm0eW.js.map → GrContextMenu-RpxMHQXH.js.map} +1 -1
  157. package/dist/components/GrContextMenu/index.js +1 -1
  158. package/dist/components/GrDataTable/chunks/{GrDataTable-4JAgOQ-7.js → GrDataTable-BYYG_XZA.js} +5 -5
  159. package/dist/components/GrDataTable/chunks/{GrDataTable-4JAgOQ-7.js.map → GrDataTable-BYYG_XZA.js.map} +1 -1
  160. package/dist/components/GrDataTable/index.js +1 -1
  161. package/dist/components/GrDelta/chunks/{GrDelta-BZwkgQW-.js → GrDelta-BpfqebEV.js} +0 -0
  162. package/dist/components/GrDelta/chunks/{GrDelta-BZwkgQW-.js.map → GrDelta-BpfqebEV.js.map} +1 -1
  163. package/dist/components/GrDelta/index.js +1 -1
  164. package/dist/components/GrDescriptionList/chunks/{GrDescriptionList-BMeCgFV3.js → GrDescriptionList-D8ANFpn_.js} +2 -2
  165. package/dist/components/GrDescriptionList/chunks/{GrDescriptionList-BMeCgFV3.js.map → GrDescriptionList-D8ANFpn_.js.map} +1 -1
  166. package/dist/components/GrDescriptionList/index.js +2 -2
  167. package/dist/components/GrDialog/chunks/{GrDialog-CKNbnxwO.js → GrDialog-DDz_OEhk.js} +3 -3
  168. package/dist/components/GrDialog/chunks/{GrDialog-CKNbnxwO.js.map → GrDialog-DDz_OEhk.js.map} +1 -1
  169. package/dist/components/GrDialog/index.js +1 -1
  170. package/dist/components/GrDialogService/chunks/{GrDialogService-Ut8iiBQh.js → GrDialogService-BmXiYmUp.js} +9 -8
  171. package/dist/components/GrDialogService/chunks/{GrDialogService-Ut8iiBQh.js.map → GrDialogService-BmXiYmUp.js.map} +1 -1
  172. package/dist/components/GrDialogService/index.js +1 -1
  173. package/dist/components/GrDivider/chunks/{GrDivider-BXavGcMX.js → GrDivider-DxA-zV25.js} +1 -1
  174. package/dist/components/GrDivider/chunks/{GrDivider-BXavGcMX.js.map → GrDivider-DxA-zV25.js.map} +1 -1
  175. package/dist/components/GrDivider/index.js +1 -1
  176. package/dist/components/GrDrawer/chunks/{GrDrawer-xfoy-MCj.js → GrDrawer-BRMHhvbd.js} +5 -5
  177. package/dist/components/GrDrawer/chunks/{GrDrawer-xfoy-MCj.js.map → GrDrawer-BRMHhvbd.js.map} +1 -1
  178. package/dist/components/GrDrawer/index.js +1 -1
  179. package/dist/components/GrDropdown/chunks/{GrDropdown-7r772-Cq.js → GrDropdown-cLZuZMEY.js} +6 -8
  180. package/dist/components/GrDropdown/chunks/{GrDropdown-7r772-Cq.js.map → GrDropdown-cLZuZMEY.js.map} +1 -1
  181. package/dist/components/GrDropdown/index.js +1 -1
  182. package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-DNurbsWc.js → GrDropdownMenu-Dxkz_ry4.js} +1 -1
  183. package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-DNurbsWc.js.map → GrDropdownMenu-Dxkz_ry4.js.map} +1 -1
  184. package/dist/components/GrDropdownMenu/chunks/GrDropdownMenuList-B33ZzwfB.js.map +1 -1
  185. package/dist/components/GrDropdownMenu/index.js +1 -1
  186. package/dist/components/GrEmptyState/chunks/{GrEmptyState-RqsWvgI9.js → GrEmptyState-BbvwE-E0.js} +2 -2
  187. package/dist/components/GrEmptyState/chunks/{GrEmptyState-RqsWvgI9.js.map → GrEmptyState-BbvwE-E0.js.map} +1 -1
  188. package/dist/components/GrEmptyState/index.js +1 -1
  189. package/dist/components/GrFilePreview/chunks/{GrFilePreview-C9Z7hMK8.js → GrFilePreview-PabkLgYX.js} +1 -1
  190. package/dist/components/GrFilePreview/chunks/{GrFilePreview-C9Z7hMK8.js.map → GrFilePreview-PabkLgYX.js.map} +1 -1
  191. package/dist/components/GrFilePreview/index.js +1 -1
  192. package/dist/components/GrFileUpload/chunks/{GrFileUpload-C0ROpmOY.js → GrFileUpload-BwMR71zN.js} +4 -4
  193. package/dist/components/GrFileUpload/chunks/{GrFileUpload-C0ROpmOY.js.map → GrFileUpload-BwMR71zN.js.map} +1 -1
  194. package/dist/components/GrFileUpload/index.js +1 -1
  195. package/dist/components/GrForm/chunks/{GrForm-CrnfCsgj.js → GrForm-xTtavR-K.js} +1 -1
  196. package/dist/components/GrForm/chunks/{GrForm-CrnfCsgj.js.map → GrForm-xTtavR-K.js.map} +1 -1
  197. package/dist/components/GrForm/index.js +2 -2
  198. package/dist/components/GrFormField/chunks/{GrFormField-DSylU7IU.js → GrFormField-DO61vxpS.js} +2 -2
  199. package/dist/components/GrFormField/chunks/{GrFormField-DSylU7IU.js.map → GrFormField-DO61vxpS.js.map} +1 -1
  200. package/dist/components/GrFormField/index.js +1 -1
  201. package/dist/components/GrFormFile/chunks/{GrFormFile-B1jGZyIj.js → GrFormFile-Dlxx-9zi.js} +3 -3
  202. package/dist/components/GrFormFile/chunks/{GrFormFile-B1jGZyIj.js.map → GrFormFile-Dlxx-9zi.js.map} +1 -1
  203. package/dist/components/GrFormFile/index.js +1 -1
  204. package/dist/components/GrFormSection/chunks/{GrFormSection-ejieOg9H.js → GrFormSection-DV1S6R_N.js} +1 -1
  205. package/dist/components/GrFormSection/chunks/{GrFormSection-ejieOg9H.js.map → GrFormSection-DV1S6R_N.js.map} +1 -1
  206. package/dist/components/GrFormSection/index.js +1 -1
  207. package/dist/components/GrIcon/chunks/{GrIcon-Dmf0c9ba.js → GrIcon-DTZIgmje.js} +1 -1
  208. package/dist/components/GrIcon/chunks/{GrIcon-Dmf0c9ba.js.map → GrIcon-DTZIgmje.js.map} +1 -1
  209. package/dist/components/GrIcon/index.js +1 -1
  210. package/dist/components/GrImageViewer/chunks/{GrImageViewer--BU8yrfx.js → GrImageViewer-CcduIFsa.js} +2 -4
  211. package/dist/components/GrImageViewer/chunks/{GrImageViewer--BU8yrfx.js.map → GrImageViewer-CcduIFsa.js.map} +1 -1
  212. package/dist/components/GrImageViewer/index.js +1 -1
  213. package/dist/components/GrInput/chunks/{GrInput-CJ7eu3fR.js → GrInput-TFeBm3gQ.js} +1 -1
  214. package/dist/components/GrInput/chunks/{GrInput-CJ7eu3fR.js.map → GrInput-TFeBm3gQ.js.map} +1 -1
  215. package/dist/components/GrInput/index.js +1 -1
  216. package/dist/components/GrInputTag/chunks/{GrInputTag-ByD9NugQ.js → GrInputTag-DhfUNOA5.js} +3 -3
  217. package/dist/components/GrInputTag/chunks/{GrInputTag-ByD9NugQ.js.map → GrInputTag-DhfUNOA5.js.map} +1 -1
  218. package/dist/components/GrInputTag/index.js +1 -1
  219. package/dist/components/GrJsonViewer/chunks/{GrJsonViewer-BXG7DdTe.js → GrJsonViewer-CdtmUpZ3.js} +6 -6
  220. package/dist/components/GrJsonViewer/chunks/{GrJsonViewer-BXG7DdTe.js.map → GrJsonViewer-CdtmUpZ3.js.map} +1 -1
  221. package/dist/components/GrJsonViewer/index.js +2 -2
  222. package/dist/components/GrKbd/chunks/{GrKbd-D2ga1H9i.js → GrKbd-D_a1mPLe.js} +1 -1
  223. package/dist/components/GrKbd/chunks/{GrKbd-D2ga1H9i.js.map → GrKbd-D_a1mPLe.js.map} +1 -1
  224. package/dist/components/GrKbd/index.js +1 -1
  225. package/dist/components/GrLink/chunks/{GrLink-DYXw3W9w.js → GrLink-DwWErumU.js} +2 -2
  226. package/dist/components/GrLink/chunks/{GrLink-DYXw3W9w.js.map → GrLink-DwWErumU.js.map} +1 -1
  227. package/dist/components/GrLink/index.js +2 -2
  228. package/dist/components/GrList/chunks/{GrList-B_CRJB4c.js → GrList-Unya-LXb.js} +3 -3
  229. package/dist/components/GrList/chunks/{GrList-B_CRJB4c.js.map → GrList-Unya-LXb.js.map} +1 -1
  230. package/dist/components/GrList/index.js +1 -1
  231. package/dist/components/GrLoading/chunks/{GrLoading-CMD3Ri9P.js → GrLoading-BDrlrup_.js} +1 -1
  232. package/dist/components/GrLoading/chunks/{GrLoading-CMD3Ri9P.js.map → GrLoading-BDrlrup_.js.map} +1 -1
  233. package/dist/components/GrLoading/index.js +1 -1
  234. package/dist/components/GrModal/chunks/{GrModal-DixnhJcu.js → GrModal-Cm0mtSXk.js} +4 -4
  235. package/dist/components/GrModal/chunks/{GrModal-DixnhJcu.js.map → GrModal-Cm0mtSXk.js.map} +1 -1
  236. package/dist/components/GrModal/index.js +1 -1
  237. package/dist/components/GrNavbar/chunks/{GrNavbar-Dr8e5kW-.js → GrNavbar-BRGuksiy.js} +3 -3
  238. package/dist/components/GrNavbar/chunks/{GrNavbar-Dr8e5kW-.js.map → GrNavbar-BRGuksiy.js.map} +1 -1
  239. package/dist/components/GrNavbar/index.js +1 -1
  240. package/dist/components/GrNumberInput/chunks/{GrNumberInput-DQ59YICu.js → GrNumberInput-BqPydXpK.js} +7 -9
  241. package/dist/components/GrNumberInput/chunks/{GrNumberInput-DQ59YICu.js.map → GrNumberInput-BqPydXpK.js.map} +1 -1
  242. package/dist/components/GrNumberInput/index.js +2 -2
  243. package/dist/components/GrPagination/chunks/{GrPagination-68iyAwQz.js → GrPagination-DhbNZHEF.js} +4 -4
  244. package/dist/components/GrPagination/chunks/{GrPagination-68iyAwQz.js.map → GrPagination-DhbNZHEF.js.map} +1 -1
  245. package/dist/components/GrPagination/index.js +1 -1
  246. package/dist/components/GrPopover/chunks/{GrPopover-DEFxDffj.js → GrPopover-CcWvr1ZA.js} +3 -3
  247. package/dist/components/GrPopover/chunks/{GrPopover-DEFxDffj.js.map → GrPopover-CcWvr1ZA.js.map} +1 -1
  248. package/dist/components/GrPopover/index.js +2 -2
  249. package/dist/components/GrProgressBar/chunks/{GrProgressBar-Cd7AaJtR.js → GrProgressBar-C3NRBqIP.js} +2 -2
  250. package/dist/components/GrProgressBar/chunks/{GrProgressBar-Cd7AaJtR.js.map → GrProgressBar-C3NRBqIP.js.map} +1 -1
  251. package/dist/components/GrProgressBar/index.js +1 -1
  252. package/dist/components/GrProgressCircle/chunks/{GrProgressCircle-D3yWXYDa.js → GrProgressCircle-CdvbINQc.js} +2 -2
  253. package/dist/components/GrProgressCircle/chunks/{GrProgressCircle-D3yWXYDa.js.map → GrProgressCircle-CdvbINQc.js.map} +1 -1
  254. package/dist/components/GrProgressCircle/index.js +1 -1
  255. package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-Ckeombia.js → GrPromptDialog-8RxQsOQ_.js} +8 -8
  256. package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-Ckeombia.js.map → GrPromptDialog-8RxQsOQ_.js.map} +1 -1
  257. package/dist/components/GrPromptDialog/index.js +1 -1
  258. package/dist/components/GrRadio/chunks/{GrRadio-Aq3v8XgG.js → GrRadio-B1776V9D.js} +2 -2
  259. package/dist/components/GrRadio/chunks/{GrRadio-Aq3v8XgG.js.map → GrRadio-B1776V9D.js.map} +1 -1
  260. package/dist/components/GrRadio/index.js +2 -2
  261. package/dist/components/GrRadioGroup/chunks/{GrRadioGroup-y9LVdTWh.js → GrRadioGroup-UgitrBFl.js} +2 -2
  262. package/dist/components/GrRadioGroup/chunks/{GrRadioGroup-y9LVdTWh.js.map → GrRadioGroup-UgitrBFl.js.map} +1 -1
  263. package/dist/components/GrRadioGroup/index.js +1 -1
  264. package/dist/components/GrRating/chunks/{GrRating-IEiTOdnF.js → GrRating-DTriyyqG.js} +1 -1
  265. package/dist/components/GrRating/chunks/{GrRating-IEiTOdnF.js.map → GrRating-DTriyyqG.js.map} +1 -1
  266. package/dist/components/GrRating/index.js +1 -1
  267. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-DMeOWlzj.js → GrResponseErrorBanner-NEEJZ8zi.js} +2 -2
  268. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-DMeOWlzj.js.map → GrResponseErrorBanner-NEEJZ8zi.js.map} +1 -1
  269. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-CBVRpgIG.js → GrResponseErrorBanner-ZvBvEQDZ.js} +1 -1
  270. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-CBVRpgIG.js.map → GrResponseErrorBanner-ZvBvEQDZ.js.map} +1 -1
  271. package/dist/components/GrResponseErrorBanner/index.js +2 -2
  272. package/dist/components/GrSegmented/chunks/{GrSegmented-CB-VR-yL.js → GrSegmented-NKTi9bMG.js} +1 -1
  273. package/dist/components/GrSegmented/chunks/{GrSegmented-CB-VR-yL.js.map → GrSegmented-NKTi9bMG.js.map} +1 -1
  274. package/dist/components/GrSegmented/index.js +1 -1
  275. package/dist/components/GrSelect/chunks/{GrSelect-Bm3Jugx8.js → GrSelect-Do1iAyp1.js} +6 -6
  276. package/dist/components/GrSelect/chunks/{GrSelect-Bm3Jugx8.js.map → GrSelect-Do1iAyp1.js.map} +1 -1
  277. package/dist/components/GrSelect/index.js +1 -1
  278. package/dist/components/GrSidebar/chunks/{GrSidebar-alkwBUzL.js → GrSidebar-DoKLlHSw.js} +2 -2
  279. package/dist/components/GrSidebar/chunks/{GrSidebar-alkwBUzL.js.map → GrSidebar-DoKLlHSw.js.map} +1 -1
  280. package/dist/components/GrSidebar/index.js +1 -1
  281. package/dist/components/GrSkeleton/chunks/GrSkeleton-CgfXxPQ2.js.map +1 -1
  282. package/dist/components/GrSlider/chunks/{GrSlider-DM6W6U9c.js → GrSlider-Db-jACXz.js} +6 -4
  283. package/dist/components/GrSlider/chunks/{GrSlider-DM6W6U9c.js.map → GrSlider-Db-jACXz.js.map} +1 -1
  284. package/dist/components/GrSlider/index.js +1 -1
  285. package/dist/components/GrSortableList/chunks/{GrSortableList-HyKX--rO.js → GrSortableList-CQCaWivn.js} +1 -1
  286. package/dist/components/GrSortableList/chunks/{GrSortableList-HyKX--rO.js.map → GrSortableList-CQCaWivn.js.map} +1 -1
  287. package/dist/components/GrSortableList/index.js +1 -1
  288. package/dist/components/GrSplitter/chunks/{GrSplitter-MltjaADn.js → GrSplitter-C-XQzq7q.js} +1 -1
  289. package/dist/components/GrSplitter/chunks/{GrSplitter-MltjaADn.js.map → GrSplitter-C-XQzq7q.js.map} +1 -1
  290. package/dist/components/GrSplitter/index.js +1 -1
  291. package/dist/components/GrStatistic/chunks/{GrStatistic-BoLkXw7F.js → GrStatistic-C1_nY4Gc.js} +2 -2
  292. package/dist/components/GrStatistic/chunks/{GrStatistic-BoLkXw7F.js.map → GrStatistic-C1_nY4Gc.js.map} +1 -1
  293. package/dist/components/GrStatistic/index.js +1 -1
  294. package/dist/components/GrSteps/chunks/{GrSteps-CpGHXLOc.js → GrSteps-DXj7m-WO.js} +2 -2
  295. package/dist/components/GrSteps/chunks/{GrSteps-CpGHXLOc.js.map → GrSteps-DXj7m-WO.js.map} +1 -1
  296. package/dist/components/GrSteps/index.js +1 -1
  297. package/dist/components/GrSwitch/chunks/{GrSwitch-7Oe5QfQZ.js → GrSwitch-CriHWT2A.js} +1 -1
  298. package/dist/components/GrSwitch/chunks/{GrSwitch-7Oe5QfQZ.js.map → GrSwitch-CriHWT2A.js.map} +1 -1
  299. package/dist/components/GrSwitch/index.js +1 -1
  300. package/dist/components/GrTabPanels/chunks/{GrTabPanels-BZQS8-JM.js → GrTabPanels-5zsbqS1v.js} +1 -1
  301. package/dist/components/GrTabPanels/chunks/{GrTabPanels-BZQS8-JM.js.map → GrTabPanels-5zsbqS1v.js.map} +1 -1
  302. package/dist/components/GrTabPanels/index.js +1 -1
  303. package/dist/components/GrTable/chunks/{GrTable-jhUTczjv.js → GrTable-iwzHvlMC.js} +1 -1
  304. package/dist/components/GrTable/chunks/{GrTable-jhUTczjv.js.map → GrTable-iwzHvlMC.js.map} +1 -1
  305. package/dist/components/GrTable/index.js +1 -1
  306. package/dist/components/GrTabs/chunks/{GrTabs-CT2nk_HV.js → GrTabs-DHfv67cp.js} +1 -1
  307. package/dist/components/GrTabs/chunks/{GrTabs-CT2nk_HV.js.map → GrTabs-DHfv67cp.js.map} +1 -1
  308. package/dist/components/GrTabs/index.js +1 -1
  309. package/dist/components/GrTextarea/chunks/{GrTextarea-DinXG12-.js → GrTextarea-BII3w61K.js} +1 -1
  310. package/dist/components/GrTextarea/chunks/{GrTextarea-DinXG12-.js.map → GrTextarea-BII3w61K.js.map} +1 -1
  311. package/dist/components/GrTextarea/index.js +1 -1
  312. package/dist/components/GrTimeline/chunks/{GrTimeline-BiHpArsg.js → GrTimeline-Bs60huw0.js} +2 -2
  313. package/dist/components/GrTimeline/chunks/{GrTimeline-BiHpArsg.js.map → GrTimeline-Bs60huw0.js.map} +1 -1
  314. package/dist/components/GrTimeline/index.js +1 -1
  315. package/dist/components/GrToaster/chunks/{GrToaster-COXIBKzq.js → GrToaster-D-sV-9of.js} +4 -4
  316. package/dist/components/GrToaster/chunks/{GrToaster-COXIBKzq.js.map → GrToaster-D-sV-9of.js.map} +1 -1
  317. package/dist/components/GrToaster/index.js +1 -1
  318. package/dist/components/GrTooltip/chunks/{GrTooltip-uYETdbCD.js → GrTooltip-BUiTbROv.js} +3 -3
  319. package/dist/components/GrTooltip/chunks/{GrTooltip-uYETdbCD.js.map → GrTooltip-BUiTbROv.js.map} +1 -1
  320. package/dist/components/GrTooltip/index.js +1 -1
  321. package/dist/components/GrTree/chunks/{GrTree-Ci6CZfKR.js → GrTree-CkELQwR8.js} +1 -2
  322. package/dist/components/GrTree/chunks/{GrTree-Ci6CZfKR.js.map → GrTree-CkELQwR8.js.map} +1 -1
  323. package/dist/components/GrTree/index.js +1 -1
  324. package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-MGsyvkJV.js → GrTreeSelect-DurwZ7Cz.js} +4 -4
  325. package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-MGsyvkJV.js.map → GrTreeSelect-DurwZ7Cz.js.map} +1 -1
  326. package/dist/components/GrTreeSelect/index.js +1 -1
  327. package/dist/components/GrValue/chunks/GrValue-ezkQM05Q.js.map +1 -1
  328. package/dist/composables/useFloating.js +1 -1
  329. package/dist/composables/useGrComponentConfig.js +1 -1
  330. package/dist/composables/useOverlayLayer.js +35 -6
  331. package/dist/composables/useOverlayLayer.js.map +1 -1
  332. package/dist/composables/usePortalTarget.js +1 -1
  333. package/dist/composables/useTheme.js +1 -1
  334. package/dist/composables/useTheme.js.map +1 -1
  335. package/dist/composables/useToast.js +1 -1
  336. package/dist/composables/useToast.js.map +1 -1
  337. package/dist/composables/useVirtualList.js +26 -6
  338. package/dist/composables/useVirtualList.js.map +1 -1
  339. package/dist/directives/loading.js +1 -1
  340. package/dist/granular-provider-node.js +1 -1
  341. package/dist/granular-provider.js +1 -1
  342. package/dist/index.js +86 -86
  343. package/dist/testing.js +1 -1
  344. package/dist/testing.js.map +1 -1
  345. package/dist/types/components/GrDialog/GrDialog.vue.d.ts +1 -1
  346. package/dist/types/components/GrDrawer/GrDrawer.vue.d.ts +1 -1
  347. package/dist/types/components/GrModal/GrModal.vue.d.ts +1 -1
  348. package/dist/types/composables/internal/overlayStack.d.ts +11 -0
  349. package/dist/types/internal/devHook.d.ts +119 -0
  350. package/dist/vue/index.js +2 -2
  351. package/dist/vue/index.js.map +1 -1
  352. package/dist/web-types.json +1 -1
  353. package/package.json +16 -16
  354. package/dist/chunks/config-CQLNjc9X2.js.map +0 -1
  355. package/dist/chunks/config-CnYdE3HZ2.js.map +0 -1
  356. package/dist/chunks/config-CuQmUkMw2.js.map +0 -1
  357. package/dist/chunks/config-DBmdgoVf2.js.map +0 -1
  358. package/dist/chunks/config-DVCNvhIG2.js.map +0 -1
  359. package/dist/chunks/config-DpAYidyY2.js.map +0 -1
  360. package/dist/chunks/config-MmPym-Z72.js.map +0 -1
  361. package/dist/chunks/overlayStack-0CZS99Da.js.map +0 -1
  362. /package/dist/chunks/{config-CQLNjc9X2.js → config-CQLNjc9X.js} +0 -0
  363. /package/dist/chunks/{config-CnYdE3HZ2.js → config-CnYdE3HZ.js} +0 -0
  364. /package/dist/chunks/{config-DBmdgoVf2.js → config-DBmdgoVf.js} +0 -0
  365. /package/dist/chunks/{config-DVCNvhIG2.js → config-DVCNvhIG.js} +0 -0
  366. /package/dist/chunks/{config-DpAYidyY2.js → config-DpAYidyY.js} +0 -0
  367. /package/dist/chunks/{config-MmPym-Z72.js → config-MmPym-Z7.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"config-DolULhjJ.js","names":[],"sources":["../../src/components/GrCodeBlock/grCodeBlockStyles.ts","../../src/components/GrCodeBlock/safelist.ts","../../src/components/GrCodeBlock/config.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nimport type { GrCodeTokenKind } from './tokenizeJson'\n\n/**\n * Классы `GrCodeBlock`.\n *\n * Роли подсветки перечислены целиком, по литералу на ветку: UnoCSS сканирует\n * исходный текст файла, и собранное шаблонной строкой имя уехало бы в CSS как\n * литерал.\n */\n\n/**\n * Зацепка собственного CSS компонента (номера строк). Не утилита: CSS она не\n * порождает, поэтому в `safelist` не идёт — там гейт справедливо считает такую\n * запись мёртвой.\n */\nexport const codeBlockHookClass = 'gr-code-block'\n\n/** Включает колонку номеров. Тоже зацепка, не утилита. */\nexport const codeBlockNumberedClass = 'gr-code-block--numbered'\n\n/**\n * Поверхность держит корень, а не `<pre>`: кнопка копирования стоит рядом со\n * скроллером, и жёлоб под неё обязан быть частью блока, а не полем страницы.\n */\nexport const codeBlockRootClass = 'relative rounded-[var(--gr-radius-md)] bg-[var(--gr-code-block-bg,var(--gr-muted))] text-[var(--gr-code-block-fg,var(--gr-fg))]'\n\n/**\n * Полоса под кнопку: 28 px самой кнопки плюс отбивка `right-1`.\n *\n * Кнопка не может висеть поверх `<pre>`: полосу прокрутки браузер рисует у\n * правого края скроллера, в тех же 8–15 px, и накрытую кнопкой её не ухватить\n * мышью. Отступами это не лечится — их пришлось бы взять больше ширины самой\n * кнопки, и «угол» перестал бы быть углом. Витринный `doc/CodeBlock.vue` решает\n * то же самое шапкой; у пакетного блока шапки нет, поэтому место отдаётся\n * жёлобом.\n */\nexport const codeBlockGutterClass = 'pr-9'\n\n/** Браузерный отступ `<pre>`: фон и радиус живут на корне, полю здесь не место. */\nexport const codeBlockSurfaceClass = 'm-0'\n\n/** Скроллер обязан показывать фокус: он стоит в таб-порядке. */\nexport const codeBlockScrollClass = 'overflow-auto focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]'\n\nexport const codeBlockWrapClass = 'whitespace-pre-wrap break-words'\nexport const codeBlockNowrapClass = 'whitespace-pre'\n\n/** Кнопка копирования: правый верхний угол, внутри жёлоба. */\nexport const codeBlockCopyClass = 'absolute right-1 top-1 z-[1]'\n\nexport const codeBlockPaddings: Record<GrComponentSize, string> = {\n xs: 'p-2',\n sm: 'p-2.5',\n md: 'p-3',\n lg: 'p-4',\n}\n\nexport const codeBlockTextSizes: Record<GrComponentSize, string> = {\n xs: 'text-[length:var(--gr-control-text-3xs)] leading-[var(--gr-control-leading-3xs)]',\n sm: 'text-[length:var(--gr-control-text-2xs)] leading-[var(--gr-control-leading-2xs)]',\n md: 'text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]',\n lg: 'text-[length:var(--gr-control-text-sm)] leading-[var(--gr-control-leading-sm)]',\n}\n\n/**\n * Роли подсветки. Дефолты — ссылки на `-text`-роли темы: они переключаются\n * вместе с ней, поэтому подсветка работает в обеих без своего theme-слоя.\n *\n * Число взято от `azure`, а не от `info`: `info` — синий в двух шагах от индиго\n * `primary`, и пара «ключ ↔ число» давала ΔE 9.4 в светлой теме и 7.8 в тёмной.\n * В `{\"count\": 42}` эти два цвета стоят через двоеточие и читались бы как один.\n * С `azure` расстояние 53.8 и 16.6. Гейт — `grCodeBlockContrast.test.ts`.\n */\nexport const codeTokenClass: Record<GrCodeTokenKind, string> = {\n key: 'text-[var(--gr-code-block-key,var(--gr-primary-text))]',\n string: 'text-[var(--gr-code-block-string,var(--gr-success-text))]',\n number: 'text-[var(--gr-code-block-number,var(--gr-azure-text))]',\n literal: 'text-[var(--gr-code-block-literal,var(--gr-warning-text))]',\n punctuation: 'text-[var(--gr-code-block-fg,var(--gr-fg))]',\n plain: '',\n}\n","import { splitClassTokens } from '../shared/classTokens'\n\nimport {\n codeBlockCopyClass,\n codeBlockGutterClass,\n codeBlockNowrapClass,\n codeBlockPaddings,\n codeBlockRootClass,\n codeBlockScrollClass,\n codeBlockSurfaceClass,\n codeBlockTextSizes,\n codeBlockWrapClass,\n codeTokenClass,\n} from './grCodeBlockStyles'\n\n// Классы из вычисляемых мап (роль токена, размер) UnoCSS сканом не находит —\n// только safelist. Литералы хелпера туда же: на сборке он уезжает в общий чанк.\n//\n// `codeBlockHookClass` и `codeBlockNumberedClass` сюда НЕ идут: это селекторы\n// собственного `<style>` компонента, CSS из них не порождается, и гейт\n// `documentedConfig` справедливо считал бы такую запись мёртвой.\nexport const grCodeBlockSafelist = [...new Set([\n ...splitClassTokens(codeBlockRootClass),\n ...splitClassTokens(codeBlockSurfaceClass),\n ...splitClassTokens(codeBlockScrollClass),\n ...splitClassTokens(codeBlockWrapClass),\n ...splitClassTokens(codeBlockNowrapClass),\n ...splitClassTokens(codeBlockCopyClass),\n ...splitClassTokens(codeBlockGutterClass),\n ...Object.values(codeBlockPaddings).flatMap(splitClassTokens),\n ...Object.values(codeBlockTextSizes).flatMap(splitClassTokens),\n ...Object.values(codeTokenClass).flatMap(splitClassTokens),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grCodeBlockSafelist } from './safelist'\n\nexport const grCodeBlockConfig = defineGranularComponent(import.meta.url, {\n name: 'GrCodeBlock',\n dependencies: ['GrButton'],\n safelist: grCodeBlockSafelist,\n})\n"],"mappings":";;;;;;;;;;;;;;;AAiBA,IAAa,qBAAqB;;AAGlC,IAAa,yBAAyB;;;;;AAMtC,IAAa,qBAAqB;;;;;;;;;;;AAYlC,IAAa,uBAAuB;;AAMpC,IAAa,uBAAuB;AAEpC,IAAa,qBAAqB;AAClC,IAAa,uBAAuB;;AAGpC,IAAa,qBAAqB;AAElC,IAAa,oBAAqD;CAChE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,qBAAsD;CACjE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;;;;;;AAWA,IAAa,iBAAkD;CAC7D,KAAK;CACL,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,aAAa;CACb,OAAO;AACT;;;AC7DA,IAAa,sBAAsB,CAAC,mBAAG,IAAI,IAAI;CAC7C,GAAG,iBAAiB,kBAAkB;CACtC,GAAG,iBAAA,KAAsC;CACzC,GAAG,iBAAiB,oBAAoB;CACxC,GAAG,iBAAiB,kBAAkB;CACtC,GAAG,iBAAiB,oBAAoB;CACxC,GAAG,iBAAiB,kBAAkB;CACtC,GAAG,iBAAiB,oBAAoB;CACxC,GAAG,OAAO,OAAO,iBAAiB,CAAC,CAAC,QAAQ,gBAAgB;CAC5D,GAAG,OAAO,OAAO,kBAAkB,CAAC,CAAC,QAAQ,gBAAgB;CAC7D,GAAG,OAAO,OAAO,cAAc,CAAC,CAAC,QAAQ,gBAAgB;AAC3D,CAAC,CAAC;;;AC5BF,IAAa,oBAAoB,wBAAwB,OAAO,KAAK,KAAK;CACxE,MAAM;CACN,cAAc,CAAC,UAAU;CACzB,UAAU;AACZ,CAAC"}
1
+ {"version":3,"file":"config-DolULhjJ.js","names":[],"sources":["../../src/components/GrCodeBlock/grCodeBlockStyles.ts","../../src/components/GrCodeBlock/safelist.ts","../../src/components/GrCodeBlock/config.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nimport type { GrCodeTokenKind } from './tokenizeJson'\n\n/**\n * Классы `GrCodeBlock`.\n *\n * Роли подсветки перечислены целиком, по литералу на ветку: UnoCSS сканирует\n * исходный текст файла, и собранное шаблонной строкой имя уехало бы в CSS как\n * литерал.\n */\n\n/**\n * Зацепка собственного CSS компонента (номера строк). Не утилита: CSS она не\n * порождает, поэтому в `safelist` не идёт — там гейт справедливо считает такую\n * запись мёртвой.\n */\nexport const codeBlockHookClass = 'gr-code-block'\n\n/** Включает колонку номеров. Тоже зацепка, не утилита. */\nexport const codeBlockNumberedClass = 'gr-code-block--numbered'\n\n/**\n * Поверхность держит корень, а не `<pre>`: кнопка копирования стоит рядом со\n * скроллером, и жёлоб под неё обязан быть частью блока, а не полем страницы.\n */\nexport const codeBlockRootClass = 'relative rounded-[var(--gr-radius-md)] bg-[var(--gr-code-block-bg,var(--gr-muted))] text-[var(--gr-code-block-fg,var(--gr-fg))]'\n\n/**\n * Полоса под кнопку: 28 px самой кнопки плюс отбивка `right-1`.\n *\n * Кнопка не может висеть поверх `<pre>`: полосу прокрутки браузер рисует у\n * правого края скроллера, в тех же 8–15 px, и накрытую кнопкой её не ухватить\n * мышью. Отступами это не лечится — их пришлось бы взять больше ширины самой\n * кнопки, и «угол» перестал бы быть углом. Витринный `doc/CodeBlock.vue` решает\n * то же самое шапкой; у пакетного блока шапки нет, поэтому место отдаётся\n * жёлобом.\n */\nexport const codeBlockGutterClass = 'pr-9'\n\n/** Браузерный отступ `<pre>`: фон и радиус живут на корне, полю здесь не место. */\nexport const codeBlockSurfaceClass = 'm-0'\n\n/** Скроллер обязан показывать фокус: он стоит в таб-порядке. */\nexport const codeBlockScrollClass = 'overflow-auto focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]'\n\nexport const codeBlockWrapClass = 'whitespace-pre-wrap break-words'\nexport const codeBlockNowrapClass = 'whitespace-pre'\n\n/** Кнопка копирования: правый верхний угол, внутри жёлоба. */\nexport const codeBlockCopyClass = 'absolute right-1 top-1 z-[1]'\n\nexport const codeBlockPaddings: Record<GrComponentSize, string> = {\n xs: 'p-2',\n sm: 'p-2.5',\n md: 'p-3',\n lg: 'p-4',\n}\n\nexport const codeBlockTextSizes: Record<GrComponentSize, string> = {\n xs: 'text-[length:var(--gr-control-text-3xs)] leading-[var(--gr-control-leading-3xs)]',\n sm: 'text-[length:var(--gr-control-text-2xs)] leading-[var(--gr-control-leading-2xs)]',\n md: 'text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]',\n lg: 'text-[length:var(--gr-control-text-sm)] leading-[var(--gr-control-leading-sm)]',\n}\n\n/**\n * Роли подсветки. Дефолты — ссылки на `-text`-роли темы: они переключаются\n * вместе с ней, поэтому подсветка работает в обеих без своего theme-слоя.\n *\n * Число взято от `azure`, а не от `info`: `info` — синий в двух шагах от индиго\n * `primary`, и пара «ключ ↔ число» давала ΔE 9.4 в светлой теме и 7.8 в тёмной.\n * В `{\"count\": 42}` эти два цвета стоят через двоеточие и читались бы как один.\n * С `azure` расстояние 53.8 и 16.6. Гейт — `grCodeBlockContrast.test.ts`.\n */\nexport const codeTokenClass: Record<GrCodeTokenKind, string> = {\n key: 'text-[var(--gr-code-block-key,var(--gr-primary-text))]',\n string: 'text-[var(--gr-code-block-string,var(--gr-success-text))]',\n number: 'text-[var(--gr-code-block-number,var(--gr-azure-text))]',\n literal: 'text-[var(--gr-code-block-literal,var(--gr-warning-text))]',\n punctuation: 'text-[var(--gr-code-block-fg,var(--gr-fg))]',\n plain: '',\n}\n","import { splitClassTokens } from '../shared/classTokens'\n\nimport {\n codeBlockCopyClass,\n codeBlockGutterClass,\n codeBlockNowrapClass,\n codeBlockPaddings,\n codeBlockRootClass,\n codeBlockScrollClass,\n codeBlockSurfaceClass,\n codeBlockTextSizes,\n codeBlockWrapClass,\n codeTokenClass,\n} from './grCodeBlockStyles'\n\n// Классы из вычисляемых мап (роль токена, размер) UnoCSS сканом не находит —\n// только safelist. Литералы хелпера туда же: на сборке он уезжает в общий чанк.\n//\n// `codeBlockHookClass` и `codeBlockNumberedClass` сюда НЕ идут: это селекторы\n// собственного `<style>` компонента, CSS из них не порождается, и гейт\n// `documentedConfig` справедливо считал бы такую запись мёртвой.\nexport const grCodeBlockSafelist = [...new Set([\n ...splitClassTokens(codeBlockRootClass),\n ...splitClassTokens(codeBlockSurfaceClass),\n ...splitClassTokens(codeBlockScrollClass),\n ...splitClassTokens(codeBlockWrapClass),\n ...splitClassTokens(codeBlockNowrapClass),\n ...splitClassTokens(codeBlockCopyClass),\n ...splitClassTokens(codeBlockGutterClass),\n ...Object.values(codeBlockPaddings).flatMap(splitClassTokens),\n ...Object.values(codeBlockTextSizes).flatMap(splitClassTokens),\n ...Object.values(codeTokenClass).flatMap(splitClassTokens),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grCodeBlockSafelist } from './safelist'\n\nexport const grCodeBlockConfig = defineGranularComponent(import.meta.url, {\n name: 'GrCodeBlock',\n dependencies: ['GrButton'],\n safelist: grCodeBlockSafelist,\n})\n"],"mappings":";;;;;;;;;;;;;;;AAiBA,IAAa,qBAAqB;;AAGlC,IAAa,yBAAyB;;;;;AAMtC,IAAa,qBAAqB;;;;;;;;;;;AAYlC,IAAa,uBAAuB;;AAMpC,IAAa,uBAAuB;AAEpC,IAAa,qBAAqB;AAClC,IAAa,uBAAuB;;AAGpC,IAAa,qBAAqB;AAElC,IAAa,oBAAqD;CAChE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,qBAAsD;CACjE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;;;;;;AAWA,IAAa,iBAAkD;CAC7D,KAAK;CACL,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,aAAa;CACb,OAAO;AACT;;;AC7DA,IAAa,sBAAsB,CAAC,mBAAG,IAAI,IAAI;CAC7C,GAAG,iBAAiB,kBAAkB;CACtC,GAAG,iBAAA,KAAsC;CACzC,GAAG,iBAAiB,oBAAoB;CACxC,GAAG,iBAAiB,kBAAkB;CACtC,GAAG,iBAAiB,oBAAoB;CACxC,GAAG,iBAAiB,kBAAkB;CACtC,GAAG,iBAAiB,oBAAoB;CACxC,GAAG,OAAO,OAAO,iBAAiB,CAAC,CAAC,QAAQ,gBAAgB;CAC5D,GAAG,OAAO,OAAO,kBAAkB,CAAC,CAAC,QAAQ,gBAAgB;CAC7D,GAAG,OAAO,OAAO,cAAc,CAAC,CAAC,QAAQ,gBAAgB;AAC3D,CAAC,CAAC;;;AC5BF,IAAa,oBAAoB,wBAAwB,YAAY,KAAK;CACxE,MAAM;CACN,cAAc,CAAC,UAAU;CACzB,UAAU;AACZ,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-DpAYidyY.js","names":[],"sources":["../../src/components/GrJsonViewer/grJsonViewerStyles.ts","../../src/components/GrJsonViewer/safelist.ts","../../src/components/GrJsonViewer/config.ts"],"sourcesContent":["import type { GrJsonNodeKind } from './jsonToNodes'\n\n/**\n * Классы `GrJsonViewer`.\n *\n * Роли перечислены целиком, по литералу на ветку: UnoCSS сканирует исходный\n * текст файла, и собранное шаблонной строкой имя уехало бы в CSS литералом.\n */\n\n/**\n * `min-w-0` и клип — не украшение: глубокая ветка шире контейнера, и без них\n * панель растягивает раскладку страницы, вместо того чтобы прокручиваться\n * внутри себя. Горизонтальный скролл остаётся у самого дерева.\n */\nexport const jsonViewerRootClass = 'min-w-0 overflow-hidden rounded-[var(--gr-radius-md)] bg-[var(--gr-json-viewer-bg,var(--gr-muted))] text-[var(--gr-fg)]'\n\n/** Шапка с поиском и кнопками свёртки. Отбивается от дерева, а не от края. */\nexport const jsonViewerToolbarClass = 'flex items-center gap-2 border-b border-[var(--gr-brd)] p-2'\n\nexport const jsonViewerSearchClass = 'min-w-0 flex-1'\n\n/** Строка узла моноширинная: значения выравниваются по разрядам, как в блоке кода. */\nexport const jsonViewerRowClass = 'relative flex min-w-0 items-center gap-1 font-[var(--gr-font-mono)]'\n\n/** Область узла не даёт значению растянуть строку шире панели. */\nexport const jsonViewerContentClass = 'min-w-0'\n\nexport const jsonViewerKeyClass = 'shrink-0 text-[var(--gr-json-viewer-key,var(--gr-primary-text))]'\n\nexport const jsonViewerPunctuationClass = 'shrink-0 text-[var(--gr-json-viewer-punctuation,var(--gr-fg))]'\n\n/**\n * Значение обрезается по ширине строки, а не переносится: перенос превратил бы\n * дерево в простыню и сломал бы оценку высоты строки у виртуализации.\n */\nexport const jsonViewerValueClass = 'min-w-0 truncate'\n\n/** Счётчик у свёрнутой ветки и служебные подписи — тише значения. */\nexport const jsonViewerMutedClass = 'shrink-0 text-[var(--gr-json-viewer-muted,var(--gr-muted-fg))]'\n\n/**\n * Кнопка копирования узла: появляется по наведению и по фокусу внутри строки.\n *\n * Стоит в потоке сразу за значением, а не прижата к правому краю строки:\n * прижать её не к чему — область узла у `GrTree` сжата по содержимому\n * (`flex: 0 1 auto`) собственным scoped-правилом, а утилитой снаружи оно не\n * перебивается: оба класса равной специфичности, и победителя выбирает порядок\n * правил в CSS. Цена потока — 4 px высоты строки, и она дешевле этой лотереи.\n */\nexport const jsonViewerCopyClass = 'ml-2 shrink-0 opacity-0 focus-visible:opacity-100 group-hover:opacity-100'\n\n/**\n * Зацепка варианта `group-hover` у кнопки копирования. В safelist не идёт: CSS\n * из неё не порождается — правило пишет сам вариант, а гейт справедливо считал\n * бы такую запись мёртвой.\n */\nexport const jsonViewerGroupClass = 'group'\n\n/**\n * Цвет значения по виду.\n *\n * Дефолты — ссылки на `-text`-роли темы, те же, что у `GrCodeBlock`: роли\n * переключаются вместе с темой, поэтому подсветка работает в обеих без своего\n * theme-слоя, а два компонента остаются согласованными через роль, а не через\n * общую константу — импорт чужой мапы притащил бы потребителю весь CSS донора.\n *\n * Число взято от `azure`, а не от `info`: `info` — синий в двух шагах от индиго\n * `primary`, и пара «ключ ↔ число» стояла бы в одной строке неразличимой.\n */\nexport const jsonValueClass: Record<GrJsonNodeKind, string> = {\n string: 'text-[var(--gr-json-viewer-string,var(--gr-success-text))]',\n number: 'text-[var(--gr-json-viewer-number,var(--gr-azure-text))]',\n boolean: 'text-[var(--gr-json-viewer-literal,var(--gr-warning-text))]',\n null: 'text-[var(--gr-json-viewer-literal,var(--gr-warning-text))]',\n object: 'text-[var(--gr-json-viewer-muted,var(--gr-muted-fg))]',\n array: 'text-[var(--gr-json-viewer-muted,var(--gr-muted-fg))]',\n unsupported: 'text-[var(--gr-json-viewer-muted,var(--gr-muted-fg))]',\n truncation: 'text-[var(--gr-json-viewer-muted,var(--gr-muted-fg))]',\n}\n","import { splitClassTokens } from '../shared/classTokens'\n\nimport {\n jsonValueClass,\n jsonViewerContentClass,\n jsonViewerCopyClass,\n jsonViewerKeyClass,\n jsonViewerMutedClass,\n jsonViewerPunctuationClass,\n jsonViewerRootClass,\n jsonViewerRowClass,\n jsonViewerSearchClass,\n jsonViewerToolbarClass,\n jsonViewerValueClass,\n} from './grJsonViewerStyles'\n\n// Классы из вычисляемой мапы (цвет по виду значения) UnoCSS сканом не находит —\n// только safelist. Литералы хелпера туда же: на сборке он уезжает в общий чанк,\n// который скан не видит.\nexport const grJsonViewerSafelist = [...new Set([\n ...splitClassTokens(jsonViewerRootClass),\n ...splitClassTokens(jsonViewerToolbarClass),\n ...splitClassTokens(jsonViewerSearchClass),\n ...splitClassTokens(jsonViewerRowClass),\n ...splitClassTokens(jsonViewerContentClass),\n ...splitClassTokens(jsonViewerKeyClass),\n ...splitClassTokens(jsonViewerPunctuationClass),\n ...splitClassTokens(jsonViewerValueClass),\n ...splitClassTokens(jsonViewerMutedClass),\n ...splitClassTokens(jsonViewerCopyClass),\n ...Object.values(jsonValueClass).flatMap(splitClassTokens),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grJsonViewerSafelist } from './safelist'\n\nexport const grJsonViewerConfig = defineGranularComponent(import.meta.url, {\n name: 'GrJsonViewer',\n dependencies: ['GrTree', 'GrInput', 'GrButton'],\n safelist: grJsonViewerSafelist,\n})\n"],"mappings":";;;;;;;;;;;;;;AAcA,IAAa,sBAAsB;;AAGnC,IAAa,yBAAyB;AAEtC,IAAa,wBAAwB;;AAGrC,IAAa,qBAAqB;;AAGlC,IAAa,yBAAyB;AAEtC,IAAa,qBAAqB;AAElC,IAAa,6BAA6B;;;;;AAM1C,IAAa,uBAAuB;;AAGpC,IAAa,uBAAuB;;;;;;;;;;AAWpC,IAAa,sBAAsB;;;;;;AAOnC,IAAa,uBAAuB;;;;;;;;;;;;AAapC,IAAa,iBAAiD;CAC5D,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,MAAM;CACN,QAAQ;CACR,OAAO;CACP,aAAa;CACb,YAAY;AACd;;;AC3DA,IAAa,uBAAuB,CAAC,mBAAG,IAAI,IAAI;CAC9C,GAAG,iBAAiB,mBAAmB;CACvC,GAAG,iBAAiB,sBAAsB;CAC1C,GAAG,iBAAiB,qBAAqB;CACzC,GAAG,iBAAiB,kBAAkB;CACtC,GAAG,iBAAiB,sBAAsB;CAC1C,GAAG,iBAAiB,kBAAkB;CACtC,GAAG,iBAAiB,0BAA0B;CAC9C,GAAG,iBAAiB,oBAAoB;CACxC,GAAG,iBAAiB,oBAAoB;CACxC,GAAG,iBAAiB,mBAAmB;CACvC,GAAG,OAAO,OAAO,cAAc,CAAC,CAAC,QAAQ,gBAAgB;AAC3D,CAAC,CAAC;;;AC3BF,IAAa,qBAAqB,wBAAwB,YAAY,KAAK;CACzE,MAAM;CACN,cAAc;EAAC;EAAU;EAAW;CAAU;CAC9C,UAAU;AACZ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"config-Droqn55j.js","names":[],"sources":["../../src/components/GrForm/config.ts"],"sourcesContent":["import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nexport const grFormConfig = defineGranularComponent(import.meta.url, {\n name: 'GrForm',\n dependencies: ['GrFormField'],\n})\n"],"mappings":";;AAEA,IAAa,eAAe,wBAAwB,OAAO,KAAK,KAAK;CACnE,MAAM;CACN,cAAc,CAAC,aAAa;AAC9B,CAAC"}
1
+ {"version":3,"file":"config-Droqn55j.js","names":[],"sources":["../../src/components/GrForm/config.ts"],"sourcesContent":["import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nexport const grFormConfig = defineGranularComponent(import.meta.url, {\n name: 'GrForm',\n dependencies: ['GrFormField'],\n})\n"],"mappings":";;AAEA,IAAa,eAAe,wBAAwB,YAAY,KAAK;CACnE,MAAM;CACN,cAAc,CAAC,aAAa;AAC9B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"config-DwABJHEo.js","names":[],"sources":["../../src/components/GrBadgeWrap/grBadgeWrapStyles.ts","../../src/components/GrBadgeWrap/safelist.ts","../../src/components/GrBadgeWrap/config.ts"],"sourcesContent":["import type { GrTone } from '../shared/tones'\n\nexport type GrBadgeWrapTone = GrTone\n\n/** Угол, в котором висит бейдж. */\nexport const GR_BADGE_WRAP_PLACEMENTS = ['top-right', 'top-left', 'bottom-right', 'bottom-left'] as const\nexport type GrBadgeWrapPlacement = typeof GR_BADGE_WRAP_PLACEMENTS[number]\n\nexport const rootClass = 'relative inline-flex'\n\n/**\n * Смещение бейджа — точки кастомизации: подвинуть его можно темой или инлайном,\n * не переопределяя классы снаружи. Дефолты повторяют прежние `-top-2 -right-2`.\n */\nexport const placementClass: Record<GrBadgeWrapPlacement, string> = {\n 'top-right': 'top-[var(--gr-badge-wrap-offset-y,-0.5rem)] right-[var(--gr-badge-wrap-offset-x,-0.5rem)]',\n 'top-left': 'top-[var(--gr-badge-wrap-offset-y,-0.5rem)] left-[var(--gr-badge-wrap-offset-x,-0.5rem)]',\n 'bottom-right': 'bottom-[var(--gr-badge-wrap-offset-y,-0.5rem)] right-[var(--gr-badge-wrap-offset-x,-0.5rem)]',\n 'bottom-left': 'bottom-[var(--gr-badge-wrap-offset-y,-0.5rem)] left-[var(--gr-badge-wrap-offset-x,-0.5rem)]',\n}\n\n/** У точки смещение меньше: она вдвое мельче счётчика. */\nexport const dotPlacementClass: Record<GrBadgeWrapPlacement, string> = {\n 'top-right': 'top-[var(--gr-badge-wrap-offset-y,-0.25rem)] right-[var(--gr-badge-wrap-offset-x,-0.25rem)]',\n 'top-left': 'top-[var(--gr-badge-wrap-offset-y,-0.25rem)] left-[var(--gr-badge-wrap-offset-x,-0.25rem)]',\n 'bottom-right': 'bottom-[var(--gr-badge-wrap-offset-y,-0.25rem)] right-[var(--gr-badge-wrap-offset-x,-0.25rem)]',\n 'bottom-left': 'bottom-[var(--gr-badge-wrap-offset-y,-0.25rem)] left-[var(--gr-badge-wrap-offset-x,-0.25rem)]',\n}\n\nexport const dotBaseClass = 'absolute h-2 w-2 rounded-[var(--gr-radius-full)]'\n\nexport const countBaseClass = 'absolute min-w-5 h-5 px-1 rounded-[var(--gr-radius-full)] text-[length:var(--gr-text-2xs)] leading-[var(--gr-leading-2xs)] font-700 inline-flex items-center justify-center'\n\n/**\n * Заливка — насыщенная роль тона, текст из `-fg`, а не из белого литерала: тот не\n * переживает смену темы.\n *\n * Вес намеренно не такой, как у filled-`GrBadge` (тот в светлой теме уехал на\n * `-solid`): точка и счётчик лежат **поверх чужого элемента**, и порог у них свой\n * — 3:1 к фону страницы, чтобы метку было видно на аватаре и на иконке. Заливка\n * кнопочного веса читалась бы там как вторая кнопка.\n *\n * Карта своя, а не импорт из `GrBadge`: чужая карта означала бы зависимость от\n * компонента и его CSS ради двух классов.\n */\nexport const toneClass: Record<GrBadgeWrapTone, string> = {\n neutral: 'bg-[var(--gr-fg)] text-[var(--gr-bg)]',\n primary: 'bg-[var(--gr-primary)] text-[var(--gr-primary-fg)]',\n success: 'bg-[var(--gr-success)] text-[var(--gr-success-fg)]',\n warning: 'bg-[var(--gr-warning)] text-[var(--gr-warning-fg)]',\n danger: 'bg-[var(--gr-danger)] text-[var(--gr-danger-fg)]',\n info: 'bg-[var(--gr-info)] text-[var(--gr-info-fg)]',\n slate: 'bg-[var(--gr-slate)] text-[var(--gr-slate-fg)]',\n azure: 'bg-[var(--gr-azure)] text-[var(--gr-azure-fg)]',\n}\n\n/**\n * Видимый текст счётчика: число больше порога сворачивается в «{max}+», иначе\n * бейдж расползается и ломает соседей. Озвучивается при этом настоящее\n * значение — «99 плюс» пользователю ничего не говорит.\n */\nexport function formatBadgeValue(value: string | number, max?: number): string {\n if (max === undefined || typeof value !== 'number')\n return String(value)\n return value > max ? `${max}+` : String(value)\n}\n\n/**\n * Стоит ли отмечать анимацией переход счётчика из `prev` в `next`.\n * `undefined` означает «счётчика на экране нет».\n *\n * Отмечается только прибавление: появление счётчика и рост числа — события,\n * о которых пользователь ещё не знает. Убыль — наоборот, след его собственного\n * действия («прочитал»), и подсвечивать её значит мигать бейджем на каждом\n * прочитанном письме.\n *\n * У строкового значения порядка нет, поэтому любая его смена считается событием.\n */\nexport function isBadgeWrapPulse(\n prev: string | number | undefined,\n next: string | number | undefined,\n): boolean {\n if (next === undefined)\n return false\n if (prev === undefined)\n return true\n if (typeof prev === 'number' && typeof next === 'number')\n return next > prev\n return prev !== next\n}\n","import { splitClassTokens } from '../shared/classTokens'\nimport {\n countBaseClass,\n dotBaseClass,\n dotPlacementClass,\n placementClass,\n rootClass,\n toneClass,\n} from './grBadgeWrapStyles'\n\nexport const grBadgeWrapSafelist = [...new Set([\n ...splitClassTokens(rootClass),\n ...splitClassTokens(dotBaseClass),\n ...splitClassTokens(countBaseClass),\n ...Object.values(placementClass).flatMap(splitClassTokens),\n ...Object.values(dotPlacementClass).flatMap(splitClassTokens),\n ...Object.values(toneClass).flatMap(splitClassTokens),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grBadgeWrapSafelist } from './safelist'\n\nexport const grBadgeWrapConfig = defineGranularComponent(import.meta.url, {\n name: 'GrBadgeWrap',\n safelist: grBadgeWrapSafelist,\n})\n"],"mappings":";;;AAQA,IAAa,YAAY;;;;;AAMzB,IAAa,iBAAuD;CAClE,aAAa;CACb,YAAY;CACZ,gBAAgB;CAChB,eAAe;AACjB;;AAGA,IAAa,oBAA0D;CACrE,aAAa;CACb,YAAY;CACZ,gBAAgB;CAChB,eAAe;AACjB;AAEA,IAAa,eAAe;AAE5B,IAAa,iBAAiB;;;;;;;;;;;;;AAc9B,IAAa,YAA6C;CACxD,SAAS;CACT,SAAS;CACT,SAAS;CACT,SAAS;CACT,QAAQ;CACR,MAAM;CACN,OAAO;CACP,OAAO;AACT;;;;;;AAOA,SAAgB,iBAAiB,OAAwB,KAAsB;CAC7E,IAAI,QAAQ,KAAA,KAAa,OAAO,UAAU,UACxC,OAAO,OAAO,KAAK;CACrB,OAAO,QAAQ,MAAM,GAAG,IAAI,KAAK,OAAO,KAAK;AAC/C;;;;;;;;;;;;AAaA,SAAgB,iBACd,MACA,MACS;CACT,IAAI,SAAS,KAAA,GACX,OAAO;CACT,IAAI,SAAS,KAAA,GACX,OAAO;CACT,IAAI,OAAO,SAAS,YAAY,OAAO,SAAS,UAC9C,OAAO,OAAO;CAChB,OAAO,SAAS;AAClB;;;AC/EA,IAAa,sBAAsB,CAAC,mBAAG,IAAI,IAAI;CAC7C,GAAG,iBAAiB,SAAS;CAC7B,GAAG,iBAAiB,YAAY;CAChC,GAAG,iBAAiB,cAAc;CAClC,GAAG,OAAO,OAAO,cAAc,CAAC,CAAC,QAAQ,gBAAgB;CACzD,GAAG,OAAO,OAAO,iBAAiB,CAAC,CAAC,QAAQ,gBAAgB;CAC5D,GAAG,OAAO,OAAO,SAAS,CAAC,CAAC,QAAQ,gBAAgB;AACtD,CAAC,CAAC;;;ACbF,IAAa,oBAAoB,wBAAwB,OAAO,KAAK,KAAK;CACxE,MAAM;CACN,UAAU;AACZ,CAAC"}
1
+ {"version":3,"file":"config-DwABJHEo.js","names":[],"sources":["../../src/components/GrBadgeWrap/grBadgeWrapStyles.ts","../../src/components/GrBadgeWrap/safelist.ts","../../src/components/GrBadgeWrap/config.ts"],"sourcesContent":["import type { GrTone } from '../shared/tones'\n\nexport type GrBadgeWrapTone = GrTone\n\n/** Угол, в котором висит бейдж. */\nexport const GR_BADGE_WRAP_PLACEMENTS = ['top-right', 'top-left', 'bottom-right', 'bottom-left'] as const\nexport type GrBadgeWrapPlacement = typeof GR_BADGE_WRAP_PLACEMENTS[number]\n\nexport const rootClass = 'relative inline-flex'\n\n/**\n * Смещение бейджа — точки кастомизации: подвинуть его можно темой или инлайном,\n * не переопределяя классы снаружи. Дефолты повторяют прежние `-top-2 -right-2`.\n */\nexport const placementClass: Record<GrBadgeWrapPlacement, string> = {\n 'top-right': 'top-[var(--gr-badge-wrap-offset-y,-0.5rem)] right-[var(--gr-badge-wrap-offset-x,-0.5rem)]',\n 'top-left': 'top-[var(--gr-badge-wrap-offset-y,-0.5rem)] left-[var(--gr-badge-wrap-offset-x,-0.5rem)]',\n 'bottom-right': 'bottom-[var(--gr-badge-wrap-offset-y,-0.5rem)] right-[var(--gr-badge-wrap-offset-x,-0.5rem)]',\n 'bottom-left': 'bottom-[var(--gr-badge-wrap-offset-y,-0.5rem)] left-[var(--gr-badge-wrap-offset-x,-0.5rem)]',\n}\n\n/** У точки смещение меньше: она вдвое мельче счётчика. */\nexport const dotPlacementClass: Record<GrBadgeWrapPlacement, string> = {\n 'top-right': 'top-[var(--gr-badge-wrap-offset-y,-0.25rem)] right-[var(--gr-badge-wrap-offset-x,-0.25rem)]',\n 'top-left': 'top-[var(--gr-badge-wrap-offset-y,-0.25rem)] left-[var(--gr-badge-wrap-offset-x,-0.25rem)]',\n 'bottom-right': 'bottom-[var(--gr-badge-wrap-offset-y,-0.25rem)] right-[var(--gr-badge-wrap-offset-x,-0.25rem)]',\n 'bottom-left': 'bottom-[var(--gr-badge-wrap-offset-y,-0.25rem)] left-[var(--gr-badge-wrap-offset-x,-0.25rem)]',\n}\n\nexport const dotBaseClass = 'absolute h-2 w-2 rounded-[var(--gr-radius-full)]'\n\nexport const countBaseClass = 'absolute min-w-5 h-5 px-1 rounded-[var(--gr-radius-full)] text-[length:var(--gr-text-2xs)] leading-[var(--gr-leading-2xs)] font-700 inline-flex items-center justify-center'\n\n/**\n * Заливка — насыщенная роль тона, текст из `-fg`, а не из белого литерала: тот не\n * переживает смену темы.\n *\n * Вес намеренно не такой, как у filled-`GrBadge` (тот в светлой теме уехал на\n * `-solid`): точка и счётчик лежат **поверх чужого элемента**, и порог у них свой\n * — 3:1 к фону страницы, чтобы метку было видно на аватаре и на иконке. Заливка\n * кнопочного веса читалась бы там как вторая кнопка.\n *\n * Карта своя, а не импорт из `GrBadge`: чужая карта означала бы зависимость от\n * компонента и его CSS ради двух классов.\n */\nexport const toneClass: Record<GrBadgeWrapTone, string> = {\n neutral: 'bg-[var(--gr-fg)] text-[var(--gr-bg)]',\n primary: 'bg-[var(--gr-primary)] text-[var(--gr-primary-fg)]',\n success: 'bg-[var(--gr-success)] text-[var(--gr-success-fg)]',\n warning: 'bg-[var(--gr-warning)] text-[var(--gr-warning-fg)]',\n danger: 'bg-[var(--gr-danger)] text-[var(--gr-danger-fg)]',\n info: 'bg-[var(--gr-info)] text-[var(--gr-info-fg)]',\n slate: 'bg-[var(--gr-slate)] text-[var(--gr-slate-fg)]',\n azure: 'bg-[var(--gr-azure)] text-[var(--gr-azure-fg)]',\n}\n\n/**\n * Видимый текст счётчика: число больше порога сворачивается в «{max}+», иначе\n * бейдж расползается и ломает соседей. Озвучивается при этом настоящее\n * значение — «99 плюс» пользователю ничего не говорит.\n */\nexport function formatBadgeValue(value: string | number, max?: number): string {\n if (max === undefined || typeof value !== 'number')\n return String(value)\n return value > max ? `${max}+` : String(value)\n}\n\n/**\n * Стоит ли отмечать анимацией переход счётчика из `prev` в `next`.\n * `undefined` означает «счётчика на экране нет».\n *\n * Отмечается только прибавление: появление счётчика и рост числа — события,\n * о которых пользователь ещё не знает. Убыль — наоборот, след его собственного\n * действия («прочитал»), и подсвечивать её значит мигать бейджем на каждом\n * прочитанном письме.\n *\n * У строкового значения порядка нет, поэтому любая его смена считается событием.\n */\nexport function isBadgeWrapPulse(\n prev: string | number | undefined,\n next: string | number | undefined,\n): boolean {\n if (next === undefined)\n return false\n if (prev === undefined)\n return true\n if (typeof prev === 'number' && typeof next === 'number')\n return next > prev\n return prev !== next\n}\n","import { splitClassTokens } from '../shared/classTokens'\nimport {\n countBaseClass,\n dotBaseClass,\n dotPlacementClass,\n placementClass,\n rootClass,\n toneClass,\n} from './grBadgeWrapStyles'\n\nexport const grBadgeWrapSafelist = [...new Set([\n ...splitClassTokens(rootClass),\n ...splitClassTokens(dotBaseClass),\n ...splitClassTokens(countBaseClass),\n ...Object.values(placementClass).flatMap(splitClassTokens),\n ...Object.values(dotPlacementClass).flatMap(splitClassTokens),\n ...Object.values(toneClass).flatMap(splitClassTokens),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grBadgeWrapSafelist } from './safelist'\n\nexport const grBadgeWrapConfig = defineGranularComponent(import.meta.url, {\n name: 'GrBadgeWrap',\n safelist: grBadgeWrapSafelist,\n})\n"],"mappings":";;;AAQA,IAAa,YAAY;;;;;AAMzB,IAAa,iBAAuD;CAClE,aAAa;CACb,YAAY;CACZ,gBAAgB;CAChB,eAAe;AACjB;;AAGA,IAAa,oBAA0D;CACrE,aAAa;CACb,YAAY;CACZ,gBAAgB;CAChB,eAAe;AACjB;AAEA,IAAa,eAAe;AAE5B,IAAa,iBAAiB;;;;;;;;;;;;;AAc9B,IAAa,YAA6C;CACxD,SAAS;CACT,SAAS;CACT,SAAS;CACT,SAAS;CACT,QAAQ;CACR,MAAM;CACN,OAAO;CACP,OAAO;AACT;;;;;;AAOA,SAAgB,iBAAiB,OAAwB,KAAsB;CAC7E,IAAI,QAAQ,KAAA,KAAa,OAAO,UAAU,UACxC,OAAO,OAAO,KAAK;CACrB,OAAO,QAAQ,MAAM,GAAG,IAAI,KAAK,OAAO,KAAK;AAC/C;;;;;;;;;;;;AAaA,SAAgB,iBACd,MACA,MACS;CACT,IAAI,SAAS,KAAA,GACX,OAAO;CACT,IAAI,SAAS,KAAA,GACX,OAAO;CACT,IAAI,OAAO,SAAS,YAAY,OAAO,SAAS,UAC9C,OAAO,OAAO;CAChB,OAAO,SAAS;AAClB;;;AC/EA,IAAa,sBAAsB,CAAC,mBAAG,IAAI,IAAI;CAC7C,GAAG,iBAAiB,SAAS;CAC7B,GAAG,iBAAiB,YAAY;CAChC,GAAG,iBAAiB,cAAc;CAClC,GAAG,OAAO,OAAO,cAAc,CAAC,CAAC,QAAQ,gBAAgB;CACzD,GAAG,OAAO,OAAO,iBAAiB,CAAC,CAAC,QAAQ,gBAAgB;CAC5D,GAAG,OAAO,OAAO,SAAS,CAAC,CAAC,QAAQ,gBAAgB;AACtD,CAAC,CAAC;;;ACbF,IAAa,oBAAoB,wBAAwB,YAAY,KAAK;CACxE,MAAM;CACN,UAAU;AACZ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"config-E1cTyRVV.js","names":[],"sources":["../../src/components/GrSlider/safelist.ts","../../src/components/GrSlider/config.ts"],"sourcesContent":["import { splitClassTokens } from '../shared/classTokens'\nimport {\n sliderFillBaseClass,\n sliderFillDisabledClass,\n sliderFillEnabledClass,\n sliderFillOrientationClass,\n sliderMarkLabelClass,\n sliderMarkLabelDisabledClass,\n sliderMarkLabelHorizontalClass,\n sliderMarkLabelVerticalClass,\n sliderMarkTickBaseClass,\n sliderMarkTickOrientationClass,\n sliderPaddingBySize,\n sliderPaddingVerticalBySize,\n sliderRailClass,\n sliderRootBaseClass,\n sliderRootOrientationClass,\n sliderThumbBaseClass,\n sliderThumbDisabledClass,\n sliderThumbEnabledClass,\n sliderThumbOrientationClass,\n sliderThumbSizeBySize,\n sliderTooltipBaseClass,\n sliderTooltipOrientationClass,\n sliderTrackHeightBySize,\n sliderTrackVerticalLengthClass,\n sliderTrackWidthBySize,\n} from './grSliderStyles'\n\n// Всё, что живёт в `grSliderStyles.ts`: и вычисляемые мапы, и строковые литералы\n// дорожки, бегунка, тултипа и меток. Хелпер уезжает в общий `dist/chunks/`, вне\n// области скана компонента — гейт `src/__tests__/safelist.test.ts`.\nexport const grSliderSafelist = [...new Set([\n ...Object.values(sliderTrackHeightBySize).flatMap(splitClassTokens),\n ...Object.values(sliderTrackWidthBySize).flatMap(splitClassTokens),\n ...Object.values(sliderThumbSizeBySize).flatMap(splitClassTokens),\n ...Object.values(sliderPaddingBySize).flatMap(splitClassTokens),\n ...Object.values(sliderPaddingVerticalBySize).flatMap(splitClassTokens),\n ...Object.values(sliderRootOrientationClass).flatMap(splitClassTokens),\n ...Object.values(sliderFillOrientationClass).flatMap(splitClassTokens),\n ...Object.values(sliderThumbOrientationClass).flatMap(splitClassTokens),\n ...Object.values(sliderTooltipOrientationClass).flatMap(splitClassTokens),\n ...Object.values(sliderMarkTickOrientationClass).flatMap(splitClassTokens),\n ...splitClassTokens(sliderRootBaseClass),\n ...splitClassTokens(sliderRailClass),\n ...splitClassTokens(sliderFillBaseClass),\n ...splitClassTokens(sliderFillEnabledClass),\n ...splitClassTokens(sliderFillDisabledClass),\n ...splitClassTokens(sliderTrackVerticalLengthClass),\n ...splitClassTokens(sliderThumbBaseClass),\n ...splitClassTokens(sliderThumbEnabledClass),\n ...splitClassTokens(sliderThumbDisabledClass),\n ...splitClassTokens(sliderTooltipBaseClass),\n ...splitClassTokens(sliderMarkTickBaseClass),\n ...splitClassTokens(sliderMarkLabelClass),\n ...splitClassTokens(sliderMarkLabelHorizontalClass),\n ...splitClassTokens(sliderMarkLabelVerticalClass),\n ...splitClassTokens(sliderMarkLabelDisabledClass),\n // Резерв места под подписи меток и их выравнивание: центр / к левому / к правому краю.\n ...splitClassTokens('mb-7 mr-10 translate-x-0 -translate-x-1/2 -translate-x-full'),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grSliderSafelist } from './safelist'\n\nexport const grSliderConfig = defineGranularComponent(import.meta.url, {\n name: 'GrSlider',\n safelist: grSliderSafelist,\n})\n"],"mappings":";;;;AAgCA,IAAa,mBAAmB,CAAC,mBAAG,IAAI,IAAI;CAC1C,GAAG,OAAO,OAAO,uBAAuB,CAAC,CAAC,QAAQ,gBAAgB;CAClE,GAAG,OAAO,OAAO,sBAAsB,CAAC,CAAC,QAAQ,gBAAgB;CACjE,GAAG,OAAO,OAAO,qBAAqB,CAAC,CAAC,QAAQ,gBAAgB;CAChE,GAAG,OAAO,OAAO,mBAAmB,CAAC,CAAC,QAAQ,gBAAgB;CAC9D,GAAG,OAAO,OAAO,2BAA2B,CAAC,CAAC,QAAQ,gBAAgB;CACtE,GAAG,OAAO,OAAO,0BAA0B,CAAC,CAAC,QAAQ,gBAAgB;CACrE,GAAG,OAAO,OAAO,0BAA0B,CAAC,CAAC,QAAQ,gBAAgB;CACrE,GAAG,OAAO,OAAO,2BAA2B,CAAC,CAAC,QAAQ,gBAAgB;CACtE,GAAG,OAAO,OAAO,6BAA6B,CAAC,CAAC,QAAQ,gBAAgB;CACxE,GAAG,OAAO,OAAO,8BAA8B,CAAC,CAAC,QAAQ,gBAAgB;CACzE,GAAG,iBAAiB,mBAAmB;CACvC,GAAG,iBAAiB,eAAe;CACnC,GAAG,iBAAiB,mBAAmB;CACvC,GAAG,iBAAiB,sBAAsB;CAC1C,GAAG,iBAAiB,uBAAuB;CAC3C,GAAG,iBAAiB,8BAA8B;CAClD,GAAG,iBAAiB,oBAAoB;CACxC,GAAG,iBAAiB,uBAAuB;CAC3C,GAAG,iBAAiB,wBAAwB;CAC5C,GAAG,iBAAiB,sBAAsB;CAC1C,GAAG,iBAAiB,uBAAuB;CAC3C,GAAG,iBAAiB,oBAAoB;CACxC,GAAG,iBAAiB,8BAA8B;CAClD,GAAG,iBAAiB,4BAA4B;CAChD,GAAG,iBAAiB,4BAA4B;CAEhD,GAAG,iBAAiB,6DAA6D;AACnF,CAAC,CAAC;;;ACxDF,IAAa,iBAAiB,wBAAwB,OAAO,KAAK,KAAK;CACrE,MAAM;CACN,UAAU;AACZ,CAAC"}
1
+ {"version":3,"file":"config-E1cTyRVV.js","names":[],"sources":["../../src/components/GrSlider/safelist.ts","../../src/components/GrSlider/config.ts"],"sourcesContent":["import { splitClassTokens } from '../shared/classTokens'\nimport {\n sliderFillBaseClass,\n sliderFillDisabledClass,\n sliderFillEnabledClass,\n sliderFillOrientationClass,\n sliderMarkLabelClass,\n sliderMarkLabelDisabledClass,\n sliderMarkLabelHorizontalClass,\n sliderMarkLabelVerticalClass,\n sliderMarkTickBaseClass,\n sliderMarkTickOrientationClass,\n sliderPaddingBySize,\n sliderPaddingVerticalBySize,\n sliderRailClass,\n sliderRootBaseClass,\n sliderRootOrientationClass,\n sliderThumbBaseClass,\n sliderThumbDisabledClass,\n sliderThumbEnabledClass,\n sliderThumbOrientationClass,\n sliderThumbSizeBySize,\n sliderTooltipBaseClass,\n sliderTooltipOrientationClass,\n sliderTrackHeightBySize,\n sliderTrackVerticalLengthClass,\n sliderTrackWidthBySize,\n} from './grSliderStyles'\n\n// Всё, что живёт в `grSliderStyles.ts`: и вычисляемые мапы, и строковые литералы\n// дорожки, бегунка, тултипа и меток. Хелпер уезжает в общий `dist/chunks/`, вне\n// области скана компонента — гейт `src/__tests__/safelist.test.ts`.\nexport const grSliderSafelist = [...new Set([\n ...Object.values(sliderTrackHeightBySize).flatMap(splitClassTokens),\n ...Object.values(sliderTrackWidthBySize).flatMap(splitClassTokens),\n ...Object.values(sliderThumbSizeBySize).flatMap(splitClassTokens),\n ...Object.values(sliderPaddingBySize).flatMap(splitClassTokens),\n ...Object.values(sliderPaddingVerticalBySize).flatMap(splitClassTokens),\n ...Object.values(sliderRootOrientationClass).flatMap(splitClassTokens),\n ...Object.values(sliderFillOrientationClass).flatMap(splitClassTokens),\n ...Object.values(sliderThumbOrientationClass).flatMap(splitClassTokens),\n ...Object.values(sliderTooltipOrientationClass).flatMap(splitClassTokens),\n ...Object.values(sliderMarkTickOrientationClass).flatMap(splitClassTokens),\n ...splitClassTokens(sliderRootBaseClass),\n ...splitClassTokens(sliderRailClass),\n ...splitClassTokens(sliderFillBaseClass),\n ...splitClassTokens(sliderFillEnabledClass),\n ...splitClassTokens(sliderFillDisabledClass),\n ...splitClassTokens(sliderTrackVerticalLengthClass),\n ...splitClassTokens(sliderThumbBaseClass),\n ...splitClassTokens(sliderThumbEnabledClass),\n ...splitClassTokens(sliderThumbDisabledClass),\n ...splitClassTokens(sliderTooltipBaseClass),\n ...splitClassTokens(sliderMarkTickBaseClass),\n ...splitClassTokens(sliderMarkLabelClass),\n ...splitClassTokens(sliderMarkLabelHorizontalClass),\n ...splitClassTokens(sliderMarkLabelVerticalClass),\n ...splitClassTokens(sliderMarkLabelDisabledClass),\n // Резерв места под подписи меток и их выравнивание: центр / к левому / к правому краю.\n ...splitClassTokens('mb-7 mr-10 translate-x-0 -translate-x-1/2 -translate-x-full'),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grSliderSafelist } from './safelist'\n\nexport const grSliderConfig = defineGranularComponent(import.meta.url, {\n name: 'GrSlider',\n safelist: grSliderSafelist,\n})\n"],"mappings":";;;;AAgCA,IAAa,mBAAmB,CAAC,mBAAG,IAAI,IAAI;CAC1C,GAAG,OAAO,OAAO,uBAAuB,CAAC,CAAC,QAAQ,gBAAgB;CAClE,GAAG,OAAO,OAAO,sBAAsB,CAAC,CAAC,QAAQ,gBAAgB;CACjE,GAAG,OAAO,OAAO,qBAAqB,CAAC,CAAC,QAAQ,gBAAgB;CAChE,GAAG,OAAO,OAAO,mBAAmB,CAAC,CAAC,QAAQ,gBAAgB;CAC9D,GAAG,OAAO,OAAO,2BAA2B,CAAC,CAAC,QAAQ,gBAAgB;CACtE,GAAG,OAAO,OAAO,0BAA0B,CAAC,CAAC,QAAQ,gBAAgB;CACrE,GAAG,OAAO,OAAO,0BAA0B,CAAC,CAAC,QAAQ,gBAAgB;CACrE,GAAG,OAAO,OAAO,2BAA2B,CAAC,CAAC,QAAQ,gBAAgB;CACtE,GAAG,OAAO,OAAO,6BAA6B,CAAC,CAAC,QAAQ,gBAAgB;CACxE,GAAG,OAAO,OAAO,8BAA8B,CAAC,CAAC,QAAQ,gBAAgB;CACzE,GAAG,iBAAiB,mBAAmB;CACvC,GAAG,iBAAiB,eAAe;CACnC,GAAG,iBAAiB,mBAAmB;CACvC,GAAG,iBAAiB,sBAAsB;CAC1C,GAAG,iBAAiB,uBAAuB;CAC3C,GAAG,iBAAiB,8BAA8B;CAClD,GAAG,iBAAiB,oBAAoB;CACxC,GAAG,iBAAiB,uBAAuB;CAC3C,GAAG,iBAAiB,wBAAwB;CAC5C,GAAG,iBAAiB,sBAAsB;CAC1C,GAAG,iBAAiB,uBAAuB;CAC3C,GAAG,iBAAiB,oBAAoB;CACxC,GAAG,iBAAiB,8BAA8B;CAClD,GAAG,iBAAiB,4BAA4B;CAChD,GAAG,iBAAiB,4BAA4B;CAEhD,GAAG,iBAAiB,6DAA6D;AACnF,CAAC,CAAC;;;ACxDF,IAAa,iBAAiB,wBAAwB,YAAY,KAAK;CACrE,MAAM;CACN,UAAU;AACZ,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-MmPym-Z7.js","names":[],"sources":["../../src/components/GrNumberInput/grNumberInputStyles.ts","../../src/components/GrNumberInput/safelist.ts","../../src/components/GrNumberInput/config.ts"],"sourcesContent":["import type { GrComponentSize, GrControlState } from '../shared/sizes'\n\nexport type GrNumberInputState = GrControlState\nexport type GrNumberInputSize = GrComponentSize\nexport type GrNumberInputControlsDirection = 'vertical' | 'horizontal'\nexport type GrNumberInputTextAlign = 'left' | 'center' | 'right'\n\n// Backward-compatible type aliases.\nexport type NumberInputSize = GrNumberInputSize\nexport type NumberInputControlsDirection = GrNumberInputControlsDirection\n\nexport const sizeClassBySize: Record<GrNumberInputSize, string> = {\n xs: 'h-7 px-2.5 text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]',\n sm: 'h-8 px-3 text-[length:var(--gr-control-text-sm)] leading-[var(--gr-control-leading-sm)]',\n md: 'h-10 px-3 text-[length:var(--gr-control-text-md)] leading-[var(--gr-control-leading-md)]',\n lg: 'h-11 px-4 text-[length:var(--gr-control-text-lg)] leading-[var(--gr-control-leading-lg)]',\n}\n\nexport const textAlignClassByAlign: Record<GrNumberInputTextAlign, string> = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n}\n\nexport const borderClassByState: Record<GrNumberInputState, string> = {\n default: 'border-[var(--gr-brd)]',\n success: 'border-[var(--gr-success)] focus-within:ring-[var(--gr-success)]',\n warning: 'border-[var(--gr-warning)] focus-within:ring-[var(--gr-warning)]',\n danger: 'border-[var(--gr-danger)] focus-within:ring-[var(--gr-danger)]',\n}\n\n/**\n * Ошибка валидации красится своей ролью, а не декоративным тоном `danger`:\n * `state=\"danger\"` — это подсветка по решению разработчика, `invalid` — вердикт\n * валидации, и тема вправе развести их по цвету.\n */\nexport const invalidBorderClass = 'border-[var(--gr-invalid-brd)] focus-within:ring-[var(--gr-invalid-ring)]'\n\n/**\n * Недоступное поле гасится токенами, а не `opacity`: прозрачность разбавляет\n * выверенные на AA токены текста и роняет контраст подписи.\n */\nexport const disabledShellClass = 'bg-[var(--gr-disabled-bg)] text-[var(--gr-disabled-fg)] cursor-not-allowed'\n\nconst stepperBaseClass = 'inline-flex items-center justify-center text-[var(--gr-muted-fg)] hover:bg-[var(--gr-muted)] active:bg-[var(--gr-muted)] disabled:cursor-not-allowed disabled:text-[var(--gr-disabled-fg)] disabled:hover:bg-transparent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]'\n\n/** Компактная кнопка вертикального стека ± . */\nexport const stepperCompactClass = `h-4 w-7 rounded-[var(--gr-radius-sm)] ${stepperBaseClass}`\n\n/** Кнопка бокового стека ± — занимает всю высоту поля. */\nexport const stepperWideClass = `h-full w-full ${stepperBaseClass}`\n\nexport const clearButtonClass = 'absolute top-1/2 -translate-y-1/2 inline-flex h-5 w-5 items-center justify-center rounded-[var(--gr-radius-full)] text-[var(--gr-muted-fg)] hover:bg-[var(--gr-muted)] hover:text-[var(--gr-fg)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]'\n\nexport function grNumberInputShellClass(options: { disabled: boolean, state: GrNumberInputState, invalid: boolean }): string {\n return [\n options.disabled ? disabledShellClass : '',\n options.invalid ? invalidBorderClass : borderClassByState[options.state],\n ]\n .filter(Boolean)\n .join(' ')\n}\n\nexport function grNumberInputInputClass(options: { size: GrNumberInputSize, textAlign: GrNumberInputTextAlign }): string {\n return [\n sizeClassBySize[options.size],\n textAlignClassByAlign[options.textAlign],\n ].join(' ')\n}\n","import { splitClassTokens } from '../shared/classTokens'\nimport {\n borderClassByState,\n clearButtonClass,\n disabledShellClass,\n invalidBorderClass,\n stepperCompactClass,\n stepperWideClass,\n sizeClassBySize,\n textAlignClassByAlign,\n} from './grNumberInputStyles'\n\n// В safelist кладём только динамические токены, выбираемые по ключам в рантайме\n// (`size`/`textAlign`/`state`/`disabled`). Литералы shell/input/controls прописаны\n// статически в шаблоне — UnoCSS находит их сканом.\nexport const grNumberInputSafelist = [...new Set([\n ...Object.values(sizeClassBySize).flatMap(splitClassTokens),\n ...Object.values(textAlignClassByAlign).flatMap(splitClassTokens),\n ...Object.values(borderClassByState).flatMap(splitClassTokens),\n ...splitClassTokens(invalidBorderClass),\n ...splitClassTokens(disabledShellClass),\n ...splitClassTokens(stepperCompactClass),\n ...splitClassTokens(stepperWideClass),\n ...splitClassTokens(clearButtonClass),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grNumberInputSafelist } from './safelist'\n\nexport const grNumberInputConfig = defineGranularComponent(import.meta.url, {\n name: 'GrNumberInput',\n dependencies: ['GrIcon'],\n safelist: grNumberInputSafelist,\n})\n"],"mappings":";;;AAWA,IAAa,kBAAqD;CAChE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,wBAAgE;CAC3E,MAAM;CACN,QAAQ;CACR,OAAO;AACT;AAEA,IAAa,qBAAyD;CACpE,SAAS;CACT,SAAS;CACT,SAAS;CACT,QAAQ;AACV;;;;;;AAOA,IAAa,qBAAqB;;;;;AAMlC,IAAa,qBAAqB;AAElC,IAAM,mBAAmB;;AAGzB,IAAa,sBAAsB,yCAAyC;;AAG5E,IAAa,mBAAmB,iBAAiB;AAEjD,IAAa,mBAAmB;AAEhC,SAAgB,wBAAwB,SAAqF;CAC3H,OAAO,CACL,QAAQ,WAAW,qBAAqB,IACxC,QAAQ,UAAU,qBAAqB,mBAAmB,QAAQ,MACpE,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;AACb;AAEA,SAAgB,wBAAwB,SAAiF;CACvH,OAAO,CACL,gBAAgB,QAAQ,OACxB,sBAAsB,QAAQ,UAChC,CAAC,CAAC,KAAK,GAAG;AACZ;;;ACrDA,IAAa,wBAAwB,CAAC,mBAAG,IAAI,IAAI;CAC/C,GAAG,OAAO,OAAO,eAAe,CAAC,CAAC,QAAQ,gBAAgB;CAC1D,GAAG,OAAO,OAAO,qBAAqB,CAAC,CAAC,QAAQ,gBAAgB;CAChE,GAAG,OAAO,OAAO,kBAAkB,CAAC,CAAC,QAAQ,gBAAgB;CAC7D,GAAG,iBAAiB,kBAAkB;CACtC,GAAG,iBAAiB,kBAAkB;CACtC,GAAG,iBAAiB,mBAAmB;CACvC,GAAG,iBAAiB,gBAAgB;CACpC,GAAG,iBAAiB,gBAAgB;AACtC,CAAC,CAAC;;;ACpBF,IAAa,sBAAsB,wBAAwB,YAAY,KAAK;CAC1E,MAAM;CACN,cAAc,CAAC,QAAQ;CACvB,UAAU;AACZ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"config-QaIc_gRa.js","names":[],"sources":["../../src/components/GrRadioGroup/config.ts"],"sourcesContent":["import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nexport const grRadioGroupConfig = defineGranularComponent(import.meta.url, {\n name: 'GrRadioGroup',\n dependencies: ['GrButtonGroup', 'GrRadio'],\n})\n"],"mappings":";;AAEA,IAAa,qBAAqB,wBAAwB,OAAO,KAAK,KAAK;CACzE,MAAM;CACN,cAAc,CAAC,iBAAiB,SAAS;AAC3C,CAAC"}
1
+ {"version":3,"file":"config-QaIc_gRa.js","names":[],"sources":["../../src/components/GrRadioGroup/config.ts"],"sourcesContent":["import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nexport const grRadioGroupConfig = defineGranularComponent(import.meta.url, {\n name: 'GrRadioGroup',\n dependencies: ['GrButtonGroup', 'GrRadio'],\n})\n"],"mappings":";;AAEA,IAAa,qBAAqB,wBAAwB,YAAY,KAAK;CACzE,MAAM;CACN,cAAc,CAAC,iBAAiB,SAAS;AAC3C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"config-Yy67uWHY.js","names":[],"sources":["../../src/components/GrSwitch/grSwitchStyles.ts","../../src/components/GrSwitch/safelist.ts","../../src/components/GrSwitch/config.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nexport type GrSwitchSize = GrComponentSize\n\n/** Сторона подписи относительно дорожки — логическая, не физическая (RTL). */\nexport const GR_SWITCH_LABEL_POSITIONS = ['start', 'end'] as const\nexport type GrSwitchLabelPosition = typeof GR_SWITCH_LABEL_POSITIONS[number]\n\ntype GrSwitchThumbClassOptions = {\n checked: boolean\n size: GrSwitchSize\n}\n\nexport const rootBase = 'inline-flex items-center gap-2 select-none disabled:cursor-not-allowed'\n\n/** `start` разворачивает ряд, а не меняет порядок узлов: DOM-порядок читает диктор. */\nexport const rootLabelPositions: Record<GrSwitchLabelPosition, string> = {\n start: 'flex-row-reverse',\n end: '',\n}\n\nexport const trackBase\n = 'relative inline-flex shrink-0 items-center rounded-[var(--gr-radius-full)] border border-[var(--gr-switch-track-brd)] transition-colors duration-[var(--gr-duration-fast)]'\n\nexport const trackSizes: Record<GrSwitchSize, string> = {\n xs: 'h-4 w-7',\n sm: 'h-5 w-9',\n md: 'h-6 w-11',\n lg: 'h-7 w-14',\n}\n\nexport const thumbBase\n = 'inline-flex shrink-0 items-center justify-center rounded-[var(--gr-radius-full)] bg-[var(--gr-card)] shadow-[var(--gr-shadow-1)] transition-transform duration-[var(--gr-duration-fast)]'\n\nexport const thumbSizes: Record<GrSwitchSize, string> = {\n xs: 'h-3 w-3',\n sm: 'h-4 w-4',\n md: 'h-5 w-5',\n lg: 'h-6 w-6',\n}\n\n/** Спиннер загрузки живёт в бегунке, поэтому мельче его на ступень. */\nexport const thumbSpinnerSizes: Record<GrSwitchSize, string> = {\n xs: 'h-2 w-2',\n sm: 'h-2.5 w-2.5',\n md: 'h-3 w-3',\n lg: 'h-4 w-4',\n}\n\nexport const thumbSpinnerBase = 'animate-spin text-[var(--gr-muted-fg)]'\n\n/**\n * Сдвиг бегунка по горизонтали.\n *\n * Бегунок — обычный флекс-ребёнок дорожки, поэтому сдвиг отсчитывается от её\n * **content-box**, а он на 2px уже внешнего размера: рамка по 1px с каждой\n * стороны. Отсюда и весь расчёт.\n *\n * Зазор по вертикали задан геометрией и равен 1px на всех ступенях\n * (`(content-height − thumb) / 2`, дорожка центрирует бегунок сама). Значит и по\n * горизонтали он обязан быть 1px: иначе бегунок в покое выглядит вдавленным\n * внутрь, а в крайнем положении прижатым к краю — именно так и было, зазоры\n * расходились на 1–2px у `xs`, `sm` и `lg`.\n *\n * | ступень | дорожка | content | бегунок | покой | крайнее |\n * | --- | --- | --- | --- | --- | --- |\n * | `xs` | 28 | 26 | 12 | 1 | 13 |\n * | `sm` | 36 | 34 | 16 | 1 | 17 |\n * | `md` | 44 | 42 | 20 | 1 | 21 |\n * | `lg` | 56 | 54 | 24 | 1 | 29 |\n *\n * Крайнее положение — `content − thumb − зазор`. Гейт на эту арифметику живёт в\n * `__tests__/GrSwitch.test.ts`: он считает её заново из `trackSizes`/`thumbSizes`,\n * поэтому смена любой ступени размера сразу покажет разъехавшийся зазор.\n */\nexport const thumbTranslations: Record<GrSwitchSize, { checked: string, unchecked: string }> = {\n xs: {\n checked: 'translate-x-[13px]',\n unchecked: 'translate-x-[1px]',\n },\n sm: {\n checked: 'translate-x-[17px]',\n unchecked: 'translate-x-[1px]',\n },\n md: {\n checked: 'translate-x-[21px]',\n unchecked: 'translate-x-[1px]',\n },\n lg: {\n checked: 'translate-x-[29px]',\n unchecked: 'translate-x-[1px]',\n },\n}\n\nexport const labelBase = 'text-[var(--gr-muted-fg)]'\n\n/**\n * Недоступность гасится токеном, а не `opacity`: прозрачность разбавляет\n * выверенные на AA токены текста и роняет контраст подписи.\n */\nexport const labelDisabledClass = 'text-[var(--gr-disabled-fg)]'\n\nexport const labelSizes: Record<GrSwitchSize, string> = {\n xs: 'text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)]',\n sm: 'text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)]',\n md: 'text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)]',\n lg: 'text-[length:var(--gr-text-base)] leading-[var(--gr-leading-base)]',\n}\n\nexport function grSwitchRootClass(labelPosition: GrSwitchLabelPosition): string {\n return [rootBase, rootLabelPositions[labelPosition]].filter(Boolean).join(' ')\n}\n\nexport function grSwitchTrackClass(size: GrSwitchSize): string {\n return [trackBase, trackSizes[size]].join(' ')\n}\n\nexport function grSwitchThumbClass(options: GrSwitchThumbClassOptions): string {\n return [\n thumbBase,\n thumbSizes[options.size],\n thumbTranslations[options.size][options.checked ? 'checked' : 'unchecked'],\n ].join(' ')\n}\n\nexport function grSwitchSpinnerClass(size: GrSwitchSize): string {\n return [thumbSpinnerBase, thumbSpinnerSizes[size]].join(' ')\n}\n\nexport function grSwitchLabelClass(size: GrSwitchSize, disabled = false): string {\n return [disabled ? labelDisabledClass : labelBase, labelSizes[size]].join(' ')\n}\n","import { splitClassTokens } from '../shared/classTokens'\nimport {\n labelBase,\n labelDisabledClass,\n labelSizes,\n rootBase,\n rootLabelPositions,\n thumbBase,\n thumbSizes,\n thumbSpinnerBase,\n thumbSpinnerSizes,\n thumbTranslations,\n trackBase,\n trackSizes,\n} from './grSwitchStyles'\n\nexport const grSwitchClassTokens = {\n rootBase: splitClassTokens(rootBase),\n rootLabelPositions: Object.values(rootLabelPositions).flatMap(splitClassTokens),\n trackBase: splitClassTokens(trackBase),\n trackSizes: Object.values(trackSizes).flatMap(splitClassTokens),\n thumbBase: splitClassTokens(thumbBase),\n thumbSizes: Object.values(thumbSizes).flatMap(splitClassTokens),\n thumbSpinner: [\n ...splitClassTokens(thumbSpinnerBase),\n ...Object.values(thumbSpinnerSizes).flatMap(splitClassTokens),\n ],\n thumbTranslations: Object.values(thumbTranslations).flatMap(({ checked, unchecked }) => {\n return [...splitClassTokens(checked), ...splitClassTokens(unchecked)]\n }),\n labelBase: [...splitClassTokens(labelBase), ...splitClassTokens(labelDisabledClass)],\n labelSizes: Object.values(labelSizes).flatMap(splitClassTokens),\n} as const\n\nexport const grSwitchSafelist = [...new Set([\n ...grSwitchClassTokens.rootBase,\n ...grSwitchClassTokens.rootLabelPositions,\n ...grSwitchClassTokens.trackBase,\n ...grSwitchClassTokens.trackSizes,\n ...grSwitchClassTokens.thumbBase,\n ...grSwitchClassTokens.thumbSizes,\n ...grSwitchClassTokens.thumbSpinner,\n ...grSwitchClassTokens.thumbTranslations,\n ...grSwitchClassTokens.labelBase,\n ...grSwitchClassTokens.labelSizes,\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grSwitchSafelist } from './safelist'\n\nexport const grSwitchConfig = defineGranularComponent(import.meta.url, {\n name: 'GrSwitch',\n safelist: grSwitchSafelist,\n})\n"],"mappings":";;;AAaA,IAAa,WAAW;;AAGxB,IAAa,qBAA4D;CACvE,OAAO;CACP,KAAK;AACP;AAEA,IAAa,YACT;AAEJ,IAAa,aAA2C;CACtD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,YACT;AAEJ,IAAa,aAA2C;CACtD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,oBAAkD;CAC7D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;AA0BhC,IAAa,oBAAkF;CAC7F,IAAI;EACF,SAAS;EACT,WAAW;CACb;CACA,IAAI;EACF,SAAS;EACT,WAAW;CACb;CACA,IAAI;EACF,SAAS;EACT,WAAW;CACb;CACA,IAAI;EACF,SAAS;EACT,WAAW;CACb;AACF;AAEA,IAAa,YAAY;;;;;AAMzB,IAAa,qBAAqB;AAElC,IAAa,aAA2C;CACtD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,SAAgB,kBAAkB,eAA8C;CAC9E,OAAO,CAAC,UAAU,mBAAmB,cAAc,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AAC/E;AAEA,SAAgB,mBAAmB,MAA4B;CAC7D,OAAO,CAAC,WAAW,WAAW,KAAK,CAAC,CAAC,KAAK,GAAG;AAC/C;AAEA,SAAgB,mBAAmB,SAA4C;CAC7E,OAAO;EACL;EACA,WAAW,QAAQ;EACnB,kBAAkB,QAAQ,KAAK,CAAC,QAAQ,UAAU,YAAY;CAChE,CAAC,CAAC,KAAK,GAAG;AACZ;AAEA,SAAgB,qBAAqB,MAA4B;CAC/D,OAAO,CAAC,kBAAkB,kBAAkB,KAAK,CAAC,CAAC,KAAK,GAAG;AAC7D;AAEA,SAAgB,mBAAmB,MAAoB,WAAW,OAAe;CAC/E,OAAO,CAAC,WAAW,qBAAqB,WAAW,WAAW,KAAK,CAAC,CAAC,KAAK,GAAG;AAC/E;;;ACnHA,IAAa,sBAAsB;CACjC,UAAU,iBAAiB,QAAQ;CACnC,oBAAoB,OAAO,OAAO,kBAAkB,CAAC,CAAC,QAAQ,gBAAgB;CAC9E,WAAW,iBAAiB,SAAS;CACrC,YAAY,OAAO,OAAO,UAAU,CAAC,CAAC,QAAQ,gBAAgB;CAC9D,WAAW,iBAAiB,SAAS;CACrC,YAAY,OAAO,OAAO,UAAU,CAAC,CAAC,QAAQ,gBAAgB;CAC9D,cAAc,CACZ,GAAG,iBAAiB,gBAAgB,GACpC,GAAG,OAAO,OAAO,iBAAiB,CAAC,CAAC,QAAQ,gBAAgB,CAC9D;CACA,mBAAmB,OAAO,OAAO,iBAAiB,CAAC,CAAC,SAAS,EAAE,SAAS,gBAAgB;EACtF,OAAO,CAAC,GAAG,iBAAiB,OAAO,GAAG,GAAG,iBAAiB,SAAS,CAAC;CACtE,CAAC;CACD,WAAW,CAAC,GAAG,iBAAiB,SAAS,GAAG,GAAG,iBAAiB,kBAAkB,CAAC;CACnF,YAAY,OAAO,OAAO,UAAU,CAAC,CAAC,QAAQ,gBAAgB;AAChE;AAEA,IAAa,mBAAmB,CAAC,mBAAG,IAAI,IAAI;CAC1C,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;AACzB,CAAC,CAAC;;;ACzCF,IAAa,iBAAiB,wBAAwB,OAAO,KAAK,KAAK;CACrE,MAAM;CACN,UAAU;AACZ,CAAC"}
1
+ {"version":3,"file":"config-Yy67uWHY.js","names":[],"sources":["../../src/components/GrSwitch/grSwitchStyles.ts","../../src/components/GrSwitch/safelist.ts","../../src/components/GrSwitch/config.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nexport type GrSwitchSize = GrComponentSize\n\n/** Сторона подписи относительно дорожки — логическая, не физическая (RTL). */\nexport const GR_SWITCH_LABEL_POSITIONS = ['start', 'end'] as const\nexport type GrSwitchLabelPosition = typeof GR_SWITCH_LABEL_POSITIONS[number]\n\ntype GrSwitchThumbClassOptions = {\n checked: boolean\n size: GrSwitchSize\n}\n\nexport const rootBase = 'inline-flex items-center gap-2 select-none disabled:cursor-not-allowed'\n\n/** `start` разворачивает ряд, а не меняет порядок узлов: DOM-порядок читает диктор. */\nexport const rootLabelPositions: Record<GrSwitchLabelPosition, string> = {\n start: 'flex-row-reverse',\n end: '',\n}\n\nexport const trackBase\n = 'relative inline-flex shrink-0 items-center rounded-[var(--gr-radius-full)] border border-[var(--gr-switch-track-brd)] transition-colors duration-[var(--gr-duration-fast)]'\n\nexport const trackSizes: Record<GrSwitchSize, string> = {\n xs: 'h-4 w-7',\n sm: 'h-5 w-9',\n md: 'h-6 w-11',\n lg: 'h-7 w-14',\n}\n\nexport const thumbBase\n = 'inline-flex shrink-0 items-center justify-center rounded-[var(--gr-radius-full)] bg-[var(--gr-card)] shadow-[var(--gr-shadow-1)] transition-transform duration-[var(--gr-duration-fast)]'\n\nexport const thumbSizes: Record<GrSwitchSize, string> = {\n xs: 'h-3 w-3',\n sm: 'h-4 w-4',\n md: 'h-5 w-5',\n lg: 'h-6 w-6',\n}\n\n/** Спиннер загрузки живёт в бегунке, поэтому мельче его на ступень. */\nexport const thumbSpinnerSizes: Record<GrSwitchSize, string> = {\n xs: 'h-2 w-2',\n sm: 'h-2.5 w-2.5',\n md: 'h-3 w-3',\n lg: 'h-4 w-4',\n}\n\nexport const thumbSpinnerBase = 'animate-spin text-[var(--gr-muted-fg)]'\n\n/**\n * Сдвиг бегунка по горизонтали.\n *\n * Бегунок — обычный флекс-ребёнок дорожки, поэтому сдвиг отсчитывается от её\n * **content-box**, а он на 2px уже внешнего размера: рамка по 1px с каждой\n * стороны. Отсюда и весь расчёт.\n *\n * Зазор по вертикали задан геометрией и равен 1px на всех ступенях\n * (`(content-height − thumb) / 2`, дорожка центрирует бегунок сама). Значит и по\n * горизонтали он обязан быть 1px: иначе бегунок в покое выглядит вдавленным\n * внутрь, а в крайнем положении прижатым к краю — именно так и было, зазоры\n * расходились на 1–2px у `xs`, `sm` и `lg`.\n *\n * | ступень | дорожка | content | бегунок | покой | крайнее |\n * | --- | --- | --- | --- | --- | --- |\n * | `xs` | 28 | 26 | 12 | 1 | 13 |\n * | `sm` | 36 | 34 | 16 | 1 | 17 |\n * | `md` | 44 | 42 | 20 | 1 | 21 |\n * | `lg` | 56 | 54 | 24 | 1 | 29 |\n *\n * Крайнее положение — `content − thumb − зазор`. Гейт на эту арифметику живёт в\n * `__tests__/GrSwitch.test.ts`: он считает её заново из `trackSizes`/`thumbSizes`,\n * поэтому смена любой ступени размера сразу покажет разъехавшийся зазор.\n */\nexport const thumbTranslations: Record<GrSwitchSize, { checked: string, unchecked: string }> = {\n xs: {\n checked: 'translate-x-[13px]',\n unchecked: 'translate-x-[1px]',\n },\n sm: {\n checked: 'translate-x-[17px]',\n unchecked: 'translate-x-[1px]',\n },\n md: {\n checked: 'translate-x-[21px]',\n unchecked: 'translate-x-[1px]',\n },\n lg: {\n checked: 'translate-x-[29px]',\n unchecked: 'translate-x-[1px]',\n },\n}\n\nexport const labelBase = 'text-[var(--gr-muted-fg)]'\n\n/**\n * Недоступность гасится токеном, а не `opacity`: прозрачность разбавляет\n * выверенные на AA токены текста и роняет контраст подписи.\n */\nexport const labelDisabledClass = 'text-[var(--gr-disabled-fg)]'\n\nexport const labelSizes: Record<GrSwitchSize, string> = {\n xs: 'text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)]',\n sm: 'text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)]',\n md: 'text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)]',\n lg: 'text-[length:var(--gr-text-base)] leading-[var(--gr-leading-base)]',\n}\n\nexport function grSwitchRootClass(labelPosition: GrSwitchLabelPosition): string {\n return [rootBase, rootLabelPositions[labelPosition]].filter(Boolean).join(' ')\n}\n\nexport function grSwitchTrackClass(size: GrSwitchSize): string {\n return [trackBase, trackSizes[size]].join(' ')\n}\n\nexport function grSwitchThumbClass(options: GrSwitchThumbClassOptions): string {\n return [\n thumbBase,\n thumbSizes[options.size],\n thumbTranslations[options.size][options.checked ? 'checked' : 'unchecked'],\n ].join(' ')\n}\n\nexport function grSwitchSpinnerClass(size: GrSwitchSize): string {\n return [thumbSpinnerBase, thumbSpinnerSizes[size]].join(' ')\n}\n\nexport function grSwitchLabelClass(size: GrSwitchSize, disabled = false): string {\n return [disabled ? labelDisabledClass : labelBase, labelSizes[size]].join(' ')\n}\n","import { splitClassTokens } from '../shared/classTokens'\nimport {\n labelBase,\n labelDisabledClass,\n labelSizes,\n rootBase,\n rootLabelPositions,\n thumbBase,\n thumbSizes,\n thumbSpinnerBase,\n thumbSpinnerSizes,\n thumbTranslations,\n trackBase,\n trackSizes,\n} from './grSwitchStyles'\n\nexport const grSwitchClassTokens = {\n rootBase: splitClassTokens(rootBase),\n rootLabelPositions: Object.values(rootLabelPositions).flatMap(splitClassTokens),\n trackBase: splitClassTokens(trackBase),\n trackSizes: Object.values(trackSizes).flatMap(splitClassTokens),\n thumbBase: splitClassTokens(thumbBase),\n thumbSizes: Object.values(thumbSizes).flatMap(splitClassTokens),\n thumbSpinner: [\n ...splitClassTokens(thumbSpinnerBase),\n ...Object.values(thumbSpinnerSizes).flatMap(splitClassTokens),\n ],\n thumbTranslations: Object.values(thumbTranslations).flatMap(({ checked, unchecked }) => {\n return [...splitClassTokens(checked), ...splitClassTokens(unchecked)]\n }),\n labelBase: [...splitClassTokens(labelBase), ...splitClassTokens(labelDisabledClass)],\n labelSizes: Object.values(labelSizes).flatMap(splitClassTokens),\n} as const\n\nexport const grSwitchSafelist = [...new Set([\n ...grSwitchClassTokens.rootBase,\n ...grSwitchClassTokens.rootLabelPositions,\n ...grSwitchClassTokens.trackBase,\n ...grSwitchClassTokens.trackSizes,\n ...grSwitchClassTokens.thumbBase,\n ...grSwitchClassTokens.thumbSizes,\n ...grSwitchClassTokens.thumbSpinner,\n ...grSwitchClassTokens.thumbTranslations,\n ...grSwitchClassTokens.labelBase,\n ...grSwitchClassTokens.labelSizes,\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grSwitchSafelist } from './safelist'\n\nexport const grSwitchConfig = defineGranularComponent(import.meta.url, {\n name: 'GrSwitch',\n safelist: grSwitchSafelist,\n})\n"],"mappings":";;;AAaA,IAAa,WAAW;;AAGxB,IAAa,qBAA4D;CACvE,OAAO;CACP,KAAK;AACP;AAEA,IAAa,YACT;AAEJ,IAAa,aAA2C;CACtD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,YACT;AAEJ,IAAa,aAA2C;CACtD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,oBAAkD;CAC7D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;AA0BhC,IAAa,oBAAkF;CAC7F,IAAI;EACF,SAAS;EACT,WAAW;CACb;CACA,IAAI;EACF,SAAS;EACT,WAAW;CACb;CACA,IAAI;EACF,SAAS;EACT,WAAW;CACb;CACA,IAAI;EACF,SAAS;EACT,WAAW;CACb;AACF;AAEA,IAAa,YAAY;;;;;AAMzB,IAAa,qBAAqB;AAElC,IAAa,aAA2C;CACtD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,SAAgB,kBAAkB,eAA8C;CAC9E,OAAO,CAAC,UAAU,mBAAmB,cAAc,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AAC/E;AAEA,SAAgB,mBAAmB,MAA4B;CAC7D,OAAO,CAAC,WAAW,WAAW,KAAK,CAAC,CAAC,KAAK,GAAG;AAC/C;AAEA,SAAgB,mBAAmB,SAA4C;CAC7E,OAAO;EACL;EACA,WAAW,QAAQ;EACnB,kBAAkB,QAAQ,KAAK,CAAC,QAAQ,UAAU,YAAY;CAChE,CAAC,CAAC,KAAK,GAAG;AACZ;AAEA,SAAgB,qBAAqB,MAA4B;CAC/D,OAAO,CAAC,kBAAkB,kBAAkB,KAAK,CAAC,CAAC,KAAK,GAAG;AAC7D;AAEA,SAAgB,mBAAmB,MAAoB,WAAW,OAAe;CAC/E,OAAO,CAAC,WAAW,qBAAqB,WAAW,WAAW,KAAK,CAAC,CAAC,KAAK,GAAG;AAC/E;;;ACnHA,IAAa,sBAAsB;CACjC,UAAU,iBAAiB,QAAQ;CACnC,oBAAoB,OAAO,OAAO,kBAAkB,CAAC,CAAC,QAAQ,gBAAgB;CAC9E,WAAW,iBAAiB,SAAS;CACrC,YAAY,OAAO,OAAO,UAAU,CAAC,CAAC,QAAQ,gBAAgB;CAC9D,WAAW,iBAAiB,SAAS;CACrC,YAAY,OAAO,OAAO,UAAU,CAAC,CAAC,QAAQ,gBAAgB;CAC9D,cAAc,CACZ,GAAG,iBAAiB,gBAAgB,GACpC,GAAG,OAAO,OAAO,iBAAiB,CAAC,CAAC,QAAQ,gBAAgB,CAC9D;CACA,mBAAmB,OAAO,OAAO,iBAAiB,CAAC,CAAC,SAAS,EAAE,SAAS,gBAAgB;EACtF,OAAO,CAAC,GAAG,iBAAiB,OAAO,GAAG,GAAG,iBAAiB,SAAS,CAAC;CACtE,CAAC;CACD,WAAW,CAAC,GAAG,iBAAiB,SAAS,GAAG,GAAG,iBAAiB,kBAAkB,CAAC;CACnF,YAAY,OAAO,OAAO,UAAU,CAAC,CAAC,QAAQ,gBAAgB;AAChE;AAEA,IAAa,mBAAmB,CAAC,mBAAG,IAAI,IAAI;CAC1C,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;AACzB,CAAC,CAAC;;;ACzCF,IAAa,iBAAiB,wBAAwB,YAAY,KAAK;CACrE,MAAM;CACN,UAAU;AACZ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"config-Z5LeUXys.js","names":[],"sources":["../../src/components/GrValue/grValueStyles.ts","../../src/components/GrValue/safelist.ts","../../src/components/GrValue/config.ts"],"sourcesContent":["/**\n * Классы `GrValue`.\n *\n * Оформление аффиксов задаётся токенами, а не решением компонента. Раньше это\n * решение было зашито: префикс набирался как число, суффикс — как единица\n * измерения. Для `$14,99` и `42 %` правило верное, но доменное: рубль пишут\n * справа (`1 284 500 ₽`), и в роли суффикса он получал вид подписи.\n *\n * Дефолты сохраняют прежний вид, поэтому потребителю, которого он устраивал,\n * менять нечего.\n */\n\n/**\n * Величина набирается кеглем и цветом того места, где стоит: своей шкалы у\n * примитива нет. `tabular-nums` держит ширину строки, когда число меняется.\n */\nexport const valueRootClass = 'inline-flex items-baseline tabular-nums'\n\n/**\n * Префикс — часть записи величины: по умолчанию её цвет, её кегль, вплотную.\n * `inherit` в фолбэке и делает «по умолчанию» наследованием, а не копией: тон\n * задаётся один раз на родителе и доезжает сюда сам.\n */\nexport const valuePrefixClass = [\n 'leading-none',\n 'text-[var(--gr-value-prefix-color,inherit)]',\n 'text-[length:var(--gr-value-prefix-size,inherit)]',\n 'me-[var(--gr-value-prefix-gap,0)]',\n].join(' ')\n\n/**\n * Суффикс по умолчанию — единица измерения: приглушён, на ступень мельче и\n * отбит от числа.\n *\n * `leading-none` обязателен вместе с уменьшенным кеглем: межстрочный\n * наследуется от величины и рассчитан на её размер, а выровненная по базовой\n * линии приписка со своим меньшим кеглем растягивала бы им всю строку.\n *\n * Логический `me`/`ms` вместо `mr`/`ml`: в RTL отбивка обязана встать с другой\n * стороны, иначе суффикс прилипнет к числу.\n */\nexport const valueSuffixClass = [\n 'leading-none',\n 'text-[var(--gr-value-suffix-color,var(--gr-muted-fg))]',\n 'text-[length:var(--gr-value-suffix-size,0.85em)]',\n 'ms-[var(--gr-value-suffix-gap,0.25rem)]',\n].join(' ')\n","import { splitClassTokens } from '../shared/classTokens'\n\nimport { valuePrefixClass, valueRootClass, valueSuffixClass } from './grValueStyles'\n\n// Классы живут в `.ts`-хелпере: на сборке он уезжает в общий чанк, который скан\n// пресета не видит. Ссылками на конст, а не копиями строк — копия разойдётся.\nexport const grValueSafelist = [...new Set([\n ...splitClassTokens(valueRootClass),\n ...splitClassTokens(valuePrefixClass),\n ...splitClassTokens(valueSuffixClass),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grValueSafelist } from './safelist'\n\nexport const grValueConfig = defineGranularComponent(import.meta.url, {\n name: 'GrValue',\n safelist: grValueSafelist,\n})\n"],"mappings":";;;;;;;;;;;;;;;;;;AAgBA,IAAa,iBAAiB;;;;;;AAO9B,IAAa,mBAAmB;CAC9B;CACA;CACA;CACA;AACF,CAAC,CAAC,KAAK,GAAG;;;;;;;;;;;;AAaV,IAAa,mBAAmB;CAC9B;CACA;CACA;CACA;AACF,CAAC,CAAC,KAAK,GAAG;;;ACxCV,IAAa,kBAAkB,CAAC,mBAAG,IAAI,IAAI;CACzC,GAAG,iBAAiB,cAAc;CAClC,GAAG,iBAAiB,gBAAgB;CACpC,GAAG,iBAAiB,gBAAgB;AACtC,CAAC,CAAC;;;ACNF,IAAa,gBAAgB,wBAAwB,OAAO,KAAK,KAAK;CACpE,MAAM;CACN,UAAU;AACZ,CAAC"}
1
+ {"version":3,"file":"config-Z5LeUXys.js","names":[],"sources":["../../src/components/GrValue/grValueStyles.ts","../../src/components/GrValue/safelist.ts","../../src/components/GrValue/config.ts"],"sourcesContent":["/**\n * Классы `GrValue`.\n *\n * Оформление аффиксов задаётся токенами, а не решением компонента. Раньше это\n * решение было зашито: префикс набирался как число, суффикс — как единица\n * измерения. Для `$14,99` и `42 %` правило верное, но доменное: рубль пишут\n * справа (`1 284 500 ₽`), и в роли суффикса он получал вид подписи.\n *\n * Дефолты сохраняют прежний вид, поэтому потребителю, которого он устраивал,\n * менять нечего.\n */\n\n/**\n * Величина набирается кеглем и цветом того места, где стоит: своей шкалы у\n * примитива нет. `tabular-nums` держит ширину строки, когда число меняется.\n */\nexport const valueRootClass = 'inline-flex items-baseline tabular-nums'\n\n/**\n * Префикс — часть записи величины: по умолчанию её цвет, её кегль, вплотную.\n * `inherit` в фолбэке и делает «по умолчанию» наследованием, а не копией: тон\n * задаётся один раз на родителе и доезжает сюда сам.\n */\nexport const valuePrefixClass = [\n 'leading-none',\n 'text-[var(--gr-value-prefix-color,inherit)]',\n 'text-[length:var(--gr-value-prefix-size,inherit)]',\n 'me-[var(--gr-value-prefix-gap,0)]',\n].join(' ')\n\n/**\n * Суффикс по умолчанию — единица измерения: приглушён, на ступень мельче и\n * отбит от числа.\n *\n * `leading-none` обязателен вместе с уменьшенным кеглем: межстрочный\n * наследуется от величины и рассчитан на её размер, а выровненная по базовой\n * линии приписка со своим меньшим кеглем растягивала бы им всю строку.\n *\n * Логический `me`/`ms` вместо `mr`/`ml`: в RTL отбивка обязана встать с другой\n * стороны, иначе суффикс прилипнет к числу.\n */\nexport const valueSuffixClass = [\n 'leading-none',\n 'text-[var(--gr-value-suffix-color,var(--gr-muted-fg))]',\n 'text-[length:var(--gr-value-suffix-size,0.85em)]',\n 'ms-[var(--gr-value-suffix-gap,0.25rem)]',\n].join(' ')\n","import { splitClassTokens } from '../shared/classTokens'\n\nimport { valuePrefixClass, valueRootClass, valueSuffixClass } from './grValueStyles'\n\n// Классы живут в `.ts`-хелпере: на сборке он уезжает в общий чанк, который скан\n// пресета не видит. Ссылками на конст, а не копиями строк — копия разойдётся.\nexport const grValueSafelist = [...new Set([\n ...splitClassTokens(valueRootClass),\n ...splitClassTokens(valuePrefixClass),\n ...splitClassTokens(valueSuffixClass),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grValueSafelist } from './safelist'\n\nexport const grValueConfig = defineGranularComponent(import.meta.url, {\n name: 'GrValue',\n safelist: grValueSafelist,\n})\n"],"mappings":";;;;;;;;;;;;;;;;;;AAgBA,IAAa,iBAAiB;;;;;;AAO9B,IAAa,mBAAmB;CAC9B;CACA;CACA;CACA;AACF,CAAC,CAAC,KAAK,GAAG;;;;;;;;;;;;AAaV,IAAa,mBAAmB;CAC9B;CACA;CACA;CACA;AACF,CAAC,CAAC,KAAK,GAAG;;;ACxCV,IAAa,kBAAkB,CAAC,mBAAG,IAAI,IAAI;CACzC,GAAG,iBAAiB,cAAc;CAClC,GAAG,iBAAiB,gBAAgB;CACpC,GAAG,iBAAiB,gBAAgB;AACtC,CAAC,CAAC;;;ACNF,IAAa,gBAAgB,wBAAwB,YAAY,KAAK;CACpE,MAAM;CACN,UAAU;AACZ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"config-_jbgsFpw.js","names":[],"sources":["../../src/components/GrDropdownMenu/safelist.ts","../../src/components/GrDropdownMenu/config.ts"],"sourcesContent":["import { splitClassTokens } from '../shared/classTokens'\n\nimport {\n alignClass,\n borderBottomClass,\n borderEdgeClass,\n borderTopClass,\n colsClass,\n columnBaseClass,\n columnsBaseClass,\n dividerClass,\n dividerInsetClass,\n dividersClass,\n headerClass,\n itemBaseClass,\n itemDisabledClass,\n itemIndicatorClass,\n itemInteractiveClass,\n itemShortcutClass,\n itemVariantClass,\n listBaseClass,\n textAlignClass,\n} from './grDropdownMenuStyles'\n\n/**\n * Классы каталога живут в `.ts`-хелпере, а его бандлер волен вынести в общий\n * `dist/chunks/` — вне области скана компонента. Симптом промаха тут особенно\n * незаметный: размеры пунктов на месте, а выравнивание, колонки и цвета\n * пропали. Гейт — `src/__tests__/safelist.test.ts`.\n */\nexport const grDropdownMenuSafelist = [...new Set([\n ...Object.values(alignClass).flatMap(splitClassTokens),\n ...Object.values(textAlignClass).flatMap(splitClassTokens),\n ...Object.values(colsClass).flatMap(splitClassTokens),\n ...Object.values(itemVariantClass).flatMap(splitClassTokens),\n ...splitClassTokens(itemBaseClass),\n ...splitClassTokens(itemInteractiveClass),\n ...splitClassTokens(itemDisabledClass),\n ...splitClassTokens(itemIndicatorClass),\n ...splitClassTokens(itemShortcutClass),\n ...splitClassTokens(headerClass),\n ...splitClassTokens(listBaseClass),\n ...splitClassTokens(dividersClass),\n ...splitClassTokens(borderEdgeClass),\n ...splitClassTokens(borderTopClass),\n ...splitClassTokens(borderBottomClass),\n ...splitClassTokens(columnsBaseClass),\n ...splitClassTokens(columnBaseClass),\n ...splitClassTokens(dividerClass),\n ...splitClassTokens(dividerInsetClass),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grDropdownMenuSafelist } from './safelist'\n\nexport const grDropdownMenuConfig = defineGranularComponent(import.meta.url, {\n name: 'GrDropdownMenu',\n dependencies: ['GrDropdown'],\n safelist: grDropdownMenuSafelist,\n})\n"],"mappings":";;;;;;;;;;AA8BA,IAAa,yBAAyB,CAAC,mBAAG,IAAI,IAAI;CAChD,GAAG,OAAO,OAAO,UAAU,CAAC,CAAC,QAAQ,gBAAgB;CACrD,GAAG,OAAO,OAAO,cAAc,CAAC,CAAC,QAAQ,gBAAgB;CACzD,GAAG,OAAO,OAAO,SAAS,CAAC,CAAC,QAAQ,gBAAgB;CACpD,GAAG,OAAO,OAAO,gBAAgB,CAAC,CAAC,QAAQ,gBAAgB;CAC3D,GAAG,iBAAiB,aAAa;CACjC,GAAG,iBAAiB,oBAAoB;CACxC,GAAG,iBAAiB,iBAAiB;CACrC,GAAG,iBAAiB,kBAAkB;CACtC,GAAG,iBAAiB,iBAAiB;CACrC,GAAG,iBAAiB,WAAW;CAC/B,GAAG,iBAAiB,aAAa;CACjC,GAAG,iBAAiB,aAAa;CACjC,GAAG,iBAAiB,eAAe;CACnC,GAAG,iBAAiB,cAAc;CAClC,GAAG,iBAAiB,iBAAiB;CACrC,GAAG,iBAAiB,gBAAgB;CACpC,GAAG,iBAAiB,eAAe;CACnC,GAAG,iBAAiB,YAAY;CAChC,GAAG,iBAAiB,iBAAiB;AACvC,CAAC,CAAC;;;AC9CF,IAAa,uBAAuB,wBAAwB,OAAO,KAAK,KAAK;CAC3E,MAAM;CACN,cAAc,CAAC,YAAY;CAC3B,UAAU;AACZ,CAAC"}
1
+ {"version":3,"file":"config-_jbgsFpw.js","names":[],"sources":["../../src/components/GrDropdownMenu/safelist.ts","../../src/components/GrDropdownMenu/config.ts"],"sourcesContent":["import { splitClassTokens } from '../shared/classTokens'\n\nimport {\n alignClass,\n borderBottomClass,\n borderEdgeClass,\n borderTopClass,\n colsClass,\n columnBaseClass,\n columnsBaseClass,\n dividerClass,\n dividerInsetClass,\n dividersClass,\n headerClass,\n itemBaseClass,\n itemDisabledClass,\n itemIndicatorClass,\n itemInteractiveClass,\n itemShortcutClass,\n itemVariantClass,\n listBaseClass,\n textAlignClass,\n} from './grDropdownMenuStyles'\n\n/**\n * Классы каталога живут в `.ts`-хелпере, а его бандлер волен вынести в общий\n * `dist/chunks/` — вне области скана компонента. Симптом промаха тут особенно\n * незаметный: размеры пунктов на месте, а выравнивание, колонки и цвета\n * пропали. Гейт — `src/__tests__/safelist.test.ts`.\n */\nexport const grDropdownMenuSafelist = [...new Set([\n ...Object.values(alignClass).flatMap(splitClassTokens),\n ...Object.values(textAlignClass).flatMap(splitClassTokens),\n ...Object.values(colsClass).flatMap(splitClassTokens),\n ...Object.values(itemVariantClass).flatMap(splitClassTokens),\n ...splitClassTokens(itemBaseClass),\n ...splitClassTokens(itemInteractiveClass),\n ...splitClassTokens(itemDisabledClass),\n ...splitClassTokens(itemIndicatorClass),\n ...splitClassTokens(itemShortcutClass),\n ...splitClassTokens(headerClass),\n ...splitClassTokens(listBaseClass),\n ...splitClassTokens(dividersClass),\n ...splitClassTokens(borderEdgeClass),\n ...splitClassTokens(borderTopClass),\n ...splitClassTokens(borderBottomClass),\n ...splitClassTokens(columnsBaseClass),\n ...splitClassTokens(columnBaseClass),\n ...splitClassTokens(dividerClass),\n ...splitClassTokens(dividerInsetClass),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grDropdownMenuSafelist } from './safelist'\n\nexport const grDropdownMenuConfig = defineGranularComponent(import.meta.url, {\n name: 'GrDropdownMenu',\n dependencies: ['GrDropdown'],\n safelist: grDropdownMenuSafelist,\n})\n"],"mappings":";;;;;;;;;;AA8BA,IAAa,yBAAyB,CAAC,mBAAG,IAAI,IAAI;CAChD,GAAG,OAAO,OAAO,UAAU,CAAC,CAAC,QAAQ,gBAAgB;CACrD,GAAG,OAAO,OAAO,cAAc,CAAC,CAAC,QAAQ,gBAAgB;CACzD,GAAG,OAAO,OAAO,SAAS,CAAC,CAAC,QAAQ,gBAAgB;CACpD,GAAG,OAAO,OAAO,gBAAgB,CAAC,CAAC,QAAQ,gBAAgB;CAC3D,GAAG,iBAAiB,aAAa;CACjC,GAAG,iBAAiB,oBAAoB;CACxC,GAAG,iBAAiB,iBAAiB;CACrC,GAAG,iBAAiB,kBAAkB;CACtC,GAAG,iBAAiB,iBAAiB;CACrC,GAAG,iBAAiB,WAAW;CAC/B,GAAG,iBAAiB,aAAa;CACjC,GAAG,iBAAiB,aAAa;CACjC,GAAG,iBAAiB,eAAe;CACnC,GAAG,iBAAiB,cAAc;CAClC,GAAG,iBAAiB,iBAAiB;CACrC,GAAG,iBAAiB,gBAAgB;CACpC,GAAG,iBAAiB,eAAe;CACnC,GAAG,iBAAiB,YAAY;CAChC,GAAG,iBAAiB,iBAAiB;AACvC,CAAC,CAAC;;;AC9CF,IAAa,uBAAuB,wBAAwB,YAAY,KAAK;CAC3E,MAAM;CACN,cAAc,CAAC,YAAY;CAC3B,UAAU;AACZ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"config-eXB87DOi.js","names":[],"sources":["../../src/components/GrTabPanels/config.ts"],"sourcesContent":["import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\n/**\n * Granular-конфиг семейства `GrTabPanels` (контейнер `GrTabPanels` + панель\n * `GrTabPanel`). Companion к `GrTabs` для ARIA-связки `tab`↔`tabpanel`.\n */\nexport const grTabPanelsConfig = defineGranularComponent(import.meta.url, {\n name: 'GrTabPanels',\n})\n"],"mappings":";;;;;;AAMA,IAAa,oBAAoB,wBAAwB,OAAO,KAAK,KAAK,EACxE,MAAM,cACR,CAAC"}
1
+ {"version":3,"file":"config-eXB87DOi.js","names":[],"sources":["../../src/components/GrTabPanels/config.ts"],"sourcesContent":["import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\n/**\n * Granular-конфиг семейства `GrTabPanels` (контейнер `GrTabPanels` + панель\n * `GrTabPanel`). Companion к `GrTabs` для ARIA-связки `tab`↔`tabpanel`.\n */\nexport const grTabPanelsConfig = defineGranularComponent(import.meta.url, {\n name: 'GrTabPanels',\n})\n"],"mappings":";;;;;;AAMA,IAAa,oBAAoB,wBAAwB,YAAY,KAAK,EACxE,MAAM,cACR,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"config-rLkc9Zn2.js","names":[],"sources":["../../src/components/GrSegmented/grSegmentedStyles.ts","../../src/components/GrSegmented/safelist.ts","../../src/components/GrSegmented/config.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nimport type { Component } from 'vue'\n\nexport type GrSegmentedVariant = 'pills' | 'button'\nexport type GrSegmentedSize = GrComponentSize\n\n/** Направление ряда сегментов. Вертикаль — боковые фильтры. */\nexport const GR_SEGMENTED_ORIENTATIONS = ['horizontal', 'vertical'] as const\nexport type GrSegmentedOrientation = typeof GR_SEGMENTED_ORIENTATIONS[number]\nexport type GrSegmentedValue = string | number\nexport type GrSegmentedOption = {\n value: GrSegmentedValue\n label?: string\n icon?: Component\n disabled?: boolean\n /**\n * Сегмент занят: вместо иконки крутится спиннер, выбор не принимается.\n * От `disabled` отличается смыслом — сегмент доступен, но сейчас работает.\n */\n loading?: boolean\n /**\n * Доступное имя сегмента. Обязательно для icon-only опций: иконка декоративна\n * (`aria-hidden`), и без этого у сегмента нет имени вовсе — скринридер объявит\n * пустую кнопку. Когда есть `label`, имя берётся из него, и поле не нужно.\n */\n ariaLabel?: string\n}\nexport const rootBaseClass\n = 'relative inline-grid min-w-0 items-stretch rounded-[var(--gr-segmented-radius)] p-[var(--gr-segmented-padding)] transition-colors duration-[var(--gr-duration-fast)]'\n\n/** Направление потока: остальную раскладку задают `gridTemplate*` в стиле корня. */\nexport const rootOrientationClassMap: Record<GrSegmentedOrientation, string> = {\n horizontal: 'grid-flow-col',\n vertical: 'grid-flow-row',\n}\nexport const rootVariantClassMap: Record<GrSegmentedVariant, string> = {\n pills: 'border border-[var(--gr-segmented-track-brd)] bg-[var(--gr-segmented-track-bg)] text-[var(--gr-segmented-item-color)]',\n button: 'border border-[var(--gr-segmented-track-brd)] bg-[var(--gr-segmented-track-bg)] text-[var(--gr-segmented-item-color)] shadow-[var(--gr-segmented-track-shadow)]',\n}\nexport const rootBlockClass = 'w-full'\nexport const rootDisabledClass = 'text-[var(--gr-disabled-fg)]'\nexport const indicatorBaseClass\n = 'pointer-events-none absolute left-0 top-0 rounded-[calc(var(--gr-segmented-radius)-var(--gr-segmented-padding))] transition-[transform,width,height,opacity] ease-[var(--gr-ease-out)]'\nexport const indicatorVariantClassMap: Record<GrSegmentedVariant, string> = {\n pills: 'border border-[var(--gr-segmented-indicator-brd)] bg-[var(--gr-segmented-indicator-bg)] shadow-[var(--gr-segmented-indicator-shadow)]',\n button: 'border border-[var(--gr-segmented-indicator-brd)] bg-[var(--gr-segmented-indicator-bg)] shadow-[var(--gr-segmented-indicator-shadow)]',\n}\nexport const itemBaseClass\n = 'group/segmented-item relative z-[1] inline-flex min-h-[var(--gr-segmented-min-height)] min-w-0 items-center justify-center gap-2 rounded-[calc(var(--gr-segmented-radius)-var(--gr-segmented-padding))] px-[var(--gr-segmented-item-px)] py-[var(--gr-segmented-item-py)] text-[length:var(--gr-segmented-font-size)] leading-[var(--gr-segmented-line-height)] font-[var(--gr-segmented-font-weight)] text-[var(--gr-segmented-item-color)] transition-colors duration-[var(--gr-duration-fast)] select-none focus:outline-none focus-visible:shadow-[0_0_0_2px_var(--gr-ring),0_0_0_4px_var(--gr-bg)]'\nexport const itemVariantClassMap: Record<GrSegmentedVariant, string> = {\n pills: '',\n button: '',\n}\nexport const itemSelectedClass = 'text-[var(--gr-segmented-item-selected-color)]'\n/**\n * Недоступный сегмент гасится токеном, а не `opacity`: прозрачность разбавляет\n * выверенные на AA токены текста и роняет контраст подписи.\n */\nexport const itemDisabledClass = 'cursor-not-allowed text-[var(--gr-disabled-fg)]'\nexport const itemEnabledClass = 'cursor-pointer hover:text-[var(--gr-segmented-item-hover-color)]'\nexport const itemLabelClass = 'truncate'\nexport const itemIconClass = 'h-4 w-4 shrink-0'\nexport const itemSpinnerClass = 'h-4 w-4 shrink-0 animate-spin'\nexport const iconOnlyClass = 'gap-0'\nconst rootSizeStyles: Record<GrSegmentedSize, Record<string, string>> = {\n xs: {\n '--gr-segmented-radius': '9999px',\n '--gr-segmented-padding': '4px',\n '--gr-segmented-item-px': '10px',\n '--gr-segmented-item-py': '4px',\n '--gr-segmented-font-size': '0.75rem',\n '--gr-segmented-line-height': '1rem',\n '--gr-segmented-font-weight': '600',\n '--gr-segmented-min-height': '24px',\n },\n sm: {\n '--gr-segmented-radius': '9999px',\n '--gr-segmented-padding': '4px',\n '--gr-segmented-item-px': '12px',\n '--gr-segmented-item-py': '6px',\n '--gr-segmented-font-size': '0.75rem',\n '--gr-segmented-line-height': '1rem',\n '--gr-segmented-font-weight': '600',\n '--gr-segmented-min-height': '28px',\n },\n md: {\n '--gr-segmented-radius': '9999px',\n '--gr-segmented-padding': '4px',\n '--gr-segmented-item-px': '14px',\n '--gr-segmented-item-py': '8px',\n '--gr-segmented-font-size': '0.875rem',\n '--gr-segmented-line-height': '1.25rem',\n '--gr-segmented-font-weight': '600',\n '--gr-segmented-min-height': '40px',\n },\n lg: {\n '--gr-segmented-radius': '9999px',\n '--gr-segmented-padding': '4px',\n '--gr-segmented-item-px': '16px',\n '--gr-segmented-item-py': '10px',\n '--gr-segmented-font-size': '0.9375rem',\n '--gr-segmented-line-height': '1.25rem',\n '--gr-segmented-font-weight': '600',\n '--gr-segmented-min-height': '46px',\n },\n}\nconst rootVariantStyles: Record<GrSegmentedVariant, Record<string, string>> = {\n pills: {\n '--gr-segmented-track-bg': 'var(--gr-muted)',\n '--gr-segmented-track-brd': 'var(--gr-brd)',\n '--gr-segmented-track-shadow': 'none',\n '--gr-segmented-indicator-bg': 'var(--gr-card)',\n '--gr-segmented-indicator-brd': 'color-mix(in srgb, var(--gr-card) 84%, var(--gr-brd) 16%)',\n '--gr-segmented-indicator-shadow': 'var(--gr-shadow-1), var(--gr-segmented-indicator-highlight-shadow, 0 0 0 0 transparent)',\n '--gr-segmented-item-color': 'var(--gr-muted-fg)',\n '--gr-segmented-item-selected-color': 'var(--gr-fg)',\n '--gr-segmented-item-hover-color': 'var(--gr-fg)',\n },\n button: {\n '--gr-segmented-track-bg': 'var(--gr-card)',\n '--gr-segmented-track-brd': 'var(--gr-brd)',\n '--gr-segmented-track-shadow': 'var(--gr-shadow-1)',\n '--gr-segmented-indicator-bg': 'var(--gr-primary)',\n '--gr-segmented-indicator-brd': 'color-mix(in srgb, var(--gr-primary) 88%, var(--gr-brd) 12%)',\n '--gr-segmented-indicator-shadow': 'var(--gr-shadow-2)',\n '--gr-segmented-item-color': 'var(--gr-muted-fg)',\n '--gr-segmented-item-selected-color': 'var(--gr-primary-fg)',\n '--gr-segmented-item-hover-color': 'var(--gr-fg)',\n },\n}\nexport function grSegmentedRootClass(options: {\n variant: GrSegmentedVariant\n orientation: GrSegmentedOrientation\n block: boolean\n disabled: boolean\n}): string {\n return [\n rootBaseClass,\n rootOrientationClassMap[options.orientation],\n rootVariantClassMap[options.variant],\n options.block ? rootBlockClass : '',\n options.disabled ? rootDisabledClass : '',\n ].filter(Boolean).join(' ')\n}\n/**\n * Радиус дорожки в вертикали — пилюля **одной строки**, а не всей колонки.\n * `9999px` выверен под короткий горизонтальный ряд; на высокой колонке он\n * превращает дорожку в эллипс. Формула повторяет высоту сегмента, поэтому\n * скругление у колонки ровно такое же, как у ряда, и сегменты внутри остаются\n * пилюлями: они считают свой радиус от этого же значения.\n */\nconst verticalRadiusStyle = {\n '--gr-segmented-radius': 'calc(var(--gr-segmented-min-height) / 2 + var(--gr-segmented-padding))',\n}\n\nexport function grSegmentedRootStyle(options: {\n variant: GrSegmentedVariant\n size: GrSegmentedSize\n orientation: GrSegmentedOrientation\n}): Record<string, string> {\n return {\n ...rootSizeStyles[options.size],\n ...rootVariantStyles[options.variant],\n ...(options.orientation === 'vertical' ? verticalRadiusStyle : {}),\n }\n}\nexport function grSegmentedIndicatorClass(variant: GrSegmentedVariant): string {\n return [indicatorBaseClass, indicatorVariantClassMap[variant]].join(' ')\n}\nexport function grSegmentedItemClass(options: {\n variant: GrSegmentedVariant\n selected: boolean\n disabled: boolean\n iconOnly: boolean\n}): string {\n return [\n itemBaseClass,\n itemVariantClassMap[options.variant],\n options.selected ? itemSelectedClass : '',\n options.disabled ? itemDisabledClass : itemEnabledClass,\n options.iconOnly ? iconOnlyClass : '',\n ].filter(Boolean).join(' ')\n}\nexport const grSegmentedItemLabelClass = itemLabelClass\nexport const grSegmentedItemIconClass = itemIconClass\nexport const grSegmentedItemSpinnerClass = itemSpinnerClass\n","import { splitClassTokens } from '../shared/classTokens'\nimport {\n iconOnlyClass,\n indicatorBaseClass,\n indicatorVariantClassMap,\n itemBaseClass,\n itemDisabledClass,\n itemEnabledClass,\n itemIconClass,\n itemLabelClass,\n itemSpinnerClass,\n itemSelectedClass,\n itemVariantClassMap,\n rootBaseClass,\n rootBlockClass,\n rootDisabledClass,\n rootOrientationClassMap,\n rootVariantClassMap,\n} from './grSegmentedStyles'\n\nexport const grSegmentedClassTokens = {\n rootBaseClass: splitClassTokens(rootBaseClass),\n rootOrientationClassMap: Object.values(rootOrientationClassMap).flatMap(splitClassTokens),\n rootVariantClassMap: Object.values(rootVariantClassMap).flatMap(splitClassTokens),\n rootBlockClass: splitClassTokens(rootBlockClass),\n rootDisabledClass: splitClassTokens(rootDisabledClass),\n indicatorBaseClass: splitClassTokens(indicatorBaseClass),\n indicatorVariantClassMap: Object.values(indicatorVariantClassMap).flatMap(splitClassTokens),\n itemBaseClass: splitClassTokens(itemBaseClass),\n itemVariantClassMap: Object.values(itemVariantClassMap).flatMap(splitClassTokens),\n itemSelectedClass: splitClassTokens(itemSelectedClass),\n itemDisabledClass: splitClassTokens(itemDisabledClass),\n itemEnabledClass: splitClassTokens(itemEnabledClass),\n itemLabelClass: splitClassTokens(itemLabelClass),\n itemIconClass: splitClassTokens(itemIconClass),\n itemSpinnerClass: splitClassTokens(itemSpinnerClass),\n iconOnlyClass: splitClassTokens(iconOnlyClass),\n} as const\n\nexport const grSegmentedSafelist = [...new Set([\n ...grSegmentedClassTokens.rootBaseClass,\n ...grSegmentedClassTokens.rootOrientationClassMap,\n ...grSegmentedClassTokens.rootVariantClassMap,\n ...grSegmentedClassTokens.rootBlockClass,\n ...grSegmentedClassTokens.rootDisabledClass,\n ...grSegmentedClassTokens.indicatorBaseClass,\n ...grSegmentedClassTokens.indicatorVariantClassMap,\n ...grSegmentedClassTokens.itemBaseClass,\n ...grSegmentedClassTokens.itemVariantClassMap,\n ...grSegmentedClassTokens.itemSelectedClass,\n ...grSegmentedClassTokens.itemDisabledClass,\n ...grSegmentedClassTokens.itemEnabledClass,\n ...grSegmentedClassTokens.itemLabelClass,\n ...grSegmentedClassTokens.itemIconClass,\n ...grSegmentedClassTokens.itemSpinnerClass,\n ...grSegmentedClassTokens.iconOnlyClass,\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grSegmentedSafelist } from './safelist'\n\nexport const grSegmentedConfig = defineGranularComponent(import.meta.url, {\n name: 'GrSegmented',\n safelist: grSegmentedSafelist,\n tokenDefinitions: {\n light: {\n selector: ':root',\n tokens: { 'gr-segmented-indicator-highlight-shadow': '0 0 0 0 transparent' },\n },\n dark: {\n selector: '.dark',\n tokens: { 'gr-segmented-indicator-highlight-shadow': '0 0 0 1px rgba(248, 250, 252, 0.08)' },\n },\n },\n})\n"],"mappings":";;;AA4BA,IAAa,gBACT;;AAGJ,IAAa,0BAAkE;CAC7E,YAAY;CACZ,UAAU;AACZ;AACA,IAAa,sBAA0D;CACrE,OAAO;CACP,QAAQ;AACV;AACA,IAAa,iBAAiB;AAC9B,IAAa,oBAAoB;AACjC,IAAa,qBACT;AACJ,IAAa,2BAA+D;CAC1E,OAAO;CACP,QAAQ;AACV;AACA,IAAa,gBACT;AACJ,IAAa,sBAA0D;CACrE,OAAO;CACP,QAAQ;AACV;AACA,IAAa,oBAAoB;;;;;AAKjC,IAAa,oBAAoB;AACjC,IAAa,mBAAmB;AAChC,IAAa,iBAAiB;AAC9B,IAAa,gBAAgB;AAC7B,IAAa,mBAAmB;AAChC,IAAa,gBAAgB;AAC7B,IAAM,iBAAkE;CACtE,IAAI;EACF,yBAAyB;EACzB,0BAA0B;EAC1B,0BAA0B;EAC1B,0BAA0B;EAC1B,4BAA4B;EAC5B,8BAA8B;EAC9B,8BAA8B;EAC9B,6BAA6B;CAC/B;CACA,IAAI;EACF,yBAAyB;EACzB,0BAA0B;EAC1B,0BAA0B;EAC1B,0BAA0B;EAC1B,4BAA4B;EAC5B,8BAA8B;EAC9B,8BAA8B;EAC9B,6BAA6B;CAC/B;CACA,IAAI;EACF,yBAAyB;EACzB,0BAA0B;EAC1B,0BAA0B;EAC1B,0BAA0B;EAC1B,4BAA4B;EAC5B,8BAA8B;EAC9B,8BAA8B;EAC9B,6BAA6B;CAC/B;CACA,IAAI;EACF,yBAAyB;EACzB,0BAA0B;EAC1B,0BAA0B;EAC1B,0BAA0B;EAC1B,4BAA4B;EAC5B,8BAA8B;EAC9B,8BAA8B;EAC9B,6BAA6B;CAC/B;AACF;AACA,IAAM,oBAAwE;CAC5E,OAAO;EACL,2BAA2B;EAC3B,4BAA4B;EAC5B,+BAA+B;EAC/B,+BAA+B;EAC/B,gCAAgC;EAChC,mCAAmC;EACnC,6BAA6B;EAC7B,sCAAsC;EACtC,mCAAmC;CACrC;CACA,QAAQ;EACN,2BAA2B;EAC3B,4BAA4B;EAC5B,+BAA+B;EAC/B,+BAA+B;EAC/B,gCAAgC;EAChC,mCAAmC;EACnC,6BAA6B;EAC7B,sCAAsC;EACtC,mCAAmC;CACrC;AACF;AACA,SAAgB,qBAAqB,SAK1B;CACT,OAAO;EACL;EACA,wBAAwB,QAAQ;EAChC,oBAAoB,QAAQ;EAC5B,QAAQ,QAAQ,iBAAiB;EACjC,QAAQ,WAAW,oBAAoB;CACzC,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AAC5B;;;;;;;;AAQA,IAAM,sBAAsB,EAC1B,yBAAyB,yEAC3B;AAEA,SAAgB,qBAAqB,SAIV;CACzB,OAAO;EACL,GAAG,eAAe,QAAQ;EAC1B,GAAG,kBAAkB,QAAQ;EAC7B,GAAI,QAAQ,gBAAgB,aAAa,sBAAsB,CAAC;CAClE;AACF;AACA,SAAgB,0BAA0B,SAAqC;CAC7E,OAAO,CAAC,oBAAoB,yBAAyB,QAAQ,CAAC,CAAC,KAAK,GAAG;AACzE;AACA,SAAgB,qBAAqB,SAK1B;CACT,OAAO;EACL;EACA,oBAAoB,QAAQ;EAC5B,QAAQ,WAAW,oBAAoB;EACvC,QAAQ,WAAW,oBAAoB;EACvC,QAAQ,WAAW,gBAAgB;CACrC,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AAC5B;AACA,IAAa,4BAA4B;AACzC,IAAa,2BAA2B;AACxC,IAAa,8BAA8B;;;ACtK3C,IAAa,yBAAyB;CACpC,eAAe,iBAAiB,aAAa;CAC7C,yBAAyB,OAAO,OAAO,uBAAuB,CAAC,CAAC,QAAQ,gBAAgB;CACxF,qBAAqB,OAAO,OAAO,mBAAmB,CAAC,CAAC,QAAQ,gBAAgB;CAChF,gBAAgB,iBAAiB,cAAc;CAC/C,mBAAmB,iBAAiB,iBAAiB;CACrD,oBAAoB,iBAAiB,kBAAkB;CACvD,0BAA0B,OAAO,OAAO,wBAAwB,CAAC,CAAC,QAAQ,gBAAgB;CAC1F,eAAe,iBAAiB,aAAa;CAC7C,qBAAqB,OAAO,OAAO,mBAAmB,CAAC,CAAC,QAAQ,gBAAgB;CAChF,mBAAmB,iBAAiB,iBAAiB;CACrD,mBAAmB,iBAAiB,iBAAiB;CACrD,kBAAkB,iBAAiB,gBAAgB;CACnD,gBAAgB,iBAAiB,cAAc;CAC/C,eAAe,iBAAiB,aAAa;CAC7C,kBAAkB,iBAAiB,gBAAgB;CACnD,eAAe,iBAAiB,aAAa;AAC/C;AAEA,IAAa,sBAAsB,CAAC,mBAAG,IAAI,IAAI;CAC7C,GAAG,uBAAuB;CAC1B,GAAG,uBAAuB;CAC1B,GAAG,uBAAuB;CAC1B,GAAG,uBAAuB;CAC1B,GAAG,uBAAuB;CAC1B,GAAG,uBAAuB;CAC1B,GAAG,uBAAuB;CAC1B,GAAG,uBAAuB;CAC1B,GAAG,uBAAuB;CAC1B,GAAG,uBAAuB;CAC1B,GAAG,uBAAuB;CAC1B,GAAG,uBAAuB;CAC1B,GAAG,uBAAuB;CAC1B,GAAG,uBAAuB;CAC1B,GAAG,uBAAuB;CAC1B,GAAG,uBAAuB;AAC5B,CAAC,CAAC;;;ACpDF,IAAa,oBAAoB,wBAAwB,OAAO,KAAK,KAAK;CACxE,MAAM;CACN,UAAU;CACV,kBAAkB;EAChB,OAAO;GACL,UAAU;GACV,QAAQ,EAAE,2CAA2C,sBAAsB;EAC7E;EACA,MAAM;GACJ,UAAU;GACV,QAAQ,EAAE,2CAA2C,sCAAsC;EAC7F;CACF;AACF,CAAC"}
1
+ {"version":3,"file":"config-rLkc9Zn2.js","names":[],"sources":["../../src/components/GrSegmented/grSegmentedStyles.ts","../../src/components/GrSegmented/safelist.ts","../../src/components/GrSegmented/config.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nimport type { Component } from 'vue'\n\nexport type GrSegmentedVariant = 'pills' | 'button'\nexport type GrSegmentedSize = GrComponentSize\n\n/** Направление ряда сегментов. Вертикаль — боковые фильтры. */\nexport const GR_SEGMENTED_ORIENTATIONS = ['horizontal', 'vertical'] as const\nexport type GrSegmentedOrientation = typeof GR_SEGMENTED_ORIENTATIONS[number]\nexport type GrSegmentedValue = string | number\nexport type GrSegmentedOption = {\n value: GrSegmentedValue\n label?: string\n icon?: Component\n disabled?: boolean\n /**\n * Сегмент занят: вместо иконки крутится спиннер, выбор не принимается.\n * От `disabled` отличается смыслом — сегмент доступен, но сейчас работает.\n */\n loading?: boolean\n /**\n * Доступное имя сегмента. Обязательно для icon-only опций: иконка декоративна\n * (`aria-hidden`), и без этого у сегмента нет имени вовсе — скринридер объявит\n * пустую кнопку. Когда есть `label`, имя берётся из него, и поле не нужно.\n */\n ariaLabel?: string\n}\nexport const rootBaseClass\n = 'relative inline-grid min-w-0 items-stretch rounded-[var(--gr-segmented-radius)] p-[var(--gr-segmented-padding)] transition-colors duration-[var(--gr-duration-fast)]'\n\n/** Направление потока: остальную раскладку задают `gridTemplate*` в стиле корня. */\nexport const rootOrientationClassMap: Record<GrSegmentedOrientation, string> = {\n horizontal: 'grid-flow-col',\n vertical: 'grid-flow-row',\n}\nexport const rootVariantClassMap: Record<GrSegmentedVariant, string> = {\n pills: 'border border-[var(--gr-segmented-track-brd)] bg-[var(--gr-segmented-track-bg)] text-[var(--gr-segmented-item-color)]',\n button: 'border border-[var(--gr-segmented-track-brd)] bg-[var(--gr-segmented-track-bg)] text-[var(--gr-segmented-item-color)] shadow-[var(--gr-segmented-track-shadow)]',\n}\nexport const rootBlockClass = 'w-full'\nexport const rootDisabledClass = 'text-[var(--gr-disabled-fg)]'\nexport const indicatorBaseClass\n = 'pointer-events-none absolute left-0 top-0 rounded-[calc(var(--gr-segmented-radius)-var(--gr-segmented-padding))] transition-[transform,width,height,opacity] ease-[var(--gr-ease-out)]'\nexport const indicatorVariantClassMap: Record<GrSegmentedVariant, string> = {\n pills: 'border border-[var(--gr-segmented-indicator-brd)] bg-[var(--gr-segmented-indicator-bg)] shadow-[var(--gr-segmented-indicator-shadow)]',\n button: 'border border-[var(--gr-segmented-indicator-brd)] bg-[var(--gr-segmented-indicator-bg)] shadow-[var(--gr-segmented-indicator-shadow)]',\n}\nexport const itemBaseClass\n = 'group/segmented-item relative z-[1] inline-flex min-h-[var(--gr-segmented-min-height)] min-w-0 items-center justify-center gap-2 rounded-[calc(var(--gr-segmented-radius)-var(--gr-segmented-padding))] px-[var(--gr-segmented-item-px)] py-[var(--gr-segmented-item-py)] text-[length:var(--gr-segmented-font-size)] leading-[var(--gr-segmented-line-height)] font-[var(--gr-segmented-font-weight)] text-[var(--gr-segmented-item-color)] transition-colors duration-[var(--gr-duration-fast)] select-none focus:outline-none focus-visible:shadow-[0_0_0_2px_var(--gr-ring),0_0_0_4px_var(--gr-bg)]'\nexport const itemVariantClassMap: Record<GrSegmentedVariant, string> = {\n pills: '',\n button: '',\n}\nexport const itemSelectedClass = 'text-[var(--gr-segmented-item-selected-color)]'\n/**\n * Недоступный сегмент гасится токеном, а не `opacity`: прозрачность разбавляет\n * выверенные на AA токены текста и роняет контраст подписи.\n */\nexport const itemDisabledClass = 'cursor-not-allowed text-[var(--gr-disabled-fg)]'\nexport const itemEnabledClass = 'cursor-pointer hover:text-[var(--gr-segmented-item-hover-color)]'\nexport const itemLabelClass = 'truncate'\nexport const itemIconClass = 'h-4 w-4 shrink-0'\nexport const itemSpinnerClass = 'h-4 w-4 shrink-0 animate-spin'\nexport const iconOnlyClass = 'gap-0'\nconst rootSizeStyles: Record<GrSegmentedSize, Record<string, string>> = {\n xs: {\n '--gr-segmented-radius': '9999px',\n '--gr-segmented-padding': '4px',\n '--gr-segmented-item-px': '10px',\n '--gr-segmented-item-py': '4px',\n '--gr-segmented-font-size': '0.75rem',\n '--gr-segmented-line-height': '1rem',\n '--gr-segmented-font-weight': '600',\n '--gr-segmented-min-height': '24px',\n },\n sm: {\n '--gr-segmented-radius': '9999px',\n '--gr-segmented-padding': '4px',\n '--gr-segmented-item-px': '12px',\n '--gr-segmented-item-py': '6px',\n '--gr-segmented-font-size': '0.75rem',\n '--gr-segmented-line-height': '1rem',\n '--gr-segmented-font-weight': '600',\n '--gr-segmented-min-height': '28px',\n },\n md: {\n '--gr-segmented-radius': '9999px',\n '--gr-segmented-padding': '4px',\n '--gr-segmented-item-px': '14px',\n '--gr-segmented-item-py': '8px',\n '--gr-segmented-font-size': '0.875rem',\n '--gr-segmented-line-height': '1.25rem',\n '--gr-segmented-font-weight': '600',\n '--gr-segmented-min-height': '40px',\n },\n lg: {\n '--gr-segmented-radius': '9999px',\n '--gr-segmented-padding': '4px',\n '--gr-segmented-item-px': '16px',\n '--gr-segmented-item-py': '10px',\n '--gr-segmented-font-size': '0.9375rem',\n '--gr-segmented-line-height': '1.25rem',\n '--gr-segmented-font-weight': '600',\n '--gr-segmented-min-height': '46px',\n },\n}\nconst rootVariantStyles: Record<GrSegmentedVariant, Record<string, string>> = {\n pills: {\n '--gr-segmented-track-bg': 'var(--gr-muted)',\n '--gr-segmented-track-brd': 'var(--gr-brd)',\n '--gr-segmented-track-shadow': 'none',\n '--gr-segmented-indicator-bg': 'var(--gr-card)',\n '--gr-segmented-indicator-brd': 'color-mix(in srgb, var(--gr-card) 84%, var(--gr-brd) 16%)',\n '--gr-segmented-indicator-shadow': 'var(--gr-shadow-1), var(--gr-segmented-indicator-highlight-shadow, 0 0 0 0 transparent)',\n '--gr-segmented-item-color': 'var(--gr-muted-fg)',\n '--gr-segmented-item-selected-color': 'var(--gr-fg)',\n '--gr-segmented-item-hover-color': 'var(--gr-fg)',\n },\n button: {\n '--gr-segmented-track-bg': 'var(--gr-card)',\n '--gr-segmented-track-brd': 'var(--gr-brd)',\n '--gr-segmented-track-shadow': 'var(--gr-shadow-1)',\n '--gr-segmented-indicator-bg': 'var(--gr-primary)',\n '--gr-segmented-indicator-brd': 'color-mix(in srgb, var(--gr-primary) 88%, var(--gr-brd) 12%)',\n '--gr-segmented-indicator-shadow': 'var(--gr-shadow-2)',\n '--gr-segmented-item-color': 'var(--gr-muted-fg)',\n '--gr-segmented-item-selected-color': 'var(--gr-primary-fg)',\n '--gr-segmented-item-hover-color': 'var(--gr-fg)',\n },\n}\nexport function grSegmentedRootClass(options: {\n variant: GrSegmentedVariant\n orientation: GrSegmentedOrientation\n block: boolean\n disabled: boolean\n}): string {\n return [\n rootBaseClass,\n rootOrientationClassMap[options.orientation],\n rootVariantClassMap[options.variant],\n options.block ? rootBlockClass : '',\n options.disabled ? rootDisabledClass : '',\n ].filter(Boolean).join(' ')\n}\n/**\n * Радиус дорожки в вертикали — пилюля **одной строки**, а не всей колонки.\n * `9999px` выверен под короткий горизонтальный ряд; на высокой колонке он\n * превращает дорожку в эллипс. Формула повторяет высоту сегмента, поэтому\n * скругление у колонки ровно такое же, как у ряда, и сегменты внутри остаются\n * пилюлями: они считают свой радиус от этого же значения.\n */\nconst verticalRadiusStyle = {\n '--gr-segmented-radius': 'calc(var(--gr-segmented-min-height) / 2 + var(--gr-segmented-padding))',\n}\n\nexport function grSegmentedRootStyle(options: {\n variant: GrSegmentedVariant\n size: GrSegmentedSize\n orientation: GrSegmentedOrientation\n}): Record<string, string> {\n return {\n ...rootSizeStyles[options.size],\n ...rootVariantStyles[options.variant],\n ...(options.orientation === 'vertical' ? verticalRadiusStyle : {}),\n }\n}\nexport function grSegmentedIndicatorClass(variant: GrSegmentedVariant): string {\n return [indicatorBaseClass, indicatorVariantClassMap[variant]].join(' ')\n}\nexport function grSegmentedItemClass(options: {\n variant: GrSegmentedVariant\n selected: boolean\n disabled: boolean\n iconOnly: boolean\n}): string {\n return [\n itemBaseClass,\n itemVariantClassMap[options.variant],\n options.selected ? itemSelectedClass : '',\n options.disabled ? itemDisabledClass : itemEnabledClass,\n options.iconOnly ? iconOnlyClass : '',\n ].filter(Boolean).join(' ')\n}\nexport const grSegmentedItemLabelClass = itemLabelClass\nexport const grSegmentedItemIconClass = itemIconClass\nexport const grSegmentedItemSpinnerClass = itemSpinnerClass\n","import { splitClassTokens } from '../shared/classTokens'\nimport {\n iconOnlyClass,\n indicatorBaseClass,\n indicatorVariantClassMap,\n itemBaseClass,\n itemDisabledClass,\n itemEnabledClass,\n itemIconClass,\n itemLabelClass,\n itemSpinnerClass,\n itemSelectedClass,\n itemVariantClassMap,\n rootBaseClass,\n rootBlockClass,\n rootDisabledClass,\n rootOrientationClassMap,\n rootVariantClassMap,\n} from './grSegmentedStyles'\n\nexport const grSegmentedClassTokens = {\n rootBaseClass: splitClassTokens(rootBaseClass),\n rootOrientationClassMap: Object.values(rootOrientationClassMap).flatMap(splitClassTokens),\n rootVariantClassMap: Object.values(rootVariantClassMap).flatMap(splitClassTokens),\n rootBlockClass: splitClassTokens(rootBlockClass),\n rootDisabledClass: splitClassTokens(rootDisabledClass),\n indicatorBaseClass: splitClassTokens(indicatorBaseClass),\n indicatorVariantClassMap: Object.values(indicatorVariantClassMap).flatMap(splitClassTokens),\n itemBaseClass: splitClassTokens(itemBaseClass),\n itemVariantClassMap: Object.values(itemVariantClassMap).flatMap(splitClassTokens),\n itemSelectedClass: splitClassTokens(itemSelectedClass),\n itemDisabledClass: splitClassTokens(itemDisabledClass),\n itemEnabledClass: splitClassTokens(itemEnabledClass),\n itemLabelClass: splitClassTokens(itemLabelClass),\n itemIconClass: splitClassTokens(itemIconClass),\n itemSpinnerClass: splitClassTokens(itemSpinnerClass),\n iconOnlyClass: splitClassTokens(iconOnlyClass),\n} as const\n\nexport const grSegmentedSafelist = [...new Set([\n ...grSegmentedClassTokens.rootBaseClass,\n ...grSegmentedClassTokens.rootOrientationClassMap,\n ...grSegmentedClassTokens.rootVariantClassMap,\n ...grSegmentedClassTokens.rootBlockClass,\n ...grSegmentedClassTokens.rootDisabledClass,\n ...grSegmentedClassTokens.indicatorBaseClass,\n ...grSegmentedClassTokens.indicatorVariantClassMap,\n ...grSegmentedClassTokens.itemBaseClass,\n ...grSegmentedClassTokens.itemVariantClassMap,\n ...grSegmentedClassTokens.itemSelectedClass,\n ...grSegmentedClassTokens.itemDisabledClass,\n ...grSegmentedClassTokens.itemEnabledClass,\n ...grSegmentedClassTokens.itemLabelClass,\n ...grSegmentedClassTokens.itemIconClass,\n ...grSegmentedClassTokens.itemSpinnerClass,\n ...grSegmentedClassTokens.iconOnlyClass,\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grSegmentedSafelist } from './safelist'\n\nexport const grSegmentedConfig = defineGranularComponent(import.meta.url, {\n name: 'GrSegmented',\n safelist: grSegmentedSafelist,\n tokenDefinitions: {\n light: {\n selector: ':root',\n tokens: { 'gr-segmented-indicator-highlight-shadow': '0 0 0 0 transparent' },\n },\n dark: {\n selector: '.dark',\n tokens: { 'gr-segmented-indicator-highlight-shadow': '0 0 0 1px rgba(248, 250, 252, 0.08)' },\n },\n },\n})\n"],"mappings":";;;AA4BA,IAAa,gBACT;;AAGJ,IAAa,0BAAkE;CAC7E,YAAY;CACZ,UAAU;AACZ;AACA,IAAa,sBAA0D;CACrE,OAAO;CACP,QAAQ;AACV;AACA,IAAa,iBAAiB;AAC9B,IAAa,oBAAoB;AACjC,IAAa,qBACT;AACJ,IAAa,2BAA+D;CAC1E,OAAO;CACP,QAAQ;AACV;AACA,IAAa,gBACT;AACJ,IAAa,sBAA0D;CACrE,OAAO;CACP,QAAQ;AACV;AACA,IAAa,oBAAoB;;;;;AAKjC,IAAa,oBAAoB;AACjC,IAAa,mBAAmB;AAChC,IAAa,iBAAiB;AAC9B,IAAa,gBAAgB;AAC7B,IAAa,mBAAmB;AAChC,IAAa,gBAAgB;AAC7B,IAAM,iBAAkE;CACtE,IAAI;EACF,yBAAyB;EACzB,0BAA0B;EAC1B,0BAA0B;EAC1B,0BAA0B;EAC1B,4BAA4B;EAC5B,8BAA8B;EAC9B,8BAA8B;EAC9B,6BAA6B;CAC/B;CACA,IAAI;EACF,yBAAyB;EACzB,0BAA0B;EAC1B,0BAA0B;EAC1B,0BAA0B;EAC1B,4BAA4B;EAC5B,8BAA8B;EAC9B,8BAA8B;EAC9B,6BAA6B;CAC/B;CACA,IAAI;EACF,yBAAyB;EACzB,0BAA0B;EAC1B,0BAA0B;EAC1B,0BAA0B;EAC1B,4BAA4B;EAC5B,8BAA8B;EAC9B,8BAA8B;EAC9B,6BAA6B;CAC/B;CACA,IAAI;EACF,yBAAyB;EACzB,0BAA0B;EAC1B,0BAA0B;EAC1B,0BAA0B;EAC1B,4BAA4B;EAC5B,8BAA8B;EAC9B,8BAA8B;EAC9B,6BAA6B;CAC/B;AACF;AACA,IAAM,oBAAwE;CAC5E,OAAO;EACL,2BAA2B;EAC3B,4BAA4B;EAC5B,+BAA+B;EAC/B,+BAA+B;EAC/B,gCAAgC;EAChC,mCAAmC;EACnC,6BAA6B;EAC7B,sCAAsC;EACtC,mCAAmC;CACrC;CACA,QAAQ;EACN,2BAA2B;EAC3B,4BAA4B;EAC5B,+BAA+B;EAC/B,+BAA+B;EAC/B,gCAAgC;EAChC,mCAAmC;EACnC,6BAA6B;EAC7B,sCAAsC;EACtC,mCAAmC;CACrC;AACF;AACA,SAAgB,qBAAqB,SAK1B;CACT,OAAO;EACL;EACA,wBAAwB,QAAQ;EAChC,oBAAoB,QAAQ;EAC5B,QAAQ,QAAQ,iBAAiB;EACjC,QAAQ,WAAW,oBAAoB;CACzC,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AAC5B;;;;;;;;AAQA,IAAM,sBAAsB,EAC1B,yBAAyB,yEAC3B;AAEA,SAAgB,qBAAqB,SAIV;CACzB,OAAO;EACL,GAAG,eAAe,QAAQ;EAC1B,GAAG,kBAAkB,QAAQ;EAC7B,GAAI,QAAQ,gBAAgB,aAAa,sBAAsB,CAAC;CAClE;AACF;AACA,SAAgB,0BAA0B,SAAqC;CAC7E,OAAO,CAAC,oBAAoB,yBAAyB,QAAQ,CAAC,CAAC,KAAK,GAAG;AACzE;AACA,SAAgB,qBAAqB,SAK1B;CACT,OAAO;EACL;EACA,oBAAoB,QAAQ;EAC5B,QAAQ,WAAW,oBAAoB;EACvC,QAAQ,WAAW,oBAAoB;EACvC,QAAQ,WAAW,gBAAgB;CACrC,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AAC5B;AACA,IAAa,4BAA4B;AACzC,IAAa,2BAA2B;AACxC,IAAa,8BAA8B;;;ACtK3C,IAAa,yBAAyB;CACpC,eAAe,iBAAiB,aAAa;CAC7C,yBAAyB,OAAO,OAAO,uBAAuB,CAAC,CAAC,QAAQ,gBAAgB;CACxF,qBAAqB,OAAO,OAAO,mBAAmB,CAAC,CAAC,QAAQ,gBAAgB;CAChF,gBAAgB,iBAAiB,cAAc;CAC/C,mBAAmB,iBAAiB,iBAAiB;CACrD,oBAAoB,iBAAiB,kBAAkB;CACvD,0BAA0B,OAAO,OAAO,wBAAwB,CAAC,CAAC,QAAQ,gBAAgB;CAC1F,eAAe,iBAAiB,aAAa;CAC7C,qBAAqB,OAAO,OAAO,mBAAmB,CAAC,CAAC,QAAQ,gBAAgB;CAChF,mBAAmB,iBAAiB,iBAAiB;CACrD,mBAAmB,iBAAiB,iBAAiB;CACrD,kBAAkB,iBAAiB,gBAAgB;CACnD,gBAAgB,iBAAiB,cAAc;CAC/C,eAAe,iBAAiB,aAAa;CAC7C,kBAAkB,iBAAiB,gBAAgB;CACnD,eAAe,iBAAiB,aAAa;AAC/C;AAEA,IAAa,sBAAsB,CAAC,mBAAG,IAAI,IAAI;CAC7C,GAAG,uBAAuB;CAC1B,GAAG,uBAAuB;CAC1B,GAAG,uBAAuB;CAC1B,GAAG,uBAAuB;CAC1B,GAAG,uBAAuB;CAC1B,GAAG,uBAAuB;CAC1B,GAAG,uBAAuB;CAC1B,GAAG,uBAAuB;CAC1B,GAAG,uBAAuB;CAC1B,GAAG,uBAAuB;CAC1B,GAAG,uBAAuB;CAC1B,GAAG,uBAAuB;CAC1B,GAAG,uBAAuB;CAC1B,GAAG,uBAAuB;CAC1B,GAAG,uBAAuB;CAC1B,GAAG,uBAAuB;AAC5B,CAAC,CAAC;;;ACpDF,IAAa,oBAAoB,wBAAwB,YAAY,KAAK;CACxE,MAAM;CACN,UAAU;CACV,kBAAkB;EAChB,OAAO;GACL,UAAU;GACV,QAAQ,EAAE,2CAA2C,sBAAsB;EAC7E;EACA,MAAM;GACJ,UAAU;GACV,QAAQ,EAAE,2CAA2C,sCAAsC;EAC7F;CACF;AACF,CAAC"}
@@ -79,7 +79,7 @@ function useGrComponentSize(localSize, options = {}) {
79
79
  const fromConfig = (component ? config.componentDefaults.value[component]?.size : void 0) ?? config.size.value;
80
80
  if (fromConfig === void 0) return fallback;
81
81
  if (supported && !supported.includes(fromConfig)) {
82
- if (typeof process !== "undefined" && process.env.NODE_ENV !== "production") warnUnsupportedSize(fromConfig, supported);
82
+ if (process.env.NODE_ENV !== "production") warnUnsupportedSize(fromConfig, supported);
83
83
  return fallback;
84
84
  }
85
85
  return fromConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"context-CTbuwcYs.js","names":[],"sources":["../../src/components/GrConfigProvider/context.ts"],"sourcesContent":["import { computed, getCurrentInstance, inject, type ComputedRef, type InjectionKey } from 'vue'\n\nimport type { GrComponentDefaultsRegistry } from '../../composables/useGrComponentConfig'\n\n/**\n * Контекст `GrConfigProvider` — глобальные дефолты для вложенных GR-компонентов:\n * размер контролов и per-component дефолтные пропсы.\n *\n * Компоненты читают его через {@link useGrConfig} (или хелперы ниже) и используют\n * как fallback, когда соответствующий проп не задан на самом компоненте. Провайдер\n * можно вкладывать — дочерний мержится поверх родительского.\n */\n\n/**\n * Размеры, которыми оперирует провайдер. Это «размеры контролов» — общий\n * знаменатель формных компонентов, а не объединение всех size-шкал пакета\n * (у оверлеев есть свои `xl`/`full`, у слайдера нет `xs`).\n */\nexport const GR_COMPONENT_SIZES = ['xs', 'sm', 'md', 'lg'] as const\n\nexport type GrComponentSize = typeof GR_COMPONENT_SIZES[number]\n\n/**\n * Реестр компонентов с настраиваемыми через конфиг пропами.\n *\n * Объявлен в `composables/useGrComponentConfig` — там же, куда его дополняют\n * и компоненты пакета, и companion-пакеты. Здесь только реэкспорт для тех, кто\n * работает с контекстом провайдера напрямую.\n */\nexport type { GrComponentDefaultsRegistry }\n\n/** Имя компонента, у которого есть настраиваемые через конфиг пропы. */\nexport type GrConfigurableComponent = keyof GrComponentDefaultsRegistry\n\n/**\n * Дефолтные пропсы по имени компонента: `{ GrButton: { variant: 'secondary' } }`.\n *\n * Набор ключей закрыт реестром, а не `Record<string, unknown>`: через конфиг\n * должны настраиваться только «оформительские» пропы. Пустить туда что угодно —\n * значит разрешить задать глобальный `modelValue` или обработчик и получить баг,\n * который ищется часами.\n */\nexport type GrComponentDefaults = {\n [TComponent in GrConfigurableComponent]?: Partial<GrComponentDefaultsRegistry[TComponent]>\n}\n\ntype GrDefaultsOf<TComponent extends GrConfigurableComponent> = Partial<GrComponentDefaultsRegistry[TComponent]>\n\nexport interface GrConfigContext {\n /** Дефолтный размер контролов (если проп `size` не задан на компоненте). */\n size: ComputedRef<GrComponentSize | undefined>\n /** Дефолтные пропсы по компонентам. */\n componentDefaults: ComputedRef<GrComponentDefaults>\n /**\n * Тема поддерева (`data-theme`). Необязательна: тип публичный, и контекст\n * строят руками — например хост императивных диалогов.\n */\n theme?: ComputedRef<string | undefined>\n /**\n * Куда монтируются оверлеи поддерева (`usePortalTarget`). Необязательно, как\n * и `theme`: контекст строят руками — например хост императивных диалогов.\n */\n portalTarget?: ComputedRef<string | HTMLElement | undefined>\n}\n\nexport const GR_CONFIG_KEY: InjectionKey<GrConfigContext> = Symbol('gr-config')\n\n/**\n * Пустой конфиг: когда провайдера в дереве нет, всё разрешается в `undefined`,\n * а компоненты падают на собственные дефолты.\n *\n * `computed` здесь не роскошь: контекст типизирован рефами, и потребитель вправе\n * прогнать `size` через `unref()` или `watch()`. Плоский объект `{ value: … }`\n * не пройдёт проверку `isRef`, и такой код молча получит сам объект вместо\n * значения — поэтому «просто константа» тут не подходит.\n *\n * А вот пустые значения заморожены, и это не педантизм: `computed` без\n * зависимостей вычисляется один раз и отдаёт **один и тот же** объект всем\n * компонентам без провайдера. Незамороженный, он позволил бы одному потребителю\n * записать в него ключ и тем самым подменить дефолты всему приложению.\n */\nconst EMPTY_COMPONENT_DEFAULTS: GrComponentDefaults = Object.freeze({})\n\nconst EMPTY_CONFIG: GrConfigContext = {\n size: computed(() => undefined),\n componentDefaults: computed(() => EMPTY_COMPONENT_DEFAULTS),\n theme: computed(() => undefined),\n portalTarget: computed(() => undefined),\n}\n\n/** Возвращает ближайший `GrConfigProvider` или пустой конфиг, если провайдера нет. */\nexport function useGrConfig(): GrConfigContext {\n return inject(GR_CONFIG_KEY, EMPTY_CONFIG)\n}\n\n/**\n * Источник конфига для {@link resolveGrConfig}: сам контекст, `AppContext` или\n * инстанс компонента — у двух последних читается `provides`.\n */\nexport type GrConfigSource = GrConfigContext | { provides?: Record<symbol | string, unknown> }\n\nfunction isGrConfigContext(source: unknown): source is GrConfigContext {\n return typeof (source as GrConfigContext | null)?.componentDefaults?.value === 'object'\n}\n\n/**\n * Конфиг там, где `inject` недоступен — вне `setup`: в директивах, императивных\n * сервисах, утилитах. Порядок: явный контекст → `provides` источника → `inject`\n * (если есть активный инстанс) → пустой конфиг.\n *\n * Важно понимать границу: `provides` у `AppContext` содержит только то, что\n * роздано через `app.provide()`. Значения от `<GrConfigProvider>` живут в дереве\n * компонентов, и достать их можно лишь оттуда, где это дерево ещё есть — то есть\n * захватом в `setup`. Просто передать `appContext` в отрыве от дерева\n * недостаточно; см. `SPEC-GrConfig-resolver.md`.\n */\nexport function resolveGrConfig(source?: GrConfigSource | null): GrConfigContext {\n if (isGrConfigContext(source))\n return source\n\n const provides = source?.provides\n if (provides) {\n const fromProvides = provides[GR_CONFIG_KEY as symbol] as GrConfigContext | undefined\n return isGrConfigContext(fromProvides) ? fromProvides : EMPTY_CONFIG\n }\n\n if (getCurrentInstance())\n return inject(GR_CONFIG_KEY, EMPTY_CONFIG)\n\n return EMPTY_CONFIG\n}\n\nexport type UseGrComponentSizeOptions<TSize extends string> = {\n /**\n * Имя компонента, чтобы учесть точечный `componentDefaults[Component].size`.\n * Без него читается только глобальный `size` провайдера.\n */\n component?: GrConfigurableComponent\n /** Размер, когда ни проп, ни конфиг ничего не дали. По умолчанию `md`. */\n fallback?: TSize\n /**\n * Размеры, которые компонент реально умеет. Значение из конфига вне этого\n * списка игнорируется в пользу `fallback`.\n *\n * Обязателен для компонентов, у которых size-шкала уже общей (`GrSlider`,\n * `GrRating`, `GrSwitch`, `GrLink`, `GrStatistic` не знают про `xs`): без него\n * `<GrConfigProvider size=\"xs\">` дал бы `sizeMap['xs'] === undefined`, то есть\n * компонент без размерных классов — молча, без ошибки сборки.\n */\n supported?: readonly TSize[]\n}\n\n// Предупреждаем один раз на уникальную пару «размер + список поддерживаемых»,\n// иначе список из сотни контролов зальёт консоль одинаковыми сообщениями.\nconst warnedUnsupportedSizes = new Set<string>()\n\n/** Сброс дедупликации предупреждений. Внутреннее API — нужно тестам. */\nexport function resetUnsupportedSizeWarnings(): void {\n warnedUnsupportedSizes.clear()\n}\n\nfunction warnUnsupportedSize(size: string, supported: readonly string[]): void {\n const key = `${size}|${supported.join(',')}`\n if (warnedUnsupportedSizes.has(key))\n return\n warnedUnsupportedSizes.add(key)\n\n console.warn(\n `[granularity] GrConfigProvider size=\"${size}\" is not supported by this component `\n + `(supported: ${supported.join(', ')}); falling back to its own default.`,\n )\n}\n\n/**\n * Эффективный размер компонента. Приоритет:\n * локальный проп → `componentDefaults[Component].size` → глобальный `size`\n * провайдера → `fallback`. Точечная настройка компонента должна побеждать\n * общую — иначе `componentDefaults` нельзя было бы использовать как исключение\n * из глобального правила.\n *\n * Передавайте `size` геттером, чтобы сохранить реактивность.\n *\n * Локальный проп не проверяется по `supported`: он уже сужен типом пропа самого\n * компонента, и передать туда лишнее — явная ошибка вызывающего кода. Проверка\n * нужна конфигу: это глобальный канал, который не знает, кто его читает.\n */\nexport function useGrComponentSize<TSize extends string = GrComponentSize>(\n localSize: () => TSize | undefined,\n options: UseGrComponentSizeOptions<TSize> = {},\n): ComputedRef<TSize> {\n // Все size-шкалы пакета содержат `md`, поэтому он безопасен как общий дефолт.\n const { component, fallback = 'md' as TSize, supported } = options\n const config = useGrConfig()\n\n return computed(() => {\n const local = localSize()\n if (local !== undefined)\n return local\n\n const fromComponentDefaults = component\n ? (config.componentDefaults.value[component] as { size?: TSize } | undefined)?.size\n : undefined\n\n const fromConfig = fromComponentDefaults ?? config.size.value\n if (fromConfig === undefined)\n return fallback\n\n if (supported && !supported.includes(fromConfig as TSize)) {\n // Текст предупреждения и его дедуп живут прямо под гардом, а не в общей\n // функции: `__GR_DEV__` разворачивается в условие на сборке, бандлер\n // потребителя сворачивает его в `false` и выкидывает ветку целиком.\n // Почему не рантайм-хелпер — в `vite.config.ts`, у самого `define`.\n if (__GR_DEV__)\n warnUnsupportedSize(fromConfig, supported)\n return fallback\n }\n\n return fromConfig as TSize\n })\n}\n\n/** Дефолтные пропсы конкретного компонента из ближайшего провайдера. */\nexport function useGrComponentDefaults<TComponent extends GrConfigurableComponent>(\n name: TComponent,\n): ComputedRef<GrDefaultsOf<TComponent>> {\n const config = useGrConfig()\n return computed(() => (config.componentDefaults.value[name] ?? EMPTY_COMPONENT_DEFAULTS) as GrDefaultsOf<TComponent>)\n}\n\n/**\n * Эффективное значение «оформительского» пропа: локальный проп →\n * `componentDefaults[Component][prop]` → собственный дефолт компонента.\n *\n * Обязательное условие на стороне компонента: у такого пропа в `withDefaults`\n * должен стоять `undefined`, а «настоящий» дефолт — переехать сюда, в `fallback`.\n * Иначе конфиг не сработает никогда: Vue отдаёт `props.x` уже с подставленным\n * дефолтом, и отличить «пользователь передал значение» от «сработал дефолт»\n * изнутри компонента невозможно.\n */\nexport function useGrComponentProp<\n TComponent extends GrConfigurableComponent,\n TProp extends keyof GrDefaultsOf<TComponent>,\n>(\n component: TComponent,\n prop: TProp,\n localValue: () => GrDefaultsOf<TComponent>[TProp],\n fallback: NonNullable<GrDefaultsOf<TComponent>[TProp]>,\n): ComputedRef<NonNullable<GrDefaultsOf<TComponent>[TProp]>> {\n const config = useGrConfig()\n\n return computed(() => {\n const local = localValue()\n if (local !== undefined)\n return local as NonNullable<GrDefaultsOf<TComponent>[TProp]>\n\n // Промежуточная аннотация (а не `as`) нужна, чтобы TS не разворачивал\n // `GrComponentDefaults[TComponent]` в объединение всех блоков — по нему\n // generic-ключ `TProp` уже не проиндексировать.\n const defaults: GrDefaultsOf<TComponent> | undefined = config.componentDefaults.value[component]\n return defaults?.[prop] ?? fallback\n })\n}\n\n/**\n * Атрибут темы для **телепортируемого** корня панели.\n *\n * Панель уезжает в `body`, то есть вне DOM-поддерева провайдера, и `data-theme`\n * с его обёртки на неё не наследуется. В дереве компонентов она при этом\n * остаётся внутри — `inject` работает, — поэтому тему панель ставит себе сама.\n * Без этого «тёмный остров» ломался бы на первом же открытом дропдауне.\n *\n * ```vue\n * <teleport to=\"body\">\n * <div v-bind=\"themeAttrs\">…</div>\n * </teleport>\n * ```\n */\nexport function useGrThemeAttrs(): ComputedRef<{ 'data-theme'?: string }> {\n const config = useGrConfig()\n return computed(() => {\n const theme = config.theme?.value\n return theme ? { 'data-theme': theme } : {}\n })\n}\n"],"mappings":";;AAiEA,IAAa,gBAA+C,OAAO,WAAW;;;;;;;;;;;;;;;AAgB9E,IAAM,2BAAgD,OAAO,OAAO,CAAC,CAAC;AAEtE,IAAM,eAAgC;CACpC,MAAM,eAAe,KAAA,CAAS;CAC9B,mBAAmB,eAAe,wBAAwB;CAC1D,OAAO,eAAe,KAAA,CAAS;CAC/B,cAAc,eAAe,KAAA,CAAS;AACxC;;AAGA,SAAgB,cAA+B;CAC7C,OAAO,OAAO,eAAe,YAAY;AAC3C;AAQA,SAAS,kBAAkB,QAA4C;CACrE,OAAO,OAAQ,QAAmC,mBAAmB,UAAU;AACjF;;;;;;;;;;;;AAaA,SAAgB,gBAAgB,QAAiD;CAC/E,IAAI,kBAAkB,MAAM,GAC1B,OAAO;CAET,MAAM,WAAW,QAAQ;CACzB,IAAI,UAAU;EACZ,MAAM,eAAe,SAAS;EAC9B,OAAO,kBAAkB,YAAY,IAAI,eAAe;CAC1D;CAEA,IAAI,mBAAmB,GACrB,OAAO,OAAO,eAAe,YAAY;CAE3C,OAAO;AACT;AAwBA,IAAM,yCAAyB,IAAI,IAAY;AAO/C,SAAS,oBAAoB,MAAc,WAAoC;CAC7E,MAAM,MAAM,GAAG,KAAK,GAAG,UAAU,KAAK,GAAG;CACzC,IAAI,uBAAuB,IAAI,GAAG,GAChC;CACF,uBAAuB,IAAI,GAAG;CAE9B,QAAQ,KACN,wCAAwC,KAAK,mDAC5B,UAAU,KAAK,IAAI,EAAE,oCACxC;AACF;;;;;;;;;;;;;;AAeA,SAAgB,mBACd,WACA,UAA4C,CAAC,GACzB;CAEpB,MAAM,EAAE,WAAW,WAAW,MAAe,cAAc;CAC3D,MAAM,SAAS,YAAY;CAE3B,OAAO,eAAe;EACpB,MAAM,QAAQ,UAAU;EACxB,IAAI,UAAU,KAAA,GACZ,OAAO;EAMT,MAAM,cAJwB,YACzB,OAAO,kBAAkB,MAAM,UAAU,EAAmC,OAC7E,KAAA,MAEwC,OAAO,KAAK;EACxD,IAAI,eAAe,KAAA,GACjB,OAAO;EAET,IAAI,aAAa,CAAC,UAAU,SAAS,UAAmB,GAAG;GAKzD,IAAA,OAAA,YAAA,eAAA,QAAA,IAAA,aAAA,cACE,oBAAoB,YAAY,SAAS;GAC3C,OAAO;EACT;EAEA,OAAO;CACT,CAAC;AACH;;AAGA,SAAgB,uBACd,MACuC;CACvC,MAAM,SAAS,YAAY;CAC3B,OAAO,eAAgB,OAAO,kBAAkB,MAAM,SAAS,wBAAqD;AACtH;;;;;;;;;;;AAYA,SAAgB,mBAId,WACA,MACA,YACA,UAC2D;CAC3D,MAAM,SAAS,YAAY;CAE3B,OAAO,eAAe;EACpB,MAAM,QAAQ,WAAW;EACzB,IAAI,UAAU,KAAA,GACZ,OAAO;EAMT,OADuD,OAAO,kBAAkB,MAAM,UAC/E,GAAW,SAAS;CAC7B,CAAC;AACH;;;;;;;;;;;;;;;AAgBA,SAAgB,kBAA0D;CACxE,MAAM,SAAS,YAAY;CAC3B,OAAO,eAAe;EACpB,MAAM,QAAQ,OAAO,OAAO;EAC5B,OAAO,QAAQ,EAAE,cAAc,MAAM,IAAI,CAAC;CAC5C,CAAC;AACH"}
1
+ {"version":3,"file":"context-CPMRfwVr.js","names":[],"sources":["../../src/components/GrConfigProvider/context.ts"],"sourcesContent":["import { computed, getCurrentInstance, inject, type ComputedRef, type InjectionKey } from 'vue'\n\nimport type { GrComponentDefaultsRegistry } from '../../composables/useGrComponentConfig'\n\n/**\n * Контекст `GrConfigProvider` — глобальные дефолты для вложенных GR-компонентов:\n * размер контролов и per-component дефолтные пропсы.\n *\n * Компоненты читают его через {@link useGrConfig} (или хелперы ниже) и используют\n * как fallback, когда соответствующий проп не задан на самом компоненте. Провайдер\n * можно вкладывать — дочерний мержится поверх родительского.\n */\n\n/**\n * Размеры, которыми оперирует провайдер. Это «размеры контролов» — общий\n * знаменатель формных компонентов, а не объединение всех size-шкал пакета\n * (у оверлеев есть свои `xl`/`full`, у слайдера нет `xs`).\n */\nexport const GR_COMPONENT_SIZES = ['xs', 'sm', 'md', 'lg'] as const\n\nexport type GrComponentSize = typeof GR_COMPONENT_SIZES[number]\n\n/**\n * Реестр компонентов с настраиваемыми через конфиг пропами.\n *\n * Объявлен в `composables/useGrComponentConfig` — там же, куда его дополняют\n * и компоненты пакета, и companion-пакеты. Здесь только реэкспорт для тех, кто\n * работает с контекстом провайдера напрямую.\n */\nexport type { GrComponentDefaultsRegistry }\n\n/** Имя компонента, у которого есть настраиваемые через конфиг пропы. */\nexport type GrConfigurableComponent = keyof GrComponentDefaultsRegistry\n\n/**\n * Дефолтные пропсы по имени компонента: `{ GrButton: { variant: 'secondary' } }`.\n *\n * Набор ключей закрыт реестром, а не `Record<string, unknown>`: через конфиг\n * должны настраиваться только «оформительские» пропы. Пустить туда что угодно —\n * значит разрешить задать глобальный `modelValue` или обработчик и получить баг,\n * который ищется часами.\n */\nexport type GrComponentDefaults = {\n [TComponent in GrConfigurableComponent]?: Partial<GrComponentDefaultsRegistry[TComponent]>\n}\n\ntype GrDefaultsOf<TComponent extends GrConfigurableComponent> = Partial<GrComponentDefaultsRegistry[TComponent]>\n\nexport interface GrConfigContext {\n /** Дефолтный размер контролов (если проп `size` не задан на компоненте). */\n size: ComputedRef<GrComponentSize | undefined>\n /** Дефолтные пропсы по компонентам. */\n componentDefaults: ComputedRef<GrComponentDefaults>\n /**\n * Тема поддерева (`data-theme`). Необязательна: тип публичный, и контекст\n * строят руками — например хост императивных диалогов.\n */\n theme?: ComputedRef<string | undefined>\n /**\n * Куда монтируются оверлеи поддерева (`usePortalTarget`). Необязательно, как\n * и `theme`: контекст строят руками — например хост императивных диалогов.\n */\n portalTarget?: ComputedRef<string | HTMLElement | undefined>\n}\n\nexport const GR_CONFIG_KEY: InjectionKey<GrConfigContext> = Symbol('gr-config')\n\n/**\n * Пустой конфиг: когда провайдера в дереве нет, всё разрешается в `undefined`,\n * а компоненты падают на собственные дефолты.\n *\n * `computed` здесь не роскошь: контекст типизирован рефами, и потребитель вправе\n * прогнать `size` через `unref()` или `watch()`. Плоский объект `{ value: … }`\n * не пройдёт проверку `isRef`, и такой код молча получит сам объект вместо\n * значения — поэтому «просто константа» тут не подходит.\n *\n * А вот пустые значения заморожены, и это не педантизм: `computed` без\n * зависимостей вычисляется один раз и отдаёт **один и тот же** объект всем\n * компонентам без провайдера. Незамороженный, он позволил бы одному потребителю\n * записать в него ключ и тем самым подменить дефолты всему приложению.\n */\nconst EMPTY_COMPONENT_DEFAULTS: GrComponentDefaults = Object.freeze({})\n\nconst EMPTY_CONFIG: GrConfigContext = {\n size: computed(() => undefined),\n componentDefaults: computed(() => EMPTY_COMPONENT_DEFAULTS),\n theme: computed(() => undefined),\n portalTarget: computed(() => undefined),\n}\n\n/** Возвращает ближайший `GrConfigProvider` или пустой конфиг, если провайдера нет. */\nexport function useGrConfig(): GrConfigContext {\n return inject(GR_CONFIG_KEY, EMPTY_CONFIG)\n}\n\n/**\n * Источник конфига для {@link resolveGrConfig}: сам контекст, `AppContext` или\n * инстанс компонента — у двух последних читается `provides`.\n */\nexport type GrConfigSource = GrConfigContext | { provides?: Record<symbol | string, unknown> }\n\nfunction isGrConfigContext(source: unknown): source is GrConfigContext {\n return typeof (source as GrConfigContext | null)?.componentDefaults?.value === 'object'\n}\n\n/**\n * Конфиг там, где `inject` недоступен — вне `setup`: в директивах, императивных\n * сервисах, утилитах. Порядок: явный контекст → `provides` источника → `inject`\n * (если есть активный инстанс) → пустой конфиг.\n *\n * Важно понимать границу: `provides` у `AppContext` содержит только то, что\n * роздано через `app.provide()`. Значения от `<GrConfigProvider>` живут в дереве\n * компонентов, и достать их можно лишь оттуда, где это дерево ещё есть — то есть\n * захватом в `setup`. Просто передать `appContext` в отрыве от дерева\n * недостаточно; см. `SPEC-GrConfig-resolver.md`.\n */\nexport function resolveGrConfig(source?: GrConfigSource | null): GrConfigContext {\n if (isGrConfigContext(source))\n return source\n\n const provides = source?.provides\n if (provides) {\n const fromProvides = provides[GR_CONFIG_KEY as symbol] as GrConfigContext | undefined\n return isGrConfigContext(fromProvides) ? fromProvides : EMPTY_CONFIG\n }\n\n if (getCurrentInstance())\n return inject(GR_CONFIG_KEY, EMPTY_CONFIG)\n\n return EMPTY_CONFIG\n}\n\nexport type UseGrComponentSizeOptions<TSize extends string> = {\n /**\n * Имя компонента, чтобы учесть точечный `componentDefaults[Component].size`.\n * Без него читается только глобальный `size` провайдера.\n */\n component?: GrConfigurableComponent\n /** Размер, когда ни проп, ни конфиг ничего не дали. По умолчанию `md`. */\n fallback?: TSize\n /**\n * Размеры, которые компонент реально умеет. Значение из конфига вне этого\n * списка игнорируется в пользу `fallback`.\n *\n * Обязателен для компонентов, у которых size-шкала уже общей (`GrSlider`,\n * `GrRating`, `GrSwitch`, `GrLink`, `GrStatistic` не знают про `xs`): без него\n * `<GrConfigProvider size=\"xs\">` дал бы `sizeMap['xs'] === undefined`, то есть\n * компонент без размерных классов — молча, без ошибки сборки.\n */\n supported?: readonly TSize[]\n}\n\n// Предупреждаем один раз на уникальную пару «размер + список поддерживаемых»,\n// иначе список из сотни контролов зальёт консоль одинаковыми сообщениями.\nconst warnedUnsupportedSizes = new Set<string>()\n\n/** Сброс дедупликации предупреждений. Внутреннее API — нужно тестам. */\nexport function resetUnsupportedSizeWarnings(): void {\n warnedUnsupportedSizes.clear()\n}\n\nfunction warnUnsupportedSize(size: string, supported: readonly string[]): void {\n const key = `${size}|${supported.join(',')}`\n if (warnedUnsupportedSizes.has(key))\n return\n warnedUnsupportedSizes.add(key)\n\n console.warn(\n `[granularity] GrConfigProvider size=\"${size}\" is not supported by this component `\n + `(supported: ${supported.join(', ')}); falling back to its own default.`,\n )\n}\n\n/**\n * Эффективный размер компонента. Приоритет:\n * локальный проп → `componentDefaults[Component].size` → глобальный `size`\n * провайдера → `fallback`. Точечная настройка компонента должна побеждать\n * общую — иначе `componentDefaults` нельзя было бы использовать как исключение\n * из глобального правила.\n *\n * Передавайте `size` геттером, чтобы сохранить реактивность.\n *\n * Локальный проп не проверяется по `supported`: он уже сужен типом пропа самого\n * компонента, и передать туда лишнее — явная ошибка вызывающего кода. Проверка\n * нужна конфигу: это глобальный канал, который не знает, кто его читает.\n */\nexport function useGrComponentSize<TSize extends string = GrComponentSize>(\n localSize: () => TSize | undefined,\n options: UseGrComponentSizeOptions<TSize> = {},\n): ComputedRef<TSize> {\n // Все size-шкалы пакета содержат `md`, поэтому он безопасен как общий дефолт.\n const { component, fallback = 'md' as TSize, supported } = options\n const config = useGrConfig()\n\n return computed(() => {\n const local = localSize()\n if (local !== undefined)\n return local\n\n const fromComponentDefaults = component\n ? (config.componentDefaults.value[component] as { size?: TSize } | undefined)?.size\n : undefined\n\n const fromConfig = fromComponentDefaults ?? config.size.value\n if (fromConfig === undefined)\n return fallback\n\n if (supported && !supported.includes(fromConfig as TSize)) {\n // Текст предупреждения и его дедуп живут прямо под гардом, а не в общей\n // функции: `__GR_DEV__` разворачивается в условие на сборке, бандлер\n // потребителя сворачивает его в `false` и выкидывает ветку целиком.\n // Почему не рантайм-хелпер — в `vite.config.ts`, у самого `define`.\n if (__GR_DEV__)\n warnUnsupportedSize(fromConfig, supported)\n return fallback\n }\n\n return fromConfig as TSize\n })\n}\n\n/** Дефолтные пропсы конкретного компонента из ближайшего провайдера. */\nexport function useGrComponentDefaults<TComponent extends GrConfigurableComponent>(\n name: TComponent,\n): ComputedRef<GrDefaultsOf<TComponent>> {\n const config = useGrConfig()\n return computed(() => (config.componentDefaults.value[name] ?? EMPTY_COMPONENT_DEFAULTS) as GrDefaultsOf<TComponent>)\n}\n\n/**\n * Эффективное значение «оформительского» пропа: локальный проп →\n * `componentDefaults[Component][prop]` → собственный дефолт компонента.\n *\n * Обязательное условие на стороне компонента: у такого пропа в `withDefaults`\n * должен стоять `undefined`, а «настоящий» дефолт — переехать сюда, в `fallback`.\n * Иначе конфиг не сработает никогда: Vue отдаёт `props.x` уже с подставленным\n * дефолтом, и отличить «пользователь передал значение» от «сработал дефолт»\n * изнутри компонента невозможно.\n */\nexport function useGrComponentProp<\n TComponent extends GrConfigurableComponent,\n TProp extends keyof GrDefaultsOf<TComponent>,\n>(\n component: TComponent,\n prop: TProp,\n localValue: () => GrDefaultsOf<TComponent>[TProp],\n fallback: NonNullable<GrDefaultsOf<TComponent>[TProp]>,\n): ComputedRef<NonNullable<GrDefaultsOf<TComponent>[TProp]>> {\n const config = useGrConfig()\n\n return computed(() => {\n const local = localValue()\n if (local !== undefined)\n return local as NonNullable<GrDefaultsOf<TComponent>[TProp]>\n\n // Промежуточная аннотация (а не `as`) нужна, чтобы TS не разворачивал\n // `GrComponentDefaults[TComponent]` в объединение всех блоков — по нему\n // generic-ключ `TProp` уже не проиндексировать.\n const defaults: GrDefaultsOf<TComponent> | undefined = config.componentDefaults.value[component]\n return defaults?.[prop] ?? fallback\n })\n}\n\n/**\n * Атрибут темы для **телепортируемого** корня панели.\n *\n * Панель уезжает в `body`, то есть вне DOM-поддерева провайдера, и `data-theme`\n * с его обёртки на неё не наследуется. В дереве компонентов она при этом\n * остаётся внутри — `inject` работает, — поэтому тему панель ставит себе сама.\n * Без этого «тёмный остров» ломался бы на первом же открытом дропдауне.\n *\n * ```vue\n * <teleport to=\"body\">\n * <div v-bind=\"themeAttrs\">…</div>\n * </teleport>\n * ```\n */\nexport function useGrThemeAttrs(): ComputedRef<{ 'data-theme'?: string }> {\n const config = useGrConfig()\n return computed(() => {\n const theme = config.theme?.value\n return theme ? { 'data-theme': theme } : {}\n })\n}\n"],"mappings":";;AAiEA,IAAa,gBAA+C,OAAO,WAAW;;;;;;;;;;;;;;;AAgB9E,IAAM,2BAAgD,OAAO,OAAO,CAAC,CAAC;AAEtE,IAAM,eAAgC;CACpC,MAAM,eAAe,KAAA,CAAS;CAC9B,mBAAmB,eAAe,wBAAwB;CAC1D,OAAO,eAAe,KAAA,CAAS;CAC/B,cAAc,eAAe,KAAA,CAAS;AACxC;;AAGA,SAAgB,cAA+B;CAC7C,OAAO,OAAO,eAAe,YAAY;AAC3C;AAQA,SAAS,kBAAkB,QAA4C;CACrE,OAAO,OAAQ,QAAmC,mBAAmB,UAAU;AACjF;;;;;;;;;;;;AAaA,SAAgB,gBAAgB,QAAiD;CAC/E,IAAI,kBAAkB,MAAM,GAC1B,OAAO;CAET,MAAM,WAAW,QAAQ;CACzB,IAAI,UAAU;EACZ,MAAM,eAAe,SAAS;EAC9B,OAAO,kBAAkB,YAAY,IAAI,eAAe;CAC1D;CAEA,IAAI,mBAAmB,GACrB,OAAO,OAAO,eAAe,YAAY;CAE3C,OAAO;AACT;AAwBA,IAAM,yCAAyB,IAAI,IAAY;AAO/C,SAAS,oBAAoB,MAAc,WAAoC;CAC7E,MAAM,MAAM,GAAG,KAAK,GAAG,UAAU,KAAK,GAAG;CACzC,IAAI,uBAAuB,IAAI,GAAG,GAChC;CACF,uBAAuB,IAAI,GAAG;CAE9B,QAAQ,KACN,wCAAwC,KAAK,mDAC5B,UAAU,KAAK,IAAI,EAAE,oCACxC;AACF;;;;;;;;;;;;;;AAeA,SAAgB,mBACd,WACA,UAA4C,CAAC,GACzB;CAEpB,MAAM,EAAE,WAAW,WAAW,MAAe,cAAc;CAC3D,MAAM,SAAS,YAAY;CAE3B,OAAO,eAAe;EACpB,MAAM,QAAQ,UAAU;EACxB,IAAI,UAAU,KAAA,GACZ,OAAO;EAMT,MAAM,cAJwB,YACzB,OAAO,kBAAkB,MAAM,UAAU,EAAmC,OAC7E,KAAA,MAEwC,OAAO,KAAK;EACxD,IAAI,eAAe,KAAA,GACjB,OAAO;EAET,IAAI,aAAa,CAAC,UAAU,SAAS,UAAmB,GAAG;GAKzD,IAAA,QAAA,IAAA,aAAA,cACE,oBAAoB,YAAY,SAAS;GAC3C,OAAO;EACT;EAEA,OAAO;CACT,CAAC;AACH;;AAGA,SAAgB,uBACd,MACuC;CACvC,MAAM,SAAS,YAAY;CAC3B,OAAO,eAAgB,OAAO,kBAAkB,MAAM,SAAS,wBAAqD;AACtH;;;;;;;;;;;AAYA,SAAgB,mBAId,WACA,MACA,YACA,UAC2D;CAC3D,MAAM,SAAS,YAAY;CAE3B,OAAO,eAAe;EACpB,MAAM,QAAQ,WAAW;EACzB,IAAI,UAAU,KAAA,GACZ,OAAO;EAMT,OADuD,OAAO,kBAAkB,MAAM,UAC/E,GAAW,SAAS;CAC7B,CAAC;AACH;;;;;;;;;;;;;;;AAgBA,SAAgB,kBAA0D;CACxE,MAAM,SAAS,YAAY;CAC3B,OAAO,eAAe;EACpB,MAAM,QAAQ,OAAO,OAAO;EAC5B,OAAO,QAAQ,EAAE,cAAc,MAAM,IAAI,CAAC;CAC5C,CAAC;AACH"}
@@ -0,0 +1,44 @@
1
+ //#region src/internal/devHook.ts
2
+ /**
3
+ * Глубина буфера. Полсотни событий покрывают сценарий «открыл окно, поработал,
4
+ * полез в панель» и не превращают буфер в утечку на долгой сессии.
5
+ */
6
+ var BUFFER_LIMIT = 50;
7
+ function ensureHook() {
8
+ const target = globalThis;
9
+ const existing = target.__GR_DEV_HOOK__;
10
+ if (existing) return existing;
11
+ const hook = {
12
+ events: [],
13
+ listeners: /* @__PURE__ */ new Set()
14
+ };
15
+ target.__GR_DEV_HOOK__ = hook;
16
+ return hook;
17
+ }
18
+ /**
19
+ * Регистрирует виртуализатор в реестре наблюдателя. Возвращает снятие —
20
+ * список обязан исчезнуть вместе с компонентом.
21
+ */
22
+ function registerGrVirtualList(read) {
23
+ const hook = ensureHook();
24
+ hook.virtualLists ??= /* @__PURE__ */ new Set();
25
+ hook.virtualLists.add(read);
26
+ return () => {
27
+ hook.virtualLists?.delete(read);
28
+ };
29
+ }
30
+ /** Ядро отдаёт наблюдателю читалку стека. Вызывается один раз, из стека слоёв. */
31
+ function provideGrDevLayers(read) {
32
+ ensureHook().readLayers = read;
33
+ }
34
+ function emitGrDevEvent(event) {
35
+ const hook = ensureHook();
36
+ const limit = hook.bufferLimit ?? BUFFER_LIMIT;
37
+ hook.events.push(event);
38
+ if (hook.events.length > limit) hook.events.splice(0, hook.events.length - limit);
39
+ for (const listener of hook.listeners) try {
40
+ listener(event);
41
+ } catch {}
42
+ }
43
+ //#endregion
44
+ export { provideGrDevLayers as n, registerGrVirtualList as r, emitGrDevEvent as t };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devHook-CiqijpNM.js","names":[],"sources":["../../src/internal/devHook.ts"],"sourcesContent":["/**\n * Dev-канал ядра: наружу отдаётся то, чего иначе не увидеть — состояние\n * приватных синглтонов пакета.\n *\n * Первый и пока единственный поставщик — стек слоёв\n * (`composables/internal/overlayStack.ts`). Он приватен намеренно: один список\n * отвечает сразу на три вопроса (кому Esc, кто под `inert`, чья высота), и\n * публичный доступ к нему означал бы обязательство держать эту форму. Канал\n * снимает противоречие: снаружи видно картину, но не рычаги.\n *\n * Существует только под `__GR_DEV__` — вызывающие обязаны обернуть эмит гардом,\n * тогда у потребителя ветка выкидывается вместе с этим модулем.\n *\n * Хук нарочно «глупый»: голые `events` и `listeners` вместо методов. Создать\n * такой объект умеет и слушатель (панель подключается раньше или позже ядра —\n * порядок не гарантирован), а логика эмита при этом живёт в одном месте, здесь.\n */\n\n/** Фокус вокруг слоя: то, чего не видно ни в DOM, ни в браузерном инспекторе. */\nexport interface GrLayerFocus {\n /** Фокус сейчас внутри слоя. */\n inside: boolean\n /**\n * Вернётся ли фокус при закрытии. Правило нетривиальное — «только если на\n * момент закрытия фокус ещё внутри слоя», — и снаружи непроверяемо.\n */\n willRestore: boolean\n /** Куда вернётся: описание элемента, а не ссылка (буфер не должен держать DOM). */\n restoreTo: string | null\n}\n\n/** Слой оверлея в том виде, в каком его видит наблюдатель. */\nexport interface GrOverlaySnapshot {\n id: number\n /** Компонент, открывший слой: `GrSelect`, `GrModal`. `null` — слой заведён вне компонента. */\n owner: string | null\n focus: GrLayerFocus | null\n modal: boolean\n /** Верхний слой любого рода: ему адресован Esc. */\n topmostForEscape: boolean\n /** Модальный слой ниже последнего модального — тот, что уходит в `inert`. */\n inert: boolean\n /** Позиция среди модальных, от нуля. У немодальных глубины нет. */\n depth: number | null\n /** Закроется ли слой по Esc прямо сейчас (`closeOnEsc` реактивен). */\n closesOnEscape: boolean\n}\n\nexport type GrDevEvent\n = | { type: 'overlay:sync', layers: GrOverlaySnapshot[] }\n | { type: 'overlay:push', id: number, modal: boolean, owner: string | null }\n | { type: 'overlay:remove', id: number }\n | { type: 'overlay:escape', id: number, closed: boolean }\n\n/**\n * Окно виртуализатора глазами наблюдателя.\n *\n * Число узлов в DOM браузер покажет и сам; невидимо другое — какие индексы\n * отрисованы, сколько всего элементов и насколько оценка высоты разошлась с\n * замером. Расхождение и есть тихий дефект: список начинает прыгать, а узлов\n * по-прежнему «правильные десятки».\n */\nexport interface GrVirtualListSnapshot {\n /** Компонент, которому принадлежит список. */\n owner: string | null\n /** `uid` инстанса: панель связывает снимок с выбранным компонентом. */\n uid: number | null\n total: number\n rendered: number\n range: { start: number, end: number }\n /** Оценка высоты элемента, с которой список считает окно. */\n estimated: number\n /** Средний фактический замер; `null` — пока ничего не измерено. */\n measured: number | null\n}\n\nexport interface GrDevHook {\n /** Последние события — чтобы подключившийся позже не начинал с пустого экрана. */\n events: GrDevEvent[]\n listeners: Set<(event: GrDevEvent) => void>\n /**\n * Глубина буфера, если наблюдатель попросил другую. Ставит её он же: сколько\n * истории нужно, знает только тот, кто её читает.\n */\n bufferLimit?: number\n /**\n * Живые виртуализаторы. Реестр, а не событие: окно меняется на каждый кадр\n * прокрутки, и слать его лентой значило бы залить канал.\n */\n virtualLists?: Set<() => GrVirtualListSnapshot>\n /**\n * Свежий снимок стека по требованию.\n *\n * События дают картину на момент изменения стека, а часть состояния меняется\n * между ними: фокус уходит из слоя от обычного клика, и ни одного события при\n * этом не случается. Наблюдателю нужно спросить «как сейчас», а не «как было\n * при последнем push».\n */\n readLayers?: () => GrOverlaySnapshot[]\n}\n\ntype GlobalWithDevHook = typeof globalThis & { __GR_DEV_HOOK__?: GrDevHook }\n\n/**\n * Глубина буфера. Полсотни событий покрывают сценарий «открыл окно, поработал,\n * полез в панель» и не превращают буфер в утечку на долгой сессии.\n */\nconst BUFFER_LIMIT = 50\n\nfunction ensureHook(): GrDevHook {\n const target = globalThis as GlobalWithDevHook\n const existing = target.__GR_DEV_HOOK__\n if (existing)\n return existing\n\n const hook: GrDevHook = { events: [], listeners: new Set() }\n target.__GR_DEV_HOOK__ = hook\n return hook\n}\n\n/**\n * Регистрирует виртуализатор в реестре наблюдателя. Возвращает снятие —\n * список обязан исчезнуть вместе с компонентом.\n */\nexport function registerGrVirtualList(read: () => GrVirtualListSnapshot): () => void {\n const hook = ensureHook()\n hook.virtualLists ??= new Set()\n hook.virtualLists.add(read)\n\n return () => {\n hook.virtualLists?.delete(read)\n }\n}\n\n/** Ядро отдаёт наблюдателю читалку стека. Вызывается один раз, из стека слоёв. */\nexport function provideGrDevLayers(read: () => GrOverlaySnapshot[]): void {\n ensureHook().readLayers = read\n}\n\nexport function emitGrDevEvent(event: GrDevEvent): void {\n const hook = ensureHook()\n\n const limit = hook.bufferLimit ?? BUFFER_LIMIT\n\n hook.events.push(event)\n if (hook.events.length > limit)\n hook.events.splice(0, hook.events.length - limit)\n\n for (const listener of hook.listeners) {\n // Слушатель — чужой код, и его исключение не должно ронять то, за чем он\n // наблюдает: канал обязан быть незаметен для поведения пакета.\n try {\n listener(event)\n }\n catch {\n // ignore\n }\n }\n}\n\n/** Сброс канала между тестами: буфер и подписчики живут в `globalThis`. */\nexport function resetGrDevHook(): void {\n const target = globalThis as GlobalWithDevHook\n target.__GR_DEV_HOOK__ = undefined\n}\n"],"mappings":";;;;;AA2GA,IAAM,eAAe;AAErB,SAAS,aAAwB;CAC/B,MAAM,SAAS;CACf,MAAM,WAAW,OAAO;CACxB,IAAI,UACF,OAAO;CAET,MAAM,OAAkB;EAAE,QAAQ,CAAC;EAAG,2BAAW,IAAI,IAAI;CAAE;CAC3D,OAAO,kBAAkB;CACzB,OAAO;AACT;;;;;AAMA,SAAgB,sBAAsB,MAA+C;CACnF,MAAM,OAAO,WAAW;CACxB,KAAK,iCAAiB,IAAI,IAAI;CAC9B,KAAK,aAAa,IAAI,IAAI;CAE1B,aAAa;EACX,KAAK,cAAc,OAAO,IAAI;CAChC;AACF;;AAGA,SAAgB,mBAAmB,MAAuC;CACxE,WAAW,CAAC,CAAC,aAAa;AAC5B;AAEA,SAAgB,eAAe,OAAyB;CACtD,MAAM,OAAO,WAAW;CAExB,MAAM,QAAQ,KAAK,eAAe;CAElC,KAAK,OAAO,KAAK,KAAK;CACtB,IAAI,KAAK,OAAO,SAAS,OACvB,KAAK,OAAO,OAAO,GAAG,KAAK,OAAO,SAAS,KAAK;CAElD,KAAK,MAAM,YAAY,KAAK,WAG1B,IAAI;EACF,SAAS,KAAK;CAChB,QACM,CAEN;AAEJ"}
@@ -69,11 +69,13 @@ function grRadioButtonClass(options) {
69
69
  sizes[options.size],
70
70
  options.checked ? grRadioButtonDisabledCheckedClass : grRadioButtonDisabledClass
71
71
  ].join(" ");
72
+ const variant = options.checked ? options.selectedButtonVariant : options.buttonVariant;
73
+ const tone = options.checked ? options.selectedButtonTone : options.buttonTone;
72
74
  return [
73
75
  grButtonBaseClass,
74
76
  grButtonClass({
75
- variant: options.checked ? options.selectedButtonVariant : options.buttonVariant,
76
- tone: options.checked ? options.selectedButtonTone : options.buttonTone,
77
+ variant,
78
+ tone,
77
79
  size: options.size,
78
80
  square: false
79
81
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"grRadioStyles-DGL2QLy6.js","names":[],"sources":["../../src/components/GrRadio/grRadioStyles.ts"],"sourcesContent":["import {\n grButtonBaseClass,\n grButtonClass,\n sizes as grButtonSizes,\n type GrButtonSize,\n type GrButtonTone,\n type GrButtonVariant,\n} from '../GrButton/grButtonStyles'\n\nexport type GrRadioVariant = 'radiobox' | 'button'\n\nexport const grRadioEnabledClass = 'cursor-pointer'\n\n/**\n * Отключённая кнопка-радио гасится, но НЕ теряет состояние: в отключённой\n * группе всё равно должно быть видно, что выбрано. Поэтому не отдаём вид\n * `GrButton`-у (его disabled состояние-слепой), а держим свою пару.\n */\nexport const grRadioButtonDisabledClass = 'cursor-not-allowed bg-transparent text-[var(--gr-muted-fg)] border border-[var(--gr-brd)]'\nexport const grRadioButtonDisabledCheckedClass = 'cursor-not-allowed bg-[var(--gr-muted)] text-[var(--gr-fg)] border border-[var(--gr-muted-fg)]'\n\n/**\n * Отключённый переключатель гасится токенами, а не `opacity`: прозрачность\n * разбавляет выверенные на AA цвета текста.\n */\nexport const grRadioRootDisabledClass = 'cursor-not-allowed text-[var(--gr-muted-fg)]'\nexport const grRadioRootEnabledClass = 'cursor-pointer'\n/** Только для чтения: значение видно и читается, но курсор не обещает клика. */\nexport const grRadioRootReadonlyClass = 'cursor-default'\n\nexport const grRadioControlCheckedClass = 'border-[var(--gr-primary)] bg-[color-mix(in_srgb,var(--gr-primary)_10%,var(--gr-bg))]'\nexport const grRadioControlUncheckedClass = 'border-[var(--gr-brd)] bg-[var(--gr-bg)]'\nexport const grRadioControlDisabledClass = 'border-[var(--gr-brd)] bg-[var(--gr-muted)]'\nexport const grRadioControlInvalidClass = 'border-[var(--gr-danger)] bg-[var(--gr-bg)]'\n\nexport const grRadioDotCheckedClass = 'bg-[var(--gr-primary)] opacity-100 scale-100'\nexport const grRadioDotUncheckedClass = 'bg-transparent opacity-0 scale-75'\nexport const grRadioDotDisabledClass = 'bg-[var(--gr-muted-fg)] opacity-100 scale-100'\n// Базовые классы «точки» внутри radiobox — нестандартный transition. Вынесены сюда,\n// чтобы `safelist` гарантировал их присутствие в сборке даже при tree-shaking шаблона.\nexport const grRadioDotBaseClass = 'rounded-[var(--gr-radius-full)] transition-[transform,opacity,background-color] duration-[var(--gr-duration-fast)]'\n\n/**\n * Ступени `radiobox`: коробка, точка и кегли подписи с описанием.\n *\n * До этого коробка была зашита `h-4 w-4` в шаблоне, а кегли — фиксированным\n * `--gr-text-sm`: вариант `radiobox` не масштабировался вовсе, хотя `size` у\n * компонента был и работал для варианта `button`. Ступени согласованы с высотой\n * кнопки (`grButtonStyles.sizes`: 28/32/40/44) — радио стоит в тех же формах.\n */\nexport const grRadioControlSizes: Record<GrButtonSize, string> = {\n xs: 'h-3.5 w-3.5',\n sm: 'h-4 w-4',\n md: 'h-5 w-5',\n lg: 'h-6 w-6',\n}\n\nexport const grRadioDotSizes: Record<GrButtonSize, string> = {\n xs: 'h-[5px] w-[5px]',\n sm: 'h-[6px] w-[6px]',\n md: 'h-2 w-2',\n lg: 'h-2.5 w-2.5',\n}\n\nconst grRadioLabelTexts: Record<GrButtonSize, string> = {\n xs: 'text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)]',\n sm: 'text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)]',\n md: 'text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)]',\n lg: 'text-[length:var(--gr-text-base)] leading-[var(--gr-leading-base)]',\n}\n\nexport const grRadioDescriptionSizes: Record<GrButtonSize, string> = {\n xs: 'text-[length:var(--gr-text-2xs)] leading-[var(--gr-leading-2xs)] text-[var(--gr-muted-fg)]',\n sm: 'text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)] text-[var(--gr-muted-fg)]',\n md: 'text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)] text-[var(--gr-muted-fg)]',\n lg: 'text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)] text-[var(--gr-muted-fg)]',\n}\n\n/** Выбранный вариант выделяется текстом, а не только точкой. */\nexport const grRadioLabelCheckedColorClass = 'text-[var(--gr-fg)] font-500'\nexport const grRadioLabelColorClass = 'text-[var(--gr-muted-fg)]'\n\nexport function grRadioLabelClassFor(size: GrButtonSize, checked: boolean): string {\n return [\n grRadioLabelTexts[size],\n checked ? grRadioLabelCheckedColorClass : grRadioLabelColorClass,\n ].join(' ')\n}\n\nexport const grRadioLabelSizes = grRadioLabelTexts\n\nexport function grRadioButtonClass(options: {\n checked: boolean\n disabled: boolean\n readonly: boolean\n size: GrButtonSize\n buttonVariant: GrButtonVariant\n buttonTone: GrButtonTone\n selectedButtonVariant: GrButtonVariant\n selectedButtonTone: GrButtonTone\n}): string {\n if (options.disabled) {\n return [\n grButtonBaseClass,\n grButtonSizes[options.size],\n options.checked ? grRadioButtonDisabledCheckedClass : grRadioButtonDisabledClass,\n ].join(' ')\n }\n\n const variant = options.checked ? options.selectedButtonVariant : options.buttonVariant\n const tone = options.checked ? options.selectedButtonTone : options.buttonTone\n\n return [\n grButtonBaseClass,\n grButtonClass({\n variant,\n tone,\n size: options.size,\n square: false,\n }),\n options.readonly ? grRadioRootReadonlyClass : grRadioEnabledClass,\n ].join(' ')\n}\n\nexport function grRadioRootClass(options: { disabled: boolean, readonly: boolean }): string {\n if (options.disabled)\n return grRadioRootDisabledClass\n return options.readonly ? grRadioRootReadonlyClass : grRadioRootEnabledClass\n}\n\nexport function grRadioControlClass(options: {\n checked: boolean\n disabled: boolean\n invalid: boolean\n size: GrButtonSize\n}): string {\n const state = options.disabled\n ? grRadioControlDisabledClass\n : options.invalid && !options.checked\n ? grRadioControlInvalidClass\n : options.checked ? grRadioControlCheckedClass : grRadioControlUncheckedClass\n\n return [grRadioControlSizes[options.size], state].join(' ')\n}\n\nexport function grRadioDotClass(options: { checked: boolean, disabled: boolean }): string {\n if (!options.checked)\n return grRadioDotUncheckedClass\n\n return options.disabled ? grRadioDotDisabledClass : grRadioDotCheckedClass\n}\n"],"mappings":";;AAWA,IAAa,sBAAsB;;;;;;AAOnC,IAAa,6BAA6B;AAC1C,IAAa,oCAAoC;;;;;AAMjD,IAAa,2BAA2B;AACxC,IAAa,0BAA0B;;AAEvC,IAAa,2BAA2B;AAExC,IAAa,6BAA6B;AAC1C,IAAa,+BAA+B;AAC5C,IAAa,8BAA8B;AAC3C,IAAa,6BAA6B;AAE1C,IAAa,yBAAyB;AACtC,IAAa,2BAA2B;AACxC,IAAa,0BAA0B;AAGvC,IAAa,sBAAsB;;;;;;;;;AAUnC,IAAa,sBAAoD;CAC/D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,kBAAgD;CAC3D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAM,oBAAkD;CACtD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,0BAAwD;CACnE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,gCAAgC;AAC7C,IAAa,yBAAyB;AAEtC,SAAgB,qBAAqB,MAAoB,SAA0B;CACjF,OAAO,CACL,kBAAkB,OAClB,UAAU,gCAAgC,sBAC5C,CAAC,CAAC,KAAK,GAAG;AACZ;AAEA,IAAa,oBAAoB;AAEjC,SAAgB,mBAAmB,SASxB;CACT,IAAI,QAAQ,UACV,OAAO;EACL;EACA,MAAc,QAAQ;EACtB,QAAQ,UAAU,oCAAoC;CACxD,CAAC,CAAC,KAAK,GAAG;CAMZ,OAAO;EACL;EACA,cAAc;GACZ,SANY,QAAQ,UAAU,QAAQ,wBAAwB,QAAQ;GAOtE,MANS,QAAQ,UAAU,QAAQ,qBAAqB,QAAQ;GAOhE,MAAM,QAAQ;GACd,QAAQ;EACV,CAAC;EACD,QAAQ,WAAW,2BAA2B;CAChD,CAAC,CAAC,KAAK,GAAG;AACZ;AAEA,SAAgB,iBAAiB,SAA2D;CAC1F,IAAI,QAAQ,UACV,OAAO;CACT,OAAO,QAAQ,WAAW,2BAA2B;AACvD;AAEA,SAAgB,oBAAoB,SAKzB;CACT,MAAM,QAAQ,QAAQ,WAClB,8BACA,QAAQ,WAAW,CAAC,QAAQ,UAC1B,6BACA,QAAQ,UAAU,6BAA6B;CAErD,OAAO,CAAC,oBAAoB,QAAQ,OAAO,KAAK,CAAC,CAAC,KAAK,GAAG;AAC5D;AAEA,SAAgB,gBAAgB,SAA0D;CACxF,IAAI,CAAC,QAAQ,SACX,OAAO;CAET,OAAO,QAAQ,WAAW,0BAA0B;AACtD"}
1
+ {"version":3,"file":"grRadioStyles-BwRyCjQQ.js","names":[],"sources":["../../src/components/GrRadio/grRadioStyles.ts"],"sourcesContent":["import {\n grButtonBaseClass,\n grButtonClass,\n sizes as grButtonSizes,\n type GrButtonSize,\n type GrButtonTone,\n type GrButtonVariant,\n} from '../GrButton/grButtonStyles'\n\nexport type GrRadioVariant = 'radiobox' | 'button'\n\nexport const grRadioEnabledClass = 'cursor-pointer'\n\n/**\n * Отключённая кнопка-радио гасится, но НЕ теряет состояние: в отключённой\n * группе всё равно должно быть видно, что выбрано. Поэтому не отдаём вид\n * `GrButton`-у (его disabled состояние-слепой), а держим свою пару.\n */\nexport const grRadioButtonDisabledClass = 'cursor-not-allowed bg-transparent text-[var(--gr-muted-fg)] border border-[var(--gr-brd)]'\nexport const grRadioButtonDisabledCheckedClass = 'cursor-not-allowed bg-[var(--gr-muted)] text-[var(--gr-fg)] border border-[var(--gr-muted-fg)]'\n\n/**\n * Отключённый переключатель гасится токенами, а не `opacity`: прозрачность\n * разбавляет выверенные на AA цвета текста.\n */\nexport const grRadioRootDisabledClass = 'cursor-not-allowed text-[var(--gr-muted-fg)]'\nexport const grRadioRootEnabledClass = 'cursor-pointer'\n/** Только для чтения: значение видно и читается, но курсор не обещает клика. */\nexport const grRadioRootReadonlyClass = 'cursor-default'\n\nexport const grRadioControlCheckedClass = 'border-[var(--gr-primary)] bg-[color-mix(in_srgb,var(--gr-primary)_10%,var(--gr-bg))]'\nexport const grRadioControlUncheckedClass = 'border-[var(--gr-brd)] bg-[var(--gr-bg)]'\nexport const grRadioControlDisabledClass = 'border-[var(--gr-brd)] bg-[var(--gr-muted)]'\nexport const grRadioControlInvalidClass = 'border-[var(--gr-danger)] bg-[var(--gr-bg)]'\n\nexport const grRadioDotCheckedClass = 'bg-[var(--gr-primary)] opacity-100 scale-100'\nexport const grRadioDotUncheckedClass = 'bg-transparent opacity-0 scale-75'\nexport const grRadioDotDisabledClass = 'bg-[var(--gr-muted-fg)] opacity-100 scale-100'\n// Базовые классы «точки» внутри radiobox — нестандартный transition. Вынесены сюда,\n// чтобы `safelist` гарантировал их присутствие в сборке даже при tree-shaking шаблона.\nexport const grRadioDotBaseClass = 'rounded-[var(--gr-radius-full)] transition-[transform,opacity,background-color] duration-[var(--gr-duration-fast)]'\n\n/**\n * Ступени `radiobox`: коробка, точка и кегли подписи с описанием.\n *\n * До этого коробка была зашита `h-4 w-4` в шаблоне, а кегли — фиксированным\n * `--gr-text-sm`: вариант `radiobox` не масштабировался вовсе, хотя `size` у\n * компонента был и работал для варианта `button`. Ступени согласованы с высотой\n * кнопки (`grButtonStyles.sizes`: 28/32/40/44) — радио стоит в тех же формах.\n */\nexport const grRadioControlSizes: Record<GrButtonSize, string> = {\n xs: 'h-3.5 w-3.5',\n sm: 'h-4 w-4',\n md: 'h-5 w-5',\n lg: 'h-6 w-6',\n}\n\nexport const grRadioDotSizes: Record<GrButtonSize, string> = {\n xs: 'h-[5px] w-[5px]',\n sm: 'h-[6px] w-[6px]',\n md: 'h-2 w-2',\n lg: 'h-2.5 w-2.5',\n}\n\nconst grRadioLabelTexts: Record<GrButtonSize, string> = {\n xs: 'text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)]',\n sm: 'text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)]',\n md: 'text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)]',\n lg: 'text-[length:var(--gr-text-base)] leading-[var(--gr-leading-base)]',\n}\n\nexport const grRadioDescriptionSizes: Record<GrButtonSize, string> = {\n xs: 'text-[length:var(--gr-text-2xs)] leading-[var(--gr-leading-2xs)] text-[var(--gr-muted-fg)]',\n sm: 'text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)] text-[var(--gr-muted-fg)]',\n md: 'text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)] text-[var(--gr-muted-fg)]',\n lg: 'text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)] text-[var(--gr-muted-fg)]',\n}\n\n/** Выбранный вариант выделяется текстом, а не только точкой. */\nexport const grRadioLabelCheckedColorClass = 'text-[var(--gr-fg)] font-500'\nexport const grRadioLabelColorClass = 'text-[var(--gr-muted-fg)]'\n\nexport function grRadioLabelClassFor(size: GrButtonSize, checked: boolean): string {\n return [\n grRadioLabelTexts[size],\n checked ? grRadioLabelCheckedColorClass : grRadioLabelColorClass,\n ].join(' ')\n}\n\nexport const grRadioLabelSizes = grRadioLabelTexts\n\nexport function grRadioButtonClass(options: {\n checked: boolean\n disabled: boolean\n readonly: boolean\n size: GrButtonSize\n buttonVariant: GrButtonVariant\n buttonTone: GrButtonTone\n selectedButtonVariant: GrButtonVariant\n selectedButtonTone: GrButtonTone\n}): string {\n if (options.disabled) {\n return [\n grButtonBaseClass,\n grButtonSizes[options.size],\n options.checked ? grRadioButtonDisabledCheckedClass : grRadioButtonDisabledClass,\n ].join(' ')\n }\n\n const variant = options.checked ? options.selectedButtonVariant : options.buttonVariant\n const tone = options.checked ? options.selectedButtonTone : options.buttonTone\n\n return [\n grButtonBaseClass,\n grButtonClass({\n variant,\n tone,\n size: options.size,\n square: false,\n }),\n options.readonly ? grRadioRootReadonlyClass : grRadioEnabledClass,\n ].join(' ')\n}\n\nexport function grRadioRootClass(options: { disabled: boolean, readonly: boolean }): string {\n if (options.disabled)\n return grRadioRootDisabledClass\n return options.readonly ? grRadioRootReadonlyClass : grRadioRootEnabledClass\n}\n\nexport function grRadioControlClass(options: {\n checked: boolean\n disabled: boolean\n invalid: boolean\n size: GrButtonSize\n}): string {\n const state = options.disabled\n ? grRadioControlDisabledClass\n : options.invalid && !options.checked\n ? grRadioControlInvalidClass\n : options.checked ? grRadioControlCheckedClass : grRadioControlUncheckedClass\n\n return [grRadioControlSizes[options.size], state].join(' ')\n}\n\nexport function grRadioDotClass(options: { checked: boolean, disabled: boolean }): string {\n if (!options.checked)\n return grRadioDotUncheckedClass\n\n return options.disabled ? grRadioDotDisabledClass : grRadioDotCheckedClass\n}\n"],"mappings":";;AAWA,IAAa,sBAAsB;;;;;;AAOnC,IAAa,6BAA6B;AAC1C,IAAa,oCAAoC;;;;;AAMjD,IAAa,2BAA2B;AACxC,IAAa,0BAA0B;;AAEvC,IAAa,2BAA2B;AAExC,IAAa,6BAA6B;AAC1C,IAAa,+BAA+B;AAC5C,IAAa,8BAA8B;AAC3C,IAAa,6BAA6B;AAE1C,IAAa,yBAAyB;AACtC,IAAa,2BAA2B;AACxC,IAAa,0BAA0B;AAGvC,IAAa,sBAAsB;;;;;;;;;AAUnC,IAAa,sBAAoD;CAC/D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,kBAAgD;CAC3D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAM,oBAAkD;CACtD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,0BAAwD;CACnE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,gCAAgC;AAC7C,IAAa,yBAAyB;AAEtC,SAAgB,qBAAqB,MAAoB,SAA0B;CACjF,OAAO,CACL,kBAAkB,OAClB,UAAU,gCAAgC,sBAC5C,CAAC,CAAC,KAAK,GAAG;AACZ;AAEA,IAAa,oBAAoB;AAEjC,SAAgB,mBAAmB,SASxB;CACT,IAAI,QAAQ,UACV,OAAO;EACL;EACA,MAAc,QAAQ;EACtB,QAAQ,UAAU,oCAAoC;CACxD,CAAC,CAAC,KAAK,GAAG;CAGZ,MAAM,UAAU,QAAQ,UAAU,QAAQ,wBAAwB,QAAQ;CAC1E,MAAM,OAAO,QAAQ,UAAU,QAAQ,qBAAqB,QAAQ;CAEpE,OAAO;EACL;EACA,cAAc;GACZ;GACA;GACA,MAAM,QAAQ;GACd,QAAQ;EACV,CAAC;EACD,QAAQ,WAAW,2BAA2B;CAChD,CAAC,CAAC,KAAK,GAAG;AACZ;AAEA,SAAgB,iBAAiB,SAA2D;CAC1F,IAAI,QAAQ,UACV,OAAO;CACT,OAAO,QAAQ,WAAW,2BAA2B;AACvD;AAEA,SAAgB,oBAAoB,SAKzB;CACT,MAAM,QAAQ,QAAQ,WAClB,8BACA,QAAQ,WAAW,CAAC,QAAQ,UAC1B,6BACA,QAAQ,UAAU,6BAA6B;CAErD,OAAO,CAAC,oBAAoB,QAAQ,OAAO,KAAK,CAAC,CAAC,KAAK,GAAG;AAC5D;AAEA,SAAgB,gBAAgB,SAA0D;CACxF,IAAI,CAAC,QAAQ,SACX,OAAO;CAET,OAAO,QAAQ,WAAW,0BAA0B;AACtD"}