@feugene/granularity 0.31.0 → 0.32.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 (287) hide show
  1. package/README.md +0 -1
  2. package/dist/chunks/adapter-CAOxmn2G.js.map +1 -1
  3. package/dist/chunks/{config-BHcS5Cwm.js → config-87fszqnD.js} +1 -1
  4. package/dist/chunks/{config-BHcS5Cwm.js.map → config-87fszqnD.js.map} +1 -1
  5. package/dist/chunks/config-A-bBiotF.js.map +1 -1
  6. package/dist/chunks/config-B3J0alyY.js.map +1 -1
  7. package/dist/chunks/config-BhfNgyWL.js.map +1 -1
  8. package/dist/chunks/config-Bjn30smH.js.map +1 -1
  9. package/dist/chunks/config-BqT6PMzO.js.map +1 -1
  10. package/dist/chunks/config-C0Ea9ePP.js.map +1 -1
  11. package/dist/chunks/config-C0Eu8jpG.js.map +1 -1
  12. package/dist/chunks/config-CDat1wXf.js.map +1 -1
  13. package/dist/chunks/config-CQLNjc9X2.js.map +1 -1
  14. package/dist/chunks/config-CbEbLyDE.js.map +1 -1
  15. package/dist/chunks/{config-jyr6AIZt2.js → config-CuQmUkMw2.js} +2 -2
  16. package/dist/chunks/{config-jyr6AIZt2.js.map → config-CuQmUkMw2.js.map} +1 -1
  17. package/dist/chunks/config-DeyT9dJl.js.map +1 -1
  18. package/dist/chunks/config-DnF472Ox.js.map +1 -1
  19. package/dist/chunks/config-DwABJHEo.js.map +1 -1
  20. package/dist/chunks/{config-tiUtEn4Q.js → config-E1cTyRVV.js} +1 -1
  21. package/dist/chunks/{config-tiUtEn4Q.js.map → config-E1cTyRVV.js.map} +1 -1
  22. package/dist/chunks/config-MmPym-Z72.js.map +1 -1
  23. package/dist/chunks/config-T3-DMXYm.js.map +1 -1
  24. package/dist/chunks/config-Yy67uWHY.js.map +1 -1
  25. package/dist/chunks/config-_jbgsFpw.js.map +1 -1
  26. package/dist/chunks/config-g8-JGZ_Y.js.map +1 -1
  27. package/dist/chunks/config-mlheIMtV.js.map +1 -1
  28. package/dist/chunks/config-rLkc9Zn2.js.map +1 -1
  29. package/dist/chunks/config-uzUuosv7.js.map +1 -1
  30. package/dist/chunks/context-CTbuwcYs.js.map +1 -1
  31. package/dist/chunks/deltaTone-B5OoS1vo.js.map +1 -1
  32. package/dist/chunks/es-Do2CNrC2.js.map +1 -1
  33. package/dist/chunks/fileValidation-D5TFBhbv.js.map +1 -1
  34. package/dist/chunks/focusables-BkzK42SQ.js.map +1 -1
  35. package/dist/chunks/{generated-DJ2dJ__C.js → generated-CSyPsWtM.js} +1 -1
  36. package/dist/chunks/{generated-DJ2dJ__C.js.map → generated-CSyPsWtM.js.map} +1 -1
  37. package/dist/chunks/grBadgeStyles-D8Mz73B5.js.map +1 -1
  38. package/dist/chunks/{grButtonStyles-B_-YRE__.js → grButtonStyles-B3wRWW_i.js} +4 -4
  39. package/dist/chunks/grButtonStyles-B3wRWW_i.js.map +1 -0
  40. package/dist/chunks/grLinkStyles-FME_qMpi.js.map +1 -1
  41. package/dist/chunks/grLoadingStyles-CnQaf5ry.js.map +1 -1
  42. package/dist/chunks/{grRadioStyles-D4gnU65n.js → grRadioStyles-DGL2QLy6.js} +1 -1
  43. package/dist/chunks/{grRadioStyles-D4gnU65n.js.map → grRadioStyles-DGL2QLy6.js.map} +1 -1
  44. package/dist/chunks/grSelectStyles-Cdtd10eY.js.map +1 -1
  45. package/dist/chunks/{grSliderStyles-B5uNxNJq.js → grSliderStyles-kaz6VXZ3.js} +9 -1
  46. package/dist/chunks/grSliderStyles-kaz6VXZ3.js.map +1 -0
  47. package/dist/chunks/{granular-provider-yJNX1g1G.js → granular-provider-Da2CJO6j.js} +3 -3
  48. package/dist/chunks/{granular-provider-yJNX1g1G.js.map → granular-provider-Da2CJO6j.js.map} +1 -1
  49. package/dist/chunks/granularityI18n-BC5zsj_d.js.map +1 -1
  50. package/dist/chunks/icon-Dag2tIMs.js.map +1 -1
  51. package/dist/chunks/inert-DIHCCn_1.js.map +1 -1
  52. package/dist/chunks/keyboard-DE2yhz_b.js.map +1 -1
  53. package/dist/chunks/numericStep-Bq2lj4ew.js.map +1 -1
  54. package/dist/chunks/optionFilter-DYw9XPPx.js.map +1 -1
  55. package/dist/chunks/{overlayStack-C8cfsqXa.js → overlayStack-0CZS99Da.js} +40 -6
  56. package/dist/chunks/overlayStack-0CZS99Da.js.map +1 -0
  57. package/dist/chunks/portalRoot-CVhCgdG6.js.map +1 -1
  58. package/dist/chunks/renamedProp-BwcN-SJg.js.map +1 -1
  59. package/dist/chunks/{safelist-BOq5Li7p.js → safelist-DxkMj5IW.js} +1 -1
  60. package/dist/chunks/{safelist-BOq5Li7p.js.map → safelist-DxkMj5IW.js.map} +1 -1
  61. package/dist/chunks/slotNodes-DxNXpC7v.js.map +1 -1
  62. package/dist/chunks/useControlAddons-asUr10Pf.js.map +1 -1
  63. package/dist/chunks/useControlledOpen-DV3SqLTP.js.map +1 -1
  64. package/dist/chunks/useDragSort-0l47h4yb.js.map +1 -1
  65. package/dist/chunks/useFilePreviews-DnwgdyBs.js.map +1 -1
  66. package/dist/chunks/useFocusWithin-BwHE0rzm.js.map +1 -1
  67. package/dist/chunks/{useModalOverlay-Cv5hF63W.js → useModalOverlay-D__CqLGn.js} +3 -0
  68. package/dist/chunks/useModalOverlay-D__CqLGn.js.map +1 -0
  69. package/dist/chunks/usePortalTarget-C0p-mhaM.js.map +1 -1
  70. package/dist/chunks/validation-5HhpanPP.js.map +1 -1
  71. package/dist/components/GrAlert/chunks/GrAlert-FAVf-ksH.js.map +1 -1
  72. package/dist/components/GrAutocomplete/chunks/{GrAutocomplete-X6RlmiJQ.js → GrAutocomplete-rYEY15UI.js} +1 -1
  73. package/dist/components/GrAutocomplete/chunks/GrAutocomplete-rYEY15UI.js.map +1 -0
  74. package/dist/components/GrAutocomplete/index.js +1 -1
  75. package/dist/components/GrAutocomplete/styles.css +1 -1
  76. package/dist/components/GrAvatar/chunks/GrAvatar-CNmLmgcr.js.map +1 -1
  77. package/dist/components/GrBadge/chunks/{GrBadge-BsoocpF-.js → GrBadge-D2MfThPz.js} +1 -1
  78. package/dist/components/GrBadge/chunks/GrBadge-D2MfThPz.js.map +1 -0
  79. package/dist/components/GrBadge/index.js +1 -1
  80. package/dist/components/GrBadge/styles.css +1 -1
  81. package/dist/components/GrBadgeWrap/chunks/GrBadgeWrap-B-A3PRkE.js.map +1 -1
  82. package/dist/components/GrBottomNav/chunks/GrBottomNav-wtFatLjB.js.map +1 -1
  83. package/dist/components/GrBreadcrumbs/chunks/GrBreadcrumbs-DRDNan_n.js.map +1 -1
  84. package/dist/components/GrButton/chunks/{GrButton-Bw2AH4uX.js → GrButton-7GP0zObj.js} +1 -1
  85. package/dist/components/GrButton/chunks/GrButton-7GP0zObj.js.map +1 -0
  86. package/dist/components/GrButton/index.js +3 -3
  87. package/dist/components/GrButtonGroup/chunks/GrButtonGroup-CKyiAV8K.js.map +1 -1
  88. package/dist/components/GrCard/chunks/GrCard-BttXz1pQ.js.map +1 -1
  89. package/dist/components/GrCheckbox/chunks/GrCheckbox-CEcHIsXM.js.map +1 -1
  90. package/dist/components/GrCheckboxGroup/chunks/GrCheckboxGroup-BOwrVcFr.js.map +1 -1
  91. package/dist/components/GrChip/chunks/GrChip-C0vU69tf.js.map +1 -1
  92. package/dist/components/GrChipGroup/chunks/GrChipGroup-C78Vcwos.js.map +1 -1
  93. package/dist/components/GrCodeBlock/chunks/{GrCodeBlock-Dkvkr91t.js → GrCodeBlock-Dp0eEBTZ.js} +1 -1
  94. package/dist/components/GrCodeBlock/chunks/GrCodeBlock-Dp0eEBTZ.js.map +1 -0
  95. package/dist/components/GrCodeBlock/index.js +1 -1
  96. package/dist/components/GrCollapse/chunks/GrCollapse-BlW6ybdL.js.map +1 -1
  97. package/dist/components/GrColorPicker/chunks/{GrColorPicker-C7ifyQ0R.js → GrColorPicker-p2XH_8cE.js} +2 -2
  98. package/dist/components/GrColorPicker/chunks/GrColorPicker-p2XH_8cE.js.map +1 -0
  99. package/dist/components/GrColorPicker/index.js +1 -1
  100. package/dist/components/GrCommandPalette/chunks/{GrCommandPalette-C5abL2Y7.js → GrCommandPalette-BXbh3q7O.js} +2 -2
  101. package/dist/components/GrCommandPalette/chunks/GrCommandPalette-BXbh3q7O.js.map +1 -0
  102. package/dist/components/GrCommandPalette/index.js +1 -1
  103. package/dist/components/GrCommandPalette/styles.css +1 -1
  104. package/dist/components/GrConfigProvider/chunks/GrConfigProvider-BF7R3hgg.js.map +1 -1
  105. package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-B9mIU78E.js → GrConfirmDialog-CUP43q__.js} +3 -3
  106. package/dist/components/GrConfirmDialog/chunks/GrConfirmDialog-CUP43q__.js.map +1 -0
  107. package/dist/components/GrConfirmDialog/index.js +1 -1
  108. package/dist/components/GrContextMenu/chunks/{GrContextMenu-_FKwQvuQ.js → GrContextMenu-ClkVjdcP.js} +1 -1
  109. package/dist/components/GrContextMenu/chunks/GrContextMenu-ClkVjdcP.js.map +1 -0
  110. package/dist/components/GrContextMenu/index.js +1 -1
  111. package/dist/components/GrDataTable/chunks/{GrDataTable-C8a9_nCg.js → GrDataTable-CAGgRk27.js} +5 -3
  112. package/dist/components/GrDataTable/chunks/GrDataTable-CAGgRk27.js.map +1 -0
  113. package/dist/components/GrDataTable/index.js +1 -1
  114. package/dist/components/GrDelta/chunks/GrDelta-BZwkgQW-.js.map +1 -1
  115. package/dist/components/GrDescriptionList/chunks/GrDescriptionList-BMeCgFV3.js.map +1 -1
  116. package/dist/components/GrDialog/chunks/{GrDialog-bOUDYfmh.js → GrDialog-BiMJ9_T4.js} +2 -2
  117. package/dist/components/GrDialog/chunks/{GrDialog-bOUDYfmh.js.map → GrDialog-BiMJ9_T4.js.map} +1 -1
  118. package/dist/components/GrDialog/index.js +1 -1
  119. package/dist/components/GrDialogService/chunks/{GrDialogService-6s2cQ-_6.js → GrDialogService-BxNK6crD.js} +4 -4
  120. package/dist/components/GrDialogService/chunks/GrDialogService-BxNK6crD.js.map +1 -0
  121. package/dist/components/GrDialogService/index.js +1 -1
  122. package/dist/components/GrDivider/chunks/GrDivider-BXavGcMX.js.map +1 -1
  123. package/dist/components/GrDrawer/chunks/{GrDrawer-B7PiAcbU.js → GrDrawer-Ce2l3zaG.js} +6 -5
  124. package/dist/components/GrDrawer/chunks/GrDrawer-Ce2l3zaG.js.map +1 -0
  125. package/dist/components/GrDrawer/index.js +1 -1
  126. package/dist/components/GrDropdown/chunks/GrDropdown-13Wt9eB_.js.map +1 -1
  127. package/dist/components/GrDropdownMenu/chunks/GrDropdownMenu-GOzuAXsi.js.map +1 -1
  128. package/dist/components/GrDropdownMenu/chunks/GrDropdownMenuList-B33ZzwfB.js.map +1 -1
  129. package/dist/components/GrFilePreview/chunks/GrFilePreview-C9Z7hMK8.js.map +1 -1
  130. package/dist/components/GrFileUpload/chunks/GrFileUpload-NsHkRRIa.js.map +1 -1
  131. package/dist/components/GrForm/chunks/GrForm-CrnfCsgj.js.map +1 -1
  132. package/dist/components/GrFormField/chunks/GrFormField-DSylU7IU.js.map +1 -1
  133. package/dist/components/GrFormFile/chunks/{GrFormFile-CYtXU9HV.js → GrFormFile-B1jGZyIj.js} +2 -2
  134. package/dist/components/GrFormFile/chunks/GrFormFile-B1jGZyIj.js.map +1 -0
  135. package/dist/components/GrFormFile/index.js +1 -1
  136. package/dist/components/GrFormFile/styles.css +1 -1
  137. package/dist/components/GrIcon/chunks/GrIcon-Dmf0c9ba.js.map +1 -1
  138. package/dist/components/GrImageViewer/chunks/{GrImageViewer-CyVN6Zpc.js → GrImageViewer-CG4vUBg_.js} +4 -3
  139. package/dist/components/GrImageViewer/chunks/GrImageViewer-CG4vUBg_.js.map +1 -0
  140. package/dist/components/GrImageViewer/index.js +1 -1
  141. package/dist/components/GrInput/chunks/GrInput-BLywRZUN.js.map +1 -1
  142. package/dist/components/GrInputTag/chunks/GrInputTag-Cj4A9Xgs.js.map +1 -1
  143. package/dist/components/GrJsonViewer/chunks/{GrJsonViewer-Cy2bknHO.js → GrJsonViewer-BCZ7lE2k.js} +2 -2
  144. package/dist/components/GrJsonViewer/chunks/GrJsonViewer-BCZ7lE2k.js.map +1 -0
  145. package/dist/components/GrJsonViewer/index.js +1 -1
  146. package/dist/components/GrKbd/chunks/GrKbd-D2ga1H9i.js.map +1 -1
  147. package/dist/components/GrLink/chunks/GrLink-DYXw3W9w.js.map +1 -1
  148. package/dist/components/GrList/chunks/{GrList-DmT4qzLO.js → GrList-B_CRJB4c.js} +1 -1
  149. package/dist/components/GrList/chunks/GrList-B_CRJB4c.js.map +1 -0
  150. package/dist/components/GrList/index.js +1 -1
  151. package/dist/components/GrList/styles.css +1 -1
  152. package/dist/components/GrModal/chunks/{GrModal-CCoWZuIl.js → GrModal-D0mf1SAx.js} +3 -2
  153. package/dist/components/GrModal/chunks/GrModal-D0mf1SAx.js.map +1 -0
  154. package/dist/components/GrModal/index.js +1 -1
  155. package/dist/components/GrNavbar/chunks/{GrNavbar-C5EjMKaC.js → GrNavbar-_rtHKwTf.js} +1 -1
  156. package/dist/components/GrNavbar/chunks/{GrNavbar-C5EjMKaC.js.map → GrNavbar-_rtHKwTf.js.map} +1 -1
  157. package/dist/components/GrNavbar/index.js +1 -1
  158. package/dist/components/GrNumberInput/chunks/GrNumberInput-DQ59YICu.js.map +1 -1
  159. package/dist/components/GrPagination/chunks/{GrPagination-Cw3R21dp.js → GrPagination-B_kAhoAV.js} +2 -2
  160. package/dist/components/GrPagination/chunks/{GrPagination-Cw3R21dp.js.map → GrPagination-B_kAhoAV.js.map} +1 -1
  161. package/dist/components/GrPagination/index.js +1 -1
  162. package/dist/components/GrPopover/chunks/{GrPopover-CofG-Tfe.js → GrPopover-faJanmGs.js} +1 -1
  163. package/dist/components/GrPopover/chunks/GrPopover-faJanmGs.js.map +1 -0
  164. package/dist/components/GrPopover/index.js +1 -1
  165. package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-DLcl1xiq.js → GrPromptDialog-C6QGC7QJ.js} +4 -4
  166. package/dist/components/GrPromptDialog/chunks/GrPromptDialog-C6QGC7QJ.js.map +1 -0
  167. package/dist/components/GrPromptDialog/index.js +1 -1
  168. package/dist/components/GrRadio/chunks/{GrRadio-C_rESc5g.js → GrRadio-Aq3v8XgG.js} +1 -1
  169. package/dist/components/GrRadio/chunks/GrRadio-Aq3v8XgG.js.map +1 -0
  170. package/dist/components/GrRadio/index.js +2 -2
  171. package/dist/components/GrRadioGroup/chunks/{GrRadioGroup-CdQO4G-U.js → GrRadioGroup-y9LVdTWh.js} +1 -1
  172. package/dist/components/GrRadioGroup/chunks/GrRadioGroup-y9LVdTWh.js.map +1 -0
  173. package/dist/components/GrRadioGroup/index.js +1 -1
  174. package/dist/components/GrRating/chunks/GrRating-IEiTOdnF.js.map +1 -1
  175. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-C_skObtv.js → GrResponseErrorBanner-CBVRpgIG.js} +1 -1
  176. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-C_skObtv.js.map → GrResponseErrorBanner-CBVRpgIG.js.map} +1 -1
  177. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-DudGc9LO.js → GrResponseErrorBanner-DMeOWlzj.js} +1 -1
  178. package/dist/components/GrResponseErrorBanner/chunks/GrResponseErrorBanner-DMeOWlzj.js.map +1 -0
  179. package/dist/components/GrResponseErrorBanner/index.js +2 -2
  180. package/dist/components/GrSegmented/chunks/GrSegmented-CB-VR-yL.js.map +1 -1
  181. package/dist/components/GrSelect/chunks/{GrSelect-BiUrSSxc.js → GrSelect-gCeRFgQo.js} +1 -1
  182. package/dist/components/GrSelect/chunks/GrSelect-gCeRFgQo.js.map +1 -0
  183. package/dist/components/GrSelect/index.js +1 -1
  184. package/dist/components/GrSelect/styles.css +1 -1
  185. package/dist/components/GrSidebar/chunks/{GrSidebar-B8EQIlfW.js → GrSidebar-alkwBUzL.js} +1 -1
  186. package/dist/components/GrSidebar/chunks/GrSidebar-alkwBUzL.js.map +1 -0
  187. package/dist/components/GrSidebar/index.js +1 -1
  188. package/dist/components/GrSkeleton/chunks/GrSkeleton-CgfXxPQ2.js.map +1 -1
  189. package/dist/components/GrSlider/chunks/{GrSlider-DJfeEl4h.js → GrSlider-DTTrZTHK.js} +3 -3
  190. package/dist/components/GrSlider/chunks/GrSlider-DTTrZTHK.js.map +1 -0
  191. package/dist/components/GrSlider/index.js +2 -2
  192. package/dist/components/GrSortableList/chunks/GrSortableList-HyKX--rO.js.map +1 -1
  193. package/dist/components/GrSplitter/chunks/GrSplitter-MltjaADn.js.map +1 -1
  194. package/dist/components/GrStatistic/chunks/GrStatistic-qHVasK37.js.map +1 -1
  195. package/dist/components/GrSteps/chunks/GrSteps-C2jxpZoN.js.map +1 -1
  196. package/dist/components/GrSwitch/chunks/{GrSwitch-g_OOSkh7.js → GrSwitch-7Oe5QfQZ.js} +1 -1
  197. package/dist/components/GrSwitch/chunks/GrSwitch-7Oe5QfQZ.js.map +1 -0
  198. package/dist/components/GrSwitch/index.js +1 -1
  199. package/dist/components/GrTabPanels/chunks/GrTabPanels-BZQS8-JM.js.map +1 -1
  200. package/dist/components/GrTable/chunks/GrTable-Zcdz2St_.js.map +1 -1
  201. package/dist/components/GrTextarea/chunks/{GrTextarea-KREK75Bu.js → GrTextarea-DinXG12-.js} +10 -10
  202. package/dist/components/GrTextarea/chunks/GrTextarea-DinXG12-.js.map +1 -0
  203. package/dist/components/GrTextarea/index.js +1 -1
  204. package/dist/components/GrTimeline/chunks/GrTimeline-BiHpArsg.js.map +1 -1
  205. package/dist/components/GrToaster/chunks/{GrToaster-Dp7-4B8k.js → GrToaster-COXIBKzq.js} +2 -2
  206. package/dist/components/GrToaster/chunks/GrToaster-COXIBKzq.js.map +1 -0
  207. package/dist/components/GrToaster/index.js +1 -1
  208. package/dist/components/GrToaster/styles.css +1 -1
  209. package/dist/components/GrTooltip/chunks/GrTooltip-uYETdbCD.js.map +1 -1
  210. package/dist/components/GrTree/chunks/{GrTree-DC89I4AP.js → GrTree-Ci6CZfKR.js} +5 -5
  211. package/dist/components/GrTree/chunks/GrTree-Ci6CZfKR.js.map +1 -0
  212. package/dist/components/GrTree/index.js +1 -1
  213. package/dist/components/GrTree/styles.css +1 -1
  214. package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-iJnMl2t9.js → GrTreeSelect-BHwgGJcT.js} +1 -1
  215. package/dist/components/GrTreeSelect/chunks/GrTreeSelect-BHwgGJcT.js.map +1 -0
  216. package/dist/components/GrTreeSelect/index.js +1 -1
  217. package/dist/composables/useAnnouncer.js.map +1 -1
  218. package/dist/composables/useComboboxNavigation.js.map +1 -1
  219. package/dist/composables/useDragGesture.js.map +1 -1
  220. package/dist/composables/useFloating.js +2 -22
  221. package/dist/composables/useFloating.js.map +1 -1
  222. package/dist/composables/useFocusTrap.js.map +1 -1
  223. package/dist/composables/useOverlayLayer.js +10 -3
  224. package/dist/composables/useOverlayLayer.js.map +1 -1
  225. package/dist/composables/useRovingFocus.js.map +1 -1
  226. package/dist/composables/useTheme.js.map +1 -1
  227. package/dist/composables/useToast.js.map +1 -1
  228. package/dist/composables/useVirtualList.js.map +1 -1
  229. package/dist/directives/autofocus.js.map +1 -1
  230. package/dist/directives/autosize.js.map +1 -1
  231. package/dist/directives/clickOutside.js.map +1 -1
  232. package/dist/directives/dropzone.js.map +1 -1
  233. package/dist/directives/hotkey.js.map +1 -1
  234. package/dist/directives/loading.js.map +1 -1
  235. package/dist/granular-provider-node.js +1 -1
  236. package/dist/granular-provider.js +1 -1
  237. package/dist/index.js +37 -37
  238. package/dist/testing.js +2 -2
  239. package/dist/testing.js.map +1 -1
  240. package/dist/theme-apply.js.map +1 -1
  241. package/dist/theme.js +1 -1
  242. package/dist/theme.js.map +1 -1
  243. package/dist/tokens.js +1 -1
  244. package/dist/types/components/GrCodeBlock/tokenizeJson.d.ts +1 -3
  245. package/dist/types/components/GrImageViewer/GrImageViewer.vue.d.ts +1 -1
  246. package/dist/types/components/GrInput/GrInput.vue.d.ts +24 -24
  247. package/dist/types/components/GrSlider/grSliderStyles.d.ts +9 -1
  248. package/dist/types/components/GrTabPanels/GrTabPanel.vue.d.ts +3 -3
  249. package/dist/types/composables/internal/overlayStack.d.ts +30 -0
  250. package/dist/types/composables/internal/useModalOverlay.d.ts +14 -0
  251. package/dist/types/composables/useOverlayLayer.d.ts +8 -0
  252. package/dist/vue/index.js.map +1 -1
  253. package/dist/web-types.json +1 -1
  254. package/package.json +3 -3
  255. package/dist/chunks/grButtonStyles-B_-YRE__.js.map +0 -1
  256. package/dist/chunks/grSliderStyles-B5uNxNJq.js.map +0 -1
  257. package/dist/chunks/overlayStack-C8cfsqXa.js.map +0 -1
  258. package/dist/chunks/useModalOverlay-Cv5hF63W.js.map +0 -1
  259. package/dist/components/GrAutocomplete/chunks/GrAutocomplete-X6RlmiJQ.js.map +0 -1
  260. package/dist/components/GrBadge/chunks/GrBadge-BsoocpF-.js.map +0 -1
  261. package/dist/components/GrButton/chunks/GrButton-Bw2AH4uX.js.map +0 -1
  262. package/dist/components/GrCodeBlock/chunks/GrCodeBlock-Dkvkr91t.js.map +0 -1
  263. package/dist/components/GrColorPicker/chunks/GrColorPicker-C7ifyQ0R.js.map +0 -1
  264. package/dist/components/GrCommandPalette/chunks/GrCommandPalette-C5abL2Y7.js.map +0 -1
  265. package/dist/components/GrConfirmDialog/chunks/GrConfirmDialog-B9mIU78E.js.map +0 -1
  266. package/dist/components/GrContextMenu/chunks/GrContextMenu-_FKwQvuQ.js.map +0 -1
  267. package/dist/components/GrDataTable/chunks/GrDataTable-C8a9_nCg.js.map +0 -1
  268. package/dist/components/GrDialogService/chunks/GrDialogService-6s2cQ-_6.js.map +0 -1
  269. package/dist/components/GrDrawer/chunks/GrDrawer-B7PiAcbU.js.map +0 -1
  270. package/dist/components/GrFormFile/chunks/GrFormFile-CYtXU9HV.js.map +0 -1
  271. package/dist/components/GrImageViewer/chunks/GrImageViewer-CyVN6Zpc.js.map +0 -1
  272. package/dist/components/GrJsonViewer/chunks/GrJsonViewer-Cy2bknHO.js.map +0 -1
  273. package/dist/components/GrList/chunks/GrList-DmT4qzLO.js.map +0 -1
  274. package/dist/components/GrModal/chunks/GrModal-CCoWZuIl.js.map +0 -1
  275. package/dist/components/GrPopover/chunks/GrPopover-CofG-Tfe.js.map +0 -1
  276. package/dist/components/GrPromptDialog/chunks/GrPromptDialog-DLcl1xiq.js.map +0 -1
  277. package/dist/components/GrRadio/chunks/GrRadio-C_rESc5g.js.map +0 -1
  278. package/dist/components/GrRadioGroup/chunks/GrRadioGroup-CdQO4G-U.js.map +0 -1
  279. package/dist/components/GrResponseErrorBanner/chunks/GrResponseErrorBanner-DudGc9LO.js.map +0 -1
  280. package/dist/components/GrSelect/chunks/GrSelect-BiUrSSxc.js.map +0 -1
  281. package/dist/components/GrSidebar/chunks/GrSidebar-B8EQIlfW.js.map +0 -1
  282. package/dist/components/GrSlider/chunks/GrSlider-DJfeEl4h.js.map +0 -1
  283. package/dist/components/GrSwitch/chunks/GrSwitch-g_OOSkh7.js.map +0 -1
  284. package/dist/components/GrTextarea/chunks/GrTextarea-KREK75Bu.js.map +0 -1
  285. package/dist/components/GrToaster/chunks/GrToaster-Dp7-4B8k.js.map +0 -1
  286. package/dist/components/GrTree/chunks/GrTree-DC89I4AP.js.map +0 -1
  287. package/dist/components/GrTreeSelect/chunks/GrTreeSelect-iJnMl2t9.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"grBadgeStyles-D8Mz73B5.js","names":[],"sources":["../../src/components/GrBadge/grBadgeStyles.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nimport type { GrTone } from '../shared/tones'\n\nexport type GrBadgeTone = GrTone\nexport type GrBadgeSize = GrComponentSize\nexport type GrBadgeRadius = 'square' | 'semi' | 'round'\nexport const sizeClassBySize: Record<GrBadgeSize, string> = {\n xs: 'px-2 py-0.4 text-[length:var(--gr-control-text-2xs)] leading-[var(--gr-control-leading-2xs)]',\n sm: 'px-2.5 py-0.5 text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]',\n md: 'px-3 py-1 text-[length:var(--gr-control-text-sm)] leading-[var(--gr-control-leading-sm)]',\n lg: 'px-3.5 py-1.5 text-[length:var(--gr-control-text-md)] leading-[var(--gr-control-leading-md)]',\n}\nexport const semiRadiusClassBySize: Record<GrBadgeSize, string> = {\n xs: 'rounded-[var(--gr-badge-semi-radius-xs,3px)]',\n sm: 'rounded-[var(--gr-badge-semi-radius-sm,3px)]',\n md: 'rounded-[var(--gr-badge-semi-radius-md,5px)]',\n lg: 'rounded-[var(--gr-badge-semi-radius-lg,7px)]',\n}\nexport const lightToneClassByTone: Record<GrBadgeTone, string> = {\n neutral: 'bg-[var(--gr-muted)] text-[var(--gr-fg)] border-[var(--gr-brd)]',\n primary:\n 'bg-[var(--gr-accent)] text-[var(--gr-accent-fg)] border-[color-mix(in_srgb,var(--gr-primary)_30%,var(--gr-accent))]',\n // Текст на тонированной подложке — только `-text`, никогда не насыщенный тон:\n // `--gr-success` на `--gr-success-light` даёт 2.24:1, `-text` — 6.78:1.\n // slate/azure ниже уже были сделаны правильно.\n success: 'bg-[var(--gr-success-light)] text-[var(--gr-success-text)] border-[color-mix(in_srgb,var(--gr-success)_30%,var(--gr-success-light))]',\n warning: 'bg-[var(--gr-warning-light)] text-[var(--gr-warning-text)] border-[color-mix(in_srgb,var(--gr-warning)_30%,var(--gr-warning-light))]',\n danger: 'bg-[var(--gr-danger-light)] text-[var(--gr-danger-text)] border-[color-mix(in_srgb,var(--gr-danger)_30%,var(--gr-danger-light))]',\n info: 'bg-[var(--gr-info-light)] text-[var(--gr-info-text)] border-[color-mix(in_srgb,var(--gr-info)_30%,var(--gr-info-light))]',\n slate: 'bg-[var(--gr-slate-light)] text-[var(--gr-slate-text)] border-[color-mix(in_srgb,var(--gr-slate)_30%,var(--gr-slate-light))]',\n azure: 'bg-[var(--gr-azure-light)] text-[var(--gr-azure-text)] border-[color-mix(in_srgb,var(--gr-azure)_30%,var(--gr-azure-light))]',\n}\n/**\n * Заливка filled-бейджа идёт через покомпонентный слой `--gr-badge-{tone}-*`, а\n * не напрямую из роли тона, потому что нужный вес у тем разный.\n *\n * В светлой теме `--gr-{tone}` — это яркая заливка под **тёмный** текст (`-fg`\n * там обязан быть тёмным: белый на `--gr-success` даёт 2.54:1), и filled-бейдж\n * читался как тяжёлая почти чёрная плашка. Слой уводит его на `-solid`/`-solid-fg`\n * — заливку кнопочного веса под светлый текст, ту же, что у solid-кнопок.\n * В тёмной теме пастельная заливка с тёмным текстом — штатная конвенция, и слой\n * оставляет прежние роли. Значения — `themes/{light,dark}.css`.\n */\nexport const darkToneClassByTone: Record<GrBadgeTone, string> = {\n // Нейтральный вес — инверсия страницы, а не тон: `-solid`-роли у него нет.\n neutral: 'bg-[var(--gr-badge-neutral-bg,var(--gr-fg))] text-[var(--gr-badge-neutral-fg,var(--gr-bg))] border-[color-mix(in_srgb,var(--gr-fg)_35%,var(--gr-brd))]',\n primary: 'bg-[var(--gr-badge-primary-bg,var(--gr-primary-solid))] text-[var(--gr-badge-primary-fg,var(--gr-primary-solid-fg))] border-[var(--gr-badge-primary-bg,var(--gr-primary-solid))]',\n success: 'bg-[var(--gr-badge-success-bg,var(--gr-success-solid))] text-[var(--gr-badge-success-fg,var(--gr-success-solid-fg))] border-[var(--gr-badge-success-bg,var(--gr-success-solid))]',\n warning: 'bg-[var(--gr-badge-warning-bg,var(--gr-warning-solid))] text-[var(--gr-badge-warning-fg,var(--gr-warning-solid-fg))] border-[var(--gr-badge-warning-bg,var(--gr-warning-solid))]',\n danger: 'bg-[var(--gr-badge-danger-bg,var(--gr-danger-solid))] text-[var(--gr-badge-danger-fg,var(--gr-danger-solid-fg))] border-[var(--gr-badge-danger-bg,var(--gr-danger-solid))]',\n info: 'bg-[var(--gr-badge-info-bg,var(--gr-info-solid))] text-[var(--gr-badge-info-fg,var(--gr-info-solid-fg))] border-[var(--gr-badge-info-bg,var(--gr-info-solid))]',\n slate: 'bg-[var(--gr-badge-slate-bg,var(--gr-slate-solid))] text-[var(--gr-badge-slate-fg,var(--gr-slate-solid-fg))] border-[var(--gr-badge-slate-bg,var(--gr-slate-solid))]',\n azure: 'bg-[var(--gr-badge-azure-bg,var(--gr-azure-solid))] text-[var(--gr-badge-azure-fg,var(--gr-azure-solid-fg))] border-[var(--gr-badge-azure-bg,var(--gr-azure-solid))]',\n}\n/**\n * Экспортируются ради `GrChip`: у чипа те же три радиуса и та же палитра тонов,\n * и копия этих двух ветвлений разошлась бы с оригиналом молча. Свои у чипа\n * только размеры — он интерактивен, и цель нажатия у него не метки, а контрола.\n */\nexport function radiusClass(radius: GrBadgeRadius, size: GrBadgeSize): string {\n if (radius === 'square') return 'rounded-[var(--gr-radius-none)]'\n if (radius === 'semi') return semiRadiusClassBySize[size]\n return 'rounded-[var(--gr-radius-full)]'\n}\nexport function toneClass(tone: GrBadgeTone, dark: boolean): string {\n return dark ? darkToneClassByTone[tone] : lightToneClassByTone[tone]\n}\nexport function grBadgeClass(options: { tone: GrBadgeTone, dark: boolean, size: GrBadgeSize, radius: GrBadgeRadius }): string {\n return [\n radiusClass(options.radius, options.size),\n sizeClassBySize[options.size],\n toneClass(options.tone, options.dark),\n ].join(' ')\n}\n"],"mappings":";AAOA,IAAa,kBAA+C;CAC1D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AACA,IAAa,wBAAqD;CAChE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AACA,IAAa,uBAAoD;CAC/D,SAAS;CACT,SACE;CAIF,SAAS;CACT,SAAS;CACT,QAAQ;CACR,MAAM;CACN,OAAO;CACP,OAAO;AACT;;;;;;;;;;;;AAYA,IAAa,sBAAmD;CAE9D,SAAS;CACT,SAAS;CACT,SAAS;CACT,SAAS;CACT,QAAQ;CACR,MAAM;CACN,OAAO;CACP,OAAO;AACT;;;;;;AAMA,SAAgB,YAAY,QAAuB,MAA2B;CAC5E,IAAI,WAAW,UAAU,OAAO;CAChC,IAAI,WAAW,QAAQ,OAAO,sBAAsB;CACpD,OAAO;AACT;AACA,SAAgB,UAAU,MAAmB,MAAuB;CAClE,OAAO,OAAO,oBAAoB,QAAQ,qBAAqB;AACjE;AACA,SAAgB,aAAa,SAAiG;CAC5H,OAAO;EACL,YAAY,QAAQ,QAAQ,QAAQ,IAAI;EACxC,gBAAgB,QAAQ;EACxB,UAAU,QAAQ,MAAM,QAAQ,IAAI;CACtC,CAAC,CAAC,KAAK,GAAG;AACZ"}
