@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
@@ -1,25 +1,7 @@
1
1
  import { n as splitClassTokens } from "./classTokens-8v2XC74x.js";
2
+ import { t as GR_TONES } from "./tones-CRJAaYyg.js";
2
3
  import { a as valueTextSizes, i as trackSizes, n as grProgressBarFillClass, r as rowGaps, t as bufferClass } from "./grStyle-CrgLQKKf.js";
3
4
  import { defineGranularComponent } from "@feugene/unocss-preset-granular/contract";
4
- //#region src/components/shared/tones.ts
5
- /**
6
- * Единый перечень дизайн-тонов для всех компонентов библиотеки.
7
- *
8
- * Источник истины: список объявлен как `as const`-кортеж, из которого
9
- * автоматически выводится тип `GrTone`. Это позволяет использовать
10
- * `GR_TONES` в рантайме (валидация, итерация, safelist) и `GrTone`
11
- * в типах одновременно, без расхождений.
12
- */
13
- var GR_TONES = [
14
- "primary",
15
- "neutral",
16
- "success",
17
- "warning",
18
- "danger",
19
- "info",
20
- "slate",
21
- "azure"
22
- ];
23
5
  var grProgressBarClassTokens = {
24
6
  fill: GR_TONES.flatMap((tone) => splitClassTokens(grProgressBarFillClass(tone))),
25
7
  track: Object.values(trackSizes).flatMap(splitClassTokens),
@@ -51,4 +33,4 @@ var grProgressBarConfig = defineGranularComponent(import.meta.url, {
51
33
  }
52
34
  });
53
35
  //#endregion
