@feugene/granularity 0.47.0 → 0.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/README.md +3 -3
  2. package/dist/chunks/{config-2vrOFn2f.js → config-AKpLyIGD.js} +2 -2
  3. package/dist/chunks/{config-2vrOFn2f.js.map → config-AKpLyIGD.js.map} +1 -1
  4. package/dist/chunks/config-BBtBQE3s.js +108 -0
  5. package/dist/chunks/config-BBtBQE3s.js.map +1 -0
  6. package/dist/chunks/{config-DeyT9dJl.js → config-Bs1HwUcx.js} +47 -4
  7. package/dist/chunks/{config-DeyT9dJl.js.map → config-Bs1HwUcx.js.map} +1 -1
  8. package/dist/chunks/{config-B3J0alyY.js → config-CzeZg2LO.js} +49 -4
  9. package/dist/chunks/config-CzeZg2LO.js.map +1 -0
  10. package/dist/chunks/{config-DCq4JySZ.js → config-D3HOuHDe.js} +1 -1
  11. package/dist/chunks/{config-DCq4JySZ.js.map → config-D3HOuHDe.js.map} +1 -1
  12. package/dist/chunks/{config-BscVxZR3.js → config-DF1ezU6y.js} +1 -1
  13. package/dist/chunks/{config-BscVxZR3.js.map → config-DF1ezU6y.js.map} +1 -1
  14. package/dist/chunks/config-MUkhktTP.js +267 -0
  15. package/dist/chunks/config-MUkhktTP.js.map +1 -0
  16. package/dist/chunks/{en-DjTnfTqM.js → en-CsQUoBS2.js} +14 -2
  17. package/dist/chunks/en-CsQUoBS2.js.map +1 -0
  18. package/dist/chunks/{es-Bc_t3FI8.js → es-9nbkPvdA.js} +14 -2
  19. package/dist/chunks/es-9nbkPvdA.js.map +1 -0
  20. package/dist/chunks/{es-DIFzSXSZ.js → es-DrUz5J6I.js} +3 -3
  21. package/dist/chunks/{es-DIFzSXSZ.js.map → es-DrUz5J6I.js.map} +1 -1
  22. package/dist/chunks/{generated-CQ4h6Ieq.js → generated-CxvC5O0V.js} +140 -0
  23. package/dist/chunks/{generated-CQ4h6Ieq.js.map → generated-CxvC5O0V.js.map} +1 -1
  24. package/dist/chunks/{grBadgeStyles-DV0DrAew.js → grBadgeStyles-D51AXbj5.js} +57 -1
  25. package/dist/chunks/grBadgeStyles-D51AXbj5.js.map +1 -0
  26. package/dist/chunks/{grChipStyles-DcDyxAL0.js → grChipStyles-CA9Wj1_E.js} +1 -1
  27. package/dist/chunks/{grChipStyles-DcDyxAL0.js.map → grChipStyles-CA9Wj1_E.js.map} +1 -1
  28. package/dist/chunks/{grTableStyles-uuMPSOBR.js → grTableStyles-DkQPMfx9.js} +16 -3
  29. package/dist/chunks/grTableStyles-DkQPMfx9.js.map +1 -0
  30. package/dist/chunks/{granular-provider-AKukmYva.js → granular-provider-B6xomapW.js} +8 -6
  31. package/dist/chunks/granular-provider-B6xomapW.js.map +1 -0
  32. package/dist/chunks/{ru-Bb-co59W.js → ru-88i1WG0b.js} +14 -2
  33. package/dist/chunks/ru-88i1WG0b.js.map +1 -0
  34. package/dist/chunks/{safelist-x8USecK8.js → safelist-CSfynUC1.js} +5 -1
  35. package/dist/chunks/safelist-CSfynUC1.js.map +1 -0
  36. package/dist/components/GrAutocomplete/chunks/{GrAutocomplete-C-uovdv8.js → GrAutocomplete-Chhw65pI.js} +2 -2
  37. package/dist/components/GrAutocomplete/chunks/{GrAutocomplete-C-uovdv8.js.map → GrAutocomplete-Chhw65pI.js.map} +1 -1
  38. package/dist/components/GrAutocomplete/index.js +1 -1
  39. package/dist/components/GrAvatar/chunks/{GrAvatar-dWEXiCJG.js → GrAvatar-Do5-C409.js} +12 -1
  40. package/dist/components/GrAvatar/chunks/GrAvatar-Do5-C409.js.map +1 -0
  41. package/dist/components/GrAvatar/index.js +2 -2
  42. package/dist/components/GrAvatar/themes/light.css +35 -0
  43. package/dist/components/GrBadge/chunks/GrBadge-C42KLyUD.js +71 -0
  44. package/dist/components/GrBadge/chunks/GrBadge-C42KLyUD.js.map +1 -0
  45. package/dist/components/GrBadge/index.js +3 -3
  46. package/dist/components/GrBadge/styles.css +1 -1
  47. package/dist/components/GrChip/chunks/{GrChip-CKqyzYcv.js → GrChip-DoyS1Dr4.js} +1 -1
  48. package/dist/components/GrChip/chunks/{GrChip-CKqyzYcv.js.map → GrChip-DoyS1Dr4.js.map} +1 -1
  49. package/dist/components/GrChip/index.js +2 -2
  50. package/dist/components/GrDataTable/chunks/{GrDataTable-Dp9Fp_P5.js → GrDataTable-DQxYYgQk.js} +438 -160
  51. package/dist/components/GrDataTable/chunks/GrDataTable-DQxYYgQk.js.map +1 -0
  52. package/dist/components/GrDataTable/index.js +2 -2
  53. package/dist/components/GrDataTable/themes/light.css +10 -0
  54. package/dist/components/GrInputTag/chunks/{GrInputTag-CO0YU-ok.js → GrInputTag-qnRdAZnn.js} +2 -2
  55. package/dist/components/GrInputTag/chunks/{GrInputTag-CO0YU-ok.js.map → GrInputTag-qnRdAZnn.js.map} +1 -1
  56. package/dist/components/GrInputTag/index.js +1 -1
  57. package/dist/components/GrOtpInput/chunks/GrOtpInput-B_Q-RDLw.js +419 -0
  58. package/dist/components/GrOtpInput/chunks/GrOtpInput-B_Q-RDLw.js.map +1 -0
  59. package/dist/components/GrOtpInput/index.js +3 -0
  60. package/dist/components/GrOtpInput/styles.css +1 -0
  61. package/dist/components/GrPagination/chunks/{GrPagination-BbaF5eXk.js → GrPagination-CMrLPzvL.js} +1 -1
  62. package/dist/components/GrPagination/chunks/{GrPagination-BbaF5eXk.js.map → GrPagination-CMrLPzvL.js.map} +1 -1
  63. package/dist/components/GrPagination/index.js +1 -1
  64. package/dist/components/GrSelect/chunks/{GrSelect-0iI4wdR_.js → GrSelect-DvSq-nV-.js} +2 -2
  65. package/dist/components/GrSelect/chunks/{GrSelect-0iI4wdR_.js.map → GrSelect-DvSq-nV-.js.map} +1 -1
  66. package/dist/components/GrSelect/index.js +1 -1
  67. package/dist/components/GrSwitch/chunks/{GrSwitch-CriHWT2A.js → GrSwitch-D7X42uIA.js} +61 -7
  68. package/dist/components/GrSwitch/chunks/GrSwitch-D7X42uIA.js.map +1 -0
  69. package/dist/components/GrSwitch/index.js +2 -2
  70. package/dist/components/GrTable/chunks/{GrTable-iwzHvlMC.js → GrTable-CKJ-HrsN.js} +1 -1
  71. package/dist/components/GrTable/chunks/{GrTable-iwzHvlMC.js.map → GrTable-CKJ-HrsN.js.map} +1 -1
  72. package/dist/components/GrTable/index.js +2 -2
  73. package/dist/granular-provider-node.js +1 -1
  74. package/dist/granular-provider.js +1 -1
  75. package/dist/i18n/all.js +1 -1
  76. package/dist/i18n/index.js +1 -1
  77. package/dist/index.js +20 -19
  78. package/dist/theme.js +1 -1
  79. package/dist/tokens.js +1 -1
  80. package/dist/types/components/GrAvatar/GrAvatar.vue.d.ts +11 -0
  81. package/dist/types/components/GrAvatar/defaults.d.ts +1 -0
  82. package/dist/types/components/GrAvatar/grAvatarStyles.d.ts +26 -1
  83. package/dist/types/components/GrBadge/GrBadge.vue.d.ts +15 -1
  84. package/dist/types/components/GrBadge/grBadgeStyles.d.ts +57 -0
  85. package/dist/types/components/GrBadge/index.d.ts +1 -1
  86. package/dist/types/components/GrDataTable/GrDataTable.vue.d.ts +59 -0
  87. package/dist/types/components/GrDataTable/composables/useDataTableExpansion.d.ts +46 -0
  88. package/dist/types/components/GrDataTable/grDataTableStyles.d.ts +23 -0
  89. package/dist/types/components/GrOtpInput/GrOtpInput.vue.d.ts +164 -0
  90. package/dist/types/components/GrOtpInput/config.d.ts +1 -0
  91. package/dist/types/components/GrOtpInput/defaults.d.ts +15 -0
  92. package/dist/types/components/GrOtpInput/grOtpInputStyles.d.ts +62 -0
  93. package/dist/types/components/GrOtpInput/index.d.ts +9 -0
  94. package/dist/types/components/GrOtpInput/otpValue.d.ts +71 -0
  95. package/dist/types/components/GrOtpInput/safelist.d.ts +7 -0
  96. package/dist/types/components/GrSwitch/GrSwitch.vue.d.ts +42 -4
  97. package/dist/types/components/GrSwitch/defaults.d.ts +2 -0
  98. package/dist/types/components/GrSwitch/grSwitchStyles.d.ts +129 -25
  99. package/dist/types/components/GrSwitch/index.d.ts +1 -1
  100. package/dist/types/components/GrSwitch/safelist.d.ts +4 -3
  101. package/dist/types/components/GrTable/grTableStyles.d.ts +16 -3
  102. package/dist/types/granular-provider/shared.d.ts +1 -0
  103. package/dist/types/i18n/messages/en.d.ts +20 -0
  104. package/dist/types/i18n/messages/es.d.ts +20 -0
  105. package/dist/types/i18n/messages/ru.d.ts +20 -0
  106. package/dist/types/index.d.ts +1 -0
  107. package/dist/web-types.json +329 -8
  108. package/package.json +5 -1
  109. package/dist/chunks/config-B3J0alyY.js.map +0 -1
  110. package/dist/chunks/config-Yy67uWHY.js +0 -140
  111. package/dist/chunks/config-Yy67uWHY.js.map +0 -1
  112. package/dist/chunks/en-DjTnfTqM.js.map +0 -1
  113. package/dist/chunks/es-Bc_t3FI8.js.map +0 -1
  114. package/dist/chunks/grBadgeStyles-DV0DrAew.js.map +0 -1
  115. package/dist/chunks/grTableStyles-uuMPSOBR.js.map +0 -1
  116. package/dist/chunks/granular-provider-AKukmYva.js.map +0 -1
  117. package/dist/chunks/ru-Bb-co59W.js.map +0 -1
  118. package/dist/chunks/safelist-x8USecK8.js.map +0 -1
  119. package/dist/components/GrAvatar/chunks/GrAvatar-dWEXiCJG.js.map +0 -1
  120. package/dist/components/GrBadge/chunks/GrBadge-DBeQXEir.js +0 -47
  121. package/dist/components/GrBadge/chunks/GrBadge-DBeQXEir.js.map +0 -1
  122. package/dist/components/GrDataTable/chunks/GrDataTable-Dp9Fp_P5.js.map +0 -1
  123. package/dist/components/GrSwitch/chunks/GrSwitch-CriHWT2A.js.map +0 -1
