@feugene/granularity 0.22.0 → 0.24.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/dist/chunks/config-BFJIxE8b.js +62 -0
  2. package/dist/chunks/config-BFJIxE8b.js.map +1 -0
  3. package/dist/chunks/{config-DBQQT-WP.js → config-BIa3ilQm.js} +18 -3
  4. package/dist/chunks/config-BIa3ilQm.js.map +1 -0
  5. package/dist/chunks/config-BSyiFlbi2.js.map +1 -0
  6. package/dist/chunks/config-BViooYNv2.js.map +1 -0
  7. package/dist/chunks/config-BoNR7_PD.js.map +1 -0
  8. package/dist/chunks/{config-Be9k9bOf.js → config-C8tVRv8i.js} +16 -2
  9. package/dist/chunks/config-C8tVRv8i.js.map +1 -0
  10. package/dist/chunks/{config-Bm_Sovla.js → config-DYgfMrIF.js} +14 -2
  11. package/dist/chunks/config-DYgfMrIF.js.map +1 -0
  12. package/dist/chunks/config-rkcKArZQ2.js +86 -0
  13. package/dist/chunks/config-rkcKArZQ2.js.map +1 -0
  14. package/dist/chunks/config-vSji8w902.js.map +1 -0
  15. package/dist/chunks/{trending-up-Bf9AQmoq.js → deltaTone-B5OoS1vo.js} +19 -1
  16. package/dist/chunks/deltaTone-B5OoS1vo.js.map +1 -0
  17. package/dist/chunks/{generated-CiCrGDQO.js → generated-1WEi10KK.js} +89 -6
  18. package/dist/chunks/{generated-CiCrGDQO.js.map → generated-1WEi10KK.js.map} +1 -1
  19. package/dist/chunks/{granular-provider-CYroWMjO.js → granular-provider-Dr2PKgl1.js} +13 -11
  20. package/dist/chunks/granular-provider-Dr2PKgl1.js.map +1 -0
  21. package/dist/components/GrCard/chunks/{GrCard-Bc7nRfbe.js → GrCard-gI2wA8ZZ.js} +8 -2
  22. package/dist/components/GrCard/chunks/GrCard-gI2wA8ZZ.js.map +1 -0
  23. package/dist/components/GrCard/index.js +2 -2
  24. package/dist/components/GrCollapse/chunks/{GrCollapse-C1rCfbc0.js → GrCollapse-DIHEiTju.js} +1 -1
  25. package/dist/components/GrCollapse/chunks/{GrCollapse-C1rCfbc0.js.map → GrCollapse-DIHEiTju.js.map} +1 -1
  26. package/dist/components/GrCollapse/index.js +1 -1
  27. package/dist/components/GrDelta/chunks/GrDelta-NE5HhXoo.js +0 -0
  28. package/dist/components/GrDelta/chunks/GrDelta-NE5HhXoo.js.map +1 -0
  29. package/dist/components/GrDelta/index.js +4 -3
  30. package/dist/components/GrDescriptionList/chunks/{GrDescriptionList-pXh1LZEe.js → GrDescriptionList-C6Pxjjbh.js} +21 -6
  31. package/dist/components/GrDescriptionList/chunks/GrDescriptionList-C6Pxjjbh.js.map +1 -0
  32. package/dist/components/GrDescriptionList/index.js +2 -2
  33. package/dist/components/GrDropdown/index.js +1 -1
  34. package/dist/components/GrEmptyState/chunks/{GrEmptyState-CS9do8eM.js → GrEmptyState-BGUX8O0U.js} +1 -1
  35. package/dist/components/GrEmptyState/chunks/{GrEmptyState-CS9do8eM.js.map → GrEmptyState-BGUX8O0U.js.map} +1 -1
  36. package/dist/components/GrEmptyState/index.js +2 -2
  37. package/dist/components/GrFilePreview/chunks/{GrFilePreview-rbE3zL9w.js → GrFilePreview-D0Bt-0nn.js} +1 -1
  38. package/dist/components/GrFilePreview/chunks/{GrFilePreview-rbE3zL9w.js.map → GrFilePreview-D0Bt-0nn.js.map} +1 -1
  39. package/dist/components/GrFilePreview/index.js +2 -2
  40. package/dist/components/GrList/chunks/{GrList-BRYhpqIe.js → GrList-DAtzVIHh.js} +1 -1
  41. package/dist/components/GrList/chunks/{GrList-BRYhpqIe.js.map → GrList-DAtzVIHh.js.map} +1 -1
  42. package/dist/components/GrList/index.js +1 -1
  43. package/dist/components/GrLoading/chunks/{GrLoading-C3DZSSuh.js → GrLoading-DeBFTvFX.js} +1 -1
  44. package/dist/components/GrLoading/chunks/GrLoading-DeBFTvFX.js.map +1 -0
  45. package/dist/components/GrLoading/index.js +1 -1
  46. package/dist/components/GrPopover/index.js +1 -1
  47. package/dist/components/GrSegmented/chunks/{GrSegmented-D1mjxF_O.js → GrSegmented-DKpo3cnC.js} +30 -5
  48. package/dist/components/GrSegmented/chunks/GrSegmented-DKpo3cnC.js.map +1 -0
  49. package/dist/components/GrSegmented/index.js +1 -1
  50. package/dist/components/GrSortableList/chunks/{GrSortableList-DPjxilmN.js → GrSortableList-BmcUVAMb.js} +1 -1
  51. package/dist/components/GrSortableList/chunks/{GrSortableList-DPjxilmN.js.map → GrSortableList-BmcUVAMb.js.map} +1 -1
  52. package/dist/components/GrSortableList/index.js +1 -1
  53. package/dist/components/GrStatistic/chunks/{GrStatistic-DkzWUAw1.js → GrStatistic-BJQv5aOS.js} +60 -29
  54. package/dist/components/GrStatistic/chunks/GrStatistic-BJQv5aOS.js.map +1 -0
  55. package/dist/components/GrStatistic/index.js +2 -2
  56. package/dist/components/GrSwitch/chunks/{GrSwitch-x_vQQ6ao.js → GrSwitch-CHiIj9GT.js} +1 -1
  57. package/dist/components/GrSwitch/chunks/{GrSwitch-x_vQQ6ao.js.map → GrSwitch-CHiIj9GT.js.map} +1 -1
  58. package/dist/components/GrSwitch/index.js +2 -2
  59. package/dist/components/GrValue/chunks/GrValue-CZsuZ4x-.js +38 -0
  60. package/dist/components/GrValue/chunks/GrValue-CZsuZ4x-.js.map +1 -0
  61. package/dist/components/GrValue/index.js +3 -0
  62. package/dist/directives/loading.js +1 -1
  63. package/dist/granular-provider-node.js +1 -1
  64. package/dist/granular-provider.js +1 -1
  65. package/dist/index.js +24 -21
  66. package/dist/styles/themes/dark.css +11 -6
  67. package/dist/styles/themes/light.css +5 -0
  68. package/dist/theme.js +1 -1
  69. package/dist/tokens.js +1 -1
  70. package/dist/types/components/GrCard/grCardStyles.d.ts +11 -0
  71. package/dist/types/components/GrDelta/grDeltaStyles.d.ts +13 -1
  72. package/dist/types/components/GrDelta/index.d.ts +1 -0
  73. package/dist/types/components/GrDescriptionList/GrDescriptionList.vue.d.ts +6 -2
  74. package/dist/types/components/GrDescriptionList/grDescriptionListStyles.d.ts +41 -6
  75. package/dist/types/components/GrFilePreview/index.d.ts +1 -0
  76. package/dist/types/components/GrInput/GrInput.vue.d.ts +1 -1
  77. package/dist/types/components/GrNumberInput/GrNumberInput.vue.d.ts +1 -1
  78. package/dist/types/components/GrPromptDialog/GrPromptDialog.vue.d.ts +1 -1
  79. package/dist/types/components/GrStatistic/GrStatistic.vue.d.ts +17 -7
  80. package/dist/types/components/GrStatistic/defaults.d.ts +6 -0
  81. package/dist/types/components/GrStatistic/grStatisticStyles.d.ts +9 -0
  82. package/dist/types/components/GrValue/GrValue.vue.d.ts +51 -0
  83. package/dist/types/components/GrValue/config.d.ts +1 -0
  84. package/dist/types/components/GrValue/grValueStyles.d.ts +34 -0
  85. package/dist/types/components/GrValue/index.d.ts +5 -0
  86. package/dist/types/components/GrValue/safelist.d.ts +1 -0
  87. package/dist/types/components/shared/truncationTitle.d.ts +16 -0
  88. package/dist/types/granular-provider/shared.d.ts +1 -0
  89. package/dist/types/index.d.ts +2 -0
  90. package/dist/types/internal/granularityFormat.d.ts +26 -0
  91. package/dist/web-types.json +69 -4
  92. package/package.json +5 -1
  93. package/tokens/themes/dark.json +26 -6
  94. package/tokens/themes/light.json +20 -0
  95. package/dist/chunks/config-BSyiFlbi.js.map +0 -1
  96. package/dist/chunks/config-BViooYNv.js.map +0 -1
  97. package/dist/chunks/config-Be9k9bOf.js.map +0 -1
  98. package/dist/chunks/config-Bm_Sovla.js.map +0 -1
  99. package/dist/chunks/config-BoNR7_PD2.js.map +0 -1
  100. package/dist/chunks/config-DBQQT-WP.js.map +0 -1
  101. package/dist/chunks/config-jyZq8XKL.js +0 -58
  102. package/dist/chunks/config-jyZq8XKL.js.map +0 -1
  103. package/dist/chunks/config-vSji8w90.js.map +0 -1
  104. package/dist/chunks/granular-provider-CYroWMjO.js.map +0 -1
  105. package/dist/chunks/trending-up-Bf9AQmoq.js.map +0 -1
  106. package/dist/components/GrCard/chunks/GrCard-Bc7nRfbe.js.map +0 -1
  107. package/dist/components/GrDelta/chunks/GrDelta-BMmpYz8K.js +0 -0
  108. package/dist/components/GrDelta/chunks/GrDelta-BMmpYz8K.js.map +0 -1
  109. package/dist/components/GrDescriptionList/chunks/GrDescriptionList-pXh1LZEe.js.map +0 -1
  110. package/dist/components/GrLoading/chunks/GrLoading-C3DZSSuh.js.map +0 -1
  111. package/dist/components/GrSegmented/chunks/GrSegmented-D1mjxF_O.js.map +0 -1
  112. package/dist/components/GrStatistic/chunks/GrStatistic-DkzWUAw1.js.map +0 -1
  113. /package/dist/chunks/{config-BSyiFlbi.js → config-BSyiFlbi2.js} +0 -0
  114. /package/dist/chunks/{config-BViooYNv.js → config-BViooYNv2.js} +0 -0
  115. /package/dist/chunks/{config-BoNR7_PD2.js → config-BoNR7_PD.js} +0 -0
  116. /package/dist/chunks/{config-vSji8w90.js → config-vSji8w902.js} +0 -0
