@feugene/granularity 0.18.0 → 0.19.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 (199) hide show
  1. package/dist/chunks/chevron-left-D8AUBAM7.js +23 -0
  2. package/dist/chunks/chevron-left-D8AUBAM7.js.map +1 -0
  3. package/dist/chunks/{chevron-right-BfqMVpbB.js → chevron-right-C6Z01h0X.js} +1 -22
  4. package/dist/chunks/chevron-right-C6Z01h0X.js.map +1 -0
  5. package/dist/chunks/config-8Pcutu1j2.js.map +1 -0
  6. package/dist/chunks/{config-K0C2tcLB.js → config-9PYRZlKE.js} +1 -1
  7. package/dist/chunks/{config-K0C2tcLB.js.map → config-9PYRZlKE.js.map} +1 -1
  8. package/dist/chunks/{config-DEvsMTQE.js → config-BJ7Bv_G2.js} +1 -3
  9. package/dist/chunks/config-BJ7Bv_G2.js.map +1 -0
  10. package/dist/chunks/config-BKvX0q102.js.map +1 -0
  11. package/dist/chunks/{config-gvq_hWNM.js → config-Be9k9bOf.js} +1 -7
  12. package/dist/chunks/config-Be9k9bOf.js.map +1 -0
  13. package/dist/chunks/{config-DpqOnJiz2.js → config-CDat1wXf2.js} +1 -1
  14. package/dist/chunks/config-CDat1wXf2.js.map +1 -0
  15. package/dist/chunks/config-CY0_6cMi2.js.map +1 -0
  16. package/dist/chunks/config-D94Z9po52.js.map +1 -0
  17. package/dist/chunks/{config-D2aNP7Es.js → config-DAX8Deh1.js} +1 -3
  18. package/dist/chunks/config-DAX8Deh1.js.map +1 -0
  19. package/dist/chunks/config-DCFvmHEv.js.map +1 -0
  20. package/dist/chunks/config-DKdlqXiY.js.map +1 -1
  21. package/dist/chunks/config-Rw9OyW702.js.map +1 -0
  22. package/dist/chunks/generated-BRkbhyxk.js +3270 -0
  23. package/dist/chunks/generated-BRkbhyxk.js.map +1 -0
  24. package/dist/chunks/{granular-provider-B9nXQCMu.js → granular-provider-C6uAujdJ.js} +12 -12
  25. package/dist/chunks/{granular-provider-B9nXQCMu.js.map → granular-provider-C6uAujdJ.js.map} +1 -1
  26. package/dist/chunks/grip-vertical-lRha2S7q.js +16 -0
  27. package/dist/chunks/grip-vertical-lRha2S7q.js.map +1 -0
  28. package/dist/chunks/icon-Dag2tIMs.js +21 -0
  29. package/dist/chunks/icon-Dag2tIMs.js.map +1 -0
  30. package/dist/chunks/{portalRoot-CWD4zHBm.js → portalRoot-CVhCgdG6.js} +10 -1
  31. package/dist/chunks/{portalRoot-CWD4zHBm.js.map → portalRoot-CVhCgdG6.js.map} +1 -1
  32. package/dist/chunks/{useModalOverlay-BTq-0ImG.js → useModalOverlay-DrQVYwwA.js} +1 -1
  33. package/dist/chunks/{useModalOverlay-BTq-0ImG.js.map → useModalOverlay-DrQVYwwA.js.map} +1 -1
  34. package/dist/chunks/{usePortalTarget-RyzEgNTb.js → usePortalTarget-Cn-Wiz5d.js} +1 -1
  35. package/dist/chunks/{usePortalTarget-RyzEgNTb.js.map → usePortalTarget-Cn-Wiz5d.js.map} +1 -1
  36. package/dist/components/GrAutocomplete/chunks/{GrAutocomplete-CPEQxmLZ.js → GrAutocomplete-gY4Xopza.js} +32 -24
  37. package/dist/components/GrAutocomplete/chunks/GrAutocomplete-gY4Xopza.js.map +1 -0
  38. package/dist/components/GrAutocomplete/index.js +1 -1
  39. package/dist/components/GrAutocomplete/styles.css +1 -1
  40. package/dist/components/GrBreadcrumbs/chunks/{GrBreadcrumbs-BCNGDS6k.js → GrBreadcrumbs-DS_-PBVt.js} +8 -7
  41. package/dist/components/GrBreadcrumbs/chunks/GrBreadcrumbs-DS_-PBVt.js.map +1 -0
  42. package/dist/components/GrBreadcrumbs/index.js +1 -1
  43. package/dist/components/GrCollapse/chunks/{GrCollapse-B2Fc6A9r.js.map → GrCollapse-Kk0DE8tb.js.map} +1 -1
  44. package/dist/components/GrCollapse/index.js +1 -1
  45. package/dist/components/GrColorPicker/chunks/{GrColorPicker-DAdQ-Gc3.js → GrColorPicker-CkBTzkqn.js} +1 -1
  46. package/dist/components/GrColorPicker/chunks/{GrColorPicker-DAdQ-Gc3.js.map → GrColorPicker-CkBTzkqn.js.map} +1 -1
  47. package/dist/components/GrColorPicker/index.js +1 -1
  48. package/dist/components/GrCommandPalette/chunks/{GrCommandPalette-DMeSqkEv.js → GrCommandPalette-BugTlGdj.js} +37 -11
  49. package/dist/components/GrCommandPalette/chunks/GrCommandPalette-BugTlGdj.js.map +1 -0
  50. package/dist/components/GrCommandPalette/index.js +2 -2
  51. package/dist/components/GrCommandPalette/styles.css +1 -1
  52. package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-hUTi-GdJ.js → GrConfirmDialog-Ds5T0GiR.js} +1 -1
  53. package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-hUTi-GdJ.js.map → GrConfirmDialog-Ds5T0GiR.js.map} +1 -1
  54. package/dist/components/GrConfirmDialog/index.js +1 -1
  55. package/dist/components/GrDataTable/chunks/{GrDataTable-DzaGLG3A.js → GrDataTable-CYe2A2WA.js} +9 -7
  56. package/dist/components/GrDataTable/chunks/GrDataTable-CYe2A2WA.js.map +1 -0
  57. package/dist/components/GrDataTable/index.js +2 -2
  58. package/dist/components/GrDialog/chunks/{GrDialog-MD9Fzy9C.js → GrDialog-C3tYaA8v.js} +1 -1
  59. package/dist/components/GrDialog/chunks/{GrDialog-MD9Fzy9C.js.map → GrDialog-C3tYaA8v.js.map} +1 -1
  60. package/dist/components/GrDialog/index.js +1 -1
  61. package/dist/components/GrDialogService/chunks/{GrDialogService-DtgUijMj.js → GrDialogService-CTBiiJDI.js} +3 -3
  62. package/dist/components/GrDialogService/chunks/{GrDialogService-DtgUijMj.js.map → GrDialogService-CTBiiJDI.js.map} +1 -1
  63. package/dist/components/GrDialogService/index.js +1 -1
  64. package/dist/components/GrDivider/chunks/{GrDivider-B2Xwc_QO.js → GrDivider-xxq1_fIl.js} +1 -1
  65. package/dist/components/GrDivider/chunks/{GrDivider-B2Xwc_QO.js.map → GrDivider-xxq1_fIl.js.map} +1 -1
  66. package/dist/components/GrDivider/index.js +2 -2
  67. package/dist/components/GrDrawer/chunks/{GrDrawer-DWHdZZzW.js → GrDrawer-BSSuiNHU.js} +2 -2
  68. package/dist/components/GrDrawer/chunks/{GrDrawer-DWHdZZzW.js.map → GrDrawer-BSSuiNHU.js.map} +1 -1
  69. package/dist/components/GrDrawer/index.js +2 -2
  70. package/dist/components/GrDropdown/chunks/{GrDropdown-0tJK01Kq.js → GrDropdown-Bh6UK2M5.js} +1 -1
  71. package/dist/components/GrDropdown/chunks/{GrDropdown-0tJK01Kq.js.map → GrDropdown-Bh6UK2M5.js.map} +1 -1
  72. package/dist/components/GrDropdown/index.js +1 -1
  73. package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-VPPrpCoA.js → GrDropdownMenu-LyfEFUbg.js} +2 -2
  74. package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-VPPrpCoA.js.map → GrDropdownMenu-LyfEFUbg.js.map} +1 -1
  75. package/dist/components/GrDropdownMenu/index.js +2 -2
  76. package/dist/components/GrImageViewer/chunks/{GrImageViewer-DE7MBbF8.js → GrImageViewer-DfD4euH5.js} +3 -2
  77. package/dist/components/GrImageViewer/chunks/{GrImageViewer-DE7MBbF8.js.map → GrImageViewer-DfD4euH5.js.map} +1 -1
  78. package/dist/components/GrImageViewer/index.js +1 -1
  79. package/dist/components/GrModal/chunks/{GrModal-BbhcsDQ8.js → GrModal-CbMMr6W1.js} +1 -1
  80. package/dist/components/GrModal/chunks/{GrModal-BbhcsDQ8.js.map → GrModal-CbMMr6W1.js.map} +1 -1
  81. package/dist/components/GrModal/index.js +1 -1
  82. package/dist/components/GrNumberInput/chunks/{GrNumberInput-CZOyPz4J.js → GrNumberInput-B5CHZDBj.js} +2 -1
  83. package/dist/components/GrNumberInput/chunks/{GrNumberInput-CZOyPz4J.js.map → GrNumberInput-B5CHZDBj.js.map} +1 -1
  84. package/dist/components/GrNumberInput/index.js +1 -1
  85. package/dist/components/GrPagination/chunks/{GrPagination-waKhxBP7.js → GrPagination-BM4FrD6Q.js} +1 -1
  86. package/dist/components/GrPagination/chunks/{GrPagination-waKhxBP7.js.map → GrPagination-BM4FrD6Q.js.map} +1 -1
  87. package/dist/components/GrPagination/index.js +1 -1
  88. package/dist/components/GrPopover/chunks/{GrPopover-DuqeoFaI.js → GrPopover-DMH4Jjst.js} +1 -1
  89. package/dist/components/GrPopover/chunks/{GrPopover-DuqeoFaI.js.map → GrPopover-DMH4Jjst.js.map} +1 -1
  90. package/dist/components/GrPopover/index.js +1 -1
  91. package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-JVVqBsPY.js → GrPromptDialog-Pwr9NPxK.js} +1 -1
  92. package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-JVVqBsPY.js.map → GrPromptDialog-Pwr9NPxK.js.map} +1 -1
  93. package/dist/components/GrPromptDialog/index.js +1 -1
  94. package/dist/components/GrRating/chunks/{GrRating-LarIiwJL.js → GrRating-DVFH3lYu.js} +8 -7
  95. package/dist/components/GrRating/chunks/GrRating-DVFH3lYu.js.map +1 -0
  96. package/dist/components/GrRating/index.js +1 -1
  97. package/dist/components/GrSelect/chunks/{GrSelect-DAdu044K.js → GrSelect-B-Voni7D.js} +65 -52
  98. package/dist/components/GrSelect/chunks/GrSelect-B-Voni7D.js.map +1 -0
  99. package/dist/components/GrSelect/index.js +1 -1
  100. package/dist/components/GrSelect/styles.css +1 -1
  101. package/dist/components/GrSidebar/chunks/{GrSidebar-DRGnnViw.js → GrSidebar-i7AxjhY_.js} +3 -2
  102. package/dist/components/GrSidebar/chunks/{GrSidebar-DRGnnViw.js.map → GrSidebar-i7AxjhY_.js.map} +1 -1
  103. package/dist/components/GrSidebar/index.js +2 -2
  104. package/dist/components/GrSkeleton/index.js +1 -1
  105. package/dist/components/GrSortableList/chunks/{GrSortableList-BefVfWKh.js → GrSortableList-XB7mXM1W.js} +6 -5
  106. package/dist/components/GrSortableList/chunks/GrSortableList-XB7mXM1W.js.map +1 -0
  107. package/dist/components/GrSortableList/index.js +2 -2
  108. package/dist/components/GrStatistic/chunks/{GrStatistic-J4qLs3TH.js → GrStatistic-DOsM6s5V.js} +54 -7
  109. package/dist/components/GrStatistic/chunks/GrStatistic-DOsM6s5V.js.map +1 -0
  110. package/dist/components/GrStatistic/index.js +2 -2
  111. package/dist/components/GrTabs/chunks/{GrTabs-TeXaU5Uh.js → GrTabs-f3-oQenu.js} +5 -4
  112. package/dist/components/GrTabs/chunks/GrTabs-f3-oQenu.js.map +1 -0
  113. package/dist/components/GrTabs/index.js +1 -1
  114. package/dist/components/GrToaster/chunks/{GrToaster-Ct-39hga.js → GrToaster-Dqja0Lf9.js} +1 -1
  115. package/dist/components/GrToaster/chunks/{GrToaster-Ct-39hga.js.map → GrToaster-Dqja0Lf9.js.map} +1 -1
  116. package/dist/components/GrToaster/index.js +1 -1
  117. package/dist/components/GrTooltip/chunks/{GrTooltip-xAcqs0bP.js → GrTooltip-Cn08heWz.js} +1 -1
  118. package/dist/components/GrTooltip/chunks/{GrTooltip-xAcqs0bP.js.map → GrTooltip-Cn08heWz.js.map} +1 -1
  119. package/dist/components/GrTooltip/index.js +1 -1
  120. package/dist/components/GrTree/chunks/{GrTree-CaYK8dGZ.js → GrTree-BR9a2pay.js} +25 -20
  121. package/dist/components/GrTree/chunks/GrTree-BR9a2pay.js.map +1 -0
  122. package/dist/components/GrTree/index.js +2 -2
  123. package/dist/components/GrTree/styles.css +1 -1
  124. package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-DZp7CqqW.js → GrTreeSelect--muUeB0v.js} +27 -13
  125. package/dist/components/GrTreeSelect/chunks/GrTreeSelect--muUeB0v.js.map +1 -0
  126. package/dist/components/GrTreeSelect/index.js +2 -2
  127. package/dist/composables/useAnnouncer.js +1 -1
  128. package/dist/composables/usePortalTarget.js +1 -1
  129. package/dist/directives/loading.js +1 -1
  130. package/dist/granular-provider-node.js +1 -1
  131. package/dist/granular-provider.js +1 -1
  132. package/dist/index.js +41 -41
  133. package/dist/styles/themes/dark.css +6 -1
  134. package/dist/testing.js +199 -0
  135. package/dist/testing.js.map +1 -0
  136. package/dist/theme-apply.js +33 -0
  137. package/dist/theme-apply.js.map +1 -0
  138. package/dist/theme.js +501 -0
  139. package/dist/theme.js.map +1 -0
  140. package/dist/tokens.js +1 -3215
  141. package/dist/types/src/components/GrBreadcrumbs/grBreadcrumbsStyles.d.ts +5 -2
  142. package/dist/types/src/components/GrCommandPalette/GrCommandPalette.vue.d.ts +6 -6
  143. package/dist/types/src/components/GrCommandPalette/filtering.d.ts +6 -2
  144. package/dist/types/src/components/GrDataTable/grDataTableStyles.d.ts +0 -1
  145. package/dist/types/src/components/GrRating/GrRating.vue.d.ts +9 -4
  146. package/dist/types/src/components/GrSortableList/grSortableListStyles.d.ts +0 -1
  147. package/dist/types/src/components/GrStatistic/GrStatistic.vue.d.ts +12 -9
  148. package/dist/types/src/components/GrStatistic/grStatisticStyles.d.ts +0 -1
  149. package/dist/types/src/components/GrTabs/GrTabs.vue.d.ts +6 -2
  150. package/dist/types/src/components/GrTree/grTreeProps.d.ts +11 -4
  151. package/dist/types/src/components/GrTree/safelist.d.ts +1 -1
  152. package/dist/types/src/components/shared/icon.d.ts +13 -0
  153. package/dist/types/src/testing/announcer.d.ts +10 -0
  154. package/dist/types/src/testing/context.d.ts +36 -0
  155. package/dist/types/src/testing/env.d.ts +25 -0
  156. package/dist/types/src/testing/geometry.d.ts +23 -0
  157. package/dist/types/src/testing/index.d.ts +12 -0
  158. package/dist/types/src/testing/pointer.d.ts +31 -0
  159. package/dist/types/src/theme/apply.d.ts +27 -0
  160. package/dist/types/src/theme/color.d.ts +35 -0
  161. package/dist/types/src/theme/extendTheme.d.ts +63 -0
  162. package/dist/types/src/theme/index.d.ts +22 -0
  163. package/dist/types/src/theme/roles.d.ts +16 -0
  164. package/dist/types/src/theme/tone.d.ts +32 -0
  165. package/dist/types/src/theme/validate.d.ts +16 -0
  166. package/dist/types/src/tokens/types.d.ts +8 -0
  167. package/dist/web-types.json +14 -11
  168. package/package.json +17 -2
  169. package/tokens/themes/dark.json +2 -1
  170. package/dist/chunks/chevron-right-BfqMVpbB.js.map +0 -1
  171. package/dist/chunks/config-8Pcutu1j.js.map +0 -1
  172. package/dist/chunks/config-BKvX0q10.js.map +0 -1
  173. package/dist/chunks/config-CY0_6cMi.js.map +0 -1
  174. package/dist/chunks/config-D2aNP7Es.js.map +0 -1
  175. package/dist/chunks/config-D94Z9po5.js.map +0 -1
  176. package/dist/chunks/config-DCFvmHEv2.js.map +0 -1
  177. package/dist/chunks/config-DEvsMTQE.js.map +0 -1
  178. package/dist/chunks/config-DpqOnJiz2.js.map +0 -1
  179. package/dist/chunks/config-Rw9OyW70.js.map +0 -1
  180. package/dist/chunks/config-gvq_hWNM.js.map +0 -1
  181. package/dist/components/GrAutocomplete/chunks/GrAutocomplete-CPEQxmLZ.js.map +0 -1
  182. package/dist/components/GrBreadcrumbs/chunks/GrBreadcrumbs-BCNGDS6k.js.map +0 -1
  183. package/dist/components/GrCommandPalette/chunks/GrCommandPalette-DMeSqkEv.js.map +0 -1
  184. package/dist/components/GrDataTable/chunks/GrDataTable-DzaGLG3A.js.map +0 -1
  185. package/dist/components/GrRating/chunks/GrRating-LarIiwJL.js.map +0 -1
  186. package/dist/components/GrSelect/chunks/GrSelect-DAdu044K.js.map +0 -1
  187. package/dist/components/GrSortableList/chunks/GrSortableList-BefVfWKh.js.map +0 -1
  188. package/dist/components/GrStatistic/chunks/GrStatistic-J4qLs3TH.js.map +0 -1
  189. package/dist/components/GrTabs/chunks/GrTabs-TeXaU5Uh.js.map +0 -1
  190. package/dist/components/GrTree/chunks/GrTree-CaYK8dGZ.js.map +0 -1
  191. package/dist/components/GrTreeSelect/chunks/GrTreeSelect-DZp7CqqW.js.map +0 -1
  192. package/dist/tokens.js.map +0 -1
  193. package/dist/chunks/{config-8Pcutu1j.js → config-8Pcutu1j2.js} +0 -0
  194. package/dist/chunks/{config-BKvX0q10.js → config-BKvX0q102.js} +0 -0
  195. package/dist/chunks/{config-CY0_6cMi.js → config-CY0_6cMi2.js} +0 -0
  196. package/dist/chunks/{config-D94Z9po5.js → config-D94Z9po52.js} +0 -0
  197. package/dist/chunks/{config-DCFvmHEv2.js → config-DCFvmHEv.js} +0 -0
  198. package/dist/chunks/{config-Rw9OyW70.js → config-Rw9OyW702.js} +0 -0
  199. package/dist/components/GrCollapse/chunks/{GrCollapse-B2Fc6A9r.js → GrCollapse-Kk0DE8tb.js} +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://raw.githubusercontent.com/JetBrains/web-types/master/schema/web-types.json",
