@feugene/granularity 0.47.0 → 0.48.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 (58) hide show
  1. package/README.md +1 -1
  2. package/dist/chunks/{config-DeyT9dJl.js → config-Bs1HwUcx.js} +47 -4
  3. package/dist/chunks/{config-DeyT9dJl.js.map → config-Bs1HwUcx.js.map} +1 -1
  4. package/dist/chunks/{config-B3J0alyY.js → config-CzeZg2LO.js} +49 -4
  5. package/dist/chunks/config-CzeZg2LO.js.map +1 -0
  6. package/dist/chunks/{config-DCq4JySZ.js → config-D3HOuHDe.js} +1 -1
  7. package/dist/chunks/{config-DCq4JySZ.js.map → config-D3HOuHDe.js.map} +1 -1
  8. package/dist/chunks/{en-DjTnfTqM.js → en-Bxyn5lW7.js} +9 -1
  9. package/dist/chunks/en-Bxyn5lW7.js.map +1 -0
  10. package/dist/chunks/{es-DIFzSXSZ.js → es-Bj_vc18Z.js} +3 -3
  11. package/dist/chunks/{es-DIFzSXSZ.js.map → es-Bj_vc18Z.js.map} +1 -1
  12. package/dist/chunks/{es-Bc_t3FI8.js → es-Dtl-a7ui.js} +9 -1
  13. package/dist/chunks/es-Dtl-a7ui.js.map +1 -0
  14. package/dist/chunks/{generated-CQ4h6Ieq.js → generated-hELWB0gZ.js} +98 -0
  15. package/dist/chunks/{generated-CQ4h6Ieq.js.map → generated-hELWB0gZ.js.map} +1 -1
  16. package/dist/chunks/{grTableStyles-uuMPSOBR.js → grTableStyles-DkQPMfx9.js} +16 -3
  17. package/dist/chunks/grTableStyles-DkQPMfx9.js.map +1 -0
  18. package/dist/chunks/{granular-provider-AKukmYva.js → granular-provider-BOQp7N5o.js} +3 -3
  19. package/dist/chunks/{granular-provider-AKukmYva.js.map → granular-provider-BOQp7N5o.js.map} +1 -1
  20. package/dist/chunks/{ru-Bb-co59W.js → ru-hrB4I1u_.js} +9 -1
  21. package/dist/chunks/ru-hrB4I1u_.js.map +1 -0
  22. package/dist/components/GrAvatar/chunks/{GrAvatar-dWEXiCJG.js → GrAvatar-Do5-C409.js} +12 -1
  23. package/dist/components/GrAvatar/chunks/GrAvatar-Do5-C409.js.map +1 -0
  24. package/dist/components/GrAvatar/index.js +2 -2
  25. package/dist/components/GrAvatar/themes/light.css +35 -0
  26. package/dist/components/GrDataTable/chunks/{GrDataTable-Dp9Fp_P5.js → GrDataTable-DQxYYgQk.js} +438 -160
  27. package/dist/components/GrDataTable/chunks/GrDataTable-DQxYYgQk.js.map +1 -0
  28. package/dist/components/GrDataTable/index.js +2 -2
  29. package/dist/components/GrDataTable/themes/light.css +10 -0
  30. package/dist/components/GrTable/chunks/{GrTable-iwzHvlMC.js → GrTable-CKJ-HrsN.js} +1 -1
  31. package/dist/components/GrTable/chunks/{GrTable-iwzHvlMC.js.map → GrTable-CKJ-HrsN.js.map} +1 -1
  32. package/dist/components/GrTable/index.js +2 -2
  33. package/dist/granular-provider-node.js +1 -1
  34. package/dist/granular-provider.js +1 -1
  35. package/dist/i18n/all.js +1 -1
  36. package/dist/i18n/index.js +1 -1
  37. package/dist/index.js +6 -6
  38. package/dist/theme.js +1 -1
  39. package/dist/tokens.js +1 -1
  40. package/dist/types/components/GrAvatar/GrAvatar.vue.d.ts +11 -0
  41. package/dist/types/components/GrAvatar/defaults.d.ts +1 -0
  42. package/dist/types/components/GrAvatar/grAvatarStyles.d.ts +26 -1
  43. package/dist/types/components/GrDataTable/GrDataTable.vue.d.ts +59 -0
  44. package/dist/types/components/GrDataTable/composables/useDataTableExpansion.d.ts +46 -0
  45. package/dist/types/components/GrDataTable/grDataTableStyles.d.ts +23 -0
  46. package/dist/types/components/GrTable/grTableStyles.d.ts +16 -3
  47. package/dist/types/i18n/messages/en.d.ts +16 -0
  48. package/dist/types/i18n/messages/es.d.ts +16 -0
  49. package/dist/types/i18n/messages/ru.d.ts +16 -0
  50. package/dist/web-types.json +76 -1
  51. package/package.json +1 -1
  52. package/dist/chunks/config-B3J0alyY.js.map +0 -1
  53. package/dist/chunks/en-DjTnfTqM.js.map +0 -1
  54. package/dist/chunks/es-Bc_t3FI8.js.map +0 -1
  55. package/dist/chunks/grTableStyles-uuMPSOBR.js.map +0 -1
  56. package/dist/chunks/ru-Bb-co59W.js.map +0 -1
  57. package/dist/components/GrAvatar/chunks/GrAvatar-dWEXiCJG.js.map +0 -1
  58. package/dist/components/GrDataTable/chunks/GrDataTable-Dp9Fp_P5.js.map +0 -1
package/README.md CHANGED
@@ -91,7 +91,7 @@ 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 | 601.8 kB | 100 % |
94
+ | the whole package from the root | 606.8 kB | 100 % |
95
95
  | the lightest component — `GrButtonGroup` | 1.8 kB | < 1 % |
96
96
  | the median component — `GrChip` | 15.4 kB | 3 % |
97
97
  | the 5 heaviest together | 177.4 kB | 29 % |
@@ -117,6 +117,34 @@ var sortIconSizes = {
117
117
  md: "sm",
118
118
  lg: "md"
119
119
  };
120
+ /**
121
+ * Второй ярус строки: подробности под ней.
122
+ *
123
+ * Фон мягче строки набора, а не ярче: подробности обязаны читаться как
124
+ * вложенное в строку, а не как следующая строка. Акцентная полоса слева
125
+ * связывает деталь с её строкой, когда между ними уже прокрутили.
126
+ */
127
+ var detailRowClass = "bg-[var(--gr-datatable-detail-bg,color-mix(in_srgb,var(--gr-muted)_45%,transparent))]";
128
+ var detailCellClass = "border-t border-[var(--gr-brd)] border-l-2 border-l-[var(--gr-datatable-detail-accent,var(--gr-primary))]";
129
+ /** Содержимое липнет к левому краю: иначе при горизонтальной прокрутке его не видно. */
130
+ var detailContentClass = "sticky left-0";
131
+ var detailPaddings = {
132
+ xs: "px-2 py-2",
133
+ sm: "px-3 py-2.5",
134
+ md: "px-4 py-3",
135
+ lg: "px-5 py-4"
136
+ };
137
+ /** Колонка кнопки раскрытия — той же ширины, что колонка выбора: шапка не должна съезжать. */
138
+ var expandColumnWidths = selectColumnWidths;
139
+ var expandButtonClass = "inline-flex items-center justify-center rounded-[var(--gr-radius-sm)] text-[var(--gr-muted-fg)] transition-colors hover:bg-[var(--gr-muted)] hover:text-[var(--gr-fg)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]";
140
+ /**
141
+ * Поворот шеврона. Своего `motion-reduce:` здесь нет намеренно: движение пакет
142
+ * гасит одним глобальным блоком в `base.css`, а под `presetMini` этот вариант
143
+ * вдобавок не генерирует CSS вовсе (`docs/motion.md`).
144
+ */
145
+ var expandIconClass = "h-4 w-4 transition-transform duration-[var(--gr-duration-fast)]";
146
+ var expandIconOpenClass = "rotate-90";
147
+ var detailErrorClass = "flex flex-wrap items-center gap-2 text-[var(--gr-invalid-text)]";
120
148
  //#endregion
121
149
  //#region src/components/GrDataTable/safelist.ts