1
+ {"version":3,"file":"grBadgeStyles-D8Mz73B5.js","names":[],"sources":["../../src/components/GrBadge/grBadgeStyles.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nimport type { GrTone } from '../shared/tones'\n\nexport type GrBadgeTone = GrTone\nexport type GrBadgeSize = GrComponentSize\nexport type GrBadgeRadius = 'square' | 'semi' | 'round'\nexport const sizeClassBySize: Record<GrBadgeSize, string> = {\n xs: 'px-2 py-0.4 text-[length:var(--gr-control-text-2xs)] leading-[var(--gr-control-leading-2xs)]',\n sm: 'px-2.5 py-0.5 text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]',\n md: 'px-3 py-1 text-[length:var(--gr-control-text-sm)] leading-[var(--gr-control-leading-sm)]',\n lg: 'px-3.5 py-1.5 text-[length:var(--gr-control-text-md)] leading-[var(--gr-control-leading-md)]',\n}\nexport const semiRadiusClassBySize: Record<GrBadgeSize, string> = {\n xs: 'rounded-[var(--gr-badge-semi-radius-xs,3px)]',\n sm: 'rounded-[var(--gr-badge-semi-radius-sm,3px)]',\n md: 'rounded-[var(--gr-badge-semi-radius-md,5px)]',\n lg: 'rounded-[var(--gr-badge-semi-radius-lg,7px)]',\n}\nexport const lightToneClassByTone: Record<GrBadgeTone, string> = {\n neutral: 'bg-[var(--gr-muted)] text-[var(--gr-fg)] border-[var(--gr-brd)]',\n primary:\n 'bg-[var(--gr-accent)] text-[var(--gr-accent-fg)] border-[color-mix(in_srgb,var(--gr-primary)_30%,var(--gr-accent))]',\n // Текст на тонированной подложке — только `-text`, никогда не насыщенный тон:\n // `--gr-success` на `--gr-success-light` даёт 2.24:1, `-text` — 6.78:1.\n // slate/azure ниже уже были сделаны правильно.\n success: 'bg-[var(--gr-success-light)] text-[var(--gr-success-text)] border-[color-mix(in_srgb,var(--gr-success)_30%,var(--gr-success-light))]',\n warning: 'bg-[var(--gr-warning-light)] text-[var(--gr-warning-text)] border-[color-mix(in_srgb,var(--gr-warning)_30%,var(--gr-warning-light))]',\n danger: 'bg-[var(--gr-danger-light)] text-[var(--gr-danger-text)] border-[color-mix(in_srgb,var(--gr-danger)_30%,var(--gr-danger-light))]',\n info: 'bg-[var(--gr-info-light)] text-[var(--gr-info-text)] border-[color-mix(in_srgb,var(--gr-info)_30%,var(--gr-info-light))]',\n slate: 'bg-[var(--gr-slate-light)] text-[var(--gr-slate-text)] border-[color-mix(in_srgb,var(--gr-slate)_30%,var(--gr-slate-light))]',\n azure: 'bg-[var(--gr-azure-light)] text-[var(--gr-azure-text)] border-[color-mix(in_srgb,var(--gr-azure)_30%,var(--gr-azure-light))]',\n}\n/**\n * Заливка filled-бейджа идёт через покомпонентный слой `--gr-badge-{tone}-*`, а\n * не напрямую из роли тона, потому что нужный вес у тем разный.\n *\n * В светлой теме `--gr-{tone}` — это яркая заливка под **тёмный** текст (`-fg`\n * там обязан быть тёмным: белый на `--gr-success` даёт 2.54:1), и filled-бейдж\n * читался как тяжёлая почти чёрная плашка. Слой уводит его на `-solid`/`-solid-fg`\n * — заливку кнопочного веса под светлый текст, ту же, что у solid-кнопок.\n * В тёмной теме пастельная заливка с тёмным текстом — штатная конвенция, и слой\n * оставляет прежние роли. Значения — `themes/{light,dark}.css`.\n */\nexport const darkToneClassByTone: Record<GrBadgeTone, string> = {\n // Нейтральный вес — инверсия страницы, а не тон: `-solid`-роли у него нет.\n neutral: 'bg-[var(--gr-badge-neutral-bg,var(--gr-fg))] text-[var(--gr-badge-neutral-fg,var(--gr-bg))] border-[color-mix(in_srgb,var(--gr-fg)_35%,var(--gr-brd))]',\n primary: 'bg-[var(--gr-badge-primary-bg,var(--gr-primary-solid))] text-[var(--gr-badge-primary-fg,var(--gr-primary-solid-fg))] border-[var(--gr-badge-primary-bg,var(--gr-primary-solid))]',\n success: 'bg-[var(--gr-badge-success-bg,var(--gr-success-solid))] text-[var(--gr-badge-success-fg,var(--gr-success-solid-fg))] border-[var(--gr-badge-success-bg,var(--gr-success-solid))]',\n warning: 'bg-[var(--gr-badge-warning-bg,var(--gr-warning-solid))] text-[var(--gr-badge-warning-fg,var(--gr-warning-solid-fg))] border-[var(--gr-badge-warning-bg,var(--gr-warning-solid))]',\n danger: 'bg-[var(--gr-badge-danger-bg,var(--gr-danger-solid))] text-[var(--gr-badge-danger-fg,var(--gr-danger-solid-fg))] border-[var(--gr-badge-danger-bg,var(--gr-danger-solid))]',\n info: 'bg-[var(--gr-badge-info-bg,var(--gr-info-solid))] text-[var(--gr-badge-info-fg,var(--gr-info-solid-fg))] border-[var(--gr-badge-info-bg,var(--gr-info-solid))]',\n slate: 'bg-[var(--gr-badge-slate-bg,var(--gr-slate-solid))] text-[var(--gr-badge-slate-fg,var(--gr-slate-solid-fg))] border-[var(--gr-badge-slate-bg,var(--gr-slate-solid))]',\n azure: 'bg-[var(--gr-badge-azure-bg,var(--gr-azure-solid))] text-[var(--gr-badge-azure-fg,var(--gr-azure-solid-fg))] border-[var(--gr-badge-azure-bg,var(--gr-azure-solid))]',\n}\n/**\n * Экспортируются ради `GrChip`: у чипа те же три радиуса и та же палитра тонов,\n * и копия этих двух ветвлений разошлась бы с оригиналом молча. Свои у чипа\n * только размеры — он интерактивен, и цель нажатия у него не метки, а контрола.\n */\nexport function radiusClass(radius: GrBadgeRadius, size: GrBadgeSize): string {\n if (radius === 'square')\n return 'rounded-[var(--gr-radius-none)]'\n if (radius === 'semi')\n return semiRadiusClassBySize[size]\n return 'rounded-[var(--gr-radius-full)]'\n}\nexport function toneClass(tone: GrBadgeTone, dark: boolean): string {\n return dark ? darkToneClassByTone[tone] : lightToneClassByTone[tone]\n}\nexport function grBadgeClass(options: { tone: GrBadgeTone, dark: boolean, size: GrBadgeSize, radius: GrBadgeRadius }): string {\n return [\n radiusClass(options.radius, options.size),\n sizeClassBySize[options.size],\n toneClass(options.tone, options.dark),\n ].join(' ')\n}\n"],"mappings":";AAOA,IAAa,kBAA+C;CAC1D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AACA,IAAa,wBAAqD;CAChE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AACA,IAAa,uBAAoD;CAC/D,SAAS;CACT,SACE;CAIF,SAAS;CACT,SAAS;CACT,QAAQ;CACR,MAAM;CACN,OAAO;CACP,OAAO;AACT;;;;;;;;;;;;AAYA,IAAa,sBAAmD;CAE9D,SAAS;CACT,SAAS;CACT,SAAS;CACT,SAAS;CACT,QAAQ;CACR,MAAM;CACN,OAAO;CACP,OAAO;AACT;;;;;;AAMA,SAAgB,YAAY,QAAuB,MAA2B;CAC5E,IAAI,WAAW,UACb,OAAO;CACT,IAAI,WAAW,QACb,OAAO,sBAAsB;CAC/B,OAAO;AACT;AACA,SAAgB,UAAU,MAAmB,MAAuB;CAClE,OAAO,OAAO,oBAAoB,QAAQ,qBAAqB;AACjE;AACA,SAAgB,aAAa,SAAiG;CAC5H,OAAO;EACL,YAAY,QAAQ,QAAQ,QAAQ,IAAI;EACxC,gBAAgB,QAAQ;EACxB,UAAU,QAAQ,MAAM,QAAQ,IAAI;CACtC,CAAC,CAAC,KAAK,GAAG;AACZ"}
@@ -14,10 +14,10 @@ var blockClass = "w-full";
14
14
  * иначе стрелка пагинации превращалась бы в залитую плашку.
15
15
  */
16
16
  var disabledClassByVariant = {
17
- primary: "bg-[var(--gr-button-disabled-bg)] text-[var(--gr-button-disabled-fg)] border border-[var(--gr-button-disabled-brd)] cursor-not-allowed",
18
- secondary: "bg-[var(--gr-button-disabled-bg)] text-[var(--gr-button-disabled-fg)] border border-[var(--gr-button-disabled-brd)] cursor-not-allowed",
19
- outline: "bg-transparent text-[var(--gr-button-disabled-fg)] border border-[var(--gr-button-disabled-brd)] cursor-not-allowed",
20
- ghost: "bg-transparent text-[var(--gr-button-disabled-fg)] cursor-not-allowed",
17
+ "primary": "bg-[var(--gr-button-disabled-bg)] text-[var(--gr-button-disabled-fg)] border border-[var(--gr-button-disabled-brd)] cursor-not-allowed",
18
+ "secondary": "bg-[var(--gr-button-disabled-bg)] text-[var(--gr-button-disabled-fg)] border border-[var(--gr-button-disabled-brd)] cursor-not-allowed",
19
+ "outline": "bg-transparent text-[var(--gr-button-disabled-fg)] border border-[var(--gr-button-disabled-brd)] cursor-not-allowed",
20
+ "ghost": "bg-transparent text-[var(--gr-button-disabled-fg)] cursor-not-allowed",
21
21
  "ghost-border": "bg-transparent text-[var(--gr-button-disabled-fg)] border border-transparent cursor-not-allowed"
22
22
  };
