@feugene/granularity 0.42.0 → 0.43.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 (177) hide show
  1. package/README.md +3 -3
  2. package/dist/chunks/config-BXRmsn3t.js +172 -0
  3. package/dist/chunks/config-BXRmsn3t.js.map +1 -0
  4. package/dist/chunks/config-Dg0bSoGw.js +81 -0
  5. package/dist/chunks/config-Dg0bSoGw.js.map +1 -0
  6. package/dist/chunks/config-DmED6aJV.js +237 -0
  7. package/dist/chunks/config-DmED6aJV.js.map +1 -0
  8. package/dist/chunks/{config-DWL81-aM.js → config-hnoZvcIM.js} +2 -20
  9. package/dist/chunks/config-hnoZvcIM.js.map +1 -0
  10. package/dist/chunks/dragSortGeometry-CY-llfrQ.js +87 -0
  11. package/dist/chunks/dragSortGeometry-CY-llfrQ.js.map +1 -0
  12. package/dist/chunks/{en-B9E3jO6m.js → en-C_QkUTRL.js} +32 -1
  13. package/dist/chunks/en-C_QkUTRL.js.map +1 -0
  14. package/dist/chunks/{es-DCkqHTlU.js → es-B4t_3Wnh.js} +3 -3
  15. package/dist/chunks/{es-DCkqHTlU.js.map → es-B4t_3Wnh.js.map} +1 -1
  16. package/dist/chunks/{es-QpzdIEut.js → es-DemSEhZE.js} +32 -1
  17. package/dist/chunks/es-DemSEhZE.js.map +1 -0
  18. package/dist/chunks/{generated-B95IBXs6.js → generated-VcxJTo_q.js} +210 -0
  19. package/dist/chunks/generated-VcxJTo_q.js.map +1 -0
  20. package/dist/chunks/{granular-provider-BG_2XqkS.js → granular-provider-BohXQcNt.js} +7 -1
  21. package/dist/chunks/granular-provider-BohXQcNt.js.map +1 -0
  22. package/dist/chunks/{ru-D_1Ya489.js → ru-CLUErjhY.js} +32 -1
  23. package/dist/chunks/ru-CLUErjhY.js.map +1 -0
  24. package/dist/chunks/scrollOverflow-B_kEdcol.js +31 -0
  25. package/dist/chunks/scrollOverflow-B_kEdcol.js.map +1 -0
  26. package/dist/chunks/tones-CRJAaYyg.js +21 -0
  27. package/dist/chunks/tones-CRJAaYyg.js.map +1 -0
  28. package/dist/components/GrAffix/chunks/GrAffix-CWtC7yi8.js +272 -0
  29. package/dist/components/GrAffix/chunks/GrAffix-CWtC7yi8.js.map +1 -0
  30. package/dist/components/GrAffix/index.js +3 -0
  31. package/dist/components/GrCarousel/chunks/GrCarousel-ByuughtI.js +761 -0
  32. package/dist/components/GrCarousel/chunks/GrCarousel-ByuughtI.js.map +1 -0
  33. package/dist/components/GrCarousel/index.js +3 -0
  34. package/dist/components/GrCarousel/styles.css +1 -0
  35. package/dist/components/GrColorPicker/chunks/{GrColorPicker-BwzRLs-i.js → GrColorPicker-9mTR-YZ_.js} +1 -1
  36. package/dist/components/GrColorPicker/chunks/{GrColorPicker-BwzRLs-i.js.map → GrColorPicker-9mTR-YZ_.js.map} +1 -1
  37. package/dist/components/GrColorPicker/index.js +1 -1
  38. package/dist/components/GrDataTable/chunks/{GrDataTable-BBe7-uUe.js → GrDataTable-xNSmO_I-.js} +4 -3
  39. package/dist/components/GrDataTable/chunks/{GrDataTable-BBe7-uUe.js.map → GrDataTable-xNSmO_I-.js.map} +1 -1
  40. package/dist/components/GrDataTable/index.js +1 -1
  41. package/dist/components/GrImageViewer/chunks/{GrImageViewer-Dd2gJ-j_.js.map → GrImageViewer-DK-iVHHC.js.map} +1 -1
  42. package/dist/components/GrImageViewer/index.js +1 -1
  43. package/dist/components/GrInputTag/chunks/{GrInputTag-BKzm1PKw.js.map → GrInputTag-Ci8AO1ze.js.map} +1 -1
  44. package/dist/components/GrInputTag/index.js +1 -1
  45. package/dist/components/GrJsonViewer/chunks/{GrJsonViewer-BLCEWlwg.js → GrJsonViewer-CwCBMh4h.js} +2 -2
  46. package/dist/components/GrJsonViewer/chunks/{GrJsonViewer-BLCEWlwg.js.map → GrJsonViewer-CwCBMh4h.js.map} +1 -1
  47. package/dist/components/GrJsonViewer/index.js +1 -1
  48. package/dist/components/GrNumberInput/chunks/{GrNumberInput-Bm-V59TG.js.map → GrNumberInput-CL5QhOmx.js.map} +1 -1
  49. package/dist/components/GrNumberInput/index.js +1 -1
  50. package/dist/components/GrProgressBar/index.js +1 -1
  51. package/dist/components/GrSlider/chunks/{GrSlider-Db-jACXz.js.map → GrSlider-CO8N9SF6.js.map} +1 -1
  52. package/dist/components/GrSlider/index.js +1 -1
  53. package/dist/components/GrSortableList/chunks/{GrSortableList-ce1psLL0.js → GrSortableList-NKriuGm_.js} +2 -1
  54. package/dist/components/GrSortableList/chunks/{GrSortableList-ce1psLL0.js.map → GrSortableList-NKriuGm_.js.map} +1 -1
  55. package/dist/components/GrSortableList/index.js +1 -1
  56. package/dist/components/GrTabs/chunks/{GrTabs-BArefUFv.js → GrTabs-s9RzC1WX.js} +2 -31
  57. package/dist/components/GrTabs/chunks/GrTabs-s9RzC1WX.js.map +1 -0
  58. package/dist/components/GrTabs/index.js +1 -1
  59. package/dist/components/GrTransfer/chunks/GrTransfer-8FA78ny6.js +1368 -0
  60. package/dist/components/GrTransfer/chunks/GrTransfer-8FA78ny6.js.map +1 -0
  61. package/dist/components/GrTransfer/index.js +3 -0
  62. package/dist/components/GrTransfer/styles.css +1 -0
  63. package/dist/components/GrTree/chunks/{GrTree-BFWFc0Bm.js → GrTree-CkHzgYg1.js} +3 -3
  64. package/dist/components/GrTree/chunks/{GrTree-BFWFc0Bm.js.map → GrTree-CkHzgYg1.js.map} +1 -1
  65. package/dist/components/GrTree/index.js +1 -1
  66. package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-DJa2lYGe.js → GrTreeSelect-DUsv3_mF.js} +1 -1
  67. package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-DJa2lYGe.js.map → GrTreeSelect-DUsv3_mF.js.map} +1 -1
  68. package/dist/components/GrTreeSelect/index.js +1 -1
  69. package/dist/composables/useDragSort.js +179 -1
  70. package/dist/composables/useDragSort.js.map +1 -0
  71. package/dist/granular-provider-node.js +1 -1
  72. package/dist/granular-provider.js +1 -1
  73. package/dist/i18n/all.js +1 -1
  74. package/dist/i18n/index.js +1 -1
  75. package/dist/index.js +23 -19
  76. package/dist/theme.js +1 -1
  77. package/dist/tokens.js +1 -1
  78. package/dist/types/components/GrAffix/GrAffix.vue.d.ts +91 -0
  79. package/dist/types/components/GrAffix/affixState.d.ts +81 -0
  80. package/dist/types/components/GrAffix/config.d.ts +1 -0
  81. package/dist/types/components/GrAffix/grAffixStyles.d.ts +46 -0
  82. package/dist/types/components/GrAffix/index.d.ts +9 -0
  83. package/dist/types/components/GrAffix/safelist.d.ts +1 -0
  84. package/dist/types/components/GrAlert/GrAlert.vue.d.ts +1 -1
  85. package/dist/types/components/GrBadgeWrap/GrBadgeWrap.vue.d.ts +2 -2
  86. package/dist/types/components/GrButton/GrButton.vue.d.ts +2 -2
  87. package/dist/types/components/GrCard/GrCard.vue.d.ts +1 -1
  88. package/dist/types/components/GrCarousel/GrCarousel.vue.d.ts +151 -0
  89. package/dist/types/components/GrCarousel/GrCarouselSlide.vue.d.ts +53 -0
  90. package/dist/types/components/GrCarousel/carouselNavigation.d.ts +57 -0
  91. package/dist/types/components/GrCarousel/composables/useCarouselAutoplay.d.ts +33 -0
  92. package/dist/types/components/GrCarousel/composables/useCarouselSwipe.d.ts +20 -0
  93. package/dist/types/components/GrCarousel/config.d.ts +7 -0
  94. package/dist/types/components/GrCarousel/defaults.d.ts +13 -0
  95. package/dist/types/components/GrCarousel/grCarouselContext.d.ts +46 -0
  96. package/dist/types/components/GrCarousel/grCarouselStyles.d.ts +80 -0
  97. package/dist/types/components/GrCarousel/index.d.ts +12 -0
  98. package/dist/types/components/GrCarousel/safelist.d.ts +1 -0
  99. package/dist/types/components/GrCheckbox/GrCheckbox.vue.d.ts +3 -3
  100. package/dist/types/components/GrCheckboxGroup/GrCheckboxGroup.vue.d.ts +2 -2
  101. package/dist/types/components/GrChip/GrChip.vue.d.ts +2 -2
  102. package/dist/types/components/GrChipGroup/GrChipGroup.vue.d.ts +2 -2
  103. package/dist/types/components/GrCollapse/GrCollapse.vue.d.ts +1 -1
  104. package/dist/types/components/GrCollapse/GrCollapseItem.vue.d.ts +1 -1
  105. package/dist/types/components/GrColorPicker/GrColorPicker.vue.d.ts +3 -3
  106. package/dist/types/components/GrCommandPalette/GrCommandPalette.vue.d.ts +1 -1
  107. package/dist/types/components/GrConfirmDialog/GrConfirmDialog.vue.d.ts +1 -1
  108. package/dist/types/components/GrContextMenu/GrContextMenu.vue.d.ts +2 -2
  109. package/dist/types/components/GrDialog/GrDialog.vue.d.ts +1 -1
  110. package/dist/types/components/GrDivider/GrDivider.vue.d.ts +2 -2
  111. package/dist/types/components/GrDrawer/GrDrawer.vue.d.ts +1 -1
  112. package/dist/types/components/GrDropdown/GrDropdown.vue.d.ts +3 -3
  113. package/dist/types/components/GrDropdownMenu/GrDropdownMenu.vue.d.ts +3 -3
  114. package/dist/types/components/GrDropdownMenu/GrDropdownMenuItem.vue.d.ts +1 -1
  115. package/dist/types/components/GrEmptyState/GrEmptyState.vue.d.ts +1 -1
  116. package/dist/types/components/GrFileUpload/GrFileUpload.vue.d.ts +1 -1
  117. package/dist/types/components/GrFormField/GrFormField.vue.d.ts +3 -3
  118. package/dist/types/components/GrFormFile/GrFormFile.vue.d.ts +2 -2
  119. package/dist/types/components/GrFormSection/GrFormSection.vue.d.ts +1 -1
  120. package/dist/types/components/GrIcon/GrIcon.vue.d.ts +1 -1
  121. package/dist/types/components/GrImageViewer/GrImageViewer.vue.d.ts +3 -3
  122. package/dist/types/components/GrInput/GrInput.vue.d.ts +4 -4
  123. package/dist/types/components/GrInputTag/GrInputTag.vue.d.ts +3 -3
  124. package/dist/types/components/GrKbd/GrKbd.vue.d.ts +1 -1
  125. package/dist/types/components/GrLink/GrLink.vue.d.ts +1 -1
  126. package/dist/types/components/GrList/GrListItem.vue.d.ts +2 -2
  127. package/dist/types/components/GrNavbar/GrNavbar.vue.d.ts +2 -2
  128. package/dist/types/components/GrNumberInput/GrNumberInput.vue.d.ts +3 -3
  129. package/dist/types/components/GrPagination/GrPagination.vue.d.ts +1 -1
  130. package/dist/types/components/GrPopover/GrPopover.vue.d.ts +3 -3
  131. package/dist/types/components/GrPromptDialog/GrPromptDialog.vue.d.ts +3 -3
  132. package/dist/types/components/GrRadio/GrRadio.vue.d.ts +2 -2
  133. package/dist/types/components/GrRadioGroup/GrRadioGroup.vue.d.ts +2 -2
  134. package/dist/types/components/GrRating/GrRating.vue.d.ts +2 -2
  135. package/dist/types/components/GrSegmented/GrSegmented.vue.d.ts +2 -2
  136. package/dist/types/components/GrSidebar/GrSidebarItem.vue.d.ts +1 -1
  137. package/dist/types/components/GrSkeleton/GrSkeleton.vue.d.ts +1 -1
  138. package/dist/types/components/GrSlider/GrSlider.vue.d.ts +3 -3
  139. package/dist/types/components/GrSplitter/GrSplitter.vue.d.ts +1 -1
  140. package/dist/types/components/GrStatistic/GrStatistic.vue.d.ts +2 -2
  141. package/dist/types/components/GrSwitch/GrSwitch.vue.d.ts +3 -3
  142. package/dist/types/components/GrTable/GrTable.vue.d.ts +1 -1
  143. package/dist/types/components/GrTabs/GrTabs.vue.d.ts +1 -1
  144. package/dist/types/components/GrTextarea/GrTextarea.vue.d.ts +2 -2
  145. package/dist/types/components/GrTimeline/GrTimelineItem.vue.d.ts +2 -2
  146. package/dist/types/components/GrToaster/GrToaster.vue.d.ts +1 -1
  147. package/dist/types/components/GrTooltip/GrTooltip.vue.d.ts +3 -3
  148. package/dist/types/components/GrTransfer/GrTransfer.vue.d.ts +103 -0
  149. package/dist/types/components/GrTransfer/config.d.ts +1 -0
  150. package/dist/types/components/GrTransfer/defaults.d.ts +15 -0
  151. package/dist/types/components/GrTransfer/grTransferStyles.d.ts +127 -0
  152. package/dist/types/components/GrTransfer/index.d.ts +11 -0
  153. package/dist/types/components/GrTransfer/safelist.d.ts +1 -0
  154. package/dist/types/components/GrTransfer/transferGeometry.d.ts +44 -0
  155. package/dist/types/components/GrTransfer/transferModel.d.ts +68 -0
  156. package/dist/types/components/GrTransfer/transferSelection.d.ts +36 -0
  157. package/dist/types/components/GrTransfer/useTransferDrag.d.ts +48 -0
  158. package/dist/types/granular-provider/shared.d.ts +3 -0
  159. package/dist/types/i18n/messages/en.d.ts +58 -0
  160. package/dist/types/i18n/messages/es.d.ts +58 -0
  161. package/dist/types/i18n/messages/ru.d.ts +58 -0
  162. package/dist/types/index.d.ts +3 -0
  163. package/dist/web-types.json +718 -288
  164. package/package.json +17 -1
  165. package/dist/chunks/config-DWL81-aM.js.map +0 -1
  166. package/dist/chunks/en-B9E3jO6m.js.map +0 -1
  167. package/dist/chunks/es-QpzdIEut.js.map +0 -1
  168. package/dist/chunks/generated-B95IBXs6.js.map +0 -1
  169. package/dist/chunks/granular-provider-BG_2XqkS.js.map +0 -1
  170. package/dist/chunks/ru-D_1Ya489.js.map +0 -1
  171. package/dist/chunks/useDragSort-0l47h4yb.js +0 -265
  172. package/dist/chunks/useDragSort-0l47h4yb.js.map +0 -1
  173. package/dist/components/GrTabs/chunks/GrTabs-BArefUFv.js.map +0 -1
  174. package/dist/components/GrImageViewer/chunks/{GrImageViewer-Dd2gJ-j_.js → GrImageViewer-DK-iVHHC.js} +3 -3
  175. package/dist/components/GrInputTag/chunks/{GrInputTag-BKzm1PKw.js → GrInputTag-Ci8AO1ze.js} +1 -1
  176. package/dist/components/GrNumberInput/chunks/{GrNumberInput-Bm-V59TG.js → GrNumberInput-CL5QhOmx.js} +1 -1
  177. package/dist/components/GrSlider/chunks/{GrSlider-Db-jACXz.js → GrSlider-CO8N9SF6.js} +1 -1