@@ -0,0 +1,62 @@
1
+ import { t as splitClassTokens } from "./classTokens-BzazaERD.js";
2
+ import { defineGranularComponent } from "@feugene/unocss-preset-granular/contract";
3
+ //#region src/components/GrValue/grValueStyles.ts
4
+ /**
5
+ * Классы `GrValue`.
6
+ *
7
+ * Оформление аффиксов задаётся токенами, а не решением компонента. Раньше это
8
+ * решение было зашито: префикс набирался как число, суффикс — как единица
9
+ * измерения. Для `$14,99` и `42 %` правило верное, но доменное: рубль пишут
10
+ * справа (`1 284 500 ₽`), и в роли суффикса он получал вид подписи.
11
+ *
12
+ * Дефолты сохраняют прежний вид, поэтому потребителю, которого он устраивал,
13
+ * менять нечего.
14
+ */
15
+ /**
16
+ * Величина набирается кеглем и цветом того места, где стоит: своей шкалы у
17
+ * примитива нет. `tabular-nums` держит ширину строки, когда число меняется.
18
+ */
19
+ var valueRootClass = "inline-flex items-baseline tabular-nums";
20
+ /**
21
+ * Префикс — часть записи величины: по умолчанию её цвет, её кегль, вплотную.
22
+ * `inherit` в фолбэке и делает «по умолчанию» наследованием, а не копией: тон
23
+ * задаётся один раз на родителе и доезжает сюда сам.
24
+ */
25
+ var valuePrefixClass = [
26
+ "leading-none",
27
+ "text-[var(--gr-value-prefix-color,inherit)]",
28
+ "text-[length:var(--gr-value-prefix-size,inherit)]",
29
+ "me-[var(--gr-value-prefix-gap,0)]"
30
+ ].join(" ");
31
+ /**
32
+ * Суффикс по умолчанию — единица измерения: приглушён, на ступень мельче и
33
+ * отбит от числа.
34
+ *
35
+ * `leading-none` обязателен вместе с уменьшенным кеглем: межстрочный
36
+ * наследуется от величины и рассчитан на её размер, а выровненная по базовой
37
+ * линии приписка со своим меньшим кеглем растягивала бы им всю строку.
38
+ *
39
+ * Логический `me`/`ms` вместо `mr`/`ml`: в RTL отбивка обязана встать с другой
40
+ * стороны, иначе суффикс прилипнет к числу.
41
+ */
42
+ var valueSuffixClass = [
43
+ "leading-none",
44
+ "text-[var(--gr-value-suffix-color,var(--gr-muted-fg))]",
45
+ "text-[length:var(--gr-value-suffix-size,0.85em)]",
46
+ "ms-[var(--gr-value-suffix-gap,0.25rem)]"
47
+ ].join(" ");
48
+ //#endregion
49
+ //#region src/components/GrValue/safelist.ts
50
+ var grValueSafelist = [.../* @__PURE__ */ new Set([
51
+ ...splitClassTokens(valueRootClass),
52
+ ...splitClassTokens(valuePrefixClass),
53
+ ...splitClassTokens(valueSuffixClass)
54
+ ])];
55
+ //#endregion
56
+ //#region src/components/GrValue/config.ts
57
+ var grValueConfig = defineGranularComponent(import.meta.url, {
58
+ name: "GrValue",
59
+ safelist: grValueSafelist
60
+ });
61
+ //#endregion
62
+ export { valueSuffixClass as a, valueRootClass as i, grValueSafelist as n, valuePrefixClass as r, grValueConfig as t };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-BFJIxE8b.js","names":[],"sources":["../../src/components/GrValue/grValueStyles.ts","../../src/components/GrValue/safelist.ts","../../src/components/GrValue/config.ts"],"sourcesContent":["/**\n * Классы `GrValue`.\n *\n * Оформление аффиксов задаётся токенами, а не решением компонента. Раньше это\n * решение было зашито: префикс набирался как число, суффикс — как единица\n * измерения. Для `$14,99` и `42 %` правило верное, но доменное: рубль пишут\n * справа (`1 284 500 ₽`), и в роли суффикса он получал вид подписи.\n *\n * Дефолты сохраняют прежний вид, поэтому потребителю, которого он устраивал,\n * менять нечего.\n */\n\n/**\n * Величина набирается кеглем и цветом того места, где стоит: своей шкалы у\n * примитива нет. `tabular-nums` держит ширину строки, когда число меняется.\n */\nexport const valueRootClass = 'inline-flex items-baseline tabular-nums'\n\n/**\n * Префикс — часть записи величины: по умолчанию её цвет, её кегль, вплотную.\n * `inherit` в фолбэке и делает «по умолчанию» наследованием, а не копией: тон\n * задаётся один раз на родителе и доезжает сюда сам.\n */\nexport const valuePrefixClass = [\n 'leading-none',\n 'text-[var(--gr-value-prefix-color,inherit)]',\n 'text-[length:var(--gr-value-prefix-size,inherit)]',\n 'me-[var(--gr-value-prefix-gap,0)]',\n].join(' ')\n\n/**\n * Суффикс по умолчанию — единица измерения: приглушён, на ступень мельче и\n * отбит от числа.\n *\n * `leading-none` обязателен вместе с уменьшенным кеглем: межстрочный\n * наследуется от величины и рассчитан на её размер, а выровненная по базовой\n * линии приписка со своим меньшим кеглем растягивала бы им всю строку.\n *\n * Логический `me`/`ms` вместо `mr`/`ml`: в RTL отбивка обязана встать с другой\n * стороны, иначе суффикс прилипнет к числу.\n */\nexport const valueSuffixClass = [\n 'leading-none',\n 'text-[var(--gr-value-suffix-color,var(--gr-muted-fg))]',\n 'text-[length:var(--gr-value-suffix-size,0.85em)]',\n 'ms-[var(--gr-value-suffix-gap,0.25rem)]',\n].join(' ')\n","import { splitClassTokens } from '../shared/classTokens'\n\nimport { valuePrefixClass, valueRootClass, valueSuffixClass } from './grValueStyles'\n\n// Классы живут в `.ts`-хелпере: на сборке он уезжает в общий чанк, который скан\n// пресета не видит. Ссылками на конст, а не копиями строк — копия разойдётся.\nexport const grValueSafelist = [...new Set([\n ...splitClassTokens(valueRootClass),\n ...splitClassTokens(valuePrefixClass),\n ...splitClassTokens(valueSuffixClass),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grValueSafelist } from './safelist'\n\nexport const grValueConfig = defineGranularComponent(import.meta.url, {\n name: 'GrValue',\n safelist: grValueSafelist,\n})\n"],"mappings":";;;;;;;;;;;;;;;;;;AAgBA,IAAa,iBAAiB;;;;;;AAO9B,IAAa,mBAAmB;CAC9B;CACA;CACA;CACA;AACF,CAAC,CAAC,KAAK,GAAG;;;;;;;;;;;;AAaV,IAAa,mBAAmB;CAC9B;CACA;CACA;CACA;AACF,CAAC,CAAC,KAAK,GAAG;;;ACxCV,IAAa,kBAAkB,CAAC,mBAAG,IAAI,IAAI;CACzC,GAAG,iBAAiB,cAAc;CAClC,GAAG,iBAAiB,gBAAgB;CACpC,GAAG,iBAAiB,gBAAgB;AACtC,CAAC,CAAC;;;ACNF,IAAa,gBAAgB,wBAAwB,OAAO,KAAK,KAAK;CACpE,MAAM;CACN,UAAU;AACZ,CAAC"}
@@ -15,8 +15,23 @@ import { defineGranularComponent } from "@feugene/unocss-preset-granular/contrac
15
15
  * читается как опечатка. Отбивку получают только стрелка и суффикс.
16
16
  */
17
17
  var deltaRootClass = "inline-flex items-baseline tabular-nums";
18
+ /**
19
+ * Величина стоит **в строке текста**, и приписка при ней приглушения не
20
+ * получает: «−15 %» набирается кеглем и цветом строки целиком, иначе процент
21
+ * оказывается мельче окружающих слов.
22
+ *
23
+ * Дефолт `GrValue` рассчитан на плитку, где величина крупная и приписке есть
24
+ * куда уменьшаться. Здесь он переопределяется — ровно теми же токенами, что
25
+ * доступны потребителю.
26
+ *
27
+ * `currentColor` и `1em`, а не `inherit`: у пользовательского свойства
28
+ * `inherit` значит «наследовать саму переменную», то есть ничего.
29
+ */
30
+ var deltaValueStyle = {
31
+ "--gr-value-suffix-color": "currentColor",
32
+ "--gr-value-suffix-size": "1em"
33
+ };
18
34
  /** Суффикс — единица измерения, и от числа он отбивается: «−15 %», «120 мс». */
19
- var deltaSuffixClass = "ml-1";
20
35
  /**
21
36
  * Стрелка выравнивается по строке, а не по базовой линии: у svg её нет.
22
37
  *
@@ -52,7 +67,6 @@ var grDeltaSafelist = [.../* @__PURE__ */ new Set([
52
67
  ...splitClassTokens(deltaRootClass),
53
68
  ...splitClassTokens(deltaEmptyClass),
54
69
  ...splitClassTokens(deltaArrowClass),
55
- ...splitClassTokens(deltaSuffixClass),
56
70
  ...Object.values(deltaToneClass).flatMap(splitClassTokens),
57
71
  ...Object.values(deltaSizeClass).flatMap(splitClassTokens)
58
72
  ])];