122
150
  var grDataTableSafelist = [.../* @__PURE__ */ new Set([
@@ -139,7 +167,16 @@ var grDataTableSafelist = [.../* @__PURE__ */ new Set([
139
167
  ...splitClassTokens(columnPinnedLeftEdgeClass),
140
168
  ...splitClassTokens(columnPinnedRightEdgeClass),
141
169
  ...splitClassTokens(rowSelectedClass),
142
- ...splitClassTokens(summaryRowClass)
170
+ ...splitClassTokens(summaryRowClass),
171
+ ...splitClassTokens(detailRowClass),
172
+ ...splitClassTokens(detailCellClass),
173
+ ...splitClassTokens(detailContentClass),
174
+ ...splitClassTokens(detailErrorClass),
175
+ ...Object.values(detailPaddings).flatMap(splitClassTokens),
176
+ ...splitClassTokens(expandButtonClass),
177
+ ...splitClassTokens(expandIconClass),
178
+ ...splitClassTokens(expandIconOpenClass),
179
+ ...splitClassTokens("h-5 w-5 h-6 w-6")
143
180
  ])];
144
181
  //#endregion
145
182
  //#region src/components/GrDataTable/config.ts
@@ -148,9 +185,15 @@ var grDataTableConfig = defineGranularComponent(import.meta.url, {
148
185
  dependencies: [
149
186
  "GrTable",
150
187
  "GrIcon",
151
- "GrCheckbox"
188
+ "GrCheckbox",
189
+ "GrButton",
190
+ "GrSkeleton"
152
191
  ],
153
- safelist: grDataTableSafelist
192
+ safelist: grDataTableSafelist,
193
+ tokenDefinitionsRef: { light: {
194
+ url: "./themes/light.css",
195
+ selector: ":root"
196
+ } }
154
197
  });
155
198
  //#endregion
156
- export { sortIconSizes as C, selectColumnWidths as S, summaryRowClass as T, headerTextSizes as _, columnDropAfterClass as a, rowSelectedClass as b, columnHandleClass as c, columnPinnedRightEdgeClass as d, columnResizerClass as f, headerGaps as g, columnResizerLineClass as h, columnDraggingClass as i, columnPinnedClass as l, columnResizerLineActiveClass as m, grDataTableSafelist as n, columnDropBeforeClass as o, columnResizerHoverClass as p, cellPaddings as r, columnHandleActiveClass as s, grDataTableConfig as t, columnPinnedLeftEdgeClass as u, placeholderPaddings as v, spinnerSizes as w, selectCheckboxSizes as x, rowHeightEstimates as y };
199
+ export { selectCheckboxSizes as A, expandIconClass as C, placeholderPaddings as D, headerTextSizes as E, sortIconSizes as M, spinnerSizes as N, rowHeightEstimates as O, summaryRowClass as P, expandColumnWidths as S, headerGaps as T, detailContentClass as _, columnDropAfterClass as a, detailRowClass as b, columnHandleClass as c, columnPinnedRightEdgeClass as d, columnResizerClass as f, detailCellClass as g, columnResizerLineClass as h, columnDraggingClass as i, selectColumnWidths as j, rowSelectedClass as k, columnPinnedClass as l, columnResizerLineActiveClass as m, grDataTableSafelist as n, columnDropBeforeClass as o, columnResizerHoverClass as p, cellPaddings as r, columnHandleActiveClass as s, grDataTableConfig as t, columnPinnedLeftEdgeClass as u, detailErrorClass as v, expandIconOpenClass as w, expandButtonClass as x, detailPaddings as y };
@@ -1 +1 @@
1
- {"version":3,"file":"config-DeyT9dJl.js","names":[],"sources":["../../src/components/GrDataTable/grDataTableStyles.ts","../../src/components/GrDataTable/safelist.ts","../../src/components/GrDataTable/config.ts"],"sourcesContent":["import type { GrCheckboxSize } from '../GrCheckbox/grCheckboxStyles'\nimport type { GrComponentSize } from '../shared/sizes'\n\nexport type GrDataTableSize = GrComponentSize\n\n/** Паддинг ячейки — и в шапке, и в теле: колонки обязаны совпадать по сетке. */\nexport const cellPaddings: Record<GrDataTableSize, string> = {\n xs: 'px-2 py-1.5',\n sm: 'px-3 py-2',\n md: 'px-4 py-3',\n lg: 'px-5 py-4',\n}\n\n/**\n * Оценка высоты строки по размеру: два вертикальных отступа ячейки плюс строка\n * текста и рамка. Виртуализация уточняет её замером — точное число здесь знать\n * неоткуда, содержимое ячейки задаёт потребитель.\n */\nexport const rowHeightEstimates: Record<GrDataTableSize, number> = {\n xs: 33,\n sm: 41,\n md: 49,\n lg: 57,\n}\n\n/** Заглушки loading/empty: по горизонтали как ячейка, по вертикали просторнее. */\nexport const placeholderPaddings: Record<GrDataTableSize, string> = {\n xs: 'px-2 py-3',\n sm: 'px-3 py-4',\n md: 'px-4 py-6',\n lg: 'px-5 py-8',\n}\n\n/**\n * Ручка перестановки колонки. Появляется по наведению на заголовок и по\n * фокусу: постоянная сетка ручек в шапке из десяти колонок читается как рябь,\n * а не как управление.\n */\nexport const columnHandleClass = 'inline-flex shrink-0 cursor-grab items-center text-[var(--gr-datatable-drag-handle,var(--gr-muted-fg))] opacity-0 [touch-action:none] transition-opacity duration-[var(--gr-duration-fast)] focus:outline-none focus-visible:opacity-100 focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)] rounded-[var(--gr-radius-sm)] group-hover:opacity-100'\n\nexport const columnHandleActiveClass = 'opacity-100'\n\n/** Переносимая колонка гасится, чтобы было видно, что она «поднята». */\nexport const columnDraggingClass = 'bg-[var(--gr-muted)]'\n\n/**\n * Место вставки — полоса по краю ячейки заголовка. Псевдоэлемент, а не свой\n * узел: `<th>` не терпит посторонних детей в раскладке таблицы.\n */\nexport const columnDropBeforeClass = 'before:absolute before:inset-y-0 before:left-0 before:w-[var(--gr-datatable-drag-indicator-width,2px)] before:bg-[var(--gr-datatable-drag-indicator,var(--gr-primary))] before:content-empty'\n\nexport const columnDropAfterClass = 'after:absolute after:inset-y-0 after:right-0 after:w-[var(--gr-datatable-drag-indicator-width,2px)] after:bg-[var(--gr-datatable-drag-indicator,var(--gr-primary))] after:content-empty'\n\n/**\n * Подсветка выбранной строки. Живёт здесь, потому что закреплённой ячейке её\n * приходится повторять: у ячейки свой непрозрачный фон, и подсветка строки\n * сквозь него не видна.\n */\nexport const rowSelectedClass = 'bg-[color-mix(in_srgb,var(--gr-primary)_8%,transparent)]'\n\n/**\n * Итоговая строка. Отбивка та же, что между строками тела, плюс вес: итог —\n * вывод из набора, а не ещё одна его запись, и читатель должен видеть это до\n * того, как разберёт цифры. Тон оставлен потребителю: «возвраты» и «прибыль» —\n * разные сообщения, и выбирать за него компонент не должен.\n */\nexport const summaryRowClass = 'border-t border-[var(--gr-brd)] font-600'\n\n/**\n * Ручка ширины — полоса у правого края заголовка. Видима она узкой линией, а\n * ловится широкой зоной: попасть в двухпиксельную границу мышью тяжело.\n */\nexport const columnResizerClass = 'absolute inset-y-0 right-0 z-[1] flex w-3 translate-x-1/2 cursor-col-resize items-stretch justify-center [touch-action:none] focus:outline-none'\n\nexport const columnResizerLineClass = 'w-[var(--gr-datatable-resizer-width,2px)] bg-transparent transition-colors duration-[var(--gr-duration-fast)]'\n\n/** Полоса подсвечивается только когда её ведут или на неё встал фокус. */\nexport const columnResizerLineActiveClass = 'bg-[var(--gr-datatable-resizer,var(--gr-primary))]'\n\nexport const columnResizerHoverClass = 'hover:bg-[var(--gr-datatable-resizer,var(--gr-primary))] focus-visible:bg-[var(--gr-datatable-resizer,var(--gr-primary))]'\n\n/**\n * Закреплённая колонка липнет к краю прокрутки. Фон обязателен: без него\n * уезжающие под неё ячейки просвечивают насквозь.\n */\nexport const columnPinnedClass = 'sticky z-[2] bg-[var(--gr-card)]'\n\n/** Граница группы закреплённых колонок — тень, а не рамка: рамка сдвигает сетку. */\nexport const columnPinnedLeftEdgeClass = 'shadow-[var(--gr-datatable-pinned-shadow,4px_0_6px_-4px_rgba(0,0,0,0.25))]'\n\nexport const columnPinnedRightEdgeClass = 'shadow-[var(--gr-datatable-pinned-shadow-end,-4px_0_6px_-4px_rgba(0,0,0,0.25))]'\n\n/** Подпись колонки набирается мельче тела таблицы — она не данные, а навигация. */\nexport const headerTextSizes: Record<GrDataTableSize, string> = {\n xs: 'text-[length:var(--gr-control-text-3xs)] leading-[var(--gr-control-leading-3xs)]',\n sm: 'text-[length:var(--gr-control-text-2xs)] leading-[var(--gr-control-leading-2xs)]',\n md: 'text-[length:var(--gr-control-text-xs)] leading-[var(--gr-leading-xs)]',\n lg: 'text-[length:var(--gr-control-text-md)] leading-[var(--gr-leading-sm)]',\n}\n\n/**\n * Размер `GrCheckbox` в колонке выбора. Здесь не классы, а ступень шкалы:\n * коробку рисует сам чекбокс — он же держит `indeterminate`, disabled без\n * `opacity` и фокус-кольцо.\n */\nexport const selectCheckboxSizes: Record<GrDataTableSize, GrCheckboxSize> = {\n xs: 'xs',\n sm: 'sm',\n md: 'md',\n lg: 'lg',\n}\n\n/** Ширина колонки выбора: коробка чекбокса плюс горизонтальный паддинг ячейки. */\nexport const selectColumnWidths: Record<GrDataTableSize, string> = {\n xs: 'w-7',\n sm: 'w-8',\n md: 'w-10',\n lg: 'w-12',\n}\n\n/** Зазор между подписью колонки и стрелкой сортировки. */\nexport const headerGaps: Record<GrDataTableSize, string> = {\n xs: 'gap-1',\n sm: 'gap-1.5',\n md: 'gap-2',\n lg: 'gap-2',\n}\n\n/** Спиннер в строке загрузки — тем же кеглем, что иконка сортировки рядом. */\nexport const spinnerSizes: Record<GrDataTableSize, string> = {\n xs: 'h-3 w-3',\n sm: 'h-3.5 w-3.5',\n md: 'h-4 w-4',\n lg: 'h-5 w-5',\n}\n\n/** Стрелка сортировки берёт размер из шкалы `GrIcon` (`xs…lg` → `14…20px`). */\nexport const sortIconSizes: Record<GrDataTableSize, GrComponentSize> = {\n xs: 'xs',\n sm: 'xs',\n md: 'sm',\n lg: 'md',\n}\n","import { splitClassTokens } from '../shared/classTokens'\nimport {\n cellPaddings,\n columnDraggingClass,\n columnDropAfterClass,\n columnDropBeforeClass,\n columnHandleActiveClass,\n columnHandleClass,\n columnPinnedClass,\n columnPinnedLeftEdgeClass,\n columnPinnedRightEdgeClass,\n columnResizerClass,\n columnResizerHoverClass,\n columnResizerLineActiveClass,\n columnResizerLineClass,\n headerGaps,\n headerTextSizes,\n placeholderPaddings,\n rowSelectedClass,\n selectColumnWidths,\n spinnerSizes,\n summaryRowClass,\n} from './grDataTableStyles'\n\nexport const grDataTableSafelist = [...new Set([\n ...Object.values(cellPaddings).flatMap(splitClassTokens),\n ...Object.values(placeholderPaddings).flatMap(splitClassTokens),\n ...Object.values(headerTextSizes).flatMap(splitClassTokens),\n ...Object.values(selectColumnWidths).flatMap(splitClassTokens),\n ...Object.values(headerGaps).flatMap(splitClassTokens),\n ...Object.values(spinnerSizes).flatMap(splitClassTokens),\n ...splitClassTokens(columnHandleClass),\n ...splitClassTokens(columnHandleActiveClass),\n ...splitClassTokens(columnDraggingClass),\n ...splitClassTokens(columnDropBeforeClass),\n ...splitClassTokens(columnDropAfterClass),\n ...splitClassTokens(columnResizerClass),\n ...splitClassTokens(columnResizerLineClass),\n ...splitClassTokens(columnResizerLineActiveClass),\n ...splitClassTokens(columnResizerHoverClass),\n ...splitClassTokens(columnPinnedClass),\n ...splitClassTokens(columnPinnedLeftEdgeClass),\n ...splitClassTokens(columnPinnedRightEdgeClass),\n ...splitClassTokens(rowSelectedClass),\n ...splitClassTokens(summaryRowClass),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grDataTableSafelist } from './safelist'\n\nexport const grDataTableConfig = defineGranularComponent(import.meta.url, {\n name: 'GrDataTable',\n dependencies: ['GrTable', 'GrIcon', 'GrCheckbox'],\n safelist: grDataTableSafelist,\n})\n"],"mappings":";;;;AAMA,IAAa,eAAgD;CAC3D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;;AAOA,IAAa,qBAAsD;CACjE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,sBAAuD;CAClE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;;AAOA,IAAa,oBAAoB;AAEjC,IAAa,0BAA0B;;AAGvC,IAAa,sBAAsB;;;;;AAMnC,IAAa,wBAAwB;AAErC,IAAa,uBAAuB;;;;;;AAOpC,IAAa,mBAAmB;;;;;;;AAQhC,IAAa,kBAAkB;;;;;AAM/B,IAAa,qBAAqB;AAElC,IAAa,yBAAyB;;AAGtC,IAAa,+BAA+B;AAE5C,IAAa,0BAA0B;;;;;AAMvC,IAAa,oBAAoB;;AAGjC,IAAa,4BAA4B;AAEzC,IAAa,6BAA6B;;AAG1C,IAAa,kBAAmD;CAC9D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;;AAOA,IAAa,sBAA+D;CAC1E,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,qBAAsD;CACjE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,aAA8C;CACzD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,eAAgD;CAC3D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,gBAA0D;CACrE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;ACtHA,IAAa,sBAAsB,CAAC,mBAAG,IAAI,IAAI;CAC7C,GAAG,OAAO,OAAO,YAAY,CAAC,CAAC,QAAQ,gBAAgB;CACvD,GAAG,OAAO,OAAO,mBAAmB,CAAC,CAAC,QAAQ,gBAAgB;CAC9D,GAAG,OAAO,OAAO,eAAe,CAAC,CAAC,QAAQ,gBAAgB;CAC1D,GAAG,OAAO,OAAO,kBAAkB,CAAC,CAAC,QAAQ,gBAAgB;CAC7D,GAAG,OAAO,OAAO,UAAU,CAAC,CAAC,QAAQ,gBAAgB;CACrD,GAAG,OAAO,OAAO,YAAY,CAAC,CAAC,QAAQ,gBAAgB;CACvD,GAAG,iBAAiB,iBAAiB;CACrC,GAAG,iBAAiB,uBAAuB;CAC3C,GAAG,iBAAiB,mBAAmB;CACvC,GAAG,iBAAiB,qBAAqB;CACzC,GAAG,iBAAiB,oBAAoB;CACxC,GAAG,iBAAiB,kBAAkB;CACtC,GAAG,iBAAiB,sBAAsB;CAC1C,GAAG,iBAAiB,4BAA4B;CAChD,GAAG,iBAAiB,uBAAuB;CAC3C,GAAG,iBAAiB,iBAAiB;CACrC,GAAG,iBAAiB,yBAAyB;CAC7C,GAAG,iBAAiB,0BAA0B;CAC9C,GAAG,iBAAiB,gBAAgB;CACpC,GAAG,iBAAiB,eAAe;AACrC,CAAC,CAAC;;;ACzCF,IAAa,oBAAoB,wBAAwB,YAAY,KAAK;CACxE,MAAM;CACN,cAAc;EAAC;EAAW;EAAU;CAAY;CAChD,UAAU;AACZ,CAAC"}
1
+ {"version":3,"file":"config-Bs1HwUcx.js","names":[],"sources":["../../src/components/GrDataTable/grDataTableStyles.ts","../../src/components/GrDataTable/safelist.ts","../../src/components/GrDataTable/config.ts"],"sourcesContent":["import type { GrCheckboxSize } from '../GrCheckbox/grCheckboxStyles'\nimport type { GrComponentSize } from '../shared/sizes'\n\nexport type GrDataTableSize = GrComponentSize\n\n/** Паддинг ячейки — и в шапке, и в теле: колонки обязаны совпадать по сетке. */\nexport const cellPaddings: Record<GrDataTableSize, string> = {\n xs: 'px-2 py-1.5',\n sm: 'px-3 py-2',\n md: 'px-4 py-3',\n lg: 'px-5 py-4',\n}\n\n/**\n * Оценка высоты строки по размеру: два вертикальных отступа ячейки плюс строка\n * текста и рамка. Виртуализация уточняет её замером — точное число здесь знать\n * неоткуда, содержимое ячейки задаёт потребитель.\n */\nexport const rowHeightEstimates: Record<GrDataTableSize, number> = {\n xs: 33,\n sm: 41,\n md: 49,\n lg: 57,\n}\n\n/** Заглушки loading/empty: по горизонтали как ячейка, по вертикали просторнее. */\nexport const placeholderPaddings: Record<GrDataTableSize, string> = {\n xs: 'px-2 py-3',\n sm: 'px-3 py-4',\n md: 'px-4 py-6',\n lg: 'px-5 py-8',\n}\n\n/**\n * Ручка перестановки колонки. Появляется по наведению на заголовок и по\n * фокусу: постоянная сетка ручек в шапке из десяти колонок читается как рябь,\n * а не как управление.\n */\nexport const columnHandleClass = 'inline-flex shrink-0 cursor-grab items-center text-[var(--gr-datatable-drag-handle,var(--gr-muted-fg))] opacity-0 [touch-action:none] transition-opacity duration-[var(--gr-duration-fast)] focus:outline-none focus-visible:opacity-100 focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)] rounded-[var(--gr-radius-sm)] group-hover:opacity-100'\n\nexport const columnHandleActiveClass = 'opacity-100'\n\n/** Переносимая колонка гасится, чтобы было видно, что она «поднята». */\nexport const columnDraggingClass = 'bg-[var(--gr-muted)]'\n\n/**\n * Место вставки — полоса по краю ячейки заголовка. Псевдоэлемент, а не свой\n * узел: `<th>` не терпит посторонних детей в раскладке таблицы.\n */\nexport const columnDropBeforeClass = 'before:absolute before:inset-y-0 before:left-0 before:w-[var(--gr-datatable-drag-indicator-width,2px)] before:bg-[var(--gr-datatable-drag-indicator,var(--gr-primary))] before:content-empty'\n\nexport const columnDropAfterClass = 'after:absolute after:inset-y-0 after:right-0 after:w-[var(--gr-datatable-drag-indicator-width,2px)] after:bg-[var(--gr-datatable-drag-indicator,var(--gr-primary))] after:content-empty'\n\n/**\n * Подсветка выбранной строки. Живёт здесь, потому что закреплённой ячейке её\n * приходится повторять: у ячейки свой непрозрачный фон, и подсветка строки\n * сквозь него не видна.\n */\nexport const rowSelectedClass = 'bg-[color-mix(in_srgb,var(--gr-primary)_8%,transparent)]'\n\n/**\n * Итоговая строка. Отбивка та же, что между строками тела, плюс вес: итог —\n * вывод из набора, а не ещё одна его запись, и читатель должен видеть это до\n * того, как разберёт цифры. Тон оставлен потребителю: «возвраты» и «прибыль» —\n * разные сообщения, и выбирать за него компонент не должен.\n */\nexport const summaryRowClass = 'border-t border-[var(--gr-brd)] font-600'\n\n/**\n * Ручка ширины — полоса у правого края заголовка. Видима она узкой линией, а\n * ловится широкой зоной: попасть в двухпиксельную границу мышью тяжело.\n */\nexport const columnResizerClass = 'absolute inset-y-0 right-0 z-[1] flex w-3 translate-x-1/2 cursor-col-resize items-stretch justify-center [touch-action:none] focus:outline-none'\n\nexport const columnResizerLineClass = 'w-[var(--gr-datatable-resizer-width,2px)] bg-transparent transition-colors duration-[var(--gr-duration-fast)]'\n\n/** Полоса подсвечивается только когда её ведут или на неё встал фокус. */\nexport const columnResizerLineActiveClass = 'bg-[var(--gr-datatable-resizer,var(--gr-primary))]'\n\nexport const columnResizerHoverClass = 'hover:bg-[var(--gr-datatable-resizer,var(--gr-primary))] focus-visible:bg-[var(--gr-datatable-resizer,var(--gr-primary))]'\n\n/**\n * Закреплённая колонка липнет к краю прокрутки. Фон обязателен: без него\n * уезжающие под неё ячейки просвечивают насквозь.\n */\nexport const columnPinnedClass = 'sticky z-[2] bg-[var(--gr-card)]'\n\n/** Граница группы закреплённых колонок — тень, а не рамка: рамка сдвигает сетку. */\nexport const columnPinnedLeftEdgeClass = 'shadow-[var(--gr-datatable-pinned-shadow,4px_0_6px_-4px_rgba(0,0,0,0.25))]'\n\nexport const columnPinnedRightEdgeClass = 'shadow-[var(--gr-datatable-pinned-shadow-end,-4px_0_6px_-4px_rgba(0,0,0,0.25))]'\n\n/** Подпись колонки набирается мельче тела таблицы — она не данные, а навигация. */\nexport const headerTextSizes: Record<GrDataTableSize, string> = {\n xs: 'text-[length:var(--gr-control-text-3xs)] leading-[var(--gr-control-leading-3xs)]',\n sm: 'text-[length:var(--gr-control-text-2xs)] leading-[var(--gr-control-leading-2xs)]',\n md: 'text-[length:var(--gr-control-text-xs)] leading-[var(--gr-leading-xs)]',\n lg: 'text-[length:var(--gr-control-text-md)] leading-[var(--gr-leading-sm)]',\n}\n\n/**\n * Размер `GrCheckbox` в колонке выбора. Здесь не классы, а ступень шкалы:\n * коробку рисует сам чекбокс — он же держит `indeterminate`, disabled без\n * `opacity` и фокус-кольцо.\n */\nexport const selectCheckboxSizes: Record<GrDataTableSize, GrCheckboxSize> = {\n xs: 'xs',\n sm: 'sm',\n md: 'md',\n lg: 'lg',\n}\n\n/** Ширина колонки выбора: коробка чекбокса плюс горизонтальный паддинг ячейки. */\nexport const selectColumnWidths: Record<GrDataTableSize, string> = {\n xs: 'w-7',\n sm: 'w-8',\n md: 'w-10',\n lg: 'w-12',\n}\n\n/** Зазор между подписью колонки и стрелкой сортировки. */\nexport const headerGaps: Record<GrDataTableSize, string> = {\n xs: 'gap-1',\n sm: 'gap-1.5',\n md: 'gap-2',\n lg: 'gap-2',\n}\n\n/** Спиннер в строке загрузки — тем же кеглем, что иконка сортировки рядом. */\nexport const spinnerSizes: Record<GrDataTableSize, string> = {\n xs: 'h-3 w-3',\n sm: 'h-3.5 w-3.5',\n md: 'h-4 w-4',\n lg: 'h-5 w-5',\n}\n\n/** Стрелка сортировки берёт размер из шкалы `GrIcon` (`xs…lg` → `14…20px`). */\nexport const sortIconSizes: Record<GrDataTableSize, GrComponentSize> = {\n xs: 'xs',\n sm: 'xs',\n md: 'sm',\n lg: 'md',\n}\n\n/**\n * Второй ярус строки: подробности под ней.\n *\n * Фон мягче строки набора, а не ярче: подробности обязаны читаться как\n * вложенное в строку, а не как следующая строка. Акцентная полоса слева\n * связывает деталь с её строкой, когда между ними уже прокрутили.\n */\nexport const detailRowClass = 'bg-[var(--gr-datatable-detail-bg,color-mix(in_srgb,var(--gr-muted)_45%,transparent))]'\n\nexport const detailCellClass = 'border-t border-[var(--gr-brd)] border-l-2 border-l-[var(--gr-datatable-detail-accent,var(--gr-primary))]'\n\n/** Содержимое липнет к левому краю: иначе при горизонтальной прокрутке его не видно. */\nexport const detailContentClass = 'sticky left-0'\n\nexport const detailPaddings: Record<GrDataTableSize, string> = {\n xs: 'px-2 py-2',\n sm: 'px-3 py-2.5',\n md: 'px-4 py-3',\n lg: 'px-5 py-4',\n}\n\n/** Колонка кнопки раскрытия — той же ширины, что колонка выбора: шапка не должна съезжать. */\nexport const expandColumnWidths = selectColumnWidths\n\nexport const expandButtonClass = 'inline-flex items-center justify-center rounded-[var(--gr-radius-sm)] text-[var(--gr-muted-fg)] transition-colors hover:bg-[var(--gr-muted)] hover:text-[var(--gr-fg)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]'\n\n/**\n * Поворот шеврона. Своего `motion-reduce:` здесь нет намеренно: движение пакет\n * гасит одним глобальным блоком в `base.css`, а под `presetMini` этот вариант\n * вдобавок не генерирует CSS вовсе (`docs/motion.md`).\n */\nexport const expandIconClass = 'h-4 w-4 transition-transform duration-[var(--gr-duration-fast)]'\n\nexport const expandIconOpenClass = 'rotate-90'\n\nexport const detailErrorClass = 'flex flex-wrap items-center gap-2 text-[var(--gr-invalid-text)]'\n","import { splitClassTokens } from '../shared/classTokens'\nimport {\n cellPaddings,\n columnDraggingClass,\n detailCellClass,\n detailContentClass,\n detailErrorClass,\n detailPaddings,\n detailRowClass,\n expandButtonClass,\n expandIconClass,\n expandIconOpenClass,\n columnDropAfterClass,\n columnDropBeforeClass,\n columnHandleActiveClass,\n columnHandleClass,\n columnPinnedClass,\n columnPinnedLeftEdgeClass,\n columnPinnedRightEdgeClass,\n columnResizerClass,\n columnResizerHoverClass,\n columnResizerLineActiveClass,\n columnResizerLineClass,\n headerGaps,\n headerTextSizes,\n placeholderPaddings,\n rowSelectedClass,\n selectColumnWidths,\n spinnerSizes,\n summaryRowClass,\n} from './grDataTableStyles'\n\nexport const grDataTableSafelist = [...new Set([\n ...Object.values(cellPaddings).flatMap(splitClassTokens),\n ...Object.values(placeholderPaddings).flatMap(splitClassTokens),\n ...Object.values(headerTextSizes).flatMap(splitClassTokens),\n ...Object.values(selectColumnWidths).flatMap(splitClassTokens),\n ...Object.values(headerGaps).flatMap(splitClassTokens),\n ...Object.values(spinnerSizes).flatMap(splitClassTokens),\n ...splitClassTokens(columnHandleClass),\n ...splitClassTokens(columnHandleActiveClass),\n ...splitClassTokens(columnDraggingClass),\n ...splitClassTokens(columnDropBeforeClass),\n ...splitClassTokens(columnDropAfterClass),\n ...splitClassTokens(columnResizerClass),\n ...splitClassTokens(columnResizerLineClass),\n ...splitClassTokens(columnResizerLineActiveClass),\n ...splitClassTokens(columnResizerHoverClass),\n ...splitClassTokens(columnPinnedClass),\n ...splitClassTokens(columnPinnedLeftEdgeClass),\n ...splitClassTokens(columnPinnedRightEdgeClass),\n ...splitClassTokens(rowSelectedClass),\n ...splitClassTokens(summaryRowClass),\n // Второй ярус строки: классы приходят из `.ts`-хелпера, а такие литералы\n // пресет не видит.\n ...splitClassTokens(detailRowClass),\n ...splitClassTokens(detailCellClass),\n ...splitClassTokens(detailContentClass),\n ...splitClassTokens(detailErrorClass),\n ...Object.values(detailPaddings).flatMap(splitClassTokens),\n ...splitClassTokens(expandButtonClass),\n ...splitClassTokens(expandIconClass),\n ...splitClassTokens(expandIconOpenClass),\n ...splitClassTokens('h-5 w-5 h-6 w-6'),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grDataTableSafelist } from './safelist'\n\nexport const grDataTableConfig = defineGranularComponent(import.meta.url, {\n name: 'GrDataTable',\n dependencies: ['GrTable', 'GrIcon', 'GrCheckbox', 'GrButton', 'GrSkeleton'],\n safelist: grDataTableSafelist,\n // Только светлая: обе роли ссылаются на токены, которые сами меняются с темой.\n tokenDefinitionsRef: {\n light: { url: './themes/light.css', selector: ':root' },\n },\n})\n"],"mappings":";;;;AAMA,IAAa,eAAgD;CAC3D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;;AAOA,IAAa,qBAAsD;CACjE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,sBAAuD;CAClE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;;AAOA,IAAa,oBAAoB;AAEjC,IAAa,0BAA0B;;AAGvC,IAAa,sBAAsB;;;;;AAMnC,IAAa,wBAAwB;AAErC,IAAa,uBAAuB;;;;;;AAOpC,IAAa,mBAAmB;;;;;;;AAQhC,IAAa,kBAAkB;;;;;AAM/B,IAAa,qBAAqB;AAElC,IAAa,yBAAyB;;AAGtC,IAAa,+BAA+B;AAE5C,IAAa,0BAA0B;;;;;AAMvC,IAAa,oBAAoB;;AAGjC,IAAa,4BAA4B;AAEzC,IAAa,6BAA6B;;AAG1C,IAAa,kBAAmD;CAC9D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;;AAOA,IAAa,sBAA+D;CAC1E,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,qBAAsD;CACjE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,aAA8C;CACzD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,eAAgD;CAC3D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,gBAA0D;CACrE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;;;;AASA,IAAa,iBAAiB;AAE9B,IAAa,kBAAkB;;AAG/B,IAAa,qBAAqB;AAElC,IAAa,iBAAkD;CAC7D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,qBAAqB;AAElC,IAAa,oBAAoB;;;;;;AAOjC,IAAa,kBAAkB;AAE/B,IAAa,sBAAsB;AAEnC,IAAa,mBAAmB;;;ACnJhC,IAAa,sBAAsB,CAAC,mBAAG,IAAI,IAAI;CAC7C,GAAG,OAAO,OAAO,YAAY,CAAC,CAAC,QAAQ,gBAAgB;CACvD,GAAG,OAAO,OAAO,mBAAmB,CAAC,CAAC,QAAQ,gBAAgB;CAC9D,GAAG,OAAO,OAAO,eAAe,CAAC,CAAC,QAAQ,gBAAgB;CAC1D,GAAG,OAAO,OAAO,kBAAkB,CAAC,CAAC,QAAQ,gBAAgB;CAC7D,GAAG,OAAO,OAAO,UAAU,CAAC,CAAC,QAAQ,gBAAgB;CACrD,GAAG,OAAO,OAAO,YAAY,CAAC,CAAC,QAAQ,gBAAgB;CACvD,GAAG,iBAAiB,iBAAiB;CACrC,GAAG,iBAAiB,uBAAuB;CAC3C,GAAG,iBAAiB,mBAAmB;CACvC,GAAG,iBAAiB,qBAAqB;CACzC,GAAG,iBAAiB,oBAAoB;CACxC,GAAG,iBAAiB,kBAAkB;CACtC,GAAG,iBAAiB,sBAAsB;CAC1C,GAAG,iBAAiB,4BAA4B;CAChD,GAAG,iBAAiB,uBAAuB;CAC3C,GAAG,iBAAiB,iBAAiB;CACrC,GAAG,iBAAiB,yBAAyB;CAC7C,GAAG,iBAAiB,0BAA0B;CAC9C,GAAG,iBAAiB,gBAAgB;CACpC,GAAG,iBAAiB,eAAe;CAGnC,GAAG,iBAAiB,cAAc;CAClC,GAAG,iBAAiB,eAAe;CACnC,GAAG,iBAAiB,kBAAkB;CACtC,GAAG,iBAAiB,gBAAgB;CACpC,GAAG,OAAO,OAAO,cAAc,CAAC,CAAC,QAAQ,gBAAgB;CACzD,GAAG,iBAAiB,iBAAiB;CACrC,GAAG,iBAAiB,eAAe;CACnC,GAAG,iBAAiB,mBAAmB;CACvC,GAAG,iBAAiB,iBAAiB;AACvC,CAAC,CAAC;;;AC5DF,IAAa,oBAAoB,wBAAwB,YAAY,KAAK;CACxE,MAAM;CACN,cAAc;EAAC;EAAW;EAAU;EAAc;EAAY;CAAY;CAC1E,UAAU;CAEV,qBAAqB,EACnB,OAAO;EAAE,KAAK;EAAsB,UAAU;CAAQ,EACxD;AACF,CAAC"}
@@ -5,7 +5,43 @@ var shapes = {
5
5
  circle: "rounded-[var(--gr-radius-full)]",
6
6
  square: "rounded-[var(--gr-avatar-square-radius,10px)]"
7
7
  };
8
- var rootBaseClass = "relative inline-flex shrink-0 items-center justify-center overflow-hidden border border-[var(--gr-brd)] bg-[var(--gr-muted)] text-[var(--gr-muted-fg)] font-700";
8
+ var rootBaseClass = "relative inline-flex shrink-0 items-center justify-center overflow-hidden border border-[var(--gr-brd)] font-700";
9
+ /** Цвет по умолчанию. Отделён от базы, иначе он спорил бы с автоцветом порядком правил. */
10
+ var rootNeutralClass = "bg-[var(--gr-muted)] text-[var(--gr-muted-fg)]";
11
+ /**
12
+ * Палитра автоцвета: подложка и инициалы одним классом на слот.
13
+ *
14
+ * Цвета сюда не попадают — только имена слотов. Что стоит за слотом, решает
15
+ * тема (`--gr-avatar-N-bg`/`-fg` ссылаются на пары `-light`/`-text` тонов), и
16
+ * приложение вправе переопределить любой, не трогая компонент.
17
+ *
18
+ * Классы статические: UnoCSS сканирует литералы, и собранный в рантайме
19
+ * `bg-[var(--gr-avatar-${n}-bg)]` в CSS не превратился бы.
20
+ */
21
+ var avatarToneClasses = [
22
+ "bg-[var(--gr-avatar-1-bg)] text-[var(--gr-avatar-1-fg)]",
23
+ "bg-[var(--gr-avatar-2-bg)] text-[var(--gr-avatar-2-fg)]",
24
+ "bg-[var(--gr-avatar-3-bg)] text-[var(--gr-avatar-3-fg)]",
25
+ "bg-[var(--gr-avatar-4-bg)] text-[var(--gr-avatar-4-fg)]",
26
+ "bg-[var(--gr-avatar-5-bg)] text-[var(--gr-avatar-5-fg)]",
27
+ "bg-[var(--gr-avatar-6-bg)] text-[var(--gr-avatar-6-fg)]"
28
+ ];
29
+ /**
30
+ * Слот палитры по имени: тот же человек — тот же цвет.
31
+ *
32
+ * Стабильность здесь и есть смысл функции: цвет не должен меняться ни между
33
+ * сессиями, ни между сервером и клиентом, иначе аватар мигает на гидрации, а
34
+ * узнаваемость — то, ради чего автоцвет и заводят, — теряется. Отсюда обычный
35
+ * детерминированный перебор кодов, а не хеш из окружения.
36
+ *
37
+ * `>>> 0` обязателен: без него сумма уходит в отрицательные на длинных именах,
38
+ * и остаток от деления даёт отрицательный индекс.
39
+ */
40
+ function avatarToneIndex(name) {
41
+ let hash = 0;
42
+ for (const char of name.trim()) hash = hash * 31 + (char.codePointAt(0) ?? 0) >>> 0;
43
+ return hash % avatarToneClasses.length;
44
+ }
9
45
  /** Индикатор статуса: кольцо цветом фона отделяет точку от самого аватара. */
10
46
  var statusDotClass = "absolute bottom-0 right-0 block h-1/4 w-1/4 min-h-2 min-w-2 rounded-[var(--gr-radius-full)] ring-2 ring-[var(--gr-bg)]";
11
47
  var statusToneClass = {
@@ -58,7 +94,12 @@ function initialsFrom(name) {
58
94
  //#region src/components/GrAvatar/safelist.ts
59
95
  var grAvatarClassTokens = {
60
96
  shapes: Object.values(shapes).flatMap(splitClassTokens),
61
- root: [...splitClassTokens(rootBaseClass), ...splitClassTokens(rootStatusClass)],
97
+ root: [
98
+ ...splitClassTokens(rootBaseClass),
99
+ ...splitClassTokens(rootNeutralClass),
100
+ ...splitClassTokens(rootStatusClass),
101
+ ...avatarToneClasses.flatMap(splitClassTokens)
102
+ ],
62
103
  media: [...splitClassTokens(mediaClass), ...splitClassTokens(mediaClipClass)],
63
104
  status: [...splitClassTokens(statusDotClass), ...Object.values(statusToneClass).flatMap(splitClassTokens)],
64
105
  group: [
@@ -79,7 +120,11 @@ var grAvatarSafelist = [.../* @__PURE__ */ new Set([
79
120
  var grAvatarConfig = defineGranularComponent(import.meta.url, {
80
121
  name: "GrAvatar",
81
122
  dependencies: ["GrSkeleton"],
82
- safelist: grAvatarSafelist
123
+ safelist: grAvatarSafelist,
124
+ tokenDefinitionsRef: { light: {
125
+ url: "./themes/light.css",
126
+ selector: ":root"
127
+ } }
83
128
  });
84
129
  //#endregion
85
- export { groupBaseClass as a, initialsFrom as c, rootBaseClass as d, rootStatusClass as f, grAvatarClass as i, mediaClass as l, statusToneClass as m, grAvatarSafelist as n, groupItemClass as o, statusDotClass as p, avatarFontSizePx as r, groupOverflowClass as s, grAvatarConfig as t, mediaClipClass as u };
130
+ export { statusToneClass as _, avatarToneIndex as a, groupItemClass as c, mediaClass as d, mediaClipClass as f, statusDotClass as g, rootStatusClass as h, avatarToneClasses as i, groupOverflowClass as l, rootNeutralClass as m, grAvatarSafelist as n, grAvatarClass as o, rootBaseClass as p, avatarFontSizePx as r, groupBaseClass as s, grAvatarConfig as t, initialsFrom as u };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-CzeZg2LO.js","names":[],"sources":["../../src/components/GrAvatar/grAvatarStyles.ts","../../src/components/GrAvatar/safelist.ts","../../src/components/GrAvatar/config.ts"],"sourcesContent":["export type GrAvatarShape = 'circle' | 'square'\n\n/** Статус участника. Точка декоративна — смысл несёт скрытая подпись. */\nexport const GR_AVATAR_STATUSES = ['online', 'offline', 'busy', 'away'] as const\nexport type GrAvatarStatus = typeof GR_AVATAR_STATUSES[number]\n\nexport const shapes: Record<GrAvatarShape, string> = {\n circle: 'rounded-[var(--gr-radius-full)]',\n square: 'rounded-[var(--gr-avatar-square-radius,10px)]',\n}\n\nexport const rootBaseClass = 'relative inline-flex shrink-0 items-center justify-center overflow-hidden border border-[var(--gr-brd)] font-700'\n\n/** Цвет по умолчанию. Отделён от базы, иначе он спорил бы с автоцветом порядком правил. */\nexport const rootNeutralClass = 'bg-[var(--gr-muted)] text-[var(--gr-muted-fg)]'\n\n/**\n * Палитра автоцвета: подложка и инициалы одним классом на слот.\n *\n * Цвета сюда не попадают — только имена слотов. Что стоит за слотом, решает\n * тема (`--gr-avatar-N-bg`/`-fg` ссылаются на пары `-light`/`-text` тонов), и\n * приложение вправе переопределить любой, не трогая компонент.\n *\n * Классы статические: UnoCSS сканирует литералы, и собранный в рантайме\n * `bg-[var(--gr-avatar-${n}-bg)]` в CSS не превратился бы.\n */\nexport const avatarToneClasses: string[] = [\n 'bg-[var(--gr-avatar-1-bg)] text-[var(--gr-avatar-1-fg)]',\n 'bg-[var(--gr-avatar-2-bg)] text-[var(--gr-avatar-2-fg)]',\n 'bg-[var(--gr-avatar-3-bg)] text-[var(--gr-avatar-3-fg)]',\n 'bg-[var(--gr-avatar-4-bg)] text-[var(--gr-avatar-4-fg)]',\n 'bg-[var(--gr-avatar-5-bg)] text-[var(--gr-avatar-5-fg)]',\n 'bg-[var(--gr-avatar-6-bg)] text-[var(--gr-avatar-6-fg)]',\n]\n\n/**\n * Слот палитры по имени: тот же человек — тот же цвет.\n *\n * Стабильность здесь и есть смысл функции: цвет не должен меняться ни между\n * сессиями, ни между сервером и клиентом, иначе аватар мигает на гидрации, а\n * узнаваемость — то, ради чего автоцвет и заводят, — теряется. Отсюда обычный\n * детерминированный перебор кодов, а не хеш из окружения.\n *\n * `>>> 0` обязателен: без него сумма уходит в отрицательные на длинных именах,\n * и остаток от деления даёт отрицательный индекс.\n */\nexport function avatarToneIndex(name: string): number {\n let hash = 0\n for (const char of name.trim())\n hash = (hash * 31 + (char.codePointAt(0) ?? 0)) >>> 0\n\n return hash % avatarToneClasses.length\n}\n\n/** Индикатор статуса: кольцо цветом фона отделяет точку от самого аватара. */\nexport const statusDotClass = 'absolute bottom-0 right-0 block h-1/4 w-1/4 min-h-2 min-w-2 rounded-[var(--gr-radius-full)] ring-2 ring-[var(--gr-bg)]'\n\nexport const statusToneClass: Record<GrAvatarStatus, string> = {\n online: 'bg-[var(--gr-success)]',\n offline: 'bg-[var(--gr-muted-fg)]',\n busy: 'bg-[var(--gr-danger)]',\n away: 'bg-[var(--gr-warning)]',\n}\n\n/**\n * Статус рисуется поверх картинки, поэтому у корня со статусом не может быть\n * `overflow-hidden` — точка обрезалась бы кругом. Скругление вместо этого\n * держит внутренняя обёртка изображения.\n */\nexport const rootStatusClass = 'overflow-visible'\n\n/**\n * Обёртка растянута на весь аватар, поэтому корневой `justify-center`\n * центрирует её саму, а не содержимое: центрирование обязано быть здесь.\n */\nexport const mediaClass = 'flex h-full w-full items-center justify-center'\n\n/**\n * Со статусом корень уходит в `overflow-visible`, чтобы не срезать точку, и\n * резать по форме становится некому — тогда это берёт на себя обёртка.\n */\nexport const mediaClipClass = 'overflow-hidden'\n\n/**\n * Размер бывает произвольным числом пикселей, поэтому кегль считается, а не\n * берётся картой по ступеням. Пол в 10px: у аватара 24px пропорциональные 8px\n * не читаются.\n */\nexport function avatarFontSizePx(sizePx: number): number {\n return Math.max(10, Math.round(sizePx / 3))\n}\n\nexport const groupBaseClass = 'inline-flex items-center'\n\n/** Перекрытие соседей: кольцо цветом фона отделяет аватары друг от друга. */\nexport const groupItemClass = '-ml-2 first:ml-0 ring-2 ring-[var(--gr-bg)]'\n\nexport const groupOverflowClass = 'inline-flex items-center justify-center bg-[var(--gr-muted)] text-[var(--gr-muted-fg)] font-700'\n\nexport function grAvatarClass(shape: GrAvatarShape): string {\n return [shapes[shape]].join(' ')\n}\n\n/**\n * Инициалы из имени: первые буквы двух первых слов. Вынесено чистой функцией —\n * тестируется без монтирования.\n */\nexport function initialsFrom(name: string): string {\n const words = name.trim().split(/\\s+/).filter(Boolean)\n if (words.length === 0)\n return ''\n\n return words\n .slice(0, 2)\n .map(word => [...word][0]?.toUpperCase() ?? '')\n .join('')\n}\n","import { splitClassTokens } from '../shared/classTokens'\nimport {\n avatarToneClasses,\n groupBaseClass,\n groupItemClass,\n groupOverflowClass,\n mediaClass,\n mediaClipClass,\n rootBaseClass,\n rootNeutralClass,\n rootStatusClass,\n shapes,\n statusDotClass,\n statusToneClass,\n} from './grAvatarStyles'\n\nexport const grAvatarClassTokens = {\n shapes: Object.values(shapes).flatMap(splitClassTokens),\n root: [\n ...splitClassTokens(rootBaseClass),\n ...splitClassTokens(rootNeutralClass),\n ...splitClassTokens(rootStatusClass),\n // Палитра автоцвета живёт в `.ts`-хелпере: её литералы пресет не видит.\n ...avatarToneClasses.flatMap(splitClassTokens),\n ],\n media: [...splitClassTokens(mediaClass), ...splitClassTokens(mediaClipClass)],\n status: [\n ...splitClassTokens(statusDotClass),\n ...Object.values(statusToneClass).flatMap(splitClassTokens),\n ],\n group: [\n ...splitClassTokens(groupBaseClass),\n ...splitClassTokens(groupItemClass),\n ...splitClassTokens(groupOverflowClass),\n ],\n} as const\n\nexport const grAvatarSafelist = [...new Set([\n ...grAvatarClassTokens.shapes,\n ...grAvatarClassTokens.root,\n ...grAvatarClassTokens.media,\n ...grAvatarClassTokens.status,\n ...grAvatarClassTokens.group,\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grAvatarSafelist } from './safelist'\n\nexport const grAvatarConfig = defineGranularComponent(import.meta.url, {\n name: 'GrAvatar',\n dependencies: ['GrSkeleton'],\n safelist: grAvatarSafelist,\n // Только светлая: слоты палитры ссылаются на `-light`/`-text`, а те\n // переключаются вместе с темой сами — см. комментарий в самом файле.\n tokenDefinitionsRef: {\n light: { url: './themes/light.css', selector: ':root' },\n },\n})\n"],"mappings":";;;AAMA,IAAa,SAAwC;CACnD,QAAQ;CACR,QAAQ;AACV;AAEA,IAAa,gBAAgB;;AAG7B,IAAa,mBAAmB;;;;;;;;;;;AAYhC,IAAa,oBAA8B;CACzC;CACA;CACA;CACA;CACA;CACA;AACF;;;;;;;;;;;;AAaA,SAAgB,gBAAgB,MAAsB;CACpD,IAAI,OAAO;CACX,KAAK,MAAM,QAAQ,KAAK,KAAK,GAC3B,OAAQ,OAAO,MAAM,KAAK,YAAY,CAAC,KAAK,OAAQ;CAEtD,OAAO,OAAO,kBAAkB;AAClC;;AAGA,IAAa,iBAAiB;AAE9B,IAAa,kBAAkD;CAC7D,QAAQ;CACR,SAAS;CACT,MAAM;CACN,MAAM;AACR;;;;;;AAOA,IAAa,kBAAkB;;;;;AAM/B,IAAa,aAAa;;;;;AAM1B,IAAa,iBAAiB;;;;;;AAO9B,SAAgB,iBAAiB,QAAwB;CACvD,OAAO,KAAK,IAAI,IAAI,KAAK,MAAM,SAAS,CAAC,CAAC;AAC5C;AAEA,IAAa,iBAAiB;;AAG9B,IAAa,iBAAiB;AAE9B,IAAa,qBAAqB;AAElC,SAAgB,cAAc,OAA8B;CAC1D,OAAO,CAAC,OAAO,MAAM,CAAC,CAAC,KAAK,GAAG;AACjC;;;;;AAMA,SAAgB,aAAa,MAAsB;CACjD,MAAM,QAAQ,KAAK,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,OAAO,OAAO;CACrD,IAAI,MAAM,WAAW,GACnB,OAAO;CAET,OAAO,MACJ,MAAM,GAAG,CAAC,CAAC,CACX,KAAI,SAAQ,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,EAAE,YAAY,KAAK,EAAE,CAAC,CAC9C,KAAK,EAAE;AACZ;;;ACpGA,IAAa,sBAAsB;CACjC,QAAQ,OAAO,OAAO,MAAM,CAAC,CAAC,QAAQ,gBAAgB;CACtD,MAAM;EACJ,GAAG,iBAAiB,aAAa;EACjC,GAAG,iBAAiB,gBAAgB;EACpC,GAAG,iBAAiB,eAAe;EAEnC,GAAG,kBAAkB,QAAQ,gBAAgB;CAC/C;CACA,OAAO,CAAC,GAAG,iBAAiB,UAAU,GAAG,GAAG,iBAAiB,cAAc,CAAC;CAC5E,QAAQ,CACN,GAAG,iBAAiB,cAAc,GAClC,GAAG,OAAO,OAAO,eAAe,CAAC,CAAC,QAAQ,gBAAgB,CAC5D;CACA,OAAO;EACL,GAAG,iBAAiB,cAAc;EAClC,GAAG,iBAAiB,cAAc;EAClC,GAAG,iBAAiB,kBAAkB;CACxC;AACF;AAEA,IAAa,mBAAmB,CAAC,mBAAG,IAAI,IAAI;CAC1C,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;CACvB,GAAG,oBAAoB;AACzB,CAAC,CAAC;;;ACvCF,IAAa,iBAAiB,wBAAwB,YAAY,KAAK;CACrE,MAAM;CACN,cAAc,CAAC,YAAY;CAC3B,UAAU;CAGV,qBAAqB,EACnB,OAAO;EAAE,KAAK;EAAsB,UAAU;CAAQ,EACxD;AACF,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { n as splitClassTokens } from "./classTokens-8v2XC74x.js";
2
- import { a as tableSizes, i as stripedClass, n as hoverableClass, r as loadingRowCellClass, t as emptyCellClass } from "./grTableStyles-uuMPSOBR.js";
2
+ import { a as tableSizes, i as stripedClass, n as hoverableClass, r as loadingRowCellClass, t as emptyCellClass } from "./grTableStyles-DkQPMfx9.js";
3
3
  import { defineGranularComponent } from "@feugene/unocss-preset-granular/contract";
4
4
  //#region src/components/GrTable/safelist.ts
5
5
  var grTableSafelist = [.../* @__PURE__ */ new Set([
@@ -1 +1 @@
1
- {"version":3,"file":"config-DCq4JySZ.js","names":[],"sources":["../../src/components/GrTable/safelist.ts","../../src/components/GrTable/config.ts"],"sourcesContent":["import { splitClassTokens } from '../shared/classTokens'\nimport {\n emptyCellClass,\n hoverableClass,\n loadingRowCellClass,\n stripedClass,\n tableSizes,\n} from './grTableStyles'\n\nexport const grTableSafelist = [...new Set([\n ...Object.values(tableSizes).flatMap(splitClassTokens),\n ...splitClassTokens(stripedClass),\n ...splitClassTokens(hoverableClass),\n ...splitClassTokens(emptyCellClass),\n ...splitClassTokens(loadingRowCellClass),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grTableSafelist } from './safelist'\n\nexport const grTableConfig = defineGranularComponent(import.meta.url, {\n name: 'GrTable',\n dependencies: ['GrSkeleton'],\n safelist: grTableSafelist,\n})\n"],"mappings":";;;;AASA,IAAa,kBAAkB,CAAC,mBAAG,IAAI,IAAI;CACzC,GAAG,OAAO,OAAO,UAAU,CAAC,CAAC,QAAQ,gBAAgB;CACrD,GAAG,iBAAiB,YAAY;CAChC,GAAG,iBAAiB,cAAc;CAClC,GAAG,iBAAiB,cAAc;CAClC,GAAG,iBAAiB,mBAAmB;AACzC,CAAC,CAAC;;;ACXF,IAAa,gBAAgB,wBAAwB,YAAY,KAAK;CACpE,MAAM;CACN,cAAc,CAAC,YAAY;CAC3B,UAAU;AACZ,CAAC"}
1
+ {"version":3,"file":"config-D3HOuHDe.js","names":[],"sources":["../../src/components/GrTable/safelist.ts","../../src/components/GrTable/config.ts"],"sourcesContent":["import { splitClassTokens } from '../shared/classTokens'\nimport {\n emptyCellClass,\n hoverableClass,\n loadingRowCellClass,\n stripedClass,\n tableSizes,\n} from './grTableStyles'\n\nexport const grTableSafelist = [...new Set([\n ...Object.values(tableSizes).flatMap(splitClassTokens),\n ...splitClassTokens(stripedClass),\n ...splitClassTokens(hoverableClass),\n ...splitClassTokens(emptyCellClass),\n ...splitClassTokens(loadingRowCellClass),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grTableSafelist } from './safelist'\n\nexport const grTableConfig = defineGranularComponent(import.meta.url, {\n name: 'GrTable',\n dependencies: ['GrSkeleton'],\n safelist: grTableSafelist,\n})\n"],"mappings":";;;;AASA,IAAa,kBAAkB,CAAC,mBAAG,IAAI,IAAI;CACzC,GAAG,OAAO,OAAO,UAAU,CAAC,CAAC,QAAQ,gBAAgB;CACrD,GAAG,iBAAiB,YAAY;CAChC,GAAG,iBAAiB,cAAc;CAClC,GAAG,iBAAiB,cAAc;CAClC,GAAG,iBAAiB,mBAAmB;AACzC,CAAC,CAAC;;;ACXF,IAAa,gBAAgB,wBAAwB,YAAY,KAAK;CACpE,MAAM;CACN,cAAc,CAAC,YAAY;CAC3B,UAAU;AACZ,CAAC"}
@@ -90,7 +90,15 @@ var dataTable = {
90
90
  "moveColumn": "Move column {label}",
91
91
  "columnMoved": "Column {label} moved to position {position} of {count}",
92
92
  "resizeColumn": "Width of column {label}",
93
- "columnResized": "Column {label} is {width} pixels wide"
93
+ "columnResized": "Column {label} is {width} pixels wide",
94
+ "expandRow": "Show details",
95
+ "collapseRow": "Hide details",
96
+ "detailLoading": "Loading details…",
97
+ "detailError": "Could not load details",
98
+ "detailRetry": "Retry",
99
+ "detailExpanded": "Row details shown",
100
+ "detailCollapsed": "Row details hidden",
101
+ "detailReady": "Row details loaded"
94
102
  };
95
103
  var breadcrumbs = {
96
104
  "label": "Breadcrumb",
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en-Bxyn5lW7.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 },\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":""}
@@ -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-DjTnfTqM.js") } };
12
+ var en = { en: { ["gr"]: () => import("./en-Bxyn5lW7.js") } };
13
13
  //#endregion
14
14
  //#region src/i18n/messages/ru.ts
15
- var ru = { ru: { ["gr"]: () => import("./ru-Bb-co59W.js") } };
15
+ var ru = { ru: { ["gr"]: () => import("./ru-hrB4I1u_.js") } };
16
16
  //#endregion
17
17
  //#region src/i18n/messages/es.ts
18
- var es = { es: { ["gr"]: () => import("./es-Bc_t3FI8.js") } };
18
+ var es = { es: { ["gr"]: () => import("./es-Dtl-a7ui.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-DIFzSXSZ.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-Bj_vc18Z.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"}
@@ -90,7 +90,15 @@ var dataTable = {
90
90
  "moveColumn": "Mover la columna {label}",
91
91
  "columnMoved": "Columna {label} movida a la posición {position} de {count}",
92
92
  "resizeColumn": "Ancho de la columna {label}",
93
- "columnResized": "La columna {label} mide {width} píxeles"
93
+ "columnResized": "La columna {label} mide {width} píxeles",
94
+ "expandRow": "Mostrar detalles",
95
+ "collapseRow": "Ocultar detalles",
96
+ "detailLoading": "Cargando detalles…",
97
+ "detailError": "No se pudieron cargar los detalles",
98
+ "detailRetry": "Reintentar",
99
+ "detailExpanded": "Detalles de la fila mostrados",
100
+ "detailCollapsed": "Detalles de la fila ocultos",
101
+ "detailReady": "Detalles de la fila cargados"
94
102
  };
95
103
  var breadcrumbs = {
96
104
  "label": "Ruta de navegación",
@@ -0,0 +1 @@
1
+ {"version":3,"file":"es-Dtl-a7ui.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 },\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":""}
@@ -1793,6 +1793,90 @@ var grComponentTokens = [
1793
1793
  "default": "10px",
1794
1794
  "description": "Скругление аватара в форме `square`. Не ступень общей шкалы: квадратный аватар мягче плитки, но жёстче чипа."
1795
1795
  },
1796
+ {
1797
+ "owner": "GrAvatar",
1798
+ "name": "--gr-avatar-1-bg",
1799
+ "kind": "theme",
1800
+ "default": "var(--gr-info-light)",
1801
+ "description": "Подложка слота 1 автоцвета (`autoColor`). Живёт в теме компонента, а не в глобальной: палитра нужна одному компоненту."
1802
+ },
1803
+ {
1804
+ "owner": "GrAvatar",
1805
+ "name": "--gr-avatar-1-fg",
1806
+ "kind": "theme",
1807
+ "default": "var(--gr-info-text)",
1808
+ "description": "Инициалы на подложке слота 1. Роль `-text`, а не насыщенный тон: тот в роли текста не добирает AA."
1809
+ },
1810
+ {
1811
+ "owner": "GrAvatar",
1812
+ "name": "--gr-avatar-2-bg",
1813
+ "kind": "theme",
1814
+ "default": "var(--gr-warning-light)",
1815
+ "description": "Подложка слота 2 автоцвета (`autoColor`). Живёт в теме компонента, а не в глобальной: палитра нужна одному компоненту."
1816
+ },
1817
+ {
1818
+ "owner": "GrAvatar",
1819
+ "name": "--gr-avatar-2-fg",
1820
+ "kind": "theme",
1821
+ "default": "var(--gr-warning-text)",
1822
+ "description": "Инициалы на подложке слота 2. Роль `-text`, а не насыщенный тон: тот в роли текста не добирает AA."
1823
+ },
1824
+ {
1825
+ "owner": "GrAvatar",
1826
+ "name": "--gr-avatar-3-bg",
1827
+ "kind": "theme",
1828
+ "default": "var(--gr-success-light)",
1829
+ "description": "Подложка слота 3 автоцвета (`autoColor`). Живёт в теме компонента, а не в глобальной: палитра нужна одному компоненту."
1830
+ },
1831
+ {
1832
+ "owner": "GrAvatar",
1833
+ "name": "--gr-avatar-3-fg",
1834
+ "kind": "theme",
1835
+ "default": "var(--gr-success-text)",
1836
+ "description": "Инициалы на подложке слота 3. Роль `-text`, а не насыщенный тон: тот в роли текста не добирает AA."
1837
+ },
1838
+ {
1839
+ "owner": "GrAvatar",
1840
+ "name": "--gr-avatar-4-bg",
1841
+ "kind": "theme",
1842
+ "default": "var(--gr-danger-light)",
1843
+ "description": "Подложка слота 4 автоцвета (`autoColor`). Живёт в теме компонента, а не в глобальной: палитра нужна одному компоненту."
1844
+ },
1845
+ {
1846
+ "owner": "GrAvatar",
1847
+ "name": "--gr-avatar-4-fg",
1848
+ "kind": "theme",
1849
+ "default": "var(--gr-danger-text)",
1850
+ "description": "Инициалы на подложке слота 4. Роль `-text`, а не насыщенный тон: тот в роли текста не добирает AA."
1851
+ },
1852
+ {
1853
+ "owner": "GrAvatar",
1854
+ "name": "--gr-avatar-5-bg",
1855
+ "kind": "theme",
1856
+ "default": "var(--gr-azure-light)",
1857
+ "description": "Подложка слота 5 автоцвета (`autoColor`). Живёт в теме компонента, а не в глобальной: палитра нужна одному компоненту."
1858
+ },
1859
+ {
1860
+ "owner": "GrAvatar",
1861
+ "name": "--gr-avatar-5-fg",
1862
+ "kind": "theme",
1863
+ "default": "var(--gr-azure-text)",
1864
+ "description": "Инициалы на подложке слота 5. Роль `-text`, а не насыщенный тон: тот в роли текста не добирает AA."
1865
+ },
1866
+ {
1867
+ "owner": "GrAvatar",
1868
+ "name": "--gr-avatar-6-bg",
1869
+ "kind": "theme",
1870
+ "default": "var(--gr-slate-light)",
1871
+ "description": "Подложка слота 6 автоцвета (`autoColor`). Живёт в теме компонента, а не в глобальной: палитра нужна одному компоненту."
1872
+ },
1873
+ {
1874
+ "owner": "GrAvatar",
1875
+ "name": "--gr-avatar-6-fg",
1876
+ "kind": "theme",
1877
+ "default": "var(--gr-slate-text)",
1878
+ "description": "Инициалы на подложке слота 6. Роль `-text`, а не насыщенный тон: тот в роли текста не добирает AA."
1879
+ },
1796
1880
  {
1797
1881
  "owner": "GrBadge",
1798
1882
  "name": "--gr-badge-semi-radius-xs",
@@ -2591,6 +2675,20 @@ var grComponentTokens = [
2591
2675
  "default": "-4px 0 6px -4px rgba(0, 0, 0, 0.25)",
2592
2676
  "description": "Тень на границе группы колонок, закреплённых справа."
2593
2677
  },
2678
+ {
2679
+ "owner": "GrDataTable",
2680
+ "name": "--gr-datatable-detail-bg",
2681
+ "kind": "theme",
2682
+ "default": "color-mix(in srgb, var(--gr-muted) 45%, transparent)",
2683
+ "description": "Фон строки с подробностями. Мягче строки набора: второй ярус читается как вложенное, а не как следующая строка."
2684
+ },
2685
+ {
2686
+ "owner": "GrDataTable",
2687
+ "name": "--gr-datatable-detail-accent",
2688
+ "kind": "theme",
2689
+ "default": "var(--gr-primary)",
2690
+ "description": "Полоса слева у строки подробностей. Связывает её со своей строкой, когда между ними прокрутили."
2691
+ },
2594
2692
  {
2595
2693
  "owner": "GrDescriptionList",
2596
2694
  "name": "--gr-description-list-column-min",