@feugene/granularity 0.48.0 → 0.49.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.
- package/README.md +3 -3
- package/dist/chunks/{config-2vrOFn2f.js → config-AKpLyIGD.js} +2 -2
- package/dist/chunks/{config-2vrOFn2f.js.map → config-AKpLyIGD.js.map} +1 -1
- package/dist/chunks/config-BBtBQE3s.js +108 -0
- package/dist/chunks/config-BBtBQE3s.js.map +1 -0
- package/dist/chunks/{config-BscVxZR3.js → config-DF1ezU6y.js} +1 -1
- package/dist/chunks/{config-BscVxZR3.js.map → config-DF1ezU6y.js.map} +1 -1
- package/dist/chunks/config-MUkhktTP.js +267 -0
- package/dist/chunks/config-MUkhktTP.js.map +1 -0
- package/dist/chunks/{en-Bxyn5lW7.js → en-CsQUoBS2.js} +5 -1
- package/dist/chunks/en-CsQUoBS2.js.map +1 -0
- package/dist/chunks/{es-Dtl-a7ui.js → es-9nbkPvdA.js} +5 -1
- package/dist/chunks/es-9nbkPvdA.js.map +1 -0
- package/dist/chunks/{es-Bj_vc18Z.js → es-DrUz5J6I.js} +3 -3
- package/dist/chunks/{es-Bj_vc18Z.js.map → es-DrUz5J6I.js.map} +1 -1
- package/dist/chunks/{generated-hELWB0gZ.js → generated-CxvC5O0V.js} +42 -0
- package/dist/chunks/{generated-hELWB0gZ.js.map → generated-CxvC5O0V.js.map} +1 -1
- package/dist/chunks/{grBadgeStyles-DV0DrAew.js → grBadgeStyles-D51AXbj5.js} +57 -1
- package/dist/chunks/grBadgeStyles-D51AXbj5.js.map +1 -0
- package/dist/chunks/{grChipStyles-DcDyxAL0.js → grChipStyles-CA9Wj1_E.js} +1 -1
- package/dist/chunks/{grChipStyles-DcDyxAL0.js.map → grChipStyles-CA9Wj1_E.js.map} +1 -1
- package/dist/chunks/{granular-provider-BOQp7N5o.js → granular-provider-B6xomapW.js} +5 -3
- package/dist/chunks/granular-provider-B6xomapW.js.map +1 -0
- package/dist/chunks/{ru-hrB4I1u_.js → ru-88i1WG0b.js} +5 -1
- package/dist/chunks/ru-88i1WG0b.js.map +1 -0
- package/dist/chunks/{safelist-x8USecK8.js → safelist-CSfynUC1.js} +5 -1
- package/dist/chunks/safelist-CSfynUC1.js.map +1 -0
- package/dist/components/GrAutocomplete/chunks/{GrAutocomplete-C-uovdv8.js → GrAutocomplete-Chhw65pI.js} +2 -2
- package/dist/components/GrAutocomplete/chunks/{GrAutocomplete-C-uovdv8.js.map → GrAutocomplete-Chhw65pI.js.map} +1 -1
- package/dist/components/GrAutocomplete/index.js +1 -1
- package/dist/components/GrBadge/chunks/GrBadge-C42KLyUD.js +71 -0
- package/dist/components/GrBadge/chunks/GrBadge-C42KLyUD.js.map +1 -0
- package/dist/components/GrBadge/index.js +3 -3
- package/dist/components/GrBadge/styles.css +1 -1
- package/dist/components/GrChip/chunks/{GrChip-CKqyzYcv.js → GrChip-DoyS1Dr4.js} +1 -1
- package/dist/components/GrChip/chunks/{GrChip-CKqyzYcv.js.map → GrChip-DoyS1Dr4.js.map} +1 -1
- package/dist/components/GrChip/index.js +2 -2
- package/dist/components/GrInputTag/chunks/{GrInputTag-CO0YU-ok.js → GrInputTag-qnRdAZnn.js} +2 -2
- package/dist/components/GrInputTag/chunks/{GrInputTag-CO0YU-ok.js.map → GrInputTag-qnRdAZnn.js.map} +1 -1
- package/dist/components/GrInputTag/index.js +1 -1
- package/dist/components/GrOtpInput/chunks/GrOtpInput-B_Q-RDLw.js +419 -0
- package/dist/components/GrOtpInput/chunks/GrOtpInput-B_Q-RDLw.js.map +1 -0
- package/dist/components/GrOtpInput/index.js +3 -0
- package/dist/components/GrOtpInput/styles.css +1 -0
- package/dist/components/GrPagination/chunks/{GrPagination-BbaF5eXk.js → GrPagination-CMrLPzvL.js} +1 -1
- package/dist/components/GrPagination/chunks/{GrPagination-BbaF5eXk.js.map → GrPagination-CMrLPzvL.js.map} +1 -1
- package/dist/components/GrPagination/index.js +1 -1
- package/dist/components/GrSelect/chunks/{GrSelect-0iI4wdR_.js → GrSelect-DvSq-nV-.js} +2 -2
- package/dist/components/GrSelect/chunks/{GrSelect-0iI4wdR_.js.map → GrSelect-DvSq-nV-.js.map} +1 -1
- package/dist/components/GrSelect/index.js +1 -1
- package/dist/components/GrSwitch/chunks/{GrSwitch-CriHWT2A.js → GrSwitch-D7X42uIA.js} +61 -7
- package/dist/components/GrSwitch/chunks/GrSwitch-D7X42uIA.js.map +1 -0
- package/dist/components/GrSwitch/index.js +2 -2
- package/dist/granular-provider-node.js +1 -1
- package/dist/granular-provider.js +1 -1
- package/dist/i18n/all.js +1 -1
- package/dist/i18n/index.js +1 -1
- package/dist/index.js +14 -13
- package/dist/theme.js +1 -1
- package/dist/tokens.js +1 -1
- package/dist/types/components/GrBadge/GrBadge.vue.d.ts +15 -1
- package/dist/types/components/GrBadge/grBadgeStyles.d.ts +57 -0
- package/dist/types/components/GrBadge/index.d.ts +1 -1
- package/dist/types/components/GrOtpInput/GrOtpInput.vue.d.ts +164 -0
- package/dist/types/components/GrOtpInput/config.d.ts +1 -0
- package/dist/types/components/GrOtpInput/defaults.d.ts +15 -0
- package/dist/types/components/GrOtpInput/grOtpInputStyles.d.ts +62 -0
- package/dist/types/components/GrOtpInput/index.d.ts +9 -0
- package/dist/types/components/GrOtpInput/otpValue.d.ts +71 -0
- package/dist/types/components/GrOtpInput/safelist.d.ts +7 -0
- package/dist/types/components/GrSwitch/GrSwitch.vue.d.ts +42 -4
- package/dist/types/components/GrSwitch/defaults.d.ts +2 -0
- package/dist/types/components/GrSwitch/grSwitchStyles.d.ts +129 -25
- package/dist/types/components/GrSwitch/index.d.ts +1 -1
- package/dist/types/components/GrSwitch/safelist.d.ts +4 -3
- package/dist/types/granular-provider/shared.d.ts +1 -0
- package/dist/types/i18n/messages/en.d.ts +4 -0
- package/dist/types/i18n/messages/es.d.ts +4 -0
- package/dist/types/i18n/messages/ru.d.ts +4 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/web-types.json +254 -8
- package/package.json +5 -1
- package/dist/chunks/config-Yy67uWHY.js +0 -140
- package/dist/chunks/config-Yy67uWHY.js.map +0 -1
- package/dist/chunks/en-Bxyn5lW7.js.map +0 -1
- package/dist/chunks/es-Dtl-a7ui.js.map +0 -1
- package/dist/chunks/grBadgeStyles-DV0DrAew.js.map +0 -1
- package/dist/chunks/granular-provider-BOQp7N5o.js.map +0 -1
- package/dist/chunks/ru-hrB4I1u_.js.map +0 -1
- package/dist/chunks/safelist-x8USecK8.js.map +0 -1
- package/dist/components/GrBadge/chunks/GrBadge-DBeQXEir.js +0 -47
- package/dist/components/GrBadge/chunks/GrBadge-DBeQXEir.js.map +0 -1
- package/dist/components/GrSwitch/chunks/GrSwitch-CriHWT2A.js.map +0 -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 |
|
|
94
|
+
| the whole package from the root | 619.8 kB | 100 % |
|
|
95
95
|
| the lightest component — `GrButtonGroup` | 1.8 kB | < 1 % |
|
|
96
|
-
| the median component — `
|
|
97
|
-
| the 5 heaviest together |
|
|
96
|
+
| the median component — `GrNavbar` | 15.4 kB | 2 % |
|
|
97
|
+
| the 5 heaviest together | 178.4 kB | 29 % |
|
|
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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { n as splitClassTokens } from "./classTokens-8v2XC74x.js";
|
|
2
|
-
import { a as chipIconSizeClassBySize, c as chipRootClass, i as chipIconClass, l as chipSelectedClass, n as chipCloseClass, o as chipInteractiveClass, r as chipDisabledClass, s as chipLabelClass, t as chipCloseButtonClass, u as chipSizeClassBySize } from "./grChipStyles-
|
|
3
|
-
import { t as grBadgeSafelist } from "./safelist-
|
|
2
|
+
import { a as chipIconSizeClassBySize, c as chipRootClass, i as chipIconClass, l as chipSelectedClass, n as chipCloseClass, o as chipInteractiveClass, r as chipDisabledClass, s as chipLabelClass, t as chipCloseButtonClass, u as chipSizeClassBySize } from "./grChipStyles-CA9Wj1_E.js";
|
|
3
|
+
import { t as grBadgeSafelist } from "./safelist-CSfynUC1.js";
|
|
4
4
|
import { defineGranularComponent } from "@feugene/unocss-preset-granular/contract";
|
|
5
5
|
//#region src/components/GrChip/safelist.ts
|
|
6
6
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-
|
|
1
|
+
{"version":3,"file":"config-AKpLyIGD.js","names":[],"sources":["../../src/components/GrChip/safelist.ts","../../src/components/GrChip/config.ts"],"sourcesContent":["import { grBadgeSafelist } from '../GrBadge/safelist'\nimport { splitClassTokens } from '../shared/classTokens'\n\nimport {\n chipCloseButtonClass,\n chipCloseClass,\n chipDisabledClass,\n chipIconClass,\n chipIconSizeClassBySize,\n chipInteractiveClass,\n chipLabelClass,\n chipRootClass,\n chipSelectedClass,\n chipSizeClassBySize,\n} from './grChipStyles'\n\n/**\n * Тона и радиусы приходят из `grBadgeStyles.ts`, поэтому их safelist берётся\n * ссылкой, а не копией: копия разошлась бы с оригиналом молча. Ребро\n * `GrChip → GrBadge` объявлено в `config.ts` — без него пресет не подмешает\n * стили бейджа при гранулярной селекции, и чип придёт бесцветным.\n */\nexport const grChipSafelist = [...new Set([\n ...grBadgeSafelist,\n ...Object.values(chipSizeClassBySize).flatMap(splitClassTokens),\n ...Object.values(chipIconSizeClassBySize).flatMap(splitClassTokens),\n ...splitClassTokens(chipRootClass),\n ...splitClassTokens(chipLabelClass),\n ...splitClassTokens(chipInteractiveClass),\n ...splitClassTokens(chipDisabledClass),\n ...splitClassTokens(chipSelectedClass),\n ...splitClassTokens(chipCloseClass),\n ...splitClassTokens(chipCloseButtonClass),\n ...splitClassTokens(chipIconClass),\n 'h-full',\n 'w-full',\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grChipSafelist } from './safelist'\n\nexport const grChipConfig = defineGranularComponent(import.meta.url, {\n name: 'GrChip',\n // `GrBadge` — импорт его класс-мап и safelist; `GrIcon` не рендерится,\n // крестик — прямой `~icons`-компонент, поэтому его в зависимостях нет.\n dependencies: ['GrBadge'],\n safelist: grChipSafelist,\n})\n"],"mappings":";;;;;;;;;;;AAsBA,IAAa,iBAAiB,CAAC,mBAAG,IAAI,IAAI;CACxC,GAAG;CACH,GAAG,OAAO,OAAO,mBAAmB,CAAC,CAAC,QAAQ,gBAAgB;CAC9D,GAAG,OAAO,OAAO,uBAAuB,CAAC,CAAC,QAAQ,gBAAgB;CAClE,GAAG,iBAAiB,aAAa;CACjC,GAAG,iBAAiB,cAAc;CAClC,GAAG,iBAAiB,oBAAoB;CACxC,GAAG,iBAAiB,iBAAiB;CACrC,GAAG,iBAAiB,iBAAiB;CACrC,GAAG,iBAAiB,cAAc;CAClC,GAAG,iBAAiB,oBAAoB;CACxC,GAAG,iBAAiB,aAAa;CACjC;CACA;AACF,CAAC,CAAC;;;AChCF,IAAa,eAAe,wBAAwB,YAAY,KAAK;CACnE,MAAM;CAGN,cAAc,CAAC,SAAS;CACxB,UAAU;AACZ,CAAC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { n as splitClassTokens } from "./classTokens-8v2XC74x.js";
|
|
2
|
+
import { defineGranularComponent } from "@feugene/unocss-preset-granular/contract";
|
|
3
|
+
//#region src/components/GrOtpInput/grOtpInputStyles.ts
|
|
4
|
+
/**
|
|
5
|
+
* `w-fit` тут не украшение. Гридовый или флексовый родитель **блокифицирует**
|
|
6
|
+
* `inline-flex`, и ряд растягивался на всю колонку: сами ячейки оставались на
|
|
7
|
+
* месте, а невидимое поле поверх них ловило клики далеко справа от кода.
|
|
8
|
+
*/
|
|
9
|
+
var rootBaseClass = "relative inline-flex w-fit items-center";
|
|
10
|
+
var rootGaps = {
|
|
11
|
+
xs: "gap-1",
|
|
12
|
+
sm: "gap-1.5",
|
|
13
|
+
md: "gap-2",
|
|
14
|
+
lg: "gap-2"
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Настоящее поле лежит **поверх** ряда ячеек и невидимо: текст, каретка и
|
|
18
|
+
* подсветка выделения прозрачны, всё видимое рисуют ячейки.
|
|
19
|
+
*
|
|
20
|
+
* Оно остаётся полноценным `<input>`, и потому даром достаются вставка,
|
|
21
|
+
* автозаполнение кода из SMS, отмена, выделение и вся каретка со стрелками —
|
|
22
|
+
* см. `docs/components/GrOtpInput.md`.
|
|
23
|
+
*
|
|
24
|
+
* `z-index` не нужен: поле позиционировано, ячейки — нет, а позиционированный
|
|
25
|
+
* элемент и так красится поверх статичных соседей. Литерал слоя тут был бы
|
|
26
|
+
* лишней записью в шкале `docs/z-index.md`.
|
|
27
|
+
*/
|
|
28
|
+
var fieldClass = "absolute inset-0 w-full cursor-text bg-transparent text-transparent [caret-color:transparent] outline-none selection:bg-transparent disabled:cursor-not-allowed";
|
|
29
|
+
var cellBaseClass = "relative inline-flex shrink-0 items-center justify-center rounded-[var(--gr-radius-control)] border [font-variant-numeric:tabular-nums] transition-colors duration-[var(--gr-duration-fast)]";
|
|
30
|
+
/**
|
|
31
|
+
* Сторона ячейки повторяет высоту `GrInput` на той же ступени: код стоит в
|
|
32
|
+
* форме рядом с полями, и ряд обязан садиться с ними в одну линию.
|
|
33
|
+
*
|
|
34
|
+
* Через хук, а не классом-числом: квадратная ячейка — решение оформления, и
|
|
35
|
+
* макет вправе сделать её шире.
|
|
36
|
+
*/
|
|
37
|
+
var cellSizes = {
|
|
38
|
+
xs: "h-[var(--gr-otp-input-cell-size,1.75rem)] w-[var(--gr-otp-input-cell-size,1.75rem)] text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]",
|
|
39
|
+
sm: "h-[var(--gr-otp-input-cell-size,2rem)] w-[var(--gr-otp-input-cell-size,2rem)] text-[length:var(--gr-control-text-sm)] leading-[var(--gr-control-leading-sm)]",
|
|
40
|
+
md: "h-[var(--gr-otp-input-cell-size,2.5rem)] w-[var(--gr-otp-input-cell-size,2.5rem)] text-[length:var(--gr-control-text-md)] leading-[var(--gr-control-leading-md)]",
|
|
41
|
+
lg: "h-[var(--gr-otp-input-cell-size,2.75rem)] w-[var(--gr-otp-input-cell-size,2.75rem)] text-[length:var(--gr-control-text-lg)] leading-[var(--gr-control-leading-lg)]"
|
|
42
|
+
};
|
|
43
|
+
var cellIdleClass = "border-[var(--gr-brd)] bg-[var(--gr-bg)] text-[var(--gr-fg)]";
|
|
44
|
+
/** Активная ячейка — та, в которой стоит каретка, и только пока поле в фокусе. */
|
|
45
|
+
var cellActiveClass = "border-[var(--gr-otp-input-active-brd,var(--gr-primary))] ring-2 ring-[var(--gr-ring)]";
|
|
46
|
+
/**
|
|
47
|
+
* Вердикт валидации красится своей ролью, а не декоративным `danger`: тема
|
|
48
|
+
* вправе развести подсветку по решению разработчика и ошибку формы.
|
|
49
|
+
*/
|
|
50
|
+
var cellInvalidClass = "border-[var(--gr-invalid-brd)] bg-[var(--gr-bg)] text-[var(--gr-fg)]";
|
|
51
|
+
var cellInvalidActiveClass = "ring-2 ring-[var(--gr-invalid-ring)]";
|
|
52
|
+
/**
|
|
53
|
+
* Недоступность гасится фоном, а не `opacity`: прозрачность разбавляет
|
|
54
|
+
* выверенные на AA токены текста и роняет контраст кода.
|
|
55
|
+
*/
|
|
56
|
+
var cellDisabledClass = "border-[var(--gr-disabled-brd)] bg-[var(--gr-disabled-bg)] text-[var(--gr-disabled-fg)]";
|
|
57
|
+
var placeholderClass = "text-[var(--gr-muted-fg)]";
|
|
58
|
+
/**
|
|
59
|
+
* Каретка рисуется своей, потому что настоящая скрыта вместе с текстом.
|
|
60
|
+
* Мигание — CSS-анимация, значит подчиняется глобальному клампу движения
|
|
61
|
+
* пакета (`docs/motion.md`), а не собственному таймеру.
|
|
62
|
+
*/
|
|
63
|
+
var caretClass = "pointer-events-none absolute h-[1em] w-px bg-[var(--gr-otp-input-caret,var(--gr-primary))]";
|
|
64
|
+
var separatorClass = "select-none px-0.5 text-[var(--gr-muted-fg)]";
|
|
65
|
+
function grOtpInputRootClass(size) {
|
|
66
|
+
return [rootBaseClass, rootGaps[size]].join(" ");
|
|
67
|
+
}
|
|
68
|
+
function grOtpInputCellClass(options) {
|
|
69
|
+
const tokens = [cellBaseClass, cellSizes[options.size]];
|
|
70
|
+
if (options.disabled) tokens.push(cellDisabledClass);
|
|
71
|
+
else if (options.invalid) tokens.push(cellInvalidClass, options.active ? cellInvalidActiveClass : "");
|
|
72
|
+
else tokens.push(cellIdleClass, options.active ? cellActiveClass : "");
|
|
73
|
+
return tokens.filter(Boolean).join(" ");
|
|
74
|
+
}
|
|
75
|
+
//#endregion
|
|
76
|
+
//#region src/components/GrOtpInput/safelist.ts
|
|
77
|
+
var grOtpInputClassTokens = {
|
|
78
|
+
root: [...splitClassTokens(rootBaseClass), ...Object.values(rootGaps).flatMap(splitClassTokens)],
|
|
79
|
+
field: splitClassTokens(fieldClass),
|
|
80
|
+
cell: [
|
|
81
|
+
...splitClassTokens(cellBaseClass),
|
|
82
|
+
...Object.values(cellSizes).flatMap(splitClassTokens),
|
|
83
|
+
...splitClassTokens(cellIdleClass),
|
|
84
|
+
...splitClassTokens(cellActiveClass),
|
|
85
|
+
...splitClassTokens(cellInvalidClass),
|
|
86
|
+
...splitClassTokens(cellInvalidActiveClass),
|
|
87
|
+
...splitClassTokens(cellDisabledClass)
|
|
88
|
+
],
|
|
89
|
+
decoration: [
|
|
90
|
+
...splitClassTokens(placeholderClass),
|
|
91
|
+
...splitClassTokens(caretClass),
|
|
92
|
+
...splitClassTokens(separatorClass)
|
|
93
|
+
]
|
|
94
|
+
};
|
|
95
|
+
var grOtpInputSafelist = [.../* @__PURE__ */ new Set([
|
|
96
|
+
...grOtpInputClassTokens.root,
|
|
97
|
+
...grOtpInputClassTokens.field,
|
|
98
|
+
...grOtpInputClassTokens.cell,
|
|
99
|
+
...grOtpInputClassTokens.decoration
|
|
100
|
+
])];
|
|
101
|
+
//#endregion
|
|
102
|
+
//#region src/components/GrOtpInput/config.ts
|
|
103
|
+
var grOtpInputConfig = defineGranularComponent(import.meta.url, {
|
|
104
|
+
name: "GrOtpInput",
|
|
105
|
+
safelist: grOtpInputSafelist
|
|
106
|
+
});
|
|
107
|
+
//#endregion
|
|
108
|
+
export { grOtpInputCellClass as a, separatorClass as c, fieldClass as i, grOtpInputSafelist as n, grOtpInputRootClass as o, caretClass as r, placeholderClass as s, grOtpInputConfig as t };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-BBtBQE3s.js","names":[],"sources":["../../src/components/GrOtpInput/grOtpInputStyles.ts","../../src/components/GrOtpInput/safelist.ts","../../src/components/GrOtpInput/config.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nexport type GrOtpInputSize = GrComponentSize\n\n/**\n * `w-fit` тут не украшение. Гридовый или флексовый родитель **блокифицирует**\n * `inline-flex`, и ряд растягивался на всю колонку: сами ячейки оставались на\n * месте, а невидимое поле поверх них ловило клики далеко справа от кода.\n */\nexport const rootBaseClass = 'relative inline-flex w-fit items-center'\n\nexport const rootGaps: Record<GrOtpInputSize, string> = {\n xs: 'gap-1',\n sm: 'gap-1.5',\n md: 'gap-2',\n lg: 'gap-2',\n}\n\n/**\n * Настоящее поле лежит **поверх** ряда ячеек и невидимо: текст, каретка и\n * подсветка выделения прозрачны, всё видимое рисуют ячейки.\n *\n * Оно остаётся полноценным `<input>`, и потому даром достаются вставка,\n * автозаполнение кода из SMS, отмена, выделение и вся каретка со стрелками —\n * см. `docs/components/GrOtpInput.md`.\n *\n * `z-index` не нужен: поле позиционировано, ячейки — нет, а позиционированный\n * элемент и так красится поверх статичных соседей. Литерал слоя тут был бы\n * лишней записью в шкале `docs/z-index.md`.\n */\nexport const fieldClass = 'absolute inset-0 w-full cursor-text bg-transparent text-transparent [caret-color:transparent] outline-none selection:bg-transparent disabled:cursor-not-allowed'\n\nexport const cellBaseClass = 'relative inline-flex shrink-0 items-center justify-center rounded-[var(--gr-radius-control)] border [font-variant-numeric:tabular-nums] transition-colors duration-[var(--gr-duration-fast)]'\n\n/**\n * Сторона ячейки повторяет высоту `GrInput` на той же ступени: код стоит в\n * форме рядом с полями, и ряд обязан садиться с ними в одну линию.\n *\n * Через хук, а не классом-числом: квадратная ячейка — решение оформления, и\n * макет вправе сделать её шире.\n */\nexport const cellSizes: Record<GrOtpInputSize, string> = {\n xs: 'h-[var(--gr-otp-input-cell-size,1.75rem)] w-[var(--gr-otp-input-cell-size,1.75rem)] text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]',\n sm: 'h-[var(--gr-otp-input-cell-size,2rem)] w-[var(--gr-otp-input-cell-size,2rem)] text-[length:var(--gr-control-text-sm)] leading-[var(--gr-control-leading-sm)]',\n md: 'h-[var(--gr-otp-input-cell-size,2.5rem)] w-[var(--gr-otp-input-cell-size,2.5rem)] text-[length:var(--gr-control-text-md)] leading-[var(--gr-control-leading-md)]',\n lg: 'h-[var(--gr-otp-input-cell-size,2.75rem)] w-[var(--gr-otp-input-cell-size,2.75rem)] text-[length:var(--gr-control-text-lg)] leading-[var(--gr-control-leading-lg)]',\n}\n\nexport const cellIdleClass = 'border-[var(--gr-brd)] bg-[var(--gr-bg)] text-[var(--gr-fg)]'\n\n/** Активная ячейка — та, в которой стоит каретка, и только пока поле в фокусе. */\nexport const cellActiveClass = 'border-[var(--gr-otp-input-active-brd,var(--gr-primary))] ring-2 ring-[var(--gr-ring)]'\n\n/**\n * Вердикт валидации красится своей ролью, а не декоративным `danger`: тема\n * вправе развести подсветку по решению разработчика и ошибку формы.\n */\nexport const cellInvalidClass = 'border-[var(--gr-invalid-brd)] bg-[var(--gr-bg)] text-[var(--gr-fg)]'\n\nexport const cellInvalidActiveClass = 'ring-2 ring-[var(--gr-invalid-ring)]'\n\n/**\n * Недоступность гасится фоном, а не `opacity`: прозрачность разбавляет\n * выверенные на AA токены текста и роняет контраст кода.\n */\nexport const cellDisabledClass = 'border-[var(--gr-disabled-brd)] bg-[var(--gr-disabled-bg)] text-[var(--gr-disabled-fg)]'\n\nexport const placeholderClass = 'text-[var(--gr-muted-fg)]'\n\n/**\n * Каретка рисуется своей, потому что настоящая скрыта вместе с текстом.\n * Мигание — CSS-анимация, значит подчиняется глобальному клампу движения\n * пакета (`docs/motion.md`), а не собственному таймеру.\n */\nexport const caretClass = 'pointer-events-none absolute h-[1em] w-px bg-[var(--gr-otp-input-caret,var(--gr-primary))]'\n\nexport const separatorClass = 'select-none px-0.5 text-[var(--gr-muted-fg)]'\n\nexport function grOtpInputRootClass(size: GrOtpInputSize): string {\n return [rootBaseClass, rootGaps[size]].join(' ')\n}\n\ntype GrOtpInputCellClassOptions = {\n size: GrOtpInputSize\n active: boolean\n invalid: boolean\n disabled: boolean\n}\n\nexport function grOtpInputCellClass(options: GrOtpInputCellClassOptions): string {\n const tokens = [cellBaseClass, cellSizes[options.size]]\n\n if (options.disabled)\n tokens.push(cellDisabledClass)\n else if (options.invalid)\n tokens.push(cellInvalidClass, options.active ? cellInvalidActiveClass : '')\n else\n tokens.push(cellIdleClass, options.active ? cellActiveClass : '')\n\n return tokens.filter(Boolean).join(' ')\n}\n","import { splitClassTokens } from '../shared/classTokens'\nimport {\n caretClass,\n cellActiveClass,\n cellBaseClass,\n cellDisabledClass,\n cellIdleClass,\n cellInvalidActiveClass,\n cellInvalidClass,\n cellSizes,\n fieldClass,\n placeholderClass,\n rootBaseClass,\n rootGaps,\n separatorClass,\n} from './grOtpInputStyles'\n\nexport const grOtpInputClassTokens = {\n root: [...splitClassTokens(rootBaseClass), ...Object.values(rootGaps).flatMap(splitClassTokens)],\n field: splitClassTokens(fieldClass),\n cell: [\n ...splitClassTokens(cellBaseClass),\n ...Object.values(cellSizes).flatMap(splitClassTokens),\n ...splitClassTokens(cellIdleClass),\n ...splitClassTokens(cellActiveClass),\n ...splitClassTokens(cellInvalidClass),\n ...splitClassTokens(cellInvalidActiveClass),\n ...splitClassTokens(cellDisabledClass),\n ],\n decoration: [\n ...splitClassTokens(placeholderClass),\n ...splitClassTokens(caretClass),\n ...splitClassTokens(separatorClass),\n ],\n} as const\n\nexport const grOtpInputSafelist = [...new Set([\n ...grOtpInputClassTokens.root,\n ...grOtpInputClassTokens.field,\n ...grOtpInputClassTokens.cell,\n ...grOtpInputClassTokens.decoration,\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grOtpInputSafelist } from './safelist'\n\nexport const grOtpInputConfig = defineGranularComponent(import.meta.url, {\n name: 'GrOtpInput',\n safelist: grOtpInputSafelist,\n})\n"],"mappings":";;;;;;;;AASA,IAAa,gBAAgB;AAE7B,IAAa,WAA2C;CACtD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;;;;;;;;;AAcA,IAAa,aAAa;AAE1B,IAAa,gBAAgB;;;;;;;;AAS7B,IAAa,YAA4C;CACvD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,gBAAgB;;AAG7B,IAAa,kBAAkB;;;;;AAM/B,IAAa,mBAAmB;AAEhC,IAAa,yBAAyB;;;;;AAMtC,IAAa,oBAAoB;AAEjC,IAAa,mBAAmB;;;;;;AAOhC,IAAa,aAAa;AAE1B,IAAa,iBAAiB;AAE9B,SAAgB,oBAAoB,MAA8B;CAChE,OAAO,CAAC,eAAe,SAAS,KAAK,CAAC,CAAC,KAAK,GAAG;AACjD;AASA,SAAgB,oBAAoB,SAA6C;CAC/E,MAAM,SAAS,CAAC,eAAe,UAAU,QAAQ,KAAK;CAEtD,IAAI,QAAQ,UACV,OAAO,KAAK,iBAAiB;MAC1B,IAAI,QAAQ,SACf,OAAO,KAAK,kBAAkB,QAAQ,SAAS,yBAAyB,EAAE;MAE1E,OAAO,KAAK,eAAe,QAAQ,SAAS,kBAAkB,EAAE;CAElE,OAAO,OAAO,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AACxC;;;ACnFA,IAAa,wBAAwB;CACnC,MAAM,CAAC,GAAG,iBAAiB,aAAa,GAAG,GAAG,OAAO,OAAO,QAAQ,CAAC,CAAC,QAAQ,gBAAgB,CAAC;CAC/F,OAAO,iBAAiB,UAAU;CAClC,MAAM;EACJ,GAAG,iBAAiB,aAAa;EACjC,GAAG,OAAO,OAAO,SAAS,CAAC,CAAC,QAAQ,gBAAgB;EACpD,GAAG,iBAAiB,aAAa;EACjC,GAAG,iBAAiB,eAAe;EACnC,GAAG,iBAAiB,gBAAgB;EACpC,GAAG,iBAAiB,sBAAsB;EAC1C,GAAG,iBAAiB,iBAAiB;CACvC;CACA,YAAY;EACV,GAAG,iBAAiB,gBAAgB;EACpC,GAAG,iBAAiB,UAAU;EAC9B,GAAG,iBAAiB,cAAc;CACpC;AACF;AAEA,IAAa,qBAAqB,CAAC,mBAAG,IAAI,IAAI;CAC5C,GAAG,sBAAsB;CACzB,GAAG,sBAAsB;CACzB,GAAG,sBAAsB;CACzB,GAAG,sBAAsB;AAC3B,CAAC,CAAC;;;ACrCF,IAAa,mBAAmB,wBAAwB,YAAY,KAAK;CACvE,MAAM;CACN,UAAU;AACZ,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as grBadgeSafelist } from "./safelist-
|
|
1
|
+
import { t as grBadgeSafelist } from "./safelist-CSfynUC1.js";
|
|
2
2
|
import { defineGranularComponent } from "@feugene/unocss-preset-granular/contract";
|
|
3
3
|
//#region src/components/GrBadge/config.ts
|
|
4
4
|
var grBadgeConfig = defineGranularComponent(import.meta.url, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-
|
|
1
|
+
{"version":3,"file":"config-DF1ezU6y.js","names":[],"sources":["../../src/components/GrBadge/config.ts"],"sourcesContent":["import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grBadgeSafelist } from './safelist'\n\nexport const grBadgeConfig = defineGranularComponent(import.meta.url, {\n name: 'GrBadge',\n safelist: grBadgeSafelist,\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":";;;AAIA,IAAa,gBAAgB,wBAAwB,YAAY,KAAK;CACpE,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,267 @@
|
|
|
1
|
+
import { n as splitClassTokens } from "./classTokens-8v2XC74x.js";
|
|
2
|
+
import { defineGranularComponent } from "@feugene/unocss-preset-granular/contract";
|
|
3
|
+
//#region src/components/GrSwitch/grSwitchStyles.ts
|
|
4
|
+
var rootBase = "inline-flex items-center gap-2 select-none disabled:cursor-not-allowed";
|
|
5
|
+
/** `start` разворачивает ряд, а не меняет порядок узлов: DOM-порядок читает диктор. */
|
|
6
|
+
var rootLabelPositions = {
|
|
7
|
+
start: "flex-row-reverse",
|
|
8
|
+
end: ""
|
|
9
|
+
};
|
|
10
|
+
var trackBase = "relative inline-flex shrink-0 items-center rounded-[var(--gr-radius-full)] border border-[var(--gr-switch-track-brd)] transition-colors duration-[var(--gr-duration-fast)]";
|
|
11
|
+
var trackSizes = {
|
|
12
|
+
xs: "h-4 w-7",
|
|
13
|
+
sm: "h-5 w-9",
|
|
14
|
+
md: "h-6 w-11",
|
|
15
|
+
lg: "h-7 w-14"
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Дорожка в режиме `autoWidth`: та же ступень становится **нижней границей**,
|
|
19
|
+
* а ширину берёт подпись. Высота остаётся фиксированной — тянется только строка.
|
|
20
|
+
*/
|
|
21
|
+
var trackAutoSizes = {
|
|
22
|
+
xs: "h-4 min-w-7",
|
|
23
|
+
sm: "h-5 min-w-9",
|
|
24
|
+
md: "h-6 min-w-11",
|
|
25
|
+
lg: "h-7 min-w-14"
|
|
26
|
+
};
|
|
27
|
+
var thumbBase = "absolute top-[1px] inline-flex shrink-0 items-center justify-center rounded-[var(--gr-radius-full)] bg-[var(--gr-card)] shadow-[var(--gr-shadow-1)] transition-[left,transform] duration-[var(--gr-duration-fast)]";
|
|
28
|
+
var thumbSizes = {
|
|
29
|
+
xs: "h-3 w-3",
|
|
30
|
+
sm: "h-4 w-4",
|
|
31
|
+
md: "h-5 w-5",
|
|
32
|
+
lg: "h-6 w-6"
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Содержимое бегунка — спиннер загрузки или иконка действия — мельче его на
|
|
36
|
+
* ступень: иначе знак упирается в края круга и теряет форму.
|
|
37
|
+
*/
|
|
38
|
+
var thumbContentSizes = {
|
|
39
|
+
xs: "h-2 w-2",
|
|
40
|
+
sm: "h-2.5 w-2.5",
|
|
41
|
+
md: "h-3 w-3",
|
|
42
|
+
lg: "h-4 w-4"
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Цвет содержимого бегунка — один на спиннер и иконку.
|
|
46
|
+
*
|
|
47
|
+
* Хук с фолбэком в самом классе, а не инлайн-значение: инлайн победил бы CSS
|
|
48
|
+
* потребителя, и переопределить цвет было бы нечем.
|
|
49
|
+
*
|
|
50
|
+
* По состоянию цвет не ветвится и в `disabled` не тускнеет: гасится дорожка, а
|
|
51
|
+
* бегунок остаётся `--gr-card` в любом состоянии — содержимое, меняющее цвет,
|
|
52
|
+
* разошлось бы со своей же подложкой.
|
|
53
|
+
*/
|
|
54
|
+
var thumbContentColorClass = "text-[var(--gr-switch-thumb-fg,var(--gr-muted-fg))]";
|
|
55
|
+
var thumbSpinnerBase = `animate-spin ${thumbContentColorClass}`;
|
|
56
|
+
/** Обёртка иконки держит размер, содержимое слота тянется до неё `h-full w-full`. */
|
|
57
|
+
var thumbIconBase = `inline-flex shrink-0 items-center justify-center ${thumbContentColorClass}`;
|
|
58
|
+
/**
|
|
59
|
+
* Положение бегунка — **без единого числа, зависящего от ширины дорожки**.
|
|
60
|
+
*
|
|
61
|
+
* Крайнее положение выражено парой `left: calc(100% − зазор)` и
|
|
62
|
+
* `translateX(-100%)`: процент в `left` считается от padding-box дорожки,
|
|
63
|
+
* процент в `transform` — от самого бегунка. В сумме левый край встаёт на
|
|
64
|
+
* `ширина − бегунок − зазор`, какой бы ширина ни была.
|
|
65
|
+
*
|
|
66
|
+
* Обе величины анимируются, и композиция даёт строго линейный ход: в момент `t`
|
|
67
|
+
* смещение равно `t · (ширина − бегунок)`. Поэтому режим `autoWidth` не требует
|
|
68
|
+
* ни измерений, ни ResizeObserver — только эти два класса.
|
|
69
|
+
*/
|
|
70
|
+
var thumbPositions = {
|
|
71
|
+
checked: "left-[calc(100%_-_1px)] -translate-x-full",
|
|
72
|
+
unchecked: "left-[1px] translate-x-0"
|
|
73
|
+
};
|
|
74
|
+
var labelBase = "text-[var(--gr-muted-fg)]";
|
|
75
|
+
/**
|
|
76
|
+
* Недоступность гасится токеном, а не `opacity`: прозрачность разбавляет
|
|
77
|
+
* выверенные на AA токены текста и роняет контраст подписи.
|
|
78
|
+
*/
|
|
79
|
+
var labelDisabledClass = "text-[var(--gr-disabled-fg)]";
|
|
80
|
+
var labelSizes = {
|
|
81
|
+
xs: "text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)]",
|
|
82
|
+
sm: "text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)]",
|
|
83
|
+
md: "text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)]",
|
|
84
|
+
lg: "text-[length:var(--gr-text-base)] leading-[var(--gr-leading-base)]"
|
|
85
|
+
};
|
|
86
|
+
function grSwitchRootClass(labelPosition) {
|
|
87
|
+
return [rootBase, rootLabelPositions[labelPosition]].filter(Boolean).join(" ");
|
|
88
|
+
}
|
|
89
|
+
function grSwitchTrackClass(size, autoWidth = false) {
|
|
90
|
+
return [trackBase, (autoWidth ? trackAutoSizes : trackSizes)[size]].join(" ");
|
|
91
|
+
}
|
|
92
|
+
function grSwitchThumbClass(options) {
|
|
93
|
+
return [
|
|
94
|
+
thumbBase,
|
|
95
|
+
thumbSizes[options.size],
|
|
96
|
+
thumbPositions[options.checked ? "checked" : "unchecked"]
|
|
97
|
+
].join(" ");
|
|
98
|
+
}
|
|
99
|
+
function grSwitchSpinnerClass(size) {
|
|
100
|
+
return [thumbSpinnerBase, thumbContentSizes[size]].join(" ");
|
|
101
|
+
}
|
|
102
|
+
function grSwitchThumbIconClass(size) {
|
|
103
|
+
return [thumbIconBase, thumbContentSizes[size]].join(" ");
|
|
104
|
+
}
|
|
105
|
+
function grSwitchLabelClass(size, disabled = false) {
|
|
106
|
+
return [disabled ? labelDisabledClass : labelBase, labelSizes[size]].join(" ");
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Ступени, на которых подпись состояния помещается внутрь дорожки.
|
|
110
|
+
*
|
|
111
|
+
* Свободное место рядом с бегунком — `content − (бегунок + зазор)`, то есть
|
|
112
|
+
* 13 / 17 / 21 / 29px на `xs` / `sm` / `md` / `lg`. Минимальная ступень
|
|
113
|
+
* типографики пакета — `--gr-text-xs` (12px), и «OFF» на ней занимает ~25px;
|
|
114
|
+
* собственные 10px дают ~20px. В 13 и 17 не встаёт и это, а ужимать шрифт
|
|
115
|
+
* дальше значит сделать подпись нечитаемой ради того, чтобы она была.
|
|
116
|
+
*/
|
|
117
|
+
var GR_SWITCH_STATE_TEXT_SIZES = ["md", "lg"];
|
|
118
|
+
/** Свободное место в дорожке рядом с бегунком, px. Считается гейтом заново. */
|
|
119
|
+
var stateTextRoom = {
|
|
120
|
+
xs: 13,
|
|
121
|
+
sm: 17,
|
|
122
|
+
md: 21,
|
|
123
|
+
lg: 29
|
|
124
|
+
};
|
|
125
|
+
function isGrSwitchStateTextSize(size) {
|
|
126
|
+
return GR_SWITCH_STATE_TEXT_SIZES.includes(size);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Ячейка подписи. Грид, а не флекс, ради второго режима: в `autoWidth` в ту же
|
|
130
|
+
* клетку кладётся невидимый дубль противоположного текста, и ширина ячейки
|
|
131
|
+
* становится максимумом из двух — иначе дорожка дёргалась бы на каждом щелчке
|
|
132
|
+
* («ON» 15.6px против «OFF» 19.9px).
|
|
133
|
+
*/
|
|
134
|
+
var stateTextBase = "pointer-events-none grid items-center justify-items-center overflow-hidden font-semibold uppercase leading-none";
|
|
135
|
+
/**
|
|
136
|
+
* Где ячейка живёт. При фиксированной ширине она накрывает дорожку и на её
|
|
137
|
+
* размер не влияет; в `autoWidth` встаёт в поток и ширину как раз задаёт.
|
|
138
|
+
*/
|
|
139
|
+
var stateTextLayouts = {
|
|
140
|
+
fixed: "absolute inset-0",
|
|
141
|
+
auto: ""
|
|
142
|
+
};
|
|
143
|
+
/** Оба текста ложатся в одну клетку грида — отсюда максимум по ширине. */
|
|
144
|
+
var stateTextStackClass = "col-start-1 row-start-1";
|
|
145
|
+
/** Дубль занимает место, но не рисуется: `visibility`, а не `display`. */
|
|
146
|
+
var stateTextGhostClass = `${stateTextStackClass} invisible`;
|
|
147
|
+
/**
|
|
148
|
+
* Кегль подписи — свой, а не ступень шкалы пакета: минимальный `--gr-text-xs`
|
|
149
|
+
* это 12px, и трёхбуквенное слово на нём занимает ~24px при 21px места.
|
|
150
|
+
*
|
|
151
|
+
* Значения меряны, а не выведены (Inter 600, uppercase). На `md` в 21px:
|
|
152
|
+
* «OFF» 17.9, «НЕТ» 18.8, «ВКЛ» 19.4 — то есть 9px берёт трёхбуквенные слова
|
|
153
|
+
* во всех трёх локалях с запасом; 10px оставлял «НЕТ» 0.1px до обреза.
|
|
154
|
+
* На `lg` места 29px, и 11px там читается лучше, не рискуя ничем.
|
|
155
|
+
*
|
|
156
|
+
* Четырёхбуквенное «ВЫКЛ» не встаёт ни на одной ступени и ни при каком кегле
|
|
157
|
+
* (31px на 10px кегля) — поэтому русский дефолт «ДА»/«НЕТ», а не «ВКЛ»/«ВЫКЛ».
|
|
158
|
+
*/
|
|
159
|
+
var stateTextSizes = {
|
|
160
|
+
md: "text-[length:var(--gr-switch-state-text-size,9px)]",
|
|
161
|
+
lg: "text-[length:var(--gr-switch-state-text-size,11px)]"
|
|
162
|
+
};
|
|
163
|
+
/** Отступ со стороны бегунка — `бегунок + зазор`; остаток и есть место подписи. */
|
|
164
|
+
var stateTextPaddings = {
|
|
165
|
+
md: {
|
|
166
|
+
checked: "pr-[21px]",
|
|
167
|
+
unchecked: "pl-[21px]"
|
|
168
|
+
},
|
|
169
|
+
lg: {
|
|
170
|
+
checked: "pr-[25px]",
|
|
171
|
+
unchecked: "pl-[25px]"
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
/**
|
|
175
|
+
* Отступы в `autoWidth` — те же, плюс воздух с **обеих** сторон.
|
|
176
|
+
*
|
|
177
|
+
* При фиксированной ширине текст центруется в остатке и сам ни во что не
|
|
178
|
+
* упирается. Здесь остатка нет: ширину задаёт сам текст, и без воздуха он
|
|
179
|
+
* прилипает к бегунку с одной стороны и к закруглению с другой — проверено
|
|
180
|
+
* глазами, «ОНЛАЙН» вплотную к бегунку читается как дефект вёрстки.
|
|
181
|
+
*
|
|
182
|
+
* Поэтому со стороны бегунка отступ равен `бегунок + зазор + воздух`, а со
|
|
183
|
+
* свободной — просто воздуху. Воздух: 8px на `md`, 10px на `lg`.
|
|
184
|
+
*/
|
|
185
|
+
var stateTextAutoPaddings = {
|
|
186
|
+
md: {
|
|
187
|
+
checked: "pl-[8px] pr-[29px]",
|
|
188
|
+
unchecked: "pl-[29px] pr-[8px]"
|
|
189
|
+
},
|
|
190
|
+
lg: {
|
|
191
|
+
checked: "pl-[10px] pr-[35px]",
|
|
192
|
+
unchecked: "pl-[35px] pr-[10px]"
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
/**
|
|
196
|
+
* Цвет подписи — роль `-fg` той заливки, на которой она лежит.
|
|
197
|
+
*
|
|
198
|
+
* Хук стоит фолбэком в самом классе, а не инлайн-значением: инлайн победил бы
|
|
199
|
+
* CSS потребителя, и переопределить токен было бы нечем. Заливку дорожки задают
|
|
200
|
+
* произвольным цветом (`activeBackgroundColor`), и безопасный цвет текста на
|
|
201
|
+
* ней библиотека не вычислит — его называет тот же, кто задал фон.
|
|
202
|
+
*/
|
|
203
|
+
var stateTextColors = {
|
|
204
|
+
checked: "text-[var(--gr-switch-state-text-fg,var(--gr-primary-fg))]",
|
|
205
|
+
unchecked: "text-[var(--gr-switch-state-text-fg,var(--gr-muted-fg))]",
|
|
206
|
+
disabled: "text-[var(--gr-switch-state-text-fg,var(--gr-disabled-fg))]"
|
|
207
|
+
};
|
|
208
|
+
function grSwitchStateTextClass(options) {
|
|
209
|
+
const state = options.disabled ? "disabled" : options.checked ? "checked" : "unchecked";
|
|
210
|
+
const side = options.checked ? "checked" : "unchecked";
|
|
211
|
+
const paddings = options.autoWidth ? stateTextAutoPaddings : stateTextPaddings;
|
|
212
|
+
return [
|
|
213
|
+
stateTextBase,
|
|
214
|
+
stateTextLayouts[options.autoWidth ? "auto" : "fixed"],
|
|
215
|
+
stateTextSizes[options.size],
|
|
216
|
+
stateTextColors[state],
|
|
217
|
+
paddings[options.size][side]
|
|
218
|
+
].filter(Boolean).join(" ");
|
|
219
|
+
}
|
|
220
|
+
//#endregion
|
|
221
|
+
//#region src/components/GrSwitch/safelist.ts
|
|
222
|
+
var grSwitchClassTokens = {
|
|
223
|
+
rootBase: splitClassTokens(rootBase),
|
|
224
|
+
rootLabelPositions: Object.values(rootLabelPositions).flatMap(splitClassTokens),
|
|
225
|
+
trackBase: splitClassTokens(trackBase),
|
|
226
|
+
trackSizes: [...Object.values(trackSizes).flatMap(splitClassTokens), ...Object.values(trackAutoSizes).flatMap(splitClassTokens)],
|
|
227
|
+
thumbBase: splitClassTokens(thumbBase),
|
|
228
|
+
thumbSizes: Object.values(thumbSizes).flatMap(splitClassTokens),
|
|
229
|
+
thumbContent: [
|
|
230
|
+
...splitClassTokens(thumbSpinnerBase),
|
|
231
|
+
...splitClassTokens(thumbIconBase),
|
|
232
|
+
...Object.values(thumbContentSizes).flatMap(splitClassTokens)
|
|
233
|
+
],
|
|
234
|
+
thumbPositions: Object.values(thumbPositions).flatMap(splitClassTokens),
|
|
235
|
+
labelBase: [...splitClassTokens(labelBase), ...splitClassTokens(labelDisabledClass)],
|
|
236
|
+
labelSizes: Object.values(labelSizes).flatMap(splitClassTokens),
|
|
237
|
+
stateText: [
|
|
238
|
+
...splitClassTokens(stateTextBase),
|
|
239
|
+
...splitClassTokens(stateTextStackClass),
|
|
240
|
+
...splitClassTokens(stateTextGhostClass),
|
|
241
|
+
...Object.values(stateTextLayouts).flatMap(splitClassTokens),
|
|
242
|
+
...Object.values(stateTextSizes).flatMap(splitClassTokens),
|
|
243
|
+
...Object.values(stateTextColors).flatMap(splitClassTokens),
|
|
244
|
+
...[stateTextPaddings, stateTextAutoPaddings].flatMap((map) => Object.values(map).flatMap(({ checked, unchecked }) => [...splitClassTokens(checked), ...splitClassTokens(unchecked)]))
|
|
245
|
+
]
|
|
246
|
+
};
|
|
247
|
+
var grSwitchSafelist = [.../* @__PURE__ */ new Set([
|
|
248
|
+
...grSwitchClassTokens.rootBase,
|
|
249
|
+
...grSwitchClassTokens.rootLabelPositions,
|
|
250
|
+
...grSwitchClassTokens.trackBase,
|
|
251
|
+
...grSwitchClassTokens.trackSizes,
|
|
252
|
+
...grSwitchClassTokens.thumbBase,
|
|
253
|
+
...grSwitchClassTokens.thumbSizes,
|
|
254
|
+
...grSwitchClassTokens.thumbContent,
|
|
255
|
+
...grSwitchClassTokens.thumbPositions,
|
|
256
|
+
...grSwitchClassTokens.labelBase,
|
|
257
|
+
...grSwitchClassTokens.labelSizes,
|
|
258
|
+
...grSwitchClassTokens.stateText
|
|
259
|
+
])];
|
|
260
|
+
//#endregion
|
|
261
|
+
//#region src/components/GrSwitch/config.ts
|
|
262
|
+
var grSwitchConfig = defineGranularComponent(import.meta.url, {
|
|
263
|
+
name: "GrSwitch",
|
|
264
|
+
safelist: grSwitchSafelist
|
|
265
|
+
});
|
|
266
|
+
//#endregion
|
|
267
|
+
export { grSwitchSpinnerClass as a, grSwitchThumbIconClass as c, stateTextGhostClass as d, stateTextRoom as f, grSwitchRootClass as i, grSwitchTrackClass as l, grSwitchSafelist as n, grSwitchStateTextClass as o, stateTextStackClass as p, grSwitchLabelClass as r, grSwitchThumbClass as s, grSwitchConfig as t, isGrSwitchStateTextSize as u };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-MUkhktTP.js","names":[],"sources":["../../src/components/GrSwitch/grSwitchStyles.ts","../../src/components/GrSwitch/safelist.ts","../../src/components/GrSwitch/config.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nexport type GrSwitchSize = GrComponentSize\n\n/** Сторона подписи относительно дорожки — логическая, не физическая (RTL). */\nexport const GR_SWITCH_LABEL_POSITIONS = ['start', 'end'] as const\nexport type GrSwitchLabelPosition = typeof GR_SWITCH_LABEL_POSITIONS[number]\n\ntype GrSwitchThumbClassOptions = {\n checked: boolean\n size: GrSwitchSize\n}\n\nexport const rootBase = 'inline-flex items-center gap-2 select-none disabled:cursor-not-allowed'\n\n/** `start` разворачивает ряд, а не меняет порядок узлов: DOM-порядок читает диктор. */\nexport const rootLabelPositions: Record<GrSwitchLabelPosition, string> = {\n start: 'flex-row-reverse',\n end: '',\n}\n\nexport const trackBase\n = 'relative inline-flex shrink-0 items-center rounded-[var(--gr-radius-full)] border border-[var(--gr-switch-track-brd)] transition-colors duration-[var(--gr-duration-fast)]'\n\nexport const trackSizes: Record<GrSwitchSize, string> = {\n xs: 'h-4 w-7',\n sm: 'h-5 w-9',\n md: 'h-6 w-11',\n lg: 'h-7 w-14',\n}\n\n/**\n * Дорожка в режиме `autoWidth`: та же ступень становится **нижней границей**,\n * а ширину берёт подпись. Высота остаётся фиксированной — тянется только строка.\n */\nexport const trackAutoSizes: Record<GrSwitchSize, string> = {\n xs: 'h-4 min-w-7',\n sm: 'h-5 min-w-9',\n md: 'h-6 min-w-11',\n lg: 'h-7 min-w-14',\n}\n\nexport const thumbBase\n = 'absolute top-[1px] inline-flex shrink-0 items-center justify-center rounded-[var(--gr-radius-full)] bg-[var(--gr-card)] shadow-[var(--gr-shadow-1)] transition-[left,transform] duration-[var(--gr-duration-fast)]'\n\nexport const thumbSizes: Record<GrSwitchSize, string> = {\n xs: 'h-3 w-3',\n sm: 'h-4 w-4',\n md: 'h-5 w-5',\n lg: 'h-6 w-6',\n}\n\n/**\n * Содержимое бегунка — спиннер загрузки или иконка действия — мельче его на\n * ступень: иначе знак упирается в края круга и теряет форму.\n */\nexport const thumbContentSizes: Record<GrSwitchSize, string> = {\n xs: 'h-2 w-2',\n sm: 'h-2.5 w-2.5',\n md: 'h-3 w-3',\n lg: 'h-4 w-4',\n}\n\n/**\n * Цвет содержимого бегунка — один на спиннер и иконку.\n *\n * Хук с фолбэком в самом классе, а не инлайн-значение: инлайн победил бы CSS\n * потребителя, и переопределить цвет было бы нечем.\n *\n * По состоянию цвет не ветвится и в `disabled` не тускнеет: гасится дорожка, а\n * бегунок остаётся `--gr-card` в любом состоянии — содержимое, меняющее цвет,\n * разошлось бы со своей же подложкой.\n */\nexport const thumbContentColorClass = 'text-[var(--gr-switch-thumb-fg,var(--gr-muted-fg))]'\n\nexport const thumbSpinnerBase = `animate-spin ${thumbContentColorClass}`\n\n/** Обёртка иконки держит размер, содержимое слота тянется до неё `h-full w-full`. */\nexport const thumbIconBase = `inline-flex shrink-0 items-center justify-center ${thumbContentColorClass}`\n\n/**\n * Зазор бегунка со всех сторон, px.\n *\n * Дорожка — `border-box` с рамкой 1px, и по вертикали зазор задан геометрией:\n * `(content-height − thumb) / 2` даёт ровно 1 на всех ступенях. Значит и по\n * горизонтали он обязан быть тем же: иначе бегунок в покое выглядит вдавленным\n * внутрь, а в крайнем положении прижатым к краю — именно так и было, зазоры\n * расходились на 1–2px у `xs`, `sm` и `lg`.\n *\n * Гейт живёт в `__tests__/GrSwitch.test.ts` и считает вертикаль заново из\n * `trackSizes`/`thumbSizes`, поэтому смена любой ступени размера сразу покажет\n * разъехавшийся зазор.\n */\nexport const SWITCH_THUMB_GAP = 1\n\n/**\n * Положение бегунка — **без единого числа, зависящего от ширины дорожки**.\n *\n * Крайнее положение выражено парой `left: calc(100% − зазор)` и\n * `translateX(-100%)`: процент в `left` считается от padding-box дорожки,\n * процент в `transform` — от самого бегунка. В сумме левый край встаёт на\n * `ширина − бегунок − зазор`, какой бы ширина ни была.\n *\n * Обе величины анимируются, и композиция даёт строго линейный ход: в момент `t`\n * смещение равно `t · (ширина − бегунок)`. Поэтому режим `autoWidth` не требует\n * ни измерений, ни ResizeObserver — только эти два класса.\n */\nexport const thumbPositions: Record<'checked' | 'unchecked', string> = {\n checked: 'left-[calc(100%_-_1px)] -translate-x-full',\n unchecked: 'left-[1px] translate-x-0',\n}\n\nexport const labelBase = 'text-[var(--gr-muted-fg)]'\n\n/**\n * Недоступность гасится токеном, а не `opacity`: прозрачность разбавляет\n * выверенные на AA токены текста и роняет контраст подписи.\n */\nexport const labelDisabledClass = 'text-[var(--gr-disabled-fg)]'\n\nexport const labelSizes: Record<GrSwitchSize, string> = {\n xs: 'text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)]',\n sm: 'text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)]',\n md: 'text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)]',\n lg: 'text-[length:var(--gr-text-base)] leading-[var(--gr-leading-base)]',\n}\n\nexport function grSwitchRootClass(labelPosition: GrSwitchLabelPosition): string {\n return [rootBase, rootLabelPositions[labelPosition]].filter(Boolean).join(' ')\n}\n\nexport function grSwitchTrackClass(size: GrSwitchSize, autoWidth = false): string {\n return [trackBase, (autoWidth ? trackAutoSizes : trackSizes)[size]].join(' ')\n}\n\nexport function grSwitchThumbClass(options: GrSwitchThumbClassOptions): string {\n return [\n thumbBase,\n thumbSizes[options.size],\n thumbPositions[options.checked ? 'checked' : 'unchecked'],\n ].join(' ')\n}\n\nexport function grSwitchSpinnerClass(size: GrSwitchSize): string {\n return [thumbSpinnerBase, thumbContentSizes[size]].join(' ')\n}\n\nexport function grSwitchThumbIconClass(size: GrSwitchSize): string {\n return [thumbIconBase, thumbContentSizes[size]].join(' ')\n}\n\nexport function grSwitchLabelClass(size: GrSwitchSize, disabled = false): string {\n return [disabled ? labelDisabledClass : labelBase, labelSizes[size]].join(' ')\n}\n\n/**\n * Ступени, на которых подпись состояния помещается внутрь дорожки.\n *\n * Свободное место рядом с бегунком — `content − (бегунок + зазор)`, то есть\n * 13 / 17 / 21 / 29px на `xs` / `sm` / `md` / `lg`. Минимальная ступень\n * типографики пакета — `--gr-text-xs` (12px), и «OFF» на ней занимает ~25px;\n * собственные 10px дают ~20px. В 13 и 17 не встаёт и это, а ужимать шрифт\n * дальше значит сделать подпись нечитаемой ради того, чтобы она была.\n */\nexport const GR_SWITCH_STATE_TEXT_SIZES = ['md', 'lg'] as const\nexport type GrSwitchStateTextSize = typeof GR_SWITCH_STATE_TEXT_SIZES[number]\n\n/** Свободное место в дорожке рядом с бегунком, px. Считается гейтом заново. */\nexport const stateTextRoom: Record<GrSwitchSize, number> = {\n xs: 13,\n sm: 17,\n md: 21,\n lg: 29,\n}\n\nexport function isGrSwitchStateTextSize(size: GrSwitchSize): size is GrSwitchStateTextSize {\n return (GR_SWITCH_STATE_TEXT_SIZES as readonly GrSwitchSize[]).includes(size)\n}\n\n/**\n * Ячейка подписи. Грид, а не флекс, ради второго режима: в `autoWidth` в ту же\n * клетку кладётся невидимый дубль противоположного текста, и ширина ячейки\n * становится максимумом из двух — иначе дорожка дёргалась бы на каждом щелчке\n * («ON» 15.6px против «OFF» 19.9px).\n */\nexport const stateTextBase\n = 'pointer-events-none grid items-center justify-items-center overflow-hidden font-semibold uppercase leading-none'\n\n/**\n * Где ячейка живёт. При фиксированной ширине она накрывает дорожку и на её\n * размер не влияет; в `autoWidth` встаёт в поток и ширину как раз задаёт.\n */\nexport const stateTextLayouts: Record<'fixed' | 'auto', string> = {\n fixed: 'absolute inset-0',\n auto: '',\n}\n\n/** Оба текста ложатся в одну клетку грида — отсюда максимум по ширине. */\nexport const stateTextStackClass = 'col-start-1 row-start-1'\n\n/** Дубль занимает место, но не рисуется: `visibility`, а не `display`. */\nexport const stateTextGhostClass = `${stateTextStackClass} invisible`\n\n/**\n * Кегль подписи — свой, а не ступень шкалы пакета: минимальный `--gr-text-xs`\n * это 12px, и трёхбуквенное слово на нём занимает ~24px при 21px места.\n *\n * Значения меряны, а не выведены (Inter 600, uppercase). На `md` в 21px:\n * «OFF» 17.9, «НЕТ» 18.8, «ВКЛ» 19.4 — то есть 9px берёт трёхбуквенные слова\n * во всех трёх локалях с запасом; 10px оставлял «НЕТ» 0.1px до обреза.\n * На `lg` места 29px, и 11px там читается лучше, не рискуя ничем.\n *\n * Четырёхбуквенное «ВЫКЛ» не встаёт ни на одной ступени и ни при каком кегле\n * (31px на 10px кегля) — поэтому русский дефолт «ДА»/«НЕТ», а не «ВКЛ»/«ВЫКЛ».\n */\nexport const stateTextSizes: Record<GrSwitchStateTextSize, string> = {\n md: 'text-[length:var(--gr-switch-state-text-size,9px)]',\n lg: 'text-[length:var(--gr-switch-state-text-size,11px)]',\n}\n\n/** Отступ со стороны бегунка — `бегунок + зазор`; остаток и есть место подписи. */\nexport const stateTextPaddings: Record<GrSwitchStateTextSize, { checked: string, unchecked: string }> = {\n md: {\n checked: 'pr-[21px]',\n unchecked: 'pl-[21px]',\n },\n lg: {\n checked: 'pr-[25px]',\n unchecked: 'pl-[25px]',\n },\n}\n\n/**\n * Отступы в `autoWidth` — те же, плюс воздух с **обеих** сторон.\n *\n * При фиксированной ширине текст центруется в остатке и сам ни во что не\n * упирается. Здесь остатка нет: ширину задаёт сам текст, и без воздуха он\n * прилипает к бегунку с одной стороны и к закруглению с другой — проверено\n * глазами, «ОНЛАЙН» вплотную к бегунку читается как дефект вёрстки.\n *\n * Поэтому со стороны бегунка отступ равен `бегунок + зазор + воздух`, а со\n * свободной — просто воздуху. Воздух: 8px на `md`, 10px на `lg`.\n */\nexport const stateTextAutoPaddings: Record<GrSwitchStateTextSize, { checked: string, unchecked: string }> = {\n md: {\n checked: 'pl-[8px] pr-[29px]',\n unchecked: 'pl-[29px] pr-[8px]',\n },\n lg: {\n checked: 'pl-[10px] pr-[35px]',\n unchecked: 'pl-[35px] pr-[10px]',\n },\n}\n\n/**\n * Цвет подписи — роль `-fg` той заливки, на которой она лежит.\n *\n * Хук стоит фолбэком в самом классе, а не инлайн-значением: инлайн победил бы\n * CSS потребителя, и переопределить токен было бы нечем. Заливку дорожки задают\n * произвольным цветом (`activeBackgroundColor`), и безопасный цвет текста на\n * ней библиотека не вычислит — его называет тот же, кто задал фон.\n */\nexport const stateTextColors = {\n checked: 'text-[var(--gr-switch-state-text-fg,var(--gr-primary-fg))]',\n unchecked: 'text-[var(--gr-switch-state-text-fg,var(--gr-muted-fg))]',\n disabled: 'text-[var(--gr-switch-state-text-fg,var(--gr-disabled-fg))]',\n} as const\n\ntype GrSwitchStateTextClassOptions = {\n size: GrSwitchStateTextSize\n checked: boolean\n disabled: boolean\n autoWidth: boolean\n}\n\nexport function grSwitchStateTextClass(options: GrSwitchStateTextClassOptions): string {\n const state = options.disabled\n ? 'disabled'\n : options.checked ? 'checked' : 'unchecked'\n\n const side = options.checked ? 'checked' : 'unchecked'\n const paddings = options.autoWidth ? stateTextAutoPaddings : stateTextPaddings\n\n return [\n stateTextBase,\n stateTextLayouts[options.autoWidth ? 'auto' : 'fixed'],\n stateTextSizes[options.size],\n stateTextColors[state],\n paddings[options.size][side],\n ].filter(Boolean).join(' ')\n}\n","import { splitClassTokens } from '../shared/classTokens'\nimport {\n labelBase,\n labelDisabledClass,\n labelSizes,\n rootBase,\n rootLabelPositions,\n stateTextAutoPaddings,\n stateTextBase,\n stateTextColors,\n stateTextGhostClass,\n stateTextLayouts,\n stateTextPaddings,\n stateTextSizes,\n stateTextStackClass,\n thumbBase,\n thumbSizes,\n thumbContentSizes,\n thumbIconBase,\n thumbSpinnerBase,\n thumbPositions,\n trackAutoSizes,\n trackBase,\n trackSizes,\n} from './grSwitchStyles'\n\nexport const grSwitchClassTokens = {\n rootBase: splitClassTokens(rootBase),\n rootLabelPositions: Object.values(rootLabelPositions).flatMap(splitClassTokens),\n trackBase: splitClassTokens(trackBase),\n trackSizes: [\n ...Object.values(trackSizes).flatMap(splitClassTokens),\n ...Object.values(trackAutoSizes).flatMap(splitClassTokens),\n ],\n thumbBase: splitClassTokens(thumbBase),\n thumbSizes: Object.values(thumbSizes).flatMap(splitClassTokens),\n thumbContent: [\n ...splitClassTokens(thumbSpinnerBase),\n ...splitClassTokens(thumbIconBase),\n ...Object.values(thumbContentSizes).flatMap(splitClassTokens),\n ],\n thumbPositions: Object.values(thumbPositions).flatMap(splitClassTokens),\n labelBase: [...splitClassTokens(labelBase), ...splitClassTokens(labelDisabledClass)],\n labelSizes: Object.values(labelSizes).flatMap(splitClassTokens),\n stateText: [\n ...splitClassTokens(stateTextBase),\n ...splitClassTokens(stateTextStackClass),\n ...splitClassTokens(stateTextGhostClass),\n ...Object.values(stateTextLayouts).flatMap(splitClassTokens),\n ...Object.values(stateTextSizes).flatMap(splitClassTokens),\n ...Object.values(stateTextColors).flatMap(splitClassTokens),\n ...[stateTextPaddings, stateTextAutoPaddings].flatMap(map => (\n Object.values(map).flatMap(({ checked, unchecked }) => [\n ...splitClassTokens(checked),\n ...splitClassTokens(unchecked),\n ])\n )),\n ],\n} as const\n\nexport const grSwitchSafelist = [...new Set([\n ...grSwitchClassTokens.rootBase,\n ...grSwitchClassTokens.rootLabelPositions,\n ...grSwitchClassTokens.trackBase,\n ...grSwitchClassTokens.trackSizes,\n ...grSwitchClassTokens.thumbBase,\n ...grSwitchClassTokens.thumbSizes,\n ...grSwitchClassTokens.thumbContent,\n ...grSwitchClassTokens.thumbPositions,\n ...grSwitchClassTokens.labelBase,\n ...grSwitchClassTokens.labelSizes,\n ...grSwitchClassTokens.stateText,\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grSwitchSafelist } from './safelist'\n\nexport const grSwitchConfig = defineGranularComponent(import.meta.url, {\n name: 'GrSwitch',\n safelist: grSwitchSafelist,\n})\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"en-CsQUoBS2.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 \"stateSuccess\": \"Valid\",\n \"stateWarning\": \"Warning\"\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 \"expandRow\": \"Show details\",\n \"collapseRow\": \"Hide details\",\n \"detailLoading\": \"Loading details…\",\n \"detailError\": \"Could not load details\",\n \"detailRetry\": \"Retry\",\n \"detailExpanded\": \"Row details shown\",\n \"detailCollapsed\": \"Row details hidden\",\n \"detailReady\": \"Row details loaded\"\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 \"on\": \"ON\",\n \"off\": \"OFF\"\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 \"scrollSpy\": {\n \"label\": \"On this page\"\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":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"es-9nbkPvdA.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 \"stateSuccess\": \"Válido\",\n \"stateWarning\": \"Advertencia\"\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 \"expandRow\": \"Mostrar detalles\",\n \"collapseRow\": \"Ocultar detalles\",\n \"detailLoading\": \"Cargando detalles…\",\n \"detailError\": \"No se pudieron cargar los detalles\",\n \"detailRetry\": \"Reintentar\",\n \"detailExpanded\": \"Detalles de la fila mostrados\",\n \"detailCollapsed\": \"Detalles de la fila ocultos\",\n \"detailReady\": \"Detalles de la fila cargados\"\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 \"on\": \"SÍ\",\n \"off\": \"NO\"\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 \"scrollSpy\": {\n \"label\": \"En esta página\"\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":""}
|