54
- export { grProgressBarSafelist as n, GR_TONES as r, grProgressBarConfig as t };
36
+ export { grProgressBarSafelist as n, grProgressBarConfig as t };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-hnoZvcIM.js","names":[],"sources":["../../src/components/GrProgressBar/safelist.ts","../../src/components/GrProgressBar/config.ts"],"sourcesContent":["import { splitClassTokens } from '../shared/classTokens'\nimport { GR_TONES } from '../shared/tones'\nimport { bufferClass, grProgressBarFillClass, rowGaps, trackSizes, valueTextSizes } from './grStyle'\n\nconst fillTokens = GR_TONES.flatMap(tone => splitClassTokens(grProgressBarFillClass(tone)))\n\nexport const grProgressBarClassTokens = {\n fill: fillTokens,\n track: Object.values(trackSizes).flatMap(splitClassTokens),\n gap: Object.values(rowGaps).flatMap(splitClassTokens),\n value: Object.values(valueTextSizes).flatMap(splitClassTokens),\n buffer: splitClassTokens(bufferClass),\n} as const\n\nexport const grProgressBarSafelist = [...new Set([\n ...grProgressBarClassTokens.fill,\n ...grProgressBarClassTokens.track,\n ...grProgressBarClassTokens.gap,\n ...grProgressBarClassTokens.value,\n ...grProgressBarClassTokens.buffer,\n])] as const\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grProgressBarSafelist } from './safelist'\n\nexport const grProgressBarConfig = defineGranularComponent(import.meta.url, {\n name: 'GrProgressBar',\n safelist: grProgressBarSafelist,\n tokenDefinitionsRef: {\n light: { url: './themes/light.css', selector: ':root' },\n dark: { url: './themes/dark.css', as: '.dark, [data-theme=\"dark\"]' },\n },\n})\n"],"mappings":";;;;AAMA,IAAa,2BAA2B;CACtC,MAHiB,SAAS,SAAQ,SAAQ,iBAAiB,uBAAuB,IAAI,CAAC,CAGjF;CACN,OAAO,OAAO,OAAO,UAAU,CAAC,CAAC,QAAQ,gBAAgB;CACzD,KAAK,OAAO,OAAO,OAAO,CAAC,CAAC,QAAQ,gBAAgB;CACpD,OAAO,OAAO,OAAO,cAAc,CAAC,CAAC,QAAQ,gBAAgB;CAC7D,QAAQ,iBAAiB,WAAW;AACtC;AAEA,IAAa,wBAAwB,CAAC,mBAAG,IAAI,IAAI;CAC/C,GAAG,yBAAyB;CAC5B,GAAG,yBAAyB;CAC5B,GAAG,yBAAyB;CAC5B,GAAG,yBAAyB;CAC5B,GAAG,yBAAyB;AAC9B,CAAC,CAAC;;;AChBF,IAAa,sBAAsB,wBAAwB,YAAY,KAAK;CAC1E,MAAM;CACN,UAAU;CACV,qBAAqB;EACnB,OAAO;GAAE,KAAK;GAAsB,UAAU;EAAQ;EACtD,MAAM;GAAE,KAAK;GAAqB,IAAI;EAA6B;CACrE;AACF,CAAC"}
@@ -0,0 +1,87 @@
1
+ //#region src/composables/internal/dragSortGeometry.ts
2
+ /**
3
+ * Какой элемент под указателем и в каком месте его.
4
+ *
5
+ * Промах не отбрасывается: между строками есть зазоры, а курсор уезжает за
6
+ * край списка — и в обоих случаях перенос обязан продолжать показывать
7
+ * ближайшую цель, иначе индикатор мигает на каждом пикселе между строками.
8
+ *
9
+ * Вырожденный отрезок (нулевая высота строки) даёт `fraction: 0` — цель
10
+ * остаётся детерминированной, а не зависящей от направления подхода.
11
+ */
12
+ function hitTest(spans, position) {
13
+ if (spans.length === 0) return null;
14
+ let nearestIndex = 0;
15
+ let nearestDistance = Number.POSITIVE_INFINITY;
16
+ for (let index = 0; index < spans.length; index += 1) {
17
+ const span = spans[index];
18
+ if (position >= span.start && position <= span.end) return {
19
+ index,
20
+ fraction: fractionIn(span, position)
21
+ };
22
+ const distance = position < span.start ? span.start - position : position - span.end;
23
+ if (distance < nearestDistance) {
24
+ nearestDistance = distance;
25
+ nearestIndex = index;
26
+ }
27
+ }
28
+ const nearest = spans[nearestIndex];
29
+ return {
30
+ index: nearestIndex,
31
+ fraction: fractionIn(nearest, position)
32
+ };
33
+ }
34
+ function fractionIn(span, position) {
35
+ const size = span.end - span.start;
36
+ if (size <= 0) return 0;
37
+ return clamp((position - span.start) / size, 0, 1);
38
+ }
39
+ /**
40
+ * Куда встанет элемент, если отпустить сейчас.
41
+ *
42
+ * Верхняя половина строки — «до неё», нижняя — «после». Индекс возвращается
43
+ * **в терминах итогового массива**, то есть уже с поправкой на то, что
44
+ * перетаскиваемый элемент из него временно вынут: без поправки перенос вниз
45
+ * на одну позицию не двигал бы ничего.
46
+ */
47
+ function insertionIndex(hit, from, count) {
48
+ if (count <= 0) return 0;
49
+ const base = hit.fraction < .5 ? hit.index : hit.index + 1;
50
+ return clamp(from < base ? base - 1 : base, 0, count - 1);
51
+ }
52
+ /**
53
+ * На сколько прокрутить контейнер за кадр: отрицательное — к началу.
54
+ *
55
+ * Скорость растёт линейно по мере приближения к краю, а не включается
56
+ * ступенькой: ступенька на длинном списке ощущается как рывок и промахивается
57
+ * мимо цели.
58
+ */
59
+ function autoScrollDelta(viewport, position, options = {}) {
60
+ const zone = options.zone ?? 32;
61
+ const speed = options.speed ?? 12;
62
+ if (zone <= 0 || speed <= 0) return 0;
63
+ if (viewport.end - viewport.start <= zone * 2) return 0;
64
+ if (position < viewport.start || position > viewport.end) return 0;
65
+ const fromStart = position - viewport.start;
66
+ if (fromStart < zone) return -Math.ceil((zone - fromStart) / zone * speed);
67
+ const fromEnd = viewport.end - position;
68
+ if (fromEnd < zone) return Math.ceil((zone - fromEnd) / zone * speed);
69
+ return 0;
70
+ }
71
+ /**
72
+ * Перестановка без мутации входа: массив потребителя остаётся нетронутым,
73
+ * наружу уходит новый. `v-model` с мутацией исходного набора ломает и
74
+ * сравнение «было — стало», и историю в сторе потребителя.
75
+ */
76
+ function moveItem(items, from, to) {
77
+ const next = items.slice();
78
+ if (from === to || from < 0 || from >= items.length) return next;
79
+ const [moved] = next.splice(from, 1);
80
+ next.splice(clamp(to, 0, next.length), 0, moved);
81
+ return next;
82
+ }
83
+ function clamp(value, min, max) {
84
+ return Math.min(max, Math.max(min, value));
85
+ }
86
+ //#endregion
87
+ export { moveItem as i, hitTest as n, insertionIndex as r, autoScrollDelta as t };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dragSortGeometry-CY-llfrQ.js","names":[],"sources":["../../src/composables/internal/dragSortGeometry.ts"],"sourcesContent":["/**\n * Геометрия перестановки: чистая арифметика без DOM и без реактивности.\n *\n * Вынесена отдельно, потому что ошибка здесь проявляется не исключением, а\n * «элемент встал не туда» — поймать это можно только тестом на числах.\n * Композабл `useDragSort` сводит `DOMRect` к отрезкам вдоль оси и зовёт эти\n * функции; какой смысл у попадания, решает уже компонент.\n */\n\n/** Отрезок, занимаемый элементом вдоль оси переноса. */\nexport interface DragSortSpan {\n start: number\n end: number\n}\n\nexport interface DragSortHitResult {\n /** Индекс элемента в переданном наборе. */\n index: number\n /** Доля вдоль элемента: 0 — его начало, 1 — конец. */\n fraction: number\n}\n\n/**\n * Какой элемент под указателем и в каком месте его.\n *\n * Промах не отбрасывается: между строками есть зазоры, а курсор уезжает за\n * край списка — и в обоих случаях перенос обязан продолжать показывать\n * ближайшую цель, иначе индикатор мигает на каждом пикселе между строками.\n *\n * Вырожденный отрезок (нулевая высота строки) даёт `fraction: 0` — цель\n * остаётся детерминированной, а не зависящей от направления подхода.\n */\nexport function hitTest(spans: readonly DragSortSpan[], position: number): DragSortHitResult | null {\n if (spans.length === 0)\n return null\n\n let nearestIndex = 0\n let nearestDistance = Number.POSITIVE_INFINITY\n\n for (let index = 0; index < spans.length; index += 1) {\n const span = spans[index]\n\n if (position >= span.start && position <= span.end)\n return { index, fraction: fractionIn(span, position) }\n\n const distance = position < span.start ? span.start - position : position - span.end\n if (distance < nearestDistance) {\n nearestDistance = distance\n nearestIndex = index\n }\n }\n\n const nearest = spans[nearestIndex]\n\n return { index: nearestIndex, fraction: fractionIn(nearest, position) }\n}\n\nfunction fractionIn(span: DragSortSpan, position: number): number {\n const size = span.end - span.start\n if (size <= 0)\n return 0\n\n return clamp((position - span.start) / size, 0, 1)\n}\n\n/**\n * Куда встанет элемент, если отпустить сейчас.\n *\n * Верхняя половина строки — «до неё», нижняя — «после». Индекс возвращается\n * **в терминах итогового массива**, то есть уже с поправкой на то, что\n * перетаскиваемый элемент из него временно вынут: без поправки перенос вниз\n * на одну позицию не двигал бы ничего.\n */\nexport function insertionIndex(hit: DragSortHitResult, from: number, count: number): number {\n if (count <= 0)\n return 0\n\n const base = hit.fraction < 0.5 ? hit.index : hit.index + 1\n const adjusted = from < base ? base - 1 : base\n\n return clamp(adjusted, 0, count - 1)\n}\n\nexport interface AutoScrollOptions {\n /** Ширина чувствительной полосы у каждого края, px. По умолчанию 32. */\n zone?: number\n /** Скорость на самом краю, px за кадр. По умолчанию 12. */\n speed?: number\n}\n\n/**\n * На сколько прокрутить контейнер за кадр: отрицательное — к началу.\n *\n * Скорость растёт линейно по мере приближения к краю, а не включается\n * ступенькой: ступенька на длинном списке ощущается как рывок и промахивается\n * мимо цели.\n */\nexport function autoScrollDelta(viewport: DragSortSpan, position: number, options: AutoScrollOptions = {}): number {\n const zone = options.zone ?? 32\n const speed = options.speed ?? 12\n\n if (zone <= 0 || speed <= 0)\n return 0\n // Вьюпорт короче двух зон: полосы наложились бы и тянули список в обе стороны.\n if (viewport.end - viewport.start <= zone * 2)\n return 0\n\n if (position < viewport.start || position > viewport.end)\n return 0\n\n const fromStart = position - viewport.start\n if (fromStart < zone)\n return -Math.ceil(((zone - fromStart) / zone) * speed)\n\n const fromEnd = viewport.end - position\n if (fromEnd < zone)\n return Math.ceil(((zone - fromEnd) / zone) * speed)\n\n return 0\n}\n\n/**\n * Перестановка без мутации входа: массив потребителя остаётся нетронутым,\n * наружу уходит новый. `v-model` с мутацией исходного набора ломает и\n * сравнение «было — стало», и историю в сторе потребителя.\n */\nexport function moveItem<T>(items: readonly T[], from: number, to: number): T[] {\n const next = items.slice()\n if (from === to || from < 0 || from >= items.length)\n return next\n\n const [moved] = next.splice(from, 1)\n next.splice(clamp(to, 0, next.length), 0, moved)\n\n return next\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n"],"mappings":";;;;;;;;;;;AAgCA,SAAgB,QAAQ,OAAgC,UAA4C;CAClG,IAAI,MAAM,WAAW,GACnB,OAAO;CAET,IAAI,eAAe;CACnB,IAAI,kBAAkB,OAAO;CAE7B,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;EACpD,MAAM,OAAO,MAAM;EAEnB,IAAI,YAAY,KAAK,SAAS,YAAY,KAAK,KAC7C,OAAO;GAAE;GAAO,UAAU,WAAW,MAAM,QAAQ;EAAE;EAEvD,MAAM,WAAW,WAAW,KAAK,QAAQ,KAAK,QAAQ,WAAW,WAAW,KAAK;EACjF,IAAI,WAAW,iBAAiB;GAC9B,kBAAkB;GAClB,eAAe;EACjB;CACF;CAEA,MAAM,UAAU,MAAM;CAEtB,OAAO;EAAE,OAAO;EAAc,UAAU,WAAW,SAAS,QAAQ;CAAE;AACxE;AAEA,SAAS,WAAW,MAAoB,UAA0B;CAChE,MAAM,OAAO,KAAK,MAAM,KAAK;CAC7B,IAAI,QAAQ,GACV,OAAO;CAET,OAAO,OAAO,WAAW,KAAK,SAAS,MAAM,GAAG,CAAC;AACnD;;;;;;;;;AAUA,SAAgB,eAAe,KAAwB,MAAc,OAAuB;CAC1F,IAAI,SAAS,GACX,OAAO;CAET,MAAM,OAAO,IAAI,WAAW,KAAM,IAAI,QAAQ,IAAI,QAAQ;CAG1D,OAAO,MAFU,OAAO,OAAO,OAAO,IAAI,MAEnB,GAAG,QAAQ,CAAC;AACrC;;;;;;;;AAgBA,SAAgB,gBAAgB,UAAwB,UAAkB,UAA6B,CAAC,GAAW;CACjH,MAAM,OAAO,QAAQ,QAAQ;CAC7B,MAAM,QAAQ,QAAQ,SAAS;CAE/B,IAAI,QAAQ,KAAK,SAAS,GACxB,OAAO;CAET,IAAI,SAAS,MAAM,SAAS,SAAS,OAAO,GAC1C,OAAO;CAET,IAAI,WAAW,SAAS,SAAS,WAAW,SAAS,KACnD,OAAO;CAET,MAAM,YAAY,WAAW,SAAS;CACtC,IAAI,YAAY,MACd,OAAO,CAAC,KAAK,MAAO,OAAO,aAAa,OAAQ,KAAK;CAEvD,MAAM,UAAU,SAAS,MAAM;CAC/B,IAAI,UAAU,MACZ,OAAO,KAAK,MAAO,OAAO,WAAW,OAAQ,KAAK;CAEpD,OAAO;AACT;;;;;;AAOA,SAAgB,SAAY,OAAqB,MAAc,IAAiB;CAC9E,MAAM,OAAO,MAAM,MAAM;CACzB,IAAI,SAAS,MAAM,OAAO,KAAK,QAAQ,MAAM,QAC3C,OAAO;CAET,MAAM,CAAC,SAAS,KAAK,OAAO,MAAM,CAAC;CACnC,KAAK,OAAO,MAAM,IAAI,GAAG,KAAK,MAAM,GAAG,GAAG,KAAK;CAE/C,OAAO;AACT;AAEA,SAAS,MAAM,OAAe,KAAa,KAAqB;CAC9D,OAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AAC3C"}
@@ -1,4 +1,33 @@
1
1
  //#region src/i18n/locales/en.json
2
+ var transfer = {
3
+ "sourceTitle": "Available",
4
+ "targetTitle": "Selected",
5
+ "search": "Search",
6
+ "toTarget": "Move to selected",
7
+ "toSource": "Move back to available",
8
+ "selectAll": "Select everything shown",
9
+ "moveUp": "Move earlier",
10
+ "moveDown": "Move later",
11
+ "selected": "{count} of {total}",
12
+ "shown": "Showing {shown} of {total}",
13
+ "empty": "Nothing here yet",
14
+ "emptyFiltered": "Nothing matches the search",
15
+ "moved": "{count} moved to {list}",
16
+ "reordered": "Position {position} of {count}",
17
+ "reorderFiltered": "Reordering is off while a search is active",
18
+ "cancelled": "Move cancelled"
19
+ };
20
+ var carousel = {
21
+ "roledescription": "carousel",
22
+ "slideRoledescription": "slide",
23
+ "slidePosition": "{index} of {total}",
24
+ "previous": "Previous slide",
25
+ "next": "Next slide",
26
+ "play": "Start automatic slide show",
27
+ "pause": "Stop automatic slide show",
28
+ "indicators": "Slides",
29
+ "autoplayStopped": "Automatic slide show stopped"
30
+ };
2
31
  var chip = {
3
32
  "remove": "Remove",
4
33
  "removeNamed": "Remove {label}"
@@ -321,6 +350,8 @@ var jsonViewer = {
321
350
  };
322
351
  var contextMenu = { "label": "Context menu" };
323
352
  var en_default = {
353
+ transfer,
354
+ carousel,
324
355
  chip,
325
356
  common,
326
357
  loading,
@@ -377,4 +408,4 @@ var en_default = {
377
408
  contextMenu
378
409
  };
379
410
  //#endregion
380
- export { autocomplete, avatar, badgeWrap, bottomNav, breadcrumbs, button, chip, collapse, colorPicker, colors, commandPalette, common, contextMenu, dataTable, en_default as default, delta, dialog, drawer, emptyState, filePreview, fileUpload, fileValidation, form, formErrorBanner, formFile, imageViewer, input, inputTag, jsonViewer, kbd, link, list, loading, modal, navbar, numberInput, pagination, rating, responseError, select, sidebar, slider, sortable, splitter, statistic, steps, table, tabs, textarea, timeline, toaster, tree, treeSelect, uploadErrorBanner };
411
+ export { autocomplete, avatar, badgeWrap, bottomNav, breadcrumbs, button, carousel, chip, collapse, colorPicker, colors, commandPalette, common, contextMenu, dataTable, en_default as default, delta, dialog, drawer, emptyState, filePreview, fileUpload, fileValidation, form, formErrorBanner, formFile, imageViewer, input, inputTag, jsonViewer, kbd, link, list, loading, modal, navbar, numberInput, pagination, rating, responseError, select, sidebar, slider, sortable, splitter, statistic, steps, table, tabs, textarea, timeline, toaster, transfer, tree, treeSelect, uploadErrorBanner };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en-C_QkUTRL.js","names":[],"sources":["../../src/i18n/locales/en.json"],"sourcesContent":["{\n \"transfer\": {\n \"sourceTitle\": \"Available\",\n \"targetTitle\": \"Selected\",\n \"search\": \"Search\",\n \"toTarget\": \"Move to selected\",\n \"toSource\": \"Move back to available\",\n \"selectAll\": \"Select everything shown\",\n \"moveUp\": \"Move earlier\",\n \"moveDown\": \"Move later\",\n \"selected\": \"{count} of {total}\",\n \"shown\": \"Showing {shown} of {total}\",\n \"empty\": \"Nothing here yet\",\n \"emptyFiltered\": \"Nothing matches the search\",\n \"moved\": \"{count} moved to {list}\",\n \"reordered\": \"Position {position} of {count}\",\n \"reorderFiltered\": \"Reordering is off while a search is active\",\n \"cancelled\": \"Move cancelled\"\n },\n \"carousel\": {\n \"roledescription\": \"carousel\",\n \"slideRoledescription\": \"slide\",\n \"slidePosition\": \"{index} of {total}\",\n \"previous\": \"Previous slide\",\n \"next\": \"Next slide\",\n \"play\": \"Start automatic slide show\",\n \"pause\": \"Stop automatic slide show\",\n \"indicators\": \"Slides\",\n \"autoplayStopped\": \"Automatic slide show stopped\"\n },\n \"chip\": {\n \"remove\": \"Remove\",\n \"removeNamed\": \"Remove {label}\"\n },\n \"common\": {\n \"confirm\": \"Confirm\",\n \"cancel\": \"Cancel\",\n \"add\": \"Add\",\n \"clear\": \"Clear\",\n \"close\": \"Close\"\n },\n \"loading\": {\n \"defaultText\": \"Loading...\"\n },\n \"steps\": {\n \"label\": \"Progress\",\n \"status\": \"Step {step} of {count}\",\n \"completed\": \"completed\",\n \"error\": \"has errors\"\n },\n \"treeSelect\": {\n \"filterPlaceholder\": \"Search…\",\n \"empty\": \"No data\",\n \"loading\": \"Loading…\"\n },\n \"badgeWrap\": {\n \"count\": \"{count} new\"\n },\n \"avatar\": {\n \"group\": \"People\",\n \"groupOverflow\": \"and {count} more\",\n \"status\": {\n \"online\": \"online\",\n \"offline\": \"offline\",\n \"busy\": \"busy\",\n \"away\": \"away\"\n }\n },\n \"tree\": {\n \"drag\": \"Drag\",\n \"expand\": \"Expand\",\n \"collapse\": \"Collapse\",\n \"moved\": \"Moved {label}\"\n },\n \"select\": {\n \"customValuePlaceholder\": \"Add value…\",\n \"addOption\": \"Add \\\"{value}\\\"\",\n \"clearOption\": \"None\",\n \"searchPlaceholder\": \"Search…\",\n \"loading\": \"Loading…\",\n \"noResults\": \"No results\",\n \"removeTag\": \"Remove {label}\"\n },\n \"dataTable\": {\n \"loading\": \"Loading…\",\n \"empty\": \"No data\",\n \"selectAll\": \"Select all rows\",\n \"selectRow\": \"Select row\",\n \"sortAsc\": \"Activate to sort ascending\",\n \"sortDesc\": \"Activate to sort descending\",\n \"sortNone\": \"Activate to remove sorting\",\n \"moveColumn\": \"Move column {label}\",\n \"columnMoved\": \"Column {label} moved to position {position} of {count}\",\n \"resizeColumn\": \"Width of column {label}\",\n \"columnResized\": \"Column {label} is {width} pixels wide\"\n },\n \"breadcrumbs\": {\n \"label\": \"Breadcrumb\",\n \"expand\": \"Show hidden path\"\n },\n \"autocomplete\": {\n \"loading\": \"Loading…\",\n \"noResults\": \"No results\",\n \"addOption\": \"Add \\\"{value}\\\"\",\n \"removeValue\": \"Remove {label}\",\n \"typeMore\": {\n \"one\": \"Type at least {n} character\",\n \"other\": \"Type at least {n} characters\"\n }\n },\n \"form\": {\n \"required\": \"This field is required\",\n \"min\": \"Minimum is {min}\",\n \"max\": \"Maximum is {max}\",\n \"len\": \"Length must be {len}\",\n \"pattern\": \"Invalid format\",\n \"email\": \"Enter a valid email\",\n \"url\": \"Enter a valid URL\",\n \"file\": \"Invalid file\",\n \"invalid\": \"Invalid value\",\n \"readonly\": \"Read only\",\n \"validating\": \"Checking…\"\n },\n \"dialog\": {\n \"confirm\": {\n \"title\": \"Confirm\"\n },\n \"prompt\": {\n \"title\": \"Prompt\",\n \"label\": \"Value\",\n \"required\": \"Enter a value.\"\n },\n \"ok\": \"OK\"\n },\n \"switch\": {\n \"loading\": \"Saving…\"\n },\n \"slider\": {\n \"min\": \"min\",\n \"max\": \"max\"\n },\n \"sidebar\": {\n \"expand\": \"Expand sidebar\",\n \"collapse\": \"Collapse sidebar\"\n },\n \"splitter\": {\n \"label\": \"Resize panels\"\n },\n \"statistic\": {\n \"trendUp\": \"Increase\",\n \"trendDown\": \"Decrease\",\n \"trendFlat\": \"No change\"\n },\n \"pagination\": {\n \"label\": \"Pagination\",\n \"pageSize\": \"Page size\",\n \"prev\": \"Prev\",\n \"next\": \"Next\",\n \"page\": \"Page {n}\",\n \"first\": \"First page\",\n \"last\": \"Last page\",\n \"jumpTo\": \"Go to\",\n \"total\": \"{from}–{to} of {total}\",\n \"status\": \"Page {page} of {count}\"\n },\n \"navbar\": {\n \"openMenu\": \"Open menu\"\n },\n \"responseError\": {\n \"networkTitle\": \"No connection to the server\",\n \"networkMessage\": \"Check your internet connection and try again.\",\n \"abortedTitle\": \"Request cancelled\",\n \"abortedMessage\": \"The request was cancelled.\",\n \"validationTitle\": \"Check the data\",\n \"validationMessage\": \"The server returned a validation error. Fix the fields and try again.\",\n \"clientTitle\": \"Request error\",\n \"clientMessage\": \"The server rejected the request.\",\n \"serverTitle\": \"Server error\",\n \"serverMessage\": \"A server error occurred. Please try again.\",\n \"unknownTitle\": \"Something went wrong\",\n \"unknownMessage\": \"The operation could not be completed. Please try again.\",\n \"statusLabel\": \"HTTP {status}\",\n \"retryLabel\": \"Retry\",\n \"dismissLabel\": \"Dismiss\"\n },\n \"colors\": {\n \"neutral\": \"Neutral\",\n \"success\": \"Success\",\n \"warning\": \"Warning\",\n \"danger\": \"Danger\",\n \"info\": \"Info\",\n \"primary\": \"Primary\",\n \"slate\": \"Slate\",\n \"azure\": \"Azure\"\n },\n \"drawer\": {\n \"title\": \"Drawer\"\n },\n \"modal\": {\n \"title\": \"Dialog\"\n },\n \"numberInput\": {\n \"increase\": \"Increase\",\n \"decrease\": \"Decrease\"\n },\n \"toaster\": {\n \"dismiss\": \"Dismiss\",\n \"region\": \"Notifications\"\n },\n \"inputTag\": {\n \"removeTag\": \"Remove tag\",\n \"removeTagNamed\": \"Remove tag {tag}\",\n \"clearAll\": \"Clear all tags\",\n \"added\": \"Tag added: {tag}\",\n \"addedMany\": \"{count} tags added\",\n \"removed\": \"Tag removed: {tag}\",\n \"cleared\": \"All tags removed\",\n \"limitReached\": \"Tag limit reached\"\n },\n \"fileUpload\": {\n \"placeholder\": \"Drag files here or click to select\",\n \"progress\": \"Upload progress\",\n \"uploading\": \"Uploading…\",\n \"success\": \"Upload complete\",\n \"error\": \"Upload failed\",\n \"remove\": \"Remove {fileName}\",\n \"retry\": \"Retry upload\",\n \"retryFile\": \"Retry {fileName}\",\n \"abortFile\": \"Cancel upload of {fileName}\",\n \"statusPending\": \"Pending\",\n \"statusUploading\": \"Uploading\",\n \"statusSuccess\": \"Uploaded\",\n \"statusError\": \"Failed\"\n },\n \"formFile\": {\n \"upload\": \"Upload file\",\n \"change\": \"Change file\",\n \"remove\": \"Remove\",\n \"clearAll\": \"Clear all\",\n \"placeholder\": \"No files selected\",\n \"validateError\": \"Failed to validate dropped files\",\n \"removeFile\": \"Remove {fileName}\"\n },\n \"imageViewer\": {\n \"close\": \"Close image viewer\",\n \"prev\": \"Previous image\",\n \"next\": \"Next image\",\n \"zoomIn\": \"Zoom in\",\n \"zoomOut\": \"Zoom out\",\n \"resetZoom\": \"Reset zoom\",\n \"zoomToNatural\": \"Actual size (1:1)\",\n \"rotateLeft\": \"Rotate left\",\n \"rotateRight\": \"Rotate right\",\n \"download\": \"Download image\",\n \"empty\": \"No image\",\n \"label\": \"Image viewer\",\n \"position\": \"Image {index} of {total}\"\n },\n \"formErrorBanner\": {\n \"validationTitle\": \"Check the form fields\",\n \"validationMessage\": \"The server rejected the data. Fix the highlighted fields and try again.\",\n \"clientTitle\": \"Failed to save\",\n \"serverTitle\": \"Save error\",\n \"serverMessage\": \"Could not save the data. Please try again later.\"\n },\n \"uploadErrorBanner\": {\n \"networkTitle\": \"Failed to upload files\",\n \"networkMessage\": \"Check your connection and try again.\",\n \"validationTitle\": \"Files did not pass validation\",\n \"validationMessage\": \"Some of the files do not meet the requirements.\",\n \"serverTitle\": \"Upload error on the server\",\n \"serverMessage\": \"The server could not process the upload. Please try again.\"\n },\n \"input\": {\n \"clear\": \"Clear\",\n \"showPassword\": \"Show password\",\n \"hidePassword\": \"Hide password\",\n \"limitReached\": \"Character limit reached\"\n },\n \"textarea\": {\n \"lines\": {\n \"one\": \"{n} line\",\n \"other\": \"{n} lines\"\n }\n },\n \"rating\": {\n \"label\": \"Rating\",\n \"valueText\": \"{value} of {max}\",\n \"valueTextWithLabel\": \"{value} of {max}, {label}\"\n },\n \"commandPalette\": {\n \"label\": \"Command palette\",\n \"placeholder\": \"Type a command or search…\",\n \"empty\": \"Nothing found\",\n \"recent\": \"Recent\",\n \"loading\": \"Loading…\"\n },\n \"delta\": {\n \"increase\": \"increase\"\n },\n \"filePreview\": {\n \"label\": \"File\"\n },\n \"fileValidation\": {\n \"accept\": \"File \\\"{fileName}\\\" does not match accept=\\\"{accept}\\\"\",\n \"extension\": \"File \\\"{fileName}\\\" has disallowed extension \\\".{extension}\\\"\",\n \"mimeType\": \"File \\\"{fileName}\\\" has disallowed mime type \\\"{mimeType}\\\"\",\n \"mimeTypeFallback\": \"File \\\"{fileName}\\\" has fallback mime type \\\"{mimeType}\\\"\",\n \"maxFileSize\": \"File \\\"{fileName}\\\" is too large ({size} bytes), maxBytes={maxBytes}\",\n \"maxCount\": \"Too many files selected ({count}), maxCount={maxCount}\",\n \"maxTotalSize\": \"Total files size is too large ({total} bytes), maxTotalSizeBytes={maxBytes}\"\n },\n \"kbd\": {\n \"command\": \"Command\",\n \"option\": \"Option\",\n \"shift\": \"Shift\",\n \"control\": \"Control\",\n \"enter\": \"Enter\",\n \"escape\": \"Escape\",\n \"tab\": \"Tab\",\n \"backspace\": \"Backspace\",\n \"delete\": \"Delete\",\n \"pageUp\": \"Page Up\",\n \"pageDown\": \"Page Down\",\n \"arrowUp\": \"Arrow Up\",\n \"arrowDown\": \"Arrow Down\",\n \"arrowLeft\": \"Arrow Left\",\n \"arrowRight\": \"Arrow Right\",\n \"then\": \"then\"\n },\n \"link\": {\n \"opensInNewTab\": \"opens in a new tab\"\n },\n \"colorPicker\": {\n \"panelLabel\": \"Color picker\",\n \"hue\": \"Hue\",\n \"saturation\": \"Saturation\",\n \"lightness\": \"Lightness\",\n \"opacity\": \"Opacity\",\n \"hexLabel\": \"Hex value\",\n \"presetsLabel\": \"Color presets\",\n \"swatchLabel\": \"Color {color}\"\n },\n \"collapse\": {\n \"empty\": \"Nothing here yet\"\n },\n \"list\": {\n \"empty\": \"Nothing here yet\"\n },\n \"button\": {\n \"loading\": \"Loading…\"\n },\n \"table\": {\n \"empty\": \"Nothing here yet\"\n },\n \"timeline\": {\n \"empty\": \"Nothing here yet\"\n },\n \"tabs\": {\n \"empty\": \"Nothing here yet\",\n \"close\": \"Close tab\"\n },\n \"bottomNav\": {\n \"label\": \"Bottom navigation\",\n \"badge\": \"{count} new\"\n },\n \"emptyState\": {\n \"title\": \"Nothing here yet\"\n },\n \"sortable\": {\n \"label\": \"Sortable list\",\n \"handle\": \"Reorder\",\n \"empty\": \"Nothing to sort yet\",\n \"grabbed\": \"Grabbed. Position {position} of {count}\",\n \"moved\": \"Position {position} of {count}\",\n \"dropped\": \"Dropped at position {position} of {count}\",\n \"cancelled\": \"Move cancelled\"\n },\n \"jsonViewer\": {\n \"search\": \"Search key or value\",\n \"expandAll\": \"Expand all\",\n \"collapseAll\": \"Collapse all\",\n \"copy\": \"Copy value\",\n \"copied\": \"Value copied\",\n \"copyFailed\": \"Could not copy value\",\n \"moreItems\": \"more\"\n },\n \"contextMenu\": {\n \"label\": \"Context menu\"\n }\n}\n"],"mappings":""}
@@ -9,12 +9,12 @@ var GRANULARITY_I18N_BLOCK = "gr";
9
9
  * can import only the languages they actually need — see the
10
10
  * "Authoring localization packages" guide in the docs.
11
11
  */
12
- var en = { en: { ["gr"]: () => import("./en-B9E3jO6m.js") } };
12
+ var en = { en: { ["gr"]: () => import("./en-C_QkUTRL.js") } };
13
13
  //#endregion
14
14
  //#region src/i18n/messages/ru.ts
15
- var ru = { ru: { ["gr"]: () => import("./ru-D_1Ya489.js") } };
15
+ var ru = { ru: { ["gr"]: () => import("./ru-CLUErjhY.js") } };
16
16
  //#endregion
17
17
  //#region src/i18n/messages/es.ts
18
- var es = { es: { ["gr"]: () => import("./es-QpzdIEut.js") } };
18
+ var es = { es: { ["gr"]: () => import("./es-DemSEhZE.js") } };
19
19
  //#endregion
20
20
  export { GRANULARITY_I18N_BLOCK as i, ru as n, en as r, es as t };
@@ -1 +1 @@
1
- {"version":3,"file":"es-DCkqHTlU.js","names":[],"sources":["../../src/i18n/messages/const.ts","../../src/i18n/messages/en.ts","../../src/i18n/messages/ru.ts","../../src/i18n/messages/es.ts"],"sourcesContent":["export const GRANULARITY_I18N_BLOCK = 'gr'\n","import type { LocaleLoaderCollection } from '@feugene/fint-i18n/core'\nimport { GRANULARITY_I18N_BLOCK } from './const'\n\n/**\n * English locale loaders for the playground app.\n *\n * Exported separately from other locales so that consumers (and bundlers)\n * can import only the languages they actually need — see the\n * \"Authoring localization packages\" guide in the docs.\n */\nexport const en = {\n en: {\n [GRANULARITY_I18N_BLOCK]: () => import('../locales/en.json'),\n },\n} satisfies LocaleLoaderCollection\n\nexport default en\n","import type { LocaleLoaderCollection } from '@feugene/fint-i18n/core'\nimport { GRANULARITY_I18N_BLOCK } from './const'\n\nexport const ru = {\n ru: {\n [GRANULARITY_I18N_BLOCK]: () => import('../locales/ru.json'),\n },\n} satisfies LocaleLoaderCollection\n\nexport default ru\n","import type { LocaleLoaderCollection } from '@feugene/fint-i18n/core'\nimport { GRANULARITY_I18N_BLOCK } from './const'\n\nexport const es = {\n es: {\n [GRANULARITY_I18N_BLOCK]: () => import('../locales/es.json'),\n },\n} satisfies LocaleLoaderCollection\n\nexport default es\n"],"mappings":";AAAA,IAAa,yBAAyB;;;;;;;;;;ACUtC,IAAa,KAAK,EAChB,IAAI,GAAA,aAC8B,OAAO,oBACzC,EACF;;;ACXA,IAAa,KAAK,EAChB,IAAI,GAAA,aAC8B,OAAO,oBACzC,EACF;;;ACJA,IAAa,KAAK,EAChB,IAAI,GAAA,aAC8B,OAAO,oBACzC,EACF"}
1
+ {"version":3,"file":"es-B4t_3Wnh.js","names":[],"sources":["../../src/i18n/messages/const.ts","../../src/i18n/messages/en.ts","../../src/i18n/messages/ru.ts","../../src/i18n/messages/es.ts"],"sourcesContent":["export const GRANULARITY_I18N_BLOCK = 'gr'\n","import type { LocaleLoaderCollection } from '@feugene/fint-i18n/core'\nimport { GRANULARITY_I18N_BLOCK } from './const'\n\n/**\n * English locale loaders for the playground app.\n *\n * Exported separately from other locales so that consumers (and bundlers)\n * can import only the languages they actually need — see the\n * \"Authoring localization packages\" guide in the docs.\n */\nexport const en = {\n en: {\n [GRANULARITY_I18N_BLOCK]: () => import('../locales/en.json'),\n },\n} satisfies LocaleLoaderCollection\n\nexport default en\n","import type { LocaleLoaderCollection } from '@feugene/fint-i18n/core'\nimport { GRANULARITY_I18N_BLOCK } from './const'\n\nexport const ru = {\n ru: {\n [GRANULARITY_I18N_BLOCK]: () => import('../locales/ru.json'),\n },\n} satisfies LocaleLoaderCollection\n\nexport default ru\n","import type { LocaleLoaderCollection } from '@feugene/fint-i18n/core'\nimport { GRANULARITY_I18N_BLOCK } from './const'\n\nexport const es = {\n es: {\n [GRANULARITY_I18N_BLOCK]: () => import('../locales/es.json'),\n },\n} satisfies LocaleLoaderCollection\n\nexport default es\n"],"mappings":";AAAA,IAAa,yBAAyB;;;;;;;;;;ACUtC,IAAa,KAAK,EAChB,IAAI,GAAA,aAC8B,OAAO,oBACzC,EACF;;;ACXA,IAAa,KAAK,EAChB,IAAI,GAAA,aAC8B,OAAO,oBACzC,EACF;;;ACJA,IAAa,KAAK,EAChB,IAAI,GAAA,aAC8B,OAAO,oBACzC,EACF"}
@@ -1,4 +1,33 @@
1
1
  //#region src/i18n/locales/es.json
2
+ var transfer = {
3
+ "sourceTitle": "Disponibles",
4
+ "targetTitle": "Seleccionados",
5
+ "search": "Buscar",
6
+ "toTarget": "Mover a seleccionados",
7
+ "toSource": "Devolver a disponibles",
8
+ "selectAll": "Seleccionar todo lo mostrado",
9
+ "moveUp": "Antes",
10
+ "moveDown": "Después",
11
+ "selected": "{count} de {total}",
12
+ "shown": "Mostrando {shown} de {total}",
13
+ "empty": "Aquí no hay nada todavía",
14
+ "emptyFiltered": "No hay coincidencias",
15
+ "moved": "{count} movidos a «{list}»",
16
+ "reordered": "Posición {position} de {count}",
17
+ "reorderFiltered": "El orden no cambia mientras haya búsqueda",
18
+ "cancelled": "Movimiento cancelado"
19
+ };
20
+ var carousel = {
21
+ "roledescription": "carrusel",
22
+ "slideRoledescription": "diapositiva",
23
+ "slidePosition": "{index} de {total}",
24
+ "previous": "Diapositiva anterior",
25
+ "next": "Diapositiva siguiente",
26
+ "play": "Iniciar la reproducción automática",
27
+ "pause": "Detener la reproducción automática",
28
+ "indicators": "Diapositivas",
29
+ "autoplayStopped": "Reproducción automática detenida"
30
+ };
2
31
  var chip = {
3
32
  "remove": "Quitar",
4
33
  "removeNamed": "Quitar {label}"
@@ -323,6 +352,8 @@ var jsonViewer = {
323
352
  };
324
353
  var contextMenu = { "label": "Menú contextual" };
325
354
  var es_default = {
355
+ transfer,
356
+ carousel,
326
357
  chip,
327
358
  common,
328
359
  loading,
@@ -379,4 +410,4 @@ var es_default = {
379
410
  contextMenu
380
411
  };
381
412
  //#endregion
382
- export { autocomplete, avatar, badgeWrap, bottomNav, breadcrumbs, button, chip, collapse, colorPicker, colors, commandPalette, common, contextMenu, dataTable, es_default as default, delta, dialog, drawer, emptyState, filePreview, fileUpload, fileValidation, form, formErrorBanner, formFile, imageViewer, input, inputTag, jsonViewer, kbd, link, list, loading, modal, navbar, numberInput, pagination, rating, responseError, select, sidebar, slider, sortable, splitter, statistic, steps, table, tabs, textarea, timeline, toaster, tree, treeSelect, uploadErrorBanner };
413
+ export { autocomplete, avatar, badgeWrap, bottomNav, breadcrumbs, button, carousel, chip, collapse, colorPicker, colors, commandPalette, common, contextMenu, dataTable, es_default as default, delta, dialog, drawer, emptyState, filePreview, fileUpload, fileValidation, form, formErrorBanner, formFile, imageViewer, input, inputTag, jsonViewer, kbd, link, list, loading, modal, navbar, numberInput, pagination, rating, responseError, select, sidebar, slider, sortable, splitter, statistic, steps, table, tabs, textarea, timeline, toaster, transfer, tree, treeSelect, uploadErrorBanner };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"es-DemSEhZE.js","names":[],"sources":["../../src/i18n/locales/es.json"],"sourcesContent":["{\n \"transfer\": {\n \"sourceTitle\": \"Disponibles\",\n \"targetTitle\": \"Seleccionados\",\n \"search\": \"Buscar\",\n \"toTarget\": \"Mover a seleccionados\",\n \"toSource\": \"Devolver a disponibles\",\n \"selectAll\": \"Seleccionar todo lo mostrado\",\n \"moveUp\": \"Antes\",\n \"moveDown\": \"Después\",\n \"selected\": \"{count} de {total}\",\n \"shown\": \"Mostrando {shown} de {total}\",\n \"empty\": \"Aquí no hay nada todavía\",\n \"emptyFiltered\": \"No hay coincidencias\",\n \"moved\": \"{count} movidos a «{list}»\",\n \"reordered\": \"Posición {position} de {count}\",\n \"reorderFiltered\": \"El orden no cambia mientras haya búsqueda\",\n \"cancelled\": \"Movimiento cancelado\"\n },\n \"carousel\": {\n \"roledescription\": \"carrusel\",\n \"slideRoledescription\": \"diapositiva\",\n \"slidePosition\": \"{index} de {total}\",\n \"previous\": \"Diapositiva anterior\",\n \"next\": \"Diapositiva siguiente\",\n \"play\": \"Iniciar la reproducción automática\",\n \"pause\": \"Detener la reproducción automática\",\n \"indicators\": \"Diapositivas\",\n \"autoplayStopped\": \"Reproducción automática detenida\"\n },\n \"chip\": {\n \"remove\": \"Quitar\",\n \"removeNamed\": \"Quitar {label}\"\n },\n \"common\": {\n \"confirm\": \"Confirmar\",\n \"cancel\": \"Cancelar\",\n \"add\": \"Añadir\",\n \"clear\": \"Limpiar\",\n \"close\": \"Cerrar\"\n },\n \"loading\": {\n \"defaultText\": \"Cargando...\"\n },\n \"steps\": {\n \"label\": \"Progreso\",\n \"status\": \"Paso {step} de {count}\",\n \"completed\": \"completado\",\n \"error\": \"tiene errores\"\n },\n \"treeSelect\": {\n \"filterPlaceholder\": \"Buscar…\",\n \"empty\": \"Sin datos\",\n \"loading\": \"Cargando…\"\n },\n \"badgeWrap\": {\n \"count\": \"{count} nuevos\"\n },\n \"avatar\": {\n \"group\": \"Personas\",\n \"groupOverflow\": \"y {count} más\",\n \"status\": {\n \"online\": \"en línea\",\n \"offline\": \"sin conexión\",\n \"busy\": \"ocupado\",\n \"away\": \"ausente\"\n }\n },\n \"tree\": {\n \"drag\": \"Arrastrar\",\n \"expand\": \"Expandir\",\n \"collapse\": \"Contraer\",\n \"moved\": \"{label} movido\"\n },\n \"select\": {\n \"customValuePlaceholder\": \"Añadir valor…\",\n \"addOption\": \"Añadir «{value}»\",\n \"clearOption\": \"Ninguno\",\n \"searchPlaceholder\": \"Buscar…\",\n \"loading\": \"Cargando…\",\n \"noResults\": \"Sin resultados\",\n \"removeTag\": \"Quitar {label}\"\n },\n \"dataTable\": {\n \"loading\": \"Cargando…\",\n \"empty\": \"Sin datos\",\n \"selectAll\": \"Seleccionar todas las filas\",\n \"selectRow\": \"Seleccionar fila\",\n \"sortAsc\": \"Active para ordenar de forma ascendente\",\n \"sortDesc\": \"Active para ordenar de forma descendente\",\n \"sortNone\": \"Active para quitar la ordenación\",\n \"moveColumn\": \"Mover la columna {label}\",\n \"columnMoved\": \"Columna {label} movida a la posición {position} de {count}\",\n \"resizeColumn\": \"Ancho de la columna {label}\",\n \"columnResized\": \"La columna {label} mide {width} píxeles\"\n },\n \"breadcrumbs\": {\n \"label\": \"Ruta de navegación\",\n \"expand\": \"Mostrar la ruta oculta\"\n },\n \"autocomplete\": {\n \"loading\": \"Cargando…\",\n \"noResults\": \"Sin resultados\",\n \"addOption\": \"Añadir «{value}»\",\n \"removeValue\": \"Quitar {label}\",\n \"typeMore\": {\n \"one\": \"Escriba al menos {n} carácter\",\n \"many\": \"Escriba al menos {n} de caracteres\",\n \"other\": \"Escriba al menos {n} caracteres\"\n }\n },\n \"form\": {\n \"required\": \"Este campo es obligatorio\",\n \"min\": \"Mínimo {min}\",\n \"max\": \"Máximo {max}\",\n \"len\": \"La longitud debe ser {len}\",\n \"pattern\": \"Formato no válido\",\n \"email\": \"Introduce un correo válido\",\n \"url\": \"Introduce una URL válida\",\n \"file\": \"Archivo no válido\",\n \"invalid\": \"Valor no válido\",\n \"readonly\": \"Solo lectura\",\n \"validating\": \"Comprobando…\"\n },\n \"dialog\": {\n \"confirm\": {\n \"title\": \"Confirmar\"\n },\n \"prompt\": {\n \"title\": \"Aviso\",\n \"label\": \"Valor\",\n \"required\": \"Introduzca un valor.\"\n },\n \"ok\": \"OK\"\n },\n \"switch\": {\n \"loading\": \"Guardando…\"\n },\n \"slider\": {\n \"min\": \"mínimo\",\n \"max\": \"máximo\"\n },\n \"sidebar\": {\n \"expand\": \"Expandir panel\",\n \"collapse\": \"Contraer panel\"\n },\n \"splitter\": {\n \"label\": \"Cambiar el tamaño de los paneles\"\n },\n \"statistic\": {\n \"trendUp\": \"Aumento\",\n \"trendDown\": \"Descenso\",\n \"trendFlat\": \"Sin cambios\"\n },\n \"pagination\": {\n \"label\": \"Paginación\",\n \"pageSize\": \"Tamaño de página\",\n \"prev\": \"Anterior\",\n \"next\": \"Siguiente\",\n \"page\": \"Página {n}\",\n \"first\": \"Primera página\",\n \"last\": \"Última página\",\n \"jumpTo\": \"Ir a\",\n \"total\": \"{from}–{to} de {total}\",\n \"status\": \"Página {page} de {count}\"\n },\n \"navbar\": {\n \"openMenu\": \"Abrir menú\"\n },\n \"responseError\": {\n \"networkTitle\": \"Sin conexión con el servidor\",\n \"networkMessage\": \"Compruebe su conexión a internet e inténtelo de nuevo.\",\n \"abortedTitle\": \"Solicitud cancelada\",\n \"abortedMessage\": \"La solicitud fue cancelada.\",\n \"validationTitle\": \"Compruebe los datos\",\n \"validationMessage\": \"El servidor devolvió un error de validación. Corrija los campos e inténtelo de nuevo.\",\n \"clientTitle\": \"Error de solicitud\",\n \"clientMessage\": \"El servidor rechazó la solicitud.\",\n \"serverTitle\": \"Error del servidor\",\n \"serverMessage\": \"Se produjo un error en el servidor. Inténtelo de nuevo.\",\n \"unknownTitle\": \"Algo salió mal\",\n \"unknownMessage\": \"No se pudo completar la operación. Inténtelo de nuevo.\",\n \"statusLabel\": \"HTTP {status}\",\n \"retryLabel\": \"Reintentar\",\n \"dismissLabel\": \"Descartar\"\n },\n \"colors\": {\n \"neutral\": \"Neutral\",\n \"success\": \"Éxito\",\n \"warning\": \"Advertencia\",\n \"danger\": \"Peligro\",\n \"info\": \"Info\",\n \"primary\": \"Primario\",\n \"slate\": \"Pizarra\",\n \"azure\": \"Azul celeste\"\n },\n \"drawer\": {\n \"title\": \"Panel\"\n },\n \"modal\": {\n \"title\": \"Diálogo\"\n },\n \"numberInput\": {\n \"increase\": \"Aumentar\",\n \"decrease\": \"Disminuir\"\n },\n \"toaster\": {\n \"dismiss\": \"Descartar\",\n \"region\": \"Notificaciones\"\n },\n \"inputTag\": {\n \"removeTag\": \"Eliminar etiqueta\",\n \"removeTagNamed\": \"Eliminar etiqueta {tag}\",\n \"clearAll\": \"Eliminar todas las etiquetas\",\n \"added\": \"Etiqueta añadida: {tag}\",\n \"addedMany\": \"Etiquetas añadidas: {count}\",\n \"removed\": \"Etiqueta eliminada: {tag}\",\n \"cleared\": \"Todas las etiquetas eliminadas\",\n \"limitReached\": \"Límite de etiquetas alcanzado\"\n },\n \"fileUpload\": {\n \"placeholder\": \"Arrastra archivos aquí o haz clic para seleccionar\",\n \"progress\": \"Progreso de carga\",\n \"uploading\": \"Subiendo…\",\n \"success\": \"Carga completada\",\n \"error\": \"Error al cargar\",\n \"remove\": \"Quitar {fileName}\",\n \"retry\": \"Reintentar la carga\",\n \"retryFile\": \"Reintentar {fileName}\",\n \"abortFile\": \"Cancelar la subida de {fileName}\",\n \"statusPending\": \"En cola\",\n \"statusUploading\": \"Subiendo\",\n \"statusSuccess\": \"Subido\",\n \"statusError\": \"Error\"\n },\n \"formFile\": {\n \"upload\": \"Subir archivo\",\n \"change\": \"Cambiar archivo\",\n \"remove\": \"Eliminar\",\n \"clearAll\": \"Limpiar todo\",\n \"placeholder\": \"Ningún archivo seleccionado\",\n \"validateError\": \"No se pudieron validar los archivos soltados\",\n \"removeFile\": \"Quitar {fileName}\"\n },\n \"imageViewer\": {\n \"close\": \"Cerrar el visor de imágenes\",\n \"prev\": \"Imagen anterior\",\n \"next\": \"Imagen siguiente\",\n \"zoomIn\": \"Acercar\",\n \"zoomOut\": \"Alejar\",\n \"resetZoom\": \"Restablecer zoom\",\n \"zoomToNatural\": \"Tamaño real (1:1)\",\n \"rotateLeft\": \"Girar a la izquierda\",\n \"rotateRight\": \"Girar a la derecha\",\n \"download\": \"Descargar imagen\",\n \"empty\": \"Sin imagen\",\n \"label\": \"Visor de imágenes\",\n \"position\": \"Imagen {index} de {total}\"\n },\n \"formErrorBanner\": {\n \"validationTitle\": \"Revisa los campos del formulario\",\n \"validationMessage\": \"El servidor rechazó los datos. Corrige los campos resaltados e inténtalo de nuevo.\",\n \"clientTitle\": \"No se pudo guardar\",\n \"serverTitle\": \"Error al guardar\",\n \"serverMessage\": \"No se pudieron guardar los datos. Inténtalo más tarde.\"\n },\n \"uploadErrorBanner\": {\n \"networkTitle\": \"No se pudieron subir los archivos\",\n \"networkMessage\": \"Comprueba tu conexión e inténtalo de nuevo.\",\n \"validationTitle\": \"Los archivos no pasaron la validación\",\n \"validationMessage\": \"Algunos archivos no cumplen los requisitos.\",\n \"serverTitle\": \"Error de carga en el servidor\",\n \"serverMessage\": \"El servidor no pudo procesar la carga. Inténtalo de nuevo.\"\n },\n \"input\": {\n \"clear\": \"Borrar\",\n \"showPassword\": \"Mostrar contraseña\",\n \"hidePassword\": \"Ocultar contraseña\",\n \"limitReached\": \"Límite de caracteres alcanzado\"\n },\n \"textarea\": {\n \"lines\": {\n \"one\": \"{n} línea\",\n \"many\": \"{n} de líneas\",\n \"other\": \"{n} líneas\"\n }\n },\n \"rating\": {\n \"label\": \"Valoración\",\n \"valueText\": \"{value} de {max}\",\n \"valueTextWithLabel\": \"{value} de {max}, {label}\"\n },\n \"commandPalette\": {\n \"label\": \"Paleta de comandos\",\n \"placeholder\": \"Escribe un comando o busca…\",\n \"empty\": \"No se ha encontrado nada\",\n \"recent\": \"Recientes\",\n \"loading\": \"Cargando…\"\n },\n \"delta\": {\n \"increase\": \"aumento\"\n },\n \"filePreview\": {\n \"label\": \"Archivo\"\n },\n \"fileValidation\": {\n \"accept\": \"El archivo «{fileName}» no coincide con accept=\\\"{accept}\\\"\",\n \"extension\": \"El archivo «{fileName}» tiene una extensión no permitida «.{extension}»\",\n \"mimeType\": \"El archivo «{fileName}» tiene un tipo MIME no permitido «{mimeType}»\",\n \"mimeTypeFallback\": \"El archivo «{fileName}» tiene un tipo MIME indefinido «{mimeType}»\",\n \"maxFileSize\": \"El archivo «{fileName}» es demasiado grande ({size} bytes), máximo {maxBytes}\",\n \"maxCount\": \"Se han seleccionado demasiados archivos ({count}), máximo: {maxCount}\",\n \"maxTotalSize\": \"El tamaño total de los archivos es demasiado grande ({total} bytes), máximo {maxBytes}\"\n },\n \"kbd\": {\n \"command\": \"Command\",\n \"option\": \"Opción\",\n \"shift\": \"Mayús\",\n \"control\": \"Control\",\n \"enter\": \"Intro\",\n \"escape\": \"Escape\",\n \"tab\": \"Tab\",\n \"backspace\": \"Retroceso\",\n \"delete\": \"Suprimir\",\n \"pageUp\": \"Página arriba\",\n \"pageDown\": \"Página abajo\",\n \"arrowUp\": \"flecha arriba\",\n \"arrowDown\": \"flecha abajo\",\n \"arrowLeft\": \"flecha izquierda\",\n \"arrowRight\": \"flecha derecha\",\n \"then\": \"luego\"\n },\n \"link\": {\n \"opensInNewTab\": \"se abre en una pestaña nueva\"\n },\n \"colorPicker\": {\n \"panelLabel\": \"Selector de color\",\n \"hue\": \"Tono\",\n \"saturation\": \"Saturación\",\n \"lightness\": \"Luminosidad\",\n \"opacity\": \"Opacidad\",\n \"hexLabel\": \"Valor hex\",\n \"presetsLabel\": \"Paleta de colores\",\n \"swatchLabel\": \"Color {color}\"\n },\n \"collapse\": {\n \"empty\": \"Todavía no hay nada\"\n },\n \"list\": {\n \"empty\": \"Todavía no hay nada\"\n },\n \"button\": {\n \"loading\": \"Cargando…\"\n },\n \"table\": {\n \"empty\": \"Todavía no hay nada\"\n },\n \"timeline\": {\n \"empty\": \"Todavía no hay nada\"\n },\n \"tabs\": {\n \"empty\": \"Todavía no hay nada\",\n \"close\": \"Cerrar pestaña\"\n },\n \"bottomNav\": {\n \"label\": \"Navegación inferior\",\n \"badge\": \"{count} nuevos\"\n },\n \"emptyState\": {\n \"title\": \"Todavía no hay nada\"\n },\n \"sortable\": {\n \"label\": \"Lista ordenable\",\n \"handle\": \"Reordenar\",\n \"empty\": \"Nada que ordenar todavía\",\n \"grabbed\": \"Agarrado. Posición {position} de {count}\",\n \"moved\": \"Posición {position} de {count}\",\n \"dropped\": \"Soltado en la posición {position} de {count}\",\n \"cancelled\": \"Movimiento cancelado\"\n },\n \"jsonViewer\": {\n \"search\": \"Buscar clave o valor\",\n \"expandAll\": \"Expandir todo\",\n \"collapseAll\": \"Contraer todo\",\n \"copy\": \"Copiar valor\",\n \"copied\": \"Valor copiado\",\n \"copyFailed\": \"No se pudo copiar el valor\",\n \"moreItems\": \"más\"\n },\n \"contextMenu\": {\n \"label\": \"Menú contextual\"\n }\n}\n"],"mappings":""}
@@ -1702,6 +1702,34 @@ var grThemeTokens = [
1702
1702
  }
1703
1703
  ];
1704
1704
  var grComponentTokens = [
1705
+ {
1706
+ "owner": "GrAffix",
1707
+ "name": "--gr-affix-offset",
1708
+ "kind": "inline",
1709
+ "default": "0px",
1710
+ "description": "Отступ от края в прилипшем состоянии. Пишется инлайн из пропа `offset`; заданный в CSS (например на `:root` — высота шапки приложения) работает общим дефолтом для всех аффиксов и подхватывается наблюдателем."
1711
+ },
1712
+ {
1713
+ "owner": "GrAffix",
1714
+ "name": "--gr-affix-bg",
1715
+ "kind": "hook",
1716
+ "default": "var(--gr-bg)",
1717
+ "description": "Фон прилипшей панели. Без него уезжающее под неё содержимое просвечивает насквозь. Аффикс внутри карточки берёт `var(--gr-card)`."
1718
+ },
1719
+ {
1720
+ "owner": "GrAffix",
1721
+ "name": "--gr-affix-shadow",
1722
+ "kind": "hook",
1723
+ "default": "var(--gr-shadow-2), при `placement=\"bottom\"` — зеркальная тень вверх подмесом `--gr-fg`",
1724
+ "description": "Тень прилипшей панели: она отделяет панель от уезжающего содержимого. Тенью, а не рамкой — рамка меняет высоту в момент прилипания и сдвигает раскладку."
1725
+ },
1726
+ {
1727
+ "owner": "GrAffix",
1728
+ "name": "--gr-affix-z",
1729
+ "kind": "hook",
1730
+ "default": "10",
1731
+ "description": "Порядок внутри своего stacking-контекста. Не глобальный слой: приложение, которому аффикс нужен на шкале, ставит сюда `var(--gr-z-navbar)` — шаг между слоями шкалы оставлен ровно под это (`docs/z-index.md`)."
1732
+ },
1705
1733
  {
1706
1734
  "owner": "GrAlert",
1707
1735
  "name": "--gr-alert-bg",
@@ -2304,6 +2332,111 @@ var grComponentTokens = [
2304
2332
  "default": "var(--gr-button-radius, 0.375rem)",
2305
2333
  "description": "Скругление внешних углов группы. По умолчанию наследует радиус кнопки — внутренние углы группа гасит сама."
2306
2334
  },
2335
+ {
2336
+ "owner": "GrCarousel",
2337
+ "name": "--gr-carousel-index",
2338
+ "kind": "inline",
2339
+ "default": "0",
2340
+ "description": "Номер текущего слайда. Компонент присваивает его сам, а сдвиг ленты считает CSS: так позиция переживает серверный рендер и гасится глобальным клампом `prefers-reduced-motion` вместе с переходом."
2341
+ },
2342
+ {
2343
+ "owner": "GrCarousel",
2344
+ "name": "--gr-carousel-drag",
2345
+ "kind": "inline",
2346
+ "default": "0px",
2347
+ "description": "Смещение ленты за указателем на время жеста. Вне жеста — ноль."
2348
+ },
2349
+ {
2350
+ "owner": "GrCarousel",
2351
+ "name": "--gr-carousel-control-bg",
2352
+ "kind": "hook",
2353
+ "default": "var(--gr-bg)",
2354
+ "description": "Подложка стрелок и тумблера автопрокрутки. Они лежат поверх произвольного содержимого слайда, поэтому подложка обязательна: на светлом кадре иконка без неё пропадает."
2355
+ },
2356
+ {
2357
+ "owner": "GrCarousel",
2358
+ "name": "--gr-carousel-control-bg-hover",
2359
+ "kind": "hook",
2360
+ "default": "var(--gr-muted)",
2361
+ "description": "Подложка стрелки и тумблера под курсором."
2362
+ },
2363
+ {
2364
+ "owner": "GrCarousel",
2365
+ "name": "--gr-carousel-control-fg",
2366
+ "kind": "hook",
2367
+ "default": "var(--gr-fg)",
2368
+ "description": "Цвет иконок стрелок и тумблера."
2369
+ },
2370
+ {
2371
+ "owner": "GrCarousel",
2372
+ "name": "--gr-carousel-gap",
2373
+ "kind": "hook",
2374
+ "default": "0.5rem",
2375
+ "description": "Просвет между переключателями в полосе."
2376
+ },
2377
+ {
2378
+ "owner": "GrCarousel",
2379
+ "name": "--gr-carousel-dot",
2380
+ "kind": "hook",
2381
+ "default": "var(--gr-brd)",
2382
+ "description": "Цвет неактивной точки-индикатора."
2383
+ },
2384
+ {
2385
+ "owner": "GrCarousel",
2386
+ "name": "--gr-carousel-dot-active",
2387
+ "kind": "hook",
2388
+ "default": "var(--gr-primary)",
2389
+ "description": "Цвет текущей точки; он же — рамка текущей миниатюры."
2390
+ },
2391
+ {
2392
+ "owner": "GrCarousel",
2393
+ "name": "--gr-carousel-dot-ring-width",
2394
+ "kind": "hook",
2395
+ "default": "2px",
2396
+ "description": "Толщина обвода вокруг текущей точки. Обвод — второй признак текущего кадра помимо заливки: при диаметре в 8 пикселей одного оттенка мало, и на приглушённом тоне разница почти пропадает."
2397
+ },
2398
+ {
2399
+ "owner": "GrCarousel",
2400
+ "name": "--gr-carousel-dot-ring-offset",
2401
+ "kind": "hook",
2402
+ "default": "2px",
2403
+ "description": "Зазор между точкой и её обводом."
2404
+ },
2405
+ {
2406
+ "owner": "GrCarousel",
2407
+ "name": "--gr-carousel-dot-size",
2408
+ "kind": "hook",
2409
+ "default": "0.5rem",
2410
+ "description": "Диаметр точки-индикатора."
2411
+ },
2412
+ {
2413
+ "owner": "GrCarousel",
2414
+ "name": "--gr-carousel-thumb-width",
2415
+ "kind": "hook",
2416
+ "default": "4rem",
2417
+ "description": "Ширина миниатюры в полосе."
2418
+ },
2419
+ {
2420
+ "owner": "GrCarousel",
2421
+ "name": "--gr-carousel-thumb-height",
2422
+ "kind": "hook",
2423
+ "default": "2.5rem",
2424
+ "description": "Высота миниатюры. Пропорцию задаёт потребитель парой с шириной: у галереи товара и у ленты обложек она разная."
2425
+ },
2426
+ {
2427
+ "owner": "GrCarousel",
2428
+ "name": "--gr-carousel-thumbs-fade",
2429
+ "kind": "hook",
2430
+ "default": "1.5rem",
2431
+ "description": "Ширина затухания у края полосы миниатюр. Она же — отступ прокрутки, иначе фокус-кольцо крайней миниатюры оказывается под затуханием."
2432
+ },
2433
+ {
2434
+ "owner": "GrCarousel",
2435
+ "name": "--gr-carousel-thumbs-mask",
2436
+ "kind": "css",
2437
+ "default": "не задана, пока полоса влезает целиком",
2438
+ "description": "Маска затухания полосы миниатюр. Задаётся собственным CSS компонента по `data-overflow`: у какого края есть продолжение, тот и гаснет."
2439
+ },
2307
2440
  {
2308
2441
  "owner": "GrChip",
2309
2442
  "name": "--gr-chip-disabled-bg",
@@ -3214,6 +3347,83 @@ var grComponentTokens = [
3214
3347
  "default": "360px",
3215
3348
  "description": "Ширина стека тостов. Проп `width` задаёт её же, поэтому одно и то же настраивается и разметкой, и темой."
3216
3349
  },
3350
+ {
3351
+ "owner": "GrTransfer",
3352
+ "name": "--gr-transfer-panel-max-h",
3353
+ "kind": "hook",
3354
+ "default": "18rem",
3355
+ "description": "Высота панели. Обе панели обязаны быть одной высоты и прокручиваться внутри себя — иначе перенос двигает вёрстку страницы под курсором."
3356
+ },
3357
+ {
3358
+ "owner": "GrTransfer",
3359
+ "name": "--gr-transfer-fade",
3360
+ "kind": "hook",
3361
+ "default": "1.25rem",
3362
+ "description": "Высота затухания у края списка. Полоса прокрутки панели на части систем невидима, и без затухания обрезанная посередине строка читается как дефект отрисовки."
3363
+ },
3364
+ {
3365
+ "owner": "GrTransfer",
3366
+ "name": "--gr-transfer-list-mask",
3367
+ "kind": "css",
3368
+ "default": "не задана, пока список влезает целиком",
3369
+ "description": "Маска затухания списка. Задаётся собственным CSS компонента по `data-overflow`: у какого края есть продолжение, тот и гаснет."
3370
+ },
3371
+ {
3372
+ "owner": "GrTransfer",
3373
+ "name": "--gr-transfer-selected-bg",
3374
+ "kind": "hook",
3375
+ "default": "12 % от `--gr-primary` через `color-mix`",
3376
+ "description": "Подложка отмеченной строки. Тон, а не заливка: текст остаётся обычным `--gr-fg`, и контраст не приходится выверять заново."
3377
+ },
3378
+ {
3379
+ "owner": "GrTransfer",
3380
+ "name": "--gr-transfer-arrived-bg",
3381
+ "kind": "hook",
3382
+ "default": "32 % от `--gr-primary` через `color-mix`",
3383
+ "description": "Начальный кадр подсветки строки, только что приехавшей из соседней панели. Подсветка гаснет сама и под `prefers-reduced-motion` не показывается вовсе."
3384
+ },
3385
+ {
3386
+ "owner": "GrTransfer",
3387
+ "name": "--gr-transfer-dragging-bg",
3388
+ "kind": "hook",
3389
+ "default": "var(--gr-muted)",
3390
+ "description": "Подложка строк, которые сейчас переносят указателем: видно, что именно уедет."
3391
+ },
3392
+ {
3393
+ "owner": "GrTransfer",
3394
+ "name": "--gr-transfer-ghost-bg",
3395
+ "kind": "hook",
3396
+ "default": "var(--gr-card)",
3397
+ "description": "Подложка предпросмотра, который едет за курсором. Он и есть ответ на «где сейчас элемент»: без него строка оставалась на месте, и жест выглядел так, будто ничего не происходит."
3398
+ },
3399
+ {
3400
+ "owner": "GrTransfer",
3401
+ "name": "--gr-transfer-drop-bg",
3402
+ "kind": "hook",
3403
+ "default": "6 % от `--gr-primary` через `color-mix`",
3404
+ "description": "Подложка панели-приёмника. Одной рамки мало: на широком экране она за пределами взгляда, занятого курсором."
3405
+ },
3406
+ {
3407
+ "owner": "GrTransfer",
3408
+ "name": "--gr-transfer-drop-brd",
3409
+ "kind": "hook",
3410
+ "default": "var(--gr-primary)",
3411
+ "description": "Рамка панели под указателем во время переноса."
3412
+ },
3413
+ {
3414
+ "owner": "GrTransfer",
3415
+ "name": "--gr-transfer-indicator",
3416
+ "kind": "hook",
3417
+ "default": "var(--gr-primary)",
3418
+ "description": "Цвет линии, показывающей место вставки."
3419
+ },
3420
+ {
3421
+ "owner": "GrTransfer",
3422
+ "name": "--gr-transfer-indicator-width",
3423
+ "kind": "hook",
3424
+ "default": "2px",
3425
+ "description": "Толщина линии места вставки."
3426
+ },
3217
3427
  {
3218
3428
  "owner": "GrTree",
3219
3429
  "name": "--gr-tree-gap",