package/README.md CHANGED
@@ -91,10 +91,10 @@ from its own chunk, so a granular import already brings everything it needs.
91
91
  <!-- entry-sizes:generated:start lang=en -->
92
92
  | What you import | gzip | of the barrel |
93
93
  | --- | ---: | ---: |
94
- | the whole package from the root | 541.7 kB | 100 % |
94
+ | the whole package from the root | 580.9 kB | 100 % |
95
95
  | the lightest component — `GrButtonGroup` | 1.8 kB | < 1 % |
96
- | the median component — `GrSegmented` | 15.2 kB | 3 % |
97
- | the 5 heaviest together | 171.7 kB | 32 % |
96
+ | the median component — `GrNavbar` | 15.4 kB | 3 % |
97
+ | the 5 heaviest together | 171.9 kB | 30 % |
98
98
 
99
99
  These numbers **do not add up**: shared code is counted again in every row but paid for once, which is why
100
100
  the set is shown as a union rather than a sum. They are an upper bound — the gzip of everything a subpath
@@ -0,0 +1,172 @@
1
+ import { n as splitClassTokens } from "./classTokens-8v2XC74x.js";
2
+ import { t as GR_TONES } from "./tones-CRJAaYyg.js";
3
+ import { defineGranularComponent } from "@feugene/unocss-preset-granular/contract";
4
+ //#region src/components/GrCarousel/grCarouselStyles.ts
5
+ /**
6
+ * Тон текущего переключателя. Своей шкалы компонент не заводит: она одна на
7
+ * пакет, и хук `--gr-carousel-dot-active` перебивает её точечно.
8
+ */
9
+ var dotToneVars = {
10
+ primary: "var(--gr-carousel-dot-active,var(--gr-primary))",
11
+ neutral: "var(--gr-carousel-dot-active,var(--gr-secondary))",
12
+ success: "var(--gr-carousel-dot-active,var(--gr-success))",
13
+ warning: "var(--gr-carousel-dot-active,var(--gr-warning))",
14
+ danger: "var(--gr-carousel-dot-active,var(--gr-danger))",
15
+ info: "var(--gr-carousel-dot-active,var(--gr-info))",
16
+ slate: "var(--gr-carousel-dot-active,var(--gr-slate))",
17
+ azure: "var(--gr-carousel-dot-active,var(--gr-azure))"
18
+ };
19
+ /**
20
+ * Текущая точка: заливка **и** обвод вокруг неё.
21
+ *
22
+ * Одной заливки мало: при диаметре в 8 пикселей текущая точка отличалась от
23
+ * соседних только оттенком, а на тон вроде `slate` разница почти пропадала. Обвод
24
+ * добавляет второй признак — форму, — и работает там, где цвет не различают.
25
+ *
26
+ * `outline`, а не `ring`: он рисуется вне потока и не требует цвета подложки под
27
+ * зазор, тогда как `ring-offset` пришлось бы красить в фон страницы, которого
28
+ * компонент не знает.
29
+ */
30
+ /**
31
+ * Скобки приносит хелпер, а не литерал.
32
+ *
33
+ * Гейт safelist читает класс-литералы `.ts`-хелперов статически, и запись вида
34
+ * `` `bg-[${color}]` `` он видит как класс, которого в safelist нет. Приём взят
35
+ * у `GrProgressBar`: в литерале скобок не остаётся вовсе.
36
+ */
37
+ function arbitrary(value) {
38
+ return `[${value}]`;
39
+ }
40
+ /**
41
+ * Текущая точка: заливка **и** обвод вокруг неё.
42
+ *
43
+ * Одной заливки мало: при диаметре в 8 пикселей текущая точка отличалась от
44
+ * соседних только оттенком, а на приглушённом тоне разница почти пропадала.
45
+ * Обвод добавляет второй признак — форму, — и работает там, где цвет не
46
+ * различают.
47
+ *
48
+ * `outline`, а не `ring`: он рисуется вне потока и не требует цвета подложки под
49
+ * зазор, тогда как `ring-offset` пришлось бы красить в фон страницы, которого
50
+ * компонент не знает.
51
+ */
52
+ function grCarouselDotActiveClass(tone) {
53
+ const color = dotToneVars[tone];
54
+ return [
55
+ `bg-${arbitrary(color)}`,
56
+ arbitrary(`outline:var(--gr-carousel-dot-ring-width,2px)_solid_${color}`),
57
+ arbitrary("outline-offset:var(--gr-carousel-dot-ring-offset,2px)")
58
+ ].join(" ");
59
+ }
60
+ function grCarouselThumbActiveClass(tone) {
61
+ return `border-${arbitrary(dotToneVars[tone])}`;
62
+ }
63
+ var carouselRootBase = "relative w-full";
64
+ var carouselViewportBase = "relative w-full overflow-hidden";
65
+ /**
66
+ * Вертикальная прокрутка страницы остаётся браузеру, горизонталь забирает лента.
67
+ * `select-none` — против выделения текста слайда протяжкой.
68
+ */
69
+ var carouselViewportSwipeClass = "[touch-action:pan-y] select-none";
70
+ var carouselTrackBase = "flex w-full will-change-transform transition-transform duration-[var(--gr-duration-base)] ease-[var(--gr-ease-out)]";
71
+ var carouselSlideBase = "w-full min-w-0 shrink-0 grow-0 basis-full";
72
+ /**
73
+ * Стрелки лежат поверх произвольного содержимого, поэтому несут собственную
74
+ * подложку: на светлом кадре иконка без неё пропадает. `z-10` — порядок внутри
75
+ * собственного stacking-контекста компонента, а не слой страницы.
76
+ */
77
+ var carouselControlBase = "absolute top-1/2 z-10 inline-flex h-9 w-9 -translate-y-1/2 items-center justify-center rounded-[var(--gr-radius-full)] border border-[var(--gr-brd)] bg-[var(--gr-carousel-control-bg,var(--gr-bg))] text-[var(--gr-carousel-control-fg,var(--gr-fg))] transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]";
78
+ var carouselControlPositions = {
79
+ prev: "start-2",
80
+ next: "end-2"
81
+ };
82
+ /**
83
+ * Стрелка на краю без `loop` гасится фоном, а не `opacity`: прозрачность
84
+ * разбавляет выверенные на AA токены текста и роняет контраст.
85
+ */
86
+ var carouselControlStates = {
87
+ idle: "hover:bg-[var(--gr-carousel-control-bg-hover,var(--gr-muted))]",
88
+ disabled: "cursor-not-allowed bg-[var(--gr-muted)] text-[var(--gr-disabled-fg)]"
89
+ };
90
+ /** Тумблер автопрокрутки: тот же хром, что у стрелок, но в углу ленты. */
91
+ var carouselToggleClass = "absolute end-2 top-2 z-10 inline-flex h-8 w-8 items-center justify-center rounded-[var(--gr-radius-full)] border border-[var(--gr-brd)] bg-[var(--gr-carousel-control-bg,var(--gr-bg))] text-[var(--gr-carousel-control-fg,var(--gr-fg))] transition-colors hover:bg-[var(--gr-carousel-control-bg-hover,var(--gr-muted))] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]";
92
+ var carouselIconClass = "h-4 w-4 shrink-0";
93
+ /**
94
+ * Полоса переключателей прокручивается, а не переносится: перенос увёл бы
95
+ * миниатюры под соседний блок. Своей остановки `Tab` у неё нет — её дети
96
+ * фокусируемы, и вторая остановка была бы лишней (приём `GrTabs`).
97
+ */
98
+ var carouselIndicatorsBase = "flex max-w-full items-center overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden";
99
+ var carouselIndicatorsVariants = {
100
+ dots: "justify-center gap-[var(--gr-carousel-gap,0.5rem)] px-1 pt-3.5 pb-1.5",
101
+ thumbnails: "gap-[var(--gr-carousel-gap,0.5rem)] pt-3",
102
+ none: ""
103
+ };
104
+ var carouselIndicatorBase = "shrink-0 transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]";
105
+ var carouselDotBase = "rounded-[var(--gr-radius-full)] h-[var(--gr-carousel-dot-size,0.5rem)] w-[var(--gr-carousel-dot-size,0.5rem)]";
106
+ var carouselDotStates = { idle: "bg-[var(--gr-carousel-dot,var(--gr-brd))] hover:bg-[var(--gr-muted-fg)]" };
107
+ var carouselThumbBase = "overflow-hidden rounded-[var(--gr-radius-md)] border-2 w-[var(--gr-carousel-thumb-width,4rem)] h-[var(--gr-carousel-thumb-height,2.5rem)]";
108
+ var carouselThumbStates = { idle: "border-[var(--gr-brd)] hover:border-[var(--gr-muted-fg)]" };
109
+ var carouselThumbImageClass = "h-full w-full object-cover";
110
+ /** Миниатюры не дали — плитка держит ритм полосы номером слайда. */
111
+ var carouselThumbFallbackClass = "flex h-full w-full items-center justify-center bg-[var(--gr-muted)] text-[var(--gr-muted-fg)] text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]";
112
+ function grCarouselControlClass(direction, disabled) {
113
+ return [
114
+ carouselControlBase,
115
+ carouselControlPositions[direction],
116
+ disabled ? carouselControlStates.disabled : carouselControlStates.idle
117
+ ].join(" ");
118
+ }
119
+ function grCarouselIndicatorsClass(variant) {
120
+ return [carouselIndicatorsBase, carouselIndicatorsVariants[variant]].filter(Boolean).join(" ");
121
+ }
122
+ function grCarouselIndicatorClass(variant, active, tone = "primary") {
123
+ if (variant === "thumbnails") return [
124
+ carouselIndicatorBase,
125
+ carouselThumbBase,
126
+ active ? grCarouselThumbActiveClass(tone) : carouselThumbStates.idle
127
+ ].join(" ");
128
+ return [
129
+ carouselIndicatorBase,
130
+ carouselDotBase,
131
+ active ? grCarouselDotActiveClass(tone) : carouselDotStates.idle
132
+ ].join(" ");
133
+ }
134
+ //#endregion
135
+ //#region src/components/GrCarousel/safelist.ts
136
+ var grCarouselSafelist = [.../* @__PURE__ */ new Set([
137
+ ...GR_TONES.flatMap((tone) => splitClassTokens(grCarouselDotActiveClass(tone))),
138
+ ...GR_TONES.flatMap((tone) => splitClassTokens(grCarouselThumbActiveClass(tone))),
139
+ ...Object.values(carouselControlPositions).flatMap(splitClassTokens),
140
+ ...Object.values(carouselControlStates).flatMap(splitClassTokens),
141
+ ...Object.values(carouselIndicatorsVariants).flatMap(splitClassTokens),
142
+ ...Object.values(carouselDotStates).flatMap(splitClassTokens),
143
+ ...Object.values(carouselThumbStates).flatMap(splitClassTokens),
144
+ ...splitClassTokens(carouselRootBase),
145
+ ...splitClassTokens(carouselViewportBase),
146
+ ...splitClassTokens(carouselViewportSwipeClass),
147
+ ...splitClassTokens(carouselTrackBase),
148
+ ...splitClassTokens(carouselSlideBase),
149
+ ...splitClassTokens(carouselControlBase),
150
+ ...splitClassTokens(carouselToggleClass),
151
+ ...splitClassTokens(carouselIconClass),
152
+ ...splitClassTokens(carouselIndicatorsBase),
153
+ ...splitClassTokens(carouselIndicatorBase),
154
+ ...splitClassTokens(carouselDotBase),
155
+ ...splitClassTokens(carouselThumbBase),
156
+ ...splitClassTokens(carouselThumbImageClass),
157
+ ...splitClassTokens(carouselThumbFallbackClass)
158
+ ])];
159
+ //#endregion
160
+ //#region src/components/GrCarousel/config.ts
161
+ /**
162
+ * `dependencies` пуст намеренно: стрелки и тумблер — обычные `<button>`, а не
163
+ * `GrButton`. Тот связывает `disabled` с нативным атрибутом, а стрелка на краю
164
+ * без `loop` обязана остаться фокусируемой (`aria-disabled`), иначе фокус
165
+ * падает в `<body>` ровно в момент, когда пользователь долистал до конца.
166
+ */
167
+ var grCarouselConfig = defineGranularComponent(import.meta.url, {
168
+ name: "GrCarousel",
169
+ safelist: grCarouselSafelist
170
+ });
171
+ //#endregion
172
+ export { carouselSlideBase as a, carouselToggleClass as c, carouselViewportSwipeClass as d, grCarouselControlClass as f, carouselRootBase as i, carouselTrackBase as l, grCarouselIndicatorsClass as m, grCarouselSafelist as n, carouselThumbFallbackClass as o, grCarouselIndicatorClass as p, carouselIconClass as r, carouselThumbImageClass as s, grCarouselConfig as t, carouselViewportBase as u };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-BXRmsn3t.js","names":[],"sources":["../../src/components/GrCarousel/grCarouselStyles.ts","../../src/components/GrCarousel/safelist.ts","../../src/components/GrCarousel/config.ts"],"sourcesContent":["import type { GrTone } from '../shared/tones'\n\n/**\n * Вид переключателя слайдов. `none` меняет не только внешность, но и роль самих\n * слайдов: без переключателя `tabpanel` не к чему привязать — см. `GrCarousel.vue`.\n */\nexport const GR_CAROUSEL_INDICATORS = ['dots', 'thumbnails', 'none'] as const\nexport type GrCarouselIndicators = typeof GR_CAROUSEL_INDICATORS[number]\n\n/**\n * Тон текущего переключателя. Своей шкалы компонент не заводит: она одна на\n * пакет, и хук `--gr-carousel-dot-active` перебивает её точечно.\n */\nconst dotToneVars: Record<GrTone, string> = {\n primary: 'var(--gr-carousel-dot-active,var(--gr-primary))',\n neutral: 'var(--gr-carousel-dot-active,var(--gr-secondary))',\n success: 'var(--gr-carousel-dot-active,var(--gr-success))',\n warning: 'var(--gr-carousel-dot-active,var(--gr-warning))',\n danger: 'var(--gr-carousel-dot-active,var(--gr-danger))',\n info: 'var(--gr-carousel-dot-active,var(--gr-info))',\n slate: 'var(--gr-carousel-dot-active,var(--gr-slate))',\n azure: 'var(--gr-carousel-dot-active,var(--gr-azure))',\n}\n\n/**\n * Текущая точка: заливка **и** обвод вокруг неё.\n *\n * Одной заливки мало: при диаметре в 8 пикселей текущая точка отличалась от\n * соседних только оттенком, а на тон вроде `slate` разница почти пропадала. Обвод\n * добавляет второй признак — форму, — и работает там, где цвет не различают.\n *\n * `outline`, а не `ring`: он рисуется вне потока и не требует цвета подложки под\n * зазор, тогда как `ring-offset` пришлось бы красить в фон страницы, которого\n * компонент не знает.\n */\n/**\n * Скобки приносит хелпер, а не литерал.\n *\n * Гейт safelist читает класс-литералы `.ts`-хелперов статически, и запись вида\n * `` `bg-[${color}]` `` он видит как класс, которого в safelist нет. Приём взят\n * у `GrProgressBar`: в литерале скобок не остаётся вовсе.\n */\nfunction arbitrary(value: string): string {\n return `[${value}]`\n}\n\n/**\n * Текущая точка: заливка **и** обвод вокруг неё.\n *\n * Одной заливки мало: при диаметре в 8 пикселей текущая точка отличалась от\n * соседних только оттенком, а на приглушённом тоне разница почти пропадала.\n * Обвод добавляет второй признак — форму, — и работает там, где цвет не\n * различают.\n *\n * `outline`, а не `ring`: он рисуется вне потока и не требует цвета подложки под\n * зазор, тогда как `ring-offset` пришлось бы красить в фон страницы, которого\n * компонент не знает.\n */\nexport function grCarouselDotActiveClass(tone: GrTone): string {\n const color = dotToneVars[tone]\n\n return [\n `bg-${arbitrary(color)}`,\n arbitrary(`outline:var(--gr-carousel-dot-ring-width,2px)_solid_${color}`),\n arbitrary('outline-offset:var(--gr-carousel-dot-ring-offset,2px)'),\n ].join(' ')\n}\n\nexport function grCarouselThumbActiveClass(tone: GrTone): string {\n return `border-${arbitrary(dotToneVars[tone])}`\n}\n\n/** `automatic` — стрелка по индикаторам сразу листает; `manual` — только двигает фокус. */\nexport const GR_CAROUSEL_ACTIVATION_MODES = ['automatic', 'manual'] as const\nexport type GrCarouselActivationMode = typeof GR_CAROUSEL_ACTIVATION_MODES[number]\n\nexport const carouselRootBase = 'relative w-full'\n\nexport const carouselViewportBase = 'relative w-full overflow-hidden'\n\n/**\n * Вертикальная прокрутка страницы остаётся браузеру, горизонталь забирает лента.\n * `select-none` — против выделения текста слайда протяжкой.\n */\nexport const carouselViewportSwipeClass = '[touch-action:pan-y] select-none'\n\nexport const carouselTrackBase = 'flex w-full will-change-transform transition-transform duration-[var(--gr-duration-base)] ease-[var(--gr-ease-out)]'\n\nexport const carouselSlideBase = 'w-full min-w-0 shrink-0 grow-0 basis-full'\n\n/**\n * Стрелки лежат поверх произвольного содержимого, поэтому несут собственную\n * подложку: на светлом кадре иконка без неё пропадает. `z-10` — порядок внутри\n * собственного stacking-контекста компонента, а не слой страницы.\n */\nexport const carouselControlBase = 'absolute top-1/2 z-10 inline-flex h-9 w-9 -translate-y-1/2 items-center justify-center rounded-[var(--gr-radius-full)] border border-[var(--gr-brd)] bg-[var(--gr-carousel-control-bg,var(--gr-bg))] text-[var(--gr-carousel-control-fg,var(--gr-fg))] transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]'\n\nexport const carouselControlPositions = {\n prev: 'start-2',\n next: 'end-2',\n} as const\n\n/**\n * Стрелка на краю без `loop` гасится фоном, а не `opacity`: прозрачность\n * разбавляет выверенные на AA токены текста и роняет контраст.\n */\nexport const carouselControlStates = {\n idle: 'hover:bg-[var(--gr-carousel-control-bg-hover,var(--gr-muted))]',\n disabled: 'cursor-not-allowed bg-[var(--gr-muted)] text-[var(--gr-disabled-fg)]',\n} as const\n\n/** Тумблер автопрокрутки: тот же хром, что у стрелок, но в углу ленты. */\nexport const carouselToggleClass = 'absolute end-2 top-2 z-10 inline-flex h-8 w-8 items-center justify-center rounded-[var(--gr-radius-full)] border border-[var(--gr-brd)] bg-[var(--gr-carousel-control-bg,var(--gr-bg))] text-[var(--gr-carousel-control-fg,var(--gr-fg))] transition-colors hover:bg-[var(--gr-carousel-control-bg-hover,var(--gr-muted))] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]'\n\nexport const carouselIconClass = 'h-4 w-4 shrink-0'\n\n/**\n * Полоса переключателей прокручивается, а не переносится: перенос увёл бы\n * миниатюры под соседний блок. Своей остановки `Tab` у неё нет — её дети\n * фокусируемы, и вторая остановка была бы лишней (приём `GrTabs`).\n */\nexport const carouselIndicatorsBase = 'flex max-w-full items-center overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden'\n\nexport const carouselIndicatorsVariants = {\n // Поля по вертикали не украшение: полоса — скроллер, а `overflow-x: auto`\n // по спецификации обрезает и по вертикали, и обвод текущей точки срезался бы.\n dots: 'justify-center gap-[var(--gr-carousel-gap,0.5rem)] px-1 pt-3.5 pb-1.5',\n thumbnails: 'gap-[var(--gr-carousel-gap,0.5rem)] pt-3',\n none: '',\n} as const\n\nexport const carouselIndicatorBase = 'shrink-0 transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]'\n\nexport const carouselDotBase = 'rounded-[var(--gr-radius-full)] h-[var(--gr-carousel-dot-size,0.5rem)] w-[var(--gr-carousel-dot-size,0.5rem)]'\n\nexport const carouselDotStates = {\n idle: 'bg-[var(--gr-carousel-dot,var(--gr-brd))] hover:bg-[var(--gr-muted-fg)]',\n} as const\n\nexport const carouselThumbBase = 'overflow-hidden rounded-[var(--gr-radius-md)] border-2 w-[var(--gr-carousel-thumb-width,4rem)] h-[var(--gr-carousel-thumb-height,2.5rem)]'\n\nexport const carouselThumbStates = {\n idle: 'border-[var(--gr-brd)] hover:border-[var(--gr-muted-fg)]',\n} as const\n\nexport const carouselThumbImageClass = 'h-full w-full object-cover'\n\n/** Миниатюры не дали — плитка держит ритм полосы номером слайда. */\nexport const carouselThumbFallbackClass = 'flex h-full w-full items-center justify-center bg-[var(--gr-muted)] text-[var(--gr-muted-fg)] text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]'\n\nexport function grCarouselControlClass(direction: 'prev' | 'next', disabled: boolean): string {\n return [\n carouselControlBase,\n carouselControlPositions[direction],\n disabled ? carouselControlStates.disabled : carouselControlStates.idle,\n ].join(' ')\n}\n\nexport function grCarouselIndicatorsClass(variant: GrCarouselIndicators): string {\n return [carouselIndicatorsBase, carouselIndicatorsVariants[variant]].filter(Boolean).join(' ')\n}\n\nexport function grCarouselIndicatorClass(\n variant: GrCarouselIndicators,\n active: boolean,\n tone: GrTone = 'primary',\n): string {\n if (variant === 'thumbnails') {\n return [\n carouselIndicatorBase,\n carouselThumbBase,\n active ? grCarouselThumbActiveClass(tone) : carouselThumbStates.idle,\n ].join(' ')\n }\n\n return [\n carouselIndicatorBase,\n carouselDotBase,\n active ? grCarouselDotActiveClass(tone) : carouselDotStates.idle,\n ].join(' ')\n}\n","import { splitClassTokens } from '../shared/classTokens'\nimport { GR_TONES } from '../shared/tones'\nimport {\n carouselControlBase,\n carouselControlPositions,\n carouselControlStates,\n carouselDotBase,\n carouselDotStates,\n carouselIconClass,\n carouselIndicatorBase,\n carouselIndicatorsBase,\n carouselIndicatorsVariants,\n carouselRootBase,\n carouselSlideBase,\n carouselThumbBase,\n carouselThumbFallbackClass,\n carouselThumbImageClass,\n carouselThumbStates,\n carouselToggleClass,\n grCarouselDotActiveClass,\n grCarouselThumbActiveClass,\n carouselTrackBase,\n carouselViewportBase,\n carouselViewportSwipeClass,\n} from './grCarouselStyles'\n\nexport const grCarouselSafelist = [...new Set([\n // Тон приходит пропом, поэтому в скан попадает не он, а вся шкала.\n ...GR_TONES.flatMap(tone => splitClassTokens(grCarouselDotActiveClass(tone))),\n ...GR_TONES.flatMap(tone => splitClassTokens(grCarouselThumbActiveClass(tone))),\n ...Object.values(carouselControlPositions).flatMap(splitClassTokens),\n ...Object.values(carouselControlStates).flatMap(splitClassTokens),\n ...Object.values(carouselIndicatorsVariants).flatMap(splitClassTokens),\n ...Object.values(carouselDotStates).flatMap(splitClassTokens),\n ...Object.values(carouselThumbStates).flatMap(splitClassTokens),\n ...splitClassTokens(carouselRootBase),\n ...splitClassTokens(carouselViewportBase),\n ...splitClassTokens(carouselViewportSwipeClass),\n ...splitClassTokens(carouselTrackBase),\n ...splitClassTokens(carouselSlideBase),\n ...splitClassTokens(carouselControlBase),\n ...splitClassTokens(carouselToggleClass),\n ...splitClassTokens(carouselIconClass),\n ...splitClassTokens(carouselIndicatorsBase),\n ...splitClassTokens(carouselIndicatorBase),\n ...splitClassTokens(carouselDotBase),\n ...splitClassTokens(carouselThumbBase),\n ...splitClassTokens(carouselThumbImageClass),\n ...splitClassTokens(carouselThumbFallbackClass),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grCarouselSafelist } from './safelist'\n\n/**\n * `dependencies` пуст намеренно: стрелки и тумблер — обычные `<button>`, а не\n * `GrButton`. Тот связывает `disabled` с нативным атрибутом, а стрелка на краю\n * без `loop` обязана остаться фокусируемой (`aria-disabled`), иначе фокус\n * падает в `<body>` ровно в момент, когда пользователь долистал до конца.\n */\nexport const grCarouselConfig = defineGranularComponent(import.meta.url, {\n name: 'GrCarousel',\n safelist: grCarouselSafelist,\n})\n"],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ import { n as splitClassTokens } from "./classTokens-8v2XC74x.js";
2
+ import { defineGranularComponent } from "@feugene/unocss-preset-granular/contract";
3
+ //#region src/components/GrAffix/grAffixStyles.ts
4
+ /**
5
+ * Слой — локальное число, а не токен шкалы `--gr-z-*`, и это осознанно.
6
+ * `docs/z-index.md` оставляет шаг между слоями приложению «вклиниться между
7
+ * уровнями — например, свой sticky-хедер под дропдауном»; аффикс это он и есть,
8
+ * так что занимать под него ступень шкалы значило бы забрать оставленное место.
9
+ * К тому же `sticky` с `z-index` заводит свой stacking-контекст — число всё
10
+ * равно локально, и глобального ответа «выше или ниже нижней навигации» у
11
+ * компонента нет: он зависит от приложения. Нужен слой шкалы — приложение
12
+ * ставит `--gr-affix-z: var(--gr-z-navbar)`.
13
+ *
14
+ * `ease-*` обязателен вместе с `duration-*`: без него `presetMini` подставит
15
+ * свою кривую, и движение задавал бы пресет, а не дизайн-система.
16
+ */
17
+ var affixBaseClass = "z-[var(--gr-affix-z,10)] transition-[box-shadow,background-color] duration-[var(--gr-duration-fast)] ease-[var(--gr-ease-out)]";
18
+ var affixStickyClass = "sticky";
19
+ var affixEdgeClass = {
20
+ top: "top-[var(--gr-affix-offset,0px)]",
21
+ bottom: "bottom-[var(--gr-affix-offset,0px)]"
22
+ };
23
+ /**
24
+ * Поверхность прилипшей панели.
25
+ *
26
+ * Фон обязателен: без него уезжающее под панель содержимое просвечивает
27
+ * насквозь — тот же дефект, что у `stickyHeader` в `GrTable` и у закреплённых
28
+ * колонок `GrDataTable`. Отделяет панель тень, а не рамка: рамка добавляет
29
+ * высоту и сдвигает раскладку ровно в момент прилипания.
30
+ *
31
+ * Дефолт фона — `--gr-bg`, а не `--gr-card`: аффикс стоит на странице, и
32
+ * содержимое обязано под ним исчезать, а не наезжать на вторую поверхность.
33
+ * Внутри карточки перекрывается строкой `style="--gr-affix-bg: var(--gr-card)"`.
34
+ *
35
+ * Тень направлена от края прилипания, поэтому наборов два. Верхний берёт
36
+ * системный уровень elevation — тема даёт ему свою плотность. У нижнего
37
+ * направление обратное, системного зеркала нет, и он собирается подмесом
38
+ * `--gr-fg`: подмес переворачивается вместе с темой, литеральный `rgba` — нет.
39
+ */
40
+ var affixSurfaceClass = {
41
+ top: "bg-[var(--gr-affix-bg,var(--gr-bg))] shadow-[var(--gr-affix-shadow,var(--gr-shadow-2))]",
42
+ bottom: "bg-[var(--gr-affix-bg,var(--gr-bg))] shadow-[var(--gr-affix-shadow,0_-8px_24px_-12px_color-mix(in_srgb,var(--gr-fg)_45%,transparent))]"
43
+ };
44
+ /**
45
+ * Сентинел — зонд положения в потоке: отмечает место, где коробка стояла бы, не
46
+ * будь она липкой. Раскладку не сдвигает, потому что пиксель высоты гасится
47
+ * пикселем отрицательного поля с той стороны, где стоит коробка.
48
+ *
49
+ * Высота именно пиксель, а не ноль: нулевая площадь у цели
50
+ * `IntersectionObserver` — спорный по спецификации угол, и полагаться на него
51
+ * незачем, когда пиксель ничего не стоит.
52
+ */
53
+ var affixSentinelClass = {
54
+ top: "h-px -mb-px pointer-events-none",
55
+ bottom: "h-px -mt-px pointer-events-none"
56
+ };
57
+ function grAffixRootClass(placement, sticky, surface) {
58
+ return [
59
+ affixBaseClass,
60
+ sticky ? affixStickyClass : "",
61
+ sticky ? affixEdgeClass[placement] : "",
62
+ surface ? affixSurfaceClass[placement] : ""
63
+ ].filter(Boolean).join(" ");
64
+ }
65
+ //#endregion
66
+ //#region src/components/GrAffix/safelist.ts
67
+ var grAffixSafelist = [.../* @__PURE__ */ new Set([
68
+ ...splitClassTokens(affixBaseClass),
69
+ ...splitClassTokens(affixStickyClass),
70
+ ...Object.values(affixEdgeClass).flatMap(splitClassTokens),
71
+ ...Object.values(affixSurfaceClass).flatMap(splitClassTokens),
72
+ ...Object.values(affixSentinelClass).flatMap(splitClassTokens)
73
+ ])];
74
+ //#endregion
75
+ //#region src/components/GrAffix/config.ts
76
+ var grAffixConfig = defineGranularComponent(import.meta.url, {
77
+ name: "GrAffix",
78
+ safelist: grAffixSafelist
79
+ });
80
+ //#endregion
81
+ export { grAffixRootClass as i, grAffixSafelist as n, affixSentinelClass as r, grAffixConfig as t };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-Dg0bSoGw.js","names":[],"sources":["../../src/components/GrAffix/grAffixStyles.ts","../../src/components/GrAffix/safelist.ts","../../src/components/GrAffix/config.ts"],"sourcesContent":["import type { GrAffixPlacement } from './affixState'\n\n/**\n * Слой — локальное число, а не токен шкалы `--gr-z-*`, и это осознанно.\n * `docs/z-index.md` оставляет шаг между слоями приложению «вклиниться между\n * уровнями — например, свой sticky-хедер под дропдауном»; аффикс это он и есть,\n * так что занимать под него ступень шкалы значило бы забрать оставленное место.\n * К тому же `sticky` с `z-index` заводит свой stacking-контекст — число всё\n * равно локально, и глобального ответа «выше или ниже нижней навигации» у\n * компонента нет: он зависит от приложения. Нужен слой шкалы — приложение\n * ставит `--gr-affix-z: var(--gr-z-navbar)`.\n *\n * `ease-*` обязателен вместе с `duration-*`: без него `presetMini` подставит\n * свою кривую, и движение задавал бы пресет, а не дизайн-система.\n */\nexport const affixBaseClass = 'z-[var(--gr-affix-z,10)] transition-[box-shadow,background-color] duration-[var(--gr-duration-fast)] ease-[var(--gr-ease-out)]'\n\nexport const affixStickyClass = 'sticky'\n\nexport const affixEdgeClass: Record<GrAffixPlacement, string> = {\n top: 'top-[var(--gr-affix-offset,0px)]',\n bottom: 'bottom-[var(--gr-affix-offset,0px)]',\n}\n\n/**\n * Поверхность прилипшей панели.\n *\n * Фон обязателен: без него уезжающее под панель содержимое просвечивает\n * насквозь — тот же дефект, что у `stickyHeader` в `GrTable` и у закреплённых\n * колонок `GrDataTable`. Отделяет панель тень, а не рамка: рамка добавляет\n * высоту и сдвигает раскладку ровно в момент прилипания.\n *\n * Дефолт фона — `--gr-bg`, а не `--gr-card`: аффикс стоит на странице, и\n * содержимое обязано под ним исчезать, а не наезжать на вторую поверхность.\n * Внутри карточки перекрывается строкой `style=\"--gr-affix-bg: var(--gr-card)\"`.\n *\n * Тень направлена от края прилипания, поэтому наборов два. Верхний берёт\n * системный уровень elevation — тема даёт ему свою плотность. У нижнего\n * направление обратное, системного зеркала нет, и он собирается подмесом\n * `--gr-fg`: подмес переворачивается вместе с темой, литеральный `rgba` — нет.\n */\nexport const affixSurfaceClass: Record<GrAffixPlacement, string> = {\n top: 'bg-[var(--gr-affix-bg,var(--gr-bg))] shadow-[var(--gr-affix-shadow,var(--gr-shadow-2))]',\n bottom: 'bg-[var(--gr-affix-bg,var(--gr-bg))] shadow-[var(--gr-affix-shadow,0_-8px_24px_-12px_color-mix(in_srgb,var(--gr-fg)_45%,transparent))]',\n}\n\n/**\n * Сентинел — зонд положения в потоке: отмечает место, где коробка стояла бы, не\n * будь она липкой. Раскладку не сдвигает, потому что пиксель высоты гасится\n * пикселем отрицательного поля с той стороны, где стоит коробка.\n *\n * Высота именно пиксель, а не ноль: нулевая площадь у цели\n * `IntersectionObserver` — спорный по спецификации угол, и полагаться на него\n * незачем, когда пиксель ничего не стоит.\n */\nexport const affixSentinelClass: Record<GrAffixPlacement, string> = {\n top: 'h-px -mb-px pointer-events-none',\n bottom: 'h-px -mt-px pointer-events-none',\n}\n\nexport function grAffixRootClass(placement: GrAffixPlacement, sticky: boolean, surface: boolean): string {\n return [\n affixBaseClass,\n sticky ? affixStickyClass : '',\n sticky ? affixEdgeClass[placement] : '',\n surface ? affixSurfaceClass[placement] : '',\n ].filter(Boolean).join(' ')\n}\n","import { splitClassTokens } from '../shared/classTokens'\n\nimport {\n affixBaseClass,\n affixEdgeClass,\n affixSentinelClass,\n affixStickyClass,\n affixSurfaceClass,\n} from './grAffixStyles'\n\nexport const grAffixSafelist = [...new Set([\n ...splitClassTokens(affixBaseClass),\n ...splitClassTokens(affixStickyClass),\n ...Object.values(affixEdgeClass).flatMap(splitClassTokens),\n ...Object.values(affixSurfaceClass).flatMap(splitClassTokens),\n ...Object.values(affixSentinelClass).flatMap(splitClassTokens),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grAffixSafelist } from './safelist'\n\nexport const grAffixConfig = defineGranularComponent(import.meta.url, {\n name: 'GrAffix',\n safelist: grAffixSafelist,\n})\n"],"mappings":";;;;;;;;;;;;;;;;AAeA,IAAa,iBAAiB;AAE9B,IAAa,mBAAmB;AAEhC,IAAa,iBAAmD;CAC9D,KAAK;CACL,QAAQ;AACV;;;;;;;;;;;;;;;;;;AAmBA,IAAa,oBAAsD;CACjE,KAAK;CACL,QAAQ;AACV;;;;;;;;;;AAWA,IAAa,qBAAuD;CAClE,KAAK;CACL,QAAQ;AACV;AAEA,SAAgB,iBAAiB,WAA6B,QAAiB,SAA0B;CACvG,OAAO;EACL;EACA,SAAS,mBAAmB;EAC5B,SAAS,eAAe,aAAa;EACrC,UAAU,kBAAkB,aAAa;CAC3C,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AAC5B;;;ACzDA,IAAa,kBAAkB,CAAC,mBAAG,IAAI,IAAI;CACzC,GAAG,iBAAiB,cAAc;CAClC,GAAG,iBAAiB,gBAAgB;CACpC,GAAG,OAAO,OAAO,cAAc,CAAC,CAAC,QAAQ,gBAAgB;CACzD,GAAG,OAAO,OAAO,iBAAiB,CAAC,CAAC,QAAQ,gBAAgB;CAC5D,GAAG,OAAO,OAAO,kBAAkB,CAAC,CAAC,QAAQ,gBAAgB;AAC/D,CAAC,CAAC;;;ACZF,IAAa,gBAAgB,wBAAwB,YAAY,KAAK;CACpE,MAAM;CACN,UAAU;AACZ,CAAC"}
@@ -0,0 +1,237 @@
1
+ import { n as splitClassTokens } from "./classTokens-8v2XC74x.js";
2
+ import { defineGranularComponent } from "@feugene/unocss-preset-granular/contract";
3
+ //#region src/components/GrTransfer/grTransferStyles.ts
4
+ var transferRootBase = "flex items-stretch gap-4";
5
+ var transferPanelBase = "flex min-w-0 flex-1 flex-col overflow-hidden rounded-[var(--gr-radius-md)] border border-[var(--gr-brd)] bg-[var(--gr-card)]";
6
+ /**
7
+ * Панель под указателем во время переноса.
8
+ *
9
+ * Одной рамки мало: на широком экране она за пределами взгляда, занятого
10
+ * курсором. Мягкая подложка сообщает «сюда» там, где человек и смотрит.
11
+ */
12
+ var transferPanelDropClass = "border-[var(--gr-transfer-drop-brd,var(--gr-primary))] bg-[var(--gr-transfer-drop-bg,color-mix(in_srgb,var(--gr-primary)_6%,transparent))]";
13
+ var transferHeaderBase = "flex items-center gap-2 border-b border-[var(--gr-brd)]";
14
+ var transferTitleClass = "min-w-0 flex-1 truncate font-600 text-[var(--gr-fg)]";
15
+ var transferCounterClass = "shrink-0 text-[var(--gr-muted-fg)] tabular-nums";
16
+ var transferSearchBase = "border-b border-[var(--gr-brd)]";
17
+ /**
18
+ * Список — скроллер, но своего таб-стопа не получает: его строки фокусируемы,
19
+ * и вторая остановка `Tab` перед ними была бы лишней (приём `GrTabs`).
20
+ */
21
+ var transferListBase = "relative min-h-0 flex-1 overflow-y-auto";
22
+ var transferOptionBase = "relative flex w-full select-none items-center gap-2 text-start transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)] focus-visible:ring-inset";
23
+ /** Строку можно взять — курсор обязан это предложить до нажатия, а не после. */
24
+ var transferOptionGrabClass = "cursor-grab";
25
+ var transferOptionPlainClass = "cursor-pointer";
26
+ var transferOptionStates = {
27
+ selected: "bg-[var(--gr-transfer-selected-bg,color-mix(in_srgb,var(--gr-primary)_12%,transparent))] text-[var(--gr-fg)]",
28
+ idle: "text-[var(--gr-fg)] hover:bg-[var(--gr-muted)]",
29
+ disabled: "cursor-not-allowed bg-[var(--gr-muted)] text-[var(--gr-disabled-fg)]"
30
+ };
31
+ /**
32
+ * Строка, только что приехавшая из соседней панели.
33
+ *
34
+ * Статичный итог перенос уже показывает — строка приходит отмеченной, счётчики
35
+ * меняются, — но само **движение** ничем не выдано: строки просто возникают.
36
+ * Короткая подсветка связывает «нажал» и «появилось». Под `prefers-reduced-motion`
37
+ * её гасит глобальный кламп, и остаётся тот же статичный итог.
38
+ */
39
+ var transferOptionArrivedClass = "gr-transfer-arrived";
40
+ /**
41
+ * Место, откуда строку унесли.
42
+ *
43
+ * Правило живёт в `<style>` компонента, а не утилитой: цвет текста строки задаёт
44
+ * класс состояния той же специфичности, и кто победит, решал бы порядок правил в
45
+ * собранном CSS — та же ловушка, что записана в `grTabsStyles.ts`.
46
+ */
47
+ var transferOptionDraggingClass = "gr-transfer-vacated";
48
+ /**
49
+ * Отметка строки декоративна: `GrCheckbox` внутрь `role="option"` вложить
50
+ * нельзя — его индикатор сам `role="checkbox"` с `tabindex="0"`, то есть ровно
51
+ * `nested-interactive`. Состояние объявляет `aria-selected` самой строки.
52
+ */
53
+ var transferMarkBase = "inline-flex shrink-0 items-center justify-center rounded-[var(--gr-radius-sm)] border border-[var(--gr-brd)] bg-[var(--gr-bg)]";
54
+ var transferMarkStates = {
55
+ selected: "border-[var(--gr-primary)] bg-[var(--gr-primary)] text-[var(--gr-primary-fg)]",
56
+ idle: ""
57
+ };
58
+ var transferMarkIconClass = "h-3 w-3";
59
+ var transferLabelClass = "min-w-0 flex-1 truncate";
60
+ /**
61
+ * Место вставки — псевдоэлемент строки-соседа, а не отдельный узел: лишний узел
62
+ * между строками ломает подсчёт позиций и разделители.
63
+ */
64
+ var transferIndicatorBeforeClass = "before:absolute before:inset-x-0 before:top-0 before:h-[var(--gr-transfer-indicator-width,3px)] before:rounded-[var(--gr-radius-full)] before:bg-[var(--gr-transfer-indicator,var(--gr-primary))] before:content-empty";
65
+ var transferIndicatorAfterClass = "after:absolute after:inset-x-0 after:bottom-0 after:h-[var(--gr-transfer-indicator-width,3px)] after:rounded-[var(--gr-radius-full)] after:bg-[var(--gr-transfer-indicator,var(--gr-primary))] after:content-empty";
66
+ var transferEmptyClass = "flex h-full items-center justify-center px-4 py-6 text-center text-[var(--gr-muted-fg)]";
67
+ var transferActionsClass = "flex shrink-0 items-center";
68
+ /**
69
+ * Кнопки перестановки в шапке правой панели. Перестановка обязана быть видимой:
70
+ * сочетание `Alt` + стрелка её ускоряет, но само по себе неоткрываемо, а на
71
+ * macOS ещё и неудобно — почти все мета-клавиши там заняты системой.
72
+ *
73
+ * Стрелки горизонтальные, потому что порядок — это **последовательность**, а не
74
+ * положение на экране: правая панель задаёт порядок колонок отчёта или полей
75
+ * выгрузки, и они читаются слева направо.
76
+ *
77
+ * Сочетание при этом остаётся вертикальным (`Alt` + `↑`/`↓`), и расхождение с
78
+ * иконками намеренное: в Chrome и Firefox под Windows и Linux `Alt` + `←`/`→` —
79
+ * это «назад/вперёд» в истории браузера. В Safari навигация висит на
80
+ * `Cmd` + стрелках, то есть там сочетание было бы свободно, — но пакет едет ко
81
+ * всем, и ориентироваться на одну платформу нельзя.
82
+ */
83
+ var transferReorderBase = "inline-flex shrink-0 items-center justify-center rounded-[var(--gr-radius-sm)] text-[var(--gr-muted-fg)] transition-colors hover:bg-[var(--gr-muted)] hover:text-[var(--gr-fg)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]";
84
+ var transferReorderSizes = {
85
+ xs: "h-5 w-5",
86
+ sm: "h-5 w-5",
87
+ md: "h-6 w-6",
88
+ lg: "h-7 w-7"
89
+ };
90
+ var transferReorderIconClass = "h-3.5 w-3.5";
91
+ function grTransferReorderClass(size) {
92
+ return [transferReorderBase, transferReorderSizes[size]].join(" ");
93
+ }
94
+ var transferActionIconClass = "h-4 w-4 shrink-0";
95
+ /**
96
+ * Кнопка без пути наружу остаётся в таб-порядке — нативный `disabled` уронил бы
97
+ * фокус в тело документа. Показывает она это правилом в `<style>` компонента, а
98
+ * не утилитой: у `GrButton` свой фон классом той же специфичности, и кто победит,
99
+ * решал бы порядок в сгенерированном CSS, то есть через раз.
100
+ */
101
+ var transferActionInertClass = "cursor-not-allowed";
102
+ /**
103
+ * Предпросмотр переносимого: он и есть ответ на «где сейчас элемент».
104
+ *
105
+ * Без него строка оставалась на месте, а за курсором не двигалось ничего — жест
106
+ * выглядел так, будто ничего не происходит. Узел не ловит указатель
107
+ * (`pointer-events: none`), иначе он перехватывал бы попадание у самих панелей.
108
+ */
109
+ var transferGhostClass = "pointer-events-none fixed left-0 top-0 z-10 flex max-w-[16rem] items-center gap-2 rounded-[var(--gr-radius-md)] border border-[var(--gr-brd)] bg-[var(--gr-transfer-ghost-bg,var(--gr-card))] px-3 py-1.5 text-[var(--gr-fg)] shadow-[var(--gr-shadow-2)]";
110
+ var transferGhostLabelClass = "min-w-0 flex-1 truncate text-[length:var(--gr-control-text-sm)] leading-[var(--gr-control-leading-sm)]";
111
+ /** Сколько строк едет разом: одну видно по подписи, остальные — числом. */
112
+ var transferGhostCountClass = "shrink-0 rounded-[var(--gr-radius-full)] bg-[var(--gr-primary)] px-1.5 text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)] text-[var(--gr-primary-fg)] tabular-nums";
113
+ var transferStatusClass = "sr-only";
114
+ var transferHeaderSizes = {
115
+ xs: "px-2 py-1 text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]",
116
+ sm: "px-2.5 py-1.5 text-[length:var(--gr-control-text-sm)] leading-[var(--gr-control-leading-sm)]",
117
+ md: "px-3 py-2 text-[length:var(--gr-control-text-md)] leading-[var(--gr-control-leading-md)]",
118
+ lg: "px-4 py-2.5 text-[length:var(--gr-control-text-lg)] leading-[var(--gr-control-leading-lg)]"
119
+ };
120
+ var transferOptionSizes = {
121
+ xs: "px-2 py-1 text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]",
122
+ sm: "px-2.5 py-1.5 text-[length:var(--gr-control-text-sm)] leading-[var(--gr-control-leading-sm)]",
123
+ md: "px-3 py-2 text-[length:var(--gr-control-text-md)] leading-[var(--gr-control-leading-md)]",
124
+ lg: "px-4 py-2.5 text-[length:var(--gr-control-text-lg)] leading-[var(--gr-control-leading-lg)]"
125
+ };
126
+ var transferMarkSizes = {
127
+ xs: "h-3.5 w-3.5",
128
+ sm: "h-4 w-4",
129
+ md: "h-4 w-4",
130
+ lg: "h-5 w-5"
131
+ };
132
+ var transferSearchSizes = {
133
+ xs: "p-1",
134
+ sm: "p-1.5",
135
+ md: "p-2",
136
+ lg: "p-2.5"
137
+ };
138
+ var transferEmptySizes = {
139
+ xs: "text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]",
140
+ sm: "text-[length:var(--gr-control-text-sm)] leading-[var(--gr-control-leading-sm)]",
141
+ md: "text-[length:var(--gr-control-text-md)] leading-[var(--gr-control-leading-md)]",
142
+ lg: "text-[length:var(--gr-control-text-lg)] leading-[var(--gr-control-leading-lg)]"
143
+ };
144
+ var transferActionsSizes = {
145
+ xs: "px-1",
146
+ sm: "px-1.5",
147
+ md: "px-2",
148
+ lg: "px-2.5"
149
+ };
150
+ function grTransferOptionClass(options) {
151
+ const state = options.disabled ? transferOptionStates.disabled : options.selected ? transferOptionStates.selected : transferOptionStates.idle;
152
+ return [
153
+ transferOptionBase,
154
+ options.draggable && !options.disabled ? transferOptionGrabClass : transferOptionPlainClass,
155
+ transferOptionSizes[options.size],
156
+ state,
157
+ options.dragging ? transferOptionDraggingClass : "",
158
+ options.arrived ? transferOptionArrivedClass : "",
159
+ options.indicator === "before" ? transferIndicatorBeforeClass : "",
160
+ options.indicator === "after" ? transferIndicatorAfterClass : ""
161
+ ].filter(Boolean).join(" ");
162
+ }
163
+ function grTransferMarkClass(size, selected) {
164
+ return [
165
+ transferMarkBase,
166
+ transferMarkSizes[size],
167
+ selected ? transferMarkStates.selected : transferMarkStates.idle
168
+ ].filter(Boolean).join(" ");
169
+ }
170
+ function grTransferPanelClass(dropActive) {
171
+ return [transferPanelBase, dropActive ? transferPanelDropClass : ""].filter(Boolean).join(" ");
172
+ }
173
+ function grTransferEmptyClass(size) {
174
+ return [transferEmptyClass, transferEmptySizes[size]].join(" ");
175
+ }
176
+ function grTransferHeaderClass(size) {
177
+ return [transferHeaderBase, transferHeaderSizes[size]].join(" ");
178
+ }
179
+ function grTransferSearchClass(size) {
180
+ return [transferSearchBase, transferSearchSizes[size]].join(" ");
181
+ }
182
+ function grTransferActionsClass(size) {
183
+ return [transferActionsClass, transferActionsSizes[size]].join(" ");
184
+ }
185
+ //#endregion
186
+ //#region src/components/GrTransfer/safelist.ts
187
+ var grTransferSafelist = [.../* @__PURE__ */ new Set([
188
+ ...Object.values(transferHeaderSizes).flatMap(splitClassTokens),
189
+ ...Object.values(transferOptionSizes).flatMap(splitClassTokens),
190
+ ...Object.values(transferMarkSizes).flatMap(splitClassTokens),
191
+ ...Object.values(transferSearchSizes).flatMap(splitClassTokens),
192
+ ...Object.values(transferEmptySizes).flatMap(splitClassTokens),
193
+ ...Object.values(transferActionsSizes).flatMap(splitClassTokens),
194
+ ...Object.values(transferReorderSizes).flatMap(splitClassTokens),
195
+ ...Object.values(transferOptionStates).flatMap(splitClassTokens),
196
+ ...Object.values(transferMarkStates).flatMap(splitClassTokens),
197
+ ...splitClassTokens(transferRootBase),
198
+ ...splitClassTokens(transferPanelBase),
199
+ ...splitClassTokens(transferPanelDropClass),
200
+ ...splitClassTokens(transferHeaderBase),
201
+ ...splitClassTokens(transferTitleClass),
202
+ ...splitClassTokens(transferCounterClass),
203
+ ...splitClassTokens(transferGhostClass),
204
+ ...splitClassTokens(transferGhostLabelClass),
205
+ ...splitClassTokens(transferGhostCountClass),
206
+ ...splitClassTokens(transferSearchBase),
207
+ ...splitClassTokens(transferListBase),
208
+ ...splitClassTokens(transferOptionBase),
209
+ ...splitClassTokens(transferOptionGrabClass),
210
+ ...splitClassTokens(transferOptionPlainClass),
211
+ ...splitClassTokens(transferMarkBase),
212
+ ...splitClassTokens(transferMarkIconClass),
213
+ ...splitClassTokens(transferLabelClass),
214
+ ...splitClassTokens(transferIndicatorBeforeClass),
215
+ ...splitClassTokens(transferIndicatorAfterClass),
216
+ ...splitClassTokens(transferEmptyClass),
217
+ ...splitClassTokens(transferActionsClass),
218
+ ...splitClassTokens(transferActionIconClass),
219
+ ...splitClassTokens(transferActionInertClass),
220
+ ...splitClassTokens(transferReorderBase),
221
+ ...splitClassTokens(transferReorderIconClass),
222
+ ...splitClassTokens(transferStatusClass)
223
+ ])];
224
+ //#endregion
225
+ //#region src/components/GrTransfer/config.ts
226
+ var grTransferConfig = defineGranularComponent(import.meta.url, {
227
+ name: "GrTransfer",
228
+ dependencies: [
229
+ "GrButton",
230
+ "GrButtonGroup",
231
+ "GrCheckbox",
232
+ "GrInput"
233
+ ],
234
+ safelist: grTransferSafelist
235
+ });
236
+ //#endregion
237
+ export { transferTitleClass as C, transferStatusClass as S, transferLabelClass as _, grTransferHeaderClass as a, transferReorderIconClass as b, grTransferPanelClass as c, transferActionIconClass as d, transferActionInertClass as f, transferGhostLabelClass as g, transferGhostCountClass as h, grTransferEmptyClass as i, grTransferReorderClass as l, transferGhostClass as m, grTransferSafelist as n, grTransferMarkClass as o, transferCounterClass as p, grTransferActionsClass as r, grTransferOptionClass as s, grTransferConfig as t, grTransferSearchClass as u, transferListBase as v, transferRootBase as x, transferMarkIconClass as y };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-DmED6aJV.js","names":[],"sources":["../../src/components/GrTransfer/grTransferStyles.ts","../../src/components/GrTransfer/safelist.ts","../../src/components/GrTransfer/config.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nexport type GrTransferSize = GrComponentSize\n\nexport const transferRootBase = 'flex items-stretch gap-4'\n\nexport const transferPanelBase = 'flex min-w-0 flex-1 flex-col overflow-hidden rounded-[var(--gr-radius-md)] border border-[var(--gr-brd)] bg-[var(--gr-card)]'\n\n/**\n * Панель под указателем во время переноса.\n *\n * Одной рамки мало: на широком экране она за пределами взгляда, занятого\n * курсором. Мягкая подложка сообщает «сюда» там, где человек и смотрит.\n */\nexport const transferPanelDropClass = 'border-[var(--gr-transfer-drop-brd,var(--gr-primary))] bg-[var(--gr-transfer-drop-bg,color-mix(in_srgb,var(--gr-primary)_6%,transparent))]'\n\nexport const transferHeaderBase = 'flex items-center gap-2 border-b border-[var(--gr-brd)]'\n\nexport const transferTitleClass = 'min-w-0 flex-1 truncate font-600 text-[var(--gr-fg)]'\n\nexport const transferCounterClass = 'shrink-0 text-[var(--gr-muted-fg)] tabular-nums'\n\nexport const transferSearchBase = 'border-b border-[var(--gr-brd)]'\n\n/**\n * Список — скроллер, но своего таб-стопа не получает: его строки фокусируемы,\n * и вторая остановка `Tab` перед ними была бы лишней (приём `GrTabs`).\n */\nexport const transferListBase = 'relative min-h-0 flex-1 overflow-y-auto'\n\nexport const transferOptionBase = 'relative flex w-full select-none items-center gap-2 text-start transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)] focus-visible:ring-inset'\n\n/** Строку можно взять — курсор обязан это предложить до нажатия, а не после. */\nexport const transferOptionGrabClass = 'cursor-grab'\n\nexport const transferOptionPlainClass = 'cursor-pointer'\n\nexport const transferOptionStates = {\n // Тон, а не заливка: строка остаётся читаемой обычным `--gr-fg`, и контраст\n // не приходится выверять заново. Мягкой подложки под `--gr-primary` в темах\n // нет (есть только у danger/info/success/warning), поэтому `color-mix` —\n // тот же приём, которым красят наведение `GrTabs` и `GrSelect`.\n selected: 'bg-[var(--gr-transfer-selected-bg,color-mix(in_srgb,var(--gr-primary)_12%,transparent))] text-[var(--gr-fg)]',\n idle: 'text-[var(--gr-fg)] hover:bg-[var(--gr-muted)]',\n // Гашение фоном, а не `opacity`: прозрачность разбавляет выверенные на AA\n // токены текста и роняет контраст.\n disabled: 'cursor-not-allowed bg-[var(--gr-muted)] text-[var(--gr-disabled-fg)]',\n} as const\n\n/**\n * Строка, только что приехавшая из соседней панели.\n *\n * Статичный итог перенос уже показывает — строка приходит отмеченной, счётчики\n * меняются, — но само **движение** ничем не выдано: строки просто возникают.\n * Короткая подсветка связывает «нажал» и «появилось». Под `prefers-reduced-motion`\n * её гасит глобальный кламп, и остаётся тот же статичный итог.\n */\nexport const transferOptionArrivedClass = 'gr-transfer-arrived'\n\n/**\n * Место, откуда строку унесли.\n *\n * Правило живёт в `<style>` компонента, а не утилитой: цвет текста строки задаёт\n * класс состояния той же специфичности, и кто победит, решал бы порядок правил в\n * собранном CSS — та же ловушка, что записана в `grTabsStyles.ts`.\n */\nexport const transferOptionDraggingClass = 'gr-transfer-vacated'\n\n/**\n * Отметка строки декоративна: `GrCheckbox` внутрь `role=\"option\"` вложить\n * нельзя — его индикатор сам `role=\"checkbox\"` с `tabindex=\"0\"`, то есть ровно\n * `nested-interactive`. Состояние объявляет `aria-selected` самой строки.\n */\nexport const transferMarkBase = 'inline-flex shrink-0 items-center justify-center rounded-[var(--gr-radius-sm)] border border-[var(--gr-brd)] bg-[var(--gr-bg)]'\n\nexport const transferMarkStates = {\n selected: 'border-[var(--gr-primary)] bg-[var(--gr-primary)] text-[var(--gr-primary-fg)]',\n idle: '',\n} as const\n\nexport const transferMarkIconClass = 'h-3 w-3'\n\nexport const transferLabelClass = 'min-w-0 flex-1 truncate'\n\n/**\n * Место вставки — псевдоэлемент строки-соседа, а не отдельный узел: лишний узел\n * между строками ломает подсчёт позиций и разделители.\n */\nexport const transferIndicatorBeforeClass = 'before:absolute before:inset-x-0 before:top-0 before:h-[var(--gr-transfer-indicator-width,3px)] before:rounded-[var(--gr-radius-full)] before:bg-[var(--gr-transfer-indicator,var(--gr-primary))] before:content-empty'\n\nexport const transferIndicatorAfterClass = 'after:absolute after:inset-x-0 after:bottom-0 after:h-[var(--gr-transfer-indicator-width,3px)] after:rounded-[var(--gr-radius-full)] after:bg-[var(--gr-transfer-indicator,var(--gr-primary))] after:content-empty'\n\nexport const transferEmptyClass = 'flex h-full items-center justify-center px-4 py-6 text-center text-[var(--gr-muted-fg)]'\n\nexport const transferActionsClass = 'flex shrink-0 items-center'\n\n/**\n * Кнопки перестановки в шапке правой панели. Перестановка обязана быть видимой:\n * сочетание `Alt` + стрелка её ускоряет, но само по себе неоткрываемо, а на\n * macOS ещё и неудобно — почти все мета-клавиши там заняты системой.\n *\n * Стрелки горизонтальные, потому что порядок — это **последовательность**, а не\n * положение на экране: правая панель задаёт порядок колонок отчёта или полей\n * выгрузки, и они читаются слева направо.\n *\n * Сочетание при этом остаётся вертикальным (`Alt` + `↑`/`↓`), и расхождение с\n * иконками намеренное: в Chrome и Firefox под Windows и Linux `Alt` + `←`/`→` —\n * это «назад/вперёд» в истории браузера. В Safari навигация висит на\n * `Cmd` + стрелках, то есть там сочетание было бы свободно, — но пакет едет ко\n * всем, и ориентироваться на одну платформу нельзя.\n */\nexport const transferReorderBase = 'inline-flex shrink-0 items-center justify-center rounded-[var(--gr-radius-sm)] text-[var(--gr-muted-fg)] transition-colors hover:bg-[var(--gr-muted)] hover:text-[var(--gr-fg)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]'\n\nexport const transferReorderSizes: Record<GrTransferSize, string> = {\n xs: 'h-5 w-5',\n sm: 'h-5 w-5',\n md: 'h-6 w-6',\n lg: 'h-7 w-7',\n}\n\nexport const transferReorderIconClass = 'h-3.5 w-3.5'\n\nexport function grTransferReorderClass(size: GrTransferSize): string {\n return [transferReorderBase, transferReorderSizes[size]].join(' ')\n}\n\nexport const transferActionIconClass = 'h-4 w-4 shrink-0'\n\n/**\n * Кнопка без пути наружу остаётся в таб-порядке — нативный `disabled` уронил бы\n * фокус в тело документа. Показывает она это правилом в `<style>` компонента, а\n * не утилитой: у `GrButton` свой фон классом той же специфичности, и кто победит,\n * решал бы порядок в сгенерированном CSS, то есть через раз.\n */\nexport const transferActionInertClass = 'cursor-not-allowed'\n\n/**\n * Предпросмотр переносимого: он и есть ответ на «где сейчас элемент».\n *\n * Без него строка оставалась на месте, а за курсором не двигалось ничего — жест\n * выглядел так, будто ничего не происходит. Узел не ловит указатель\n * (`pointer-events: none`), иначе он перехватывал бы попадание у самих панелей.\n */\nexport const transferGhostClass = 'pointer-events-none fixed left-0 top-0 z-10 flex max-w-[16rem] items-center gap-2 rounded-[var(--gr-radius-md)] border border-[var(--gr-brd)] bg-[var(--gr-transfer-ghost-bg,var(--gr-card))] px-3 py-1.5 text-[var(--gr-fg)] shadow-[var(--gr-shadow-2)]'\n\nexport const transferGhostLabelClass = 'min-w-0 flex-1 truncate text-[length:var(--gr-control-text-sm)] leading-[var(--gr-control-leading-sm)]'\n\n/** Сколько строк едет разом: одну видно по подписи, остальные — числом. */\nexport const transferGhostCountClass = 'shrink-0 rounded-[var(--gr-radius-full)] bg-[var(--gr-primary)] px-1.5 text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)] text-[var(--gr-primary-fg)] tabular-nums'\n\nexport const transferStatusClass = 'sr-only'\n\nexport const transferHeaderSizes: Record<GrTransferSize, string> = {\n xs: 'px-2 py-1 text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]',\n sm: 'px-2.5 py-1.5 text-[length:var(--gr-control-text-sm)] leading-[var(--gr-control-leading-sm)]',\n md: 'px-3 py-2 text-[length:var(--gr-control-text-md)] leading-[var(--gr-control-leading-md)]',\n lg: 'px-4 py-2.5 text-[length:var(--gr-control-text-lg)] leading-[var(--gr-control-leading-lg)]',\n}\n\nexport const transferOptionSizes: Record<GrTransferSize, string> = {\n xs: 'px-2 py-1 text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]',\n sm: 'px-2.5 py-1.5 text-[length:var(--gr-control-text-sm)] leading-[var(--gr-control-leading-sm)]',\n md: 'px-3 py-2 text-[length:var(--gr-control-text-md)] leading-[var(--gr-control-leading-md)]',\n lg: 'px-4 py-2.5 text-[length:var(--gr-control-text-lg)] leading-[var(--gr-control-leading-lg)]',\n}\n\nexport const transferMarkSizes: Record<GrTransferSize, string> = {\n xs: 'h-3.5 w-3.5',\n sm: 'h-4 w-4',\n md: 'h-4 w-4',\n lg: 'h-5 w-5',\n}\n\nexport const transferSearchSizes: Record<GrTransferSize, string> = {\n xs: 'p-1',\n sm: 'p-1.5',\n md: 'p-2',\n lg: 'p-2.5',\n}\n\nexport const transferEmptySizes: Record<GrTransferSize, string> = {\n xs: 'text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]',\n sm: 'text-[length:var(--gr-control-text-sm)] leading-[var(--gr-control-leading-sm)]',\n md: 'text-[length:var(--gr-control-text-md)] leading-[var(--gr-control-leading-md)]',\n lg: 'text-[length:var(--gr-control-text-lg)] leading-[var(--gr-control-leading-lg)]',\n}\n\nexport const transferActionsSizes: Record<GrTransferSize, string> = {\n xs: 'px-1',\n sm: 'px-1.5',\n md: 'px-2',\n lg: 'px-2.5',\n}\n\nexport interface GrTransferOptionClassOptions {\n size: GrTransferSize\n selected: boolean\n disabled: boolean\n draggable: boolean\n dragging: boolean\n arrived: boolean\n indicator: 'before' | 'after' | null\n}\n\nexport function grTransferOptionClass(options: GrTransferOptionClassOptions): string {\n const state = options.disabled\n ? transferOptionStates.disabled\n : options.selected ? transferOptionStates.selected : transferOptionStates.idle\n\n return [\n transferOptionBase,\n options.draggable && !options.disabled ? transferOptionGrabClass : transferOptionPlainClass,\n transferOptionSizes[options.size],\n state,\n options.dragging ? transferOptionDraggingClass : '',\n options.arrived ? transferOptionArrivedClass : '',\n options.indicator === 'before' ? transferIndicatorBeforeClass : '',\n options.indicator === 'after' ? transferIndicatorAfterClass : '',\n ].filter(Boolean).join(' ')\n}\n\nexport function grTransferMarkClass(size: GrTransferSize, selected: boolean): string {\n return [\n transferMarkBase,\n transferMarkSizes[size],\n selected ? transferMarkStates.selected : transferMarkStates.idle,\n ].filter(Boolean).join(' ')\n}\n\nexport function grTransferPanelClass(dropActive: boolean): string {\n return [transferPanelBase, dropActive ? transferPanelDropClass : ''].filter(Boolean).join(' ')\n}\n\nexport function grTransferEmptyClass(size: GrTransferSize): string {\n return [transferEmptyClass, transferEmptySizes[size]].join(' ')\n}\n\nexport function grTransferHeaderClass(size: GrTransferSize): string {\n return [transferHeaderBase, transferHeaderSizes[size]].join(' ')\n}\n\nexport function grTransferSearchClass(size: GrTransferSize): string {\n return [transferSearchBase, transferSearchSizes[size]].join(' ')\n}\n\nexport function grTransferActionsClass(size: GrTransferSize): string {\n return [transferActionsClass, transferActionsSizes[size]].join(' ')\n}\n","import { splitClassTokens } from '../shared/classTokens'\nimport {\n transferActionIconClass,\n transferActionInertClass,\n transferActionsClass,\n transferActionsSizes,\n transferCounterClass,\n transferGhostClass,\n transferGhostCountClass,\n transferGhostLabelClass,\n transferEmptyClass,\n transferEmptySizes,\n transferHeaderBase,\n transferHeaderSizes,\n transferIndicatorAfterClass,\n transferIndicatorBeforeClass,\n transferLabelClass,\n transferListBase,\n transferMarkBase,\n transferMarkIconClass,\n transferMarkSizes,\n transferMarkStates,\n transferOptionBase,\n transferOptionGrabClass,\n transferOptionPlainClass,\n transferOptionSizes,\n transferOptionStates,\n transferPanelBase,\n transferPanelDropClass,\n transferReorderBase,\n transferReorderIconClass,\n transferReorderSizes,\n transferRootBase,\n transferSearchBase,\n transferSearchSizes,\n transferStatusClass,\n transferTitleClass,\n} from './grTransferStyles'\n\n// `gr-transfer-vacated` и `gr-transfer-arrived` сюда не входят: это обычные\n// классы из `<style>` компонента, а не утилиты — генерировать их нечем.\nexport const grTransferSafelist = [...new Set([\n ...Object.values(transferHeaderSizes).flatMap(splitClassTokens),\n ...Object.values(transferOptionSizes).flatMap(splitClassTokens),\n ...Object.values(transferMarkSizes).flatMap(splitClassTokens),\n ...Object.values(transferSearchSizes).flatMap(splitClassTokens),\n ...Object.values(transferEmptySizes).flatMap(splitClassTokens),\n ...Object.values(transferActionsSizes).flatMap(splitClassTokens),\n ...Object.values(transferReorderSizes).flatMap(splitClassTokens),\n ...Object.values(transferOptionStates).flatMap(splitClassTokens),\n ...Object.values(transferMarkStates).flatMap(splitClassTokens),\n ...splitClassTokens(transferRootBase),\n ...splitClassTokens(transferPanelBase),\n ...splitClassTokens(transferPanelDropClass),\n ...splitClassTokens(transferHeaderBase),\n ...splitClassTokens(transferTitleClass),\n ...splitClassTokens(transferCounterClass),\n ...splitClassTokens(transferGhostClass),\n ...splitClassTokens(transferGhostLabelClass),\n ...splitClassTokens(transferGhostCountClass),\n ...splitClassTokens(transferSearchBase),\n ...splitClassTokens(transferListBase),\n ...splitClassTokens(transferOptionBase),\n ...splitClassTokens(transferOptionGrabClass),\n ...splitClassTokens(transferOptionPlainClass),\n ...splitClassTokens(transferMarkBase),\n ...splitClassTokens(transferMarkIconClass),\n ...splitClassTokens(transferLabelClass),\n ...splitClassTokens(transferIndicatorBeforeClass),\n ...splitClassTokens(transferIndicatorAfterClass),\n ...splitClassTokens(transferEmptyClass),\n ...splitClassTokens(transferActionsClass),\n ...splitClassTokens(transferActionIconClass),\n ...splitClassTokens(transferActionInertClass),\n ...splitClassTokens(transferReorderBase),\n ...splitClassTokens(transferReorderIconClass),\n ...splitClassTokens(transferStatusClass),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grTransferSafelist } from './safelist'\n\nexport const grTransferConfig = defineGranularComponent(import.meta.url, {\n name: 'GrTransfer',\n dependencies: ['GrButton', 'GrButtonGroup', 'GrCheckbox', 'GrInput'],\n safelist: grTransferSafelist,\n})\n"],"mappings":"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"}