3
3
  "name": "@feugene/granularity",
4
- "version": "0.18.0",
4
+ "version": "0.19.0",
5
5
  "framework": "vue",
6
6
  "js-types-syntax": "typescript",
7
7
  "description-markup": "markdown",
@@ -7024,11 +7024,11 @@
7024
7024
  },
7025
7025
  {
7026
7026
  "name": "icon",
7027
- "description": "UnoCSS-класс иконки вместо встроенной звезды (например `i-lucide-heart`).",
7027
+ "description": "Символ вместо встроенной звезды: Vue-компонент либо класс иконки вашей UnoCSS-сборки (`'i-lucide-heart'` — тогда нужен ваш `presetIcons`, см. `docs/installation.md`).",
7028
7028
  "default": "undefined",
7029
7029
  "value": {
7030
7030
  "kind": "expression",
7031
- "type": "string | undefined"
7031
+ "type": "string | Component | undefined"
7032
7032
  }
7033
7033
  },
7034
7034
  {
@@ -8554,11 +8554,11 @@
8554
8554
  },
8555
8555
  {
8556
8556
  "name": "icon",
8557
- "description": "UnoCSS-класс иконки слева от блока (например `i-lucide-users`).",
8557
+ "description": "Иконка слева от блока: Vue-компонент либо класс иконки вашей UnoCSS-сборки (`'i-lucide-users'` — тогда нужен ваш `presetIcons`, см. `docs/installation.md`).",
8558
8558
  "default": "undefined",
8559
8559
  "value": {
8560
8560
  "kind": "expression",
8561
- "type": "string | undefined"
8561
+ "type": "string | Component | undefined"
8562
8562
  }
8563
8563
  },
8564
8564
  {
@@ -9852,18 +9852,20 @@
9852
9852
  },
9853
9853
  {
9854
9854
  "name": "expandIcon",
9855
- "default": "\"i-lucide-chevron-right\"",
9855
+ "description": "Иконка свёрнутого узла: Vue-компонент либо класс иконки вашей UnoCSS-сборки (`'i-lucide-plus'` — тогда нужен ваш `presetIcons`, см. `docs/installation.md`). Не задана — встроенная стрелка.",
9856
+ "default": "undefined",
9856
9857
  "value": {
9857
9858
  "kind": "expression",
9858
- "type": "string | undefined"
9859
+ "type": "string | Component | undefined"
9859
9860
  }
9860
9861
  },
9861
9862
  {
9862
9863
  "name": "collapseIcon",
9863
- "default": "\"i-lucide-chevron-right\"",
9864
+ "description": "Иконка раскрытого узла. Не задана — та же встроенная стрелка, повёрнутая.",
9865
+ "default": "undefined",
9864
9866
  "value": {
9865
9867
  "kind": "expression",
9866
- "type": "string | undefined"
9868
+ "type": "string | Component | undefined"
9867
9869
  }
9868
9870
  },
9869
9871
  {
@@ -10036,10 +10038,11 @@
10036
10038
  },
10037
10039
  {
10038
10040
  "name": "dragHandleIcon",
10039
- "default": "\"i-lucide-grip-vertical\"",
10041
+ "description": "Иконка ручки переноса: компонент, класс иконки или ничего — тогда встроенная.",
10042
+ "default": "undefined",
10040
10043
  "value": {
10041
10044
  "kind": "expression",
10042
- "type": "string | undefined"
10045
+ "type": "string | Component | undefined"
10043
10046
  }
10044
10047
  },
10045
10048
  {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@feugene/granularity",
3
3
  "description": "Granularity design system package with Vue 3 components, consumed via the `@feugene/unocss-preset-granular` preset.",
4
- "version": "0.18.0",
4
+ "version": "0.19.0",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "author": {
7
7
  "name": "Evgeniy Fureev",
@@ -447,6 +447,21 @@
447
447
  "import": "./dist/tokens.js",
448
448
  "default": "./dist/tokens.js"
449
449
  },
450
+ "./testing": {
451
+ "types": "./dist/types/src/testing/index.d.ts",
452
+ "import": "./dist/testing.js",
453
+ "default": "./dist/testing.js"
454
+ },
455
+ "./theme": {
456
+ "types": "./dist/types/src/theme/index.d.ts",
457
+ "import": "./dist/theme.js",
458
+ "default": "./dist/theme.js"
459
+ },
460
+ "./theme/apply": {
461
+ "types": "./dist/types/src/theme/apply.d.ts",
462
+ "import": "./dist/theme-apply.js",
463
+ "default": "./dist/theme-apply.js"
464
+ },
450
465
  "./tokens/*.json": "./tokens/*.json"
451
466
  },