@@ -60,7 +74,8 @@ var grDeltaSafelist = [.../* @__PURE__ */ new Set([
60
74
  //#region src/components/GrDelta/config.ts
61
75
  var grDeltaConfig = defineGranularComponent(import.meta.url, {
62
76
  name: "GrDelta",
77
+ dependencies: ["GrValue"],
63
78
  safelist: grDeltaSafelist
64
79
  });
65
80
  //#endregion
66
- export { deltaRootClass as a, deltaToneClass as c, deltaEmptyClass as i, grDeltaSafelist as n, deltaSizeClass as o, deltaArrowClass as r, deltaSuffixClass as s, grDeltaConfig as t };
81
+ export { deltaRootClass as a, deltaValueStyle as c, deltaEmptyClass as i, grDeltaSafelist as n, deltaSizeClass as o, deltaArrowClass as r, deltaToneClass as s, grDeltaConfig as t };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-BIa3ilQm.js","names":[],"sources":["../../src/components/GrDelta/grDeltaStyles.ts","../../src/components/GrDelta/safelist.ts","../../src/components/GrDelta/config.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nimport type { GrDeltaTone } from './deltaTone'\n\n/**\n * Классы `GrDelta`.\n *\n * Тон перечислен целиком по одному литералу на ветку: UnoCSS сканирует исходный\n * текст файла, и собранное шаблонной строкой имя (`text-[var(--gr-${tone}-text)]`)\n * уехало бы в CSS литералом.\n */\n\n/**\n * Величина стоит в строке текста, поэтому наследует её кегль и выравнивание.\n *\n * Общего `gap` нет намеренно: префикс — это валюта, и «$ 12,50» с зазором\n * читается как опечатка. Отбивку получают только стрелка и суффикс.\n */\nexport const deltaRootClass = 'inline-flex items-baseline tabular-nums'\n\n/**\n * Величина стоит **в строке текста**, и приписка при ней приглушения не\n * получает: «−15 %» набирается кеглем и цветом строки целиком, иначе процент\n * оказывается мельче окружающих слов.\n *\n * Дефолт `GrValue` рассчитан на плитку, где величина крупная и приписке есть\n * куда уменьшаться. Здесь он переопределяется — ровно теми же токенами, что\n * доступны потребителю.\n *\n * `currentColor` и `1em`, а не `inherit`: у пользовательского свойства\n * `inherit` значит «наследовать саму переменную», то есть ничего.\n */\nexport const deltaValueStyle: Record<string, string> = {\n '--gr-value-suffix-color': 'currentColor',\n '--gr-value-suffix-size': '1em',\n}\n\n/** Суффикс — единица измерения, и от числа он отбивается: «−15 %», «120 мс». */\n\n/**\n * Стрелка выравнивается по строке, а не по базовой линии: у svg её нет.\n *\n * Размер — в `em`, потому что на ступени `md` кегля у величины нет вовсе:\n * пиксельная лестница оставила бы стрелку 14-пиксельной внутри заголовка.\n * Чуть меньше единицы: стрелка декоративна, и равный вес спорил бы с самим\n * числом.\n */\nexport const deltaArrowClass = 'mr-0.5 self-center shrink-0 h-[0.875em] w-[0.875em]'\n\nexport const deltaToneClass: Record<GrDeltaTone, string> = {\n success: 'text-[var(--gr-success-text)]',\n danger: 'text-[var(--gr-danger-text)]',\n neutral: 'text-[var(--gr-muted-fg)]',\n}\n\n/** Прочерк вместо величины: тона у него нет, но и цвет основного текста ему не нужен. */\nexport const deltaEmptyClass = 'text-[var(--gr-muted-fg)]'\n\n/**\n * `md` пуст намеренно: на ступени по умолчанию величина набирается кеглем той\n * строки, в которой стоит. Фиксированные 13 px разъезжаются и вверх, и вниз —\n * внутри заголовка величина оставалась бы мелкой, в подписи под графиком\n * крупной. Ступени по краям остаются явными: они нужны, когда величина стоит\n * не в предложении, а в ряду с контролами.\n */\nexport const deltaSizeClass: Record<GrComponentSize, string> = {\n xs: 'text-[length:var(--gr-control-text-xs)]',\n sm: 'text-[length:var(--gr-control-text-sm)]',\n md: '',\n lg: 'text-[length:var(--gr-control-text-lg)]',\n}\n","import { splitClassTokens } from '../shared/classTokens'\n\nimport {\n deltaArrowClass,\n deltaEmptyClass,\n deltaRootClass,\n deltaSizeClass,\n deltaToneClass,\n} from './grDeltaStyles'\n\n// Классы из вычисляемых мап (тон, размер) UnoCSS сканом не находит — только\n// safelist. Литералы хелпера туда же: на сборке он уезжает в общий чанк.\nexport const grDeltaSafelist = [...new Set([\n ...splitClassTokens(deltaRootClass),\n ...splitClassTokens(deltaEmptyClass),\n ...splitClassTokens(deltaArrowClass),\n ...Object.values(deltaToneClass).flatMap(splitClassTokens),\n ...Object.values(deltaSizeClass).flatMap(splitClassTokens),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grDeltaSafelist } from './safelist'\n\nexport const grDeltaConfig = defineGranularComponent(import.meta.url, {\n name: 'GrDelta',\n dependencies: ['GrValue'],\n safelist: grDeltaSafelist,\n})\n"],"mappings":";;;;;;;;;;;;;;;;AAkBA,IAAa,iBAAiB;;;;;;;;;;;;;AAc9B,IAAa,kBAA0C;CACrD,2BAA2B;CAC3B,0BAA0B;AAC5B;;;;;;;;;;AAYA,IAAa,kBAAkB;AAE/B,IAAa,iBAA8C;CACzD,SAAS;CACT,QAAQ;CACR,SAAS;AACX;;AAGA,IAAa,kBAAkB;;;;;;;;AAS/B,IAAa,iBAAkD;CAC7D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;AC1DA,IAAa,kBAAkB,CAAC,mBAAG,IAAI,IAAI;CACzC,GAAG,iBAAiB,cAAc;CAClC,GAAG,iBAAiB,eAAe;CACnC,GAAG,iBAAiB,eAAe;CACnC,GAAG,OAAO,OAAO,cAAc,CAAC,CAAC,QAAQ,gBAAgB;CACzD,GAAG,OAAO,OAAO,cAAc,CAAC,CAAC,QAAQ,gBAAgB;AAC3D,CAAC,CAAC;;;ACdF,IAAa,gBAAgB,wBAAwB,OAAO,KAAK,KAAK;CACpE,MAAM;CACN,cAAc,CAAC,SAAS;CACxB,UAAU;AACZ,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-BSyiFlbi2.js","names":[],"sources":["../../src/components/GrPopover/safelist.ts","../../src/components/GrPopover/config.ts"],"sourcesContent":["import { splitClassTokens } from '../shared/classTokens'\nimport { originClassByPlacement, panelSizes, popoverPanelBaseClass } from './grPopoverStyles'\n\nexport const grPopoverSafelist = [...new Set([\n ...Object.values(panelSizes).flatMap(splitClassTokens),\n ...Object.values(originClassByPlacement).flatMap(splitClassTokens),\n // Базовый класс живёт литералом в `grPopoverStyles.ts`, а такой хелпер на\n // сборке уезжает в общий чанк, которого скан не видит (см. gotchas.md §2).\n ...splitClassTokens(popoverPanelBaseClass),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grPopoverSafelist } from './safelist'\n\nexport const grPopoverConfig = defineGranularComponent(import.meta.url, {\n name: 'GrPopover',\n safelist: grPopoverSafelist,\n})\n"],"mappings":";;;;AAGA,IAAa,oBAAoB,CAAC,mBAAG,IAAI,IAAI;CAC3C,GAAG,OAAO,OAAO,UAAU,CAAC,CAAC,QAAQ,gBAAgB;CACrD,GAAG,OAAO,OAAO,sBAAsB,CAAC,CAAC,QAAQ,gBAAgB;CAGjE,GAAG,iBAAiB,qBAAqB;AAC3C,CAAC,CAAC;;;ACLF,IAAa,kBAAkB,wBAAwB,OAAO,KAAK,KAAK;CACtE,MAAM;CACN,UAAU;AACZ,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-BViooYNv2.js","names":[],"sources":["../../src/components/GrDropdown/safelist.ts","../../src/components/GrDropdown/config.ts"],"sourcesContent":["import { splitClassTokens } from '../shared/classTokens'\nimport {\n dropdownContentBaseClass,\n originClassByPlacement,\n} from './grDropdownStyles'\n\n// И динамические токены (`resolvedPlacement`), и литералы отделки панели:\n// `grDropdownStyles.ts` уезжает в общий `dist/chunks/`, вне области скана\n// компонента — гейт `src/__tests__/safelist.test.ts`.\nexport const grDropdownSafelist = [...new Set([\n ...Object.values(originClassByPlacement).flatMap(v => splitClassTokens(v ?? '')),\n ...splitClassTokens(dropdownContentBaseClass),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grDropdownSafelist } from './safelist'\n\nexport const grDropdownConfig = defineGranularComponent(import.meta.url, {\n name: 'GrDropdown',\n safelist: grDropdownSafelist,\n})"],"mappings":";;;;AASA,IAAa,qBAAqB,CAAC,mBAAG,IAAI,IAAI,CAC5C,GAAG,OAAO,OAAO,sBAAsB,CAAC,CAAC,SAAQ,MAAK,iBAAiB,KAAK,EAAE,CAAC,GAC/E,GAAG,iBAAiB,wBAAwB,CAC9C,CAAC,CAAC;;;ACRF,IAAa,mBAAmB,wBAAwB,OAAO,KAAK,KAAK;CACvE,MAAM;CACN,UAAU;AACZ,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-BoNR7_PD.js","names":[],"sources":["../../src/components/GrSwitch/grSwitchStyles.ts","../../src/components/GrSwitch/safelist.ts","../../src/components/GrSwitch/config.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nexport type GrSwitchSize = GrComponentSize\n\n/** Сторона подписи относительно дорожки — логическая, не физическая (RTL). */\nexport const GR_SWITCH_LABEL_POSITIONS = ['start', 'end'] as const\nexport type GrSwitchLabelPosition = typeof GR_SWITCH_LABEL_POSITIONS[number]\n\ntype GrSwitchThumbClassOptions = {\n checked: boolean\n size: GrSwitchSize\n}\n\nexport const rootBase = 'inline-flex items-center gap-2 select-none disabled:cursor-not-allowed'\n\n/** `start` разворачивает ряд, а не меняет порядок узлов: DOM-порядок читает диктор. */\nexport const rootLabelPositions: Record<GrSwitchLabelPosition, string> = {\n start: 'flex-row-reverse',\n end: '',\n}\n\nexport const trackBase =\n 'relative inline-flex shrink-0 items-center rounded-[var(--gr-radius-full)] border border-[var(--gr-switch-track-brd)] transition-colors duration-[var(--gr-duration-fast)]'\n\nexport const trackSizes: Record<GrSwitchSize, string> = {\n xs: 'h-4 w-7',\n sm: 'h-5 w-9',\n md: 'h-6 w-11',\n lg: 'h-7 w-14',\n}\n\nexport const thumbBase =\n 'inline-flex shrink-0 items-center justify-center rounded-[var(--gr-radius-full)] bg-[var(--gr-card)] shadow-[var(--gr-shadow-1)] transition-transform duration-[var(--gr-duration-fast)]'\n\nexport const thumbSizes: Record<GrSwitchSize, string> = {\n xs: 'h-3 w-3',\n sm: 'h-4 w-4',\n md: 'h-5 w-5',\n lg: 'h-6 w-6',\n}\n\n/** Спиннер загрузки живёт в бегунке, поэтому мельче его на ступень. */\nexport const thumbSpinnerSizes: Record<GrSwitchSize, string> = {\n xs: 'h-2 w-2',\n sm: 'h-2.5 w-2.5',\n md: 'h-3 w-3',\n lg: 'h-4 w-4',\n}\n\nexport const thumbSpinnerBase = 'animate-spin text-[var(--gr-muted-fg)]'\n\n/**\n * Сдвиг бегунка по горизонтали.\n *\n * Бегунок — обычный флекс-ребёнок дорожки, поэтому сдвиг отсчитывается от её\n * **content-box**, а он на 2px уже внешнего размера: рамка по 1px с каждой\n * стороны. Отсюда и весь расчёт.\n *\n * Зазор по вертикали задан геометрией и равен 1px на всех ступенях\n * (`(content-height − thumb) / 2`, дорожка центрирует бегунок сама). Значит и по\n * горизонтали он обязан быть 1px: иначе бегунок в покое выглядит вдавленным\n * внутрь, а в крайнем положении прижатым к краю — именно так и было, зазоры\n * расходились на 1–2px у `xs`, `sm` и `lg`.\n *\n * | ступень | дорожка | content | бегунок | покой | крайнее |\n * | --- | --- | --- | --- | --- | --- |\n * | `xs` | 28 | 26 | 12 | 1 | 13 |\n * | `sm` | 36 | 34 | 16 | 1 | 17 |\n * | `md` | 44 | 42 | 20 | 1 | 21 |\n * | `lg` | 56 | 54 | 24 | 1 | 29 |\n *\n * Крайнее положение — `content − thumb − зазор`. Гейт на эту арифметику живёт в\n * `__tests__/GrSwitch.test.ts`: он считает её заново из `trackSizes`/`thumbSizes`,\n * поэтому смена любой ступени размера сразу покажет разъехавшийся зазор.\n */\nexport const thumbTranslations: Record<GrSwitchSize, { checked: string, unchecked: string }> = {\n xs: {\n checked: 'translate-x-[13px]',\n unchecked: 'translate-x-[1px]',\n },\n sm: {\n checked: 'translate-x-[17px]',\n unchecked: 'translate-x-[1px]',\n },\n md: {\n checked: 'translate-x-[21px]',\n unchecked: 'translate-x-[1px]',\n },\n lg: {\n checked: 'translate-x-[29px]',\n unchecked: 'translate-x-[1px]',\n },\n}\n\nexport const labelBase = 'text-[var(--gr-muted-fg)]'\n\n/**\n * Недоступность гасится токеном, а не `opacity`: прозрачность разбавляет\n * выверенные на AA токены текста и роняет контраст подписи.\n */\nexport const labelDisabledClass = 'text-[var(--gr-disabled-fg)]'\n\nexport const labelSizes: Record<GrSwitchSize, string> = {\n xs: 'text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)]',\n sm: 'text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)]',\n md: 'text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)]',\n lg: 'text-[length:var(--gr-text-base)] leading-[var(--gr-leading-base)]',\n}\n\nexport function grSwitchRootClass(labelPosition: GrSwitchLabelPosition): string {\n return [rootBase, rootLabelPositions[labelPosition]].filter(Boolean).join(' ')\n}\n\nexport function grSwitchTrackClass(size: GrSwitchSize): string {\n return [trackBase, trackSizes[size]].join(' ')\n}\n\nexport function grSwitchThumbClass(options: GrSwitchThumbClassOptions): string {\n return [\n thumbBase,\n thumbSizes[options.size],\n thumbTranslations[options.size][options.checked ? 'checked' : 'unchecked'],\n ].join(' ')\n}\n\nexport function grSwitchSpinnerClass(size: GrSwitchSize): string {\n return [thumbSpinnerBase, thumbSpinnerSizes[size]].join(' ')\n}\n\nexport function grSwitchLabelClass(size: GrSwitchSize, disabled = false): string {\n return [disabled ? labelDisabledClass : labelBase, labelSizes[size]].join(' ')\n}\n","import { splitClassTokens } from '../shared/classTokens'\nimport {\n labelBase,\n labelDisabledClass,\n labelSizes,\n rootBase,\n rootLabelPositions,\n thumbBase,\n thumbSizes,\n thumbSpinnerBase,\n thumbSpinnerSizes,\n thumbTranslations,\n trackBase,\n trackSizes,\n} from './grSwitchStyles'\n\nexport const grSwitchClassTokens = {\n rootBase: splitClassTokens(rootBase),\n rootLabelPositions: Object.values(rootLabelPositions).flatMap(splitClassTokens),\n trackBase: splitClassTokens(trackBase),\n trackSizes: Object.values(trackSizes).flatMap(splitClassTokens),\n thumbBase: splitClassTokens(thumbBase),\n thumbSizes: Object.values(thumbSizes).flatMap(splitClassTokens),\n thumbSpinner: [\n ...splitClassTokens(thumbSpinnerBase),\n ...Object.values(thumbSpinnerSizes).flatMap(splitClassTokens),\n ],\n thumbTranslations: Object.values(thumbTranslations).flatMap(({checked, unchecked}) => {\n return [...splitClassTokens(checked), ...splitClassTokens(unchecked)]\n }),\n labelBase: [...splitClassTokens(labelBase), ...splitClassTokens(labelDisabledClass)],\n labelSizes: Object.values(labelSizes).flatMap(splitClassTokens),\n} as const\n\nexport const grSwitchSafelist = [...new Set([\n ...grSwitchClassTokens.rootBase,\n ...grSwitchClassTokens.rootLabelPositions,\n ...grSwitchClassTokens.trackBase,\n ...grSwitchClassTokens.trackSizes,\n ...grSwitchClassTokens.thumbBase,\n ...grSwitchClassTokens.thumbSizes,\n ...grSwitchClassTokens.thumbSpinner,\n ...grSwitchClassTokens.thumbTranslations,\n ...grSwitchClassTokens.labelBase,\n ...grSwitchClassTokens.labelSizes,\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grSwitchSafelist } from './safelist'\n\nexport const grSwitchConfig = defineGranularComponent(import.meta.url, {\n name: 'GrSwitch',\n safelist: grSwitchSafelist,\n})"],"mappings":";;;AAaA,IAAa,WAAW;;AAGxB,IAAa,qBAA4D;CACrE,OAAO;CACP,KAAK;AACT;AAEA,IAAa,YACT;AAEJ,IAAa,aAA2C;CACpD,IAAI;CACN,IAAI;CACF,IAAI;CACJ,IAAI;AACR;AAEA,IAAa,YACT;AAEJ,IAAa,aAA2C;CACpD,IAAI;CACN,IAAI;CACF,IAAI;CACJ,IAAI;AACR;;AAGA,IAAa,oBAAkD;CAC3D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACR;AAEA,IAAa,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;AA0BhC,IAAa,oBAAkF;CAC3F,IAAI;EACA,SAAS;EACT,WAAW;CACf;CACA,IAAI;EACA,SAAS;EACT,WAAW;CACf;CACA,IAAI;EACA,SAAS;EACT,WAAW;CACf;CACA,IAAI;EACA,SAAS;EACT,WAAW;CACf;AACJ;AAEA,IAAa,YAAY;;;;;AAMzB,IAAa,qBAAqB;AAElC,IAAa,aAA2C;CACpD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACR;AAEA,SAAgB,kBAAkB,eAA8C;CAC5E,OAAO,CAAC,UAAU,mBAAmB,cAAc,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AACjF;AAEA,SAAgB,mBAAmB,MAA4B;CAC3D,OAAO,CAAC,WAAW,WAAW,KAAK,CAAC,CAAC,KAAK,GAAG;AACjD;AAEA,SAAgB,mBAAmB,SAA4C;CAC3E,OAAO;EACH;EACA,WAAW,QAAQ;EACnB,kBAAkB,QAAQ,KAAK,CAAC,QAAQ,UAAU,YAAY;CAClE,CAAC,CAAC,KAAK,GAAG;AACd;AAEA,SAAgB,qBAAqB,MAA4B;CAC7D,OAAO,CAAC,kBAAkB,kBAAkB,KAAK,CAAC,CAAC,KAAK,GAAG;AAC/D;AAEA,SAAgB,mBAAmB,MAAoB,WAAW,OAAe;CAC7E,OAAO,CAAC,WAAW,qBAAqB,WAAW,WAAW,KAAK,CAAC,CAAC,KAAK,GAAG;AACjF;;;ACnHA,IAAa,sBAAsB;CACjC,UAAU,iBAAiB,QAAQ;CACnC,oBAAoB,OAAO,OAAO,kBAAkB,CAAC,CAAC,QAAQ,gBAAgB;CAC9E,WAAW,iBAAiB,SAAS;CACrC,YAAY,OAAO,OAAO,UAAU,CAAC,CAAC,QAAQ,gBAAgB;CAC9D,WAAW,iBAAiB,SAAS;CACrC,YAAY,OAAO,OAAO,UAAU,CAAC,CAAC,QAAQ,gBAAgB;CAC9D,cAAc,CACZ,GAAG,iBAAiB,gBAAgB,GACpC,GAAG,OAAO,OAAO,iBAAiB,CAAC,CAAC,QAAQ,gBAAgB,CAC9D;CACA,mBAAmB,OAAO,OAAO,iBAAiB,CAAC,CAAC,SAAS,EAAC,SAAS,gBAAe;EACpF,OAAO,CAAC,GAAG,iBAAiB,OAAO,GAAG,GAAG,iBAAiB,SAAS,CAAC;CACtE,CAAC;CACD,WAAW,CAAC,GAAG,iBAAiB,SAAS,GAAG,GAAG,iBAAiB,kBAAkB,CAAC;CACnF,YAAY,OAAO,OAAO,UAAU,CAAC,CAAC,QAAQ,gBAAgB;AAChE;AAEA,IAAa,mBAAmB,CAAC,mBAAG,IAAI,IAAI;CAC1C,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;AACzB,CAAC,CAAC;;;ACzCF,IAAa,iBAAiB,wBAAwB,OAAO,KAAK,KAAK;CACrE,MAAM;CACN,UAAU;AACZ,CAAC"}
@@ -25,6 +25,20 @@ var statisticAffixSizeBySize = {
25
25
  md: "text-[length:var(--gr-text-base)]",
26
26
  lg: "text-[length:var(--gr-text-xl)]"
27
27
  };
28
+ /**
29
+ * Кегль приписки — значением токена, а не классом: он уезжает в
30
+ * `--gr-value-suffix-size`, которым `GrValue` и набирает суффикс.
31
+ *
32
+ * Ступень шкалы, а не доля от величины: у плитки шкала размеров своя, и на
33
+ * ступени `md` число крупное (`--gr-text-3xl`), а приписка при нём обязана
34
+ * остаться подписью. Доля дала бы её вровень с числом.
35
+ */
36
+ var statisticAffixSizeVarBySize = {
37
+ xs: "var(--gr-text-xs)",
38
+ sm: "var(--gr-text-xs)",
39
+ md: "var(--gr-text-base)",
40
+ lg: "var(--gr-text-xl)"
41
+ };
28
42
  var statisticPlaceholderHeightBySize = {
29
43
  xs: "22px",
30
44
  sm: "28px",
@@ -91,7 +105,7 @@ var grStatisticSafelist = [.../* @__PURE__ */ new Set([
91
105
  var grStatisticConfig = defineGranularComponent(import.meta.url, {
92
106
  name: "GrStatistic",
93
107
  safelist: grStatisticSafelist,
94
- dependencies: ["GrSkeleton"]
108
+ dependencies: ["GrSkeleton", "GrValue"]
95
109
  });
96
110
  //#endregion
97
- export { statisticRootClass as a, statisticTrendClassByTrend as c, statisticPlaceholderHeightBySize as i, statisticTrendSizeBySize as l, grStatisticSafelist as n, statisticTitleClass as o, statisticAffixSizeBySize as r, statisticTitleSizeBySize as s, grStatisticConfig as t, statisticValueClass as u };
111
+ export { statisticRootClass as a, statisticTrendClassByTrend as c, statisticPlaceholderHeightBySize as i, statisticTrendSizeBySize as l, grStatisticSafelist as n, statisticTitleClass as o, statisticAffixSizeVarBySize as r, statisticTitleSizeBySize as s, grStatisticConfig as t, statisticValueClass as u };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-C8tVRv8i.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 * Кегль приписки — значением токена, а не классом: он уезжает в\n * `--gr-value-suffix-size`, которым `GrValue` и набирает суффикс.\n *\n * Ступень шкалы, а не доля от величины: у плитки шкала размеров своя, и на\n * ступени `md` число крупное (`--gr-text-3xl`), а приписка при нём обязана\n * остаться подписью. Доля дала бы её вровень с числом.\n */\nexport const statisticAffixSizeVarBySize: Record<GrStatisticSize, string> = {\n xs: 'var(--gr-text-xs)',\n sm: 'var(--gr-text-xs)',\n md: 'var(--gr-text-base)',\n lg: '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 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 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 // Литералы из 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', 'GrValue'],\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;;;;;;;;;AAUA,IAAa,8BAA+D;CAC1E,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,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;;;ACxGA,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;CAGrE,GAAG,iBAAiB,iBAAiB;CACrC,GAAG,iBAAiB,6BAA6B;CACjD,GAAG,iBAAiB,mBAAmB;CACvC,GAAG,iBAAiB,6BAA6B;AACnD,CAAC,CAAC;;;ACxBF,IAAa,oBAAoB,wBAAwB,OAAO,KAAK,KAAK;CACxE,MAAM;CACN,UAAU;CACV,cAAc,CAAC,cAAc,SAAS;AACxC,CAAC"}
@@ -10,7 +10,7 @@ import { defineGranularComponent } from "@feugene/unocss-preset-granular/contrac
10
10
  */
11
11
  var surfaceBaseClass = "rounded-[var(--gr-radius-lg)] bg-[var(--gr-card)] text-[var(--gr-card-fg)]";
12
12
  var variantClass = {
13
- elevated: "border border-[var(--gr-brd)] shadow-sm",
13
+ elevated: "border border-[var(--gr-brd)] shadow-[var(--gr-shadow-1)]",
14
14
  outlined: "border border-[var(--gr-brd)]",
15
15
  ghost: ""
16
16
  };
@@ -22,6 +22,17 @@ var paddingClass = {
22
22
  };
23
23
  var sectionDividerTopClass = "border-t border-[var(--gr-brd)]";
24
24
  var sectionDividerBottomClass = "border-b border-[var(--gr-brd)]";
25
+ /**
26
+ * Отступ шапки, которую карточка рисует сама из `title`.
27
+ *
28
+ * Не берётся из `padding`: тот описывает **содержимое**, и дефолт `none` у него
29
+ * осмыслен — на `GrCard` стоят `GrCollapse` и `GrList`, а карточка с таблицей
30
+ * хочет её край в край. Заголовок же принадлежит самой карточке, и прижатым к
31
+ * рамке вместе с разделителем он выглядеть не должен ни при каком `padding`.
32
+ *
33
+ * По вертикали отступ меньше горизонтального: шапка — строка, а не блок.
34
+ */
35
+ var ownHeaderPaddingClass = "px-4 py-3";
25
36
  var cardTitleClass = "m-0 text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)] font-600";
26
37
  var cardDescriptionClass = "mt-1 text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)] text-[var(--gr-muted-fg)]";
27
38
  /** Интерактивная карточка целиком: ссылка или кнопка во всю поверхность. */
@@ -42,6 +53,7 @@ var grCardSafelist = [.../* @__PURE__ */ new Set([
42
53
  ...splitClassTokens(surfaceBaseClass),
43
54
  ...Object.values(variantClass).flatMap(splitClassTokens),
44
55
  ...Object.values(paddingClass).flatMap(splitClassTokens),
56
+ ...splitClassTokens(ownHeaderPaddingClass),
45
57
  ...splitClassTokens(sectionDividerTopClass),
46
58
  ...splitClassTokens(sectionDividerBottomClass),
47
59
  ...splitClassTokens(interactiveClass),
@@ -56,4 +68,4 @@ var grCardConfig = defineGranularComponent(import.meta.url, {
56
68
  safelist: grCardSafelist
57
69
  });
58
70
  //#endregion
59
- export { grCardRootClass as a, sectionDividerTopClass as c, cardTitleClass as i, grCardSafelist as n, paddingClass as o, cardDescriptionClass as r, sectionDividerBottomClass as s, grCardConfig as t };
71
+ export { grCardRootClass as a, sectionDividerBottomClass as c, cardTitleClass as i, sectionDividerTopClass as l, grCardSafelist as n, ownHeaderPaddingClass as o, cardDescriptionClass as r, paddingClass as s, grCardConfig as t };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-DYgfMrIF.js","names":[],"sources":["../../src/components/GrCard/grCardStyles.ts","../../src/components/GrCard/safelist.ts","../../src/components/GrCard/config.ts"],"sourcesContent":["export type GrCardPadding = 'none' | 'sm' | 'md' | 'lg'\nexport type GrCardVariant = 'elevated' | 'outlined' | 'ghost'\n\n/**\n * Классы `GrCard`.\n *\n * `elevated` — дефолт и ровно тот вид, что был у карточки до появления пропов:\n * `GrCollapse` и `GrList` рендерят содержимое внутрь `GrCard`, и любое смещение\n * дефолта поехало бы у них.\n */\n\nexport const surfaceBaseClass = 'rounded-[var(--gr-radius-lg)] bg-[var(--gr-card)] text-[var(--gr-card-fg)]'\n\nexport const variantClass: Record<GrCardVariant, string> = {\n // Тень — токеном, а не утилитой uno-шкалы: у той зашит свой полупрозрачный\n // цвет, темой он не настраивается, и на тёмном фоне тени не получалось вовсе\n // — карточка теряла подъём и держалась на одной рамке. Токен темозависим.\n // Имя утилиты здесь не пишется намеренно: UnoCSS сканирует текст файла и\n // сгенерировал бы класс прямо из комментария.\n elevated: 'border border-[var(--gr-brd)] shadow-[var(--gr-shadow-1)]',\n outlined: 'border border-[var(--gr-brd)]',\n // Карточка внутри карточки: вторая рамка только шумит.\n ghost: '',\n}\n\nexport const paddingClass: Record<GrCardPadding, string> = {\n none: '',\n sm: 'p-3',\n md: 'p-4',\n lg: 'p-6',\n}\n\nexport const sectionDividerTopClass = 'border-t border-[var(--gr-brd)]'\nexport const sectionDividerBottomClass = 'border-b border-[var(--gr-brd)]'\n\n/**\n * Отступ шапки, которую карточка рисует сама из `title`.\n *\n * Не берётся из `padding`: тот описывает **содержимое**, и дефолт `none` у него\n * осмыслен — на `GrCard` стоят `GrCollapse` и `GrList`, а карточка с таблицей\n * хочет её край в край. Заголовок же принадлежит самой карточке, и прижатым к\n * рамке вместе с разделителем он выглядеть не должен ни при каком `padding`.\n *\n * По вертикали отступ меньше горизонтального: шапка — строка, а не блок.\n */\nexport const ownHeaderPaddingClass = 'px-4 py-3'\n\n/**\n * Уровень заголовка карточки. `h1` намеренно нет: его задаёт страница, а\n * карточка — блок внутри уже существующей структуры.\n */\nexport const GR_CARD_HEADING_LEVELS = [2, 3, 4, 5, 6] as const\n\nexport type GrCardHeadingLevel = typeof GR_CARD_HEADING_LEVELS[number]\n\n// `m-0` — у нативного заголовка есть браузерные отступы, и без сброса шапка\n// разъезжается по вертикали.\nexport const cardTitleClass = 'm-0 text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)] font-600'\n\nexport const cardDescriptionClass = 'mt-1 text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)] text-[var(--gr-muted-fg)]'\n\n/** Интерактивная карточка целиком: ссылка или кнопка во всю поверхность. */\nexport const interactiveClass = 'block w-full text-left transition-colors duration-[var(--gr-duration-fast)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]'\n\nexport const hoverClass = 'cursor-pointer hover:bg-[var(--gr-muted)]'\n\nexport function grCardRootClass(options: {\n variant: GrCardVariant\n /** Падинг едет на корень, только пока нет секций — иначе лишняя обёртка. */\n padding: GrCardPadding\n interactive: boolean\n hoverable: boolean\n}): string {\n return [\n surfaceBaseClass,\n variantClass[options.variant],\n paddingClass[options.padding],\n options.interactive ? interactiveClass : '',\n options.interactive || options.hoverable ? hoverClass : '',\n ].filter(Boolean).join(' ')\n}\n","import { splitClassTokens } from '../shared/classTokens'\nimport {\n cardDescriptionClass,\n cardTitleClass,\n hoverClass,\n interactiveClass,\n ownHeaderPaddingClass,\n paddingClass,\n sectionDividerBottomClass,\n sectionDividerTopClass,\n surfaceBaseClass,\n variantClass,\n} from './grCardStyles'\n\nexport const grCardSafelist = [...new Set([\n ...splitClassTokens(surfaceBaseClass),\n ...Object.values(variantClass).flatMap(splitClassTokens),\n ...Object.values(paddingClass).flatMap(splitClassTokens),\n ...splitClassTokens(ownHeaderPaddingClass),\n ...splitClassTokens(sectionDividerTopClass),\n ...splitClassTokens(sectionDividerBottomClass),\n ...splitClassTokens(interactiveClass),\n ...splitClassTokens(hoverClass),\n ...splitClassTokens(cardTitleClass),\n ...splitClassTokens(cardDescriptionClass),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grCardSafelist } from './safelist'\n\nexport const grCardConfig = defineGranularComponent(import.meta.url, {\n name: 'GrCard',\n safelist: grCardSafelist,\n})\n"],"mappings":";;;;;;;;;;AAWA,IAAa,mBAAmB;AAEhC,IAAa,eAA8C;CAMzD,UAAU;CACV,UAAU;CAEV,OAAO;AACT;AAEA,IAAa,eAA8C;CACzD,MAAM;CACN,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,yBAAyB;AACtC,IAAa,4BAA4B;;;;;;;;;;;AAYzC,IAAa,wBAAwB;AAYrC,IAAa,iBAAiB;AAE9B,IAAa,uBAAuB;;AAGpC,IAAa,mBAAmB;AAEhC,IAAa,aAAa;AAE1B,SAAgB,gBAAgB,SAMrB;CACT,OAAO;EACL;EACA,aAAa,QAAQ;EACrB,aAAa,QAAQ;EACrB,QAAQ,cAAc,mBAAmB;EACzC,QAAQ,eAAe,QAAQ,YAAY,aAAa;CAC1D,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AAC5B;;;AClEA,IAAa,iBAAiB,CAAC,mBAAG,IAAI,IAAI;CACxC,GAAG,iBAAiB,gBAAgB;CACpC,GAAG,OAAO,OAAO,YAAY,CAAC,CAAC,QAAQ,gBAAgB;CACvD,GAAG,OAAO,OAAO,YAAY,CAAC,CAAC,QAAQ,gBAAgB;CACvD,GAAG,iBAAiB,qBAAqB;CACzC,GAAG,iBAAiB,sBAAsB;CAC1C,GAAG,iBAAiB,yBAAyB;CAC7C,GAAG,iBAAiB,gBAAgB;CACpC,GAAG,iBAAiB,UAAU;CAC9B,GAAG,iBAAiB,cAAc;CAClC,GAAG,iBAAiB,oBAAoB;AAC1C,CAAC,CAAC;;;ACrBF,IAAa,eAAe,wBAAwB,OAAO,KAAK,KAAK;CACnE,MAAM;CACN,UAAU;AACZ,CAAC"}
@@ -0,0 +1,86 @@
1
+ import { t as splitClassTokens } from "./classTokens-BzazaERD.js";
2
+ import { defineGranularComponent } from "@feugene/unocss-preset-granular/contract";
3
+ //#region src/components/GrDescriptionList/grDescriptionListStyles.ts
4
+ var descriptionRootClass = "m-0 gap-x-4 [row-gap:var(--gr-description-list-row-gap,0.375rem)]";
5
+ /** Сетка колонок — раскладки `inline` и `stacked`. */
6
+ var descriptionRootGridClass = "grid";
7
+ var descriptionRootFlowClass = "flex flex-wrap items-baseline";
8
+ /** Одна колонка — обычный класс: считать там нечего. */
9
+ var descriptionSingleColumnClass = "grid-cols-1";
10
+ /**
11
+ * Колонки по ширине **контейнера**, а не вьюпорта.
12
+ *
13
+ * Медиазапрос меряет экран, а список живёт в карточке: на широком мониторе в
14
+ * колонке 290px включались две колонки, подпись фиксированной ширины съедала
15
+ * почти всё место, и значение переносилось посимвольно — «30» печаталось как
16
+ * «3» и «0» на двух строках. Показанное число становилось неверным.
17
+ *
18
+ * `auto-fit` решает это без медиазапросов, без JS и без замеров, то есть
19
+ * одинаково на сервере и на клиенте. `columns` при этом становится **потолком**:
20
+ * трек не уже `column-min`, но и не уже доли, на которую делится контейнер при
21
+ * N колонках, — поэтому шире N штук не встанет никогда.
22
+ *
23
+ * `min(100%, …)` спасает совсем узкий контейнер: без него трек шириной с
24
+ * `column-min` вылезал бы за край.
25
+ *
26
+ * Инлайновым стилем, а не классом: выражение зависит от N, и шкалы утилит для
27
+ * него не существует — тот же довод, что записан у сетки `GrDashboard`.
28
+ */
29
+ function descriptionColumnsStyle(columns, labelWidth) {
30
+ const base = "var(--gr-description-list-column-min, 12rem)";
31
+ return { gridTemplateColumns: `repeat(auto-fit, minmax(min(100%, max(${labelWidth ? `max(${base}, calc(${labelWidth} + var(--gr-description-list-value-min, 5rem)))` : base}, (100% - ${columns - 1} * 1rem) / ${columns})), 1fr))` };
32
+ }
33
+ var descriptionPairInlineClass = "flex min-w-0 items-baseline gap-2";
34
+ var descriptionPairStackedClass = "min-w-0";
35
+ var descriptionPairFlowClass = "flex min-w-0 items-baseline gap-1";
36
+ var descriptionDividedClass = "border-b border-[var(--gr-description-list-divider,var(--gr-brd))] pb-1 last:border-b-0 last:pb-0";
37
+ var descriptionLabelInlineClass = "shrink-0 text-[var(--gr-description-list-label-color,var(--gr-muted-fg))]";
38
+ var descriptionLabelStackedClass = "text-[var(--gr-description-list-label-color,var(--gr-muted-fg))]";
39
+ var descriptionValueClass = "m-0 min-w-0 break-words";
40
+ /** Тон — только у значения: красная подпись читается как «поле сломано». */
41
+ var descriptionValueToneClass = {
42
+ primary: "text-[var(--gr-primary-text)]",
43
+ neutral: "",
44
+ success: "text-[var(--gr-success-text)]",
45
+ warning: "text-[var(--gr-warning-text)]",
46
+ danger: "text-[var(--gr-danger-text)]",
47
+ info: "text-[var(--gr-info-text)]",
48
+ slate: "text-[var(--gr-slate-text)]",
49
+ azure: "text-[var(--gr-azure-text)]"
50
+ };
51
+ var descriptionSizeClass = {
52
+ xs: "text-[length:var(--gr-control-text-2xs)]",
53
+ sm: "text-[length:var(--gr-control-text-xs)]",
54
+ md: "text-[length:var(--gr-control-text-sm)]",
55
+ lg: "text-[length:var(--gr-control-text-md)]"
56
+ };
57
+ var descriptionDensityClass = {
58
+ regular: "",
59
+ compact: "[row-gap:var(--gr-description-list-row-gap,0.125rem)]"
60
+ };
61
+ //#endregion
62
+ //#region src/components/GrDescriptionList/safelist.ts
63
+ var grDescriptionListSafelist = [.../* @__PURE__ */ new Set([
64
+ ...splitClassTokens(descriptionRootClass),
65
+ ...splitClassTokens(descriptionRootGridClass),
66
+ ...splitClassTokens(descriptionRootFlowClass),
67
+ ...splitClassTokens(descriptionPairInlineClass),
68
+ ...splitClassTokens(descriptionPairStackedClass),
69
+ ...splitClassTokens(descriptionPairFlowClass),
70
+ ...splitClassTokens(descriptionDividedClass),
71
+ ...splitClassTokens(descriptionLabelInlineClass),
72
+ ...splitClassTokens(descriptionLabelStackedClass),
73
+ ...splitClassTokens(descriptionValueClass),
74
+ ...splitClassTokens(descriptionSingleColumnClass),
75
+ ...Object.values(descriptionValueToneClass).flatMap(splitClassTokens),
76
+ ...Object.values(descriptionSizeClass).flatMap(splitClassTokens),
77
+ ...Object.values(descriptionDensityClass).flatMap(splitClassTokens)
78
+ ])];
79
+ //#endregion
80
+ //#region src/components/GrDescriptionList/config.ts
81
+ var grDescriptionListConfig = defineGranularComponent(import.meta.url, {
82
+ name: "GrDescriptionList",
83
+ safelist: grDescriptionListSafelist
84
+ });
85
+ //#endregion
86
+ export { descriptionValueToneClass as _, descriptionDividedClass as a, descriptionPairFlowClass as c, descriptionRootClass as d, descriptionRootFlowClass as f, descriptionValueClass as g, descriptionSizeClass as h, descriptionDensityClass as i, descriptionPairInlineClass as l, descriptionSingleColumnClass as m, grDescriptionListSafelist as n, descriptionLabelInlineClass as o, descriptionRootGridClass as p, descriptionColumnsStyle as r, descriptionLabelStackedClass as s, grDescriptionListConfig as t, descriptionPairStackedClass as u };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-rkcKArZQ2.js","names":[],"sources":["../../src/components/GrDescriptionList/grDescriptionListStyles.ts","../../src/components/GrDescriptionList/safelist.ts","../../src/components/GrDescriptionList/config.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\nimport type { GrTone } from '../shared/tones'\n\n/**\n * Классы `GrDescriptionList`.\n *\n * Тон перечислен целиком по одному литералу на ветку: UnoCSS сканирует исходный\n * текст файла, и собранное шаблонной строкой имя уехало бы в CSS литералом.\n */\n\n/**\n * `inline` — подпись колонкой слева; `stacked` — над значением; `flow` — пары\n * текут по строке с переносом.\n */\nexport type GrDescriptionLayout = 'inline' | 'stacked' | 'flow'\n\nexport type GrDescriptionDensity = 'regular' | 'compact'\n\n/** Сколько колонок пар. Длинный список читается в несколько. */\nexport type GrDescriptionColumns = 1 | 2 | 3 | 4\n\n// `m-0` — у нативного `<dl>` есть браузерные отступы, и без сброса список\n// разъезжается по вертикали. Ряды разводит `--gr-description-list-row-gap`,\n// потому что зазор здесь — точка кастомизации, а не ступень шкалы.\nexport const descriptionRootClass = 'm-0 gap-x-4 [row-gap:var(--gr-description-list-row-gap,0.375rem)]'\n\n/** Сетка колонок — раскладки `inline` и `stacked`. */\nexport const descriptionRootGridClass = 'grid'\n\n// `flow` строит строку, а не сетку: пары текут по ширине и переносятся сами,\n// поэтому колонок у неё нет.\nexport const descriptionRootFlowClass = 'flex flex-wrap items-baseline'\n\n/** Одна колонка — обычный класс: считать там нечего. */\nexport const descriptionSingleColumnClass = 'grid-cols-1'\n\n/**\n * Колонки по ширине **контейнера**, а не вьюпорта.\n *\n * Медиазапрос меряет экран, а список живёт в карточке: на широком мониторе в\n * колонке 290px включались две колонки, подпись фиксированной ширины съедала\n * почти всё место, и значение переносилось посимвольно — «30» печаталось как\n * «3» и «0» на двух строках. Показанное число становилось неверным.\n *\n * `auto-fit` решает это без медиазапросов, без JS и без замеров, то есть\n * одинаково на сервере и на клиенте. `columns` при этом становится **потолком**:\n * трек не уже `column-min`, но и не уже доли, на которую делится контейнер при\n * N колонках, — поэтому шире N штук не встанет никогда.\n *\n * `min(100%, …)` спасает совсем узкий контейнер: без него трек шириной с\n * `column-min` вылезал бы за край.\n *\n * Инлайновым стилем, а не классом: выражение зависит от N, и шкалы утилит для\n * него не существует — тот же довод, что записан у сетки `GrDashboard`.\n */\nexport function descriptionColumnsStyle(\n columns: GrDescriptionColumns,\n /**\n * Ширина колонки подписей при `inline`. В этой раскладке подпись и значение\n * стоят **рядом**, поэтому минимум колонки складывается из них двоих: колонка\n * шириной с одну подпись оставляет значению несколько пикселей, и оно\n * переносится посимвольно — тот же дефект, только в других числах.\n */\n labelWidth?: string,\n): Record<string, string> {\n const base = 'var(--gr-description-list-column-min, 12rem)'\n const min = labelWidth\n ? `max(${base}, calc(${labelWidth} + var(--gr-description-list-value-min, 5rem)))`\n : base\n\n return {\n gridTemplateColumns: `repeat(auto-fit, minmax(min(100%, max(${min}, (100% - ${columns - 1} * 1rem) / ${columns})), 1fr))`,\n }\n}\n\nexport const descriptionPairInlineClass = 'flex min-w-0 items-baseline gap-2'\nexport const descriptionPairStackedClass = 'min-w-0'\n\n// Зазор уже: подпись и значение здесь читаются как одна фраза «Сообщений: 3»,\n// а пары друг от друга отбивает `gap-x-4` корня.\nexport const descriptionPairFlowClass = 'flex min-w-0 items-baseline gap-1'\n\nexport const descriptionDividedClass = 'border-b border-[var(--gr-description-list-divider,var(--gr-brd))] pb-1 last:border-b-0 last:pb-0'\n\n// `shrink-0` держит колонку подписей ровной: иначе длинное значение сжимало бы\n// подпись, и значения переставали бы стоять в колонку — ровно то, ради чего\n// раскладка `inline` и существует.\nexport const descriptionLabelInlineClass = 'shrink-0 text-[var(--gr-description-list-label-color,var(--gr-muted-fg))]'\nexport const descriptionLabelStackedClass = 'text-[var(--gr-description-list-label-color,var(--gr-muted-fg))]'\n\n// `break-words` обязателен: в парах живут идентификаторы, хеши и `X-Request-Id`,\n// и без переноса они выталкивают вёрстку.\nexport const descriptionValueClass = 'm-0 min-w-0 break-words'\n\n/** Тон — только у значения: красная подпись читается как «поле сломано». */\nexport const descriptionValueToneClass: Record<GrTone, string> = {\n primary: 'text-[var(--gr-primary-text)]',\n neutral: '',\n success: 'text-[var(--gr-success-text)]',\n warning: 'text-[var(--gr-warning-text)]',\n danger: 'text-[var(--gr-danger-text)]',\n info: 'text-[var(--gr-info-text)]',\n slate: 'text-[var(--gr-slate-text)]',\n azure: 'text-[var(--gr-azure-text)]',\n}\n\nexport const descriptionSizeClass: Record<GrComponentSize, string> = {\n xs: 'text-[length:var(--gr-control-text-2xs)]',\n sm: 'text-[length:var(--gr-control-text-xs)]',\n md: 'text-[length:var(--gr-control-text-sm)]',\n lg: 'text-[length:var(--gr-control-text-md)]',\n}\n\nexport const descriptionDensityClass: Record<GrDescriptionDensity, string> = {\n regular: '',\n compact: '[row-gap:var(--gr-description-list-row-gap,0.125rem)]',\n}\n","import { splitClassTokens } from '../shared/classTokens'\n\nimport {\n descriptionSingleColumnClass,\n descriptionDensityClass,\n descriptionDividedClass,\n descriptionLabelInlineClass,\n descriptionLabelStackedClass,\n descriptionPairFlowClass,\n descriptionPairInlineClass,\n descriptionPairStackedClass,\n descriptionRootClass,\n descriptionRootFlowClass,\n descriptionRootGridClass,\n descriptionSizeClass,\n descriptionValueClass,\n descriptionValueToneClass,\n} from './grDescriptionListStyles'\n\n// Классы из вычисляемых мап (тон, размер, колонки) UnoCSS сканом не находит —\n// только safelist. Литералы хелпера туда же: на сборке он уезжает в общий чанк.\nexport const grDescriptionListSafelist = [...new Set([\n ...splitClassTokens(descriptionRootClass),\n ...splitClassTokens(descriptionRootGridClass),\n ...splitClassTokens(descriptionRootFlowClass),\n ...splitClassTokens(descriptionPairInlineClass),\n ...splitClassTokens(descriptionPairStackedClass),\n ...splitClassTokens(descriptionPairFlowClass),\n ...splitClassTokens(descriptionDividedClass),\n ...splitClassTokens(descriptionLabelInlineClass),\n ...splitClassTokens(descriptionLabelStackedClass),\n ...splitClassTokens(descriptionValueClass),\n ...splitClassTokens(descriptionSingleColumnClass),\n ...Object.values(descriptionValueToneClass).flatMap(splitClassTokens),\n ...Object.values(descriptionSizeClass).flatMap(splitClassTokens),\n ...Object.values(descriptionDensityClass).flatMap(splitClassTokens),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grDescriptionListSafelist } from './safelist'\n\nexport const grDescriptionListConfig = defineGranularComponent(import.meta.url, {\n name: 'GrDescriptionList',\n safelist: grDescriptionListSafelist,\n})\n"],"mappings":";;;AAwBA,IAAa,uBAAuB;;AAGpC,IAAa,2BAA2B;AAIxC,IAAa,2BAA2B;;AAGxC,IAAa,+BAA+B;;;;;;;;;;;;;;;;;;;;AAqB5C,SAAgB,wBACd,SAOA,YACwB;CACxB,MAAM,OAAO;CAKb,OAAO,EACL,qBAAqB,yCALX,aACR,OAAO,KAAK,SAAS,WAAW,mDAChC,KAGgE,YAAY,UAAU,EAAE,aAAa,QAAQ,WACjH;AACF;AAEA,IAAa,6BAA6B;AAC1C,IAAa,8BAA8B;AAI3C,IAAa,2BAA2B;AAExC,IAAa,0BAA0B;AAKvC,IAAa,8BAA8B;AAC3C,IAAa,+BAA+B;AAI5C,IAAa,wBAAwB;;AAGrC,IAAa,4BAAoD;CAC/D,SAAS;CACT,SAAS;CACT,SAAS;CACT,SAAS;CACT,QAAQ;CACR,MAAM;CACN,OAAO;CACP,OAAO;AACT;AAEA,IAAa,uBAAwD;CACnE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,0BAAgE;CAC3E,SAAS;CACT,SAAS;AACX;;;AC/FA,IAAa,4BAA4B,CAAC,mBAAG,IAAI,IAAI;CACnD,GAAG,iBAAiB,oBAAoB;CACxC,GAAG,iBAAiB,wBAAwB;CAC5C,GAAG,iBAAiB,wBAAwB;CAC5C,GAAG,iBAAiB,0BAA0B;CAC9C,GAAG,iBAAiB,2BAA2B;CAC/C,GAAG,iBAAiB,wBAAwB;CAC5C,GAAG,iBAAiB,uBAAuB;CAC3C,GAAG,iBAAiB,2BAA2B;CAC/C,GAAG,iBAAiB,4BAA4B;CAChD,GAAG,iBAAiB,qBAAqB;CACzC,GAAG,iBAAiB,4BAA4B;CAChD,GAAG,OAAO,OAAO,yBAAyB,CAAC,CAAC,QAAQ,gBAAgB;CACpE,GAAG,OAAO,OAAO,oBAAoB,CAAC,CAAC,QAAQ,gBAAgB;CAC/D,GAAG,OAAO,OAAO,uBAAuB,CAAC,CAAC,QAAQ,gBAAgB;AACpE,CAAC,CAAC;;;AChCF,IAAa,0BAA0B,wBAAwB,OAAO,KAAK,KAAK;CAC9E,MAAM;CACN,UAAU;AACZ,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-vSji8w902.js","names":[],"sources":["../../src/components/GrEmptyState/grEmptyStateStyles.ts","../../src/components/GrEmptyState/safelist.ts","../../src/components/GrEmptyState/config.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nexport type GrEmptyStateSize = GrComponentSize\n\n/** Поверхность карточки. `ghost` — для встраивания в уже существующую карточку. */\nexport const GR_EMPTY_STATE_VARIANTS = ['outlined', 'ghost'] as const\nexport type GrEmptyStateVariant = typeof GR_EMPTY_STATE_VARIANTS[number]\n\n/**\n * Уровень заголовка. `h1` намеренно нет: пустое состояние живёт внутри уже\n * существующей структуры страницы, а не задаёт её.\n */\nexport const GR_EMPTY_STATE_HEADING_LEVELS = [2, 3, 4, 5, 6] as const\nexport type GrEmptyStateHeadingLevel = typeof GR_EMPTY_STATE_HEADING_LEVELS[number]\n\nexport const rootBaseClass = 'text-center'\n\nexport const variantClass: Record<GrEmptyStateVariant, string> = {\n outlined: 'rounded-[var(--gr-radius-lg)] border border-[var(--gr-brd)] bg-[var(--gr-card)]',\n // Карточка внутри карточки: вторая рамка только шумит (тот же смысл, что у `GrCard`).\n ghost: '',\n}\n\nexport const rootPaddingBySize: Record<GrEmptyStateSize, string> = {\n xs: 'p-3',\n sm: 'p-4',\n md: 'p-6',\n lg: 'p-8',\n}\n\nexport const iconBoxBaseClass = 'flex items-center justify-center border border-[var(--gr-brd)] bg-[var(--gr-muted)] text-[var(--gr-muted-fg)]'\n\nexport const iconBoxBySize: Record<GrEmptyStateSize, string> = {\n xs: 'h-8 w-8 rounded-[var(--gr-radius-md)]',\n sm: 'h-10 w-10 rounded-[var(--gr-radius-md)]',\n md: 'h-12 w-12 rounded-[var(--gr-radius-lg)]',\n lg: 'h-14 w-14 rounded-[var(--gr-radius-lg)]',\n}\n\n/** Размер самой иконки в пикселях — `GrIcon` принимает число. */\nexport const iconSizeBySize: Record<GrEmptyStateSize, number> = {\n xs: 16,\n sm: 20,\n md: 24,\n lg: 28,\n}\n\n/**\n * `mb-0` гасит браузерный отступ снизу у настоящего заголовка: без сброса\n * карточка разъезжается по вертикали.\n */\nexport const titleBaseClass = 'mb-0 font-700'\n\nexport const titleBySize: Record<GrEmptyStateSize, string> = {\n xs: 'mt-2 text-[length:var(--gr-text-xs)]',\n sm: 'mt-3 text-[length:var(--gr-text-sm)]',\n md: 'mt-4 text-[length:var(--gr-text-sm)]',\n lg: 'mt-5 text-[length:var(--gr-text-base)]',\n}\n\nexport const descriptionBaseClass = 'text-[var(--gr-muted-fg)]'\n\nexport const descriptionBySize: Record<GrEmptyStateSize, string> = {\n xs: 'mt-0.5 text-[length:var(--gr-text-xs)]',\n sm: 'mt-1 text-[length:var(--gr-text-xs)]',\n md: 'mt-1 text-[length:var(--gr-text-sm)]',\n lg: 'mt-2 text-[length:var(--gr-text-sm)]',\n}\n\nexport const actionsBaseClass = 'flex justify-center'\n\nexport const actionsBySize: Record<GrEmptyStateSize, string> = {\n xs: 'mt-2',\n sm: 'mt-3',\n md: 'mt-4',\n lg: 'mt-5',\n}\n\nexport function grEmptyStateRootClass(options: {\n variant: GrEmptyStateVariant\n size: GrEmptyStateSize\n}): string {\n return [rootBaseClass, variantClass[options.variant], rootPaddingBySize[options.size]]\n .filter(Boolean)\n .join(' ')\n}\n","import { splitClassTokens } from '../shared/classTokens'\nimport {\n actionsBaseClass,\n actionsBySize,\n descriptionBaseClass,\n descriptionBySize,\n iconBoxBaseClass,\n iconBoxBySize,\n rootBaseClass,\n rootPaddingBySize,\n titleBaseClass,\n titleBySize,\n variantClass,\n} from './grEmptyStateStyles'\n\nexport const grEmptyStateSafelist = [...new Set([\n ...splitClassTokens(rootBaseClass),\n ...splitClassTokens(iconBoxBaseClass),\n ...splitClassTokens(titleBaseClass),\n ...splitClassTokens(descriptionBaseClass),\n ...splitClassTokens(actionsBaseClass),\n ...Object.values(variantClass).flatMap(splitClassTokens),\n ...Object.values(rootPaddingBySize).flatMap(splitClassTokens),\n ...Object.values(iconBoxBySize).flatMap(splitClassTokens),\n ...Object.values(titleBySize).flatMap(splitClassTokens),\n ...Object.values(descriptionBySize).flatMap(splitClassTokens),\n ...Object.values(actionsBySize).flatMap(splitClassTokens),\n // Центрирование блока иконки живёт литералом в шаблоне.\n ...splitClassTokens('flex justify-center'),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grEmptyStateSafelist } from './safelist'\n\nexport const grEmptyStateConfig = defineGranularComponent(import.meta.url, {\n name: 'GrEmptyState',\n safelist: grEmptyStateSafelist,\n dependencies: ['GrIcon'],\n})\n"],"mappings":";;;AAeA,IAAa,gBAAgB;AAE7B,IAAa,eAAoD;CAC/D,UAAU;CAEV,OAAO;AACT;AAEA,IAAa,oBAAsD;CACjE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,mBAAmB;AAEhC,IAAa,gBAAkD;CAC7D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,iBAAmD;CAC9D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;AAMA,IAAa,iBAAiB;AAE9B,IAAa,cAAgD;CAC3D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,uBAAuB;AAEpC,IAAa,oBAAsD;CACjE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,mBAAmB;AAEhC,IAAa,gBAAkD;CAC7D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,SAAgB,sBAAsB,SAG3B;CACT,OAAO;EAAC;EAAe,aAAa,QAAQ;EAAU,kBAAkB,QAAQ;CAAK,CAAC,CACnF,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;AACb;;;ACtEA,IAAa,uBAAuB,CAAC,mBAAG,IAAI,IAAI;CAC9C,GAAG,iBAAiB,aAAa;CACjC,GAAG,iBAAiB,gBAAgB;CACpC,GAAG,iBAAiB,cAAc;CAClC,GAAG,iBAAiB,oBAAoB;CACxC,GAAG,iBAAiB,gBAAgB;CACpC,GAAG,OAAO,OAAO,YAAY,CAAC,CAAC,QAAQ,gBAAgB;CACvD,GAAG,OAAO,OAAO,iBAAiB,CAAC,CAAC,QAAQ,gBAAgB;CAC5D,GAAG,OAAO,OAAO,aAAa,CAAC,CAAC,QAAQ,gBAAgB;CACxD,GAAG,OAAO,OAAO,WAAW,CAAC,CAAC,QAAQ,gBAAgB;CACtD,GAAG,OAAO,OAAO,iBAAiB,CAAC,CAAC,QAAQ,gBAAgB;CAC5D,GAAG,OAAO,OAAO,aAAa,CAAC,CAAC,QAAQ,gBAAgB;CAExD,GAAG,iBAAiB,qBAAqB;AAC3C,CAAC,CAAC;;;ACzBF,IAAa,qBAAqB,wBAAwB,OAAO,KAAK,KAAK;CACzE,MAAM;CACN,UAAU;CACV,cAAc,CAAC,QAAQ;AACzB,CAAC"}
@@ -39,4 +39,22 @@ var trending_up_default = markRaw({
39
39
  render: render$1
40
40
  });
41
41
  //#endregion
42
- export { trending_down_default as n, trending_up_default as t };
42
+ //#region src/components/GrDelta/deltaTone.ts
43
+ /**
44
+ * Тон величины по её знаку и полярности.
45
+ *
46
+ * Ноль нейтрален при любой полярности: «не изменилось» — третье состояние, и
47
+ * двумя цветами его не выразить. `null` величины нет вовсе — тона у неё тоже
48
+ * нет, это решает вызывающий.
49
+ */
50
+ function deltaTone(value, polarity = "positive-good") {
51
+ if (polarity === "none" || value === 0 || Number.isNaN(value)) return "neutral";
52
+ return (polarity === "positive-good" ? value > 0 : value < 0) ? "success" : "danger";
53
+ }
54
+ /** Направление стрелки. Ноль стрелки не получает: двигаться было некуда. */
55
+ function deltaDirection(value) {
56
+ if (Number.isNaN(value) || value === 0) return "flat";
57
+ return value > 0 ? "up" : "down";
58
+ }
59
+ //#endregion
60
+ export { trending_down_default as i, deltaTone as n, trending_up_default as r, deltaDirection as t };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deltaTone-B5OoS1vo.js","names":[],"sources":["../../src/components/GrDelta/deltaTone.ts"],"sourcesContent":["/**\n * Выбор тона для величины со знаком.\n *\n * Чистая функция, а не `switch` внутри компонента: ровно этот `switch`\n * расходился по приложениям копиями, и в одной из них нулевое движение\n * красилось зелёным — как поступление.\n */\n\n/** Что считать хорошим ростом. */\nexport type GrDeltaPolarity\n /** Рост — успех: выручка, конверсия, число подписок. */\n = | 'positive-good'\n /** Рост — проблема: себестоимость, время отклика, отток. */\n | 'negative-good'\n /** Знак ничего не говорит о качестве: сальдо, смещение, разница координат. */\n | 'none'\n\nexport type GrDeltaTone = 'success' | 'danger' | 'neutral'\n\n/**\n * Тон величины по её знаку и полярности.\n *\n * Ноль нейтрален при любой полярности: «не изменилось» — третье состояние, и\n * двумя цветами его не выразить. `null` величины нет вовсе — тона у неё тоже\n * нет, это решает вызывающий.\n */\nexport function deltaTone(value: number, polarity: GrDeltaPolarity = 'positive-good'): GrDeltaTone {\n if (polarity === 'none' || value === 0 || Number.isNaN(value)) return 'neutral'\n\n const good = polarity === 'positive-good' ? value > 0 : value < 0\n\n return good ? 'success' : 'danger'\n}\n\n/** Направление стрелки. Ноль стрелки не получает: двигаться было некуда. */\nexport function deltaDirection(value: number): 'up' | 'down' | 'flat' {\n if (Number.isNaN(value) || value === 0) return 'flat'\n return value > 0 ? 'up' : 'down'\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,SAAgB,UAAU,OAAe,WAA4B,iBAA8B;CACjG,IAAI,aAAa,UAAU,UAAU,KAAK,OAAO,MAAM,KAAK,GAAG,OAAO;CAItE,QAFa,aAAa,kBAAkB,QAAQ,IAAI,QAAQ,KAElD,YAAY;AAC5B;;AAGA,SAAgB,eAAe,OAAuC;CACpE,IAAI,OAAO,MAAM,KAAK,KAAK,UAAU,GAAG,OAAO;CAC/C,OAAO,QAAQ,IAAI,OAAO;AAC5B"}
@@ -1046,7 +1046,7 @@ var grThemeTokens = [
1046
1046
  "description": "Облегчённая success-подложка для мягких статусов и подсветок.",
1047
1047
  "values": {
1048
1048
  "light": "#d1fae5",
1049
- "dark": "#064e3b"
1049
+ "dark": "#194536"
1050
1050
  }
1051
1051
  },
1052
1052
  {
@@ -1091,7 +1091,7 @@ var grThemeTokens = [
1091
1091
  "description": "Облегчённая warning-подложка для мягких warning-состояний.",
1092
1092
  "values": {
1093
1093
  "light": "#ffedd5",
1094
- "dark": "#7c2d12"
1094
+ "dark": "#672e1c"
1095
1095
  }
1096
1096
  },
1097
1097
  {
@@ -1127,7 +1127,7 @@ var grThemeTokens = [
1127
1127
  "description": "Облегчённая danger-подложка для мягких error-состояний.",
1128
1128
  "values": {
1129
1129
  "light": "#fee2e2",
1130
- "dark": "#7f1d1d"
1130
+ "dark": "#6a2522"
1131
1131
  }
1132
1132
  },
1133
1133
  {
@@ -1163,7 +1163,7 @@ var grThemeTokens = [
1163
1163
  "description": "Облегчённая info-подложка для спокойных информационных блоков.",
1164
1164
  "values": {
1165
1165
  "light": "#dbeafe",
1166
- "dark": "#1e3a8a"
1166
+ "dark": "#213771"
1167
1167
  }
1168
1168
  },
1169
1169
  {
@@ -1199,7 +1199,7 @@ var grThemeTokens = [
1199
1199
  "description": "Облегчённая slate-подложка для мягких нейтральных состояний.",
1200
1200
  "values": {
1201
1201
  "light": "#e2e8f0",
1202
- "dark": "#334155"
1202
+ "dark": "#313b4a"
1203
1203
  }
1204
1204
  },
1205
1205
  {
@@ -1235,7 +1235,7 @@ var grThemeTokens = [
1235
1235
  "description": "Облегчённая azure-подложка для мягких informational поверхностей.",
1236
1236
  "values": {
1237
1237
  "light": "#e0f2fe",
1238
- "dark": "#0c4a6e"
1238
+ "dark": "#1b425c"
1239
1239
  }
1240
1240
  },
1241
1241
  {
@@ -1624,6 +1624,33 @@ var grThemeTokens = [
1624
1624
  "light": "#6366f1",
1625
1625
  "dark": "#818cf8"
1626
1626
  }
1627
+ },
1628
+ {
1629
+ "name": "--gr-shadow-1",
1630
+ "section": "Elevation",
1631
+ "description": "Уровень elevation `1`. Синеватая полупрозрачная тень читается на светлом фоне мягче чёрной.",
1632
+ "values": {
1633
+ "light": "0 1px 2px rgba(15, 23, 42, 0.08)",
1634
+ "dark": "0 1px 2px rgba(0, 0, 0, 0.45)"
1635
+ }
1636
+ },
1637
+ {
1638
+ "name": "--gr-shadow-2",
1639
+ "section": "Elevation",
1640
+ "description": "Уровень elevation `2` для всплывающих слоёв.",
1641
+ "values": {
1642
+ "light": "0 8px 24px rgba(15, 23, 42, 0.14)",
1643
+ "dark": "0 8px 24px rgba(0, 0, 0, 0.55)"
1644
+ }
1645
+ },
1646
+ {
1647
+ "name": "--gr-shadow-3",
1648
+ "section": "Elevation",
1649
+ "description": "Уровень elevation `3` для модальных слоёв.",
1650
+ "values": {
1651
+ "light": "0 16px 48px rgba(15, 23, 42, 0.20)",
1652
+ "dark": "0 16px 48px rgba(0, 0, 0, 0.65)"
1653
+ }
1627
1654
  }
1628
1655
  ];
1629
1656
  var grComponentTokens = [
@@ -2418,6 +2445,20 @@ var grComponentTokens = [
2418
2445
  "default": "-4px 0 6px -4px rgba(0, 0, 0, 0.25)",
2419
2446
  "description": "Тень на границе группы колонок, закреплённых справа."
2420
2447
  },
2448
+ {
2449
+ "owner": "GrDescriptionList",
2450
+ "name": "--gr-description-list-column-min",
2451
+ "kind": "hook",
2452
+ "default": "12rem",
2453
+ "description": "Минимальная ширина колонки. Ниже неё сетка отдаёт колонку целиком, а не делит её: в тесной колонке значение переносится посимвольно, и число «30» читается как «3» и «0». Порог считается от ширины контейнера, а не вьюпорта."
2454
+ },
2455
+ {
2456
+ "owner": "GrDescriptionList",
2457
+ "name": "--gr-description-list-value-min",
2458
+ "kind": "hook",
2459
+ "default": "5rem",
2460
+ "description": "Сколько места остаётся значению рядом с подписью при `inline`. Складывается с `labelWidth` в минимальную ширину колонки: колонка шириной с одну подпись выжимает значение в букву на строку."
2461
+ },
2421
2462
  {
2422
2463
  "owner": "GrDescriptionList",
2423
2464
  "name": "--gr-description-list-label-color",
@@ -3398,6 +3439,48 @@ var grComponentTokens = [
3398
3439
  "default": "var(--gr-tree-branch-line-default-color)",
3399
3440
  "description": "Цвет направляющей конкретной ветки — им подсвечивается путь до текущего узла."
3400
3441
  },
3442
+ {
3443
+ "owner": "GrValue",
3444
+ "name": "--gr-value-prefix-color",
3445
+ "kind": "hook",
3446
+ "default": "цвет величины (наследуется)",
3447
+ "description": "Цвет приписки перед значением. По умолчанию наследует цвет величины: знак валюты — часть суммы, и краснеть при отрицательном значении обязан вместе с ней."
3448
+ },
3449
+ {
3450
+ "owner": "GrValue",
3451
+ "name": "--gr-value-prefix-size",
3452
+ "kind": "hook",
3453
+ "default": "кегль величины (наследуется)",
3454
+ "description": "Кегль приписки перед значением. По умолчанию равен кеглю самой величины: приглушённый и уменьшенный знак валюты читается подписью рядом с числом, а не его частью."
3455
+ },
3456
+ {
3457
+ "owner": "GrValue",
3458
+ "name": "--gr-value-prefix-gap",
3459
+ "kind": "hook",
3460
+ "default": "0",
3461
+ "description": "Отбивка между припиской и значением. По умолчанию нулевая: «$ 14,99» с зазором читается как опечатка."
3462
+ },
3463
+ {
3464
+ "owner": "GrValue",
3465
+ "name": "--gr-value-suffix-color",
3466
+ "kind": "hook",
3467
+ "default": "var(--gr-muted-fg)",
3468
+ "description": "Цвет приписки после значения. По умолчанию приглушён: там обычно единица измерения, а она величине не принадлежит. Валюта справа (`100 ₽`) — случай обратный, и цвет для неё снимают этим токеном."
3469
+ },
3470
+ {
3471
+ "owner": "GrValue",
3472
+ "name": "--gr-value-suffix-size",
3473
+ "kind": "hook",
3474
+ "default": "0.85em",
3475
+ "description": "Кегль приписки после значения. Доля от кегля величины, а не ступень шкалы: примитив своей шкалы размеров не имеет и набирается кеглем места, где стоит."
3476
+ },
3477
+ {
3478
+ "owner": "GrValue",
3479
+ "name": "--gr-value-suffix-gap",
3480
+ "kind": "hook",
3481
+ "default": "0.25rem",
3482
+ "description": "Отбивка между значением и припиской после него. Задаётся логическим отступом, поэтому в RTL встаёт с нужной стороны."
3483
+ },
3401
3484
  {
3402
3485
  "owner": "composables",
3403
3486
  "name": "--gr-virtual-before",