@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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://raw.githubusercontent.com/JetBrains/web-types/master/schema/web-types.json",
3
3
  "name": "@feugene/granularity",
4
- "version": "0.47.0",
4
+ "version": "0.48.0",
5
5
  "framework": "vue",
6
6
  "js-types-syntax": "typescript",
7
7
  "description-markup": "markdown",
@@ -603,6 +603,15 @@
603
603
  "type": "GrAvatarShape | undefined"
604
604
  }
605
605
  },
606
+ {
607
+ "name": "autoColor",
608
+ "description": "Красить фон по имени: одинаковое имя всегда даёт одинаковый цвет. Выключен по умолчанию — серый аватар это осознанный нейтральный дефолт, а цветной может спорить с оформлением продукта. Палитру задаёт тема (`--gr-avatar-N-bg`/`-fg`), компонент только выбирает слот.",
609
+ "default": "undefined",
610
+ "value": {
611
+ "kind": "expression",
612
+ "type": "boolean | undefined"
613
+ }
614
+ },
606
615
  {
607
616
  "name": "status",
608
617
  "description": "Статус участника. Точка декоративна — рядом идёт скрытая подпись.",
@@ -3188,6 +3197,60 @@
3188
3197
  "kind": "expression",
3189
3198
  "type": "Record<string, number> | undefined"
3190
3199
  }
3200
+ },
3201
+ {
3202
+ "name": "expandable",
3203
+ "description": "Второй ярус строки: колонка с кнопкой раскрытия и блок подробностей под строкой. Содержимое рисует слот `#detail`.",
3204
+ "default": "false",
3205
+ "value": {
3206
+ "kind": "expression",
3207
+ "type": "boolean | undefined"
3208
+ }
3209
+ },
3210
+ {
3211
+ "name": "expandedKeys",
3212
+ "description": "Контролируемый список раскрытых ключей (`v-model:expandedKeys`).",
3213
+ "default": "undefined",
3214
+ "value": {
3215
+ "kind": "expression",
3216
+ "type": "(string | number)[] | undefined"
3217
+ }
3218
+ },
3219
+ {
3220
+ "name": "expandableRow",
3221
+ "description": "У какой строки есть второй ярус. Остальные кнопки не получают.",
3222
+ "default": "undefined",
3223
+ "value": {
3224
+ "kind": "expression",
3225
+ "type": "((row: TRow) => boolean) | undefined"
3226
+ }
3227
+ },
3228
+ {
3229
+ "name": "loadDetail",
3230
+ "description": "Подгрузка подробностей в момент раскрытия. Без неё содержимое берётся из самой строки. `signal` обязателен: строку сворачивают чаще, чем ждут.",
3231
+ "default": "undefined",
3232
+ "value": {
3233
+ "kind": "expression",
3234
+ "type": "((row: TRow, signal: AbortSignal) => Promise<unknown>) | undefined"
3235
+ }
3236
+ },
3237
+ {
3238
+ "name": "accordion",
3239
+ "description": "Раскрыта не больше одной строки.",
3240
+ "default": "false",
3241
+ "value": {
3242
+ "kind": "expression",
3243
+ "type": "boolean | undefined"
3244
+ }
3245
+ },
3246
+ {
3247
+ "name": "expandColumn",
3248
+ "description": "Рисовать ли служебную колонку с собственной кнопкой раскрытия. `false` — колонки нет, и раскрытием управляет разметка потребителя: слоты ячеек получают `expanded` и `toggleExpand`, чтобы кнопку можно было поставить в свой столбец действий рядом с остальными. Тогда `aria-expanded` и доступное имя ложатся на неё же — компоненту их вешать не на что.",
3249
+ "default": "true",
3250
+ "value": {
3251
+ "kind": "expression",
3252
+ "type": "boolean | undefined"
3253
+ }
3191
3254
  }
3192
3255
  ],
3193
3256
  "slots": [
@@ -3236,6 +3299,18 @@
3236
3299
  },
3237
3300
  {
3238
3301
  "name": "columnResize"
3302
+ },
3303
+ {
3304
+ "name": "update:expandedKeys"
3305
+ },
3306
+ {
3307
+ "name": "expand"
3308
+ },
3309
+ {
3310
+ "name": "collapse"
3311
+ },
3312
+ {
3313
+ "name": "detailLoadError"
3239
3314
  }
3240
3315
  ]
3241
3316
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@feugene/granularity",
3
3
  "description": "Granularity design system package with Vue 3 components, consumed via the `@feugene/unocss-preset-granular` preset.",
4
- "version": "0.47.0",
4
+ "version": "0.48.0",
5
5
  "license": "LicenseRef-Granularity-EUC-1.1",