23
23
  var grButtonBaseClass = base;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grButtonStyles-B3wRWW_i.js","names":[],"sources":["../../src/components/GrButton/grButtonStyles.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nimport type { GrTone } from '../shared/tones'\n\nexport type GrButtonVariant = 'primary' | 'secondary' | 'outline' | 'ghost' | 'ghost-border'\nexport type GrButtonTone = GrTone\nexport type GrButtonSize = GrComponentSize\n\nexport type GrButtonClassOptions = {\n variant: GrButtonVariant\n tone: GrButtonTone\n size: GrButtonSize\n square: boolean\n /** Необязательные: `grButtonClass` — публичный хелпер, его зовёт и `GrRadio`. */\n disabled?: boolean\n block?: boolean\n}\n\nexport type GrButtonToneTokens = {\n solidBackground: string\n solidBackgroundHover: string\n solidBackgroundActive: string\n solidForeground: string\n accentText: string\n softBackground: string\n softBackgroundHover: string\n softBackgroundActive: string\n softForeground: string\n border: string\n borderHover: string\n borderActive: string\n}\n\nexport const base\n = 'inline-flex items-center justify-center gap-2 select-none whitespace-nowrap rounded-[var(--gr-button-radius,0.375rem)] transition-colors duration-[var(--gr-duration-fast)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)] disabled:cursor-not-allowed'\n\n/** Кнопка на всю ширину контейнера. */\nexport const blockClass = 'w-full'\n\n/**\n * Отключённая кнопка гасится токенами, а не `opacity`: прозрачность разбавляет\n * выверенные на AA цвета, а кнопка чаще всего оказывается на цветной подложке,\n * где разбавленный текст проваливается первым.\n *\n * Классы применяются ВМЕСТО вариантных, а не поверх: два `bg-*` одной\n * специфичности разрулил бы порядок в сгенерированном CSS, а не порядок в\n * списке классов. Отсюда же и разбиение по вариантам: у прозрачных\n * (`outline`, `ghost`, `ghost-border`) заливки нет и в отключённом виде —\n * иначе стрелка пагинации превращалась бы в залитую плашку.\n */\nexport const disabledClassByVariant: Record<GrButtonVariant, string> = {\n 'primary': 'bg-[var(--gr-button-disabled-bg)] text-[var(--gr-button-disabled-fg)] border border-[var(--gr-button-disabled-brd)] cursor-not-allowed',\n 'secondary': 'bg-[var(--gr-button-disabled-bg)] text-[var(--gr-button-disabled-fg)] border border-[var(--gr-button-disabled-brd)] cursor-not-allowed',\n 'outline': 'bg-transparent text-[var(--gr-button-disabled-fg)] border border-[var(--gr-button-disabled-brd)] cursor-not-allowed',\n 'ghost': 'bg-transparent text-[var(--gr-button-disabled-fg)] cursor-not-allowed',\n 'ghost-border': 'bg-transparent text-[var(--gr-button-disabled-fg)] border border-transparent cursor-not-allowed',\n}\n\nexport const grButtonBaseClass = base\n\nexport const sizes: Record<GrButtonSize, string> = {\n xs: 'h-7 text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)] px-2.5',\n sm: 'h-8 text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)] px-3',\n md: 'h-10 text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)] px-4',\n lg: 'h-11 text-[length:var(--gr-text-base)] leading-[var(--gr-leading-base)] px-5',\n}\n\n/**\n * Квадратный режим — через `--gr-button-square-size` с размерным дефолтом в\n * fallback: потребитель задаёт переменную в своём CSS и подгоняет кнопку под\n * свою сетку (приём из `GrSlider`). Размер задаётся только здесь: инлайн-стиль\n * в SFC перекрыл бы эти классы, и переменная перестала бы что-либо значить.\n */\nexport const squareSizes: Record<GrButtonSize, string> = {\n xs: 'h-[var(--gr-button-square-size,1.75rem)] w-[var(--gr-button-square-size,1.75rem)] min-w-[var(--gr-button-square-size,1.75rem)] p-0',\n sm: 'h-[var(--gr-button-square-size,2rem)] w-[var(--gr-button-square-size,2rem)] min-w-[var(--gr-button-square-size,2rem)] p-0',\n md: 'h-[var(--gr-button-square-size,2.5rem)] w-[var(--gr-button-square-size,2.5rem)] min-w-[var(--gr-button-square-size,2.5rem)] p-0',\n lg: 'h-[var(--gr-button-square-size,2.75rem)] w-[var(--gr-button-square-size,2.75rem)] min-w-[var(--gr-button-square-size,2.75rem)] p-0',\n}\n\nexport const tones: Record<GrButtonTone, GrButtonToneTokens> = {\n primary: {\n solidBackground: 'var(--gr-button-primary-bg,var(--gr-primary))',\n solidBackgroundHover: 'var(--gr-button-primary-bg-hover,var(--gr-primary-hover))',\n solidBackgroundActive: 'var(--gr-button-primary-bg-active,var(--gr-primary-active))',\n solidForeground: 'var(--gr-button-primary-fg,var(--gr-primary-fg))',\n accentText: 'var(--gr-accent-fg)',\n softBackground: 'var(--gr-button-primary-soft-bg)',\n softBackgroundHover: 'var(--gr-button-primary-soft-bg-hover)',\n softBackgroundActive: 'var(--gr-button-primary-soft-bg-active)',\n softForeground: 'var(--gr-accent-fg)',\n border: 'var(--gr-primary)',\n borderHover: 'var(--gr-primary-hover)',\n borderActive: 'var(--gr-primary-active)',\n },\n neutral: {\n solidBackground: 'var(--gr-secondary)',\n solidBackgroundHover: 'var(--gr-secondary-hover)',\n solidBackgroundActive: 'var(--gr-secondary-active)',\n solidForeground: 'var(--gr-secondary-fg)',\n accentText: 'var(--gr-fg)',\n softBackground: 'var(--gr-secondary)',\n softBackgroundHover: 'var(--gr-secondary-hover)',\n softBackgroundActive: 'var(--gr-secondary-active)',\n softForeground: 'var(--gr-secondary-fg)',\n border: 'var(--gr-brd)',\n borderHover: 'var(--gr-brd-hover,var(--gr-brd))',\n borderActive: 'var(--gr-brd-active,var(--gr-brd))',\n },\n success: {\n solidBackground: 'var(--gr-button-success-bg,var(--gr-success))',\n solidBackgroundHover: 'var(--gr-button-success-bg-hover,var(--gr-success-hover))',\n solidBackgroundActive: 'var(--gr-button-success-bg-active,var(--gr-success-active))',\n solidForeground: 'var(--gr-button-success-fg,var(--gr-success-fg,var(--gr-fg)))',\n accentText: 'var(--gr-success-text,var(--gr-success))',\n softBackground: 'var(--gr-button-success-soft-bg)',\n softBackgroundHover: 'var(--gr-button-success-soft-bg-hover)',\n softBackgroundActive: 'var(--gr-button-success-soft-bg-active)',\n softForeground: 'var(--gr-success-text,var(--gr-success))',\n border: 'var(--gr-success)',\n borderHover: 'var(--gr-success-hover)',\n borderActive: 'var(--gr-success-active)',\n },\n warning: {\n solidBackground: 'var(--gr-button-warning-bg,var(--gr-warning))',\n solidBackgroundHover: 'var(--gr-button-warning-bg-hover,var(--gr-warning-hover))',\n solidBackgroundActive: 'var(--gr-button-warning-bg-active,var(--gr-warning-active))',\n solidForeground: 'var(--gr-button-warning-fg,var(--gr-warning-fg,var(--gr-fg)))',\n accentText: 'var(--gr-warning-text,var(--gr-warning))',\n softBackground: 'var(--gr-button-warning-soft-bg)',\n softBackgroundHover: 'var(--gr-button-warning-soft-bg-hover)',\n softBackgroundActive: 'var(--gr-button-warning-soft-bg-active)',\n softForeground: 'var(--gr-warning-text,var(--gr-warning))',\n border: 'var(--gr-warning)',\n borderHover: 'var(--gr-warning-hover)',\n borderActive: 'var(--gr-warning-active)',\n },\n danger: {\n solidBackground: 'var(--gr-button-danger-bg,var(--gr-danger))',\n solidBackgroundHover: 'var(--gr-button-danger-bg-hover,var(--gr-danger-hover))',\n solidBackgroundActive: 'var(--gr-button-danger-bg-active,var(--gr-danger-active))',\n solidForeground: 'var(--gr-button-danger-fg,var(--gr-danger-fg,var(--gr-fg)))',\n accentText: 'var(--gr-danger-text,var(--gr-danger))',\n softBackground: 'var(--gr-button-danger-soft-bg)',\n softBackgroundHover: 'var(--gr-button-danger-soft-bg-hover)',\n softBackgroundActive: 'var(--gr-button-danger-soft-bg-active)',\n softForeground: 'var(--gr-danger-text,var(--gr-danger))',\n border: 'var(--gr-danger)',\n borderHover: 'var(--gr-danger-hover)',\n borderActive: 'var(--gr-danger-active)',\n },\n info: {\n solidBackground: 'var(--gr-button-info-bg,var(--gr-info))',\n solidBackgroundHover: 'var(--gr-button-info-bg-hover,var(--gr-info-hover))',\n solidBackgroundActive: 'var(--gr-button-info-bg-active,var(--gr-info-active))',\n solidForeground: 'var(--gr-button-info-fg,var(--gr-info-fg,var(--gr-fg)))',\n accentText: 'var(--gr-info-text,var(--gr-info))',\n softBackground: 'var(--gr-button-info-soft-bg)',\n softBackgroundHover: 'var(--gr-button-info-soft-bg-hover)',\n softBackgroundActive: 'var(--gr-button-info-soft-bg-active)',\n softForeground: 'var(--gr-info-text,var(--gr-info))',\n border: 'var(--gr-info)',\n borderHover: 'var(--gr-info-hover)',\n borderActive: 'var(--gr-info-active)',\n },\n slate: {\n solidBackground: 'var(--gr-button-slate-bg,var(--gr-slate))',\n solidBackgroundHover: 'var(--gr-button-slate-bg-hover,var(--gr-slate-hover))',\n solidBackgroundActive: 'var(--gr-button-slate-bg-active,var(--gr-slate-active))',\n solidForeground: 'var(--gr-button-slate-fg,var(--gr-slate-fg,var(--gr-fg)))',\n accentText: 'var(--gr-slate-text,var(--gr-slate))',\n softBackground: 'var(--gr-button-slate-soft-bg)',\n softBackgroundHover: 'var(--gr-button-slate-soft-bg-hover)',\n softBackgroundActive: 'var(--gr-button-slate-soft-bg-active)',\n softForeground: 'var(--gr-slate-text,var(--gr-slate))',\n border: 'var(--gr-slate)',\n borderHover: 'var(--gr-slate-hover)',\n borderActive: 'var(--gr-slate-active)',\n },\n azure: {\n solidBackground: 'var(--gr-button-azure-bg,var(--gr-azure))',\n solidBackgroundHover: 'var(--gr-button-azure-bg-hover,var(--gr-azure-hover))',\n solidBackgroundActive: 'var(--gr-button-azure-bg-active,var(--gr-azure-active))',\n solidForeground: 'var(--gr-button-azure-fg,var(--gr-azure-fg,var(--gr-fg)))',\n accentText: 'var(--gr-azure-text,var(--gr-azure))',\n softBackground: 'var(--gr-button-azure-soft-bg)',\n softBackgroundHover: 'var(--gr-button-azure-soft-bg-hover)',\n softBackgroundActive: 'var(--gr-button-azure-soft-bg-active)',\n softForeground: 'var(--gr-azure-text,var(--gr-azure))',\n border: 'var(--gr-azure)',\n borderHover: 'var(--gr-azure-hover)',\n borderActive: 'var(--gr-azure-active)',\n },\n}\n\nfunction withVar(token: string): string {\n return `[${token}]`\n}\n\nexport function variantClass(variant: GrButtonVariant, tone: GrButtonTone): string {\n const tokens = tones[tone]\n\n if (variant === 'primary') {\n return [\n `bg-${withVar(tokens.solidBackground)}`,\n `text-${withVar(tokens.solidForeground)}`,\n `border border-${withVar(tokens.solidBackground)}`,\n `hover:bg-${withVar(tokens.solidBackgroundHover)}`,\n `hover:border-${withVar(tokens.solidBackgroundHover)}`,\n `active:bg-${withVar(tokens.solidBackgroundActive)}`,\n `hover:active:bg-${withVar(tokens.solidBackgroundActive)}`,\n `active:border-${withVar(tokens.solidBackgroundActive)}`,\n `hover:active:border-${withVar(tokens.solidBackgroundActive)}`,\n ].join(' ')\n }\n\n if (variant === 'secondary') {\n return [\n `bg-${withVar(tokens.softBackground)}`,\n `text-${withVar(tokens.softForeground)}`,\n `border border-${withVar(tokens.border)}`,\n `hover:bg-${withVar(tokens.softBackgroundHover)}`,\n `hover:border-${withVar(tokens.borderHover)}`,\n `active:bg-${withVar(tokens.softBackgroundActive)}`,\n `hover:active:bg-${withVar(tokens.softBackgroundActive)}`,\n `active:border-${withVar(tokens.borderActive)}`,\n `hover:active:border-${withVar(tokens.borderActive)}`,\n ].join(' ')\n }\n\n if (variant === 'outline') {\n return [\n 'bg-transparent',\n `text-${withVar(tokens.accentText)}`,\n `border border-${withVar(tokens.border)}`,\n `hover:bg-${withVar(tokens.softBackgroundHover)}`,\n `hover:border-${withVar(tokens.borderHover)}`,\n `active:bg-${withVar(tokens.softBackgroundActive)}`,\n `hover:active:bg-${withVar(tokens.softBackgroundActive)}`,\n `active:border-${withVar(tokens.borderActive)}`,\n `hover:active:border-${withVar(tokens.borderActive)}`,\n ].join(' ')\n }\n\n if (variant === 'ghost') {\n return [\n 'bg-transparent',\n `text-${withVar(tokens.accentText)}`,\n `hover:bg-${withVar(tokens.softBackgroundHover)}`,\n `active:bg-${withVar(tokens.softBackgroundActive)}`,\n `hover:active:bg-${withVar(tokens.softBackgroundActive)}`,\n ].join(' ')\n }\n\n return [\n 'bg-transparent',\n `text-${withVar(tokens.accentText)}`,\n 'border border-transparent',\n `hover:bg-${withVar(tokens.softBackgroundHover)}`,\n `hover:border-${withVar(tokens.borderHover)}`,\n `active:bg-${withVar(tokens.softBackgroundActive)}`,\n `hover:active:bg-${withVar(tokens.softBackgroundActive)}`,\n `active:border-${withVar(tokens.borderActive)}`,\n `hover:active:border-${withVar(tokens.borderActive)}`,\n ].join(' ')\n}\n\nexport function grButtonClass(options: GrButtonClassOptions): string {\n return [\n options.square ? squareSizes[options.size] : sizes[options.size],\n options.block ? blockClass : '',\n // `loading` сюда не входит: у него свой спиннер, и выглядеть отключённым он\n // не должен.\n options.disabled ? disabledClassByVariant[options.variant] : variantClass(options.variant, options.tone),\n ].filter(Boolean).join(' ')\n}\n"],"mappings":";AAiCA,IAAa,OACT;;AAGJ,IAAa,aAAa;;;;;;;;;;;;AAa1B,IAAa,yBAA0D;CACrE,WAAW;CACX,aAAa;CACb,WAAW;CACX,SAAS;CACT,gBAAgB;AAClB;AAEA,IAAa,oBAAoB;AAEjC,IAAa,QAAsC;CACjD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;;;AAQA,IAAa,cAA4C;CACvD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,QAAkD;CAC7D,SAAS;EACP,iBAAiB;EACjB,sBAAsB;EACtB,uBAAuB;EACvB,iBAAiB;EACjB,YAAY;EACZ,gBAAgB;EAChB,qBAAqB;EACrB,sBAAsB;EACtB,gBAAgB;EAChB,QAAQ;EACR,aAAa;EACb,cAAc;CAChB;CACA,SAAS;EACP,iBAAiB;EACjB,sBAAsB;EACtB,uBAAuB;EACvB,iBAAiB;EACjB,YAAY;EACZ,gBAAgB;EAChB,qBAAqB;EACrB,sBAAsB;EACtB,gBAAgB;EAChB,QAAQ;EACR,aAAa;EACb,cAAc;CAChB;CACA,SAAS;EACP,iBAAiB;EACjB,sBAAsB;EACtB,uBAAuB;EACvB,iBAAiB;EACjB,YAAY;EACZ,gBAAgB;EAChB,qBAAqB;EACrB,sBAAsB;EACtB,gBAAgB;EAChB,QAAQ;EACR,aAAa;EACb,cAAc;CAChB;CACA,SAAS;EACP,iBAAiB;EACjB,sBAAsB;EACtB,uBAAuB;EACvB,iBAAiB;EACjB,YAAY;EACZ,gBAAgB;EAChB,qBAAqB;EACrB,sBAAsB;EACtB,gBAAgB;EAChB,QAAQ;EACR,aAAa;EACb,cAAc;CAChB;CACA,QAAQ;EACN,iBAAiB;EACjB,sBAAsB;EACtB,uBAAuB;EACvB,iBAAiB;EACjB,YAAY;EACZ,gBAAgB;EAChB,qBAAqB;EACrB,sBAAsB;EACtB,gBAAgB;EAChB,QAAQ;EACR,aAAa;EACb,cAAc;CAChB;CACA,MAAM;EACJ,iBAAiB;EACjB,sBAAsB;EACtB,uBAAuB;EACvB,iBAAiB;EACjB,YAAY;EACZ,gBAAgB;EAChB,qBAAqB;EACrB,sBAAsB;EACtB,gBAAgB;EAChB,QAAQ;EACR,aAAa;EACb,cAAc;CAChB;CACA,OAAO;EACL,iBAAiB;EACjB,sBAAsB;EACtB,uBAAuB;EACvB,iBAAiB;EACjB,YAAY;EACZ,gBAAgB;EAChB,qBAAqB;EACrB,sBAAsB;EACtB,gBAAgB;EAChB,QAAQ;EACR,aAAa;EACb,cAAc;CAChB;CACA,OAAO;EACL,iBAAiB;EACjB,sBAAsB;EACtB,uBAAuB;EACvB,iBAAiB;EACjB,YAAY;EACZ,gBAAgB;EAChB,qBAAqB;EACrB,sBAAsB;EACtB,gBAAgB;EAChB,QAAQ;EACR,aAAa;EACb,cAAc;CAChB;AACF;AAEA,SAAS,QAAQ,OAAuB;CACtC,OAAO,IAAI,MAAM;AACnB;AAEA,SAAgB,aAAa,SAA0B,MAA4B;CACjF,MAAM,SAAS,MAAM;CAErB,IAAI,YAAY,WACd,OAAO;EACL,MAAM,QAAQ,OAAO,eAAe;EACpC,QAAQ,QAAQ,OAAO,eAAe;EACtC,iBAAiB,QAAQ,OAAO,eAAe;EAC/C,YAAY,QAAQ,OAAO,oBAAoB;EAC/C,gBAAgB,QAAQ,OAAO,oBAAoB;EACnD,aAAa,QAAQ,OAAO,qBAAqB;EACjD,mBAAmB,QAAQ,OAAO,qBAAqB;EACvD,iBAAiB,QAAQ,OAAO,qBAAqB;EACrD,uBAAuB,QAAQ,OAAO,qBAAqB;CAC7D,CAAC,CAAC,KAAK,GAAG;CAGZ,IAAI,YAAY,aACd,OAAO;EACL,MAAM,QAAQ,OAAO,cAAc;EACnC,QAAQ,QAAQ,OAAO,cAAc;EACrC,iBAAiB,QAAQ,OAAO,MAAM;EACtC,YAAY,QAAQ,OAAO,mBAAmB;EAC9C,gBAAgB,QAAQ,OAAO,WAAW;EAC1C,aAAa,QAAQ,OAAO,oBAAoB;EAChD,mBAAmB,QAAQ,OAAO,oBAAoB;EACtD,iBAAiB,QAAQ,OAAO,YAAY;EAC5C,uBAAuB,QAAQ,OAAO,YAAY;CACpD,CAAC,CAAC,KAAK,GAAG;CAGZ,IAAI,YAAY,WACd,OAAO;EACL;EACA,QAAQ,QAAQ,OAAO,UAAU;EACjC,iBAAiB,QAAQ,OAAO,MAAM;EACtC,YAAY,QAAQ,OAAO,mBAAmB;EAC9C,gBAAgB,QAAQ,OAAO,WAAW;EAC1C,aAAa,QAAQ,OAAO,oBAAoB;EAChD,mBAAmB,QAAQ,OAAO,oBAAoB;EACtD,iBAAiB,QAAQ,OAAO,YAAY;EAC5C,uBAAuB,QAAQ,OAAO,YAAY;CACpD,CAAC,CAAC,KAAK,GAAG;CAGZ,IAAI,YAAY,SACd,OAAO;EACL;EACA,QAAQ,QAAQ,OAAO,UAAU;EACjC,YAAY,QAAQ,OAAO,mBAAmB;EAC9C,aAAa,QAAQ,OAAO,oBAAoB;EAChD,mBAAmB,QAAQ,OAAO,oBAAoB;CACxD,CAAC,CAAC,KAAK,GAAG;CAGZ,OAAO;EACL;EACA,QAAQ,QAAQ,OAAO,UAAU;EACjC;EACA,YAAY,QAAQ,OAAO,mBAAmB;EAC9C,gBAAgB,QAAQ,OAAO,WAAW;EAC1C,aAAa,QAAQ,OAAO,oBAAoB;EAChD,mBAAmB,QAAQ,OAAO,oBAAoB;EACtD,iBAAiB,QAAQ,OAAO,YAAY;EAC5C,uBAAuB,QAAQ,OAAO,YAAY;CACpD,CAAC,CAAC,KAAK,GAAG;AACZ;AAEA,SAAgB,cAAc,SAAuC;CACnE,OAAO;EACL,QAAQ,SAAS,YAAY,QAAQ,QAAQ,MAAM,QAAQ;EAC3D,QAAQ,QAAQ,aAAa;EAG7B,QAAQ,WAAW,uBAAuB,QAAQ,WAAW,aAAa,QAAQ,SAAS,QAAQ,IAAI;CACzG,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AAC5B"}
@@ -1 +1 @@
1
- {"version":3,"file":"grLinkStyles-FME_qMpi.js","names":[],"sources":["../../src/components/GrLink/grLinkStyles.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nimport type { GrTone } from '../shared/tones'\n\n/**\n * Архитектура цвета GrLink (согласована с остальной GR, ср. GrButton):\n *\n * - `tone` — семантический ЦВЕТ из общей палитры `GrTone`\n * (`primary | neutral | success | warning | danger | info | slate | azure`).\n * - `variant` — уровень акцента (СТРУКТУРА), независимый от цвета:\n * - `default` — текст окрашен в `tone` в покое, `tone-hover`/`tone-active` при\n * наведении/нажатии (обычная акцентная ссылка);\n * - `muted` — приглушённый текст (`--gr-muted-fg`) в покое, окрашивается в `tone`\n * при наведении (вторичные/inline-ссылки в плотных областях).\n *\n * Оси ортогональны намеренно: «красная ссылка» и «приглушённая ссылка» —\n * независимые решения, и любая их комбинация осмысленна.\n */\nexport type GrLinkTone = GrTone\nexport type GrLinkVariant = 'default' | 'muted'\nexport type GrLinkUnderline = 'auto' | 'always' | 'none'\nexport type GrLinkSize = GrComponentSize\n\n// Базовые классы корневого элемента (`<a>`/`<span>`). Вынесены сюда,\n// чтобы быть единственным источником истины как для шаблона, так и для safelist.\nexport const baseRootClass = 'inline-flex items-center gap-1 rounded-[var(--gr-radius-control)] transition-colors duration-[var(--gr-duration-fast)]'\nexport const focusRingClass = 'focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]'\n\nexport const sizeClassBySize: Record<GrLinkSize, string> = {\n xs: 'text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]',\n sm: 'text-[length:var(--gr-control-text-sm)] leading-[var(--gr-control-leading-sm)]',\n md: 'text-[length:var(--gr-control-text-md)] leading-[var(--gr-control-leading-md)]',\n lg: 'text-[length:var(--gr-control-text-lg)] leading-[var(--gr-control-leading-lg)]',\n}\n\n// Цвет управляется CSS-переменными (как трек в GrSwitch): один набор классов\n// вместо class-эксплозии 8 тонов × 3 состояния. Safelist остаётся крошечным.\nexport const colorClass = 'text-[var(--gr-link-color)] visited:text-[var(--gr-link-color)] hover:text-[var(--gr-link-color-hover)] active:text-[var(--gr-link-color-active)]'\n\ntype GrLinkToneColors = { base: string, hover: string, active: string }\n\n/**\n * Пары «цвет / hover / active» на каждый тон из ролей темы.\n *\n * Ссылка — это ТЕКСТ на фоне страницы, поэтому тона берутся из `-text`, а не\n * из насыщенного `--gr-{tone}`: последний под текст не рассчитан\n * (`--gr-success` на `--gr-bg` — 2.2:1). Готовых `-text-hover/-active` в\n * системе нет, поэтому они выводятся тем же приёмом, что и `--gr-{tone}-hover`\n * в `tokens.css` — подмесом `--gr-fg`. В светлой теме это делает ссылку темнее\n * при наведении, в тёмной — светлее, то есть в обеих контраст растёт.\n */\nfunction toneTextColors(tone: string): GrLinkToneColors {\n const base = `var(--gr-${tone}-text)`\n\n return {\n base,\n hover: `color-mix(in srgb, ${base} 92%, var(--gr-fg))`,\n active: `color-mix(in srgb, ${base} 84%, var(--gr-fg))`,\n }\n}\n\nconst primaryTextColors = toneTextColors('primary')\n\nconst linkToneColors: Record<GrLinkTone, GrLinkToneColors> = {\n primary: primaryTextColors,\n // Нейтральная ссылка: читаемый `--gr-fg` в покое, акцент при наведении — тот\n // же, что у тона `primary`, и по тому же правилу «текст берётся из `-text`».\n neutral: { base: 'var(--gr-fg)', hover: primaryTextColors.base, active: primaryTextColors.active },\n success: toneTextColors('success'),\n warning: toneTextColors('warning'),\n danger: toneTextColors('danger'),\n info: toneTextColors('info'),\n slate: toneTextColors('slate'),\n azure: toneTextColors('azure'),\n}\n\n/** Инлайновые CSS-переменные цвета для текущей комбинации `tone` × `variant`. */\nexport function grLinkColorStyle(options: { tone: GrLinkTone, variant: GrLinkVariant, disabled: boolean }): Record<string, string> {\n if (options.disabled) return {}\n\n const colors = linkToneColors[options.tone] ?? linkToneColors.primary\n\n if (options.variant === 'muted') {\n return {\n '--gr-link-color': 'var(--gr-muted-fg)',\n '--gr-link-color-hover': colors.base,\n '--gr-link-color-active': colors.active,\n }\n }\n\n return {\n '--gr-link-color': colors.base,\n '--gr-link-color-hover': colors.hover,\n '--gr-link-color-active': colors.active,\n }\n}\n\n/**\n * Отключённая ссылка гасится цветом, а не `opacity`: прозрачность разбавляет\n * выверенный на AA `--gr-muted-fg` и роняет контраст ниже нормы.\n */\nexport const disabledStateClass = 'cursor-not-allowed text-[var(--gr-muted-fg)]'\n\nconst UNDERLINE_VALUES: readonly GrLinkUnderline[] = ['auto', 'always', 'none']\n\nfunction underlineClass(underline: GrLinkUnderline, disabled: boolean): string {\n if (disabled) return 'no-underline'\n if (underline === 'always') return 'underline underline-offset-4'\n if (underline === 'none') return 'no-underline'\n return 'no-underline hover:underline hover:underline-offset-4'\n}\n\n// Derived from `underlineClass` so that there is a single source of truth:\n// any change/extension of the underline logic is automatically reflected\n// in the safelist without manual updates.\nexport const underlineClasses: readonly string[] = [...new Set(\n UNDERLINE_VALUES.flatMap(u => [underlineClass(u, false), underlineClass(u, true)]),\n)]\n\nexport function grLinkClass(options: { size: GrLinkSize, underline: GrLinkUnderline, disabled: boolean }): string {\n return [\n sizeClassBySize[options.size],\n underlineClass(options.underline, options.disabled),\n options.disabled ? disabledStateClass : colorClass,\n ]\n .filter(Boolean)\n .join(' ')\n}\n"],"mappings":";AAyBA,IAAa,gBAAgB;AAC7B,IAAa,iBAAiB;AAE9B,IAAa,kBAA8C;CACzD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAIA,IAAa,aAAa;;;;;;;;;;;AAc1B,SAAS,eAAe,MAAgC;CACtD,MAAM,OAAO,YAAY,KAAK;CAE9B,OAAO;EACL;EACA,OAAO,sBAAsB,KAAK;EAClC,QAAQ,sBAAsB,KAAK;CACrC;AACF;AAEA,IAAM,oBAAoB,eAAe,SAAS;AAElD,IAAM,iBAAuD;CAC3D,SAAS;CAGT,SAAS;EAAE,MAAM;EAAgB,OAAO,kBAAkB;EAAM,QAAQ,kBAAkB;CAAO;CACjG,SAAS,eAAe,SAAS;CACjC,SAAS,eAAe,SAAS;CACjC,QAAQ,eAAe,QAAQ;CAC/B,MAAM,eAAe,MAAM;CAC3B,OAAO,eAAe,OAAO;CAC7B,OAAO,eAAe,OAAO;AAC/B;;AAGA,SAAgB,iBAAiB,SAAkG;CACjI,IAAI,QAAQ,UAAU,OAAO,CAAC;CAE9B,MAAM,SAAS,eAAe,QAAQ,SAAS,eAAe;CAE9D,IAAI,QAAQ,YAAY,SACtB,OAAO;EACL,mBAAmB;EACnB,yBAAyB,OAAO;EAChC,0BAA0B,OAAO;CACnC;CAGF,OAAO;EACL,mBAAmB,OAAO;EAC1B,yBAAyB,OAAO;EAChC,0BAA0B,OAAO;CACnC;AACF;;;;;AAMA,IAAa,qBAAqB;AAElC,IAAM,mBAA+C;CAAC;CAAQ;CAAU;AAAM;AAE9E,SAAS,eAAe,WAA4B,UAA2B;CAC7E,IAAI,UAAU,OAAO;CACrB,IAAI,cAAc,UAAU,OAAO;CACnC,IAAI,cAAc,QAAQ,OAAO;CACjC,OAAO;AACT;AAKA,IAAa,mBAAsC,CAAC,GAAG,IAAI,IACzD,iBAAiB,SAAQ,MAAK,CAAC,eAAe,GAAG,KAAK,GAAG,eAAe,GAAG,IAAI,CAAC,CAAC,CACnF,CAAC;AAED,SAAgB,YAAY,SAAsF;CAChH,OAAO;EACL,gBAAgB,QAAQ;EACxB,eAAe,QAAQ,WAAW,QAAQ,QAAQ;EAClD,QAAQ,WAAW,qBAAqB;CAC1C,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;AACb"}
1
+ {"version":3,"file":"grLinkStyles-FME_qMpi.js","names":[],"sources":["../../src/components/GrLink/grLinkStyles.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nimport type { GrTone } from '../shared/tones'\n\n/**\n * Архитектура цвета GrLink (согласована с остальной GR, ср. GrButton):\n *\n * - `tone` — семантический ЦВЕТ из общей палитры `GrTone`\n * (`primary | neutral | success | warning | danger | info | slate | azure`).\n * - `variant` — уровень акцента (СТРУКТУРА), независимый от цвета:\n * - `default` — текст окрашен в `tone` в покое, `tone-hover`/`tone-active` при\n * наведении/нажатии (обычная акцентная ссылка);\n * - `muted` — приглушённый текст (`--gr-muted-fg`) в покое, окрашивается в `tone`\n * при наведении (вторичные/inline-ссылки в плотных областях).\n *\n * Оси ортогональны намеренно: «красная ссылка» и «приглушённая ссылка» —\n * независимые решения, и любая их комбинация осмысленна.\n */\nexport type GrLinkTone = GrTone\nexport type GrLinkVariant = 'default' | 'muted'\nexport type GrLinkUnderline = 'auto' | 'always' | 'none'\nexport type GrLinkSize = GrComponentSize\n\n// Базовые классы корневого элемента (`<a>`/`<span>`). Вынесены сюда,\n// чтобы быть единственным источником истины как для шаблона, так и для safelist.\nexport const baseRootClass = 'inline-flex items-center gap-1 rounded-[var(--gr-radius-control)] transition-colors duration-[var(--gr-duration-fast)]'\nexport const focusRingClass = 'focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]'\n\nexport const sizeClassBySize: Record<GrLinkSize, string> = {\n xs: 'text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]',\n sm: 'text-[length:var(--gr-control-text-sm)] leading-[var(--gr-control-leading-sm)]',\n md: 'text-[length:var(--gr-control-text-md)] leading-[var(--gr-control-leading-md)]',\n lg: 'text-[length:var(--gr-control-text-lg)] leading-[var(--gr-control-leading-lg)]',\n}\n\n// Цвет управляется CSS-переменными (как трек в GrSwitch): один набор классов\n// вместо class-эксплозии 8 тонов × 3 состояния. Safelist остаётся крошечным.\nexport const colorClass = 'text-[var(--gr-link-color)] visited:text-[var(--gr-link-color)] hover:text-[var(--gr-link-color-hover)] active:text-[var(--gr-link-color-active)]'\n\ntype GrLinkToneColors = { base: string, hover: string, active: string }\n\n/**\n * Пары «цвет / hover / active» на каждый тон из ролей темы.\n *\n * Ссылка — это ТЕКСТ на фоне страницы, поэтому тона берутся из `-text`, а не\n * из насыщенного `--gr-{tone}`: последний под текст не рассчитан\n * (`--gr-success` на `--gr-bg` — 2.2:1). Готовых `-text-hover/-active` в\n * системе нет, поэтому они выводятся тем же приёмом, что и `--gr-{tone}-hover`\n * в `tokens.css` — подмесом `--gr-fg`. В светлой теме это делает ссылку темнее\n * при наведении, в тёмной — светлее, то есть в обеих контраст растёт.\n */\nfunction toneTextColors(tone: string): GrLinkToneColors {\n const base = `var(--gr-${tone}-text)`\n\n return {\n base,\n hover: `color-mix(in srgb, ${base} 92%, var(--gr-fg))`,\n active: `color-mix(in srgb, ${base} 84%, var(--gr-fg))`,\n }\n}\n\nconst primaryTextColors = toneTextColors('primary')\n\nconst linkToneColors: Record<GrLinkTone, GrLinkToneColors> = {\n primary: primaryTextColors,\n // Нейтральная ссылка: читаемый `--gr-fg` в покое, акцент при наведении — тот\n // же, что у тона `primary`, и по тому же правилу «текст берётся из `-text`».\n neutral: { base: 'var(--gr-fg)', hover: primaryTextColors.base, active: primaryTextColors.active },\n success: toneTextColors('success'),\n warning: toneTextColors('warning'),\n danger: toneTextColors('danger'),\n info: toneTextColors('info'),\n slate: toneTextColors('slate'),\n azure: toneTextColors('azure'),\n}\n\n/** Инлайновые CSS-переменные цвета для текущей комбинации `tone` × `variant`. */\nexport function grLinkColorStyle(options: { tone: GrLinkTone, variant: GrLinkVariant, disabled: boolean }): Record<string, string> {\n if (options.disabled)\n return {}\n\n const colors = linkToneColors[options.tone] ?? linkToneColors.primary\n\n if (options.variant === 'muted') {\n return {\n '--gr-link-color': 'var(--gr-muted-fg)',\n '--gr-link-color-hover': colors.base,\n '--gr-link-color-active': colors.active,\n }\n }\n\n return {\n '--gr-link-color': colors.base,\n '--gr-link-color-hover': colors.hover,\n '--gr-link-color-active': colors.active,\n }\n}\n\n/**\n * Отключённая ссылка гасится цветом, а не `opacity`: прозрачность разбавляет\n * выверенный на AA `--gr-muted-fg` и роняет контраст ниже нормы.\n */\nexport const disabledStateClass = 'cursor-not-allowed text-[var(--gr-muted-fg)]'\n\nconst UNDERLINE_VALUES: readonly GrLinkUnderline[] = ['auto', 'always', 'none']\n\nfunction underlineClass(underline: GrLinkUnderline, disabled: boolean): string {\n if (disabled)\n return 'no-underline'\n if (underline === 'always')\n return 'underline underline-offset-4'\n if (underline === 'none')\n return 'no-underline'\n return 'no-underline hover:underline hover:underline-offset-4'\n}\n\n// Derived from `underlineClass` so that there is a single source of truth:\n// any change/extension of the underline logic is automatically reflected\n// in the safelist without manual updates.\nexport const underlineClasses: readonly string[] = [...new Set(\n UNDERLINE_VALUES.flatMap(u => [underlineClass(u, false), underlineClass(u, true)]),\n)]\n\nexport function grLinkClass(options: { size: GrLinkSize, underline: GrLinkUnderline, disabled: boolean }): string {\n return [\n sizeClassBySize[options.size],\n underlineClass(options.underline, options.disabled),\n options.disabled ? disabledStateClass : colorClass,\n ]\n .filter(Boolean)\n .join(' ')\n}\n"],"mappings":";AAyBA,IAAa,gBAAgB;AAC7B,IAAa,iBAAiB;AAE9B,IAAa,kBAA8C;CACzD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAIA,IAAa,aAAa;;;;;;;;;;;AAc1B,SAAS,eAAe,MAAgC;CACtD,MAAM,OAAO,YAAY,KAAK;CAE9B,OAAO;EACL;EACA,OAAO,sBAAsB,KAAK;EAClC,QAAQ,sBAAsB,KAAK;CACrC;AACF;AAEA,IAAM,oBAAoB,eAAe,SAAS;AAElD,IAAM,iBAAuD;CAC3D,SAAS;CAGT,SAAS;EAAE,MAAM;EAAgB,OAAO,kBAAkB;EAAM,QAAQ,kBAAkB;CAAO;CACjG,SAAS,eAAe,SAAS;CACjC,SAAS,eAAe,SAAS;CACjC,QAAQ,eAAe,QAAQ;CAC/B,MAAM,eAAe,MAAM;CAC3B,OAAO,eAAe,OAAO;CAC7B,OAAO,eAAe,OAAO;AAC/B;;AAGA,SAAgB,iBAAiB,SAAkG;CACjI,IAAI,QAAQ,UACV,OAAO,CAAC;CAEV,MAAM,SAAS,eAAe,QAAQ,SAAS,eAAe;CAE9D,IAAI,QAAQ,YAAY,SACtB,OAAO;EACL,mBAAmB;EACnB,yBAAyB,OAAO;EAChC,0BAA0B,OAAO;CACnC;CAGF,OAAO;EACL,mBAAmB,OAAO;EAC1B,yBAAyB,OAAO;EAChC,0BAA0B,OAAO;CACnC;AACF;;;;;AAMA,IAAa,qBAAqB;AAElC,IAAM,mBAA+C;CAAC;CAAQ;CAAU;AAAM;AAE9E,SAAS,eAAe,WAA4B,UAA2B;CAC7E,IAAI,UACF,OAAO;CACT,IAAI,cAAc,UAChB,OAAO;CACT,IAAI,cAAc,QAChB,OAAO;CACT,OAAO;AACT;AAKA,IAAa,mBAAsC,CAAC,GAAG,IAAI,IACzD,iBAAiB,SAAQ,MAAK,CAAC,eAAe,GAAG,KAAK,GAAG,eAAe,GAAG,IAAI,CAAC,CAAC,CACnF,CAAC;AAED,SAAgB,YAAY,SAAsF;CAChH,OAAO;EACL,gBAAgB,QAAQ;EACxB,eAAe,QAAQ,WAAW,QAAQ,QAAQ;EAClD,QAAQ,WAAW,qBAAqB;CAC1C,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;AACb"}
@@ -1 +1 @@
1
- {"version":3,"file":"grLoadingStyles-CnQaf5ry.js","names":[],"sources":["../../src/components/GrLoading/grLoadingStyles.ts"],"sourcesContent":["import { splitClassTokens } from '../shared/classTokens'\n\n/**\n * Полноэкранный оверлей сидит на собственном слое шкалы: он блокирует всё\n * приложение целиком, поэтому обязан лечь выше модалки (`--gr-z-modal`), но\n * ниже тоста — уведомление о фоновой ошибке загрузка прятать не должна.\n * Инлайновый режим к шкале отношения не имеет: `z-10` — порядок внутри\n * собственного контейнера.\n */\nexport const rootModeClass = {\n fullscreen: 'fixed inset-0 z-[var(--gr-z-loading)]',\n inline: 'absolute inset-0 z-10',\n} as const\nexport const rootBackgroundClass = 'bg-[var(--gr-overlay-bg)]'\nexport const rootBackdropBlurClass = 'backdrop-blur-sm'\n\nexport function grLoadingRootClass(options: {\n fullscreen: boolean,\n hasBackground: boolean,\n customClass?: string\n}): string {\n return [\n options.fullscreen ? rootModeClass.fullscreen : rootModeClass.inline,\n !options.hasBackground ? rootBackgroundClass : '',\n rootBackdropBlurClass,\n options.customClass,\n ]\n .filter(Boolean)\n .join(' ')\n}\n\nexport const grLoadingClassTokens = [\n ...Object.values(rootModeClass).flatMap(splitClassTokens),\n ...splitClassTokens(rootBackgroundClass),\n ...splitClassTokens(rootBackdropBlurClass),\n]\n"],"mappings":";;;;;;;;;AASA,IAAa,gBAAgB;CACzB,YAAY;CACZ,QAAQ;AACZ;AACA,IAAa,sBAAsB;AACnC,IAAa,wBAAwB;AAErC,SAAgB,mBAAmB,SAIxB;CACP,OAAO;EACH,QAAQ,aAAa,cAAc,aAAa,cAAc;EAC9D,CAAC,QAAQ,gBAAgB,sBAAsB;EAC/C;EACA,QAAQ;CACZ,CAAC,CACI,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;AACjB;AAEA,IAAa,uBAAuB;CAChC,GAAG,OAAO,OAAO,aAAa,CAAC,CAAC,QAAQ,gBAAgB;CACxD,GAAG,iBAAiB,mBAAmB;CACvC,GAAG,iBAAiB,qBAAqB;AAC7C"}
1
+ {"version":3,"file":"grLoadingStyles-CnQaf5ry.js","names":[],"sources":["../../src/components/GrLoading/grLoadingStyles.ts"],"sourcesContent":["import { splitClassTokens } from '../shared/classTokens'\n\n/**\n * Полноэкранный оверлей сидит на собственном слое шкалы: он блокирует всё\n * приложение целиком, поэтому обязан лечь выше модалки (`--gr-z-modal`), но\n * ниже тоста — уведомление о фоновой ошибке загрузка прятать не должна.\n * Инлайновый режим к шкале отношения не имеет: `z-10` — порядок внутри\n * собственного контейнера.\n */\nexport const rootModeClass = {\n fullscreen: 'fixed inset-0 z-[var(--gr-z-loading)]',\n inline: 'absolute inset-0 z-10',\n} as const\nexport const rootBackgroundClass = 'bg-[var(--gr-overlay-bg)]'\nexport const rootBackdropBlurClass = 'backdrop-blur-sm'\n\nexport function grLoadingRootClass(options: {\n fullscreen: boolean\n hasBackground: boolean\n customClass?: string\n}): string {\n return [\n options.fullscreen ? rootModeClass.fullscreen : rootModeClass.inline,\n !options.hasBackground ? rootBackgroundClass : '',\n rootBackdropBlurClass,\n options.customClass,\n ]\n .filter(Boolean)\n .join(' ')\n}\n\nexport const grLoadingClassTokens = [\n ...Object.values(rootModeClass).flatMap(splitClassTokens),\n ...splitClassTokens(rootBackgroundClass),\n ...splitClassTokens(rootBackdropBlurClass),\n]\n"],"mappings":";;;;;;;;;AASA,IAAa,gBAAgB;CAC3B,YAAY;CACZ,QAAQ;AACV;AACA,IAAa,sBAAsB;AACnC,IAAa,wBAAwB;AAErC,SAAgB,mBAAmB,SAIxB;CACT,OAAO;EACL,QAAQ,aAAa,cAAc,aAAa,cAAc;EAC9D,CAAC,QAAQ,gBAAgB,sBAAsB;EAC/C;EACA,QAAQ;CACV,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;AACb;AAEA,IAAa,uBAAuB;CAClC,GAAG,OAAO,OAAO,aAAa,CAAC,CAAC,QAAQ,gBAAgB;CACxD,GAAG,iBAAiB,mBAAmB;CACvC,GAAG,iBAAiB,qBAAqB;AAC3C"}
@@ -1,4 +1,4 @@
1
- import { a as grButtonClass, i as grButtonBaseClass, o as sizes } from "./grButtonStyles-B_-YRE__.js";
1
+ import { a as grButtonClass, i as grButtonBaseClass, o as sizes } from "./grButtonStyles-B3wRWW_i.js";
2
2
  //#region src/components/GrRadio/grRadioStyles.ts
3
3
  var grRadioEnabledClass = "cursor-pointer";
4
4
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"grRadioStyles-D4gnU65n.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) 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,UAAU,OAAO;CAC7B,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-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 +1 @@
1
- {"version":3,"file":"grSelectStyles-Cdtd10eY.js","names":[],"sources":["../../src/components/GrSelect/grSelectStyles.ts"],"sourcesContent":["import type { GrComponentSize, GrControlState } from '../shared/sizes'\n\nexport type GrSelectView = 'default' | 'link'\nexport type GrSelectSize = GrComponentSize\nexport type GrSelectVariant = 'primary' | 'default' | 'muted' | 'danger'\nexport type GrSelectUnderline = 'auto' | 'always' | 'none'\nimport type { GrChipTone } from '../GrChip/grChipStyles'\n\nexport type GrSelectOptionsView = 'native' | 'panel'\n/**\n * Тип значения опции. Ограничен примитивами, которые переживают путь через DOM:\n * нативный `<select>` хранит в `option.value` только строку, поэтому значение\n * должно однозначно восстанавливаться из своего строкового представления.\n * Объектные модели потребовали бы отдельного key-экстрактора — см. `docs/components.md`.\n */\n/**\n * Значение опции. Объект допустим, но тогда обязателен проп `valueKey`: в DOM\n * значение живёт строкой, и без ключа объекты неотличимы друг от друга.\n */\nexport type GrSelectValue = string | number | object\nexport type GrSelectState = GrControlState\n\nexport type GrSelectOption<TValue extends GrSelectValue = string> = {\n value: TValue\n label: string\n disabled?: boolean\n /**\n * Тон чипа в режиме `tags` — перекрывает `tagTone` для этой опции.\n *\n * Цвет у каждого тега свой — обычная модель (метки, категории, статусы), и\n * без неё потребитель уходил в слот `#value` рисовать выбранное сам, теряя\n * ровно то, что в `tags` сделано правильно: чипы снаружи `role=\"combobox\"`,\n * снятие крестиком, сворачивание в «+N» и клавиатуру.\n */\n tone?: GrChipTone\n /** Плотная заливка чипа этой опции — перекрывает `tagDark`. */\n dark?: boolean\n}\n/** Группа опций: заголовок `label` + вложенные опции `options`. */\nexport type GrSelectOptionGroup<TValue extends GrSelectValue = string> = {\n label: string\n options: GrSelectOption<TValue>[]\n}\n/** Элемент списка опций: либо одиночная опция, либо группа опций. */\nexport type GrSelectOptionOrGroup<TValue extends GrSelectValue = string> =\n | GrSelectOption<TValue>\n | GrSelectOptionGroup<TValue>\nexport type GrSelectModelValue<TValue extends GrSelectValue = string> = TValue | TValue[]\n\nexport const defaultBaseClass = 'w-full rounded-[var(--gr-radius-control)] border bg-[var(--gr-bg)] text-[var(--gr-fg)] transition-colors duration-[var(--gr-duration-fast)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]'\n\n/**\n * Цвет рамки по состоянию — та же карта, что у `GrInput` и `GrTextarea`: поля\n * одной формы обязаны показывать ошибку одинаково.\n */\nexport const borderClassByState: Record<GrSelectState, string> = {\n default: 'border-[var(--gr-brd)]',\n success: 'border-[var(--gr-success)] focus-visible:ring-[var(--gr-success)]',\n warning: 'border-[var(--gr-warning)] focus-visible:ring-[var(--gr-warning)]',\n danger: 'border-[var(--gr-danger)] focus-visible:ring-[var(--gr-danger)]',\n}\n\n/**\n * Ошибка валидации красится своей ролью, а не декоративным тоном `danger`:\n * `state=\"danger\"` — это подсветка по решению разработчика, `invalid` — вердикт\n * валидации, и тема вправе развести их по цвету.\n */\nexport const invalidBorderClass = 'border-[var(--gr-invalid-brd)] focus-visible:ring-[var(--gr-invalid-ring)]'\nexport const linkBaseClass = 'cursor-pointer inline-block w-auto align-baseline appearance-none bg-transparent border border-transparent px-0 py-0 rounded-[var(--gr-radius-control)] transition-colors duration-[var(--gr-duration-fast)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]'\n\n\nexport const selectSizeClassBySize: Record<GrSelectSize, 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 selectLinkSizeClassBySize: Record<GrSelectSize, string> = {\n xs: 'text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]',\n sm: 'text-[length:var(--gr-control-text-sm)] leading-[var(--gr-control-leading-sm)]',\n md: 'text-[length:var(--gr-control-text-md)] leading-[var(--gr-control-leading-md)]',\n lg: 'text-[length:var(--gr-control-text-lg)] leading-[var(--gr-control-leading-lg)]',\n}\n\n/**\n * Ссылка — это ТЕКСТ на фоне страницы, поэтому опасный тон берётся из\n * `--gr-danger-text`, а не из насыщенного `--gr-danger` (последний под текст не\n * рассчитан). Hover/active выводятся подмесом `--gr-fg` — той же формулой, что\n * `GrLink`. `primary` берётся из `--gr-primary-text` по той же причине: на фоне\n * страницы насыщенный `--gr-primary` под текст не рассчитан.\n *\n * Классы записаны литералами, а не собраны интерполяцией: safelist и скан\n * UnoCSS читают исходник, и вычисленная строка для них не класс.\n */\nexport const selectLinkVariantClassByVariant: Record<GrSelectVariant, string> = {\n primary: 'text-[var(--gr-primary-text)] hover:text-[color-mix(in_srgb,var(--gr-primary-text)_92%,var(--gr-fg))] active:text-[color-mix(in_srgb,var(--gr-primary-text)_84%,var(--gr-fg))]',\n default: 'text-[var(--gr-fg)] hover:text-[var(--gr-primary-text)] active:text-[color-mix(in_srgb,var(--gr-primary-text)_84%,var(--gr-fg))]',\n muted: 'text-[var(--gr-muted-fg)] hover:text-[var(--gr-fg)] active:text-[var(--gr-fg)]',\n danger: 'text-[var(--gr-danger-text)] hover:text-[color-mix(in_srgb,var(--gr-danger-text)_92%,var(--gr-fg))] active:text-[color-mix(in_srgb,var(--gr-danger-text)_84%,var(--gr-fg))]',\n}\n\n/**\n * Variant-классы для видимой метки в `view=\"link\"` + `optionsView=\"native\"`.\n * Hover-цвет приходит через `peer-hover:` от прозрачного `<select>`-overlay,\n * т.к. видимая метка имеет `pointer-events-none` и не получает hover напрямую.\n */\nexport const selectLinkNativeLabelVariantClassByVariant: Record<GrSelectVariant, string> = {\n primary: 'text-[var(--gr-primary-text)] peer-hover:text-[color-mix(in_srgb,var(--gr-primary-text)_92%,var(--gr-fg))] peer-active:text-[color-mix(in_srgb,var(--gr-primary-text)_84%,var(--gr-fg))]',\n default: 'text-[var(--gr-fg)] peer-hover:text-[var(--gr-primary-text)] peer-active:text-[color-mix(in_srgb,var(--gr-primary-text)_84%,var(--gr-fg))]',\n muted: 'text-[var(--gr-muted-fg)] peer-hover:text-[var(--gr-fg)] peer-active:text-[var(--gr-fg)]',\n danger: 'text-[var(--gr-danger-text)] peer-hover:text-[color-mix(in_srgb,var(--gr-danger-text)_92%,var(--gr-fg))] peer-active:text-[color-mix(in_srgb,var(--gr-danger-text)_84%,var(--gr-fg))]',\n}\n\nfunction selectLinkUnderlineClass(options: { underline: GrSelectUnderline, disabled: boolean }): string {\n if (options.disabled) return 'no-underline'\n if (options.underline === 'always') return 'underline underline-offset-4'\n if (options.underline === 'none') return 'no-underline'\n return 'no-underline hover:underline hover:underline-offset-4'\n}\n\n/**\n * Underline-классы для видимой метки в `view=\"link\"` + `optionsView=\"native\"`.\n * Видимая метка имеет `pointer-events-none`, а hover получает прозрачный\n * `<select>`-overlay (peer), поэтому для `underline=\"auto\"` используем\n * `peer-hover:underline` вместо `hover:underline`.\n */\nfunction selectLinkNativeLabelUnderlineClass(options: { underline: GrSelectUnderline, disabled: boolean }): string {\n if (options.disabled) return 'no-underline'\n if (options.underline === 'always') return 'underline underline-offset-4'\n if (options.underline === 'none') return 'no-underline'\n return 'no-underline peer-hover:underline peer-hover:underline-offset-4'\n}\n\n/**\n * Классы прозрачного `<select>`-overlay для `view=\"link\"` + `optionsView=\"native\"`.\n * Нативный селект растягивается на всю обёртку, но визуально невидим — ширину обёртки\n * задаёт видимый `<span>` с выбранной меткой, благодаря чему компонент в закрытом\n * состоянии занимает столько места, сколько нужно текущей опции (а не самой длинной).\n */\nexport const grSelectLinkNativeOverlayClass = 'peer absolute inset-0 w-full h-full m-0 p-0 border-0 bg-transparent text-transparent appearance-none opacity-0 cursor-pointer disabled:cursor-not-allowed focus:outline-none'\n\n/**\n * Классы видимой метки для `view=\"link\"` + `optionsView=\"native\"` (поверх прозрачного `<select>`).\n * Получает все link-стили (size/variant/underline), а также focus-ring через `peer-focus-visible`.\n */\nexport const grSelectLinkNativeLabelBaseClass = 'pointer-events-none inline-block whitespace-nowrap align-baseline rounded-[var(--gr-radius-control)] transition-colors duration-[var(--gr-duration-fast)]'\nexport const grSelectLinkNativeLabelDisabledClass = 'cursor-not-allowed text-[var(--gr-muted-fg)] no-underline'\nexport const grSelectLinkNativeLabelFocusClass = 'peer-focus-visible:outline-none peer-focus-visible:ring-2 peer-focus-visible:ring-[var(--gr-ring)]'\n\nexport function grSelectLinkNativeLabelClass(options: {\n size: GrSelectSize\n variant: GrSelectVariant\n underline: GrSelectUnderline\n disabled: boolean\n}): string {\n return [\n grSelectLinkNativeLabelBaseClass,\n selectLinkSizeClassBySize[options.size],\n selectLinkNativeLabelUnderlineClass({ underline: options.underline, disabled: options.disabled }),\n selectLinkNativeLabelVariantClassByVariant[options.variant],\n options.disabled ? grSelectLinkNativeLabelDisabledClass : '',\n grSelectLinkNativeLabelFocusClass,\n ]\n .filter(Boolean)\n .join(' ')\n}\n\nexport function grSelectClass(options: {\n view: GrSelectView\n size: GrSelectSize\n disabled: boolean\n variant: GrSelectVariant\n underline: GrSelectUnderline\n state?: GrSelectState\n invalid?: boolean\n}): string {\n if (options.view === 'link') {\n return [\n selectLinkSizeClassBySize[options.size],\n selectLinkUnderlineClass({ underline: options.underline, disabled: options.disabled }),\n selectLinkVariantClassByVariant[options.variant],\n 'disabled:cursor-not-allowed disabled:text-[var(--gr-muted-fg)] disabled:no-underline',\n ].join(' ')\n }\n\n return [\n selectSizeClassBySize[options.size],\n // `invalid` сильнее `state`: ошибка перекрывает любую другую подсветку.\n options.invalid ? invalidBorderClass : borderClassByState[options.state ?? 'default'],\n // Заблокированный контрол гасится фоном и цветом текста, а не `opacity`:\n // прозрачность разбавляет выверенные на AA токены и роняет контраст.\n 'disabled:cursor-not-allowed disabled:bg-[var(--gr-muted)] disabled:text-[var(--gr-muted-fg)]',\n ].join(' ')\n}\n\nexport function grSelectNativeClass(options: {\n view: GrSelectView\n size: GrSelectSize\n disabled: boolean\n variant: GrSelectVariant\n underline: GrSelectUnderline\n showNativeChevron: boolean\n state?: GrSelectState\n invalid?: boolean\n}): string {\n return [\n grSelectClass(options),\n options.showNativeChevron ? 'appearance-none pr-9' : '',\n ]\n .filter(Boolean)\n .join(' ')\n}\n\nexport function grSelectTriggerClass(options: {\n view: GrSelectView\n optionsView: GrSelectOptionsView\n size: GrSelectSize\n disabled: boolean\n variant: GrSelectVariant\n underline: GrSelectUnderline\n state?: GrSelectState\n invalid?: boolean\n}): string {\n if (options.optionsView !== 'panel') {\n return grSelectClass(options)\n }\n\n if (options.view === 'link') {\n return [\n grSelectClass(options),\n 'inline-flex items-center gap-1 text-left',\n ].join(' ')\n }\n\n return [\n grSelectClass(options),\n 'flex items-center justify-between text-left',\n ].join(' ')\n}\n\nexport const grSelectPanelClasses = 'rounded-[var(--gr-radius-xl)] border border-[var(--gr-brd)] bg-[var(--gr-card)] text-[var(--gr-card-fg)] shadow-[var(--gr-shadow-2)] overflow-hidden'\n\n/** Общая подсветка наведения и активной опции панели. */\nconst selectOptionHighlight = 'bg-[color-mix(in_srgb,var(--gr-muted)_30%,transparent)]'\n\nexport const selectOptionBaseClass = 'rounded-[var(--gr-radius-md)] px-3 py-2 text-left text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)]'\nexport const selectOptionLinkWidthClass = 'block min-w-full w-max whitespace-nowrap'\nexport const selectOptionWidthClass = 'w-full'\nexport const selectOptionEnabledClass = `hover:${selectOptionHighlight}`\nexport const selectOptionActiveClass = selectOptionHighlight\n/** Выключенная опция гасится токеном текста — по той же причине, что и контрол. */\nexport const selectOptionDisabledClass = 'cursor-not-allowed text-[var(--gr-muted-fg)]'\n\nexport function grSelectOptionClass(options: {\n view: GrSelectView\n disabled: boolean\n active: boolean\n}): string {\n return [\n selectOptionBaseClass,\n options.view === 'link' ? selectOptionLinkWidthClass : selectOptionWidthClass,\n options.disabled ? selectOptionDisabledClass : selectOptionEnabledClass,\n !options.disabled && options.active ? selectOptionActiveClass : '',\n ]\n .filter(Boolean)\n .join(' ')\n}\n"],"mappings":";AAiDA,IAAa,mBAAmB;;;;;AAMhC,IAAa,qBAAoD;CAC/D,SAAS;CACT,SAAS;CACT,SAAS;CACT,QAAQ;AACV;;;;;;AAOA,IAAa,qBAAqB;AAClC,IAAa,gBAAgB;AAG7B,IAAa,wBAAsD;CACjE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,4BAA0D;CACrE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;;;;;;;AAYA,IAAa,kCAAmE;CAC9E,SAAS;CACT,SAAS;CACT,OAAO;CACP,QAAQ;AACV;;;;;;AAOA,IAAa,6CAA8E;CACzF,SAAS;CACT,SAAS;CACT,OAAO;CACP,QAAQ;AACV;AAEA,SAAS,yBAAyB,SAAsE;CACtG,IAAI,QAAQ,UAAU,OAAO;CAC7B,IAAI,QAAQ,cAAc,UAAU,OAAO;CAC3C,IAAI,QAAQ,cAAc,QAAQ,OAAO;CACzC,OAAO;AACT;;;;;;;AAQA,SAAS,oCAAoC,SAAsE;CACjH,IAAI,QAAQ,UAAU,OAAO;CAC7B,IAAI,QAAQ,cAAc,UAAU,OAAO;CAC3C,IAAI,QAAQ,cAAc,QAAQ,OAAO;CACzC,OAAO;AACT;;;;;;;AAQA,IAAa,iCAAiC;;;;;AAM9C,IAAa,mCAAmC;AAChD,IAAa,uCAAuC;AACpD,IAAa,oCAAoC;AAEjD,SAAgB,6BAA6B,SAKlC;CACT,OAAO;EACL;EACA,0BAA0B,QAAQ;EAClC,oCAAoC;GAAE,WAAW,QAAQ;GAAW,UAAU,QAAQ;EAAS,CAAC;EAChG,2CAA2C,QAAQ;EACnD,QAAQ,WAAW,uCAAuC;EAC1D;CACF,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;AACb;AAEA,SAAgB,cAAc,SAQnB;CACT,IAAI,QAAQ,SAAS,QACnB,OAAO;EACL,0BAA0B,QAAQ;EAClC,yBAAyB;GAAE,WAAW,QAAQ;GAAW,UAAU,QAAQ;EAAS,CAAC;EACrF,gCAAgC,QAAQ;EACxC;CACF,CAAC,CAAC,KAAK,GAAG;CAGZ,OAAO;EACL,sBAAsB,QAAQ;EAE9B,QAAQ,UAAU,qBAAqB,mBAAmB,QAAQ,SAAS;EAG3E;CACF,CAAC,CAAC,KAAK,GAAG;AACZ;AAEA,SAAgB,oBAAoB,SASzB;CACT,OAAO,CACL,cAAc,OAAO,GACrB,QAAQ,oBAAoB,yBAAyB,EACvD,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;AACb;AAEA,SAAgB,qBAAqB,SAS1B;CACT,IAAI,QAAQ,gBAAgB,SAC1B,OAAO,cAAc,OAAO;CAG9B,IAAI,QAAQ,SAAS,QACnB,OAAO,CACL,cAAc,OAAO,GACrB,0CACF,CAAC,CAAC,KAAK,GAAG;CAGZ,OAAO,CACL,cAAc,OAAO,GACrB,6CACF,CAAC,CAAC,KAAK,GAAG;AACZ;AAEA,IAAa,uBAAuB;;AAGpC,IAAM,wBAAwB;AAE9B,IAAa,wBAAwB;AACrC,IAAa,6BAA6B;AAC1C,IAAa,yBAAyB;AACtC,IAAa,2BAA2B,SAAS;AACjD,IAAa,0BAA0B;;AAEvC,IAAa,4BAA4B;AAEzC,SAAgB,oBAAoB,SAIzB;CACT,OAAO;EACL;EACA,QAAQ,SAAS,SAAS,6BAA6B;EACvD,QAAQ,WAAW,4BAA4B;EAC/C,CAAC,QAAQ,YAAY,QAAQ,SAAS,0BAA0B;CAClE,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;AACb"}
1
+ {"version":3,"file":"grSelectStyles-Cdtd10eY.js","names":[],"sources":["../../src/components/GrSelect/grSelectStyles.ts"],"sourcesContent":["import type { GrComponentSize, GrControlState } from '../shared/sizes'\n\nexport type GrSelectView = 'default' | 'link'\nexport type GrSelectSize = GrComponentSize\nexport type GrSelectVariant = 'primary' | 'default' | 'muted' | 'danger'\nexport type GrSelectUnderline = 'auto' | 'always' | 'none'\nimport type { GrChipTone } from '../GrChip/grChipStyles'\n\nexport type GrSelectOptionsView = 'native' | 'panel'\n/**\n * Тип значения опции. Ограничен примитивами, которые переживают путь через DOM:\n * нативный `<select>` хранит в `option.value` только строку, поэтому значение\n * должно однозначно восстанавливаться из своего строкового представления.\n * Объектные модели потребовали бы отдельного key-экстрактора — см. `docs/components.md`.\n */\n/**\n * Значение опции. Объект допустим, но тогда обязателен проп `valueKey`: в DOM\n * значение живёт строкой, и без ключа объекты неотличимы друг от друга.\n */\nexport type GrSelectValue = string | number | object\nexport type GrSelectState = GrControlState\n\nexport type GrSelectOption<TValue extends GrSelectValue = string> = {\n value: TValue\n label: string\n disabled?: boolean\n /**\n * Тон чипа в режиме `tags` — перекрывает `tagTone` для этой опции.\n *\n * Цвет у каждого тега свой — обычная модель (метки, категории, статусы), и\n * без неё потребитель уходил в слот `#value` рисовать выбранное сам, теряя\n * ровно то, что в `tags` сделано правильно: чипы снаружи `role=\"combobox\"`,\n * снятие крестиком, сворачивание в «+N» и клавиатуру.\n */\n tone?: GrChipTone\n /** Плотная заливка чипа этой опции — перекрывает `tagDark`. */\n dark?: boolean\n}\n/** Группа опций: заголовок `label` + вложенные опции `options`. */\nexport type GrSelectOptionGroup<TValue extends GrSelectValue = string> = {\n label: string\n options: GrSelectOption<TValue>[]\n}\n/** Элемент списка опций: либо одиночная опция, либо группа опций. */\nexport type GrSelectOptionOrGroup<TValue extends GrSelectValue = string>\n = | GrSelectOption<TValue>\n | GrSelectOptionGroup<TValue>\nexport type GrSelectModelValue<TValue extends GrSelectValue = string> = TValue | TValue[]\n\nexport const defaultBaseClass = 'w-full rounded-[var(--gr-radius-control)] border bg-[var(--gr-bg)] text-[var(--gr-fg)] transition-colors duration-[var(--gr-duration-fast)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]'\n\n/**\n * Цвет рамки по состоянию — та же карта, что у `GrInput` и `GrTextarea`: поля\n * одной формы обязаны показывать ошибку одинаково.\n */\nexport const borderClassByState: Record<GrSelectState, string> = {\n default: 'border-[var(--gr-brd)]',\n success: 'border-[var(--gr-success)] focus-visible:ring-[var(--gr-success)]',\n warning: 'border-[var(--gr-warning)] focus-visible:ring-[var(--gr-warning)]',\n danger: 'border-[var(--gr-danger)] focus-visible:ring-[var(--gr-danger)]',\n}\n\n/**\n * Ошибка валидации красится своей ролью, а не декоративным тоном `danger`:\n * `state=\"danger\"` — это подсветка по решению разработчика, `invalid` — вердикт\n * валидации, и тема вправе развести их по цвету.\n */\nexport const invalidBorderClass = 'border-[var(--gr-invalid-brd)] focus-visible:ring-[var(--gr-invalid-ring)]'\nexport const linkBaseClass = 'cursor-pointer inline-block w-auto align-baseline appearance-none bg-transparent border border-transparent px-0 py-0 rounded-[var(--gr-radius-control)] transition-colors duration-[var(--gr-duration-fast)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]'\n\nexport const selectSizeClassBySize: Record<GrSelectSize, 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 selectLinkSizeClassBySize: Record<GrSelectSize, string> = {\n xs: 'text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]',\n sm: 'text-[length:var(--gr-control-text-sm)] leading-[var(--gr-control-leading-sm)]',\n md: 'text-[length:var(--gr-control-text-md)] leading-[var(--gr-control-leading-md)]',\n lg: 'text-[length:var(--gr-control-text-lg)] leading-[var(--gr-control-leading-lg)]',\n}\n\n/**\n * Ссылка — это ТЕКСТ на фоне страницы, поэтому опасный тон берётся из\n * `--gr-danger-text`, а не из насыщенного `--gr-danger` (последний под текст не\n * рассчитан). Hover/active выводятся подмесом `--gr-fg` — той же формулой, что\n * `GrLink`. `primary` берётся из `--gr-primary-text` по той же причине: на фоне\n * страницы насыщенный `--gr-primary` под текст не рассчитан.\n *\n * Классы записаны литералами, а не собраны интерполяцией: safelist и скан\n * UnoCSS читают исходник, и вычисленная строка для них не класс.\n */\nexport const selectLinkVariantClassByVariant: Record<GrSelectVariant, string> = {\n primary: 'text-[var(--gr-primary-text)] hover:text-[color-mix(in_srgb,var(--gr-primary-text)_92%,var(--gr-fg))] active:text-[color-mix(in_srgb,var(--gr-primary-text)_84%,var(--gr-fg))]',\n default: 'text-[var(--gr-fg)] hover:text-[var(--gr-primary-text)] active:text-[color-mix(in_srgb,var(--gr-primary-text)_84%,var(--gr-fg))]',\n muted: 'text-[var(--gr-muted-fg)] hover:text-[var(--gr-fg)] active:text-[var(--gr-fg)]',\n danger: 'text-[var(--gr-danger-text)] hover:text-[color-mix(in_srgb,var(--gr-danger-text)_92%,var(--gr-fg))] active:text-[color-mix(in_srgb,var(--gr-danger-text)_84%,var(--gr-fg))]',\n}\n\n/**\n * Variant-классы для видимой метки в `view=\"link\"` + `optionsView=\"native\"`.\n * Hover-цвет приходит через `peer-hover:` от прозрачного `<select>`-overlay,\n * т.к. видимая метка имеет `pointer-events-none` и не получает hover напрямую.\n */\nexport const selectLinkNativeLabelVariantClassByVariant: Record<GrSelectVariant, string> = {\n primary: 'text-[var(--gr-primary-text)] peer-hover:text-[color-mix(in_srgb,var(--gr-primary-text)_92%,var(--gr-fg))] peer-active:text-[color-mix(in_srgb,var(--gr-primary-text)_84%,var(--gr-fg))]',\n default: 'text-[var(--gr-fg)] peer-hover:text-[var(--gr-primary-text)] peer-active:text-[color-mix(in_srgb,var(--gr-primary-text)_84%,var(--gr-fg))]',\n muted: 'text-[var(--gr-muted-fg)] peer-hover:text-[var(--gr-fg)] peer-active:text-[var(--gr-fg)]',\n danger: 'text-[var(--gr-danger-text)] peer-hover:text-[color-mix(in_srgb,var(--gr-danger-text)_92%,var(--gr-fg))] peer-active:text-[color-mix(in_srgb,var(--gr-danger-text)_84%,var(--gr-fg))]',\n}\n\nfunction selectLinkUnderlineClass(options: { underline: GrSelectUnderline, disabled: boolean }): string {\n if (options.disabled)\n return 'no-underline'\n if (options.underline === 'always')\n return 'underline underline-offset-4'\n if (options.underline === 'none')\n return 'no-underline'\n return 'no-underline hover:underline hover:underline-offset-4'\n}\n\n/**\n * Underline-классы для видимой метки в `view=\"link\"` + `optionsView=\"native\"`.\n * Видимая метка имеет `pointer-events-none`, а hover получает прозрачный\n * `<select>`-overlay (peer), поэтому для `underline=\"auto\"` используем\n * `peer-hover:underline` вместо `hover:underline`.\n */\nfunction selectLinkNativeLabelUnderlineClass(options: { underline: GrSelectUnderline, disabled: boolean }): string {\n if (options.disabled)\n return 'no-underline'\n if (options.underline === 'always')\n return 'underline underline-offset-4'\n if (options.underline === 'none')\n return 'no-underline'\n return 'no-underline peer-hover:underline peer-hover:underline-offset-4'\n}\n\n/**\n * Классы прозрачного `<select>`-overlay для `view=\"link\"` + `optionsView=\"native\"`.\n * Нативный селект растягивается на всю обёртку, но визуально невидим — ширину обёртки\n * задаёт видимый `<span>` с выбранной меткой, благодаря чему компонент в закрытом\n * состоянии занимает столько места, сколько нужно текущей опции (а не самой длинной).\n */\nexport const grSelectLinkNativeOverlayClass = 'peer absolute inset-0 w-full h-full m-0 p-0 border-0 bg-transparent text-transparent appearance-none opacity-0 cursor-pointer disabled:cursor-not-allowed focus:outline-none'\n\n/**\n * Классы видимой метки для `view=\"link\"` + `optionsView=\"native\"` (поверх прозрачного `<select>`).\n * Получает все link-стили (size/variant/underline), а также focus-ring через `peer-focus-visible`.\n */\nexport const grSelectLinkNativeLabelBaseClass = 'pointer-events-none inline-block whitespace-nowrap align-baseline rounded-[var(--gr-radius-control)] transition-colors duration-[var(--gr-duration-fast)]'\nexport const grSelectLinkNativeLabelDisabledClass = 'cursor-not-allowed text-[var(--gr-muted-fg)] no-underline'\nexport const grSelectLinkNativeLabelFocusClass = 'peer-focus-visible:outline-none peer-focus-visible:ring-2 peer-focus-visible:ring-[var(--gr-ring)]'\n\nexport function grSelectLinkNativeLabelClass(options: {\n size: GrSelectSize\n variant: GrSelectVariant\n underline: GrSelectUnderline\n disabled: boolean\n}): string {\n return [\n grSelectLinkNativeLabelBaseClass,\n selectLinkSizeClassBySize[options.size],\n selectLinkNativeLabelUnderlineClass({ underline: options.underline, disabled: options.disabled }),\n selectLinkNativeLabelVariantClassByVariant[options.variant],\n options.disabled ? grSelectLinkNativeLabelDisabledClass : '',\n grSelectLinkNativeLabelFocusClass,\n ]\n .filter(Boolean)\n .join(' ')\n}\n\nexport function grSelectClass(options: {\n view: GrSelectView\n size: GrSelectSize\n disabled: boolean\n variant: GrSelectVariant\n underline: GrSelectUnderline\n state?: GrSelectState\n invalid?: boolean\n}): string {\n if (options.view === 'link') {\n return [\n selectLinkSizeClassBySize[options.size],\n selectLinkUnderlineClass({ underline: options.underline, disabled: options.disabled }),\n selectLinkVariantClassByVariant[options.variant],\n 'disabled:cursor-not-allowed disabled:text-[var(--gr-muted-fg)] disabled:no-underline',\n ].join(' ')\n }\n\n return [\n selectSizeClassBySize[options.size],\n // `invalid` сильнее `state`: ошибка перекрывает любую другую подсветку.\n options.invalid ? invalidBorderClass : borderClassByState[options.state ?? 'default'],\n // Заблокированный контрол гасится фоном и цветом текста, а не `opacity`:\n // прозрачность разбавляет выверенные на AA токены и роняет контраст.\n 'disabled:cursor-not-allowed disabled:bg-[var(--gr-muted)] disabled:text-[var(--gr-muted-fg)]',\n ].join(' ')\n}\n\nexport function grSelectNativeClass(options: {\n view: GrSelectView\n size: GrSelectSize\n disabled: boolean\n variant: GrSelectVariant\n underline: GrSelectUnderline\n showNativeChevron: boolean\n state?: GrSelectState\n invalid?: boolean\n}): string {\n return [\n grSelectClass(options),\n options.showNativeChevron ? 'appearance-none pr-9' : '',\n ]\n .filter(Boolean)\n .join(' ')\n}\n\nexport function grSelectTriggerClass(options: {\n view: GrSelectView\n optionsView: GrSelectOptionsView\n size: GrSelectSize\n disabled: boolean\n variant: GrSelectVariant\n underline: GrSelectUnderline\n state?: GrSelectState\n invalid?: boolean\n}): string {\n if (options.optionsView !== 'panel') {\n return grSelectClass(options)\n }\n\n if (options.view === 'link') {\n return [\n grSelectClass(options),\n 'inline-flex items-center gap-1 text-left',\n ].join(' ')\n }\n\n return [\n grSelectClass(options),\n 'flex items-center justify-between text-left',\n ].join(' ')\n}\n\nexport const grSelectPanelClasses = 'rounded-[var(--gr-radius-xl)] border border-[var(--gr-brd)] bg-[var(--gr-card)] text-[var(--gr-card-fg)] shadow-[var(--gr-shadow-2)] overflow-hidden'\n\n/** Общая подсветка наведения и активной опции панели. */\nconst selectOptionHighlight = 'bg-[color-mix(in_srgb,var(--gr-muted)_30%,transparent)]'\n\nexport const selectOptionBaseClass = 'rounded-[var(--gr-radius-md)] px-3 py-2 text-left text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)]'\nexport const selectOptionLinkWidthClass = 'block min-w-full w-max whitespace-nowrap'\nexport const selectOptionWidthClass = 'w-full'\nexport const selectOptionEnabledClass = `hover:${selectOptionHighlight}`\nexport const selectOptionActiveClass = selectOptionHighlight\n/** Выключенная опция гасится токеном текста — по той же причине, что и контрол. */\nexport const selectOptionDisabledClass = 'cursor-not-allowed text-[var(--gr-muted-fg)]'\n\nexport function grSelectOptionClass(options: {\n view: GrSelectView\n disabled: boolean\n active: boolean\n}): string {\n return [\n selectOptionBaseClass,\n options.view === 'link' ? selectOptionLinkWidthClass : selectOptionWidthClass,\n options.disabled ? selectOptionDisabledClass : selectOptionEnabledClass,\n !options.disabled && options.active ? selectOptionActiveClass : '',\n ]\n .filter(Boolean)\n .join(' ')\n}\n"],"mappings":";AAiDA,IAAa,mBAAmB;;;;;AAMhC,IAAa,qBAAoD;CAC/D,SAAS;CACT,SAAS;CACT,SAAS;CACT,QAAQ;AACV;;;;;;AAOA,IAAa,qBAAqB;AAClC,IAAa,gBAAgB;AAE7B,IAAa,wBAAsD;CACjE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,4BAA0D;CACrE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;;;;;;;AAYA,IAAa,kCAAmE;CAC9E,SAAS;CACT,SAAS;CACT,OAAO;CACP,QAAQ;AACV;;;;;;AAOA,IAAa,6CAA8E;CACzF,SAAS;CACT,SAAS;CACT,OAAO;CACP,QAAQ;AACV;AAEA,SAAS,yBAAyB,SAAsE;CACtG,IAAI,QAAQ,UACV,OAAO;CACT,IAAI,QAAQ,cAAc,UACxB,OAAO;CACT,IAAI,QAAQ,cAAc,QACxB,OAAO;CACT,OAAO;AACT;;;;;;;AAQA,SAAS,oCAAoC,SAAsE;CACjH,IAAI,QAAQ,UACV,OAAO;CACT,IAAI,QAAQ,cAAc,UACxB,OAAO;CACT,IAAI,QAAQ,cAAc,QACxB,OAAO;CACT,OAAO;AACT;;;;;;;AAQA,IAAa,iCAAiC;;;;;AAM9C,IAAa,mCAAmC;AAChD,IAAa,uCAAuC;AACpD,IAAa,oCAAoC;AAEjD,SAAgB,6BAA6B,SAKlC;CACT,OAAO;EACL;EACA,0BAA0B,QAAQ;EAClC,oCAAoC;GAAE,WAAW,QAAQ;GAAW,UAAU,QAAQ;EAAS,CAAC;EAChG,2CAA2C,QAAQ;EACnD,QAAQ,WAAW,uCAAuC;EAC1D;CACF,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;AACb;AAEA,SAAgB,cAAc,SAQnB;CACT,IAAI,QAAQ,SAAS,QACnB,OAAO;EACL,0BAA0B,QAAQ;EAClC,yBAAyB;GAAE,WAAW,QAAQ;GAAW,UAAU,QAAQ;EAAS,CAAC;EACrF,gCAAgC,QAAQ;EACxC;CACF,CAAC,CAAC,KAAK,GAAG;CAGZ,OAAO;EACL,sBAAsB,QAAQ;EAE9B,QAAQ,UAAU,qBAAqB,mBAAmB,QAAQ,SAAS;EAG3E;CACF,CAAC,CAAC,KAAK,GAAG;AACZ;AAEA,SAAgB,oBAAoB,SASzB;CACT,OAAO,CACL,cAAc,OAAO,GACrB,QAAQ,oBAAoB,yBAAyB,EACvD,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;AACb;AAEA,SAAgB,qBAAqB,SAS1B;CACT,IAAI,QAAQ,gBAAgB,SAC1B,OAAO,cAAc,OAAO;CAG9B,IAAI,QAAQ,SAAS,QACnB,OAAO,CACL,cAAc,OAAO,GACrB,0CACF,CAAC,CAAC,KAAK,GAAG;CAGZ,OAAO,CACL,cAAc,OAAO,GACrB,6CACF,CAAC,CAAC,KAAK,GAAG;AACZ;AAEA,IAAa,uBAAuB;;AAGpC,IAAM,wBAAwB;AAE9B,IAAa,wBAAwB;AACrC,IAAa,6BAA6B;AAC1C,IAAa,yBAAyB;AACtC,IAAa,2BAA2B,SAAS;AACjD,IAAa,0BAA0B;;AAEvC,IAAa,4BAA4B;AAEzC,SAAgB,oBAAoB,SAIzB;CACT,OAAO;EACL;EACA,QAAQ,SAAS,SAAS,6BAA6B;EACvD,QAAQ,WAAW,4BAA4B;EAC/C,CAAC,QAAQ,YAAY,QAAQ,SAAS,0BAA0B;CAClE,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;AACb"}
@@ -38,7 +38,15 @@ var sliderPaddingBySize = {
38
38
  md: "py-2",
39
39
  lg: "py-2.5"
40
40
  };
41
- var sliderRailClass = "absolute inset-0 rounded-[var(--gr-radius-full)] bg-[var(--gr-slider-rail,color-mix(in_srgb,var(--gr-muted)_45%,transparent))]";
41
+ /**
42
+ * Дорожка — `--gr-brd`, а не полупрозрачный `--gr-muted`.
43
+ *
44
+ * Прежний дефолт (`color-mix(--gr-muted 45%, transparent)`) на светлой теме
45
+ * давал #f1f5f9 при 45 % поверх почти такой же поверхности: непройденная часть
46
+ * шкалы не читалась вовсе, и слайдер выглядел точкой на пустом месте — по нему
47
+ * нельзя было понять ни диапазон, ни положение внутри него.
48
+ */
49
+ var sliderRailClass = "absolute inset-0 rounded-[var(--gr-radius-full)] bg-[var(--gr-slider-rail,var(--gr-brd))]";
42
50
  var sliderFillBaseClass = "absolute rounded-[var(--gr-radius-full)]";
43
51
  /** Заливка растёт вдоль дорожки: по горизонтали — влево-вправо, по вертикали — снизу вверх. */
44
52
  var sliderFillOrientationClass = {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grSliderStyles-kaz6VXZ3.js","names":[],"sources":["../../src/components/GrSlider/grSliderStyles.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nexport type GrSliderSize = GrComponentSize\n/** Значение: число (single) или кортеж `[lo, hi]` (range при `range=true`). */\nexport type GrSliderModelValue = number | [number, number]\n/** Метка деления: словарь `value → label` или просто массив значений (label = значение). */\nexport type GrSliderMarks = Record<number, string> | number[]\n\n/** Ориентация дорожки. В вертикальной минимум внизу — как на регуляторе громкости. */\nexport const GR_SLIDER_ORIENTATIONS = ['horizontal', 'vertical'] as const\nexport type GrSliderOrientation = typeof GR_SLIDER_ORIENTATIONS[number]\n\n/**\n * Кастомизация через CSS-переменные (можно задать на самом слайдере или любом\n * предке — inline `style`, класс, тема). Значение по умолчанию — второй аргумент\n * `var(--name, default)`, поэтому переопределять можно точечно:\n *\n * - `--gr-slider-rail` — цвет фона дорожки (неактивная часть).\n * - `--gr-slider-fill` — цвет активной (заполненной) части.\n * - `--gr-slider-thumb-bg` — заливка бегунка.\n * - `--gr-slider-thumb-border` — цвет окантовки бегунка (по умолчанию = fill).\n * - `--gr-slider-thumb-size` — диаметр бегунка (по умолчанию — из `size`).\n * - `--gr-slider-track-height` — толщина дорожки (по умолчанию — из `size`).\n * - `--gr-slider-length` — длина вертикальной дорожки (по умолчанию `10rem`).\n */\n\n// Высота дорожки (rail/fill) по размеру — дефолт для `--gr-slider-track-height`.\nexport const sliderTrackHeightBySize: Record<GrSliderSize, string> = {\n xs: 'h-[var(--gr-slider-track-height,0.1875rem)]',\n sm: 'h-[var(--gr-slider-track-height,0.25rem)]',\n md: 'h-[var(--gr-slider-track-height,0.375rem)]',\n lg: 'h-[var(--gr-slider-track-height,0.5rem)]',\n}\n\n/** В вертикали та же толщина задаёт ширину, а длину берёт `--gr-slider-length`. */\nexport const sliderTrackWidthBySize: Record<GrSliderSize, string> = {\n xs: 'w-[var(--gr-slider-track-height,0.1875rem)]',\n sm: 'w-[var(--gr-slider-track-height,0.25rem)]',\n md: 'w-[var(--gr-slider-track-height,0.375rem)]',\n lg: 'w-[var(--gr-slider-track-height,0.5rem)]',\n}\n\nexport const sliderTrackVerticalLengthClass = 'h-[var(--gr-slider-length,10rem)]'\n\n// Размер «бегунка» (thumb) по размеру — дефолт для `--gr-slider-thumb-size`.\nexport const sliderThumbSizeBySize: Record<GrSliderSize, string> = {\n xs: 'h-[var(--gr-slider-thumb-size,0.75rem)] w-[var(--gr-slider-thumb-size,0.75rem)]',\n sm: 'h-[var(--gr-slider-thumb-size,0.875rem)] w-[var(--gr-slider-thumb-size,0.875rem)]',\n md: 'h-[var(--gr-slider-thumb-size,1rem)] w-[var(--gr-slider-thumb-size,1rem)]',\n lg: 'h-[var(--gr-slider-thumb-size,1.25rem)] w-[var(--gr-slider-thumb-size,1.25rem)]',\n}\n\n// Вертикальный отступ обёртки, чтобы thumb не обрезался краями дорожки.\nexport const sliderPaddingBySize: Record<GrSliderSize, string> = {\n xs: 'py-1',\n sm: 'py-1.5',\n md: 'py-2',\n lg: 'py-2.5',\n}\n\n/**\n * Дорожка — `--gr-brd`, а не полупрозрачный `--gr-muted`.\n *\n * Прежний дефолт (`color-mix(--gr-muted 45%, transparent)`) на светлой теме\n * давал #f1f5f9 при 45 % поверх почти такой же поверхности: непройденная часть\n * шкалы не читалась вовсе, и слайдер выглядел точкой на пустом месте — по нему\n * нельзя было понять ни диапазон, ни положение внутри него.\n */\nexport const sliderRailClass = 'absolute inset-0 rounded-[var(--gr-radius-full)] bg-[var(--gr-slider-rail,var(--gr-brd))]'\n\nexport const sliderFillBaseClass = 'absolute rounded-[var(--gr-radius-full)]'\n\n/** Заливка растёт вдоль дорожки: по горизонтали — влево-вправо, по вертикали — снизу вверх. */\nexport const sliderFillOrientationClass: Record<GrSliderOrientation, string> = {\n horizontal: 'top-0 bottom-0',\n vertical: 'left-0 right-0',\n}\n\n/**\n * Недоступный слайдер гасится токенами, а не `opacity`: прозрачность разбавляет\n * выверенные на AA токены и роняет контраст подписей меток.\n */\nexport const sliderFillDisabledClass = 'bg-[var(--gr-disabled-fg)]'\nexport const sliderFillEnabledClass = 'bg-[var(--gr-slider-fill,var(--gr-primary))]'\n\nexport function sliderFillClass(disabled: boolean): string {\n return [sliderFillBaseClass, disabled ? sliderFillDisabledClass : sliderFillEnabledClass].join(' ')\n}\n\n// Окантовка бегунка: цветной border (по умолчанию = fill) + тонкая контрастная\n// обводка (`ring`), чтобы бегунок не сливался ни с фоном страницы, ни с заливкой.\nexport const sliderThumbBaseClass = 'absolute rounded-[var(--gr-radius-full)] border-2 border-[var(--gr-slider-thumb-border,var(--gr-slider-fill,var(--gr-primary)))] bg-[var(--gr-slider-thumb-bg,var(--gr-bg))] ring-1 ring-[color-mix(in_srgb,var(--gr-fg)_22%,transparent)] shadow-[var(--gr-shadow-1)] transition-[box-shadow,transform] duration-[var(--gr-duration-fast)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)] focus-visible:ring-offset-1 focus-visible:ring-offset-[var(--gr-bg)]'\n\n/** Бегунок центрируется поперёк дорожки, а вдоль неё его ведёт inline-стиль. */\nexport const sliderThumbOrientationClass: Record<GrSliderOrientation, string> = {\n horizontal: 'top-1/2 -translate-x-1/2 -translate-y-1/2',\n vertical: 'left-1/2 -translate-x-1/2 translate-y-1/2',\n}\n\nexport const sliderThumbDisabledClass = 'cursor-not-allowed border-[var(--gr-disabled-fg)] bg-[var(--gr-disabled-bg)]'\nexport const sliderThumbEnabledClass = 'cursor-grab active:cursor-grabbing hover:scale-110'\n\nexport function sliderThumbClass(options: {\n size: GrSliderSize\n disabled: boolean\n orientation?: GrSliderOrientation\n}): string {\n return [\n sliderThumbBaseClass,\n sliderThumbOrientationClass[options.orientation ?? 'horizontal'],\n sliderThumbSizeBySize[options.size],\n options.disabled ? sliderThumbDisabledClass : sliderThumbEnabledClass,\n ].join(' ')\n}\n\nexport const sliderTooltipBaseClass = 'pointer-events-none absolute whitespace-nowrap rounded-[var(--gr-radius-control)] bg-[var(--gr-fg)] px-1.5 py-0.5 text-[length:var(--gr-text-2xs)] font-medium leading-tight text-[var(--gr-bg)] shadow-[var(--gr-shadow-2)]'\n\n/** В вертикали подсказка уходит вбок: над бегунком она легла бы на дорожку. */\nexport const sliderTooltipOrientationClass: Record<GrSliderOrientation, string> = {\n horizontal: 'bottom-full left-1/2 mb-2 -translate-x-1/2',\n vertical: 'right-full top-1/2 mr-2 -translate-y-1/2',\n}\n\nexport function sliderTooltipClass(orientation: GrSliderOrientation = 'horizontal'): string {\n return [sliderTooltipBaseClass, sliderTooltipOrientationClass[orientation]].join(' ')\n}\n\nexport const sliderMarkTickBaseClass = 'absolute h-1.5 w-1.5 rounded-[var(--gr-radius-full)] bg-[var(--gr-bg)] ring-1 ring-[var(--gr-brd)]'\n\nexport const sliderMarkTickOrientationClass: Record<GrSliderOrientation, string> = {\n horizontal: 'top-1/2 -translate-x-1/2 -translate-y-1/2',\n vertical: 'left-1/2 -translate-x-1/2 translate-y-1/2',\n}\n\nexport function sliderMarkTickClass(orientation: GrSliderOrientation = 'horizontal'): string {\n return [sliderMarkTickBaseClass, sliderMarkTickOrientationClass[orientation]].join(' ')\n}\n// Подписи меток уводим под дорожку (`top-full` + отступ, ниже бегунка) и запрещаем\n// перенос (`whitespace-nowrap`) — иначе крайняя подпись рвётся по буквам.\nexport const sliderMarkLabelClass = 'absolute whitespace-nowrap text-[length:var(--gr-text-2xs)] leading-none text-[var(--gr-muted-fg)]'\n\nexport const sliderMarkLabelDisabledClass = 'text-[var(--gr-disabled-fg)]'\n\n/** Вертикальные подписи уходят вправо от дорожки: под ней им места нет. */\nexport const sliderMarkLabelVerticalClass = 'left-full ml-2.5 translate-y-1/2'\nexport const sliderMarkLabelHorizontalClass = 'top-full mt-2.5'\n\n// Выравнивание подписи по позиции: центр для внутренних меток, а крайние (0% и\n// 100%) прижимаем внутрь, чтобы они не вылезали за края дорожки и не обрезались.\nexport function sliderMarkLabelClassFor(\n pct: number,\n options: { orientation?: GrSliderOrientation, disabled?: boolean } = {},\n): string {\n const orientation = options.orientation ?? 'horizontal'\n const tone = options.disabled ? sliderMarkLabelDisabledClass : ''\n\n if (orientation === 'vertical')\n return [sliderMarkLabelClass, sliderMarkLabelVerticalClass, tone].filter(Boolean).join(' ')\n\n const align = pct <= 0.5 ? 'translate-x-0' : pct >= 99.5 ? '-translate-x-full' : '-translate-x-1/2'\n return [sliderMarkLabelClass, sliderMarkLabelHorizontalClass, align, tone].filter(Boolean).join(' ')\n}\n\nexport const sliderRootBaseClass = 'relative select-none'\n\nexport const sliderRootOrientationClass: Record<GrSliderOrientation, string> = {\n horizontal: 'w-full',\n vertical: 'inline-flex',\n}\n\n/** Горизонтальный отступ обёртки вертикали — та же роль, что у `py-*` у горизонтали. */\nexport const sliderPaddingVerticalBySize: Record<GrSliderSize, string> = {\n xs: 'px-1',\n sm: 'px-1.5',\n md: 'px-2',\n lg: 'px-2.5',\n}\n\nexport function sliderRootClass(options: {\n size: GrSliderSize\n disabled: boolean\n hasMarks?: boolean\n orientation?: GrSliderOrientation\n}): string {\n const orientation = options.orientation ?? 'horizontal'\n const vertical = orientation === 'vertical'\n\n return [\n sliderRootBaseClass,\n sliderRootOrientationClass[orientation],\n vertical ? sliderPaddingVerticalBySize[options.size] : sliderPaddingBySize[options.size],\n // Резервируем место под подписи меток, чтобы они не наезжали на соседний контент.\n options.hasMarks ? (vertical ? 'mr-10' : 'mb-7') : '',\n ]\n .filter(Boolean)\n .join(' ')\n}\n"],"mappings":";;;;;;;;;;;;;;AA2BA,IAAa,0BAAwD;CACnE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,yBAAuD;CAClE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,iCAAiC;AAG9C,IAAa,wBAAsD;CACjE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAGA,IAAa,sBAAoD;CAC/D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;;;;;AAUA,IAAa,kBAAkB;AAE/B,IAAa,sBAAsB;;AAGnC,IAAa,6BAAkE;CAC7E,YAAY;CACZ,UAAU;AACZ;;;;;AAMA,IAAa,0BAA0B;AACvC,IAAa,yBAAyB;AAEtC,SAAgB,gBAAgB,UAA2B;CACzD,OAAO,CAAC,qBAAqB,WAAW,0BAA0B,sBAAsB,CAAC,CAAC,KAAK,GAAG;AACpG;AAIA,IAAa,uBAAuB;;AAGpC,IAAa,8BAAmE;CAC9E,YAAY;CACZ,UAAU;AACZ;AAEA,IAAa,2BAA2B;AACxC,IAAa,0BAA0B;AAEvC,SAAgB,iBAAiB,SAItB;CACT,OAAO;EACL;EACA,4BAA4B,QAAQ,eAAe;EACnD,sBAAsB,QAAQ;EAC9B,QAAQ,WAAW,2BAA2B;CAChD,CAAC,CAAC,KAAK,GAAG;AACZ;AAEA,IAAa,yBAAyB;;AAGtC,IAAa,gCAAqE;CAChF,YAAY;CACZ,UAAU;AACZ;AAEA,SAAgB,mBAAmB,cAAmC,cAAsB;CAC1F,OAAO,CAAC,wBAAwB,8BAA8B,YAAY,CAAC,CAAC,KAAK,GAAG;AACtF;AAEA,IAAa,0BAA0B;AAEvC,IAAa,iCAAsE;CACjF,YAAY;CACZ,UAAU;AACZ;AAEA,SAAgB,oBAAoB,cAAmC,cAAsB;CAC3F,OAAO,CAAC,yBAAyB,+BAA+B,YAAY,CAAC,CAAC,KAAK,GAAG;AACxF;AAGA,IAAa,uBAAuB;AAEpC,IAAa,+BAA+B;;AAG5C,IAAa,+BAA+B;AAC5C,IAAa,iCAAiC;AAI9C,SAAgB,wBACd,KACA,UAAqE,CAAC,GAC9D;CACR,MAAM,cAAc,QAAQ,eAAe;CAC3C,MAAM,OAAO,QAAQ,WAAW,+BAA+B;CAE/D,IAAI,gBAAgB,YAClB,OAAO;EAAC;EAAsB;EAA8B;CAAI,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAG5F,OAAO;EAAC;EAAsB;EADhB,OAAO,KAAM,kBAAkB,OAAO,OAAO,sBAAsB;EACZ;CAAI,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AACrG;AAEA,IAAa,sBAAsB;AAEnC,IAAa,6BAAkE;CAC7E,YAAY;CACZ,UAAU;AACZ;;AAGA,IAAa,8BAA4D;CACvE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,SAAgB,gBAAgB,SAKrB;CACT,MAAM,cAAc,QAAQ,eAAe;CAC3C,MAAM,WAAW,gBAAgB;CAEjC,OAAO;EACL;EACA,2BAA2B;EAC3B,WAAW,4BAA4B,QAAQ,QAAQ,oBAAoB,QAAQ;EAEnF,QAAQ,WAAY,WAAW,UAAU,SAAU;CACrD,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;AACb"}
@@ -5,7 +5,7 @@ import { t as grBadgeConfig } from "./config-g8-JGZ_Y.js";
5
5
  import { t as grBadgeWrapConfig } from "./config-DwABJHEo.js";
6
6
  import { t as grBottomNavConfig } from "./config-DM0lsduD.js";
7
7
  import { t as grBreadcrumbsConfig } from "./config-C0Eu8jpG.js";
8
- import { t as grButtonConfig } from "./config-BHcS5Cwm.js";
8
+ import { t as grButtonConfig } from "./config-87fszqnD.js";
9
9
  import { t as grButtonGroupConfig } from "./config-DBmdgoVf2.js";
10
10
  import { t as grCardConfig } from "./config-DUbbGcfw.js";
11
11
  import { t as grCheckboxConfig } from "./config-DZCUPHPU.js";
@@ -53,14 +53,14 @@ import { t as grPopoverConfig } from "./config-BTwYMQaz2.js";
53
53
  import { t as grProgressBarConfig } from "./config-DWL81-aM.js";
54
54
  import { t as grProgressCircleConfig } from "./config-CJzmDHfI.js";
55
55
  import { t as grPromptDialogConfig } from "./config-C0Ea9ePP.js";
56
- import { t as grRadioConfig } from "./config-jyr6AIZt2.js";
56
+ import { t as grRadioConfig } from "./config-CuQmUkMw2.js";
57
57
  import { t as grRadioGroupConfig } from "./config-QaIc_gRa.js";
58
58
  import { t as grRatingConfig } from "./config-DRbojEzO.js";
59
59
  import { t as grSegmentedConfig } from "./config-rLkc9Zn2.js";
60
60
  import { t as grSelectConfig } from "./config-DnF472Ox.js";
61
61
  import { t as grSidebarConfig } from "./config-DNDgp9bB.js";
62
62
  import { t as grSkeletonConfig } from "./config-8Pcutu1j.js";
63
- import { t as grSliderConfig } from "./config-tiUtEn4Q.js";
63
+ import { t as grSliderConfig } from "./config-E1cTyRVV.js";
64
64
  import { t as grSortableListConfig } from "./config-CbEbLyDE.js";
65
65
  import { t as grSplitterConfig } from "./config-CvbVM4ep.js";
66
66
  import { t as grStatisticConfig } from "./config-DGC00bTp.js";
@@ -1 +1 @@
1
- {"version":3,"file":"granular-provider-yJNX1g1G.js","names":[],"sources":["../../src/components/GrDialog/config.ts","../../src/components/GrResponseErrorBanner/config.ts","../../src/granular-provider/shared.ts","../../src/granular-provider/index.ts"],"sourcesContent":["import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grDialogSafelist } from './safelist'\n\nexport const grDialogConfig = defineGranularComponent(import.meta.url, {\n name: 'GrDialog',\n dependencies: ['GrButton', 'GrModal'],\n safelist: grDialogSafelist,\n})\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nexport const grResponseErrorBannerConfig = defineGranularComponent(import.meta.url, {\n name: 'GrResponseErrorBanner',\n dependencies: ['GrAlert', 'GrButton'],\n})\n","// `id`, `theme.*`, `packageBaseUrl` и реестр компонентов провайдера.\n//\n// Все `new URL('../styles/...', import.meta.url)` обязаны лежать именно здесь:\n// `shared.ts` в одной директории с `index.ts` / `node.ts`, поэтому\n// относительные пути совпадают. Для браузера безопасно — бандлеры\n// транслируют такие литералы в статические asset-URL.\n//\n// `apps/showcase/scripts/generate-component-api.mjs` читает список компонентов\n// из `Object.keys(granularityComponentConfigs)` через vite SSR.\nimport {\n defineGranularProvider,\n type GranularComponentDescriptor,\n type GranularProvider,\n resolvePackageBaseUrl,\n} from '@feugene/unocss-preset-granular/contract'\n// <granularity:components:imports> — блок генерируется `yarn generate:registry`\nimport { grAlertConfig } from '../components/GrAlert/config'\nimport { grAutocompleteConfig } from '../components/GrAutocomplete/config'\nimport { grAvatarConfig } from '../components/GrAvatar/config'\nimport { grBadgeConfig } from '../components/GrBadge/config'\nimport { grBadgeWrapConfig } from '../components/GrBadgeWrap/config'\nimport { grBottomNavConfig } from '../components/GrBottomNav/config'\nimport { grBreadcrumbsConfig } from '../components/GrBreadcrumbs/config'\nimport { grButtonConfig } from '../components/GrButton/config'\nimport { grButtonGroupConfig } from '../components/GrButtonGroup/config'\nimport { grCardConfig } from '../components/GrCard/config'\nimport { grCheckboxConfig } from '../components/GrCheckbox/config'\nimport { grCheckboxGroupConfig } from '../components/GrCheckboxGroup/config'\nimport { grChipConfig } from '../components/GrChip/config'\nimport { grChipGroupConfig } from '../components/GrChipGroup/config'\nimport { grCodeBlockConfig } from '../components/GrCodeBlock/config'\nimport { grCollapseConfig } from '../components/GrCollapse/config'\nimport { grColorPickerConfig } from '../components/GrColorPicker/config'\nimport { grCommandPaletteConfig } from '../components/GrCommandPalette/config'\nimport { grConfigProviderConfig } from '../components/GrConfigProvider/config'\nimport { grConfirmDialogConfig } from '../components/GrConfirmDialog/config'\nimport { grContextMenuConfig } from '../components/GrContextMenu/config'\nimport { grDataTableConfig } from '../components/GrDataTable/config'\nimport { grDeltaConfig } from '../components/GrDelta/config'\nimport { grDescriptionListConfig } from '../components/GrDescriptionList/config'\nimport { grDialogConfig } from '../components/GrDialog/config'\nimport { grDialogServiceConfig } from '../components/GrDialogService/config'\nimport { grDividerConfig } from '../components/GrDivider/config'\nimport { grDrawerConfig } from '../components/GrDrawer/config'\nimport { grDropdownConfig } from '../components/GrDropdown/config'\nimport { grDropdownMenuConfig } from '../components/GrDropdownMenu/config'\nimport { grEmptyStateConfig } from '../components/GrEmptyState/config'\nimport { grFilePreviewConfig } from '../components/GrFilePreview/config'\nimport { grFileUploadConfig } from '../components/GrFileUpload/config'\nimport { grFormConfig } from '../components/GrForm/config'\nimport { grFormFieldConfig } from '../components/GrFormField/config'\nimport { grFormFileConfig } from '../components/GrFormFile/config'\nimport { grFormSectionConfig } from '../components/GrFormSection/config'\nimport { grIconConfig } from '../components/GrIcon/config'\nimport { grImageViewerConfig } from '../components/GrImageViewer/config'\nimport { grInputConfig } from '../components/GrInput/config'\nimport { grInputTagConfig } from '../components/GrInputTag/config'\nimport { grJsonViewerConfig } from '../components/GrJsonViewer/config'\nimport { grKbdConfig } from '../components/GrKbd/config'\nimport { grLinkConfig } from '../components/GrLink/config'\nimport { grListConfig } from '../components/GrList/config'\nimport { grLoadingConfig } from '../components/GrLoading/config'\nimport { grModalConfig } from '../components/GrModal/config'\nimport { grNavbarConfig } from '../components/GrNavbar/config'\nimport { grNumberInputConfig } from '../components/GrNumberInput/config'\nimport { grPaginationConfig } from '../components/GrPagination/config'\nimport { grPopoverConfig } from '../components/GrPopover/config'\nimport { grProgressBarConfig } from '../components/GrProgressBar/config'\nimport { grProgressCircleConfig } from '../components/GrProgressCircle/config'\nimport { grPromptDialogConfig } from '../components/GrPromptDialog/config'\nimport { grRadioConfig } from '../components/GrRadio/config'\nimport { grRadioGroupConfig } from '../components/GrRadioGroup/config'\nimport { grRatingConfig } from '../components/GrRating/config'\nimport { grResponseErrorBannerConfig } from '../components/GrResponseErrorBanner/config'\nimport { grSegmentedConfig } from '../components/GrSegmented/config'\nimport { grSelectConfig } from '../components/GrSelect/config'\nimport { grSidebarConfig } from '../components/GrSidebar/config'\nimport { grSkeletonConfig } from '../components/GrSkeleton/config'\nimport { grSliderConfig } from '../components/GrSlider/config'\nimport { grSortableListConfig } from '../components/GrSortableList/config'\nimport { grSplitterConfig } from '../components/GrSplitter/config'\nimport { grStatisticConfig } from '../components/GrStatistic/config'\nimport { grStepsConfig } from '../components/GrSteps/config'\nimport { grSwitchConfig } from '../components/GrSwitch/config'\nimport { grTableConfig } from '../components/GrTable/config'\nimport { grTabPanelsConfig } from '../components/GrTabPanels/config'\nimport { grTabsConfig } from '../components/GrTabs/config'\nimport { grTextareaConfig } from '../components/GrTextarea/config'\nimport { grTimelineConfig } from '../components/GrTimeline/config'\nimport { grToasterConfig } from '../components/GrToaster/config'\nimport { grTooltipConfig } from '../components/GrTooltip/config'\nimport { grTreeConfig } from '../components/GrTree/config'\nimport { grTreeSelectConfig } from '../components/GrTreeSelect/config'\nimport { grValueConfig } from '../components/GrValue/config'\n// </granularity:components:imports>\n\n/** Идентификатор провайдера — совпадает с именем пакета. */\nexport const GRANULARITY_PROVIDER_ID = '@feugene/granularity'\n\n// Не заменять на `new URL('..', import.meta.url)`: Vite и rolldown распознают\n// этот литерал и подставляют `data:`-URL, после чего scan-директории пустеют.\nconst packageBaseUrl = resolvePackageBaseUrl(import.meta.url)\n\n/** Встроенные темы пакета. Единственный источник правды о списке тем. */\nexport const granularityThemeNames = ['light', 'dark'] as const\nexport type GranularityThemeName = (typeof granularityThemeNames)[number]\n\n/** Темы, активные по умолчанию, если окружение не переопределяет выбор. */\nexport const granularityDefaultThemes: readonly GranularityThemeName[] = ['light']\n\nconst theme = {\n baseCssUrl: new URL('../styles/base.css', import.meta.url).href,\n tokensCssUrl: new URL('../styles/tokens.css', import.meta.url).href,\n themes: {\n light: new URL('../styles/themes/light.css', import.meta.url).href,\n dark: new URL('../styles/themes/dark.css', import.meta.url).href,\n },\n defaultThemes: granularityDefaultThemes,\n} as const\n\n/**\n * Реестр публичных компонентов. Ключи совпадают с subpath-экспортом\n * `@feugene/granularity/components/<Name>`.\n */\nexport const granularityComponentConfigs = {\n // <granularity:components:registry> — блок генерируется `yarn generate:registry`\n GrAlert: grAlertConfig,\n GrAutocomplete: grAutocompleteConfig,\n GrAvatar: grAvatarConfig,\n GrBadge: grBadgeConfig,\n GrBadgeWrap: grBadgeWrapConfig,\n GrBottomNav: grBottomNavConfig,\n GrBreadcrumbs: grBreadcrumbsConfig,\n GrButton: grButtonConfig,\n GrButtonGroup: grButtonGroupConfig,\n GrCard: grCardConfig,\n GrCheckbox: grCheckboxConfig,\n GrCheckboxGroup: grCheckboxGroupConfig,\n GrChip: grChipConfig,\n GrChipGroup: grChipGroupConfig,\n GrCodeBlock: grCodeBlockConfig,\n GrCollapse: grCollapseConfig,\n GrColorPicker: grColorPickerConfig,\n GrCommandPalette: grCommandPaletteConfig,\n GrConfigProvider: grConfigProviderConfig,\n GrConfirmDialog: grConfirmDialogConfig,\n GrContextMenu: grContextMenuConfig,\n GrDataTable: grDataTableConfig,\n GrDelta: grDeltaConfig,\n GrDescriptionList: grDescriptionListConfig,\n GrDialog: grDialogConfig,\n GrDialogService: grDialogServiceConfig,\n GrDivider: grDividerConfig,\n GrDrawer: grDrawerConfig,\n GrDropdown: grDropdownConfig,\n GrDropdownMenu: grDropdownMenuConfig,\n GrEmptyState: grEmptyStateConfig,\n GrFilePreview: grFilePreviewConfig,\n GrFileUpload: grFileUploadConfig,\n GrForm: grFormConfig,\n GrFormField: grFormFieldConfig,\n GrFormFile: grFormFileConfig,\n GrFormSection: grFormSectionConfig,\n GrIcon: grIconConfig,\n GrImageViewer: grImageViewerConfig,\n GrInput: grInputConfig,\n GrInputTag: grInputTagConfig,\n GrJsonViewer: grJsonViewerConfig,\n GrKbd: grKbdConfig,\n GrLink: grLinkConfig,\n GrList: grListConfig,\n GrLoading: grLoadingConfig,\n GrModal: grModalConfig,\n GrNavbar: grNavbarConfig,\n GrNumberInput: grNumberInputConfig,\n GrPagination: grPaginationConfig,\n GrPopover: grPopoverConfig,\n GrProgressBar: grProgressBarConfig,\n GrProgressCircle: grProgressCircleConfig,\n GrPromptDialog: grPromptDialogConfig,\n GrRadio: grRadioConfig,\n GrRadioGroup: grRadioGroupConfig,\n GrRating: grRatingConfig,\n GrResponseErrorBanner: grResponseErrorBannerConfig,\n GrSegmented: grSegmentedConfig,\n GrSelect: grSelectConfig,\n GrSidebar: grSidebarConfig,\n GrSkeleton: grSkeletonConfig,\n GrSlider: grSliderConfig,\n GrSortableList: grSortableListConfig,\n GrSplitter: grSplitterConfig,\n GrStatistic: grStatisticConfig,\n GrSteps: grStepsConfig,\n GrSwitch: grSwitchConfig,\n GrTable: grTableConfig,\n GrTabPanels: grTabPanelsConfig,\n GrTabs: grTabsConfig,\n GrTextarea: grTextareaConfig,\n GrTimeline: grTimelineConfig,\n GrToaster: grToasterConfig,\n GrTooltip: grTooltipConfig,\n GrTree: grTreeConfig,\n GrTreeSelect: grTreeSelectConfig,\n GrValue: grValueConfig,\n // </granularity:components:registry>\n}\n\nexport type GranularityComponentName = keyof typeof granularityComponentConfigs\n\n/** Базовый набор компонентов в порядке реестра. */\nconst baseComponents: readonly GranularComponentDescriptor[] = Object.values(\n granularityComponentConfigs,\n)\n\n/**\n * Собирает granular-provider пакета.\n *\n * `overrides` — точка расширения для потребителя: дескриптор с именем из\n * базового реестра заменяет его, остальные дописываются в конец.\n */\nexport function createGranularityProvider(\n overrides: readonly GranularComponentDescriptor[] = [],\n): GranularProvider {\n const overrideByName = new Map(\n overrides.map(component => [component.name, component]),\n )\n const components: GranularComponentDescriptor[] = [\n ...baseComponents.map(component => overrideByName.get(component.name) ?? component),\n ...overrides.filter(component => !baseComponents.some(base => base.name === component.name)),\n ]\n\n return defineGranularProvider({\n id: GRANULARITY_PROVIDER_ID,\n contractVersion: 1,\n packageBaseUrl,\n components,\n theme,\n })\n}\n","import { createGranularityProvider } from './shared'\n\nexport * from './shared'\n\nexport const granularityProvider = createGranularityProvider()\n\nexport default granularityProvider\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,IAAa,iBAAiB,wBAAwB,OAAO,KAAK,KAAK;CACrE,MAAM;CACN,cAAc,CAAC,YAAY,SAAS;CACpC,UAAU;AACZ,CAAC;;;ACND,IAAa,8BAA8B,wBAAwB,OAAO,KAAK,KAAK;CAClF,MAAM;CACN,cAAc,CAAC,WAAW,UAAU;AACtC,CAAC;;;;AC4FD,IAAa,0BAA0B;AAIvC,IAAM,iBAAiB,sBAAsB,OAAO,KAAK,GAAG;;AAG5D,IAAa,wBAAwB,CAAC,SAAS,MAAM;;AAIrD,IAAa,2BAA4D,CAAC,OAAO;AAEjF,IAAM,QAAQ;CACZ,YAAY,IAAA,IAAA,q5KAAA,KAAA,OAAA,KAAA,GAAA,CAA8C,CAAC;CAC3D,cAAc,IAAA,IAAA,65YAAA,KAAA,OAAA,KAAA,GAAA,CAAgD,CAAC;CAC/D,QAAQ;EACN,OAAO,IAAA,IAAA,iyYAAA,KAAA,OAAA,KAAA,GAAA,CAAsD,CAAC;EAC9D,MAAM,IAAA,IAAA,y/SAAA,KAAA,OAAA,KAAA,GAAA,CAAqD,CAAC;CAC9D;CACA,eAAe;AACjB;;;;;AAMA,IAAa,8BAA8B;CAEzC,SAAS;CACT,gBAAgB;CAChB,UAAU;CACV,SAAS;CACT,aAAa;CACb,aAAa;CACb,eAAe;CACf,UAAU;CACV,eAAe;CACf,QAAQ;CACR,YAAY;CACZ,iBAAiB;CACjB,QAAQ;CACR,aAAa;CACb,aAAa;CACb,YAAY;CACZ,eAAe;CACf,kBAAkB;CAClB,kBAAkB;CAClB,iBAAiB;CACjB,eAAe;CACf,aAAa;CACb,SAAS;CACT,mBAAmB;CACnB,UAAU;CACV,iBAAiB;CACjB,WAAW;CACX,UAAU;CACV,YAAY;CACZ,gBAAgB;CAChB,cAAc;CACd,eAAe;CACf,cAAc;CACd,QAAQ;CACR,aAAa;CACb,YAAY;CACZ,eAAe;CACf,QAAQ;CACR,eAAe;CACf,SAAS;CACT,YAAY;CACZ,cAAc;CACd,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,WAAW;CACX,SAAS;CACT,UAAU;CACV,eAAe;CACf,cAAc;CACd,WAAW;CACX,eAAe;CACf,kBAAkB;CAClB,gBAAgB;CAChB,SAAS;CACT,cAAc;CACd,UAAU;CACV,uBAAuB;CACvB,aAAa;CACb,UAAU;CACV,WAAW;CACX,YAAY;CACZ,UAAU;CACV,gBAAgB;CAChB,YAAY;CACZ,aAAa;CACb,SAAS;CACT,UAAU;CACV,SAAS;CACT,aAAa;CACb,QAAQ;CACR,YAAY;CACZ,YAAY;CACZ,WAAW;CACX,WAAW;CACX,QAAQ;CACR,cAAc;CACd,SAAS;AAEX;;AAKA,IAAM,iBAAyD,OAAO,OACpE,2BACF;;;;;;;AAQA,SAAgB,0BACd,YAAoD,CAAC,GACnC;CAClB,MAAM,iBAAiB,IAAI,IACzB,UAAU,KAAI,cAAa,CAAC,UAAU,MAAM,SAAS,CAAC,CACxD;CAMA,OAAO,uBAAuB;EAC5B,IAAI;EACJ,iBAAiB;EACjB;EACA,aARA,GAAG,eAAe,KAAI,cAAa,eAAe,IAAI,UAAU,IAAI,KAAK,SAAS,GAClF,GAAG,UAAU,QAAO,cAAa,CAAC,eAAe,MAAK,SAAQ,KAAK,SAAS,UAAU,IAAI,CAAC,CAO3F;EACA;CACF,CAAC;AACH;;;AC1OA,IAAa,sBAAsB,0BAA0B"}
1
+ {"version":3,"file":"granular-provider-Da2CJO6j.js","names":[],"sources":["../../src/components/GrDialog/config.ts","../../src/components/GrResponseErrorBanner/config.ts","../../src/granular-provider/shared.ts","../../src/granular-provider/index.ts"],"sourcesContent":["import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grDialogSafelist } from './safelist'\n\nexport const grDialogConfig = defineGranularComponent(import.meta.url, {\n name: 'GrDialog',\n dependencies: ['GrButton', 'GrModal'],\n safelist: grDialogSafelist,\n})\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nexport const grResponseErrorBannerConfig = defineGranularComponent(import.meta.url, {\n name: 'GrResponseErrorBanner',\n dependencies: ['GrAlert', 'GrButton'],\n})\n","// `id`, `theme.*`, `packageBaseUrl` и реестр компонентов провайдера.\n//\n// Все `new URL('../styles/...', import.meta.url)` обязаны лежать именно здесь:\n// `shared.ts` в одной директории с `index.ts` / `node.ts`, поэтому\n// относительные пути совпадают. Для браузера безопасно — бандлеры\n// транслируют такие литералы в статические asset-URL.\n//\n// `apps/showcase/scripts/generate-component-api.mjs` читает список компонентов\n// из `Object.keys(granularityComponentConfigs)` через vite SSR.\nimport {\n defineGranularProvider,\n type GranularComponentDescriptor,\n type GranularProvider,\n resolvePackageBaseUrl,\n} from '@feugene/unocss-preset-granular/contract'\n// <granularity:components:imports> — блок генерируется `yarn generate:registry`\nimport { grAlertConfig } from '../components/GrAlert/config'\nimport { grAutocompleteConfig } from '../components/GrAutocomplete/config'\nimport { grAvatarConfig } from '../components/GrAvatar/config'\nimport { grBadgeConfig } from '../components/GrBadge/config'\nimport { grBadgeWrapConfig } from '../components/GrBadgeWrap/config'\nimport { grBottomNavConfig } from '../components/GrBottomNav/config'\nimport { grBreadcrumbsConfig } from '../components/GrBreadcrumbs/config'\nimport { grButtonConfig } from '../components/GrButton/config'\nimport { grButtonGroupConfig } from '../components/GrButtonGroup/config'\nimport { grCardConfig } from '../components/GrCard/config'\nimport { grCheckboxConfig } from '../components/GrCheckbox/config'\nimport { grCheckboxGroupConfig } from '../components/GrCheckboxGroup/config'\nimport { grChipConfig } from '../components/GrChip/config'\nimport { grChipGroupConfig } from '../components/GrChipGroup/config'\nimport { grCodeBlockConfig } from '../components/GrCodeBlock/config'\nimport { grCollapseConfig } from '../components/GrCollapse/config'\nimport { grColorPickerConfig } from '../components/GrColorPicker/config'\nimport { grCommandPaletteConfig } from '../components/GrCommandPalette/config'\nimport { grConfigProviderConfig } from '../components/GrConfigProvider/config'\nimport { grConfirmDialogConfig } from '../components/GrConfirmDialog/config'\nimport { grContextMenuConfig } from '../components/GrContextMenu/config'\nimport { grDataTableConfig } from '../components/GrDataTable/config'\nimport { grDeltaConfig } from '../components/GrDelta/config'\nimport { grDescriptionListConfig } from '../components/GrDescriptionList/config'\nimport { grDialogConfig } from '../components/GrDialog/config'\nimport { grDialogServiceConfig } from '../components/GrDialogService/config'\nimport { grDividerConfig } from '../components/GrDivider/config'\nimport { grDrawerConfig } from '../components/GrDrawer/config'\nimport { grDropdownConfig } from '../components/GrDropdown/config'\nimport { grDropdownMenuConfig } from '../components/GrDropdownMenu/config'\nimport { grEmptyStateConfig } from '../components/GrEmptyState/config'\nimport { grFilePreviewConfig } from '../components/GrFilePreview/config'\nimport { grFileUploadConfig } from '../components/GrFileUpload/config'\nimport { grFormConfig } from '../components/GrForm/config'\nimport { grFormFieldConfig } from '../components/GrFormField/config'\nimport { grFormFileConfig } from '../components/GrFormFile/config'\nimport { grFormSectionConfig } from '../components/GrFormSection/config'\nimport { grIconConfig } from '../components/GrIcon/config'\nimport { grImageViewerConfig } from '../components/GrImageViewer/config'\nimport { grInputConfig } from '../components/GrInput/config'\nimport { grInputTagConfig } from '../components/GrInputTag/config'\nimport { grJsonViewerConfig } from '../components/GrJsonViewer/config'\nimport { grKbdConfig } from '../components/GrKbd/config'\nimport { grLinkConfig } from '../components/GrLink/config'\nimport { grListConfig } from '../components/GrList/config'\nimport { grLoadingConfig } from '../components/GrLoading/config'\nimport { grModalConfig } from '../components/GrModal/config'\nimport { grNavbarConfig } from '../components/GrNavbar/config'\nimport { grNumberInputConfig } from '../components/GrNumberInput/config'\nimport { grPaginationConfig } from '../components/GrPagination/config'\nimport { grPopoverConfig } from '../components/GrPopover/config'\nimport { grProgressBarConfig } from '../components/GrProgressBar/config'\nimport { grProgressCircleConfig } from '../components/GrProgressCircle/config'\nimport { grPromptDialogConfig } from '../components/GrPromptDialog/config'\nimport { grRadioConfig } from '../components/GrRadio/config'\nimport { grRadioGroupConfig } from '../components/GrRadioGroup/config'\nimport { grRatingConfig } from '../components/GrRating/config'\nimport { grResponseErrorBannerConfig } from '../components/GrResponseErrorBanner/config'\nimport { grSegmentedConfig } from '../components/GrSegmented/config'\nimport { grSelectConfig } from '../components/GrSelect/config'\nimport { grSidebarConfig } from '../components/GrSidebar/config'\nimport { grSkeletonConfig } from '../components/GrSkeleton/config'\nimport { grSliderConfig } from '../components/GrSlider/config'\nimport { grSortableListConfig } from '../components/GrSortableList/config'\nimport { grSplitterConfig } from '../components/GrSplitter/config'\nimport { grStatisticConfig } from '../components/GrStatistic/config'\nimport { grStepsConfig } from '../components/GrSteps/config'\nimport { grSwitchConfig } from '../components/GrSwitch/config'\nimport { grTableConfig } from '../components/GrTable/config'\nimport { grTabPanelsConfig } from '../components/GrTabPanels/config'\nimport { grTabsConfig } from '../components/GrTabs/config'\nimport { grTextareaConfig } from '../components/GrTextarea/config'\nimport { grTimelineConfig } from '../components/GrTimeline/config'\nimport { grToasterConfig } from '../components/GrToaster/config'\nimport { grTooltipConfig } from '../components/GrTooltip/config'\nimport { grTreeConfig } from '../components/GrTree/config'\nimport { grTreeSelectConfig } from '../components/GrTreeSelect/config'\nimport { grValueConfig } from '../components/GrValue/config'\n// </granularity:components:imports>\n\n/** Идентификатор провайдера — совпадает с именем пакета. */\nexport const GRANULARITY_PROVIDER_ID = '@feugene/granularity'\n\n// Не заменять на `new URL('..', import.meta.url)`: Vite и rolldown распознают\n// этот литерал и подставляют `data:`-URL, после чего scan-директории пустеют.\nconst packageBaseUrl = resolvePackageBaseUrl(import.meta.url)\n\n/** Встроенные темы пакета. Единственный источник правды о списке тем. */\nexport const granularityThemeNames = ['light', 'dark'] as const\nexport type GranularityThemeName = (typeof granularityThemeNames)[number]\n\n/** Темы, активные по умолчанию, если окружение не переопределяет выбор. */\nexport const granularityDefaultThemes: readonly GranularityThemeName[] = ['light']\n\nconst theme = {\n baseCssUrl: new URL('../styles/base.css', import.meta.url).href,\n tokensCssUrl: new URL('../styles/tokens.css', import.meta.url).href,\n themes: {\n light: new URL('../styles/themes/light.css', import.meta.url).href,\n dark: new URL('../styles/themes/dark.css', import.meta.url).href,\n },\n defaultThemes: granularityDefaultThemes,\n} as const\n\n/**\n * Реестр публичных компонентов. Ключи совпадают с subpath-экспортом\n * `@feugene/granularity/components/<Name>`.\n */\nexport const granularityComponentConfigs = {\n // <granularity:components:registry> — блок генерируется `yarn generate:registry`\n GrAlert: grAlertConfig,\n GrAutocomplete: grAutocompleteConfig,\n GrAvatar: grAvatarConfig,\n GrBadge: grBadgeConfig,\n GrBadgeWrap: grBadgeWrapConfig,\n GrBottomNav: grBottomNavConfig,\n GrBreadcrumbs: grBreadcrumbsConfig,\n GrButton: grButtonConfig,\n GrButtonGroup: grButtonGroupConfig,\n GrCard: grCardConfig,\n GrCheckbox: grCheckboxConfig,\n GrCheckboxGroup: grCheckboxGroupConfig,\n GrChip: grChipConfig,\n GrChipGroup: grChipGroupConfig,\n GrCodeBlock: grCodeBlockConfig,\n GrCollapse: grCollapseConfig,\n GrColorPicker: grColorPickerConfig,\n GrCommandPalette: grCommandPaletteConfig,\n GrConfigProvider: grConfigProviderConfig,\n GrConfirmDialog: grConfirmDialogConfig,\n GrContextMenu: grContextMenuConfig,\n GrDataTable: grDataTableConfig,\n GrDelta: grDeltaConfig,\n GrDescriptionList: grDescriptionListConfig,\n GrDialog: grDialogConfig,\n GrDialogService: grDialogServiceConfig,\n GrDivider: grDividerConfig,\n GrDrawer: grDrawerConfig,\n GrDropdown: grDropdownConfig,\n GrDropdownMenu: grDropdownMenuConfig,\n GrEmptyState: grEmptyStateConfig,\n GrFilePreview: grFilePreviewConfig,\n GrFileUpload: grFileUploadConfig,\n GrForm: grFormConfig,\n GrFormField: grFormFieldConfig,\n GrFormFile: grFormFileConfig,\n GrFormSection: grFormSectionConfig,\n GrIcon: grIconConfig,\n GrImageViewer: grImageViewerConfig,\n GrInput: grInputConfig,\n GrInputTag: grInputTagConfig,\n GrJsonViewer: grJsonViewerConfig,\n GrKbd: grKbdConfig,\n GrLink: grLinkConfig,\n GrList: grListConfig,\n GrLoading: grLoadingConfig,\n GrModal: grModalConfig,\n GrNavbar: grNavbarConfig,\n GrNumberInput: grNumberInputConfig,\n GrPagination: grPaginationConfig,\n GrPopover: grPopoverConfig,\n GrProgressBar: grProgressBarConfig,\n GrProgressCircle: grProgressCircleConfig,\n GrPromptDialog: grPromptDialogConfig,\n GrRadio: grRadioConfig,\n GrRadioGroup: grRadioGroupConfig,\n GrRating: grRatingConfig,\n GrResponseErrorBanner: grResponseErrorBannerConfig,\n GrSegmented: grSegmentedConfig,\n GrSelect: grSelectConfig,\n GrSidebar: grSidebarConfig,\n GrSkeleton: grSkeletonConfig,\n GrSlider: grSliderConfig,\n GrSortableList: grSortableListConfig,\n GrSplitter: grSplitterConfig,\n GrStatistic: grStatisticConfig,\n GrSteps: grStepsConfig,\n GrSwitch: grSwitchConfig,\n GrTable: grTableConfig,\n GrTabPanels: grTabPanelsConfig,\n GrTabs: grTabsConfig,\n GrTextarea: grTextareaConfig,\n GrTimeline: grTimelineConfig,\n GrToaster: grToasterConfig,\n GrTooltip: grTooltipConfig,\n GrTree: grTreeConfig,\n GrTreeSelect: grTreeSelectConfig,\n GrValue: grValueConfig,\n // </granularity:components:registry>\n}\n\nexport type GranularityComponentName = keyof typeof granularityComponentConfigs\n\n/** Базовый набор компонентов в порядке реестра. */\nconst baseComponents: readonly GranularComponentDescriptor[] = Object.values(\n granularityComponentConfigs,\n)\n\n/**\n * Собирает granular-provider пакета.\n *\n * `overrides` — точка расширения для потребителя: дескриптор с именем из\n * базового реестра заменяет его, остальные дописываются в конец.\n */\nexport function createGranularityProvider(\n overrides: readonly GranularComponentDescriptor[] = [],\n): GranularProvider {\n const overrideByName = new Map(\n overrides.map(component => [component.name, component]),\n )\n const components: GranularComponentDescriptor[] = [\n ...baseComponents.map(component => overrideByName.get(component.name) ?? component),\n ...overrides.filter(component => !baseComponents.some(base => base.name === component.name)),\n ]\n\n return defineGranularProvider({\n id: GRANULARITY_PROVIDER_ID,\n contractVersion: 1,\n packageBaseUrl,\n components,\n theme,\n })\n}\n","import { createGranularityProvider } from './shared'\n\nexport * from './shared'\n\nexport const granularityProvider = createGranularityProvider()\n\nexport default granularityProvider\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,IAAa,iBAAiB,wBAAwB,OAAO,KAAK,KAAK;CACrE,MAAM;CACN,cAAc,CAAC,YAAY,SAAS;CACpC,UAAU;AACZ,CAAC;;;ACND,IAAa,8BAA8B,wBAAwB,OAAO,KAAK,KAAK;CAClF,MAAM;CACN,cAAc,CAAC,WAAW,UAAU;AACtC,CAAC;;;;AC4FD,IAAa,0BAA0B;AAIvC,IAAM,iBAAiB,sBAAsB,OAAO,KAAK,GAAG;;AAG5D,IAAa,wBAAwB,CAAC,SAAS,MAAM;;AAIrD,IAAa,2BAA4D,CAAC,OAAO;AAEjF,IAAM,QAAQ;CACZ,YAAY,IAAA,IAAA,q5KAAA,KAAA,OAAA,KAAA,GAAA,CAA8C,CAAC;CAC3D,cAAc,IAAA,IAAA,65YAAA,KAAA,OAAA,KAAA,GAAA,CAAgD,CAAC;CAC/D,QAAQ;EACN,OAAO,IAAA,IAAA,iyYAAA,KAAA,OAAA,KAAA,GAAA,CAAsD,CAAC;EAC9D,MAAM,IAAA,IAAA,y/SAAA,KAAA,OAAA,KAAA,GAAA,CAAqD,CAAC;CAC9D;CACA,eAAe;AACjB;;;;;AAMA,IAAa,8BAA8B;CAEzC,SAAS;CACT,gBAAgB;CAChB,UAAU;CACV,SAAS;CACT,aAAa;CACb,aAAa;CACb,eAAe;CACf,UAAU;CACV,eAAe;CACf,QAAQ;CACR,YAAY;CACZ,iBAAiB;CACjB,QAAQ;CACR,aAAa;CACb,aAAa;CACb,YAAY;CACZ,eAAe;CACf,kBAAkB;CAClB,kBAAkB;CAClB,iBAAiB;CACjB,eAAe;CACf,aAAa;CACb,SAAS;CACT,mBAAmB;CACnB,UAAU;CACV,iBAAiB;CACjB,WAAW;CACX,UAAU;CACV,YAAY;CACZ,gBAAgB;CAChB,cAAc;CACd,eAAe;CACf,cAAc;CACd,QAAQ;CACR,aAAa;CACb,YAAY;CACZ,eAAe;CACf,QAAQ;CACR,eAAe;CACf,SAAS;CACT,YAAY;CACZ,cAAc;CACd,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,WAAW;CACX,SAAS;CACT,UAAU;CACV,eAAe;CACf,cAAc;CACd,WAAW;CACX,eAAe;CACf,kBAAkB;CAClB,gBAAgB;CAChB,SAAS;CACT,cAAc;CACd,UAAU;CACV,uBAAuB;CACvB,aAAa;CACb,UAAU;CACV,WAAW;CACX,YAAY;CACZ,UAAU;CACV,gBAAgB;CAChB,YAAY;CACZ,aAAa;CACb,SAAS;CACT,UAAU;CACV,SAAS;CACT,aAAa;CACb,QAAQ;CACR,YAAY;CACZ,YAAY;CACZ,WAAW;CACX,WAAW;CACX,QAAQ;CACR,cAAc;CACd,SAAS;AAEX;;AAKA,IAAM,iBAAyD,OAAO,OACpE,2BACF;;;;;;;AAQA,SAAgB,0BACd,YAAoD,CAAC,GACnC;CAClB,MAAM,iBAAiB,IAAI,IACzB,UAAU,KAAI,cAAa,CAAC,UAAU,MAAM,SAAS,CAAC,CACxD;CAMA,OAAO,uBAAuB;EAC5B,IAAI;EACJ,iBAAiB;EACjB;EACA,aARA,GAAG,eAAe,KAAI,cAAa,eAAe,IAAI,UAAU,IAAI,KAAK,SAAS,GAClF,GAAG,UAAU,QAAO,cAAa,CAAC,eAAe,MAAK,SAAQ,KAAK,SAAS,UAAU,IAAI,CAAC,CAO3F;EACA;CACF,CAAC;AACH;;;AC1OA,IAAa,sBAAsB,0BAA0B"}
@@ -1 +1 @@
1
- {"version":3,"file":"granularityI18n-BC5zsj_d.js","names":[],"sources":["../../src/internal/granularityI18n.ts"],"sourcesContent":["import { computed, getCurrentInstance, inject, type AppContext } from 'vue'\n\nimport { GRANULARITY_I18N_KEY, type GranularityI18nAdapter } from '../i18n/adapter'\n\nexport type GranularityI18nLike = GranularityI18nAdapter\n\n/**\n * Ключ provide/inject из `@feugene/fint-i18n` (`Symbol.for(\"FintI18n\")`).\n *\n * Дублируем константу здесь, чтобы не делать `@feugene/fint-i18n` обязательной\n * runtime-зависимостью пакета: достаточно, чтобы приложение само установило\n * fint-i18n через `installI18n(app, i18n)` — символ глобальный (Symbol.for),\n * поэтому ключи будут совпадать без прямого импорта.\n */\nconst FINT_I18N_KEY: symbol = Symbol.for('FintI18n')\n\nfunction isGranularityI18nLike(value: unknown): value is GranularityI18nLike {\n return typeof (value as GranularityI18nLike | null)?.t === 'function'\n}\n\nexport function resolveGranularityI18n(context?: AppContext | GranularityI18nLike | null): GranularityI18nLike | null {\n if (isGranularityI18nLike(context)) {\n return context\n }\n\n const provides = context?.provides\n\n if (provides) {\n const fromGranularity = provides[GRANULARITY_I18N_KEY as symbol] as GranularityI18nLike | null | undefined\n if (isGranularityI18nLike(fromGranularity)) {\n return fromGranularity\n }\n\n const fromFint = provides[FINT_I18N_KEY] as GranularityI18nLike | null | undefined\n if (isGranularityI18nLike(fromFint)) {\n return fromFint\n }\n\n return null\n }\n\n if (!getCurrentInstance()) {\n return null\n }\n\n const fromGranularity = inject<GranularityI18nLike | null>(GRANULARITY_I18N_KEY, null)\n if (isGranularityI18nLike(fromGranularity)) {\n return fromGranularity\n }\n\n const fromFint = inject<GranularityI18nLike | null>(FINT_I18N_KEY, null)\n if (isGranularityI18nLike(fromFint)) {\n return fromFint\n }\n\n return null\n}\n\n// Совпадает с синтаксисом плейсхолдеров `@feugene/fint-i18n` (`{name}`, экранирование\n// `{{`/`}}` — см. docs/en/api.md → \"Template Interpolation\"), чтобы fallback-текст вёл\n// себя идентично реальному переводу, когда параметры переданы.\nconst FALLBACK_PLACEHOLDER_RE = /\\{\\{|\\}\\}|\\{([a-zA-Z0-9_.-]+)\\}/g\n\n/**\n * Интерполирует `{name}`-плейсхолдеры во fallback-строке. Нужен, чтобы `t(key, fallback,\n * params)` корректно подставлял параметры и тогда, когда i18n не подключён (или ключ не\n * найден) — иначе вызывающий код получил бы сырой `'Add \"{value}\"'` вместо `'Add \"foo\"'`.\n */\nfunction interpolateFallback(template: string, params?: Record<string, any>): string {\n // `{{`/`}}`-экранирование обязано работать независимо от того, переданы ли `params`\n // (совпадает с fint-i18n: `t('literal')` без параметров тоже разэкранирует `{{name}}`).\n // Ранний выход по `!params` здесь недопустим.\n return template.replace(FALLBACK_PLACEHOLDER_RE, (match, name: string | undefined) => {\n if (match === '{{') return '{'\n if (match === '}}') return '}'\n if (name === undefined) return match\n\n const value = params?.[name]\n return value == null ? match : String(value)\n })\n}\n\nexport function useGranularityTranslations(context?: AppContext | GranularityI18nLike | null) {\n const i18n = resolveGranularityI18n(context)\n\n const t = (key: string, fallback: string, params?: Record<string, any>): string => {\n if (!i18n) {\n return interpolateFallback(fallback, params)\n }\n\n // `te()` — единственный честный способ спросить «есть ли перевод».\n // Сравнение `t(key) === key` врёт на словаре, где значение совпадает с\n // ключом: такой перевод считался бы отсутствующим. Оставляем эвристику\n // только для адаптеров, которые `te()` не умеют.\n if (i18n.te) {\n return i18n.te(key) ? i18n.t(key, params) : interpolateFallback(fallback, params)\n }\n\n const result = i18n.t(key, params)\n return result === key ? interpolateFallback(fallback, params) : result\n }\n\n return {\n i18n,\n t,\n /**\n * Активная локаль адаптера — для `Intl.*` и `localeCompare`. `undefined`,\n * когда адаптера нет или он её не отдаёт: тогда сравнение уходит на локаль\n * среды, как и было.\n */\n locale: computed(() => i18n?.locale?.value),\n }\n}"],"mappings":";;;;;;;;;;;AAcA,IAAM,gBAAwB,OAAO,IAAI,UAAU;AAEnD,SAAS,sBAAsB,OAA8C;CAC3E,OAAO,OAAQ,OAAsC,MAAM;AAC7D;AAEA,SAAgB,uBAAuB,SAA+E;CACpH,IAAI,sBAAsB,OAAO,GAC/B,OAAO;CAGT,MAAM,WAAW,SAAS;CAE1B,IAAI,UAAU;EACZ,MAAM,kBAAkB,SAAS;EACjC,IAAI,sBAAsB,eAAe,GACvC,OAAO;EAGT,MAAM,WAAW,SAAS;EAC1B,IAAI,sBAAsB,QAAQ,GAChC,OAAO;EAGT,OAAO;CACT;CAEA,IAAI,CAAC,mBAAmB,GACtB,OAAO;CAGT,MAAM,kBAAkB,OAAmC,sBAAsB,IAAI;CACrF,IAAI,sBAAsB,eAAe,GACvC,OAAO;CAGT,MAAM,WAAW,OAAmC,eAAe,IAAI;CACvE,IAAI,sBAAsB,QAAQ,GAChC,OAAO;CAGT,OAAO;AACT;AAKA,IAAM,0BAA0B;;;;;;AAOhC,SAAS,oBAAoB,UAAkB,QAAsC;CAInF,OAAO,SAAS,QAAQ,0BAA0B,OAAO,SAA6B;EACpF,IAAI,UAAU,MAAM,OAAO;EAC3B,IAAI,UAAU,MAAM,OAAO;EAC3B,IAAI,SAAS,KAAA,GAAW,OAAO;EAE/B,MAAM,QAAQ,SAAS;EACvB,OAAO,SAAS,OAAO,QAAQ,OAAO,KAAK;CAC7C,CAAC;AACH;AAEA,SAAgB,2BAA2B,SAAmD;CAC5F,MAAM,OAAO,uBAAuB,OAAO;CAE3C,MAAM,KAAK,KAAa,UAAkB,WAAyC;EACjF,IAAI,CAAC,MACH,OAAO,oBAAoB,UAAU,MAAM;EAO7C,IAAI,KAAK,IACP,OAAO,KAAK,GAAG,GAAG,IAAI,KAAK,EAAE,KAAK,MAAM,IAAI,oBAAoB,UAAU,MAAM;EAGlF,MAAM,SAAS,KAAK,EAAE,KAAK,MAAM;EACjC,OAAO,WAAW,MAAM,oBAAoB,UAAU,MAAM,IAAI;CAClE;CAEA,OAAO;EACL;EACA;;;;;;EAMA,QAAQ,eAAe,MAAM,QAAQ,KAAK;CAC5C;AACF"}
1
+ {"version":3,"file":"granularityI18n-BC5zsj_d.js","names":[],"sources":["../../src/internal/granularityI18n.ts"],"sourcesContent":["import { computed, getCurrentInstance, inject, type AppContext } from 'vue'\n\nimport { GRANULARITY_I18N_KEY, type GranularityI18nAdapter } from '../i18n/adapter'\n\nexport type GranularityI18nLike = GranularityI18nAdapter\n\n/**\n * Ключ provide/inject из `@feugene/fint-i18n` (`Symbol.for(\"FintI18n\")`).\n *\n * Дублируем константу здесь, чтобы не делать `@feugene/fint-i18n` обязательной\n * runtime-зависимостью пакета: достаточно, чтобы приложение само установило\n * fint-i18n через `installI18n(app, i18n)` — символ глобальный (Symbol.for),\n * поэтому ключи будут совпадать без прямого импорта.\n */\nconst FINT_I18N_KEY: symbol = Symbol.for('FintI18n')\n\nfunction isGranularityI18nLike(value: unknown): value is GranularityI18nLike {\n return typeof (value as GranularityI18nLike | null)?.t === 'function'\n}\n\nexport function resolveGranularityI18n(context?: AppContext | GranularityI18nLike | null): GranularityI18nLike | null {\n if (isGranularityI18nLike(context)) {\n return context\n }\n\n const provides = context?.provides\n\n if (provides) {\n const fromGranularity = provides[GRANULARITY_I18N_KEY as symbol] as GranularityI18nLike | null | undefined\n if (isGranularityI18nLike(fromGranularity)) {\n return fromGranularity\n }\n\n const fromFint = provides[FINT_I18N_KEY] as GranularityI18nLike | null | undefined\n if (isGranularityI18nLike(fromFint)) {\n return fromFint\n }\n\n return null\n }\n\n if (!getCurrentInstance()) {\n return null\n }\n\n const fromGranularity = inject<GranularityI18nLike | null>(GRANULARITY_I18N_KEY, null)\n if (isGranularityI18nLike(fromGranularity)) {\n return fromGranularity\n }\n\n const fromFint = inject<GranularityI18nLike | null>(FINT_I18N_KEY, null)\n if (isGranularityI18nLike(fromFint)) {\n return fromFint\n }\n\n return null\n}\n\n// Совпадает с синтаксисом плейсхолдеров `@feugene/fint-i18n` (`{name}`, экранирование\n// `{{`/`}}` — см. docs/en/api.md → \"Template Interpolation\"), чтобы fallback-текст вёл\n// себя идентично реальному переводу, когда параметры переданы.\nconst FALLBACK_PLACEHOLDER_RE = /\\{\\{|\\}\\}|\\{([a-zA-Z0-9_.-]+)\\}/g\n\n/**\n * Интерполирует `{name}`-плейсхолдеры во fallback-строке. Нужен, чтобы `t(key, fallback,\n * params)` корректно подставлял параметры и тогда, когда i18n не подключён (или ключ не\n * найден) — иначе вызывающий код получил бы сырой `'Add \"{value}\"'` вместо `'Add \"foo\"'`.\n */\nfunction interpolateFallback(template: string, params?: Record<string, any>): string {\n // `{{`/`}}`-экранирование обязано работать независимо от того, переданы ли `params`\n // (совпадает с fint-i18n: `t('literal')` без параметров тоже разэкранирует `{{name}}`).\n // Ранний выход по `!params` здесь недопустим.\n return template.replace(FALLBACK_PLACEHOLDER_RE, (match, name: string | undefined) => {\n if (match === '{{')\n return '{'\n if (match === '}}')\n return '}'\n if (name === undefined)\n return match\n\n const value = params?.[name]\n return value == null ? match : String(value)\n })\n}\n\nexport function useGranularityTranslations(context?: AppContext | GranularityI18nLike | null) {\n const i18n = resolveGranularityI18n(context)\n\n const t = (key: string, fallback: string, params?: Record<string, any>): string => {\n if (!i18n) {\n return interpolateFallback(fallback, params)\n }\n\n // `te()` — единственный честный способ спросить «есть ли перевод».\n // Сравнение `t(key) === key` врёт на словаре, где значение совпадает с\n // ключом: такой перевод считался бы отсутствующим. Оставляем эвристику\n // только для адаптеров, которые `te()` не умеют.\n if (i18n.te) {\n return i18n.te(key) ? i18n.t(key, params) : interpolateFallback(fallback, params)\n }\n\n const result = i18n.t(key, params)\n return result === key ? interpolateFallback(fallback, params) : result\n }\n\n return {\n i18n,\n t,\n /**\n * Активная локаль адаптера — для `Intl.*` и `localeCompare`. `undefined`,\n * когда адаптера нет или он её не отдаёт: тогда сравнение уходит на локаль\n * среды, как и было.\n */\n locale: computed(() => i18n?.locale?.value),\n }\n}\n"],"mappings":";;;;;;;;;;;AAcA,IAAM,gBAAwB,OAAO,IAAI,UAAU;AAEnD,SAAS,sBAAsB,OAA8C;CAC3E,OAAO,OAAQ,OAAsC,MAAM;AAC7D;AAEA,SAAgB,uBAAuB,SAA+E;CACpH,IAAI,sBAAsB,OAAO,GAC/B,OAAO;CAGT,MAAM,WAAW,SAAS;CAE1B,IAAI,UAAU;EACZ,MAAM,kBAAkB,SAAS;EACjC,IAAI,sBAAsB,eAAe,GACvC,OAAO;EAGT,MAAM,WAAW,SAAS;EAC1B,IAAI,sBAAsB,QAAQ,GAChC,OAAO;EAGT,OAAO;CACT;CAEA,IAAI,CAAC,mBAAmB,GACtB,OAAO;CAGT,MAAM,kBAAkB,OAAmC,sBAAsB,IAAI;CACrF,IAAI,sBAAsB,eAAe,GACvC,OAAO;CAGT,MAAM,WAAW,OAAmC,eAAe,IAAI;CACvE,IAAI,sBAAsB,QAAQ,GAChC,OAAO;CAGT,OAAO;AACT;AAKA,IAAM,0BAA0B;;;;;;AAOhC,SAAS,oBAAoB,UAAkB,QAAsC;CAInF,OAAO,SAAS,QAAQ,0BAA0B,OAAO,SAA6B;EACpF,IAAI,UAAU,MACZ,OAAO;EACT,IAAI,UAAU,MACZ,OAAO;EACT,IAAI,SAAS,KAAA,GACX,OAAO;EAET,MAAM,QAAQ,SAAS;EACvB,OAAO,SAAS,OAAO,QAAQ,OAAO,KAAK;CAC7C,CAAC;AACH;AAEA,SAAgB,2BAA2B,SAAmD;CAC5F,MAAM,OAAO,uBAAuB,OAAO;CAE3C,MAAM,KAAK,KAAa,UAAkB,WAAyC;EACjF,IAAI,CAAC,MACH,OAAO,oBAAoB,UAAU,MAAM;EAO7C,IAAI,KAAK,IACP,OAAO,KAAK,GAAG,GAAG,IAAI,KAAK,EAAE,KAAK,MAAM,IAAI,oBAAoB,UAAU,MAAM;EAGlF,MAAM,SAAS,KAAK,EAAE,KAAK,MAAM;EACjC,OAAO,WAAW,MAAM,oBAAoB,UAAU,MAAM,IAAI;CAClE;CAEA,OAAO;EACL;EACA;;;;;;EAMA,QAAQ,eAAe,MAAM,QAAQ,KAAK;CAC5C;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"icon-Dag2tIMs.js","names":[],"sources":["../../src/components/shared/icon.ts"],"sourcesContent":["import type { Component } from 'vue'\nimport { markRaw } from 'vue'\n\n/**\n * Иконку компонент получает двумя способами, и рисуются они разными тегами.\n *\n * Vue-компонент пакет рисует сам — он ни от чего не зависит. Класс иконки\n * (`i-lucide-*`) генерирует не пакет, а UnoCSS-сборка приложения: без своего\n * `presetIcons` потребитель получит пустое место вместо картинки\n * (`docs/installation.md`). Поэтому класс уезжает в `:class` пустого `span`,\n * а компонент — в `:is`.\n */\nexport function iconTag(\n icon: string | Component | undefined,\n fallback: string | Component = 'span',\n): string | Component {\n if (!icon) return fallback\n\n return typeof icon === 'string' ? 'span' : markRaw(icon)\n}\n\n/** Класс иконки, если она задана строкой; для компонента классов нет. */\nexport function iconClass(icon: string | Component | undefined): string {\n return typeof icon === 'string' ? icon : ''\n}\n"],"mappings":";;;;;;;;;;;AAYA,SAAgB,QACd,MACA,WAA+B,QACX;CACpB,IAAI,CAAC,MAAM,OAAO;CAElB,OAAO,OAAO,SAAS,WAAW,SAAS,QAAQ,IAAI;AACzD;;AAGA,SAAgB,UAAU,MAA8C;CACtE,OAAO,OAAO,SAAS,WAAW,OAAO;AAC3C"}
1
+ {"version":3,"file":"icon-Dag2tIMs.js","names":[],"sources":["../../src/components/shared/icon.ts"],"sourcesContent":["import type { Component } from 'vue'\nimport { markRaw } from 'vue'\n\n/**\n * Иконку компонент получает двумя способами, и рисуются они разными тегами.\n *\n * Vue-компонент пакет рисует сам — он ни от чего не зависит. Класс иконки\n * (`i-lucide-*`) генерирует не пакет, а UnoCSS-сборка приложения: без своего\n * `presetIcons` потребитель получит пустое место вместо картинки\n * (`docs/installation.md`). Поэтому класс уезжает в `:class` пустого `span`,\n * а компонент — в `:is`.\n */\nexport function iconTag(\n icon: string | Component | undefined,\n fallback: string | Component = 'span',\n): string | Component {\n if (!icon)\n return fallback\n\n return typeof icon === 'string' ? 'span' : markRaw(icon)\n}\n\n/** Класс иконки, если она задана строкой; для компонента классов нет. */\nexport function iconClass(icon: string | Component | undefined): string {\n return typeof icon === 'string' ? icon : ''\n}\n"],"mappings":";;;;;;;;;;;AAYA,SAAgB,QACd,MACA,WAA+B,QACX;CACpB,IAAI,CAAC,MACH,OAAO;CAET,OAAO,OAAO,SAAS,WAAW,SAAS,QAAQ,IAAI;AACzD;;AAGA,SAAgB,UAAU,MAA8C;CACtE,OAAO,OAAO,SAAS,WAAW,OAAO;AAC3C"}
@@ -1 +1 @@
1
- {"version":3,"file":"inert-DIHCCn_1.js","names":[],"sources":["../../src/composables/internal/inert.ts"],"sourcesContent":["/**\n * `inert` для чужих поддеревьев.\n *\n * Визуального перекрытия мало: без `inert` таб уходит в форму, которую\n * пользователь уже не видит, а скринридер читает её как обычную. `inert`\n * снимает поддерево целиком — фокус, события указателя и дерево доступности.\n *\n * Два правила, из-за которых это отдельный модуль, а не пара строк на месте:\n *\n * - **чужой `inert` не снимаем.** Элемент мог быть инертен и до нас;\n * - **счётчик на элемент.** Два открытых оверлея пометят один и тот же фон, и\n * закрытие первого не должно возвращать его в таб-порядок под вторым.\n */\n\ninterface InertRecord {\n /** Сколько слоёв сейчас держат элемент инертным. */\n count: number\n /** Был ли `inert` до нас: такой не снимаем. */\n foreign: boolean\n /** Прежнее значение `aria-hidden` (или `null`, если атрибута не было). */\n ariaHidden: string | null\n}\n\nconst records = new WeakMap<HTMLElement, InertRecord>()\n\n/** Помечает элементы инертными и возвращает снятие пометки. */\nexport function markInert(elements: HTMLElement[]): () => void {\n const marked: HTMLElement[] = []\n\n for (const element of elements) {\n const existing = records.get(element)\n\n if (existing) {\n existing.count += 1\n marked.push(element)\n continue\n }\n\n const foreign = element.hasAttribute('inert')\n records.set(element, {\n count: 1,\n foreign,\n ariaHidden: element.getAttribute('aria-hidden'),\n })\n marked.push(element)\n\n if (foreign) continue\n\n element.setAttribute('inert', '')\n // `inert` убирает поддерево из дерева доступности не во всех движках,\n // поэтому намерение дублируется явно.\n element.setAttribute('aria-hidden', 'true')\n }\n\n return () => {\n for (const element of marked) {\n const record = records.get(element)\n if (!record) continue\n\n record.count -= 1\n if (record.count > 0) continue\n\n records.delete(element)\n if (record.foreign) continue\n\n element.removeAttribute('inert')\n if (record.ariaHidden === null) element.removeAttribute('aria-hidden')\n else element.setAttribute('aria-hidden', record.ariaHidden)\n }\n }\n}\n\n/**\n * Что гасить, пока открыт модальный слой.\n *\n * Правило одно: **инертно всё, кроме ветки, в которой живёт оверлей**. Идём от\n * него вверх до `<body>` и на каждом уровне помечаем соседей. Наивное «все дети\n * `body`, кроме портала» сломалось бы на `portalTarget` внутри контейнера\n * приложения: `inert` наследуется вниз, и помеченный предок убил бы сам оверлей.\n *\n * Корни других оверлеев пропускаются (`data-gr-overlay-root`): тост обязан\n * оставаться видимым и озвученным поверх открытой модалки — ради этого он и\n * сидит на самом верхнем слое шкалы, — а панель селекта, открытая изнутри окна,\n * принадлежит тому же слою. Порядок между самими оверлеями решает стек слоёв\n * (`isTopmost`), а не этот модуль.\n *\n * По той же причине пропускается хост объявителя (`data-gr-live-region`):\n * `inert` выбрасывает поддерево из дерева доступности, и общий живой регион\n * замолчал бы ровно под открытым диалогом — там, где «сохранено» и «ошибка\n * сети» и нужны.\n */\nexport function inertableOutside(root: HTMLElement | null | undefined): HTMLElement[] {\n if (!root?.isConnected) return []\n\n const result: HTMLElement[] = []\n const body = root.ownerDocument.body\n\n let node: HTMLElement | null = root\n\n while (node && node !== body) {\n const parent: HTMLElement | null = node.parentElement\n if (!parent) break\n\n for (const sibling of Array.from(parent.children)) {\n if (!(sibling instanceof HTMLElement)) continue\n if (sibling === node) continue\n if (sibling.hasAttribute('data-gr-overlay-root')) continue\n if (sibling.hasAttribute('data-gr-portal')) continue\n if (sibling.hasAttribute('data-gr-live-region')) continue\n result.push(sibling)\n }\n\n node = parent\n }\n\n return result\n}\n"],"mappings":";AAuBA,IAAM,0BAAU,IAAI,QAAkC;;AAGtD,SAAgB,UAAU,UAAqC;CAC7D,MAAM,SAAwB,CAAC;CAE/B,KAAK,MAAM,WAAW,UAAU;EAC9B,MAAM,WAAW,QAAQ,IAAI,OAAO;EAEpC,IAAI,UAAU;GACZ,SAAS,SAAS;GAClB,OAAO,KAAK,OAAO;GACnB;EACF;EAEA,MAAM,UAAU,QAAQ,aAAa,OAAO;EAC5C,QAAQ,IAAI,SAAS;GACnB,OAAO;GACP;GACA,YAAY,QAAQ,aAAa,aAAa;EAChD,CAAC;EACD,OAAO,KAAK,OAAO;EAEnB,IAAI,SAAS;EAEb,QAAQ,aAAa,SAAS,EAAE;EAGhC,QAAQ,aAAa,eAAe,MAAM;CAC5C;CAEA,aAAa;EACX,KAAK,MAAM,WAAW,QAAQ;GAC5B,MAAM,SAAS,QAAQ,IAAI,OAAO;GAClC,IAAI,CAAC,QAAQ;GAEb,OAAO,SAAS;GAChB,IAAI,OAAO,QAAQ,GAAG;GAEtB,QAAQ,OAAO,OAAO;GACtB,IAAI,OAAO,SAAS;GAEpB,QAAQ,gBAAgB,OAAO;GAC/B,IAAI,OAAO,eAAe,MAAM,QAAQ,gBAAgB,aAAa;QAChE,QAAQ,aAAa,eAAe,OAAO,UAAU;EAC5D;CACF;AACF;;;;;;;;;;;;;;;;;;;;AAqBA,SAAgB,iBAAiB,MAAqD;CACpF,IAAI,CAAC,MAAM,aAAa,OAAO,CAAC;CAEhC,MAAM,SAAwB,CAAC;CAC/B,MAAM,OAAO,KAAK,cAAc;CAEhC,IAAI,OAA2B;CAE/B,OAAO,QAAQ,SAAS,MAAM;EAC5B,MAAM,SAA6B,KAAK;EACxC,IAAI,CAAC,QAAQ;EAEb,KAAK,MAAM,WAAW,MAAM,KAAK,OAAO,QAAQ,GAAG;GACjD,IAAI,EAAE,mBAAmB,cAAc;GACvC,IAAI,YAAY,MAAM;GACtB,IAAI,QAAQ,aAAa,sBAAsB,GAAG;GAClD,IAAI,QAAQ,aAAa,gBAAgB,GAAG;GAC5C,IAAI,QAAQ,aAAa,qBAAqB,GAAG;GACjD,OAAO,KAAK,OAAO;EACrB;EAEA,OAAO;CACT;CAEA,OAAO;AACT"}
1
+ {"version":3,"file":"inert-DIHCCn_1.js","names":[],"sources":["../../src/composables/internal/inert.ts"],"sourcesContent":["/**\n * `inert` для чужих поддеревьев.\n *\n * Визуального перекрытия мало: без `inert` таб уходит в форму, которую\n * пользователь уже не видит, а скринридер читает её как обычную. `inert`\n * снимает поддерево целиком — фокус, события указателя и дерево доступности.\n *\n * Два правила, из-за которых это отдельный модуль, а не пара строк на месте:\n *\n * - **чужой `inert` не снимаем.** Элемент мог быть инертен и до нас;\n * - **счётчик на элемент.** Два открытых оверлея пометят один и тот же фон, и\n * закрытие первого не должно возвращать его в таб-порядок под вторым.\n */\n\ninterface InertRecord {\n /** Сколько слоёв сейчас держат элемент инертным. */\n count: number\n /** Был ли `inert` до нас: такой не снимаем. */\n foreign: boolean\n /** Прежнее значение `aria-hidden` (или `null`, если атрибута не было). */\n ariaHidden: string | null\n}\n\nconst records = new WeakMap<HTMLElement, InertRecord>()\n\n/** Помечает элементы инертными и возвращает снятие пометки. */\nexport function markInert(elements: HTMLElement[]): () => void {\n const marked: HTMLElement[] = []\n\n for (const element of elements) {\n const existing = records.get(element)\n\n if (existing) {\n existing.count += 1\n marked.push(element)\n continue\n }\n\n const foreign = element.hasAttribute('inert')\n records.set(element, {\n count: 1,\n foreign,\n ariaHidden: element.getAttribute('aria-hidden'),\n })\n marked.push(element)\n\n if (foreign)\n continue\n\n element.setAttribute('inert', '')\n // `inert` убирает поддерево из дерева доступности не во всех движках,\n // поэтому намерение дублируется явно.\n element.setAttribute('aria-hidden', 'true')\n }\n\n return () => {\n for (const element of marked) {\n const record = records.get(element)\n if (!record)\n continue\n\n record.count -= 1\n if (record.count > 0)\n continue\n\n records.delete(element)\n if (record.foreign)\n continue\n\n element.removeAttribute('inert')\n if (record.ariaHidden === null)\n element.removeAttribute('aria-hidden')\n else element.setAttribute('aria-hidden', record.ariaHidden)\n }\n }\n}\n\n/**\n * Что гасить, пока открыт модальный слой.\n *\n * Правило одно: **инертно всё, кроме ветки, в которой живёт оверлей**. Идём от\n * него вверх до `<body>` и на каждом уровне помечаем соседей. Наивное «все дети\n * `body`, кроме портала» сломалось бы на `portalTarget` внутри контейнера\n * приложения: `inert` наследуется вниз, и помеченный предок убил бы сам оверлей.\n *\n * Корни других оверлеев пропускаются (`data-gr-overlay-root`): тост обязан\n * оставаться видимым и озвученным поверх открытой модалки — ради этого он и\n * сидит на самом верхнем слое шкалы, — а панель селекта, открытая изнутри окна,\n * принадлежит тому же слою. Порядок между самими оверлеями решает стек слоёв\n * (`isTopmost`), а не этот модуль.\n *\n * По той же причине пропускается хост объявителя (`data-gr-live-region`):\n * `inert` выбрасывает поддерево из дерева доступности, и общий живой регион\n * замолчал бы ровно под открытым диалогом — там, где «сохранено» и «ошибка\n * сети» и нужны.\n */\nexport function inertableOutside(root: HTMLElement | null | undefined): HTMLElement[] {\n if (!root?.isConnected)\n return []\n\n const result: HTMLElement[] = []\n const body = root.ownerDocument.body\n\n let node: HTMLElement | null = root\n\n while (node && node !== body) {\n const parent: HTMLElement | null = node.parentElement\n if (!parent)\n break\n\n for (const sibling of Array.from(parent.children)) {\n if (!(sibling instanceof HTMLElement))\n continue\n if (sibling === node)\n continue\n if (sibling.hasAttribute('data-gr-overlay-root'))\n continue\n if (sibling.hasAttribute('data-gr-portal'))\n continue\n if (sibling.hasAttribute('data-gr-live-region'))\n continue\n result.push(sibling)\n }\n\n node = parent\n }\n\n return result\n}\n"],"mappings":";AAuBA,IAAM,0BAAU,IAAI,QAAkC;;AAGtD,SAAgB,UAAU,UAAqC;CAC7D,MAAM,SAAwB,CAAC;CAE/B,KAAK,MAAM,WAAW,UAAU;EAC9B,MAAM,WAAW,QAAQ,IAAI,OAAO;EAEpC,IAAI,UAAU;GACZ,SAAS,SAAS;GAClB,OAAO,KAAK,OAAO;GACnB;EACF;EAEA,MAAM,UAAU,QAAQ,aAAa,OAAO;EAC5C,QAAQ,IAAI,SAAS;GACnB,OAAO;GACP;GACA,YAAY,QAAQ,aAAa,aAAa;EAChD,CAAC;EACD,OAAO,KAAK,OAAO;EAEnB,IAAI,SACF;EAEF,QAAQ,aAAa,SAAS,EAAE;EAGhC,QAAQ,aAAa,eAAe,MAAM;CAC5C;CAEA,aAAa;EACX,KAAK,MAAM,WAAW,QAAQ;GAC5B,MAAM,SAAS,QAAQ,IAAI,OAAO;GAClC,IAAI,CAAC,QACH;GAEF,OAAO,SAAS;GAChB,IAAI,OAAO,QAAQ,GACjB;GAEF,QAAQ,OAAO,OAAO;GACtB,IAAI,OAAO,SACT;GAEF,QAAQ,gBAAgB,OAAO;GAC/B,IAAI,OAAO,eAAe,MACxB,QAAQ,gBAAgB,aAAa;QAClC,QAAQ,aAAa,eAAe,OAAO,UAAU;EAC5D;CACF;AACF;;;;;;;;;;;;;;;;;;;;AAqBA,SAAgB,iBAAiB,MAAqD;CACpF,IAAI,CAAC,MAAM,aACT,OAAO,CAAC;CAEV,MAAM,SAAwB,CAAC;CAC/B,MAAM,OAAO,KAAK,cAAc;CAEhC,IAAI,OAA2B;CAE/B,OAAO,QAAQ,SAAS,MAAM;EAC5B,MAAM,SAA6B,KAAK;EACxC,IAAI,CAAC,QACH;EAEF,KAAK,MAAM,WAAW,MAAM,KAAK,OAAO,QAAQ,GAAG;GACjD,IAAI,EAAE,mBAAmB,cACvB;GACF,IAAI,YAAY,MACd;GACF,IAAI,QAAQ,aAAa,sBAAsB,GAC7C;GACF,IAAI,QAAQ,aAAa,gBAAgB,GACvC;GACF,IAAI,QAAQ,aAAa,qBAAqB,GAC5C;GACF,OAAO,KAAK,OAAO;EACrB;EAEA,OAAO;CACT;CAEA,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"keyboard-DE2yhz_b.js","names":[],"sources":["../../src/internal/keyboard.ts"],"sourcesContent":["/**\n * Общие примитивы разбора клавиатурных событий: IME-композиция и матчинг\n * клавиш, не зависящий от раскладки.\n *\n * Живут в `internal/`, а не рядом с потребителем: одно и то же нужно стеку\n * оверлеев (`composables/internal/overlayStack.ts`), директиве `v-hotkey` и\n * матчеру палитры (`components/shared/hotkey.ts`) — три слоя, у которых нет\n * общего предка ближе этого модуля.\n */\n\n/**\n * Событие пришло во время IME-композиции — обрабатывать его как команду нельзя:\n * Esc здесь отменяет композицию, Enter — коммитит её, стрелки ходят по\n * кандидатам. `keyCode === 229` — страховка для движков, которые не выставляют\n * `isComposing` (исторически WebKit/старый Chromium).\n */\nexport function isComposingEvent(event: KeyboardEvent): boolean {\n return event.isComposing || event.keyCode === 229\n}\n\n/**\n * Фокус на контроле, который сам распоряжается печатными клавишами.\n *\n * Нужен всем, кто вешает клавиатурные команды на контейнер: горячая клавиша и\n * typeahead меню обязаны молчать, пока пользователь печатает в поле внутри них.\n */\nexport function isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false\n if (target.isContentEditable) return true\n\n const tag = target.tagName\n return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT'\n}\n\n/**\n * macOS определяем по платформе: от неё зависит, чем является токен `mod` —\n * Cmd или Ctrl. Живёт здесь, а не рядом с одним потребителем: то же нужно\n * `GrKbd` (что показать), палитре (что слушать) и директиве `v-hotkey`.\n */\nexport function isAppleDevice(): boolean {\n if (typeof navigator === 'undefined') return false\n return /Mac|iPhone|iPad|iPod/.test(navigator.platform || navigator.userAgent)\n}\n\n/** Физический код клавиши для латинской буквы или цифры; иначе `null`. */\nexport function codeForChar(ch: string): string | null {\n if (/^[a-z]$/i.test(ch)) return `Key${ch.toUpperCase()}`\n if (/^\\d$/.test(ch)) return `Digit${ch}`\n return null\n}\n\nexport interface EventMatchesKeyOptions {\n /**\n * Дополнительно матчить по физическому коду (`event.code`), когда `event.key`\n * не совпал. Нужен комбинациям с модификаторами: на нелатинской раскладке\n * Ctrl/Cmd+K приходит как `key: 'л'`, и без кода сочетание мертво. Для\n * одиночных клавиш без модификаторов фолбэк не включается — там семантика\n * печатная, а не позиционная.\n */\n codeFallback?: boolean\n}\n\n/** Совпадает ли нажатая клавиша с ожидаемой (`'k'`, `'Escape'`, `' '`). */\nexport function eventMatchesKey(\n event: KeyboardEvent,\n expected: string,\n options: EventMatchesKeyOptions = {},\n): boolean {\n if (expected === ' ') return event.key === ' ' || event.key === 'Spacebar'\n\n if (expected.length === 1) {\n if (event.key.toLowerCase() === expected.toLowerCase()) return true\n return Boolean(options.codeFallback) && codeForChar(expected) === event.code\n }\n\n return event.key === expected\n}\n\n/**\n * Удовлетворяет ли состояние Shift ожиданиям комбинации.\n *\n * Объявленный `shift` требует нажатого Shift. Необъявленный — запрещает его\n * с одним исключением: символ, который без Shift не набрать (`?`, `+`, `:`),\n * легален вместе с ним, когда `event.key` уже равен ожидаемому символу.\n * Буквы под исключение не попадают: `'a'` и Shift+A — разные намерения.\n */\nexport function shiftSatisfied(event: KeyboardEvent, expectedKey: string, expectShift: boolean): boolean {\n if (expectShift) return event.shiftKey\n if (!event.shiftKey) return true\n\n return expectedKey.length === 1 && !/\\p{L}/u.test(expectedKey) && event.key === expectedKey\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAgBA,SAAgB,iBAAiB,OAA+B;CAC9D,OAAO,MAAM,eAAe,MAAM,YAAY;AAChD;;;;;;;AAQA,SAAgB,iBAAiB,QAAqC;CACpE,IAAI,EAAE,kBAAkB,cAAc,OAAO;CAC7C,IAAI,OAAO,mBAAmB,OAAO;CAErC,MAAM,MAAM,OAAO;CACnB,OAAO,QAAQ,WAAW,QAAQ,cAAc,QAAQ;AAC1D;;;;;;AAOA,SAAgB,gBAAyB;CACvC,IAAI,OAAO,cAAc,aAAa,OAAO;CAC7C,OAAO,uBAAuB,KAAK,UAAU,YAAY,UAAU,SAAS;AAC9E;;AAGA,SAAgB,YAAY,IAA2B;CACrD,IAAI,WAAW,KAAK,EAAE,GAAG,OAAO,MAAM,GAAG,YAAY;CACrD,IAAI,OAAO,KAAK,EAAE,GAAG,OAAO,QAAQ;CACpC,OAAO;AACT;;AAcA,SAAgB,gBACd,OACA,UACA,UAAkC,CAAC,GAC1B;CACT,IAAI,aAAa,KAAK,OAAO,MAAM,QAAQ,OAAO,MAAM,QAAQ;CAEhE,IAAI,SAAS,WAAW,GAAG;EACzB,IAAI,MAAM,IAAI,YAAY,MAAM,SAAS,YAAY,GAAG,OAAO;EAC/D,OAAO,QAAQ,QAAQ,YAAY,KAAK,YAAY,QAAQ,MAAM,MAAM;CAC1E;CAEA,OAAO,MAAM,QAAQ;AACvB;;;;;;;;;AAUA,SAAgB,eAAe,OAAsB,aAAqB,aAA+B;CACvG,IAAI,aAAa,OAAO,MAAM;CAC9B,IAAI,CAAC,MAAM,UAAU,OAAO;CAE5B,OAAO,YAAY,WAAW,KAAK,CAAC,SAAS,KAAK,WAAW,KAAK,MAAM,QAAQ;AAClF"}
1
+ {"version":3,"file":"keyboard-DE2yhz_b.js","names":[],"sources":["../../src/internal/keyboard.ts"],"sourcesContent":["/**\n * Общие примитивы разбора клавиатурных событий: IME-композиция и матчинг\n * клавиш, не зависящий от раскладки.\n *\n * Живут в `internal/`, а не рядом с потребителем: одно и то же нужно стеку\n * оверлеев (`composables/internal/overlayStack.ts`), директиве `v-hotkey` и\n * матчеру палитры (`components/shared/hotkey.ts`) — три слоя, у которых нет\n * общего предка ближе этого модуля.\n */\n\n/**\n * Событие пришло во время IME-композиции — обрабатывать его как команду нельзя:\n * Esc здесь отменяет композицию, Enter — коммитит её, стрелки ходят по\n * кандидатам. `keyCode === 229` — страховка для движков, которые не выставляют\n * `isComposing` (исторически WebKit/старый Chromium).\n */\nexport function isComposingEvent(event: KeyboardEvent): boolean {\n return event.isComposing || event.keyCode === 229\n}\n\n/**\n * Фокус на контроле, который сам распоряжается печатными клавишами.\n *\n * Нужен всем, кто вешает клавиатурные команды на контейнер: горячая клавиша и\n * typeahead меню обязаны молчать, пока пользователь печатает в поле внутри них.\n */\nexport function isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement))\n return false\n if (target.isContentEditable)\n return true\n\n const tag = target.tagName\n return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT'\n}\n\n/**\n * macOS определяем по платформе: от неё зависит, чем является токен `mod` —\n * Cmd или Ctrl. Живёт здесь, а не рядом с одним потребителем: то же нужно\n * `GrKbd` (что показать), палитре (что слушать) и директиве `v-hotkey`.\n */\nexport function isAppleDevice(): boolean {\n if (typeof navigator === 'undefined')\n return false\n return /Mac|iPhone|iPad|iPod/.test(navigator.platform || navigator.userAgent)\n}\n\n/** Физический код клавиши для латинской буквы или цифры; иначе `null`. */\nexport function codeForChar(ch: string): string | null {\n if (/^[a-z]$/i.test(ch))\n return `Key${ch.toUpperCase()}`\n if (/^\\d$/.test(ch))\n return `Digit${ch}`\n return null\n}\n\nexport interface EventMatchesKeyOptions {\n /**\n * Дополнительно матчить по физическому коду (`event.code`), когда `event.key`\n * не совпал. Нужен комбинациям с модификаторами: на нелатинской раскладке\n * Ctrl/Cmd+K приходит как `key: 'л'`, и без кода сочетание мертво. Для\n * одиночных клавиш без модификаторов фолбэк не включается — там семантика\n * печатная, а не позиционная.\n */\n codeFallback?: boolean\n}\n\n/** Совпадает ли нажатая клавиша с ожидаемой (`'k'`, `'Escape'`, `' '`). */\nexport function eventMatchesKey(\n event: KeyboardEvent,\n expected: string,\n options: EventMatchesKeyOptions = {},\n): boolean {\n if (expected === ' ')\n return event.key === ' ' || event.key === 'Spacebar'\n\n if (expected.length === 1) {\n if (event.key.toLowerCase() === expected.toLowerCase())\n return true\n return Boolean(options.codeFallback) && codeForChar(expected) === event.code\n }\n\n return event.key === expected\n}\n\n/**\n * Удовлетворяет ли состояние Shift ожиданиям комбинации.\n *\n * Объявленный `shift` требует нажатого Shift. Необъявленный — запрещает его\n * с одним исключением: символ, который без Shift не набрать (`?`, `+`, `:`),\n * легален вместе с ним, когда `event.key` уже равен ожидаемому символу.\n * Буквы под исключение не попадают: `'a'` и Shift+A — разные намерения.\n */\nexport function shiftSatisfied(event: KeyboardEvent, expectedKey: string, expectShift: boolean): boolean {\n if (expectShift)\n return event.shiftKey\n if (!event.shiftKey)\n return true\n\n return expectedKey.length === 1 && !/\\p{L}/u.test(expectedKey) && event.key === expectedKey\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAgBA,SAAgB,iBAAiB,OAA+B;CAC9D,OAAO,MAAM,eAAe,MAAM,YAAY;AAChD;;;;;;;AAQA,SAAgB,iBAAiB,QAAqC;CACpE,IAAI,EAAE,kBAAkB,cACtB,OAAO;CACT,IAAI,OAAO,mBACT,OAAO;CAET,MAAM,MAAM,OAAO;CACnB,OAAO,QAAQ,WAAW,QAAQ,cAAc,QAAQ;AAC1D;;;;;;AAOA,SAAgB,gBAAyB;CACvC,IAAI,OAAO,cAAc,aACvB,OAAO;CACT,OAAO,uBAAuB,KAAK,UAAU,YAAY,UAAU,SAAS;AAC9E;;AAGA,SAAgB,YAAY,IAA2B;CACrD,IAAI,WAAW,KAAK,EAAE,GACpB,OAAO,MAAM,GAAG,YAAY;CAC9B,IAAI,OAAO,KAAK,EAAE,GAChB,OAAO,QAAQ;CACjB,OAAO;AACT;;AAcA,SAAgB,gBACd,OACA,UACA,UAAkC,CAAC,GAC1B;CACT,IAAI,aAAa,KACf,OAAO,MAAM,QAAQ,OAAO,MAAM,QAAQ;CAE5C,IAAI,SAAS,WAAW,GAAG;EACzB,IAAI,MAAM,IAAI,YAAY,MAAM,SAAS,YAAY,GACnD,OAAO;EACT,OAAO,QAAQ,QAAQ,YAAY,KAAK,YAAY,QAAQ,MAAM,MAAM;CAC1E;CAEA,OAAO,MAAM,QAAQ;AACvB;;;;;;;;;AAUA,SAAgB,eAAe,OAAsB,aAAqB,aAA+B;CACvG,IAAI,aACF,OAAO,MAAM;CACf,IAAI,CAAC,MAAM,UACT,OAAO;CAET,OAAO,YAAY,WAAW,KAAK,CAAC,SAAS,KAAK,WAAW,KAAK,MAAM,QAAQ;AAClF"}