452
467
  "peerDependencies": {
@@ -492,7 +507,7 @@
492
507
  "dev": "vite build --watch",
493
508
  "doctor": "granular doctor ./granular.options.mjs --strict",
494
509
  "generate:registry": "node scripts/generate-registry.mjs",
495
- "generate:tokens": "node scripts/generate-tokens.mjs",
510
+ "generate:tokens": "node --experimental-strip-types scripts/generate-tokens.mjs",
496
511
  "lint": "eslint . --cache",
497
512
  "lint:fix": "eslint . --cache --fix",
498
513
  "test": "vitest --config vitest.config.ts",
@@ -465,7 +465,8 @@
465
465
  },
466
466
  {
467
467
  "name": "--gr-sidebar-primary",
468
- "value": "#6366f1",
468
+ "note": "Белый текст на #6366f1 даёт 4.47:1 — тот же недолёт AA, из-за которого\nперекрашен `--gr-primary` (заметка выше). Здесь взят минимальный шаг, снимающий\nнедолёт без смены вида: 4.52:1 при ΔE 0.42 к прежнему цвету.",
469
+ "value": "#6365f0",
469
470
  "description": "Акцентный цвет активных/ключевых элементов внутри sidebar."
470
471
  },
471
472
  {
@@ -1 +0,0 @@
1
- {"version":3,"file":"chevron-right-BfqMVpbB.js","names":[],"sources":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-8Pcutu1j.js","names":[],"sources":["../../src/components/GrSkeleton/config.ts"],"sourcesContent":["import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nexport const grSkeletonConfig = defineGranularComponent(import.meta.url, {\n name: 'GrSkeleton',\n})\n"],"mappings":";;AAEA,IAAa,mBAAmB,wBAAwB,OAAO,KAAK,KAAK,EACvE,MAAM,aACR,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-BKvX0q10.js","names":[],"sources":["../../src/components/GrDropdownMenu/grDropdownMenuStyles.ts","../../src/components/GrDropdownMenu/safelist.ts","../../src/components/GrDropdownMenu/config.ts"],"sourcesContent":["export type GrDropdownMenuItemAlign = 'left' | 'center' | 'right'\nexport type GrDropdownMenuItemVariant = 'default' | 'danger'\nexport type GrDropdownMenuHeaderAlign = GrDropdownMenuItemAlign\nexport type GrDropdownMenuColumnAlign = GrDropdownMenuItemAlign\nexport type GrDropdownMenuColumnsCount = 2 | 3 | 4\n\nexport const alignClass: Record<GrDropdownMenuItemAlign, string> = {\n left: 'justify-start text-left',\n center: 'justify-center text-center',\n right: 'justify-end text-right',\n}\n\nexport const textAlignClass: Record<GrDropdownMenuHeaderAlign, string> = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n}\n\nexport const colsClass: Record<GrDropdownMenuColumnsCount, string> = {\n 2: 'grid-cols-2',\n 3: 'grid-cols-3',\n 4: 'grid-cols-4',\n}\n\nexport const itemBaseClass = 'w-full min-h-10 px-4 py-2.5 flex items-center gap-2 text-[length:var(--gr-text-sm)] transition-colors duration-[var(--gr-duration-fast)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]'\n\n// Насыщенный тон как цвет текста запрещён — для текста есть `-text`-роль.\nexport const itemVariantClass: Record<GrDropdownMenuItemVariant, string> = {\n default: 'text-[var(--gr-fg)]',\n danger: 'text-[var(--gr-danger-text)]',\n}\n\nexport const itemInteractiveClass = 'cursor-pointer hover:bg-[var(--gr-accent)] hover:text-[var(--gr-accent-fg)]'\n\n// Disabled гасится фоном, а не `opacity`: прозрачность разбавляет выверенные на\n// AA токены текста. `pointer-events-none` оставлен — он же гасит hover.\nexport const itemDisabledClass = 'cursor-not-allowed pointer-events-none bg-[var(--gr-muted)] text-[var(--gr-muted-fg)]'\n\nexport const itemIndicatorClass = 'h-3.5 w-3.5 shrink-0'\nexport const itemShortcutClass = 'ml-auto pl-4 text-[length:var(--gr-text-xs)] text-[var(--gr-muted-fg)]'\n\nexport const headerClass = 'px-4 py-2 text-[length:var(--gr-text-xs)] tracking-wide text-[var(--gr-muted-fg)]'\n\nexport const listBaseClass = 'w-full'\nexport const dividersClass = 'divide-y divide-[var(--gr-brd)]'\nexport const borderTopClass = 'border-t border-[var(--gr-brd)]'\nexport const borderBottomClass = 'border-b border-[var(--gr-brd)]'\n\nexport const columnsBaseClass = 'w-full grid divide-x divide-[var(--gr-brd)]'\nexport const columnBaseClass = 'px-3 py-2 flex items-center'\n\nexport const dividerClass = 'border-t border-[var(--gr-brd)]'\nexport const dividerInsetClass = 'mx-2'\n\nexport function grDropdownMenuItemClass(options: {\n align: GrDropdownMenuItemAlign\n variant: GrDropdownMenuItemVariant\n disabled: boolean\n}): string {\n return [\n itemBaseClass,\n alignClass[options.align],\n options.disabled ? itemDisabledClass : itemVariantClass[options.variant],\n options.disabled ? '' : itemInteractiveClass,\n ].filter(Boolean).join(' ')\n}\n\nexport function grDropdownMenuListClass(options: {\n dividers: boolean\n borderTop: boolean\n borderBottom: boolean\n}): string {\n return [\n listBaseClass,\n options.dividers ? dividersClass : '',\n options.borderTop ? borderTopClass : '',\n options.borderBottom ? borderBottomClass : '',\n ].filter(Boolean).join(' ')\n}\n","import { splitClassTokens } from '../shared/classTokens'\n\nimport {\n alignClass,\n borderBottomClass,\n borderTopClass,\n colsClass,\n columnBaseClass,\n columnsBaseClass,\n dividerClass,\n dividerInsetClass,\n dividersClass,\n headerClass,\n itemBaseClass,\n itemDisabledClass,\n itemIndicatorClass,\n itemInteractiveClass,\n itemShortcutClass,\n itemVariantClass,\n listBaseClass,\n textAlignClass,\n} from './grDropdownMenuStyles'\n\n/**\n * Классы каталога живут в `.ts`-хелпере, а его бандлер волен вынести в общий\n * `dist/chunks/` — вне области скана компонента. Симптом промаха тут особенно\n * незаметный: размеры пунктов на месте, а выравнивание, колонки и цвета\n * пропали. Гейт — `src/__tests__/safelist.test.ts`.\n */\nexport const grDropdownMenuSafelist = [...new Set([\n ...Object.values(alignClass).flatMap(splitClassTokens),\n ...Object.values(textAlignClass).flatMap(splitClassTokens),\n ...Object.values(colsClass).flatMap(splitClassTokens),\n ...Object.values(itemVariantClass).flatMap(splitClassTokens),\n ...splitClassTokens(itemBaseClass),\n ...splitClassTokens(itemInteractiveClass),\n ...splitClassTokens(itemDisabledClass),\n ...splitClassTokens(itemIndicatorClass),\n ...splitClassTokens(itemShortcutClass),\n ...splitClassTokens(headerClass),\n ...splitClassTokens(listBaseClass),\n ...splitClassTokens(dividersClass),\n ...splitClassTokens(borderTopClass),\n ...splitClassTokens(borderBottomClass),\n ...splitClassTokens(columnsBaseClass),\n ...splitClassTokens(columnBaseClass),\n ...splitClassTokens(dividerClass),\n ...splitClassTokens(dividerInsetClass),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grDropdownMenuSafelist } from './safelist'\n\nexport const grDropdownMenuConfig = defineGranularComponent(import.meta.url, {\n name: 'GrDropdownMenu',\n dependencies: ['GrDropdown'],\n safelist: grDropdownMenuSafelist,\n})\n"],"mappings":";;;AAMA,IAAa,aAAsD;CACjE,MAAM;CACN,QAAQ;CACR,OAAO;AACT;AAEA,IAAa,iBAA4D;CACvE,MAAM;CACN,QAAQ;CACR,OAAO;AACT;AAEA,IAAa,YAAwD;CACnE,GAAG;CACH,GAAG;CACH,GAAG;AACL;AAEA,IAAa,gBAAgB;AAG7B,IAAa,mBAA8D;CACzE,SAAS;CACT,QAAQ;AACV;AAEA,IAAa,uBAAuB;AAIpC,IAAa,oBAAoB;AAEjC,IAAa,qBAAqB;AAClC,IAAa,oBAAoB;AAEjC,IAAa,cAAc;AAE3B,IAAa,gBAAgB;AAC7B,IAAa,gBAAgB;AAC7B,IAAa,iBAAiB;AAC9B,IAAa,oBAAoB;AAEjC,IAAa,mBAAmB;AAChC,IAAa,kBAAkB;AAE/B,IAAa,eAAe;AAC5B,IAAa,oBAAoB;AAEjC,SAAgB,wBAAwB,SAI7B;CACT,OAAO;EACL;EACA,WAAW,QAAQ;EACnB,QAAQ,WAAW,oBAAoB,iBAAiB,QAAQ;EAChE,QAAQ,WAAW,KAAK;CAC1B,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AAC5B;AAEA,SAAgB,wBAAwB,SAI7B;CACT,OAAO;EACL;EACA,QAAQ,WAAW,gBAAgB;EACnC,QAAQ,YAAY,iBAAiB;EACrC,QAAQ,eAAe,oBAAoB;CAC7C,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AAC5B;;;;;;;;;ACjDA,IAAa,yBAAyB,CAAC,mBAAG,IAAI,IAAI;CAC9C,GAAG,OAAO,OAAO,UAAU,CAAC,CAAC,QAAQ,gBAAgB;CACrD,GAAG,OAAO,OAAO,cAAc,CAAC,CAAC,QAAQ,gBAAgB;CACzD,GAAG,OAAO,OAAO,SAAS,CAAC,CAAC,QAAQ,gBAAgB;CACpD,GAAG,OAAO,OAAO,gBAAgB,CAAC,CAAC,QAAQ,gBAAgB;CAC3D,GAAG,iBAAiB,aAAa;CACjC,GAAG,iBAAiB,oBAAoB;CACxC,GAAG,iBAAiB,iBAAiB;CACrC,GAAG,iBAAiB,kBAAkB;CACtC,GAAG,iBAAiB,iBAAiB;CACrC,GAAG,iBAAiB,WAAW;CAC/B,GAAG,iBAAiB,aAAa;CACjC,GAAG,iBAAiB,aAAa;CACjC,GAAG,iBAAiB,cAAc;CAClC,GAAG,iBAAiB,iBAAiB;CACrC,GAAG,iBAAiB,gBAAgB;CACpC,GAAG,iBAAiB,eAAe;CACnC,GAAG,iBAAiB,YAAY;CAChC,GAAG,iBAAiB,iBAAiB;AACzC,CAAC,CAAC;;;AC5CF,IAAa,uBAAuB,wBAAwB,OAAO,KAAK,KAAK;CAC3E,MAAM;CACN,cAAc,CAAC,YAAY;CAC3B,UAAU;AACZ,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-CY0_6cMi.js","names":[],"sources":["../../src/components/GrDivider/grDividerStyles.ts","../../src/components/GrDivider/safelist.ts","../../src/components/GrDivider/config.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nexport type GrDividerOrientation = 'horizontal' | 'vertical'\nexport type GrDividerAlign = 'start' | 'center' | 'end'\nexport type GrDividerVariant = 'solid' | 'dashed' | 'dotted'\n/** Отступы вокруг разделителя. `none` — вплотную, как было до появления пропа. */\nexport type GrDividerSpacing = 'none' | GrComponentSize\n\n/**\n * Линия рисуется бордюром, а не фоном: `dashed` и `dotted` фоном не выразить,\n * а два разных механизма на три варианта одного и того же — путь к расхождению.\n * Толщину задаёт `--gr-divider-thickness`, поэтому классы про неё не знают.\n */\nexport const lineVariantClass: Record<GrDividerVariant, string> = {\n solid: 'border-solid',\n dashed: 'border-dashed',\n dotted: 'border-dotted',\n}\n\nexport const horizontalLineClass\n = 'border-0 border-t-[length:var(--gr-divider-thickness,1px)] border-[var(--gr-brd)]'\n\nexport const verticalLineClass\n = 'border-0 border-l-[length:var(--gr-divider-thickness,1px)] border-[var(--gr-brd)]'\n\nexport const horizontalSpacingClass: Record<GrDividerSpacing, string> = {\n none: '',\n xs: 'my-1',\n sm: 'my-2',\n md: 'my-3',\n lg: 'my-4',\n}\n\nexport const verticalSpacingClass: Record<GrDividerSpacing, string> = {\n none: '',\n xs: 'mx-1',\n sm: 'mx-2',\n md: 'mx-3',\n lg: 'mx-4',\n}\n\nexport const labelRootClass = 'flex w-full items-center gap-3 text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)] text-[var(--gr-muted-fg)]'\n\n/** Отрезок линии рядом с подписью: тянется по остатку ширины. */\nexport const labelLineClass = 'flex-1'\n","import { splitClassTokens } from '../shared/classTokens'\nimport {\n horizontalLineClass,\n horizontalSpacingClass,\n labelLineClass,\n labelRootClass,\n lineVariantClass,\n verticalLineClass,\n verticalSpacingClass,\n} from './grDividerStyles'\n\n// Литералы живут в `.ts`-хелпере, а он на сборке уезжает в общий чанк — скан\n// шаблонов их не увидит. Отсюда и safelist: без него `dashed`-разделитель\n// оказался бы разделителем без линии.\nexport const grDividerSafelist = [...new Set([\n ...splitClassTokens(horizontalLineClass),\n ...splitClassTokens(verticalLineClass),\n ...splitClassTokens(labelRootClass),\n ...splitClassTokens(labelLineClass),\n ...Object.values(lineVariantClass).flatMap(splitClassTokens),\n ...Object.values(horizontalSpacingClass).flatMap(splitClassTokens),\n ...Object.values(verticalSpacingClass).flatMap(splitClassTokens),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grDividerSafelist } from './safelist'\n\nexport const grDividerConfig = defineGranularComponent(import.meta.url, {\n name: 'GrDivider',\n safelist: grDividerSafelist,\n})\n"],"mappings":";;;;;;;;AAaA,IAAa,mBAAqD;CAChE,OAAO;CACP,QAAQ;CACR,QAAQ;AACV;AAEA,IAAa,sBACT;AAEJ,IAAa,oBACT;AAEJ,IAAa,yBAA2D;CACtE,MAAM;CACN,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,uBAAyD;CACpE,MAAM;CACN,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,iBAAiB;;AAG9B,IAAa,iBAAiB;;;AC9B9B,IAAa,oBAAoB,CAAC,mBAAG,IAAI,IAAI;CAC3C,GAAG,iBAAiB,mBAAmB;CACvC,GAAG,iBAAiB,iBAAiB;CACrC,GAAG,iBAAiB,cAAc;CAClC,GAAG,iBAAiB,cAAc;CAClC,GAAG,OAAO,OAAO,gBAAgB,CAAC,CAAC,QAAQ,gBAAgB;CAC3D,GAAG,OAAO,OAAO,sBAAsB,CAAC,CAAC,QAAQ,gBAAgB;CACjE,GAAG,OAAO,OAAO,oBAAoB,CAAC,CAAC,QAAQ,gBAAgB;AACjE,CAAC,CAAC;;;AClBF,IAAa,kBAAkB,wBAAwB,OAAO,KAAK,KAAK;CACtE,MAAM;CACN,UAAU;AACZ,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-D2aNP7Es.js","names":[],"sources":["../../src/components/GrSortableList/grSortableListStyles.ts","../../src/components/GrSortableList/safelist.ts","../../src/components/GrSortableList/config.ts"],"sourcesContent":["export type GrSortableOrientation = 'horizontal' | 'vertical'\n\n/**\n * Классы `GrSortableList`. Единственный источник правды для шаблона и\n * `safelist.ts`: литерал, живущий только здесь, до скана UnoCSS не доходит —\n * хелпер уезжает в общий чанк `dist/chunks/`.\n */\n\nexport const listClass: Record<GrSortableOrientation, string> = {\n vertical: 'flex flex-col',\n horizontal: 'flex flex-row flex-wrap',\n}\n\nexport const rowLayoutClass = 'relative flex items-center gap-2 px-4 py-3 transition-colors duration-[var(--gr-duration-fast)]'\n\n/**\n * Строка — остановка роверного фокуса, поэтому кольцо на ней, а не на ручке:\n * с клавиатуры берут строку целиком, ручка остаётся affordance для мыши.\n */\nexport const rowFocusClass = 'focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)] focus-visible:ring-inset'\n\nexport const rowDraggingClass = 'bg-[var(--gr-sortable-row-bg-active,var(--gr-muted))]'\n\n/** Взятая с клавиатуры строка обязана отличаться от просто сфокусированной. */\nexport const rowGrabbedClass = 'bg-[var(--gr-sortable-row-bg-active,var(--gr-muted))] ring-2 ring-[var(--gr-ring)] ring-inset'\n\nexport const rowDisabledClass = 'cursor-not-allowed bg-[var(--gr-muted)] text-[var(--gr-muted-fg)]'\n\nexport const dividedClass = 'divide-y divide-[var(--gr-brd)]'\n\nexport const emptyClass = 'px-4 py-6 text-center text-[length:var(--gr-text-sm)] text-[var(--gr-muted-fg)]'\n\n/**\n * Ручка не табируется: внутри роверного композита свой таб-стоп сломал бы\n * правило «один Tab на список» — тот же приём, что у ручки `GrTree`.\n */\n/**\n * `[touch-action:none]` вместо `touch-none`: утилиты нет ни в `presetMini`, ни\n * в extra-rules, класс молча не превратился бы в CSS — и вертикальный свайп по\n * ручке ушёл бы в прокрутку страницы. Тот же приём у дорожки `GrSlider`.\n */\nexport const handleClass = 'flex shrink-0 items-center justify-center rounded-[var(--gr-radius-sm)] text-[var(--gr-sortable-handle-color,var(--gr-muted-fg))] size-[var(--gr-sortable-handle-size,1.5rem)] cursor-grab [touch-action:none] focus:outline-none'\n\nexport const handleDisabledClass = 'cursor-not-allowed text-[var(--gr-muted-fg)]'\n\nexport const handleIconClass = 'i-lucide-grip-vertical'\n\nexport const contentClass = 'min-w-0 flex-1 text-[length:var(--gr-text-sm)]'\n\n/**\n * Куда встанет строка — псевдоэлемент самой строки, а не отдельный узел:\n * лишний узел между строками ломает и `divide-y`, и подсчёт позиций.\n */\nexport const indicatorBeforeClass = 'before:absolute before:inset-x-0 before:top-0 before:h-[var(--gr-sortable-indicator-width,2px)] before:bg-[var(--gr-sortable-indicator,var(--gr-primary))] before:content-empty'\n\nexport const indicatorAfterClass = 'after:absolute after:inset-x-0 after:bottom-0 after:h-[var(--gr-sortable-indicator-width,2px)] after:bg-[var(--gr-sortable-indicator,var(--gr-primary))] after:content-empty'\n","import { splitClassTokens } from '../shared/classTokens'\nimport {\n contentClass,\n dividedClass,\n emptyClass,\n handleClass,\n handleDisabledClass,\n handleIconClass,\n indicatorAfterClass,\n indicatorBeforeClass,\n listClass,\n rowDisabledClass,\n rowDraggingClass,\n rowFocusClass,\n rowGrabbedClass,\n rowLayoutClass,\n} from './grSortableListStyles'\n\nexport const grSortableListSafelist = [...new Set([\n ...Object.values(listClass).flatMap(splitClassTokens),\n ...splitClassTokens(rowLayoutClass),\n ...splitClassTokens(rowFocusClass),\n ...splitClassTokens(rowDraggingClass),\n ...splitClassTokens(rowGrabbedClass),\n ...splitClassTokens(rowDisabledClass),\n ...splitClassTokens(dividedClass),\n ...splitClassTokens(emptyClass),\n ...splitClassTokens(handleClass),\n ...splitClassTokens(handleDisabledClass),\n ...splitClassTokens(handleIconClass),\n ...splitClassTokens(contentClass),\n ...splitClassTokens(indicatorBeforeClass),\n ...splitClassTokens(indicatorAfterClass),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grSortableListSafelist } from './safelist'\n\nexport const grSortableListConfig = defineGranularComponent(import.meta.url, {\n name: 'GrSortableList',\n safelist: grSortableListSafelist,\n dependencies: ['GrCard'],\n})\n"],"mappings":";;;;;;;;AAQA,IAAa,YAAmD;CAC9D,UAAU;CACV,YAAY;AACd;AAEA,IAAa,iBAAiB;;;;;AAM9B,IAAa,gBAAgB;AAE7B,IAAa,mBAAmB;;AAGhC,IAAa,kBAAkB;AAE/B,IAAa,mBAAmB;AAEhC,IAAa,eAAe;AAE5B,IAAa,aAAa;;;;;;;;;;AAW1B,IAAa,cAAc;AAE3B,IAAa,sBAAsB;AAEnC,IAAa,kBAAkB;AAE/B,IAAa,eAAe;;;;;AAM5B,IAAa,uBAAuB;AAEpC,IAAa,sBAAsB;;;ACrCnC,IAAa,yBAAyB,CAAC,mBAAG,IAAI,IAAI;CAChD,GAAG,OAAO,OAAO,SAAS,CAAC,CAAC,QAAQ,gBAAgB;CACpD,GAAG,iBAAiB,cAAc;CAClC,GAAG,iBAAiB,aAAa;CACjC,GAAG,iBAAiB,gBAAgB;CACpC,GAAG,iBAAiB,eAAe;CACnC,GAAG,iBAAiB,gBAAgB;CACpC,GAAG,iBAAiB,YAAY;CAChC,GAAG,iBAAiB,UAAU;CAC9B,GAAG,iBAAiB,WAAW;CAC/B,GAAG,iBAAiB,mBAAmB;CACvC,GAAG,iBAAiB,eAAe;CACnC,GAAG,iBAAiB,YAAY;CAChC,GAAG,iBAAiB,oBAAoB;CACxC,GAAG,iBAAiB,mBAAmB;AACzC,CAAC,CAAC;;;AC7BF,IAAa,uBAAuB,wBAAwB,OAAO,KAAK,KAAK;CAC3E,MAAM;CACN,UAAU;CACV,cAAc,CAAC,QAAQ;AACzB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-D94Z9po5.js","names":[],"sources":["../../src/components/GrDrawer/grDrawerStyles.ts","../../src/components/GrDrawer/safelist.ts","../../src/components/GrDrawer/config.ts"],"sourcesContent":["import type { GrOverlaySize } from '../shared/sizes'\n\nexport type GrDrawerSide = 'left' | 'right' | 'top' | 'bottom'\nexport type GrDrawerSize = GrOverlaySize\n\n/** Ось, по которой панель выезжает и по которой считается её размер. */\nexport type GrDrawerAxis = 'horizontal' | 'vertical'\n\nexport function grDrawerAxis(side: GrDrawerSide): GrDrawerAxis {\n return side === 'left' || side === 'right' ? 'horizontal' : 'vertical'\n}\n\n/**\n * Настройка паддингов и рамки секции. Структурно совпадает с\n * `GrDialogSectionConfig` намеренно: потребитель не должен переучиваться при\n * переходе между двумя оверлеями библиотеки. Свой тип, а не импорт из\n * `GrDialog`, — чтобы не тянуть чужой чанк ради двух полей.\n */\nexport interface GrDrawerSectionConfig {\n paddingX?: string\n paddingY?: string\n bordered?: boolean\n}\n\nexport const DEFAULT_GR_DRAWER_HEADER_CONFIG: Required<GrDrawerSectionConfig> = {\n paddingX: 'px-5',\n paddingY: 'py-4',\n bordered: true,\n}\n\nexport const DEFAULT_GR_DRAWER_BODY_CONFIG: Required<GrDrawerSectionConfig> = {\n paddingX: 'px-5',\n paddingY: 'py-5',\n bordered: false,\n}\n\nexport const DEFAULT_GR_DRAWER_FOOTER_CONFIG: Required<GrDrawerSectionConfig> = {\n paddingX: 'px-5',\n paddingY: 'py-4',\n bordered: true,\n}\n\nexport function resolveGrDrawerSectionConfig(\n config: GrDrawerSectionConfig | undefined,\n defaults: Required<GrDrawerSectionConfig>,\n): Required<GrDrawerSectionConfig> {\n return {\n paddingX: config?.paddingX ?? defaults.paddingX,\n paddingY: config?.paddingY ?? defaults.paddingY,\n bordered: config?.bordered ?? defaults.bordered,\n }\n}\n\n/** Слой модального класса — тот же, что у `GrModal`: бэкдроп, фокус, scroll-lock. */\nexport const rootClass = 'fixed inset-0 z-[var(--gr-z-modal)]'\n\n/**\n * Немодальная панель обязана пропускать клики мимо себя: корень растянут на весь\n * экран ради позиционирования, и без этого «немодальный» режим гасил бы всю\n * страницу — ровно то, чего он должен избегать. Панель кликабельность себе\n * возвращает.\n */\nexport const rootPassThroughClass = 'pointer-events-none'\nexport const panelInteractiveClass = 'pointer-events-auto'\n\nexport const overlayClass = 'fixed inset-0 bg-[var(--gr-overlay-bg)]'\n\n/** Ширина панели для боковых сторон. */\nexport const panelWidthBySize: Record<GrDrawerSize, string> = {\n sm: 'w-[360px] max-w-[90vw]',\n md: 'w-[420px] max-w-[92vw]',\n lg: 'w-[560px] max-w-[94vw]',\n xl: 'w-[720px] max-w-[96vw]',\n full: 'w-[100vw]',\n}\n\n/** Высота панели для верхней и нижней сторон — та же шкала, но по своей оси. */\nexport const panelHeightBySize: Record<GrDrawerSize, string> = {\n sm: 'h-[280px] max-h-[90vh]',\n md: 'h-[360px] max-h-[92vh]',\n lg: 'h-[480px] max-h-[94vh]',\n xl: 'h-[640px] max-h-[96vh]',\n full: 'h-[100vh]',\n}\n\nexport const panelSizeByAxis: Record<GrDrawerAxis, Record<GrDrawerSize, string>> = {\n horizontal: panelWidthBySize,\n vertical: panelHeightBySize,\n}\n\n/**\n * Позиция панели. Растяжка по поперечной оси живёт здесь же: у боковой панели\n * это `inset-y-0`, у верхней и нижней — `inset-x-0`, и держать их в разметке\n * значило бы иметь в шаблоне половину стороны.\n */\nexport const panelSideClass: Record<GrDrawerSide, string> = {\n left: 'inset-y-0 left-0 border-r',\n right: 'inset-y-0 right-0 border-l',\n top: 'inset-x-0 top-0 border-b',\n bottom: 'inset-x-0 bottom-0 border-t',\n}\n\nexport const panelTransitionClass: Record<GrDrawerSide, string> = {\n left: '-translate-x-full',\n right: 'translate-x-full',\n top: '-translate-y-full',\n bottom: 'translate-y-full',\n}\n\nexport const panelBaseClass = 'fixed flex flex-col border-[var(--gr-brd)] bg-[var(--gr-card)] text-[var(--gr-card-fg)] shadow-[var(--gr-shadow-2)] outline-none'\n\nexport const headerBorderClass = 'border-b border-[var(--gr-brd)]'\nexport const footerBorderClass = 'border-t border-[var(--gr-brd)]'\nexport const titleClass = 'text-[length:var(--gr-text-sm)] font-700 min-w-0 truncate'\n\n/** Скрытый заголовок: имя слоя есть даже там, где шапки на экране нет. */\nexport const srOnlyTitleClass = 'sr-only'\n\n// Произвольный размер отменяет размерный класс: иначе `w-[420px]` из шкалы\n// спорил бы с инлайновым стилем панели.\nexport function grDrawerPanelClass(options: {\n side: GrDrawerSide\n size: GrDrawerSize\n hasCustomLength: boolean\n}): string {\n const axis = grDrawerAxis(options.side)\n\n return [\n panelBaseClass,\n panelInteractiveClass,\n panelSideClass[options.side],\n options.hasCustomLength ? '' : panelSizeByAxis[axis][options.size],\n ].filter(Boolean).join(' ')\n}\n\nexport function grDrawerPanelEnterFrom(side: GrDrawerSide): string {\n return panelTransitionClass[side]\n}\n","import { splitClassTokens } from '../shared/classTokens'\nimport {\n DEFAULT_GR_DRAWER_BODY_CONFIG,\n DEFAULT_GR_DRAWER_FOOTER_CONFIG,\n DEFAULT_GR_DRAWER_HEADER_CONFIG,\n footerBorderClass,\n headerBorderClass,\n overlayClass,\n panelBaseClass,\n panelHeightBySize,\n panelInteractiveClass,\n panelSideClass,\n panelTransitionClass,\n panelWidthBySize,\n rootClass,\n rootPassThroughClass,\n srOnlyTitleClass,\n titleClass,\n} from './grDrawerStyles'\n\n// И динамические токены (`side`/`size`), и литералы отделки панели: `grDrawerStyles.ts`\n// бандлер волен вынести в общий `dist/chunks/`, вне области скана компонента —\n// гейт `src/__tests__/safelist.test.ts`.\nconst sectionDefaults = [\n DEFAULT_GR_DRAWER_HEADER_CONFIG,\n DEFAULT_GR_DRAWER_BODY_CONFIG,\n DEFAULT_GR_DRAWER_FOOTER_CONFIG,\n].flatMap(config => [config.paddingX, config.paddingY])\n\nexport const grDrawerSafelist = [...new Set([\n ...Object.values(panelSideClass).flatMap(splitClassTokens),\n ...Object.values(panelWidthBySize).flatMap(splitClassTokens),\n ...Object.values(panelHeightBySize).flatMap(splitClassTokens),\n ...Object.values(panelTransitionClass).flatMap(splitClassTokens),\n ...splitClassTokens(panelBaseClass),\n ...splitClassTokens(panelInteractiveClass),\n ...splitClassTokens(rootClass),\n ...splitClassTokens(rootPassThroughClass),\n ...splitClassTokens(overlayClass),\n ...splitClassTokens(headerBorderClass),\n ...splitClassTokens(footerBorderClass),\n ...splitClassTokens(titleClass),\n ...splitClassTokens(srOnlyTitleClass),\n ...sectionDefaults.flatMap(splitClassTokens),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\nimport { grDrawerSafelist } from './safelist'\n\nexport const grDrawerConfig = defineGranularComponent(import.meta.url, {\n name: 'GrDrawer',\n dependencies: ['GrButton', 'GrIcon'],\n safelist: grDrawerSafelist,\n})\n"],"mappings":";;;AAQA,SAAgB,aAAa,MAAkC;CAC7D,OAAO,SAAS,UAAU,SAAS,UAAU,eAAe;AAC9D;AAcA,IAAa,kCAAmE;CAC9E,UAAU;CACV,UAAU;CACV,UAAU;AACZ;AAEA,IAAa,gCAAiE;CAC5E,UAAU;CACV,UAAU;CACV,UAAU;AACZ;AAEA,IAAa,kCAAmE;CAC9E,UAAU;CACV,UAAU;CACV,UAAU;AACZ;AAEA,SAAgB,6BACd,QACA,UACiC;CACjC,OAAO;EACL,UAAU,QAAQ,YAAY,SAAS;EACvC,UAAU,QAAQ,YAAY,SAAS;EACvC,UAAU,QAAQ,YAAY,SAAS;CACzC;AACF;;AAGA,IAAa,YAAY;;;;;;;AAQzB,IAAa,uBAAuB;AACpC,IAAa,wBAAwB;AAErC,IAAa,eAAe;;AAG5B,IAAa,mBAAiD;CAC5D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,MAAM;AACR;;AAGA,IAAa,oBAAkD;CAC7D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,MAAM;AACR;AAEA,IAAa,kBAAsE;CACjF,YAAY;CACZ,UAAU;AACZ;;;;;;AAOA,IAAa,iBAA+C;CAC1D,MAAM;CACN,OAAO;CACP,KAAK;CACL,QAAQ;AACV;AAEA,IAAa,uBAAqD;CAChE,MAAM;CACN,OAAO;CACP,KAAK;CACL,QAAQ;AACV;AAEA,IAAa,iBAAiB;AAE9B,IAAa,oBAAoB;AACjC,IAAa,oBAAoB;AACjC,IAAa,aAAa;;AAG1B,IAAa,mBAAmB;AAIhC,SAAgB,mBAAmB,SAIxB;CACT,MAAM,OAAO,aAAa,QAAQ,IAAI;CAEtC,OAAO;EACL;EACA;EACA,eAAe,QAAQ;EACvB,QAAQ,kBAAkB,KAAK,gBAAgB,KAAK,CAAC,QAAQ;CAC/D,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AAC5B;AAEA,SAAgB,uBAAuB,MAA4B;CACjE,OAAO,qBAAqB;AAC9B;;;AClHA,IAAM,kBAAkB;CACtB;CACA;CACA;AACF,CAAC,CAAC,SAAQ,WAAU,CAAC,OAAO,UAAU,OAAO,QAAQ,CAAC;AAEtD,IAAa,mBAAmB,CAAC,mBAAG,IAAI,IAAI;CAC1C,GAAG,OAAO,OAAO,cAAc,CAAC,CAAC,QAAQ,gBAAgB;CACzD,GAAG,OAAO,OAAO,gBAAgB,CAAC,CAAC,QAAQ,gBAAgB;CAC3D,GAAG,OAAO,OAAO,iBAAiB,CAAC,CAAC,QAAQ,gBAAgB;CAC5D,GAAG,OAAO,OAAO,oBAAoB,CAAC,CAAC,QAAQ,gBAAgB;CAC/D,GAAG,iBAAiB,cAAc;CAClC,GAAG,iBAAiB,qBAAqB;CACzC,GAAG,iBAAiB,SAAS;CAC7B,GAAG,iBAAiB,oBAAoB;CACxC,GAAG,iBAAiB,YAAY;CAChC,GAAG,iBAAiB,iBAAiB;CACrC,GAAG,iBAAiB,iBAAiB;CACrC,GAAG,iBAAiB,UAAU;CAC9B,GAAG,iBAAiB,gBAAgB;CACpC,GAAG,gBAAgB,QAAQ,gBAAgB;AAC7C,CAAC,CAAC;;;ACzCF,IAAa,iBAAiB,wBAAwB,OAAO,KAAK,KAAK;CACrE,MAAM;CACN,cAAc,CAAC,YAAY,QAAQ;CACnC,UAAU;AACZ,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-DCFvmHEv2.js","names":[],"sources":["../../src/components/GrTreeSelect/grTreeSelectStyles.ts","../../src/components/GrTreeSelect/safelist.ts","../../src/components/GrTreeSelect/config.ts"],"sourcesContent":["import type { GrControlState } from '../shared/sizes'\n\nimport type { GrInputSize } from '../GrInput'\n\nexport type GrTreeSelectState = GrControlState\n\nexport const sizeClassBySize: Record<GrInputSize, string> = {\n xs: 'h-7 px-2.5 text-[length:var(--gr-control-text-xs)]',\n sm: 'h-8 px-3 text-[length:var(--gr-control-text-sm)]',\n md: 'h-10 px-3 text-[length:var(--gr-control-text-md)]',\n lg: 'h-11 px-4 text-[length:var(--gr-control-text-lg)]',\n}\n\n/**\n * Горизонтальный отступ из `sizeClassBySize`, но числом: аддоны задают паддинг\n * инлайн-стилем, а он перекрывает класс — значение нужно обеим формам, и\n * расходиться им нельзя.\n */\nexport const paddingX: Record<GrInputSize, string> = {\n xs: '10px',\n sm: '12px',\n md: '12px',\n lg: '16px',\n}\n\n/** Ширина зоны шеврона/крестика справа (`pr-9` в классе триггера). */\nexport const trailingZoneWidth = '2.25rem'\n\nexport const borderClassByState: Record<GrTreeSelectState, 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)]'\n\n/**\n * Disabled красится фоном и цветом текста, а не прозрачностью: `opacity`\n * разбавляет выверенные на AA токены и роняет контраст подписи.\n */\nexport const shellEnabledClass = 'bg-[var(--gr-bg)] text-[var(--gr-fg)]'\nexport const shellDisabledClass = 'bg-[var(--gr-muted)] text-[var(--gr-muted-fg)] cursor-not-allowed'\n\nexport function grTreeSelectClass(options: {\n size: GrInputSize\n state: GrTreeSelectState\n invalid: boolean\n disabled?: boolean\n}): string {\n return [\n sizeClassBySize[options.size],\n 'pr-9',\n options.disabled ? shellDisabledClass : shellEnabledClass,\n options.invalid ? invalidBorderClass : borderClassByState[options.state],\n ].join(' ')\n}\n\nexport const grTreeSelectPanelClass = '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/**\n * Строка состояния панели: загрузка и «нет данных». По центру и с двойным\n * воздухом — тот же язык, что у `GrSelect`, `GrAutocomplete` и палитры команд.\n * Слева она расходилась с содержимым дерева на паддинг скроллера.\n */\nexport const grTreeSelectStateClass = 'flex items-center justify-center gap-2 px-3 py-4 text-center text-[length:var(--gr-text-sm)] text-[var(--gr-muted-fg)]'\n","import { splitClassTokens } from '../shared/classTokens'\nimport {\n borderClassByState,\n grTreeSelectPanelClass,\n grTreeSelectStateClass,\n invalidBorderClass,\n shellDisabledClass,\n shellEnabledClass,\n sizeClassBySize,\n} from './grTreeSelectStyles'\n\nexport const grTreeSelectSafelist = [...new Set([\n ...Object.values(sizeClassBySize).flatMap(splitClassTokens),\n ...Object.values(borderClassByState).flatMap(splitClassTokens),\n ...splitClassTokens(invalidBorderClass),\n 'pr-9',\n ...splitClassTokens(shellEnabledClass),\n ...splitClassTokens(shellDisabledClass),\n ...splitClassTokens(grTreeSelectPanelClass),\n ...splitClassTokens(grTreeSelectStateClass),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grTreeSelectSafelist } from './safelist'\n\nexport const grTreeSelectConfig = defineGranularComponent(import.meta.url, {\n name: 'GrTreeSelect',\n safelist: grTreeSelectSafelist,\n dependencies: ['GrInput', 'GrTree'],\n})"],"mappings":";;;AAMA,IAAa,kBAA+C;CAC1D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;;AAOA,IAAa,WAAwC;CACnD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,oBAAoB;AAEjC,IAAa,qBAAwD;CACnE,SAAS;CACT,SAAS;CACT,SAAS;CACT,QAAQ;AACV;;;;;;AAOA,IAAa,qBAAqB;;;;;AAMlC,IAAa,oBAAoB;AACjC,IAAa,qBAAqB;AAElC,SAAgB,kBAAkB,SAKvB;CACT,OAAO;EACL,gBAAgB,QAAQ;EACxB;EACA,QAAQ,WAAW,qBAAqB;EACxC,QAAQ,UAAU,qBAAqB,mBAAmB,QAAQ;CACpE,CAAC,CAAC,KAAK,GAAG;AACZ;AAEA,IAAa,yBAAyB;;;;;;AAOtC,IAAa,yBAAyB;;;AC3DtC,IAAa,uBAAuB,CAAC,mBAAG,IAAI,IAAI;CAC9C,GAAG,OAAO,OAAO,eAAe,CAAC,CAAC,QAAQ,gBAAgB;CAC1D,GAAG,OAAO,OAAO,kBAAkB,CAAC,CAAC,QAAQ,gBAAgB;CAC7D,GAAG,iBAAiB,kBAAkB;CACtC;CACA,GAAG,iBAAiB,iBAAiB;CACrC,GAAG,iBAAiB,kBAAkB;CACtC,GAAG,iBAAiB,sBAAsB;CAC1C,GAAG,iBAAiB,sBAAsB;AAC5C,CAAC,CAAC;;;AChBF,IAAa,qBAAqB,wBAAwB,OAAO,KAAK,KAAK;CACzE,MAAM;CACN,UAAU;CACV,cAAc,CAAC,WAAW,QAAQ;AACpC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-DEvsMTQE.js","names":[],"sources":["../../src/components/GrDataTable/grDataTableStyles.ts","../../src/components/GrDataTable/safelist.ts","../../src/components/GrDataTable/config.ts"],"sourcesContent":["import type { GrCheckboxSize } from '../GrCheckbox/grCheckboxStyles'\nimport type { GrComponentSize } from '../shared/sizes'\n\nexport type GrDataTableSize = GrComponentSize\n\n/** Паддинг ячейки — и в шапке, и в теле: колонки обязаны совпадать по сетке. */\nexport const cellPaddings: Record<GrDataTableSize, string> = {\n xs: 'px-2 py-1.5',\n sm: 'px-3 py-2',\n md: 'px-4 py-3',\n lg: 'px-5 py-4',\n}\n\n/**\n * Оценка высоты строки по размеру: два вертикальных отступа ячейки плюс строка\n * текста и рамка. Виртуализация уточняет её замером — точное число здесь знать\n * неоткуда, содержимое ячейки задаёт потребитель.\n */\nexport const rowHeightEstimates: Record<GrDataTableSize, number> = {\n xs: 33,\n sm: 41,\n md: 49,\n lg: 57,\n}\n\n/** Заглушки loading/empty: по горизонтали как ячейка, по вертикали просторнее. */\nexport const placeholderPaddings: Record<GrDataTableSize, string> = {\n xs: 'px-2 py-3',\n sm: 'px-3 py-4',\n md: 'px-4 py-6',\n lg: 'px-5 py-8',\n}\n\n/**\n * Ручка перестановки колонки. Появляется по наведению на заголовок и по\n * фокусу: постоянная сетка ручек в шапке из десяти колонок читается как рябь,\n * а не как управление.\n */\nexport const columnHandleClass = 'inline-flex shrink-0 cursor-grab items-center text-[var(--gr-datatable-drag-handle,var(--gr-muted-fg))] opacity-0 [touch-action:none] transition-opacity duration-[var(--gr-duration-fast)] focus:outline-none focus-visible:opacity-100 focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)] rounded-[var(--gr-radius-sm)] group-hover:opacity-100'\n\nexport const columnHandleActiveClass = 'opacity-100'\n\nexport const columnHandleIconClass = 'i-lucide-grip-vertical block'\n\n/** Переносимая колонка гасится, чтобы было видно, что она «поднята». */\nexport const columnDraggingClass = 'bg-[var(--gr-muted)]'\n\n/**\n * Место вставки — полоса по краю ячейки заголовка. Псевдоэлемент, а не свой\n * узел: `<th>` не терпит посторонних детей в раскладке таблицы.\n */\nexport const columnDropBeforeClass = 'before:absolute before:inset-y-0 before:left-0 before:w-[var(--gr-datatable-drag-indicator-width,2px)] before:bg-[var(--gr-datatable-drag-indicator,var(--gr-primary))] before:content-empty'\n\nexport const columnDropAfterClass = 'after:absolute after:inset-y-0 after:right-0 after:w-[var(--gr-datatable-drag-indicator-width,2px)] after:bg-[var(--gr-datatable-drag-indicator,var(--gr-primary))] after:content-empty'\n\n/**\n * Подсветка выбранной строки. Живёт здесь, потому что закреплённой ячейке её\n * приходится повторять: у ячейки свой непрозрачный фон, и подсветка строки\n * сквозь него не видна.\n */\nexport const rowSelectedClass = 'bg-[color-mix(in_srgb,var(--gr-primary)_8%,transparent)]'\n\n/**\n * Ручка ширины — полоса у правого края заголовка. Видима она узкой линией, а\n * ловится широкой зоной: попасть в двухпиксельную границу мышью тяжело.\n */\nexport const columnResizerClass = 'absolute inset-y-0 right-0 z-[1] flex w-3 translate-x-1/2 cursor-col-resize items-stretch justify-center [touch-action:none] focus:outline-none'\n\nexport const columnResizerLineClass = 'w-[var(--gr-datatable-resizer-width,2px)] bg-transparent transition-colors duration-[var(--gr-duration-fast)]'\n\n/** Полоса подсвечивается только когда её ведут или на неё встал фокус. */\nexport const columnResizerLineActiveClass = 'bg-[var(--gr-datatable-resizer,var(--gr-primary))]'\n\nexport const columnResizerHoverClass = 'hover:bg-[var(--gr-datatable-resizer,var(--gr-primary))] focus-visible:bg-[var(--gr-datatable-resizer,var(--gr-primary))]'\n\n/**\n * Закреплённая колонка липнет к краю прокрутки. Фон обязателен: без него\n * уезжающие под неё ячейки просвечивают насквозь.\n */\nexport const columnPinnedClass = 'sticky z-[2] bg-[var(--gr-card)]'\n\n/** Граница группы закреплённых колонок — тень, а не рамка: рамка сдвигает сетку. */\nexport const columnPinnedLeftEdgeClass = 'shadow-[var(--gr-datatable-pinned-shadow,4px_0_6px_-4px_rgba(0,0,0,0.25))]'\n\nexport const columnPinnedRightEdgeClass = 'shadow-[var(--gr-datatable-pinned-shadow-end,-4px_0_6px_-4px_rgba(0,0,0,0.25))]'\n\n/** Подпись колонки набирается мельче тела таблицы — она не данные, а навигация. */\nexport const headerTextSizes: Record<GrDataTableSize, string> = {\n xs: 'text-[length:var(--gr-control-text-3xs)]',\n sm: 'text-[length:var(--gr-control-text-2xs)]',\n md: 'text-[length:var(--gr-control-text-xs)] leading-[var(--gr-leading-xs)]',\n lg: 'text-[length:var(--gr-control-text-md)] leading-[var(--gr-leading-sm)]',\n}\n\n/**\n * Размер `GrCheckbox` в колонке выбора. Здесь не классы, а ступень шкалы:\n * коробку рисует сам чекбокс — он же держит `indeterminate`, disabled без\n * `opacity` и фокус-кольцо.\n */\nexport const selectCheckboxSizes: Record<GrDataTableSize, GrCheckboxSize> = {\n xs: 'xs',\n sm: 'sm',\n md: 'md',\n lg: 'lg',\n}\n\n/** Ширина колонки выбора: коробка чекбокса плюс горизонтальный паддинг ячейки. */\nexport const selectColumnWidths: Record<GrDataTableSize, string> = {\n xs: 'w-7',\n sm: 'w-8',\n md: 'w-10',\n lg: 'w-12',\n}\n\n/** Зазор между подписью колонки и стрелкой сортировки. */\nexport const headerGaps: Record<GrDataTableSize, string> = {\n xs: 'gap-1',\n sm: 'gap-1.5',\n md: 'gap-2',\n lg: 'gap-2',\n}\n\n/** Спиннер в строке загрузки — тем же кеглем, что иконка сортировки рядом. */\nexport const spinnerSizes: Record<GrDataTableSize, string> = {\n xs: 'h-3 w-3',\n sm: 'h-3.5 w-3.5',\n md: 'h-4 w-4',\n lg: 'h-5 w-5',\n}\n\n/** Стрелка сортировки берёт размер из шкалы `GrIcon` (`xs…lg` → `14…20px`). */\nexport const sortIconSizes: Record<GrDataTableSize, GrComponentSize> = {\n xs: 'xs',\n sm: 'xs',\n md: 'sm',\n lg: 'md',\n}\n","import { splitClassTokens } from '../shared/classTokens'\nimport {\n cellPaddings,\n columnDraggingClass,\n columnDropAfterClass,\n columnDropBeforeClass,\n columnHandleActiveClass,\n columnHandleClass,\n columnHandleIconClass,\n columnPinnedClass,\n columnPinnedLeftEdgeClass,\n columnPinnedRightEdgeClass,\n columnResizerClass,\n columnResizerHoverClass,\n columnResizerLineActiveClass,\n columnResizerLineClass,\n headerGaps,\n headerTextSizes,\n placeholderPaddings,\n rowSelectedClass,\n selectColumnWidths,\n spinnerSizes,\n} from './grDataTableStyles'\n\nexport const grDataTableSafelist = [...new Set([\n ...Object.values(cellPaddings).flatMap(splitClassTokens),\n ...Object.values(placeholderPaddings).flatMap(splitClassTokens),\n ...Object.values(headerTextSizes).flatMap(splitClassTokens),\n ...Object.values(selectColumnWidths).flatMap(splitClassTokens),\n ...Object.values(headerGaps).flatMap(splitClassTokens),\n ...Object.values(spinnerSizes).flatMap(splitClassTokens),\n ...splitClassTokens(columnHandleClass),\n ...splitClassTokens(columnHandleActiveClass),\n ...splitClassTokens(columnHandleIconClass),\n ...splitClassTokens(columnDraggingClass),\n ...splitClassTokens(columnDropBeforeClass),\n ...splitClassTokens(columnDropAfterClass),\n ...splitClassTokens(columnResizerClass),\n ...splitClassTokens(columnResizerLineClass),\n ...splitClassTokens(columnResizerLineActiveClass),\n ...splitClassTokens(columnResizerHoverClass),\n ...splitClassTokens(columnPinnedClass),\n ...splitClassTokens(columnPinnedLeftEdgeClass),\n ...splitClassTokens(columnPinnedRightEdgeClass),\n ...splitClassTokens(rowSelectedClass),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grDataTableSafelist } from './safelist'\n\nexport const grDataTableConfig = defineGranularComponent(import.meta.url, {\n name: 'GrDataTable',\n dependencies: ['GrTable', 'GrIcon', 'GrCheckbox'],\n safelist: grDataTableSafelist,\n})\n"],"mappings":";;;;AAMA,IAAa,eAAgD;CAC3D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;;AAOA,IAAa,qBAAsD;CACjE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,sBAAuD;CAClE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;;AAOA,IAAa,oBAAoB;AAEjC,IAAa,0BAA0B;AAEvC,IAAa,wBAAwB;;AAGrC,IAAa,sBAAsB;;;;;AAMnC,IAAa,wBAAwB;AAErC,IAAa,uBAAuB;;;;;;AAOpC,IAAa,mBAAmB;;;;;AAMhC,IAAa,qBAAqB;AAElC,IAAa,yBAAyB;;AAGtC,IAAa,+BAA+B;AAE5C,IAAa,0BAA0B;;;;;AAMvC,IAAa,oBAAoB;;AAGjC,IAAa,4BAA4B;AAEzC,IAAa,6BAA6B;;AAG1C,IAAa,kBAAmD;CAC9D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;;AAOA,IAAa,sBAA+D;CAC1E,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,qBAAsD;CACjE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,aAA8C;CACzD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,eAAgD;CAC3D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,gBAA0D;CACrE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;AChHA,IAAa,sBAAsB,CAAC,mBAAG,IAAI,IAAI;CAC7C,GAAG,OAAO,OAAO,YAAY,CAAC,CAAC,QAAQ,gBAAgB;CACvD,GAAG,OAAO,OAAO,mBAAmB,CAAC,CAAC,QAAQ,gBAAgB;CAC9D,GAAG,OAAO,OAAO,eAAe,CAAC,CAAC,QAAQ,gBAAgB;CAC1D,GAAG,OAAO,OAAO,kBAAkB,CAAC,CAAC,QAAQ,gBAAgB;CAC7D,GAAG,OAAO,OAAO,UAAU,CAAC,CAAC,QAAQ,gBAAgB;CACrD,GAAG,OAAO,OAAO,YAAY,CAAC,CAAC,QAAQ,gBAAgB;CACvD,GAAG,iBAAiB,iBAAiB;CACrC,GAAG,iBAAiB,uBAAuB;CAC3C,GAAG,iBAAiB,qBAAqB;CACzC,GAAG,iBAAiB,mBAAmB;CACvC,GAAG,iBAAiB,qBAAqB;CACzC,GAAG,iBAAiB,oBAAoB;CACxC,GAAG,iBAAiB,kBAAkB;CACtC,GAAG,iBAAiB,sBAAsB;CAC1C,GAAG,iBAAiB,4BAA4B;CAChD,GAAG,iBAAiB,uBAAuB;CAC3C,GAAG,iBAAiB,iBAAiB;CACrC,GAAG,iBAAiB,yBAAyB;CAC7C,GAAG,iBAAiB,0BAA0B;CAC9C,GAAG,iBAAiB,gBAAgB;AACtC,CAAC,CAAC;;;ACzCF,IAAa,oBAAoB,wBAAwB,OAAO,KAAK,KAAK;CACxE,MAAM;CACN,cAAc;EAAC;EAAW;EAAU;CAAY;CAChD,UAAU;AACZ,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-DpqOnJiz2.js","names":[],"sources":["../../src/components/GrTree/safelist.ts","../../src/components/GrTree/config.ts"],"sourcesContent":["// Только динамические значения иконок-пропов (`expandIcon`/`collapseIcon`/`dragHandleIcon`).\n// Литералы шаблона (`py-2`, `px-2`, `ml-6`, ...) не дублируем — UnoCSS находит их сканом.\nexport const grTreeSafelist = [\n 'i-lucide-chevron-right',\n 'i-lucide-grip-vertical',\n] as const","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grTreeSafelist } from './safelist'\n\nexport const grTreeConfig = defineGranularComponent(import.meta.url, {\n name: 'GrTree',\n safelist: grTreeSafelist,\n})"],"mappings":";;AAEA,IAAa,iBAAiB,CAC5B,0BACA,wBACF;;;ACDA,IAAa,eAAe,wBAAwB,OAAO,KAAK,KAAK;CACnE,MAAM;CACN,UAAU;AACZ,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-Rw9OyW70.js","names":[],"sources":["../../src/components/GrSidebar/grSidebarStyles.ts","../../src/components/GrSidebar/safelist.ts","../../src/components/GrSidebar/config.ts"],"sourcesContent":["/** Сторона экрана, к которой прижата панель. */\nexport const GR_SIDEBAR_POSITIONS = ['left', 'right'] as const\nexport type GrSidebarPosition = typeof GR_SIDEBAR_POSITIONS[number]\n\n/** Лендмарк корня: навигация или дополняющий блок (фильтры, справка). */\nexport const GR_SIDEBAR_LANDMARKS = ['complementary', 'navigation'] as const\nexport type GrSidebarLandmark = typeof GR_SIDEBAR_LANDMARKS[number]\n\nexport const rootBase = 'flex flex-col bg-[var(--gr-sidebar)] text-[var(--gr-sidebar-fg)] transition-[width] duration-[var(--gr-duration-base)] ease-[var(--gr-ease-out)]'\n\n/** Граница отделяет панель от контента, поэтому уезжает на внутреннюю сторону. */\nexport const rootPositions: Record<GrSidebarPosition, string> = {\n left: 'border-r border-[var(--gr-sidebar-brd)]',\n right: 'border-l border-[var(--gr-sidebar-brd)]',\n}\n\nexport const headerBase = 'flex items-center gap-2 border-b border-[var(--gr-sidebar-brd)] px-3 py-4'\n\nexport const titleClass = 'truncate text-[length:var(--gr-text-lg)] font-700'\nexport const subtitleClass = 'truncate text-[length:var(--gr-text-sm)] text-[var(--gr-muted-fg)]'\n\n/**\n * Скроллящийся блок обязан быть достижим с клавиатуры, поэтому он остановка\n * `Tab` с видимым кольцом: без него панель с текстовым содержимым не\n * проскроллить вовсе.\n */\nexport const contentBase = 'flex-1 overflow-y-auto focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-[var(--gr-ring)]'\n\nexport const itemBase = 'relative flex w-full items-center rounded-[var(--gr-radius-md)] text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)] transition-colors duration-[var(--gr-duration-fast)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]'\n\nexport const itemCollapsedClass = 'justify-center px-0 py-2'\nexport const itemExpandedClass = 'gap-3 px-3 py-2'\n\n/**\n * Недоступный пункт гасится токеном, а не `opacity`: прозрачность разбавляет\n * выверенные на AA токены текста.\n */\nexport const itemDisabledClass = 'cursor-not-allowed text-[var(--gr-disabled-fg)]'\nexport const itemActiveClass = 'bg-[var(--gr-muted)] font-600 text-[var(--gr-fg)]'\nexport const itemIdleClass = 'text-[var(--gr-sidebar-fg)] hover:bg-[color-mix(in_srgb,var(--gr-sidebar-fg)_8%,transparent)]'\n\nexport const itemLetterClass = 'text-[length:var(--gr-text-xs)] font-700 leading-none'\nexport const itemBadgeClass = 'shrink-0 rounded-[var(--gr-radius-full)] bg-[color-mix(in_srgb,var(--gr-sidebar-fg)_12%,transparent)] px-1.5 py-0.5 text-[length:var(--gr-text-2xs)] font-600'\n\nexport const groupLabelClass = 'px-3 pb-1 pt-3 text-[length:var(--gr-text-2xs)] font-700 [text-transform:uppercase] tracking-wide text-[var(--gr-muted-fg)]'\n\n/**\n * В свёрнутой панели заголовка секции нет — иначе он не помещается. Границы\n * между группами берёт на себя линия: без неё иконки соседних секций сливаются\n * в один столбец.\n */\nexport const groupCollapsedClass = 'mt-2 border-t border-[var(--gr-sidebar-brd)] pt-2'\n\nexport function grSidebarRootClass(position: GrSidebarPosition): string {\n return [rootBase, rootPositions[position]].join(' ')\n}\n\n/**\n * Куда указывает шеврон кнопки тогла: всегда в ту сторону, куда уедет панель.\n * У правой панели «свернуть» — это стрелка вправо.\n */\nexport function grSidebarCollapseDirection(\n position: GrSidebarPosition,\n collapsed: boolean,\n): GrSidebarPosition {\n const toRight = (position === 'right') !== collapsed\n return toRight ? 'right' : 'left'\n}\n\nexport function grSidebarItemClass(options: {\n collapsed: boolean\n disabled: boolean\n active: boolean\n}): string {\n return [\n itemBase,\n options.collapsed ? itemCollapsedClass : itemExpandedClass,\n options.disabled ? itemDisabledClass : options.active ? itemActiveClass : itemIdleClass,\n ].join(' ')\n}\n","import { splitClassTokens } from '../shared/classTokens'\nimport {\n contentBase,\n groupCollapsedClass,\n groupLabelClass,\n headerBase,\n itemActiveClass,\n itemBadgeClass,\n itemBase,\n itemCollapsedClass,\n itemDisabledClass,\n itemExpandedClass,\n itemIdleClass,\n itemLetterClass,\n rootBase,\n rootPositions,\n subtitleClass,\n titleClass,\n} from './grSidebarStyles'\n\nexport const grSidebarSafelist = [...new Set([\n ...splitClassTokens(rootBase),\n ...Object.values(rootPositions).flatMap(splitClassTokens),\n ...splitClassTokens(headerBase),\n ...splitClassTokens(titleClass),\n ...splitClassTokens(subtitleClass),\n ...splitClassTokens(contentBase),\n ...splitClassTokens(itemBase),\n ...splitClassTokens(itemCollapsedClass),\n ...splitClassTokens(itemExpandedClass),\n ...splitClassTokens(itemDisabledClass),\n ...splitClassTokens(itemActiveClass),\n ...splitClassTokens(itemIdleClass),\n ...splitClassTokens(itemLetterClass),\n ...splitClassTokens(itemBadgeClass),\n ...splitClassTokens(groupLabelClass),\n ...splitClassTokens(groupCollapsedClass),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grSidebarSafelist } from './safelist'\n\nexport const grSidebarConfig = defineGranularComponent(import.meta.url, {\n name: 'GrSidebar',\n dependencies: ['GrButton', 'GrIcon'],\n safelist: grSidebarSafelist,\n})\n"],"mappings":";;;;AACA,IAAa,uBAAuB,CAAC,QAAQ,OAAO;;AAIpD,IAAa,uBAAuB,CAAC,iBAAiB,YAAY;AAGlE,IAAa,WAAW;;AAGxB,IAAa,gBAAmD;CAC9D,MAAM;CACN,OAAO;AACT;AAEA,IAAa,aAAa;AAE1B,IAAa,aAAa;AAC1B,IAAa,gBAAgB;;;;;;AAO7B,IAAa,cAAc;AAE3B,IAAa,WAAW;AAExB,IAAa,qBAAqB;AAClC,IAAa,oBAAoB;;;;;AAMjC,IAAa,oBAAoB;AACjC,IAAa,kBAAkB;AAC/B,IAAa,gBAAgB;AAE7B,IAAa,kBAAkB;AAC/B,IAAa,iBAAiB;AAE9B,IAAa,kBAAkB;;;;;;AAO/B,IAAa,sBAAsB;AAEnC,SAAgB,mBAAmB,UAAqC;CACtE,OAAO,CAAC,UAAU,cAAc,SAAS,CAAC,CAAC,KAAK,GAAG;AACrD;;;;;AAMA,SAAgB,2BACd,UACA,WACmB;CAEnB,OADiB,aAAa,YAAa,YAC1B,UAAU;AAC7B;AAEA,SAAgB,mBAAmB,SAIxB;CACT,OAAO;EACL;EACA,QAAQ,YAAY,qBAAqB;EACzC,QAAQ,WAAW,oBAAoB,QAAQ,SAAS,kBAAkB;CAC5E,CAAC,CAAC,KAAK,GAAG;AACZ;;;AC3DA,IAAa,oBAAoB,CAAC,mBAAG,IAAI,IAAI;CAC3C,GAAG,iBAAiB,QAAQ;CAC5B,GAAG,OAAO,OAAO,aAAa,CAAC,CAAC,QAAQ,gBAAgB;CACxD,GAAG,iBAAiB,UAAU;CAC9B,GAAG,iBAAiB,UAAU;CAC9B,GAAG,iBAAiB,aAAa;CACjC,GAAG,iBAAiB,WAAW;CAC/B,GAAG,iBAAiB,QAAQ;CAC5B,GAAG,iBAAiB,kBAAkB;CACtC,GAAG,iBAAiB,iBAAiB;CACrC,GAAG,iBAAiB,iBAAiB;CACrC,GAAG,iBAAiB,eAAe;CACnC,GAAG,iBAAiB,aAAa;CACjC,GAAG,iBAAiB,eAAe;CACnC,GAAG,iBAAiB,cAAc;CAClC,GAAG,iBAAiB,eAAe;CACnC,GAAG,iBAAiB,mBAAmB;AACzC,CAAC,CAAC;;;ACjCF,IAAa,kBAAkB,wBAAwB,OAAO,KAAK,KAAK;CACtE,MAAM;CACN,cAAc,CAAC,YAAY,QAAQ;CACnC,UAAU;AACZ,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-gvq_hWNM.js","names":[],"sources":["../../src/components/GrStatistic/grStatisticStyles.ts","../../src/components/GrStatistic/safelist.ts","../../src/components/GrStatistic/config.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nimport type { GrTone } from '../shared/tones'\n\nexport type GrStatisticSize = GrComponentSize\nexport type GrStatisticTone = GrTone\n/** Направление динамики показателя. */\nexport type GrStatisticTrend = 'up' | 'down' | 'flat'\n\n/**\n * Кастомизация через CSS-переменные:\n *\n * - `--gr-statistic-value-color` — цвет значения (по умолчанию — из `tone`).\n * - `--gr-statistic-title-color` — цвет подписи показателя.\n */\n\nexport const statisticTitleSizeBySize: Record<GrStatisticSize, string> = {\n xs: 'text-[length:var(--gr-text-2xs)]',\n sm: 'text-[length:var(--gr-text-xs)]',\n md: 'text-[length:var(--gr-text-xs)]',\n lg: 'text-[length:var(--gr-text-sm)]',\n}\n\nexport const statisticValueSizeBySize: Record<GrStatisticSize, string> = {\n xs: 'text-[length:var(--gr-text-base)] leading-[var(--gr-leading-base)]',\n sm: 'text-[length:var(--gr-text-xl)] leading-[var(--gr-leading-xl)]',\n md: 'text-[length:var(--gr-text-3xl)] leading-[var(--gr-leading-3xl)]',\n lg: 'text-[length:var(--gr-text-4xl)] leading-tight',\n}\n\nexport const statisticAffixSizeBySize: Record<GrStatisticSize, string> = {\n xs: 'text-[length:var(--gr-text-xs)]',\n sm: 'text-[length:var(--gr-text-xs)]',\n md: 'text-[length:var(--gr-text-base)]',\n lg: 'text-[length:var(--gr-text-xl)]',\n}\n\n// Высота плейсхолдера загрузки повторяет строку значения — блок не «прыгает».\n// Значение отдаётся в `GrSkeleton` пропом, поэтому это px, а не класс.\nexport const statisticPlaceholderHeightBySize: Record<GrStatisticSize, string> = {\n xs: '22px',\n sm: '28px',\n md: '36px',\n lg: '44px',\n}\n\nexport const statisticTrendSizeBySize: Record<GrStatisticSize, string> = {\n xs: 'text-[length:var(--gr-text-2xs)]',\n sm: 'text-[length:var(--gr-text-xs)]',\n md: 'text-[length:var(--gr-text-xs)]',\n lg: 'text-[length:var(--gr-text-sm)]',\n}\n\n// Цвет значения по тону. `neutral` наследует основной цвет текста.\n//\n// Тона берутся из `-text`, а не из насыщенного `--gr-{tone}`: значение — это\n// ТЕКСТ на фоне страницы, а насыщенный тон для этого не предназначен\n// (`--gr-success` на `--gr-bg` — 2.2:1, ниже даже послабления 3:1 для крупного\n// текста). `-text` — ровно роль «тон как текст».\nexport const statisticValueClassByTone: Record<GrStatisticTone, string> = {\n neutral: 'text-[var(--gr-statistic-value-color,var(--gr-fg))]',\n primary: 'text-[var(--gr-statistic-value-color,var(--gr-primary))]',\n success: 'text-[var(--gr-statistic-value-color,var(--gr-success-text))]',\n warning: 'text-[var(--gr-statistic-value-color,var(--gr-warning-text))]',\n danger: 'text-[var(--gr-statistic-value-color,var(--gr-danger-text))]',\n info: 'text-[var(--gr-statistic-value-color,var(--gr-info-text))]',\n slate: 'text-[var(--gr-statistic-value-color,var(--gr-slate-text))]',\n azure: 'text-[var(--gr-statistic-value-color,var(--gr-azure-text))]',\n}\n\n// Строка динамики: рост — успех, падение — опасность, без изменений — приглушённый.\nexport const statisticTrendClassByTrend: Record<GrStatisticTrend, string> = {\n up: 'text-[var(--gr-success-text)]',\n down: 'text-[var(--gr-danger-text)]',\n flat: 'text-[var(--gr-muted-fg)]',\n}\n\nexport const statisticTrendIconByTrend: Record<GrStatisticTrend, string> = {\n up: 'i-lucide-trending-up',\n down: 'i-lucide-trending-down',\n flat: 'i-lucide-minus',\n}\n\nexport const statisticTitleClass = 'font-medium tracking-wide text-[var(--gr-statistic-title-color,var(--gr-muted-fg))]'\n\nexport const statisticRootBase = 'flex items-start gap-3 text-left'\n\n/**\n * Показатель-ссылка или показатель-кнопка. Своей заливки не получает: плитка\n * дашборда обычно уже лежит в `GrCard`, и вторая поверхность спорила бы с ней.\n * Видимость интерактивности держат курсор, фокус-кольцо и подсветка подписи.\n */\nexport const statisticRootInteractiveClass = 'w-full cursor-pointer rounded-[var(--gr-radius-md)] transition-colors hover:bg-[var(--gr-muted)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]'\n\nexport function statisticRootClass(options: { interactive: boolean }): string {\n return [\n statisticRootBase,\n options.interactive ? statisticRootInteractiveClass : '',\n ].filter(Boolean).join(' ')\n}\n\n/** `tabular-nums` держит ширину строки при переборе чисел и при смене значения. */\nexport const statisticValueTypographyClass = 'font-semibold tabular-nums'\n\nexport function statisticValueClass(options: { size: GrStatisticSize, tone: GrStatisticTone }): string {\n return [\n statisticValueTypographyClass,\n statisticValueSizeBySize[options.size],\n statisticValueClassByTone[options.tone],\n ].join(' ')\n}\n","import { splitClassTokens } from '../shared/classTokens'\nimport {\n statisticAffixSizeBySize,\n statisticRootBase,\n statisticRootInteractiveClass,\n statisticTitleClass,\n statisticTitleSizeBySize,\n statisticTrendClassByTrend,\n statisticTrendIconByTrend,\n statisticTrendSizeBySize,\n statisticValueClassByTone,\n statisticValueSizeBySize,\n statisticValueTypographyClass,\n} from './grStatisticStyles'\n\n// Классы из вычисляемых мап (size/tone/trend) UnoCSS сканом не находит — только safelist.\nexport const grStatisticSafelist = [...new Set([\n ...Object.values(statisticTitleSizeBySize).flatMap(splitClassTokens),\n ...Object.values(statisticValueSizeBySize).flatMap(splitClassTokens),\n ...Object.values(statisticAffixSizeBySize).flatMap(splitClassTokens),\n ...Object.values(statisticTrendSizeBySize).flatMap(splitClassTokens),\n ...Object.values(statisticValueClassByTone).flatMap(splitClassTokens),\n ...Object.values(statisticTrendClassByTrend).flatMap(splitClassTokens),\n // Иконки динамики приходят из мапы — как классы-маски их тоже надо сгенерировать.\n ...Object.values(statisticTrendIconByTrend).flatMap(splitClassTokens),\n // Литералы из grStatisticStyles.ts (корень, подпись, типографика значения).\n ...splitClassTokens(statisticRootBase),\n ...splitClassTokens(statisticRootInteractiveClass),\n ...splitClassTokens(statisticTitleClass),\n ...splitClassTokens(statisticValueTypographyClass),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grStatisticSafelist } from './safelist'\n\nexport const grStatisticConfig = defineGranularComponent(import.meta.url, {\n name: 'GrStatistic',\n safelist: grStatisticSafelist,\n dependencies: ['GrSkeleton'],\n})\n"],"mappings":";;;;;;;;;AAgBA,IAAa,2BAA4D;CACvE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,2BAA4D;CACvE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,2BAA4D;CACvE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAIA,IAAa,mCAAoE;CAC/E,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,2BAA4D;CACvE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAQA,IAAa,4BAA6D;CACxE,SAAS;CACT,SAAS;CACT,SAAS;CACT,SAAS;CACT,QAAQ;CACR,MAAM;CACN,OAAO;CACP,OAAO;AACT;AAGA,IAAa,6BAA+D;CAC1E,IAAI;CACJ,MAAM;CACN,MAAM;AACR;AAEA,IAAa,4BAA8D;CACzE,IAAI;CACJ,MAAM;CACN,MAAM;AACR;AAEA,IAAa,sBAAsB;AAEnC,IAAa,oBAAoB;;;;;;AAOjC,IAAa,gCAAgC;AAE7C,SAAgB,mBAAmB,SAA2C;CAC5E,OAAO,CACL,mBACA,QAAQ,cAAc,gCAAgC,EACxD,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AAC5B;;AAGA,IAAa,gCAAgC;AAE7C,SAAgB,oBAAoB,SAAmE;CACrG,OAAO;EACL;EACA,yBAAyB,QAAQ;EACjC,0BAA0B,QAAQ;CACpC,CAAC,CAAC,KAAK,GAAG;AACZ;;;AC9FA,IAAa,sBAAsB,CAAC,mBAAG,IAAI,IAAI;CAC7C,GAAG,OAAO,OAAO,wBAAwB,CAAC,CAAC,QAAQ,gBAAgB;CACnE,GAAG,OAAO,OAAO,wBAAwB,CAAC,CAAC,QAAQ,gBAAgB;CACnE,GAAG,OAAO,OAAO,wBAAwB,CAAC,CAAC,QAAQ,gBAAgB;CACnE,GAAG,OAAO,OAAO,wBAAwB,CAAC,CAAC,QAAQ,gBAAgB;CACnE,GAAG,OAAO,OAAO,yBAAyB,CAAC,CAAC,QAAQ,gBAAgB;CACpE,GAAG,OAAO,OAAO,0BAA0B,CAAC,CAAC,QAAQ,gBAAgB;CAErE,GAAG,OAAO,OAAO,yBAAyB,CAAC,CAAC,QAAQ,gBAAgB;CAEpE,GAAG,iBAAiB,iBAAiB;CACrC,GAAG,iBAAiB,6BAA6B;CACjD,GAAG,iBAAiB,mBAAmB;CACvC,GAAG,iBAAiB,6BAA6B;AACnD,CAAC,CAAC;;;AC1BF,IAAa,oBAAoB,wBAAwB,OAAO,KAAK,KAAK;CACxE,MAAM;CACN,UAAU;CACV,cAAc,CAAC,YAAY;AAC7B,CAAC"}