6
6
  "author": {
7
7
  "name": "Evgeniy Fureev",
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-B3J0alyY.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)] bg-[var(--gr-muted)] text-[var(--gr-muted-fg)] font-700'\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 groupBaseClass,\n groupItemClass,\n groupOverflowClass,\n mediaClass,\n mediaClipClass,\n rootBaseClass,\n rootStatusClass,\n shapes,\n statusDotClass,\n statusToneClass,\n} from './grAvatarStyles'\n\nexport const grAvatarClassTokens = {\n shapes: Object.values(shapes).flatMap(splitClassTokens),\n root: [...splitClassTokens(rootBaseClass), ...splitClassTokens(rootStatusClass)],\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})\n"],"mappings":";;;AAMA,IAAa,SAAwC;CACnD,QAAQ;CACR,QAAQ;AACV;AAEA,IAAa,gBAAgB;;AAG7B,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;;;AC7DA,IAAa,sBAAsB;CACjC,QAAQ,OAAO,OAAO,MAAM,CAAC,CAAC,QAAQ,gBAAgB;CACtD,MAAM,CAAC,GAAG,iBAAiB,aAAa,GAAG,GAAG,iBAAiB,eAAe,CAAC;CAC/E,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;;;AC/BF,IAAa,iBAAiB,wBAAwB,YAAY,KAAK;CACrE,MAAM;CACN,cAAc,CAAC,YAAY;CAC3B,UAAU;AACZ,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"en-DjTnfTqM.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 },\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":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"es-Bc_t3FI8.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 },\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":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"grTableStyles-uuMPSOBR.js","names":[],"sources":["../../src/components/GrTable/grTableStyles.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nexport type GrTableSize = GrComponentSize\n\n/**\n * `GrTable` — «тонкий» контейнер: он задаёт только кегль таблицы, паддинги\n * ячеек остаются за потребителем (см. `GrTableProps`). Поэтому карта здесь\n * одна, а метрики ячеек живут в `GrDataTable`, который рисует их сам.\n */\n/**\n * Лестница 12/13/14/16 совпадает с `GrInput`, `GrTextarea` и `GrSelect` — это\n * типографика контролов пакета, а не самодеятельность таблицы. В шкале\n * `--gr-text-*` ступени 13px нет, и подстановка `--gr-text-sm` схлопнула бы\n * `sm` и `md` в один кегль. Перевод всей лестницы на токены — отдельная\n * системная задача.\n */\nexport const tableSizes: Record<GrTableSize, string> = {\n xs: 'text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]',\n sm: 'text-[length:var(--gr-control-text-sm)] leading-[var(--gr-control-leading-sm)]',\n md: 'text-[length:var(--gr-control-text-md)] leading-[var(--gr-leading-sm)]',\n lg: 'text-[length:var(--gr-control-text-lg)] leading-[var(--gr-leading-base)]',\n}\n\n/** Чередование строк и подсветка под курсором — на `<tbody>`, а не на ячейках. */\nexport const stripedClass = '[&>tr:nth-child(even)]:bg-[color-mix(in_srgb,var(--gr-muted)_35%,transparent)]'\nexport const hoverableClass = '[&>tr:hover]:bg-[color-mix(in_srgb,var(--gr-muted)_45%,transparent)]'\n\nexport const emptyCellClass = 'px-4 py-8 text-center text-[var(--gr-muted-fg)]'\nexport const loadingRowCellClass = 'px-4 py-3'\n"],"mappings":";;;;;;;;;;;;;AAgBA,IAAa,aAA0C;CACrD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,eAAe;AAC5B,IAAa,iBAAiB;AAE9B,IAAa,iBAAiB;AAC9B,IAAa,sBAAsB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ru-Bb-co59W.js","names":[],"sources":["../../src/i18n/locales/ru.json"],"sourcesContent":["{\n \"transfer\": {\n \"sourceTitle\": \"Доступны\",\n \"targetTitle\": \"Выбраны\",\n \"search\": \"Поиск\",\n \"toTarget\": \"Перенести к выбранным\",\n \"toSource\": \"Вернуть к доступным\",\n \"selectAll\": \"Выбрать всё показанное\",\n \"moveUp\": \"Раньше\",\n \"moveDown\": \"Позже\",\n \"selected\": \"{count} из {total}\",\n \"shown\": \"Показано {shown} из {total}\",\n \"empty\": \"Здесь пока пусто\",\n \"emptyFiltered\": \"Ничего не найдено\",\n \"moved\": \"{count} перенесено в «{list}»\",\n \"reordered\": \"Позиция {position} из {count}\",\n \"reorderFiltered\": \"Пока включён поиск, порядок не меняется\",\n \"cancelled\": \"Перенос отменён\"\n },\n \"carousel\": {\n \"roledescription\": \"карусель\",\n \"slideRoledescription\": \"слайд\",\n \"slidePosition\": \"{index} из {total}\",\n \"previous\": \"Предыдущий слайд\",\n \"next\": \"Следующий слайд\",\n \"play\": \"Запустить автопоказ\",\n \"pause\": \"Остановить автопоказ\",\n \"indicators\": \"Слайды\",\n \"autoplayStopped\": \"Автопоказ остановлен\"\n },\n \"chip\": {\n \"remove\": \"Убрать\",\n \"removeNamed\": \"Убрать {label}\"\n },\n \"common\": {\n \"confirm\": \"Подтвердить\",\n \"cancel\": \"Отмена\",\n \"add\": \"Добавить\",\n \"clear\": \"Очистить\",\n \"close\": \"Закрыть\",\n \"stateSuccess\": \"Корректно\",\n \"stateWarning\": \"Предупреждение\"\n },\n \"loading\": {\n \"defaultText\": \"Загрузка...\"\n },\n \"steps\": {\n \"label\": \"Ход выполнения\",\n \"status\": \"Шаг {step} из {count}\",\n \"completed\": \"выполнен\",\n \"error\": \"есть ошибки\"\n },\n \"treeSelect\": {\n \"filterPlaceholder\": \"Поиск…\",\n \"empty\": \"Нет данных\",\n \"loading\": \"Загрузка…\"\n },\n \"badgeWrap\": {\n \"count\": \"{count} новых\"\n },\n \"avatar\": {\n \"group\": \"Участники\",\n \"groupOverflow\": \"и ещё {count}\",\n \"status\": {\n \"online\": \"в сети\",\n \"offline\": \"не в сети\",\n \"busy\": \"занят\",\n \"away\": \"отошёл\"\n }\n },\n \"tree\": {\n \"drag\": \"Перетащить\",\n \"expand\": \"Развернуть\",\n \"collapse\": \"Свернуть\",\n \"moved\": \"{label} перемещён\"\n },\n \"select\": {\n \"customValuePlaceholder\": \"Добавить значение…\",\n \"addOption\": \"Добавить «{value}»\",\n \"clearOption\": \"Не выбрано\",\n \"searchPlaceholder\": \"Поиск…\",\n \"loading\": \"Загрузка…\",\n \"noResults\": \"Ничего не найдено\",\n \"removeTag\": \"Удалить {label}\"\n },\n \"dataTable\": {\n \"loading\": \"Загрузка…\",\n \"empty\": \"Нет данных\",\n \"selectAll\": \"Выбрать все строки\",\n \"selectRow\": \"Выбрать строку\",\n \"sortAsc\": \"Нажмите для сортировки по возрастанию\",\n \"sortDesc\": \"Нажмите для сортировки по убыванию\",\n \"sortNone\": \"Нажмите, чтобы снять сортировку\",\n \"moveColumn\": \"Переставить колонку {label}\",\n \"columnMoved\": \"Колонка {label} перемещена на позицию {position} из {count}\",\n \"resizeColumn\": \"Ширина колонки {label}\",\n \"columnResized\": \"Ширина колонки {label} — {width} пикселей\"\n },\n \"breadcrumbs\": {\n \"label\": \"Навигационная цепочка\",\n \"expand\": \"Показать скрытые уровни\"\n },\n \"autocomplete\": {\n \"loading\": \"Загрузка…\",\n \"noResults\": \"Ничего не найдено\",\n \"addOption\": \"Добавить «{value}»\",\n \"removeValue\": \"Убрать {label}\",\n \"typeMore\": {\n \"one\": \"Введите минимум {n} символ\",\n \"few\": \"Введите минимум {n} символа\",\n \"many\": \"Введите минимум {n} символов\",\n \"other\": \"Введите минимум {n} символа\"\n }\n },\n \"form\": {\n \"required\": \"Обязательное поле\",\n \"min\": \"Минимум {min}\",\n \"max\": \"Максимум {max}\",\n \"len\": \"Длина должна быть {len}\",\n \"pattern\": \"Неверный формат\",\n \"email\": \"Введите корректный e-mail\",\n \"url\": \"Введите корректный URL\",\n \"file\": \"Некорректный файл\",\n \"invalid\": \"Некорректное значение\",\n \"readonly\": \"Только для чтения\",\n \"validating\": \"Проверяем…\"\n },\n \"dialog\": {\n \"confirm\": {\n \"title\": \"Подтверждение\"\n },\n \"prompt\": {\n \"title\": \"Введите значение\",\n \"label\": \"Значение\",\n \"required\": \"Введите значение.\"\n },\n \"ok\": \"ОК\"\n },\n \"switch\": {\n \"loading\": \"Сохраняем…\"\n },\n \"slider\": {\n \"min\": \"минимум\",\n \"max\": \"максимум\"\n },\n \"sidebar\": {\n \"expand\": \"Развернуть панель\",\n \"collapse\": \"Свернуть панель\"\n },\n \"splitter\": {\n \"label\": \"Изменить размер панелей\"\n },\n \"statistic\": {\n \"trendUp\": \"Рост\",\n \"trendDown\": \"Падение\",\n \"trendFlat\": \"Без изменений\"\n },\n \"pagination\": {\n \"label\": \"Пагинация\",\n \"pageSize\": \"Размер страницы\",\n \"prev\": \"Назад\",\n \"next\": \"Вперёд\",\n \"page\": \"Страница {n}\",\n \"first\": \"Первая страница\",\n \"last\": \"Последняя страница\",\n \"jumpTo\": \"Перейти к\",\n \"total\": \"{from}–{to} из {total}\",\n \"status\": \"Страница {page} из {count}\"\n },\n \"navbar\": {\n \"openMenu\": \"Открыть меню\"\n },\n \"scrollSpy\": {\n \"label\": \"На этой странице\"\n },\n \"responseError\": {\n \"networkTitle\": \"Нет связи с сервером\",\n \"networkMessage\": \"Проверьте подключение к интернету и попробуйте ещё раз.\",\n \"abortedTitle\": \"Запрос отменён\",\n \"abortedMessage\": \"Запрос был отменён.\",\n \"validationTitle\": \"Проверьте данные\",\n \"validationMessage\": \"Сервер вернул ошибку валидации. Исправьте поля и попробуйте снова.\",\n \"clientTitle\": \"Ошибка запроса\",\n \"clientMessage\": \"Сервер отклонил запрос.\",\n \"serverTitle\": \"Ошибка сервера\",\n \"serverMessage\": \"Произошла ошибка на сервере. Попробуйте ещё раз.\",\n \"unknownTitle\": \"Что-то пошло не так\",\n \"unknownMessage\": \"Не удалось выполнить операцию. Попробуйте ещё раз.\",\n \"statusLabel\": \"HTTP {status}\",\n \"retryLabel\": \"Повторить\",\n \"dismissLabel\": \"Скрыть\"\n },\n \"colors\": {\n \"neutral\": \"Нейтральный\",\n \"success\": \"Успех\",\n \"warning\": \"Предупреждение\",\n \"danger\": \"Опасность\",\n \"info\": \"Инфо\",\n \"primary\": \"Primary\",\n \"slate\": \"Сланцевый\",\n \"azure\": \"Лазурный\"\n },\n \"drawer\": {\n \"title\": \"Панель\"\n },\n \"modal\": {\n \"title\": \"Диалог\"\n },\n \"numberInput\": {\n \"increase\": \"Увеличить\",\n \"decrease\": \"Уменьшить\"\n },\n \"toaster\": {\n \"dismiss\": \"Закрыть\",\n \"region\": \"Уведомления\"\n },\n \"inputTag\": {\n \"removeTag\": \"Удалить тег\",\n \"removeTagNamed\": \"Удалить тег {tag}\",\n \"clearAll\": \"Удалить все теги\",\n \"added\": \"Добавлен тег: {tag}\",\n \"addedMany\": \"Добавлено тегов: {count}\",\n \"removed\": \"Удалён тег: {tag}\",\n \"cleared\": \"Все теги удалены\",\n \"limitReached\": \"Достигнут предел тегов\"\n },\n \"fileUpload\": {\n \"placeholder\": \"Перетащите файлы сюда или нажмите для выбора\",\n \"progress\": \"Прогресс загрузки\",\n \"uploading\": \"Загрузка…\",\n \"success\": \"Загрузка завершена\",\n \"error\": \"Не удалось загрузить\",\n \"remove\": \"Убрать {fileName}\",\n \"retry\": \"Повторить загрузку\",\n \"retryFile\": \"Повторить {fileName}\",\n \"abortFile\": \"Отменить загрузку {fileName}\",\n \"statusPending\": \"В очереди\",\n \"statusUploading\": \"Загружается\",\n \"statusSuccess\": \"Загружен\",\n \"statusError\": \"Ошибка\"\n },\n \"formFile\": {\n \"upload\": \"Загрузить файл\",\n \"change\": \"Заменить файл\",\n \"remove\": \"Удалить\",\n \"clearAll\": \"Очистить всё\",\n \"placeholder\": \"Файлы не выбраны\",\n \"validateError\": \"Не удалось проверить перетащенные файлы\",\n \"removeFile\": \"Убрать {fileName}\"\n },\n \"imageViewer\": {\n \"close\": \"Закрыть просмотрщик\",\n \"prev\": \"Предыдущее изображение\",\n \"next\": \"Следующее изображение\",\n \"zoomIn\": \"Увеличить\",\n \"zoomOut\": \"Уменьшить\",\n \"resetZoom\": \"Сбросить масштаб\",\n \"zoomToNatural\": \"Натуральный размер (1:1)\",\n \"rotateLeft\": \"Повернуть влево\",\n \"rotateRight\": \"Повернуть вправо\",\n \"download\": \"Скачать изображение\",\n \"empty\": \"Нет изображения\",\n \"label\": \"Просмотр изображений\",\n \"position\": \"Изображение {index} из {total}\"\n },\n \"formErrorBanner\": {\n \"validationTitle\": \"Проверьте поля формы\",\n \"validationMessage\": \"Сервер отклонил данные. Исправьте выделенные поля и попробуйте снова.\",\n \"clientTitle\": \"Не удалось сохранить\",\n \"serverTitle\": \"Ошибка сохранения\",\n \"serverMessage\": \"Не удалось сохранить данные. Попробуйте позже.\"\n },\n \"uploadErrorBanner\": {\n \"networkTitle\": \"Не удалось загрузить файлы\",\n \"networkMessage\": \"Проверьте подключение и попробуйте снова.\",\n \"validationTitle\": \"Файлы не прошли проверку\",\n \"validationMessage\": \"Некоторые файлы не соответствуют требованиям.\",\n \"serverTitle\": \"Ошибка загрузки на сервере\",\n \"serverMessage\": \"Сервер не смог обработать загрузку. Попробуйте снова.\"\n },\n \"input\": {\n \"clear\": \"Очистить\",\n \"showPassword\": \"Показать пароль\",\n \"hidePassword\": \"Скрыть пароль\",\n \"limitReached\": \"Достигнут предел символов\"\n },\n \"textarea\": {\n \"lines\": {\n \"one\": \"{n} строка\",\n \"few\": \"{n} строки\",\n \"many\": \"{n} строк\",\n \"other\": \"{n} строки\"\n }\n },\n \"rating\": {\n \"label\": \"Оценка\",\n \"valueText\": \"{value} из {max}\",\n \"valueTextWithLabel\": \"{value} из {max}, {label}\"\n },\n \"commandPalette\": {\n \"label\": \"Палитра команд\",\n \"placeholder\": \"Введите команду или запрос…\",\n \"empty\": \"Ничего не найдено\",\n \"recent\": \"Недавние\",\n \"loading\": \"Загрузка…\"\n },\n \"delta\": {\n \"increase\": \"рост\"\n },\n \"filePreview\": {\n \"label\": \"Файл\"\n },\n \"fileValidation\": {\n \"accept\": \"Файл «{fileName}» не подходит под accept=\\\"{accept}\\\"\",\n \"extension\": \"У файла «{fileName}» недопустимое расширение «.{extension}»\",\n \"mimeType\": \"У файла «{fileName}» недопустимый тип «{mimeType}»\",\n \"mimeTypeFallback\": \"У файла «{fileName}» неопределённый тип «{mimeType}»\",\n \"maxFileSize\": \"Файл «{fileName}» слишком большой ({size} байт), максимум {maxBytes}\",\n \"maxCount\": \"Выбрано слишком много файлов ({count}), максимум — {maxCount}\",\n \"maxTotalSize\": \"Суммарный размер файлов слишком большой ({total} байт), максимум {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\": \"стрелка вверх\",\n \"arrowDown\": \"стрелка вниз\",\n \"arrowLeft\": \"стрелка влево\",\n \"arrowRight\": \"стрелка вправо\",\n \"then\": \"затем\"\n },\n \"link\": {\n \"opensInNewTab\": \"откроется в новой вкладке\"\n },\n \"colorPicker\": {\n \"panelLabel\": \"Выбор цвета\",\n \"hue\": \"Оттенок\",\n \"saturation\": \"Насыщенность\",\n \"lightness\": \"Светлота\",\n \"opacity\": \"Непрозрачность\",\n \"hexLabel\": \"Значение hex\",\n \"presetsLabel\": \"Палитра\",\n \"swatchLabel\": \"Цвет {color}\"\n },\n \"collapse\": {\n \"empty\": \"Пока пусто\"\n },\n \"list\": {\n \"empty\": \"Пока пусто\"\n },\n \"button\": {\n \"loading\": \"Загрузка…\"\n },\n \"table\": {\n \"empty\": \"Пока пусто\"\n },\n \"timeline\": {\n \"empty\": \"Пока пусто\"\n },\n \"tabs\": {\n \"empty\": \"Пока пусто\",\n \"close\": \"Закрыть вкладку\"\n },\n \"bottomNav\": {\n \"label\": \"Нижняя навигация\",\n \"badge\": \"{count} новых\"\n },\n \"emptyState\": {\n \"title\": \"Пока пусто\"\n },\n \"sortable\": {\n \"label\": \"Сортируемый список\",\n \"handle\": \"Переставить\",\n \"empty\": \"Пока нечего сортировать\",\n \"grabbed\": \"Взято. Позиция {position} из {count}\",\n \"moved\": \"Позиция {position} из {count}\",\n \"dropped\": \"Отпущено на позиции {position} из {count}\",\n \"cancelled\": \"Перенос отменён\"\n },\n \"jsonViewer\": {\n \"search\": \"Поиск по ключу или значению\",\n \"expandAll\": \"Раскрыть всё\",\n \"collapseAll\": \"Свернуть всё\",\n \"copy\": \"Скопировать значение\",\n \"copied\": \"Значение скопировано\",\n \"copyFailed\": \"Не удалось скопировать значение\",\n \"moreItems\": \"ещё\"\n },\n \"contextMenu\": {\n \"label\": \"Контекстное меню\"\n }\n}\n"],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"GrAvatar-dWEXiCJG.js","names":[],"sources":["../../../../src/components/GrAvatar/avatarContext.ts","../../../../src/components/GrAvatar/GrAvatar.vue","../../../../src/components/GrAvatar/GrAvatar.vue","../../../../src/components/GrAvatar/GrAvatarGroup.vue","../../../../src/components/GrAvatar/GrAvatarGroup.vue"],"sourcesContent":["import type { InjectionKey } from 'vue'\n\nimport type { GrAvatarShape } from './grAvatarStyles'\nimport type { GrSizeWithPx } from '../shared/sizes'\n\n/**\n * Контекст `GrAvatarGroup`: размер и форма задаются на группе, чтобы ряд\n * аватаров не расползался, когда потребитель забыл повторить пропы у каждого.\n */\nexport interface GrAvatarGroupContext {\n size?: GrSizeWithPx\n shape?: GrAvatarShape\n}\n\nexport const GR_AVATAR_GROUP_KEY: InjectionKey<GrAvatarGroupContext> = Symbol.for('@feugene/granularity/avatar-group')\n","<script setup lang=\"ts\">\nimport { computed, inject, ref, watch } from 'vue'\n\nimport GrSkeleton from '../GrSkeleton/GrSkeleton.vue'\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport type { GrSizeWithPx } from '../shared/sizes'\n\nimport { GR_AVATAR_GROUP_KEY } from './avatarContext'\nimport {\n avatarFontSizePx,\n grAvatarClass,\n initialsFrom,\n mediaClass,\n mediaClipClass,\n rootBaseClass,\n rootStatusClass,\n statusDotClass,\n statusToneClass,\n type GrAvatarShape,\n type GrAvatarStatus,\n} from './grAvatarStyles'\n\nexport type { GrAvatarShape, GrAvatarStatus } from './grAvatarStyles'\n\n/** Диаметр аватара для каждой ступени канонической шкалы. */\nconst GR_AVATAR_SIZE_PX = {\n xs: 24,\n sm: 32,\n md: 40,\n lg: 56,\n} as const\n\nexport interface GrAvatarProps {\n /**\n * Размер по канонической шкале (`xs|sm|md|lg`) — тогда работает\n * `GrConfigProvider`. Число — escape-hatch: аватар нужен произвольного\n * диаметра (24px в строке списка, 96px в профиле), и четыре ступени шкалы\n * этого не закрывают.\n */\n size?: GrSizeWithPx\n src?: string\n /** Резервная картинка: показывается, когда `src` не загрузился. */\n fallbackSrc?: string\n alt?: string\n /** Имя участника: даёт инициалы и доступное имя аватара. */\n name?: string\n shape?: GrAvatarShape\n /** Статус участника. Точка декоративна — рядом идёт скрытая подпись. */\n status?: GrAvatarStatus\n}\n\nconst props = withDefaults(defineProps<GrAvatarProps>(), {\n size: undefined,\n src: undefined,\n fallbackSrc: undefined,\n alt: undefined,\n name: undefined,\n // Дефолт живёт в резолвере: Vue подставил бы свой раньше, чем компонент\n // заглянет в `GrConfigProvider`.\n shape: undefined,\n status: undefined,\n})\n\nconst slots = defineSlots<{\n /** Содержимое вместо картинки и инициалов. */\n default?: () => unknown\n}>()\n\nconst { t } = useGranularityTranslations()\nconst group = inject(GR_AVATAR_GROUP_KEY, null)\n\n// Размер и форма группы сильнее провайдера, но слабее собственного пропа.\nconst localSize = computed(() => props.size ?? group?.size)\n\nconst resolvedScaleSize = useGrComponentSize(\n () => (typeof localSize.value === 'number' ? undefined : localSize.value),\n { component: 'GrAvatar' },\n)\n\nconst resolvedShape = useGrComponentProp(\n 'GrAvatar',\n 'shape',\n () => props.shape ?? group?.shape,\n 'circle',\n)\n\nconst sizePx = computed(() => (\n typeof localSize.value === 'number' ? localSize.value : GR_AVATAR_SIZE_PX[resolvedScaleSize.value]\n))\n\nconst style = computed(() => {\n const px = `${sizePx.value}px`\n // Кегль на корне, а не на span инициалов: так он достаётся и слотовому тексту.\n return { width: px, height: px, fontSize: `${avatarFontSizePx(sizePx.value)}px` }\n})\n\n/**\n * Состояние картинки. Без него битая ссылка оставляла `v-if=\"src\"` истинным:\n * браузер рисовал сломанное изображение, а запасной вариант не показывался\n * никогда.\n */\ntype ImageState = 'loading' | 'loaded' | 'error'\n\nconst primaryState = ref<ImageState>('loading')\nconst fallbackState = ref<ImageState>('loading')\n\n// Новая ссылка не должна наследовать ошибку прошлой.\nwatch(() => props.src, () => {\n primaryState.value = 'loading'\n})\nwatch(() => props.fallbackSrc, () => {\n fallbackState.value = 'loading'\n})\n\nconst activeSrc = computed(() => {\n if (props.src && primaryState.value !== 'error')\n return props.src\n if (props.fallbackSrc && fallbackState.value !== 'error')\n return props.fallbackSrc\n return undefined\n})\n\nconst isFallbackActive = computed(() => Boolean(activeSrc.value) && activeSrc.value !== props.src)\n\n// Скелет держит место, пока картинка едет: иначе ряд аватаров мигает пустотой.\nconst showSkeleton = computed(() => {\n if (!activeSrc.value)\n return false\n return (isFallbackActive.value ? fallbackState.value : primaryState.value) === 'loading'\n})\n\nconst initials = computed(() => (props.name ? initialsFrom(props.name) : ''))\n\n// Пусто — когда нет ни картинки, ни слота, ни имени.\nconst showInitials = computed(() => !activeSrc.value && !slots.default && Boolean(initials.value))\n\nconst statusLabel = computed(() => (props.status\n ? t(`gr.avatar.status.${props.status}`, props.status)\n : undefined))\n\n/**\n * Доступное имя: `alt` сильнее всего, иначе имя участника.\n *\n * Когда есть картинка, имя несёт её `alt` — так привычнее потребителю и не\n * возникает двойного объявления. Без картинки роль и имя берёт на себя корень:\n * иначе аватар с инициалами остался бы для диктора пустым.\n */\nconst accessibleName = computed(() => props.alt ?? props.name ?? '')\n\nconst rootIsImage = computed(() => !activeSrc.value && accessibleName.value !== '')\n\nconst rootClass = computed(() => [\n rootBaseClass,\n grAvatarClass(resolvedShape.value),\n props.status ? rootStatusClass : '',\n])\n\nfunction onError(kind: 'primary' | 'fallback'): void {\n if (kind === 'primary')\n primaryState.value = 'error'\n else fallbackState.value = 'error'\n}\n\nfunction onLoad(kind: 'primary' | 'fallback'): void {\n if (kind === 'primary')\n primaryState.value = 'loaded'\n else fallbackState.value = 'loaded'\n}\n</script>\n\n<template>\n <span\n data-gr-avatar\n :style=\"style\"\n :class=\"rootClass\"\n :role=\"rootIsImage ? 'img' : undefined\"\n :aria-label=\"rootIsImage ? accessibleName : undefined\"\n >\n <span :class=\"[mediaClass, status ? [mediaClipClass, grAvatarClass(resolvedShape)] : '']\">\n <GrSkeleton\n v-if=\"showSkeleton\"\n data-gr-avatar-skeleton\n width=\"100%\"\n height=\"100%\"\n :rounded=\"resolvedShape === 'circle' ? 'var(--gr-radius-full)' : 'var(--gr-avatar-square-radius, 10px)'\"\n />\n\n <img\n v-if=\"activeSrc\"\n :key=\"activeSrc\"\n data-gr-avatar-image\n :src=\"activeSrc\"\n :alt=\"accessibleName\"\n class=\"h-full w-full object-cover\"\n :class=\"showSkeleton ? 'invisible absolute' : ''\"\n @error=\"onError(isFallbackActive ? 'fallback' : 'primary')\"\n @load=\"onLoad(isFallbackActive ? 'fallback' : 'primary')\"\n >\n\n <span v-else-if=\"showInitials\" data-gr-avatar-initials>{{ initials }}</span>\n\n <slot v-else />\n </span>\n\n <template v-if=\"status\">\n <span\n data-gr-avatar-status\n :class=\"[statusDotClass, statusToneClass[status]]\"\n aria-hidden=\"true\"\n />\n <!-- Цвет точки смысл не передаёт: статус объявляется словом (WCAG 1.4.1). -->\n <span data-gr-avatar-status-label class=\"sr-only\">{{ statusLabel }}</span>\n </template>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject, ref, watch } from 'vue'\n\nimport GrSkeleton from '../GrSkeleton/GrSkeleton.vue'\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport type { GrSizeWithPx } from '../shared/sizes'\n\nimport { GR_AVATAR_GROUP_KEY } from './avatarContext'\nimport {\n avatarFontSizePx,\n grAvatarClass,\n initialsFrom,\n mediaClass,\n mediaClipClass,\n rootBaseClass,\n rootStatusClass,\n statusDotClass,\n statusToneClass,\n type GrAvatarShape,\n type GrAvatarStatus,\n} from './grAvatarStyles'\n\nexport type { GrAvatarShape, GrAvatarStatus } from './grAvatarStyles'\n\n/** Диаметр аватара для каждой ступени канонической шкалы. */\nconst GR_AVATAR_SIZE_PX = {\n xs: 24,\n sm: 32,\n md: 40,\n lg: 56,\n} as const\n\nexport interface GrAvatarProps {\n /**\n * Размер по канонической шкале (`xs|sm|md|lg`) — тогда работает\n * `GrConfigProvider`. Число — escape-hatch: аватар нужен произвольного\n * диаметра (24px в строке списка, 96px в профиле), и четыре ступени шкалы\n * этого не закрывают.\n */\n size?: GrSizeWithPx\n src?: string\n /** Резервная картинка: показывается, когда `src` не загрузился. */\n fallbackSrc?: string\n alt?: string\n /** Имя участника: даёт инициалы и доступное имя аватара. */\n name?: string\n shape?: GrAvatarShape\n /** Статус участника. Точка декоративна — рядом идёт скрытая подпись. */\n status?: GrAvatarStatus\n}\n\nconst props = withDefaults(defineProps<GrAvatarProps>(), {\n size: undefined,\n src: undefined,\n fallbackSrc: undefined,\n alt: undefined,\n name: undefined,\n // Дефолт живёт в резолвере: Vue подставил бы свой раньше, чем компонент\n // заглянет в `GrConfigProvider`.\n shape: undefined,\n status: undefined,\n})\n\nconst slots = defineSlots<{\n /** Содержимое вместо картинки и инициалов. */\n default?: () => unknown\n}>()\n\nconst { t } = useGranularityTranslations()\nconst group = inject(GR_AVATAR_GROUP_KEY, null)\n\n// Размер и форма группы сильнее провайдера, но слабее собственного пропа.\nconst localSize = computed(() => props.size ?? group?.size)\n\nconst resolvedScaleSize = useGrComponentSize(\n () => (typeof localSize.value === 'number' ? undefined : localSize.value),\n { component: 'GrAvatar' },\n)\n\nconst resolvedShape = useGrComponentProp(\n 'GrAvatar',\n 'shape',\n () => props.shape ?? group?.shape,\n 'circle',\n)\n\nconst sizePx = computed(() => (\n typeof localSize.value === 'number' ? localSize.value : GR_AVATAR_SIZE_PX[resolvedScaleSize.value]\n))\n\nconst style = computed(() => {\n const px = `${sizePx.value}px`\n // Кегль на корне, а не на span инициалов: так он достаётся и слотовому тексту.\n return { width: px, height: px, fontSize: `${avatarFontSizePx(sizePx.value)}px` }\n})\n\n/**\n * Состояние картинки. Без него битая ссылка оставляла `v-if=\"src\"` истинным:\n * браузер рисовал сломанное изображение, а запасной вариант не показывался\n * никогда.\n */\ntype ImageState = 'loading' | 'loaded' | 'error'\n\nconst primaryState = ref<ImageState>('loading')\nconst fallbackState = ref<ImageState>('loading')\n\n// Новая ссылка не должна наследовать ошибку прошлой.\nwatch(() => props.src, () => {\n primaryState.value = 'loading'\n})\nwatch(() => props.fallbackSrc, () => {\n fallbackState.value = 'loading'\n})\n\nconst activeSrc = computed(() => {\n if (props.src && primaryState.value !== 'error')\n return props.src\n if (props.fallbackSrc && fallbackState.value !== 'error')\n return props.fallbackSrc\n return undefined\n})\n\nconst isFallbackActive = computed(() => Boolean(activeSrc.value) && activeSrc.value !== props.src)\n\n// Скелет держит место, пока картинка едет: иначе ряд аватаров мигает пустотой.\nconst showSkeleton = computed(() => {\n if (!activeSrc.value)\n return false\n return (isFallbackActive.value ? fallbackState.value : primaryState.value) === 'loading'\n})\n\nconst initials = computed(() => (props.name ? initialsFrom(props.name) : ''))\n\n// Пусто — когда нет ни картинки, ни слота, ни имени.\nconst showInitials = computed(() => !activeSrc.value && !slots.default && Boolean(initials.value))\n\nconst statusLabel = computed(() => (props.status\n ? t(`gr.avatar.status.${props.status}`, props.status)\n : undefined))\n\n/**\n * Доступное имя: `alt` сильнее всего, иначе имя участника.\n *\n * Когда есть картинка, имя несёт её `alt` — так привычнее потребителю и не\n * возникает двойного объявления. Без картинки роль и имя берёт на себя корень:\n * иначе аватар с инициалами остался бы для диктора пустым.\n */\nconst accessibleName = computed(() => props.alt ?? props.name ?? '')\n\nconst rootIsImage = computed(() => !activeSrc.value && accessibleName.value !== '')\n\nconst rootClass = computed(() => [\n rootBaseClass,\n grAvatarClass(resolvedShape.value),\n props.status ? rootStatusClass : '',\n])\n\nfunction onError(kind: 'primary' | 'fallback'): void {\n if (kind === 'primary')\n primaryState.value = 'error'\n else fallbackState.value = 'error'\n}\n\nfunction onLoad(kind: 'primary' | 'fallback'): void {\n if (kind === 'primary')\n primaryState.value = 'loaded'\n else fallbackState.value = 'loaded'\n}\n</script>\n\n<template>\n <span\n data-gr-avatar\n :style=\"style\"\n :class=\"rootClass\"\n :role=\"rootIsImage ? 'img' : undefined\"\n :aria-label=\"rootIsImage ? accessibleName : undefined\"\n >\n <span :class=\"[mediaClass, status ? [mediaClipClass, grAvatarClass(resolvedShape)] : '']\">\n <GrSkeleton\n v-if=\"showSkeleton\"\n data-gr-avatar-skeleton\n width=\"100%\"\n height=\"100%\"\n :rounded=\"resolvedShape === 'circle' ? 'var(--gr-radius-full)' : 'var(--gr-avatar-square-radius, 10px)'\"\n />\n\n <img\n v-if=\"activeSrc\"\n :key=\"activeSrc\"\n data-gr-avatar-image\n :src=\"activeSrc\"\n :alt=\"accessibleName\"\n class=\"h-full w-full object-cover\"\n :class=\"showSkeleton ? 'invisible absolute' : ''\"\n @error=\"onError(isFallbackActive ? 'fallback' : 'primary')\"\n @load=\"onLoad(isFallbackActive ? 'fallback' : 'primary')\"\n >\n\n <span v-else-if=\"showInitials\" data-gr-avatar-initials>{{ initials }}</span>\n\n <slot v-else />\n </span>\n\n <template v-if=\"status\">\n <span\n data-gr-avatar-status\n :class=\"[statusDotClass, statusToneClass[status]]\"\n aria-hidden=\"true\"\n />\n <!-- Цвет точки смысл не передаёт: статус объявляется словом (WCAG 1.4.1). -->\n <span data-gr-avatar-status-label class=\"sr-only\">{{ statusLabel }}</span>\n </template>\n </span>\n</template>\n","<script setup lang=\"ts\">\n/**\n * GrAvatarGroup — ряд аватаров со стекингом и счётчиком скрытых.\n *\n * Группа объявлена `role=\"group\"` с именем и числом участников: без этого\n * скринридер читает набор безымянных картинок и не понимает, что их больше,\n * чем видно.\n */\nimport { computed, provide, type VNode } from 'vue'\n\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport type { GrSizeWithPx } from '../shared/sizes'\n\nimport { GR_AVATAR_GROUP_KEY } from './avatarContext'\nimport {\n avatarFontSizePx,\n grAvatarClass,\n groupBaseClass,\n groupItemClass,\n groupOverflowClass,\n rootBaseClass,\n type GrAvatarShape,\n} from './grAvatarStyles'\n\nconst GR_AVATAR_GROUP_SIZE_PX = {\n xs: 24,\n sm: 32,\n md: 40,\n lg: 56,\n} as const\n\nexport interface GrAvatarGroupProps {\n /** Размер и форма ряда: дети берут их из контекста. */\n size?: GrSizeWithPx\n shape?: GrAvatarShape\n /** Сколько аватаров показывать; остальные сворачиваются в «+N». */\n max?: number\n /** Сколько участников всего, если в слоте лежит лишь часть. */\n total?: number\n /** Имя группы. Не задано — берётся из локали. */\n ariaLabel?: string\n}\n\nconst props = withDefaults(defineProps<GrAvatarGroupProps>(), {\n size: undefined,\n shape: undefined,\n max: undefined,\n total: undefined,\n ariaLabel: undefined,\n})\n\nconst slots = defineSlots<{\n /** Аватары ряда. */\n default?: () => VNode[]\n}>()\n\nconst { t } = useGranularityTranslations()\n\nprovide(GR_AVATAR_GROUP_KEY, {\n get size() {\n return props.size\n },\n get shape() {\n return props.shape\n },\n})\n\nconst children = computed(() => slots.default?.() ?? [])\n\n// `v-for` внутри слота приходит фрагментом — считаем его детей, иначе весь\n// список выглядел бы одним аватаром.\nconst items = computed<VNode[]>(() => children.value.flatMap((node) => {\n const nested = node.children\n return Array.isArray(nested) && typeof node.type === 'symbol' ? (nested as VNode[]) : [node]\n}))\n\nconst visible = computed(() => (props.max === undefined ? items.value : items.value.slice(0, Math.max(0, props.max))))\n\nconst hiddenCount = computed(() => {\n const total = props.total ?? items.value.length\n return Math.max(0, total - visible.value.length)\n})\n\nconst overflowSizePx = computed(() => (\n typeof props.size === 'number' ? props.size : GR_AVATAR_GROUP_SIZE_PX[props.size ?? 'md']\n))\n\nconst overflowStyle = computed(() => {\n const px = `${overflowSizePx.value}px`\n return { width: px, height: px, fontSize: `${avatarFontSizePx(overflowSizePx.value)}px` }\n})\n\nconst groupLabel = computed(() => props.ariaLabel ?? t('gr.avatar.group', 'People'))\n\nconst accessibleLabel = computed(() => (hiddenCount.value > 0\n ? `${groupLabel.value}, ${t('gr.avatar.groupOverflow', 'and {count} more', { count: hiddenCount.value, n: hiddenCount.value })}`\n : groupLabel.value))\n</script>\n\n<template>\n <div\n data-gr-avatar-group\n role=\"group\"\n :aria-label=\"accessibleLabel\"\n :class=\"groupBaseClass\"\n >\n <component\n :is=\"node\"\n v-for=\"(node, index) in visible\"\n :key=\"index\"\n :class=\"groupItemClass\"\n />\n\n <span\n v-if=\"hiddenCount > 0\"\n data-gr-avatar-group-overflow\n aria-hidden=\"true\"\n :class=\"[rootBaseClass, groupOverflowClass, groupItemClass, grAvatarClass(shape ?? 'circle')]\"\n :style=\"overflowStyle\"\n >+{{ hiddenCount }}</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * GrAvatarGroup — ряд аватаров со стекингом и счётчиком скрытых.\n *\n * Группа объявлена `role=\"group\"` с именем и числом участников: без этого\n * скринридер читает набор безымянных картинок и не понимает, что их больше,\n * чем видно.\n */\nimport { computed, provide, type VNode } from 'vue'\n\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport type { GrSizeWithPx } from '../shared/sizes'\n\nimport { GR_AVATAR_GROUP_KEY } from './avatarContext'\nimport {\n avatarFontSizePx,\n grAvatarClass,\n groupBaseClass,\n groupItemClass,\n groupOverflowClass,\n rootBaseClass,\n type GrAvatarShape,\n} from './grAvatarStyles'\n\nconst GR_AVATAR_GROUP_SIZE_PX = {\n xs: 24,\n sm: 32,\n md: 40,\n lg: 56,\n} as const\n\nexport interface GrAvatarGroupProps {\n /** Размер и форма ряда: дети берут их из контекста. */\n size?: GrSizeWithPx\n shape?: GrAvatarShape\n /** Сколько аватаров показывать; остальные сворачиваются в «+N». */\n max?: number\n /** Сколько участников всего, если в слоте лежит лишь часть. */\n total?: number\n /** Имя группы. Не задано — берётся из локали. */\n ariaLabel?: string\n}\n\nconst props = withDefaults(defineProps<GrAvatarGroupProps>(), {\n size: undefined,\n shape: undefined,\n max: undefined,\n total: undefined,\n ariaLabel: undefined,\n})\n\nconst slots = defineSlots<{\n /** Аватары ряда. */\n default?: () => VNode[]\n}>()\n\nconst { t } = useGranularityTranslations()\n\nprovide(GR_AVATAR_GROUP_KEY, {\n get size() {\n return props.size\n },\n get shape() {\n return props.shape\n },\n})\n\nconst children = computed(() => slots.default?.() ?? [])\n\n// `v-for` внутри слота приходит фрагментом — считаем его детей, иначе весь\n// список выглядел бы одним аватаром.\nconst items = computed<VNode[]>(() => children.value.flatMap((node) => {\n const nested = node.children\n return Array.isArray(nested) && typeof node.type === 'symbol' ? (nested as VNode[]) : [node]\n}))\n\nconst visible = computed(() => (props.max === undefined ? items.value : items.value.slice(0, Math.max(0, props.max))))\n\nconst hiddenCount = computed(() => {\n const total = props.total ?? items.value.length\n return Math.max(0, total - visible.value.length)\n})\n\nconst overflowSizePx = computed(() => (\n typeof props.size === 'number' ? props.size : GR_AVATAR_GROUP_SIZE_PX[props.size ?? 'md']\n))\n\nconst overflowStyle = computed(() => {\n const px = `${overflowSizePx.value}px`\n return { width: px, height: px, fontSize: `${avatarFontSizePx(overflowSizePx.value)}px` }\n})\n\nconst groupLabel = computed(() => props.ariaLabel ?? t('gr.avatar.group', 'People'))\n\nconst accessibleLabel = computed(() => (hiddenCount.value > 0\n ? `${groupLabel.value}, ${t('gr.avatar.groupOverflow', 'and {count} more', { count: hiddenCount.value, n: hiddenCount.value })}`\n : groupLabel.value))\n</script>\n\n<template>\n <div\n data-gr-avatar-group\n role=\"group\"\n :aria-label=\"accessibleLabel\"\n :class=\"groupBaseClass\"\n >\n <component\n :is=\"node\"\n v-for=\"(node, index) in visible\"\n :key=\"index\"\n :class=\"groupItemClass\"\n />\n\n <span\n v-if=\"hiddenCount > 0\"\n data-gr-avatar-group-overflow\n aria-hidden=\"true\"\n :class=\"[rootBaseClass, groupOverflowClass, groupItemClass, grAvatarClass(shape ?? 'circle')]\"\n :style=\"overflowStyle\"\n >+{{ hiddenCount }}</span>\n </div>\n</template>\n"],"mappings":"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"}