@@ -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":"grBadgeStyles-DV0DrAew.js","names":[],"sources":["../../src/components/GrBadge/grBadgeStyles.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nimport type { GrTone } from '../shared/tones'\n\nexport type GrBadgeTone = GrTone\nexport type GrBadgeSize = GrComponentSize\nexport type GrBadgeRadius = 'square' | 'semi' | 'round'\nexport const sizeClassBySize: Record<GrBadgeSize, string> = {\n xs: 'px-2 py-0.4 text-[length:var(--gr-control-text-2xs)] leading-[var(--gr-control-leading-2xs)]',\n sm: 'px-2.5 py-0.5 text-[length:var(--gr-control-text-xs)] leading-[var(--gr-control-leading-xs)]',\n md: 'px-3 py-1 text-[length:var(--gr-control-text-sm)] leading-[var(--gr-control-leading-sm)]',\n lg: 'px-3.5 py-1.5 text-[length:var(--gr-control-text-md)] leading-[var(--gr-control-leading-md)]',\n}\n/**\n * Иконка перед подписью растёт медленнее кегля: на нижних ступенях плашка\n * узкая, и иконка «один в один с текстом» разгоняла бы её по высоте.\n *\n * Своя карта, а не заимствованная у `GrChip`: у чипа фиксированная высота\n * плитки и своя шкала кегля, и совпадение значений на средних ступенях —\n * совпадение, а не общий контракт.\n */\nexport const badgeIconSizeClassBySize: Record<GrBadgeSize, string> = {\n xs: 'h-3 w-3',\n sm: 'h-3.5 w-3.5',\n md: 'h-4 w-4',\n lg: 'h-4 w-4',\n}\n\n/** Иконка не жмётся: подпись бейджа не переносится, сжиматься должно нечему. */\nexport const badgeIconClass = 'shrink-0'\n\nexport const semiRadiusClassBySize: Record<GrBadgeSize, string> = {\n xs: 'rounded-[var(--gr-badge-semi-radius-xs,3px)]',\n sm: 'rounded-[var(--gr-badge-semi-radius-sm,3px)]',\n md: 'rounded-[var(--gr-badge-semi-radius-md,5px)]',\n lg: 'rounded-[var(--gr-badge-semi-radius-lg,7px)]',\n}\nexport const lightToneClassByTone: Record<GrBadgeTone, string> = {\n neutral: 'bg-[var(--gr-muted)] text-[var(--gr-fg)] border-[var(--gr-brd)]',\n primary:\n 'bg-[var(--gr-accent)] text-[var(--gr-accent-fg)] border-[color-mix(in_srgb,var(--gr-primary)_30%,var(--gr-accent))]',\n // Текст на тонированной подложке — только `-text`, никогда не насыщенный тон:\n // `--gr-success` на `--gr-success-light` даёт 2.24:1, `-text` — 6.78:1.\n // slate/azure ниже уже были сделаны правильно.\n success: 'bg-[var(--gr-success-light)] text-[var(--gr-success-text)] border-[color-mix(in_srgb,var(--gr-success)_30%,var(--gr-success-light))]',\n warning: 'bg-[var(--gr-warning-light)] text-[var(--gr-warning-text)] border-[color-mix(in_srgb,var(--gr-warning)_30%,var(--gr-warning-light))]',\n danger: 'bg-[var(--gr-danger-light)] text-[var(--gr-danger-text)] border-[color-mix(in_srgb,var(--gr-danger)_30%,var(--gr-danger-light))]',\n info: 'bg-[var(--gr-info-light)] text-[var(--gr-info-text)] border-[color-mix(in_srgb,var(--gr-info)_30%,var(--gr-info-light))]',\n slate: 'bg-[var(--gr-slate-light)] text-[var(--gr-slate-text)] border-[color-mix(in_srgb,var(--gr-slate)_30%,var(--gr-slate-light))]',\n azure: 'bg-[var(--gr-azure-light)] text-[var(--gr-azure-text)] border-[color-mix(in_srgb,var(--gr-azure)_30%,var(--gr-azure-light))]',\n}\n/**\n * Заливка filled-бейджа идёт через покомпонентный слой `--gr-badge-{tone}-*`, а\n * не напрямую из роли тона, потому что нужный вес у тем разный.\n *\n * В светлой теме `--gr-{tone}` — это яркая заливка под **тёмный** текст (`-fg`\n * там обязан быть тёмным: белый на `--gr-success` даёт 2.54:1), и filled-бейдж\n * читался как тяжёлая почти чёрная плашка. Слой уводит его на `-solid`/`-solid-fg`\n * — заливку кнопочного веса под светлый текст, ту же, что у solid-кнопок.\n * В тёмной теме пастельная заливка с тёмным текстом — штатная конвенция, и слой\n * оставляет прежние роли. Значения — `themes/{light,dark}.css`.\n */\nexport const darkToneClassByTone: Record<GrBadgeTone, string> = {\n // Нейтральный вес — инверсия страницы, а не тон: `-solid`-роли у него нет.\n neutral: 'bg-[var(--gr-badge-neutral-bg,var(--gr-fg))] text-[var(--gr-badge-neutral-fg,var(--gr-bg))] border-[color-mix(in_srgb,var(--gr-fg)_35%,var(--gr-brd))]',\n primary: 'bg-[var(--gr-badge-primary-bg,var(--gr-primary-solid))] text-[var(--gr-badge-primary-fg,var(--gr-primary-solid-fg))] border-[var(--gr-badge-primary-bg,var(--gr-primary-solid))]',\n success: 'bg-[var(--gr-badge-success-bg,var(--gr-success-solid))] text-[var(--gr-badge-success-fg,var(--gr-success-solid-fg))] border-[var(--gr-badge-success-bg,var(--gr-success-solid))]',\n warning: 'bg-[var(--gr-badge-warning-bg,var(--gr-warning-solid))] text-[var(--gr-badge-warning-fg,var(--gr-warning-solid-fg))] border-[var(--gr-badge-warning-bg,var(--gr-warning-solid))]',\n danger: 'bg-[var(--gr-badge-danger-bg,var(--gr-danger-solid))] text-[var(--gr-badge-danger-fg,var(--gr-danger-solid-fg))] border-[var(--gr-badge-danger-bg,var(--gr-danger-solid))]',\n info: 'bg-[var(--gr-badge-info-bg,var(--gr-info-solid))] text-[var(--gr-badge-info-fg,var(--gr-info-solid-fg))] border-[var(--gr-badge-info-bg,var(--gr-info-solid))]',\n slate: 'bg-[var(--gr-badge-slate-bg,var(--gr-slate-solid))] text-[var(--gr-badge-slate-fg,var(--gr-slate-solid-fg))] border-[var(--gr-badge-slate-bg,var(--gr-slate-solid))]',\n azure: 'bg-[var(--gr-badge-azure-bg,var(--gr-azure-solid))] text-[var(--gr-badge-azure-fg,var(--gr-azure-solid-fg))] border-[var(--gr-badge-azure-bg,var(--gr-azure-solid))]',\n}\n/**\n * Экспортируются ради `GrChip`: у чипа те же три радиуса и та же палитра тонов,\n * и копия этих двух ветвлений разошлась бы с оригиналом молча. Свои у чипа\n * только размеры — он интерактивен, и цель нажатия у него не метки, а контрола.\n */\nexport function radiusClass(radius: GrBadgeRadius, size: GrBadgeSize): string {\n if (radius === 'square')\n return 'rounded-[var(--gr-radius-none)]'\n if (radius === 'semi')\n return semiRadiusClassBySize[size]\n return 'rounded-[var(--gr-radius-full)]'\n}\nexport function toneClass(tone: GrBadgeTone, dark: boolean): string {\n return dark ? darkToneClassByTone[tone] : lightToneClassByTone[tone]\n}\nexport function grBadgeClass(options: { tone: GrBadgeTone, dark: boolean, size: GrBadgeSize, radius: GrBadgeRadius }): string {\n return [\n radiusClass(options.radius, options.size),\n sizeClassBySize[options.size],\n toneClass(options.tone, options.dark),\n ].join(' ')\n}\n"],"mappings":";AAOA,IAAa,kBAA+C;CAC1D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;;;;;AASA,IAAa,2BAAwD;CACnE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,iBAAiB;AAE9B,IAAa,wBAAqD;CAChE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AACA,IAAa,uBAAoD;CAC/D,SAAS;CACT,SACE;CAIF,SAAS;CACT,SAAS;CACT,QAAQ;CACR,MAAM;CACN,OAAO;CACP,OAAO;AACT;;;;;;;;;;;;AAYA,IAAa,sBAAmD;CAE9D,SAAS;CACT,SAAS;CACT,SAAS;CACT,SAAS;CACT,QAAQ;CACR,MAAM;CACN,OAAO;CACP,OAAO;AACT;;;;;;AAMA,SAAgB,YAAY,QAAuB,MAA2B;CAC5E,IAAI,WAAW,UACb,OAAO;CACT,IAAI,WAAW,QACb,OAAO,sBAAsB;CAC/B,OAAO;AACT;AACA,SAAgB,UAAU,MAAmB,MAAuB;CAClE,OAAO,OAAO,oBAAoB,QAAQ,qBAAqB;AACjE;AACA,SAAgB,aAAa,SAAiG;CAC5H,OAAO;EACL,YAAY,QAAQ,QAAQ,QAAQ,IAAI;EACxC,gBAAgB,QAAQ;EACxB,UAAU,QAAQ,MAAM,QAAQ,IAAI;CACtC,CAAC,CAAC,KAAK,GAAG;AACZ"}
@@ -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":"granular-provider-AKukmYva.js","names":[],"sources":["../../src/components/GrDialog/config.ts","../../src/components/GrResponseErrorBanner/config.ts","../../src/granular-provider/shared.ts","../../src/granular-provider/index.ts"],"sourcesContent":["import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grDialogSafelist } from './safelist'\n\nexport const grDialogConfig = defineGranularComponent(import.meta.url, {\n name: 'GrDialog',\n dependencies: ['GrButton', 'GrModal'],\n safelist: grDialogSafelist,\n})\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nexport const grResponseErrorBannerConfig = defineGranularComponent(import.meta.url, {\n name: 'GrResponseErrorBanner',\n dependencies: ['GrAlert', 'GrButton'],\n})\n","// `id`, `theme.*`, `packageBaseUrl` и реестр компонентов провайдера.\n//\n// Все `new URL('../styles/...', import.meta.url)` обязаны лежать именно здесь:\n// `shared.ts` в одной директории с `index.ts` / `node.ts`, поэтому\n// относительные пути совпадают. Для браузера безопасно — бандлеры\n// транслируют такие литералы в статические asset-URL.\n//\n// `apps/showcase/scripts/generate-component-api.mjs` читает список компонентов\n// из `Object.keys(granularityComponentConfigs)` через vite SSR.\nimport {\n defineGranularProvider,\n type GranularComponentDescriptor,\n type GranularProvider,\n resolvePackageBaseUrl,\n} from '@feugene/unocss-preset-granular/contract'\n// <granularity:components:imports> — блок генерируется `yarn generate:registry`\nimport { grAffixConfig } from '../components/GrAffix/config'\nimport { grAlertConfig } from '../components/GrAlert/config'\nimport { grAutocompleteConfig } from '../components/GrAutocomplete/config'\nimport { grAvatarConfig } from '../components/GrAvatar/config'\nimport { grBadgeConfig } from '../components/GrBadge/config'\nimport { grBadgeWrapConfig } from '../components/GrBadgeWrap/config'\nimport { grBottomNavConfig } from '../components/GrBottomNav/config'\nimport { grBreadcrumbsConfig } from '../components/GrBreadcrumbs/config'\nimport { grButtonConfig } from '../components/GrButton/config'\nimport { grButtonGroupConfig } from '../components/GrButtonGroup/config'\nimport { grCardConfig } from '../components/GrCard/config'\nimport { grCarouselConfig } from '../components/GrCarousel/config'\nimport { grCheckboxConfig } from '../components/GrCheckbox/config'\nimport { grCheckboxGroupConfig } from '../components/GrCheckboxGroup/config'\nimport { grChipConfig } from '../components/GrChip/config'\nimport { grChipGroupConfig } from '../components/GrChipGroup/config'\nimport { grCollapseConfig } from '../components/GrCollapse/config'\nimport { grColorPickerConfig } from '../components/GrColorPicker/config'\nimport { grCommandPaletteConfig } from '../components/GrCommandPalette/config'\nimport { grConfigProviderConfig } from '../components/GrConfigProvider/config'\nimport { grConfirmDialogConfig } from '../components/GrConfirmDialog/config'\nimport { grContextMenuConfig } from '../components/GrContextMenu/config'\nimport { grDataTableConfig } from '../components/GrDataTable/config'\nimport { grDeltaConfig } from '../components/GrDelta/config'\nimport { grDescriptionListConfig } from '../components/GrDescriptionList/config'\nimport { grDialogConfig } from '../components/GrDialog/config'\nimport { grDialogServiceConfig } from '../components/GrDialogService/config'\nimport { grDividerConfig } from '../components/GrDivider/config'\nimport { grDrawerConfig } from '../components/GrDrawer/config'\nimport { grDropdownConfig } from '../components/GrDropdown/config'\nimport { grDropdownMenuConfig } from '../components/GrDropdownMenu/config'\nimport { grEmptyStateConfig } from '../components/GrEmptyState/config'\nimport { grFilePreviewConfig } from '../components/GrFilePreview/config'\nimport { grFileUploadConfig } from '../components/GrFileUpload/config'\nimport { grFormConfig } from '../components/GrForm/config'\nimport { grFormFieldConfig } from '../components/GrFormField/config'\nimport { grFormFileConfig } from '../components/GrFormFile/config'\nimport { grFormSectionConfig } from '../components/GrFormSection/config'\nimport { grIconConfig } from '../components/GrIcon/config'\nimport { grImageViewerConfig } from '../components/GrImageViewer/config'\nimport { grInputConfig } from '../components/GrInput/config'\nimport { grInputTagConfig } from '../components/GrInputTag/config'\nimport { grJsonViewerConfig } from '../components/GrJsonViewer/config'\nimport { grKbdConfig } from '../components/GrKbd/config'\nimport { grLinkConfig } from '../components/GrLink/config'\nimport { grListConfig } from '../components/GrList/config'\nimport { grLoadingConfig } from '../components/GrLoading/config'\nimport { grModalConfig } from '../components/GrModal/config'\nimport { grNavbarConfig } from '../components/GrNavbar/config'\nimport { grNumberInputConfig } from '../components/GrNumberInput/config'\nimport { grPaginationConfig } from '../components/GrPagination/config'\nimport { grPopoverConfig } from '../components/GrPopover/config'\nimport { grProgressBarConfig } from '../components/GrProgressBar/config'\nimport { grProgressCircleConfig } from '../components/GrProgressCircle/config'\nimport { grPromptDialogConfig } from '../components/GrPromptDialog/config'\nimport { grRadioConfig } from '../components/GrRadio/config'\nimport { grRadioGroupConfig } from '../components/GrRadioGroup/config'\nimport { grRatingConfig } from '../components/GrRating/config'\nimport { grResponseErrorBannerConfig } from '../components/GrResponseErrorBanner/config'\nimport { grScrollSpyConfig } from '../components/GrScrollSpy/config'\nimport { grSegmentedConfig } from '../components/GrSegmented/config'\nimport { grSelectConfig } from '../components/GrSelect/config'\nimport { grSidebarConfig } from '../components/GrSidebar/config'\nimport { grSkeletonConfig } from '../components/GrSkeleton/config'\nimport { grSliderConfig } from '../components/GrSlider/config'\nimport { grSortableListConfig } from '../components/GrSortableList/config'\nimport { grSplitterConfig } from '../components/GrSplitter/config'\nimport { grStatisticConfig } from '../components/GrStatistic/config'\nimport { grStepsConfig } from '../components/GrSteps/config'\nimport { grSwitchConfig } from '../components/GrSwitch/config'\nimport { grTableConfig } from '../components/GrTable/config'\nimport { grTabPanelsConfig } from '../components/GrTabPanels/config'\nimport { grTabsConfig } from '../components/GrTabs/config'\nimport { grTextareaConfig } from '../components/GrTextarea/config'\nimport { grTimelineConfig } from '../components/GrTimeline/config'\nimport { grToasterConfig } from '../components/GrToaster/config'\nimport { grTooltipConfig } from '../components/GrTooltip/config'\nimport { grTransferConfig } from '../components/GrTransfer/config'\nimport { grTreeConfig } from '../components/GrTree/config'\nimport { grTreeSectionsConfig } from '../components/GrTreeSections/config'\nimport { grTreeSelectConfig } from '../components/GrTreeSelect/config'\nimport { grValueConfig } from '../components/GrValue/config'\n// </granularity:components:imports>\n\n/** Идентификатор провайдера — совпадает с именем пакета. */\nexport const GRANULARITY_PROVIDER_ID = '@feugene/granularity'\n\n// Не заменять на `new URL('..', import.meta.url)`: Vite и rolldown распознают\n// этот литерал и подставляют `data:`-URL, после чего scan-директории пустеют.\nconst packageBaseUrl = resolvePackageBaseUrl(import.meta.url)\n\n/** Встроенные темы пакета. Единственный источник правды о списке тем. */\nexport const granularityThemeNames = ['light', 'dark'] as const\nexport type GranularityThemeName = (typeof granularityThemeNames)[number]\n\n/** Темы, активные по умолчанию, если окружение не переопределяет выбор. */\nexport const granularityDefaultThemes: readonly GranularityThemeName[] = ['light']\n\nconst theme = {\n baseCssUrl: new URL('../styles/base.css', import.meta.url).href,\n tokensCssUrl: new URL('../styles/tokens.css', import.meta.url).href,\n themes: {\n light: new URL('../styles/themes/light.css', import.meta.url).href,\n dark: new URL('../styles/themes/dark.css', import.meta.url).href,\n },\n defaultThemes: granularityDefaultThemes,\n} as const\n\n/**\n * Реестр публичных компонентов. Ключи совпадают с subpath-экспортом\n * `@feugene/granularity/components/<Name>`.\n */\nexport const granularityComponentConfigs = {\n // <granularity:components:registry> — блок генерируется `yarn generate:registry`\n GrAffix: grAffixConfig,\n GrAlert: grAlertConfig,\n GrAutocomplete: grAutocompleteConfig,\n GrAvatar: grAvatarConfig,\n GrBadge: grBadgeConfig,\n GrBadgeWrap: grBadgeWrapConfig,\n GrBottomNav: grBottomNavConfig,\n GrBreadcrumbs: grBreadcrumbsConfig,\n GrButton: grButtonConfig,\n GrButtonGroup: grButtonGroupConfig,\n GrCard: grCardConfig,\n GrCarousel: grCarouselConfig,\n GrCheckbox: grCheckboxConfig,\n GrCheckboxGroup: grCheckboxGroupConfig,\n GrChip: grChipConfig,\n GrChipGroup: grChipGroupConfig,\n GrCollapse: grCollapseConfig,\n GrColorPicker: grColorPickerConfig,\n GrCommandPalette: grCommandPaletteConfig,\n GrConfigProvider: grConfigProviderConfig,\n GrConfirmDialog: grConfirmDialogConfig,\n GrContextMenu: grContextMenuConfig,\n GrDataTable: grDataTableConfig,\n GrDelta: grDeltaConfig,\n GrDescriptionList: grDescriptionListConfig,\n GrDialog: grDialogConfig,\n GrDialogService: grDialogServiceConfig,\n GrDivider: grDividerConfig,\n GrDrawer: grDrawerConfig,\n GrDropdown: grDropdownConfig,\n GrDropdownMenu: grDropdownMenuConfig,\n GrEmptyState: grEmptyStateConfig,\n GrFilePreview: grFilePreviewConfig,\n GrFileUpload: grFileUploadConfig,\n GrForm: grFormConfig,\n GrFormField: grFormFieldConfig,\n GrFormFile: grFormFileConfig,\n GrFormSection: grFormSectionConfig,\n GrIcon: grIconConfig,\n GrImageViewer: grImageViewerConfig,\n GrInput: grInputConfig,\n GrInputTag: grInputTagConfig,\n GrJsonViewer: grJsonViewerConfig,\n GrKbd: grKbdConfig,\n GrLink: grLinkConfig,\n GrList: grListConfig,\n GrLoading: grLoadingConfig,\n GrModal: grModalConfig,\n GrNavbar: grNavbarConfig,\n GrNumberInput: grNumberInputConfig,\n GrPagination: grPaginationConfig,\n GrPopover: grPopoverConfig,\n GrProgressBar: grProgressBarConfig,\n GrProgressCircle: grProgressCircleConfig,\n GrPromptDialog: grPromptDialogConfig,\n GrRadio: grRadioConfig,\n GrRadioGroup: grRadioGroupConfig,\n GrRating: grRatingConfig,\n GrResponseErrorBanner: grResponseErrorBannerConfig,\n GrScrollSpy: grScrollSpyConfig,\n GrSegmented: grSegmentedConfig,\n GrSelect: grSelectConfig,\n GrSidebar: grSidebarConfig,\n GrSkeleton: grSkeletonConfig,\n GrSlider: grSliderConfig,\n GrSortableList: grSortableListConfig,\n GrSplitter: grSplitterConfig,\n GrStatistic: grStatisticConfig,\n GrSteps: grStepsConfig,\n GrSwitch: grSwitchConfig,\n GrTable: grTableConfig,\n GrTabPanels: grTabPanelsConfig,\n GrTabs: grTabsConfig,\n GrTextarea: grTextareaConfig,\n GrTimeline: grTimelineConfig,\n GrToaster: grToasterConfig,\n GrTooltip: grTooltipConfig,\n GrTransfer: grTransferConfig,\n GrTree: grTreeConfig,\n GrTreeSections: grTreeSectionsConfig,\n GrTreeSelect: grTreeSelectConfig,\n GrValue: grValueConfig,\n // </granularity:components:registry>\n}\n\nexport type GranularityComponentName = keyof typeof granularityComponentConfigs\n\n/** Базовый набор компонентов в порядке реестра. */\nconst baseComponents: readonly GranularComponentDescriptor[] = Object.values(\n granularityComponentConfigs,\n)\n\n/**\n * Собирает granular-provider пакета.\n *\n * `overrides` — точка расширения для потребителя: дескриптор с именем из\n * базового реестра заменяет его, остальные дописываются в конец.\n */\nexport function createGranularityProvider(\n overrides: readonly GranularComponentDescriptor[] = [],\n): GranularProvider {\n const overrideByName = new Map(\n overrides.map(component => [component.name, component]),\n )\n const components: GranularComponentDescriptor[] = [\n ...baseComponents.map(component => overrideByName.get(component.name) ?? component),\n ...overrides.filter(component => !baseComponents.some(base => base.name === component.name)),\n ]\n\n return defineGranularProvider({\n id: GRANULARITY_PROVIDER_ID,\n contractVersion: 1,\n packageBaseUrl,\n components,\n theme,\n })\n}\n","import { createGranularityProvider } from './shared'\n\nexport * from './shared'\n\nexport const granularityProvider = createGranularityProvider()\n\nexport default granularityProvider\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,IAAa,iBAAiB,wBAAwB,YAAY,KAAK;CACrE,MAAM;CACN,cAAc,CAAC,YAAY,SAAS;CACpC,UAAU;AACZ,CAAC;;;ACND,IAAa,8BAA8B,wBAAwB,YAAY,KAAK;CAClF,MAAM;CACN,cAAc,CAAC,WAAW,UAAU;AACtC,CAAC;;;;ACgGD,IAAa,0BAA0B;AAIvC,IAAM,iBAAiB,sBAAsB,YAAY,GAAG;;AAG5D,IAAa,wBAAwB,CAAC,SAAS,MAAM;;AAIrD,IAAa,2BAA4D,CAAC,OAAO;AAEjF,IAAM,QAAQ;CACZ,YAAY,IAAA,IAAA,q5KAAA,KAAA,YAAA,GAAA,CAA8C,CAAC;CAC3D,cAAc,IAAA,IAAA,65YAAA,KAAA,YAAA,GAAA,CAAgD,CAAC;CAC/D,QAAQ;EACN,OAAO,IAAA,IAAA,iyYAAA,KAAA,YAAA,GAAA,CAAsD,CAAC;EAC9D,MAAM,IAAA,IAAA,y/SAAA,KAAA,YAAA,GAAA,CAAqD,CAAC;CAC9D;CACA,eAAe;AACjB;;;;;AAMA,IAAa,8BAA8B;CAEzC,SAAS;CACT,SAAS;CACT,gBAAgB;CAChB,UAAU;CACV,SAAS;CACT,aAAa;CACb,aAAa;CACb,eAAe;CACf,UAAU;CACV,eAAe;CACf,QAAQ;CACR,YAAY;CACZ,YAAY;CACZ,iBAAiB;CACjB,QAAQ;CACR,aAAa;CACb,YAAY;CACZ,eAAe;CACf,kBAAkB;CAClB,kBAAkB;CAClB,iBAAiB;CACjB,eAAe;CACf,aAAa;CACb,SAAS;CACT,mBAAmB;CACnB,UAAU;CACV,iBAAiB;CACjB,WAAW;CACX,UAAU;CACV,YAAY;CACZ,gBAAgB;CAChB,cAAc;CACd,eAAe;CACf,cAAc;CACd,QAAQ;CACR,aAAa;CACb,YAAY;CACZ,eAAe;CACf,QAAQ;CACR,eAAe;CACf,SAAS;CACT,YAAY;CACZ,cAAc;CACd,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,WAAW;CACX,SAAS;CACT,UAAU;CACV,eAAe;CACf,cAAc;CACd,WAAW;CACX,eAAe;CACf,kBAAkB;CAClB,gBAAgB;CAChB,SAAS;CACT,cAAc;CACd,UAAU;CACV,uBAAuB;CACvB,aAAa;CACb,aAAa;CACb,UAAU;CACV,WAAW;CACX,YAAY;CACZ,UAAU;CACV,gBAAgB;CAChB,YAAY;CACZ,aAAa;CACb,SAAS;CACT,UAAU;CACV,SAAS;CACT,aAAa;CACb,QAAQ;CACR,YAAY;CACZ,YAAY;CACZ,WAAW;CACX,WAAW;CACX,YAAY;CACZ,QAAQ;CACR,gBAAgB;CAChB,cAAc;CACd,SAAS;AAEX;;AAKA,IAAM,iBAAyD,OAAO,OACpE,2BACF;;;;;;;AAQA,SAAgB,0BACd,YAAoD,CAAC,GACnC;CAClB,MAAM,iBAAiB,IAAI,IACzB,UAAU,KAAI,cAAa,CAAC,UAAU,MAAM,SAAS,CAAC,CACxD;CACA,MAAM,aAA4C,CAChD,GAAG,eAAe,KAAI,cAAa,eAAe,IAAI,UAAU,IAAI,KAAK,SAAS,GAClF,GAAG,UAAU,QAAO,cAAa,CAAC,eAAe,MAAK,SAAQ,KAAK,SAAS,UAAU,IAAI,CAAC,CAC7F;CAEA,OAAO,uBAAuB;EAC5B,IAAI;EACJ,iBAAiB;EACjB;EACA;EACA;CACF,CAAC;AACH;;;AClPA,IAAa,sBAAsB,0BAA0B"}
@@ -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":"safelist-x8USecK8.js","names":[],"sources":["../../src/components/GrBadge/safelist.ts"],"sourcesContent":["import { splitClassTokens } from '../shared/classTokens'\nimport {\n badgeIconClass,\n badgeIconSizeClassBySize,\n darkToneClassByTone,\n lightToneClassByTone,\n semiRadiusClassBySize,\n sizeClassBySize,\n} from './grBadgeStyles'\n\nexport const grBadgeSafelist = [...new Set([\n ...Object.values(sizeClassBySize).flatMap(splitClassTokens),\n ...Object.values(badgeIconSizeClassBySize).flatMap(splitClassTokens),\n ...splitClassTokens(badgeIconClass),\n ...Object.values(semiRadiusClassBySize).flatMap(splitClassTokens),\n 'rounded-[var(--gr-radius-none)]',\n 'rounded-[var(--gr-radius-full)]',\n ...Object.values(lightToneClassByTone).flatMap(splitClassTokens),\n ...Object.values(darkToneClassByTone).flatMap(splitClassTokens),\n])]\n"],"mappings":";;;AAUA,IAAa,kBAAkB,CAAC,mBAAG,IAAI,IAAI;CACzC,GAAG,OAAO,OAAO,eAAe,CAAC,CAAC,QAAQ,gBAAgB;CAC1D,GAAG,OAAO,OAAO,wBAAwB,CAAC,CAAC,QAAQ,gBAAgB;CACnE,GAAG,iBAAiB,cAAc;CAClC,GAAG,OAAO,OAAO,qBAAqB,CAAC,CAAC,QAAQ,gBAAgB;CAChE;CACA;CACA,GAAG,OAAO,OAAO,oBAAoB,CAAC,CAAC,QAAQ,gBAAgB;CAC/D,GAAG,OAAO,OAAO,mBAAmB,CAAC,CAAC,QAAQ,gBAAgB;AAChE,CAAC,CAAC"}
@@ -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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"}
@@ -1,47 +0,0 @@
1
- import { i as useGrComponentProp } from "../../../chunks/context-CPMRfwVr.js";
2
- import { t as warnRenamedProp } from "../../../chunks/renamedProp-Dy96tT-F.js";
3
- import { i as grBadgeClass, n as badgeIconSizeClassBySize, t as badgeIconClass } from "../../../chunks/grBadgeStyles-DV0DrAew.js";
4
- import { t as _plugin_vue_export_helper_default } from "../../../chunks/_plugin-vue_export-helper-BOaGB7Aw.js";
5
- import { computed, createCommentVNode, createElementBlock, createElementVNode, defineComponent, normalizeClass, openBlock, renderSlot, unref, useAttrs } from "vue";
6
- import '../styles.css';//#region src/components/GrBadge/GrBadge.vue?vue&type=script&setup=true&lang.ts
7
- var _hoisted_1 = { class: "gr-badge__label" };
8
- var _hoisted_2 = { class: "gr-badge__text" };
9
- //#endregion
10
- //#region src/components/GrBadge/GrBadge.vue
11
- var GrBadge_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
12
- __name: "GrBadge",
13
- props: {
14
- tone: { default: void 0 },
15
- dark: {
16
- type: Boolean,
17
- default: false
18
- },
19
- size: { default: void 0 },
20
- radius: { default: void 0 }
21
- },
22
- setup(__props) {
23
- const props = __props;
24
- const resolvedTone = useGrComponentProp("GrBadge", "tone", () => props.tone, "neutral");
25
- const resolvedSize = useGrComponentProp("GrBadge", "size", () => props.size, "sm");
26
- const resolvedRadius = useGrComponentProp("GrBadge", "radius", () => props.radius, "round");
27
- warnRenamedProp("GrBadge", useAttrs(), { variant: "tone" });
28
- const className = computed(() => {
29
- return grBadgeClass({
30
- tone: resolvedTone.value,
31
- dark: props.dark,
32
- size: resolvedSize.value,
33
- radius: resolvedRadius.value
34
- });
35
- });
36
- const iconSizeClass = computed(() => badgeIconSizeClassBySize[resolvedSize.value]);
37
- return (_ctx, _cache) => {
38
- return openBlock(), createElementBlock("span", { class: normalizeClass(["gr-badge inline-block border whitespace-nowrap leading-none", className.value]) }, [createElementVNode("span", _hoisted_1, [_ctx.$slots.icon ? (openBlock(), createElementBlock("span", {
39
- key: 0,
40
- "data-gr-badge-icon": "",
41
- class: normalizeClass([unref(badgeIconClass), iconSizeClass.value])
42
- }, [renderSlot(_ctx.$slots, "icon", {}, void 0, true)], 2)) : createCommentVNode("", true), createElementVNode("span", _hoisted_2, [renderSlot(_ctx.$slots, "default", {}, void 0, true)])])], 2);
43
- };
44
- }
45
- }), [["__scopeId", "data-v-78f3036a"]]);
46
- //#endregion
47
- export { GrBadge_default as t };
@@ -1 +0,0 @@
1
- {"version":3,"file":"GrBadge-DBeQXEir.js","names":["$slots"],"sources":["../../../../src/components/GrBadge/GrBadge.vue","../../../../src/components/GrBadge/GrBadge.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, useAttrs } from 'vue'\n\nimport { useGrComponentProp } from '../GrConfigProvider/context'\n\nexport type { GrBadgeRadius, GrBadgeSize, GrBadgeTone } from './grBadgeStyles'\n\nimport { warnRenamedProp } from '../shared/renamedProp'\n\nimport {\n badgeIconClass,\n badgeIconSizeClassBySize,\n grBadgeClass,\n type GrBadgeRadius,\n type GrBadgeSize,\n type GrBadgeTone,\n} from './grBadgeStyles'\n\nexport interface GrBadgeProps {\n tone?: GrBadgeTone\n dark?: boolean\n size?: GrBadgeSize\n radius?: GrBadgeRadius\n}\n\nconst props = withDefaults(\n defineProps<GrBadgeProps>(),\n {\n // `tone`/`size`/`radius` настраиваются через `GrConfigProvider`, поэтому\n // их дефолты живут в резолверах ниже, а не в `withDefaults`.\n tone: undefined,\n dark: false,\n size: undefined,\n radius: undefined,\n },\n)\n\n// Эффективные значения: локальный проп → `GrConfigProvider` → дефолт компонента.\nconst resolvedTone = useGrComponentProp('GrBadge', 'tone', () => props.tone, 'neutral')\nconst resolvedSize = useGrComponentProp('GrBadge', 'size', () => props.size, 'sm')\nconst resolvedRadius = useGrComponentProp('GrBadge', 'radius', () => props.radius, 'round')\n\n// `variant` переименован в `tone`: незнакомый атрибут Vue сажает на корневой\n// узел, поэтому старое имя не роняет ни типы, ни рантайм — компонент молча\n// рисуется дефолтным тоном.\nwarnRenamedProp('GrBadge', useAttrs(), { variant: 'tone' })\n\nconst className = computed(() => {\n return grBadgeClass({\n tone: resolvedTone.value,\n dark: props.dark,\n size: resolvedSize.value,\n radius: resolvedRadius.value,\n })\n})\n\nconst iconSizeClass = computed(() => badgeIconSizeClassBySize[resolvedSize.value])\n\ndefineSlots<{\n /** Содержимое метки. */\n default?: () => any\n /**\n * Иконка перед подписью: статус со спиннером, флаг, значок типа.\n *\n * Размер задаёт обёртка по ступени `size`, поэтому содержимое слота тянется\n * до неё — `class=\"h-full w-full\"`, как у `GrChip`. Вращение спиннера —\n * `animate-spin` на самой иконке.\n *\n * `GrProgressCircle` сюда не кладут: у кругового индикатора шкала виджетная,\n * нижняя ступень — `2rem`, и в строку бейджа он не помещается.\n */\n icon?: () => any\n}>()\n</script>\n\n<template>\n <span\n class=\"gr-badge inline-block border whitespace-nowrap leading-none\"\n :class=\"className\"\n >\n <span class=\"gr-badge__label\">\n <span\n v-if=\"$slots.icon\"\n data-gr-badge-icon\n :class=\"[badgeIconClass, iconSizeClass]\"\n >\n <slot name=\"icon\" />\n </span>\n <span class=\"gr-badge__text\">\n <slot />\n </span>\n </span>\n </span>\n</template>\n\n<style scoped>\n/*\n * Оптически центрируем текст по вертикали независимо от регистра,\n * не уменьшая высоту самого бейджа.\n *\n * Высоту держит обёртка `.gr-badge__label` (`min-height: 1lh` — высота\n * line-box при `leading-none`), а текст (`.gr-badge__text`) обрезается до\n * cap-height и центрируется внутри этой высоты через flex.\n *\n * Обрезка обязана жить на вложенном узле, а не на самом тексте: `text-box-trim`\n * уменьшает line-box, и повесь его прямо на текст — вместе с ним просядет\n * высота контента, а за ней и весь бейдж.\n *\n * `gap` задан в `em`, чтобы просвет перед иконкой шёл за кеглем ступени, а не\n * за корневым размером. Бейджа без иконки он не касается: у flex-контейнера с\n * единственным ребёнком просветов нет.\n */\n.gr-badge__label {\n display: flex;\n align-items: center;\n gap: 0.25em;\n min-height: 1lh;\n}\n\n.gr-badge__text {\n display: block;\n text-box-trim: trim-both;\n text-box-edge: cap alphabetic;\n /* Шорткат для браузеров с поддержкой нового синтаксиса. */\n text-box: trim-both cap alphabetic;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, useAttrs } from 'vue'\n\nimport { useGrComponentProp } from '../GrConfigProvider/context'\n\nexport type { GrBadgeRadius, GrBadgeSize, GrBadgeTone } from './grBadgeStyles'\n\nimport { warnRenamedProp } from '../shared/renamedProp'\n\nimport {\n badgeIconClass,\n badgeIconSizeClassBySize,\n grBadgeClass,\n type GrBadgeRadius,\n type GrBadgeSize,\n type GrBadgeTone,\n} from './grBadgeStyles'\n\nexport interface GrBadgeProps {\n tone?: GrBadgeTone\n dark?: boolean\n size?: GrBadgeSize\n radius?: GrBadgeRadius\n}\n\nconst props = withDefaults(\n defineProps<GrBadgeProps>(),\n {\n // `tone`/`size`/`radius` настраиваются через `GrConfigProvider`, поэтому\n // их дефолты живут в резолверах ниже, а не в `withDefaults`.\n tone: undefined,\n dark: false,\n size: undefined,\n radius: undefined,\n },\n)\n\n// Эффективные значения: локальный проп → `GrConfigProvider` → дефолт компонента.\nconst resolvedTone = useGrComponentProp('GrBadge', 'tone', () => props.tone, 'neutral')\nconst resolvedSize = useGrComponentProp('GrBadge', 'size', () => props.size, 'sm')\nconst resolvedRadius = useGrComponentProp('GrBadge', 'radius', () => props.radius, 'round')\n\n// `variant` переименован в `tone`: незнакомый атрибут Vue сажает на корневой\n// узел, поэтому старое имя не роняет ни типы, ни рантайм — компонент молча\n// рисуется дефолтным тоном.\nwarnRenamedProp('GrBadge', useAttrs(), { variant: 'tone' })\n\nconst className = computed(() => {\n return grBadgeClass({\n tone: resolvedTone.value,\n dark: props.dark,\n size: resolvedSize.value,\n radius: resolvedRadius.value,\n })\n})\n\nconst iconSizeClass = computed(() => badgeIconSizeClassBySize[resolvedSize.value])\n\ndefineSlots<{\n /** Содержимое метки. */\n default?: () => any\n /**\n * Иконка перед подписью: статус со спиннером, флаг, значок типа.\n *\n * Размер задаёт обёртка по ступени `size`, поэтому содержимое слота тянется\n * до неё — `class=\"h-full w-full\"`, как у `GrChip`. Вращение спиннера —\n * `animate-spin` на самой иконке.\n *\n * `GrProgressCircle` сюда не кладут: у кругового индикатора шкала виджетная,\n * нижняя ступень — `2rem`, и в строку бейджа он не помещается.\n */\n icon?: () => any\n}>()\n</script>\n\n<template>\n <span\n class=\"gr-badge inline-block border whitespace-nowrap leading-none\"\n :class=\"className\"\n >\n <span class=\"gr-badge__label\">\n <span\n v-if=\"$slots.icon\"\n data-gr-badge-icon\n :class=\"[badgeIconClass, iconSizeClass]\"\n >\n <slot name=\"icon\" />\n </span>\n <span class=\"gr-badge__text\">\n <slot />\n </span>\n </span>\n </span>\n</template>\n\n<style scoped>\n/*\n * Оптически центрируем текст по вертикали независимо от регистра,\n * не уменьшая высоту самого бейджа.\n *\n * Высоту держит обёртка `.gr-badge__label` (`min-height: 1lh` — высота\n * line-box при `leading-none`), а текст (`.gr-badge__text`) обрезается до\n * cap-height и центрируется внутри этой высоты через flex.\n *\n * Обрезка обязана жить на вложенном узле, а не на самом тексте: `text-box-trim`\n * уменьшает line-box, и повесь его прямо на текст — вместе с ним просядет\n * высота контента, а за ней и весь бейдж.\n *\n * `gap` задан в `em`, чтобы просвет перед иконкой шёл за кеглем ступени, а не\n * за корневым размером. Бейджа без иконки он не касается: у flex-контейнера с\n * единственным ребёнком просветов нет.\n */\n.gr-badge__label {\n display: flex;\n align-items: center;\n gap: 0.25em;\n min-height: 1lh;\n}\n\n.gr-badge__text {\n display: block;\n text-box-trim: trim-both;\n text-box-edge: cap alphabetic;\n /* Шорткат для браузеров с поддержкой нового синтаксиса. */\n text-box: trim-both cap alphabetic;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;EAyBA,MAAM,QAAQ;EAad,MAAM,eAAe,mBAAmB,WAAW,cAAc,MAAM,MAAM,SAAS;EACtF,MAAM,eAAe,mBAAmB,WAAW,cAAc,MAAM,MAAM,IAAI;EACjF,MAAM,iBAAiB,mBAAmB,WAAW,gBAAgB,MAAM,QAAQ,OAAO;EAK1F,gBAAgB,WAAW,SAAS,GAAG,EAAE,SAAS,OAAO,CAAC;EAE1D,MAAM,YAAY,eAAe;GAC/B,OAAO,aAAa;IAClB,MAAM,aAAa;IACnB,MAAM,MAAM;IACZ,MAAM,aAAa;IACnB,QAAQ,eAAe;GACzB,CAAC;EACH,CAAC;EAED,MAAM,gBAAgB,eAAe,yBAAyB,aAAa,MAAM;;GAoB/E,OAAA,UAAA,GAAA,mBAgBO,QAAA,EAfH,OAAK,eAAA,CAAC,+DACE,UAAA,KAAS,CAAA,EAAA,GAAA,CAEnB,mBAWO,QAXP,YAWO,CATGA,KAAAA,OAAO,QADf,UAAA,GAAA,mBAMO,QAAA;;IAJL,sBAAA;IACC,OAAK,eAAA,CAAG,MAAA,cAAA,GAAgB,cAAA,KAAa,CAAA;GAEtC,GAAA,CAAA,WAAoB,KAAA,QAAA,QAAA,CAAA,GAAA,KAAA,GAAA,IAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA,GAEtB,mBAEO,QAFP,YAEO,CADL,WAAQ,KAAA,QAAA,WAAA,CAAA,GAAA,KAAA,GAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA"}