@feugene/granularity 0.46.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 (162) hide show
  1. package/README.md +3 -3
  2. package/dist/chunks/{x-circle-BCBURwyX.js → check-circle-Bnrb-CGJ.js} +8 -32
  3. package/dist/chunks/check-circle-Bnrb-CGJ.js.map +1 -0
  4. package/dist/chunks/{config-BqT6PMzO.js → config-B42iJ48O.js} +5 -1
  5. package/dist/chunks/{config-BqT6PMzO.js.map → config-B42iJ48O.js.map} +1 -1
  6. package/dist/chunks/{config-BGCyyXiD.js → config-BAse0laT.js} +5 -1
  7. package/dist/chunks/{config-BGCyyXiD.js.map → config-BAse0laT.js.map} +1 -1
  8. package/dist/chunks/{config-MmPym-Z7.js → config-BLP94dPY.js} +5 -1
  9. package/dist/chunks/{config-MmPym-Z7.js.map → config-BLP94dPY.js.map} +1 -1
  10. package/dist/chunks/{config-CjKpUcmy.js → config-Bdf1bt-m.js} +25 -16
  11. package/dist/chunks/config-Bdf1bt-m.js.map +1 -0
  12. package/dist/chunks/{config-DeyT9dJl.js → config-Bs1HwUcx.js} +47 -4
  13. package/dist/chunks/{config-DeyT9dJl.js.map → config-Bs1HwUcx.js.map} +1 -1
  14. package/dist/chunks/{config-CIkdsWUk.js → config-CIUU9ZpY.js} +4 -1
  15. package/dist/chunks/config-CIUU9ZpY.js.map +1 -0
  16. package/dist/chunks/{config-B3J0alyY.js → config-CzeZg2LO.js} +49 -4
  17. package/dist/chunks/config-CzeZg2LO.js.map +1 -0
  18. package/dist/chunks/{config-DCq4JySZ.js → config-D3HOuHDe.js} +1 -1
  19. package/dist/chunks/{config-DCq4JySZ.js.map → config-D3HOuHDe.js.map} +1 -1
  20. package/dist/chunks/{config-BhfNgyWL.js → config-DENqOoh0.js} +5 -1
  21. package/dist/chunks/config-DENqOoh0.js.map +1 -0
  22. package/dist/chunks/controlState-DoImKciE.js +35 -0
  23. package/dist/chunks/controlState-DoImKciE.js.map +1 -0
  24. package/dist/chunks/{en-DiHzFact.js → en-Bxyn5lW7.js} +12 -2
  25. package/dist/chunks/en-Bxyn5lW7.js.map +1 -0
  26. package/dist/chunks/{es-CeKkMxZ_.js → es-Bj_vc18Z.js} +3 -3
  27. package/dist/chunks/{es-CeKkMxZ_.js.map → es-Bj_vc18Z.js.map} +1 -1
  28. package/dist/chunks/{es-1ZL6NtkB.js → es-Dtl-a7ui.js} +12 -2
  29. package/dist/chunks/es-Dtl-a7ui.js.map +1 -0
  30. package/dist/chunks/{generated-CQ4h6Ieq.js → generated-hELWB0gZ.js} +98 -0
  31. package/dist/chunks/{generated-CQ4h6Ieq.js.map → generated-hELWB0gZ.js.map} +1 -1
  32. package/dist/chunks/{grTableStyles-uuMPSOBR.js → grTableStyles-DkQPMfx9.js} +16 -3
  33. package/dist/chunks/grTableStyles-DkQPMfx9.js.map +1 -0
  34. package/dist/chunks/{granular-provider-CsN_R9dB.js → granular-provider-BOQp7N5o.js} +9 -9
  35. package/dist/chunks/{granular-provider-CsN_R9dB.js.map → granular-provider-BOQp7N5o.js.map} +1 -1
  36. package/dist/chunks/{ru-Dr2RYn0P.js → ru-hrB4I1u_.js} +12 -2
  37. package/dist/chunks/ru-hrB4I1u_.js.map +1 -0
  38. package/dist/chunks/x-circle-BigSZy8m.js +26 -0
  39. package/dist/chunks/x-circle-BigSZy8m.js.map +1 -0
  40. package/dist/components/GrAlert/chunks/{GrAlert-D72y1IEh.js → GrAlert-CfEZghSY.js} +2 -1
  41. package/dist/components/GrAlert/chunks/{GrAlert-D72y1IEh.js.map → GrAlert-CfEZghSY.js.map} +1 -1
  42. package/dist/components/GrAlert/index.js +1 -1
  43. package/dist/components/GrAutocomplete/chunks/{GrAutocomplete-D396_JrW.js → GrAutocomplete-C-uovdv8.js} +320 -224
  44. package/dist/components/GrAutocomplete/chunks/GrAutocomplete-C-uovdv8.js.map +1 -0
  45. package/dist/components/GrAutocomplete/index.js +1 -1
  46. package/dist/components/GrAutocomplete/styles.css +1 -1
  47. package/dist/components/GrAvatar/chunks/{GrAvatar-dWEXiCJG.js → GrAvatar-Do5-C409.js} +12 -1
  48. package/dist/components/GrAvatar/chunks/GrAvatar-Do5-C409.js.map +1 -0
  49. package/dist/components/GrAvatar/index.js +2 -2
  50. package/dist/components/GrAvatar/themes/light.css +35 -0
  51. package/dist/components/GrColorPicker/chunks/{GrColorPicker-9mTR-YZ_.js → GrColorPicker-BRM_4lyI.js} +1 -1
  52. package/dist/components/GrColorPicker/chunks/{GrColorPicker-9mTR-YZ_.js.map → GrColorPicker-BRM_4lyI.js.map} +1 -1
  53. package/dist/components/GrColorPicker/index.js +1 -1
  54. package/dist/components/GrCommandPalette/chunks/{GrCommandPalette-Ha4s3DMT.js.map → GrCommandPalette-BJHmkDQv.js.map} +1 -1
  55. package/dist/components/GrCommandPalette/index.js +1 -1
  56. package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-e15nFI8M.js → GrConfirmDialog-BzUQwbec.js} +1 -1
  57. package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-e15nFI8M.js.map → GrConfirmDialog-BzUQwbec.js.map} +1 -1
  58. package/dist/components/GrConfirmDialog/index.js +1 -1
  59. package/dist/components/GrDataTable/chunks/GrDataTable-DQxYYgQk.js +1519 -0
  60. package/dist/components/GrDataTable/chunks/GrDataTable-DQxYYgQk.js.map +1 -0
  61. package/dist/components/GrDataTable/index.js +2 -2
  62. package/dist/components/GrDataTable/themes/light.css +10 -0
  63. package/dist/components/GrDialogService/chunks/{GrDialogService-BmXiYmUp.js → GrDialogService-Dtq0ZCN5.js} +3 -3
  64. package/dist/components/GrDialogService/chunks/{GrDialogService-BmXiYmUp.js.map → GrDialogService-Dtq0ZCN5.js.map} +1 -1
  65. package/dist/components/GrDialogService/index.js +1 -1
  66. package/dist/components/GrFormField/chunks/GrFormField-DO61vxpS.js.map +1 -1
  67. package/dist/components/GrInput/chunks/{GrInput-TFeBm3gQ.js → GrInput-DV4gMWPR.js} +40 -11
  68. package/dist/components/GrInput/chunks/GrInput-DV4gMWPR.js.map +1 -0
  69. package/dist/components/GrInput/index.js +2 -2
  70. package/dist/components/GrInputTag/chunks/{GrInputTag-Ci8AO1ze.js → GrInputTag-CO0YU-ok.js} +30 -6
  71. package/dist/components/GrInputTag/chunks/GrInputTag-CO0YU-ok.js.map +1 -0
  72. package/dist/components/GrInputTag/index.js +2 -2
  73. package/dist/components/GrJsonViewer/chunks/{GrJsonViewer-C6q8dEEZ.js → GrJsonViewer-D7CyWzhT.js} +1 -1
  74. package/dist/components/GrJsonViewer/chunks/{GrJsonViewer-C6q8dEEZ.js.map → GrJsonViewer-D7CyWzhT.js.map} +1 -1
  75. package/dist/components/GrJsonViewer/index.js +1 -1
  76. package/dist/components/GrNumberInput/chunks/{GrNumberInput-CL5QhOmx.js → GrNumberInput-BI6-vkcs.js} +48 -16
  77. package/dist/components/GrNumberInput/chunks/GrNumberInput-BI6-vkcs.js.map +1 -0
  78. package/dist/components/GrNumberInput/index.js +2 -2
  79. package/dist/components/GrPagination/chunks/{GrPagination-DhbNZHEF.js → GrPagination-BbaF5eXk.js} +10 -7
  80. package/dist/components/GrPagination/chunks/GrPagination-BbaF5eXk.js.map +1 -0
  81. package/dist/components/GrPagination/index.js +2 -2
  82. package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-8RxQsOQ_.js → GrPromptDialog-BEL-QgwE.js} +3 -3
  83. package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-8RxQsOQ_.js.map → GrPromptDialog-BEL-QgwE.js.map} +1 -1
  84. package/dist/components/GrPromptDialog/index.js +1 -1
  85. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-NEEJZ8zi.js → GrResponseErrorBanner-Bdd5c07x.js} +1 -1
  86. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-NEEJZ8zi.js.map → GrResponseErrorBanner-Bdd5c07x.js.map} +1 -1
  87. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-ZvBvEQDZ.js → GrResponseErrorBanner-DySe1ym4.js} +1 -1
  88. package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-ZvBvEQDZ.js.map → GrResponseErrorBanner-DySe1ym4.js.map} +1 -1
  89. package/dist/components/GrResponseErrorBanner/index.js +2 -2
  90. package/dist/components/GrSelect/chunks/{GrSelect-Do1iAyp1.js → GrSelect-0iI4wdR_.js} +3 -3
  91. package/dist/components/GrSelect/chunks/{GrSelect-Do1iAyp1.js.map → GrSelect-0iI4wdR_.js.map} +1 -1
  92. package/dist/components/GrSelect/index.js +1 -1
  93. package/dist/components/GrTable/chunks/{GrTable-iwzHvlMC.js → GrTable-CKJ-HrsN.js} +1 -1
  94. package/dist/components/GrTable/chunks/{GrTable-iwzHvlMC.js.map → GrTable-CKJ-HrsN.js.map} +1 -1
  95. package/dist/components/GrTable/index.js +2 -2
  96. package/dist/components/GrTextarea/chunks/{GrTextarea-BII3w61K.js → GrTextarea-Bfgc0DD2.js} +73 -32
  97. package/dist/components/GrTextarea/chunks/GrTextarea-Bfgc0DD2.js.map +1 -0
  98. package/dist/components/GrTextarea/index.js +2 -2
  99. package/dist/components/GrToaster/chunks/{GrToaster-D-sV-9of.js → GrToaster-CZixNk0l.js} +2 -1
  100. package/dist/components/GrToaster/chunks/{GrToaster-D-sV-9of.js.map → GrToaster-CZixNk0l.js.map} +1 -1
  101. package/dist/components/GrToaster/index.js +1 -1
  102. package/dist/components/GrTransfer/chunks/{GrTransfer-8FA78ny6.js → GrTransfer-DdfBUf35.js} +2 -2
  103. package/dist/components/GrTransfer/chunks/{GrTransfer-8FA78ny6.js.map → GrTransfer-DdfBUf35.js.map} +1 -1
  104. package/dist/components/GrTransfer/index.js +1 -1
  105. package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-DBu5nMGA.js → GrTreeSelect-B6KoDYiZ.js} +43 -18
  106. package/dist/components/GrTreeSelect/chunks/GrTreeSelect-B6KoDYiZ.js.map +1 -0
  107. package/dist/components/GrTreeSelect/index.js +2 -2
  108. package/dist/granular-provider-node.js +1 -1
  109. package/dist/granular-provider.js +1 -1
  110. package/dist/i18n/all.js +1 -1
  111. package/dist/i18n/index.js +1 -1
  112. package/dist/index.js +32 -32
  113. package/dist/theme.js +1 -1
  114. package/dist/tokens.js +1 -1
  115. package/dist/types/components/GrAutocomplete/composables/useAutocompleteNavigation.d.ts +39 -0
  116. package/dist/types/components/GrAutocomplete/composables/useAutocompletePanel.d.ts +36 -0
  117. package/dist/types/components/GrAutocomplete/composables/useAutocompleteValues.d.ts +28 -0
  118. package/dist/types/components/GrAutocomplete/composables/useAutocompleteVirtual.d.ts +33 -0
  119. package/dist/types/components/GrAutocomplete/composables/useRemoteOptions.d.ts +33 -0
  120. package/dist/types/components/GrAvatar/GrAvatar.vue.d.ts +11 -0
  121. package/dist/types/components/GrAvatar/defaults.d.ts +1 -0
  122. package/dist/types/components/GrAvatar/grAvatarStyles.d.ts +26 -1
  123. package/dist/types/components/GrDataTable/GrDataTable.vue.d.ts +60 -1
  124. package/dist/types/components/GrDataTable/composables/useDataTableColumnOrder.d.ts +45 -0
  125. package/dist/types/components/GrDataTable/composables/useDataTableColumnWidths.d.ts +38 -0
  126. package/dist/types/components/GrDataTable/composables/useDataTableExpansion.d.ts +46 -0
  127. package/dist/types/components/GrDataTable/composables/useDataTableLayout.d.ts +29 -0
  128. package/dist/types/components/GrDataTable/composables/useDataTableRowKeys.d.ts +16 -0
  129. package/dist/types/components/GrDataTable/composables/useDataTableSelection.d.ts +32 -0
  130. package/dist/types/components/GrDataTable/composables/useDataTableSort.d.ts +37 -0
  131. package/dist/types/components/GrDataTable/grDataTableStyles.d.ts +23 -0
  132. package/dist/types/components/GrFormField/GrFormField.vue.d.ts +7 -1
  133. package/dist/types/components/GrPagination/GrPagination.vue.d.ts +17 -2
  134. package/dist/types/components/GrPagination/grPaginationStyles.d.ts +15 -6
  135. package/dist/types/components/GrPagination/index.d.ts +1 -1
  136. package/dist/types/components/GrTable/grTableStyles.d.ts +16 -3
  137. package/dist/types/components/shared/controlState.d.ts +36 -0
  138. package/dist/types/i18n/messages/en.d.ts +20 -0
  139. package/dist/types/i18n/messages/es.d.ts +20 -0
  140. package/dist/types/i18n/messages/ru.d.ts +20 -0
  141. package/dist/web-types.json +79 -3
  142. package/package.json +1 -1
  143. package/dist/chunks/config-B3J0alyY.js.map +0 -1
  144. package/dist/chunks/config-BhfNgyWL.js.map +0 -1
  145. package/dist/chunks/config-CIkdsWUk.js.map +0 -1
  146. package/dist/chunks/config-CjKpUcmy.js.map +0 -1
  147. package/dist/chunks/en-DiHzFact.js.map +0 -1
  148. package/dist/chunks/es-1ZL6NtkB.js.map +0 -1
  149. package/dist/chunks/grTableStyles-uuMPSOBR.js.map +0 -1
  150. package/dist/chunks/ru-Dr2RYn0P.js.map +0 -1
  151. package/dist/chunks/x-circle-BCBURwyX.js.map +0 -1
  152. package/dist/components/GrAutocomplete/chunks/GrAutocomplete-D396_JrW.js.map +0 -1
  153. package/dist/components/GrAvatar/chunks/GrAvatar-dWEXiCJG.js.map +0 -1
  154. package/dist/components/GrDataTable/chunks/GrDataTable-xNSmO_I-.js +0 -1134
  155. package/dist/components/GrDataTable/chunks/GrDataTable-xNSmO_I-.js.map +0 -1
  156. package/dist/components/GrInput/chunks/GrInput-TFeBm3gQ.js.map +0 -1
  157. package/dist/components/GrInputTag/chunks/GrInputTag-Ci8AO1ze.js.map +0 -1
  158. package/dist/components/GrNumberInput/chunks/GrNumberInput-CL5QhOmx.js.map +0 -1
  159. package/dist/components/GrPagination/chunks/GrPagination-DhbNZHEF.js.map +0 -1
  160. package/dist/components/GrTextarea/chunks/GrTextarea-BII3w61K.js.map +0 -1
  161. package/dist/components/GrTreeSelect/chunks/GrTreeSelect-DBu5nMGA.js.map +0 -1
  162. package/dist/components/GrCommandPalette/chunks/{GrCommandPalette-Ha4s3DMT.js → GrCommandPalette-BJHmkDQv.js} +1 -1
@@ -7,11 +7,26 @@ import { type GrPaginationSize } from './grPaginationStyles';
7
7
  * (алгоритм boundary/sibling, как у MUI): всегда видны первая/последняя страница
8
8
  * и `siblingCount` соседей вокруг текущей.
9
9
  */
10
+ /**
11
+ * Вариант размера страницы: число либо пара «значение + подпись».
12
+ *
13
+ * Пара нужна там, где подпись не равна числу («50 / стр.», «Все»): собрать её
14
+ * из голого `number[]` было нельзя, а обходной путь — свой `GrSelect` рядом —
15
+ * терял связь с пагинацией.
16
+ */
17
+ export type GrPaginationPageSizeOption = number | {
18
+ value: number;
19
+ label: string;
20
+ };
10
21
  export interface GrPaginationProps {
11
22
  page: number;
12
23
  pageSize: number;
13
24
  total: number;
14
- pageSizes?: number[];
25
+ /**
26
+ * Варианты размера страницы. Число — подпись равна значению; пара — своя
27
+ * подпись при том же значении («50 / стр.»), которую иначе было не собрать.
28
+ */
29
+ pageSizes?: GrPaginationPageSizeOption[];
15
30
  /** Сколько соседних страниц показывать вокруг текущей. По умолчанию `1`. */
16
31
  siblingCount?: number;
17
32
  /** Сколько крайних страниц всегда показывать с каждого края. По умолчанию `1`. */
@@ -85,7 +100,7 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
85
100
  size: GrPaginationSize;
86
101
  compact: boolean;
87
102
  ariaLabel: string;
88
- pageSizes: number[];
103
+ pageSizes: GrPaginationPageSizeOption[];
89
104
  siblingCount: number;
90
105
  boundaryCount: number;
91
106
  showJumper: boolean;
@@ -1,7 +1,16 @@
1
1
  import type { GrComponentSize } from '../shared/sizes';
2
2
  export type GrPaginationSize = GrComponentSize;
3
- /** Номер страницы и многоточие: одна и та же коробка, чтобы ряд не прыгал. */
4
- export declare const pageSizes: Record<GrPaginationSize, string>;
3
+ /**
4
+ * Номер страницы и многоточие: одна и та же коробка, чтобы ряд не прыгал.
5
+ *
6
+ * Высоты — шкала `GrButton` (`28/32/40/44`), а не своя. Номера стоят с
7
+ * навигационными кнопками в одном ряду, и собственная шкала это ломала:
8
+ * `sm` и `md` были одной коробкой `h-8`, а кнопке приходилось выдавать размер
9
+ * на ступень ниже имени. Имя `pageBoxSizes`, а не `pageSizes`, потому что
10
+ * `pageSizes` — проп со списком размеров страницы, и одно имя на два разных
11
+ * понятия в одном компоненте читается как ошибка.
12
+ */
13
+ export declare const pageBoxSizes: Record<GrPaginationSize, string>;
5
14
  /** Коробка та же, что у номера, но поле́ уже: многоточию не нужен клик-таргет. */
6
15
  export declare const ellipsisSizes: Record<GrPaginationSize, string>;
7
16
  /** Вспомогательный текст: индикатор «текущая / всего» и подпись у поля перехода. */
@@ -11,9 +20,9 @@ export declare const rowGaps: Record<GrPaginationSize, string>;
11
20
  export declare const pageListGaps: Record<GrPaginationSize, string>;
12
21
  export declare const pageSizeSelectWidths: Record<GrPaginationSize, string>;
13
22
  /**
14
- * Навигационные кнопки берут размер из шкалы `GrButton`, а не из своей: они
15
- * обязаны стоять в один ряд с номерами страниц, а высоты у `GrButton`
16
- * `xs…lg` `28/32/40/44px`. На `md` номера страниц ростом `h-8`, поэтому
17
- * кнопке достаётся `sm`, а не одноимённый `md`.
23
+ * Навигационные кнопки берут свой размер один в один: коробка номера теперь
24
+ * той же высоты, что и `GrButton` того же имени, и сдвигать ступень больше не
25
+ * нужно. Отображение оставлено явным оно называет инвариант «кнопка и номер
26
+ * одного роста», который иначе держался бы на совпадении двух шкал.
18
27
  */
19
28
  export declare const navButtonSizes: Record<GrPaginationSize, GrComponentSize>;
@@ -4,4 +4,4 @@ export { grPaginationConfig } from './config';
4
4
  export type { GrPaginationConfigurableProps } from './defaults';
5
5
  export type { GrPaginationSize } from './grPaginationStyles';
6
6
  export { grPaginationSafelist } from './safelist';
7
- export type { GrPaginationEmits } from './GrPagination.vue';
7
+ export type { GrPaginationEmits, GrPaginationPageSizeOption } from './GrPagination.vue';
@@ -13,8 +13,21 @@ export type GrTableSize = GrComponentSize;
13
13
  * системная задача.
14
14
  */
15
15
  export declare const tableSizes: Record<GrTableSize, string>;
16
- /** Чередование строк и подсветка под курсором — на `<tbody>`, а не на ячейках. */
17
- export declare const stripedClass = "[&>tr:nth-child(even)]:bg-[color-mix(in_srgb,var(--gr-muted)_35%,transparent)]";
18
- export declare const hoverableClass = "[&>tr:hover]:bg-[color-mix(in_srgb,var(--gr-muted)_45%,transparent)]";
16
+ /**
17
+ * Строка, которая не входит в набор: подробности раскрытой строки, распорки
18
+ * виртуализатора. Помеченная ею `<tr>` не полосатится, не подсвечивается и
19
+ * **не участвует в счёте чётности** соседей.
20
+ */
21
+ export declare const DETAIL_ROW_ATTR = "data-gr-table-off-grid";
22
+ /**
23
+ * Чередование строк и подсветка под курсором — на `<tbody>`, а не на ячейках.
24
+ *
25
+ * `of :not(…)` здесь обязателен, и `:not()` снаружи его не заменяет: `nth-child`
26
+ * считает позицию среди **всех** сиблингов, поэтому обычный фильтр убрал бы
27
+ * полосу с самой служебной строки, но сдвинул бы чётность у всех, кто ниже.
28
+ * Форма `of S` перенумеровывает по отфильтрованному набору — это и нужно.
29
+ */
30
+ export declare const stripedClass = "[&>tr:nth-child(even_of_:not([data-gr-table-off-grid]))]:bg-[color-mix(in_srgb,var(--gr-muted)_35%,transparent)]";
31
+ export declare const hoverableClass = "[&>tr:not([data-gr-table-off-grid]):hover]:bg-[color-mix(in_srgb,var(--gr-muted)_45%,transparent)]";
19
32
  export declare const emptyCellClass = "px-4 py-8 text-center text-[var(--gr-muted-fg)]";
20
33
  export declare const loadingRowCellClass = "px-4 py-3";
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Небуквенный признак состояния форм-контрола.
3
+ *
4
+ * `state="success"`/`"warning"` до этого несли смысл **только цветом рамки**, а
5
+ * это WCAG 1.4.1: цвет не может быть единственным носителем информации. Иконка
6
+ * добавляет форму, а скрытая подпись — программный канал: у `success` и
7
+ * `warning`, в отличие от `danger`, ARIA-состояния не существует вовсе, и
8
+ * объявить их нечем, кроме текста в `aria-describedby`.
9
+ *
10
+ * Модуль общий на пять контролов (`GrInput`, `GrTextarea`, `GrNumberInput`,
11
+ * `GrInputTag`, `GrTreeSelect`), поэтому его классы обязан объявить **каждый**
12
+ * импортёр: в `dist` общий модуль лежит в чанке без адреса и в область скана
13
+ * пресета не попадает.
14
+ */
15
+ /** Состояния, у которых признак есть. `danger` его не получает — см. ниже. */
16
+ export type GrControlSignalState = 'success' | 'warning';
17
+ /**
18
+ * `danger` в набор не входит намеренно. Его смысл уже несут два канала:
19
+ * `aria-invalid` для скринридера и текст ошибки от `GrFormField` для глаз.
20
+ * Третья иконка рядом с ними — шум, а не признак.
21
+ */
22
+ export declare const controlStateIconClass = "pointer-events-none flex h-6 w-6 shrink-0 items-center justify-center";
23
+ /**
24
+ * Цвет иконки — роль `-text`, а не насыщенный тон: `--gr-success` выверен как
25
+ * заливка и в роли текста не добирает AA. Гейт `styleTokens` это ловит.
26
+ */
27
+ export declare const controlStateIconColors: Record<GrControlSignalState, string>;
28
+ /** Ключ локали подписи. Текст один на все контролы: состояние у них общее. */
29
+ export declare const controlStateTextKey: Record<GrControlSignalState, string>;
30
+ export declare const controlStateFallbackText: Record<GrControlSignalState, string>;
31
+ /**
32
+ * Показывать ли признак: только у `success`/`warning` и только пока поле не
33
+ * объявлено невалидным. Иначе галочка «корректно» соседствовала бы с
34
+ * `aria-invalid="true"` и противоречила ему.
35
+ */
36
+ export declare function controlSignalState(state: string | undefined, invalid: boolean): GrControlSignalState | undefined;
@@ -48,6 +48,8 @@ export declare const en: {
48
48
  add: string;
49
49
  clear: string;
50
50
  close: string;
51
+ stateSuccess: string;
52
+ stateWarning: string;
51
53
  };
52
54
  loading: {
53
55
  defaultText: string;
@@ -103,6 +105,14 @@ export declare const en: {
103
105
  columnMoved: string;
104
106
  resizeColumn: string;
105
107
  columnResized: string;
108
+ expandRow: string;
109
+ collapseRow: string;
110
+ detailLoading: string;
111
+ detailError: string;
112
+ detailRetry: string;
113
+ detailExpanded: string;
114
+ detailCollapsed: string;
115
+ detailReady: string;
106
116
  };
107
117
  breadcrumbs: {
108
118
  label: string;
@@ -441,6 +451,8 @@ export declare const en: {
441
451
  add: string;
442
452
  clear: string;
443
453
  close: string;
454
+ stateSuccess: string;
455
+ stateWarning: string;
444
456
  };
445
457
  loading: {
446
458
  defaultText: string;
@@ -496,6 +508,14 @@ export declare const en: {
496
508
  columnMoved: string;
497
509
  resizeColumn: string;
498
510
  columnResized: string;
511
+ expandRow: string;
512
+ collapseRow: string;
513
+ detailLoading: string;
514
+ detailError: string;
515
+ detailRetry: string;
516
+ detailExpanded: string;
517
+ detailCollapsed: string;
518
+ detailReady: string;
499
519
  };
500
520
  breadcrumbs: {
501
521
  label: string;
@@ -41,6 +41,8 @@ export declare const es: {
41
41
  add: string;
42
42
  clear: string;
43
43
  close: string;
44
+ stateSuccess: string;
45
+ stateWarning: string;
44
46
  };
45
47
  loading: {
46
48
  defaultText: string;
@@ -96,6 +98,14 @@ export declare const es: {
96
98
  columnMoved: string;
97
99
  resizeColumn: string;
98
100
  columnResized: string;
101
+ expandRow: string;
102
+ collapseRow: string;
103
+ detailLoading: string;
104
+ detailError: string;
105
+ detailRetry: string;
106
+ detailExpanded: string;
107
+ detailCollapsed: string;
108
+ detailReady: string;
99
109
  };
100
110
  breadcrumbs: {
101
111
  label: string;
@@ -436,6 +446,8 @@ export declare const es: {
436
446
  add: string;
437
447
  clear: string;
438
448
  close: string;
449
+ stateSuccess: string;
450
+ stateWarning: string;
439
451
  };
440
452
  loading: {
441
453
  defaultText: string;
@@ -491,6 +503,14 @@ export declare const es: {
491
503
  columnMoved: string;
492
504
  resizeColumn: string;
493
505
  columnResized: string;
506
+ expandRow: string;
507
+ collapseRow: string;
508
+ detailLoading: string;
509
+ detailError: string;
510
+ detailRetry: string;
511
+ detailExpanded: string;
512
+ detailCollapsed: string;
513
+ detailReady: string;
494
514
  };
495
515
  breadcrumbs: {
496
516
  label: string;
@@ -41,6 +41,8 @@ export declare const ru: {
41
41
  add: string;
42
42
  clear: string;
43
43
  close: string;
44
+ stateSuccess: string;
45
+ stateWarning: string;
44
46
  };
45
47
  loading: {
46
48
  defaultText: string;
@@ -96,6 +98,14 @@ export declare const ru: {
96
98
  columnMoved: string;
97
99
  resizeColumn: string;
98
100
  columnResized: string;
101
+ expandRow: string;
102
+ collapseRow: string;
103
+ detailLoading: string;
104
+ detailError: string;
105
+ detailRetry: string;
106
+ detailExpanded: string;
107
+ detailCollapsed: string;
108
+ detailReady: string;
99
109
  };
100
110
  breadcrumbs: {
101
111
  label: string;
@@ -438,6 +448,8 @@ export declare const ru: {
438
448
  add: string;
439
449
  clear: string;
440
450
  close: string;
451
+ stateSuccess: string;
452
+ stateWarning: string;
441
453
  };
442
454
  loading: {
443
455
  defaultText: string;
@@ -493,6 +505,14 @@ export declare const ru: {
493
505
  columnMoved: string;
494
506
  resizeColumn: string;
495
507
  columnResized: string;
508
+ expandRow: string;
509
+ collapseRow: string;
510
+ detailLoading: string;
511
+ detailError: string;
512
+ detailRetry: string;
513
+ detailExpanded: string;
514
+ detailCollapsed: string;
515
+ detailReady: string;
496
516
  };
497
517
  breadcrumbs: {
498
518
  label: string;
@@ -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.46.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
  }
@@ -4771,7 +4846,7 @@
4771
4846
  },
4772
4847
  {
4773
4848
  "name": "required",
4774
- "description": "Помечает поле обязательным (маркер `*` + `aria-required` у контрола).",
4849
+ "description": "Помечает поле обязательным: маркер `*` в подписи и `aria-required` у контрола. Маркер помечен `aria-hidden`, поэтому объявляет обязательность именно контрол — а чем именно, решает его роль. Разбор случая `role=\"group\"`, который `aria-required` не допускает, — на странице компонента.",
4775
4850
  "default": "false",
4776
4851
  "value": {
4777
4852
  "kind": "expression",
@@ -7147,10 +7222,11 @@
7147
7222
  },
7148
7223
  {
7149
7224
  "name": "pageSizes",
7225
+ "description": "Варианты размера страницы. Число — подпись равна значению; пара — своя подпись при том же значении («50 / стр.»), которую иначе было не собрать.",
7150
7226
  "default": "[10, 20, 50]",
7151
7227
  "value": {
7152
7228
  "kind": "expression",
7153
- "type": "number[] | undefined"
7229
+ "type": "GrPaginationPageSizeOption[] | undefined"
7154
7230
  }
7155
7231
  },
7156
7232
  {
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.46.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":"config-BhfNgyWL.js","names":[],"sources":["../../src/components/GrTextarea/safelist.ts","../../src/components/GrTextarea/config.ts"],"sourcesContent":["import { splitClassTokens } from '../shared/classTokens'\nimport {\n borderClassByState,\n countClass,\n countRowClass,\n lineCountClass,\n disabledSurfaceClass,\n enabledSurfaceClass,\n invalidBorderClass,\n resizeClass,\n sizes,\n} from './grTextareaStyles'\n\nexport const grTextareaSafelist = [...new Set([\n ...Object.values(borderClassByState).flatMap(splitClassTokens),\n ...splitClassTokens(invalidBorderClass),\n ...Object.values(sizes).flatMap(splitClassTokens),\n ...Object.values(resizeClass).flatMap(splitClassTokens),\n ...splitClassTokens(enabledSurfaceClass),\n ...splitClassTokens(disabledSurfaceClass),\n ...splitClassTokens(countClass),\n ...splitClassTokens(countRowClass),\n ...splitClassTokens(lineCountClass),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grTextareaSafelist } from './safelist'\n\nexport const grTextareaConfig = defineGranularComponent(import.meta.url, {\n name: 'GrTextarea',\n safelist: grTextareaSafelist,\n})\n"],"mappings":";;;;AAaA,IAAa,qBAAqB,CAAC,mBAAG,IAAI,IAAI;CAC5C,GAAG,OAAO,OAAO,kBAAkB,CAAC,CAAC,QAAQ,gBAAgB;CAC7D,GAAG,iBAAiB,kBAAkB;CACtC,GAAG,OAAO,OAAO,KAAK,CAAC,CAAC,QAAQ,gBAAgB;CAChD,GAAG,OAAO,OAAO,WAAW,CAAC,CAAC,QAAQ,gBAAgB;CACtD,GAAG,iBAAiB,mBAAmB;CACvC,GAAG,iBAAiB,oBAAoB;CACxC,GAAG,iBAAiB,UAAU;CAC9B,GAAG,iBAAiB,aAAa;CACjC,GAAG,iBAAiB,cAAc;AACpC,CAAC,CAAC;;;ACnBF,IAAa,mBAAmB,wBAAwB,YAAY,KAAK;CACvE,MAAM;CACN,UAAU;AACZ,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-CIkdsWUk.js","names":[],"sources":["../../src/components/GrInput/safelist.ts","../../src/components/GrInput/config.ts"],"sourcesContent":["import { splitClassTokens } from '../shared/classTokens'\nimport {\n addonInlinePrefixClass,\n addonInlineSuffixClass,\n addonSegmentPrefixClass,\n addonSegmentSuffixClass,\n invalidClass,\n shellBaseClass,\n shellDisabledClass,\n shellEnabledClass,\n sizes,\n states,\n textAlign,\n} from './grInputStyles'\n\nexport const grInputSafelist = [...new Set([\n ...Object.values(sizes).flatMap(splitClassTokens),\n ...Object.values(textAlign).flatMap(splitClassTokens),\n ...Object.values(states).flatMap(splitClassTokens),\n ...splitClassTokens(invalidClass),\n ...splitClassTokens(shellBaseClass),\n ...splitClassTokens(shellEnabledClass),\n ...splitClassTokens(shellDisabledClass),\n ...splitClassTokens(addonSegmentPrefixClass),\n ...splitClassTokens(addonSegmentSuffixClass),\n ...splitClassTokens(addonInlinePrefixClass),\n ...splitClassTokens(addonInlineSuffixClass),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\nimport { grInputSafelist } from './safelist'\n\nexport const grInputConfig = defineGranularComponent(import.meta.url, {\n name: 'GrInput',\n safelist: grInputSafelist,\n})\n"],"mappings":";;;;AAeA,IAAa,kBAAkB,CAAC,mBAAG,IAAI,IAAI;CACzC,GAAG,OAAO,OAAO,KAAK,CAAC,CAAC,QAAQ,gBAAgB;CAChD,GAAG,OAAO,OAAO,SAAS,CAAC,CAAC,QAAQ,gBAAgB;CACpD,GAAG,OAAO,OAAO,MAAM,CAAC,CAAC,QAAQ,gBAAgB;CACjD,GAAG,iBAAiB,YAAY;CAChC,GAAG,iBAAiB,cAAc;CAClC,GAAG,iBAAiB,iBAAiB;CACrC,GAAG,iBAAiB,kBAAkB;CACtC,GAAG,iBAAiB,uBAAuB;CAC3C,GAAG,iBAAiB,uBAAuB;CAC3C,GAAG,iBAAiB,sBAAsB;CAC1C,GAAG,iBAAiB,sBAAsB;AAC5C,CAAC,CAAC;;;ACxBF,IAAa,gBAAgB,wBAAwB,YAAY,KAAK;CACpE,MAAM;CACN,UAAU;AACZ,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-CjKpUcmy.js","names":[],"sources":["../../src/components/GrPagination/grPaginationStyles.ts","../../src/components/GrPagination/safelist.ts","../../src/components/GrPagination/config.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nexport type GrPaginationSize = GrComponentSize\n\n/** Номер страницы и многоточие: одна и та же коробка, чтобы ряд не прыгал. */\nexport const pageSizes: Record<GrPaginationSize, string> = {\n xs: 'h-7 min-w-7 px-1.5 text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)]',\n sm: 'h-8 min-w-8 px-2 text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)]',\n md: 'h-8 min-w-8 px-2 text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)]',\n lg: 'h-10 min-w-10 px-3 text-[length:var(--gr-text-base)] leading-[var(--gr-leading-base)]',\n}\n\n/** Коробка та же, что у номера, но поле́ уже: многоточию не нужен клик-таргет. */\nexport const ellipsisSizes: Record<GrPaginationSize, string> = {\n xs: 'h-7 min-w-7 px-1 text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)]',\n sm: 'h-8 min-w-8 px-1 text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)]',\n md: 'h-8 min-w-8 px-1 text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)]',\n lg: 'h-10 min-w-10 px-2 text-[length:var(--gr-text-base)] leading-[var(--gr-leading-base)]',\n}\n\n/** Вспомогательный текст: индикатор «текущая / всего» и подпись у поля перехода. */\nexport const labelSizes: Record<GrPaginationSize, string> = {\n xs: 'text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)]',\n sm: 'text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)]',\n md: 'text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)]',\n lg: 'text-[length:var(--gr-text-base)] leading-[var(--gr-leading-base)]',\n}\n\nexport const jumperSizes: Record<GrPaginationSize, string> = {\n xs: 'h-7 w-12 text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)]',\n sm: 'h-8 w-14 text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)]',\n md: 'h-8 w-14 text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)]',\n lg: 'h-10 w-16 text-[length:var(--gr-text-base)] leading-[var(--gr-leading-base)]',\n}\n\nexport const rowGaps: Record<GrPaginationSize, string> = {\n xs: 'gap-2',\n sm: 'gap-2',\n md: 'gap-3',\n lg: 'gap-3',\n}\n\nexport const pageListGaps: Record<GrPaginationSize, string> = {\n xs: 'gap-0.5',\n sm: 'gap-1',\n md: 'gap-1',\n lg: 'gap-1',\n}\n\nexport const pageSizeSelectWidths: Record<GrPaginationSize, string> = {\n xs: 'min-w-[84px]',\n sm: 'min-w-[92px]',\n md: 'min-w-[100px]',\n lg: 'min-w-[112px]',\n}\n\n/**\n * Навигационные кнопки берут размер из шкалы `GrButton`, а не из своей: они\n * обязаны стоять в один ряд с номерами страниц, а высоты у `GrButton`\n * `xs…lg` — `28/32/40/44px`. На `md` номера страниц ростом `h-8`, поэтому\n * кнопке достаётся `sm`, а не одноимённый `md`.\n */\nexport const navButtonSizes: Record<GrPaginationSize, GrComponentSize> = {\n xs: 'xs',\n sm: 'sm',\n md: 'sm',\n lg: 'md',\n}\n","import { splitClassTokens } from '../shared/classTokens'\nimport {\n ellipsisSizes,\n jumperSizes,\n labelSizes,\n pageListGaps,\n pageSizes,\n pageSizeSelectWidths,\n rowGaps,\n} from './grPaginationStyles'\n\nexport const grPaginationSafelist = [...new Set([\n ...Object.values(pageSizes).flatMap(splitClassTokens),\n ...Object.values(ellipsisSizes).flatMap(splitClassTokens),\n ...Object.values(labelSizes).flatMap(splitClassTokens),\n ...Object.values(jumperSizes).flatMap(splitClassTokens),\n ...Object.values(rowGaps).flatMap(splitClassTokens),\n ...Object.values(pageListGaps).flatMap(splitClassTokens),\n ...Object.values(pageSizeSelectWidths).flatMap(splitClassTokens),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grPaginationSafelist } from './safelist'\n\nexport const grPaginationConfig = defineGranularComponent(import.meta.url, {\n name: 'GrPagination',\n dependencies: ['GrButton', 'GrSelect'],\n safelist: grPaginationSafelist,\n})\n"],"mappings":";;;;AAKA,IAAa,YAA8C;CACzD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,gBAAkD;CAC7D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,aAA+C;CAC1D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,cAAgD;CAC3D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,UAA4C;CACvD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,eAAiD;CAC5D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,uBAAyD;CACpE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;;;AAQA,IAAa,iBAA4D;CACvE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;ACxDA,IAAa,uBAAuB,CAAC,mBAAG,IAAI,IAAI;CAC9C,GAAG,OAAO,OAAO,SAAS,CAAC,CAAC,QAAQ,gBAAgB;CACpD,GAAG,OAAO,OAAO,aAAa,CAAC,CAAC,QAAQ,gBAAgB;CACxD,GAAG,OAAO,OAAO,UAAU,CAAC,CAAC,QAAQ,gBAAgB;CACrD,GAAG,OAAO,OAAO,WAAW,CAAC,CAAC,QAAQ,gBAAgB;CACtD,GAAG,OAAO,OAAO,OAAO,CAAC,CAAC,QAAQ,gBAAgB;CAClD,GAAG,OAAO,OAAO,YAAY,CAAC,CAAC,QAAQ,gBAAgB;CACvD,GAAG,OAAO,OAAO,oBAAoB,CAAC,CAAC,QAAQ,gBAAgB;AACjE,CAAC,CAAC;;;ACfF,IAAa,qBAAqB,wBAAwB,YAAY,KAAK;CACzE,MAAM;CACN,cAAc,CAAC,YAAY,UAAU;CACrC,UAAU;AACZ,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"en-DiHzFact.js","names":[],"sources":["../../src/i18n/locales/en.json"],"sourcesContent":["{\n \"transfer\": {\n \"sourceTitle\": \"Available\",\n \"targetTitle\": \"Selected\",\n \"search\": \"Search\",\n \"toTarget\": \"Move to selected\",\n \"toSource\": \"Move back to available\",\n \"selectAll\": \"Select everything shown\",\n \"moveUp\": \"Move earlier\",\n \"moveDown\": \"Move later\",\n \"selected\": \"{count} of {total}\",\n \"shown\": \"Showing {shown} of {total}\",\n \"empty\": \"Nothing here yet\",\n \"emptyFiltered\": \"Nothing matches the search\",\n \"moved\": \"{count} moved to {list}\",\n \"reordered\": \"Position {position} of {count}\",\n \"reorderFiltered\": \"Reordering is off while a search is active\",\n \"cancelled\": \"Move cancelled\"\n },\n \"carousel\": {\n \"roledescription\": \"carousel\",\n \"slideRoledescription\": \"slide\",\n \"slidePosition\": \"{index} of {total}\",\n \"previous\": \"Previous slide\",\n \"next\": \"Next slide\",\n \"play\": \"Start automatic slide show\",\n \"pause\": \"Stop automatic slide show\",\n \"indicators\": \"Slides\",\n \"autoplayStopped\": \"Automatic slide show stopped\"\n },\n \"chip\": {\n \"remove\": \"Remove\",\n \"removeNamed\": \"Remove {label}\"\n },\n \"common\": {\n \"confirm\": \"Confirm\",\n \"cancel\": \"Cancel\",\n \"add\": \"Add\",\n \"clear\": \"Clear\",\n \"close\": \"Close\"\n },\n \"loading\": {\n \"defaultText\": \"Loading...\"\n },\n \"steps\": {\n \"label\": \"Progress\",\n \"status\": \"Step {step} of {count}\",\n \"completed\": \"completed\",\n \"error\": \"has errors\"\n },\n \"treeSelect\": {\n \"filterPlaceholder\": \"Search…\",\n \"empty\": \"No data\",\n \"loading\": \"Loading…\"\n },\n \"badgeWrap\": {\n \"count\": \"{count} new\"\n },\n \"avatar\": {\n \"group\": \"People\",\n \"groupOverflow\": \"and {count} more\",\n \"status\": {\n \"online\": \"online\",\n \"offline\": \"offline\",\n \"busy\": \"busy\",\n \"away\": \"away\"\n }\n },\n \"tree\": {\n \"drag\": \"Drag\",\n \"expand\": \"Expand\",\n \"collapse\": \"Collapse\",\n \"moved\": \"Moved {label}\"\n },\n \"select\": {\n \"customValuePlaceholder\": \"Add value…\",\n \"addOption\": \"Add \\\"{value}\\\"\",\n \"clearOption\": \"None\",\n \"searchPlaceholder\": \"Search…\",\n \"loading\": \"Loading…\",\n \"noResults\": \"No results\",\n \"removeTag\": \"Remove {label}\"\n },\n \"dataTable\": {\n \"loading\": \"Loading…\",\n \"empty\": \"No data\",\n \"selectAll\": \"Select all rows\",\n \"selectRow\": \"Select row\",\n \"sortAsc\": \"Activate to sort ascending\",\n \"sortDesc\": \"Activate to sort descending\",\n \"sortNone\": \"Activate to remove sorting\",\n \"moveColumn\": \"Move column {label}\",\n \"columnMoved\": \"Column {label} moved to position {position} of {count}\",\n \"resizeColumn\": \"Width of column {label}\",\n \"columnResized\": \"Column {label} is {width} pixels wide\"\n },\n \"breadcrumbs\": {\n \"label\": \"Breadcrumb\",\n \"expand\": \"Show hidden path\"\n },\n \"autocomplete\": {\n \"loading\": \"Loading…\",\n \"noResults\": \"No results\",\n \"addOption\": \"Add \\\"{value}\\\"\",\n \"removeValue\": \"Remove {label}\",\n \"typeMore\": {\n \"one\": \"Type at least {n} character\",\n \"other\": \"Type at least {n} characters\"\n }\n },\n \"form\": {\n \"required\": \"This field is required\",\n \"min\": \"Minimum is {min}\",\n \"max\": \"Maximum is {max}\",\n \"len\": \"Length must be {len}\",\n \"pattern\": \"Invalid format\",\n \"email\": \"Enter a valid email\",\n \"url\": \"Enter a valid URL\",\n \"file\": \"Invalid file\",\n \"invalid\": \"Invalid value\",\n \"readonly\": \"Read only\",\n \"validating\": \"Checking…\"\n },\n \"dialog\": {\n \"confirm\": {\n \"title\": \"Confirm\"\n },\n \"prompt\": {\n \"title\": \"Prompt\",\n \"label\": \"Value\",\n \"required\": \"Enter a value.\"\n },\n \"ok\": \"OK\"\n },\n \"switch\": {\n \"loading\": \"Saving…\"\n },\n \"slider\": {\n \"min\": \"min\",\n \"max\": \"max\"\n },\n \"sidebar\": {\n \"expand\": \"Expand sidebar\",\n \"collapse\": \"Collapse sidebar\"\n },\n \"splitter\": {\n \"label\": \"Resize panels\"\n },\n \"statistic\": {\n \"trendUp\": \"Increase\",\n \"trendDown\": \"Decrease\",\n \"trendFlat\": \"No change\"\n },\n \"pagination\": {\n \"label\": \"Pagination\",\n \"pageSize\": \"Page size\",\n \"prev\": \"Prev\",\n \"next\": \"Next\",\n \"page\": \"Page {n}\",\n \"first\": \"First page\",\n \"last\": \"Last page\",\n \"jumpTo\": \"Go to\",\n \"total\": \"{from}–{to} of {total}\",\n \"status\": \"Page {page} of {count}\"\n },\n \"navbar\": {\n \"openMenu\": \"Open menu\"\n },\n \"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-1ZL6NtkB.js","names":[],"sources":["../../src/i18n/locales/es.json"],"sourcesContent":["{\n \"transfer\": {\n \"sourceTitle\": \"Disponibles\",\n \"targetTitle\": \"Seleccionados\",\n \"search\": \"Buscar\",\n \"toTarget\": \"Mover a seleccionados\",\n \"toSource\": \"Devolver a disponibles\",\n \"selectAll\": \"Seleccionar todo lo mostrado\",\n \"moveUp\": \"Antes\",\n \"moveDown\": \"Después\",\n \"selected\": \"{count} de {total}\",\n \"shown\": \"Mostrando {shown} de {total}\",\n \"empty\": \"Aquí no hay nada todavía\",\n \"emptyFiltered\": \"No hay coincidencias\",\n \"moved\": \"{count} movidos a «{list}»\",\n \"reordered\": \"Posición {position} de {count}\",\n \"reorderFiltered\": \"El orden no cambia mientras haya búsqueda\",\n \"cancelled\": \"Movimiento cancelado\"\n },\n \"carousel\": {\n \"roledescription\": \"carrusel\",\n \"slideRoledescription\": \"diapositiva\",\n \"slidePosition\": \"{index} de {total}\",\n \"previous\": \"Diapositiva anterior\",\n \"next\": \"Diapositiva siguiente\",\n \"play\": \"Iniciar la reproducción automática\",\n \"pause\": \"Detener la reproducción automática\",\n \"indicators\": \"Diapositivas\",\n \"autoplayStopped\": \"Reproducción automática detenida\"\n },\n \"chip\": {\n \"remove\": \"Quitar\",\n \"removeNamed\": \"Quitar {label}\"\n },\n \"common\": {\n \"confirm\": \"Confirmar\",\n \"cancel\": \"Cancelar\",\n \"add\": \"Añadir\",\n \"clear\": \"Limpiar\",\n \"close\": \"Cerrar\"\n },\n \"loading\": {\n \"defaultText\": \"Cargando...\"\n },\n \"steps\": {\n \"label\": \"Progreso\",\n \"status\": \"Paso {step} de {count}\",\n \"completed\": \"completado\",\n \"error\": \"tiene errores\"\n },\n \"treeSelect\": {\n \"filterPlaceholder\": \"Buscar…\",\n \"empty\": \"Sin datos\",\n \"loading\": \"Cargando…\"\n },\n \"badgeWrap\": {\n \"count\": \"{count} nuevos\"\n },\n \"avatar\": {\n \"group\": \"Personas\",\n \"groupOverflow\": \"y {count} más\",\n \"status\": {\n \"online\": \"en línea\",\n \"offline\": \"sin conexión\",\n \"busy\": \"ocupado\",\n \"away\": \"ausente\"\n }\n },\n \"tree\": {\n \"drag\": \"Arrastrar\",\n \"expand\": \"Expandir\",\n \"collapse\": \"Contraer\",\n \"moved\": \"{label} movido\"\n },\n \"select\": {\n \"customValuePlaceholder\": \"Añadir valor…\",\n \"addOption\": \"Añadir «{value}»\",\n \"clearOption\": \"Ninguno\",\n \"searchPlaceholder\": \"Buscar…\",\n \"loading\": \"Cargando…\",\n \"noResults\": \"Sin resultados\",\n \"removeTag\": \"Quitar {label}\"\n },\n \"dataTable\": {\n \"loading\": \"Cargando…\",\n \"empty\": \"Sin datos\",\n \"selectAll\": \"Seleccionar todas las filas\",\n \"selectRow\": \"Seleccionar fila\",\n \"sortAsc\": \"Active para ordenar de forma ascendente\",\n \"sortDesc\": \"Active para ordenar de forma descendente\",\n \"sortNone\": \"Active para quitar la ordenación\",\n \"moveColumn\": \"Mover la columna {label}\",\n \"columnMoved\": \"Columna {label} movida a la posición {position} de {count}\",\n \"resizeColumn\": \"Ancho de la columna {label}\",\n \"columnResized\": \"La columna {label} mide {width} píxeles\"\n },\n \"breadcrumbs\": {\n \"label\": \"Ruta de navegación\",\n \"expand\": \"Mostrar la ruta oculta\"\n },\n \"autocomplete\": {\n \"loading\": \"Cargando…\",\n \"noResults\": \"Sin resultados\",\n \"addOption\": \"Añadir «{value}»\",\n \"removeValue\": \"Quitar {label}\",\n \"typeMore\": {\n \"one\": \"Escriba al menos {n} carácter\",\n \"many\": \"Escriba al menos {n} de caracteres\",\n \"other\": \"Escriba al menos {n} caracteres\"\n }\n },\n \"form\": {\n \"required\": \"Este campo es obligatorio\",\n \"min\": \"Mínimo {min}\",\n \"max\": \"Máximo {max}\",\n \"len\": \"La longitud debe ser {len}\",\n \"pattern\": \"Formato no válido\",\n \"email\": \"Introduce un correo válido\",\n \"url\": \"Introduce una URL válida\",\n \"file\": \"Archivo no válido\",\n \"invalid\": \"Valor no válido\",\n \"readonly\": \"Solo lectura\",\n \"validating\": \"Comprobando…\"\n },\n \"dialog\": {\n \"confirm\": {\n \"title\": \"Confirmar\"\n },\n \"prompt\": {\n \"title\": \"Aviso\",\n \"label\": \"Valor\",\n \"required\": \"Introduzca un valor.\"\n },\n \"ok\": \"OK\"\n },\n \"switch\": {\n \"loading\": \"Guardando…\"\n },\n \"slider\": {\n \"min\": \"mínimo\",\n \"max\": \"máximo\"\n },\n \"sidebar\": {\n \"expand\": \"Expandir panel\",\n \"collapse\": \"Contraer panel\"\n },\n \"splitter\": {\n \"label\": \"Cambiar el tamaño de los paneles\"\n },\n \"statistic\": {\n \"trendUp\": \"Aumento\",\n \"trendDown\": \"Descenso\",\n \"trendFlat\": \"Sin cambios\"\n },\n \"pagination\": {\n \"label\": \"Paginación\",\n \"pageSize\": \"Tamaño de página\",\n \"prev\": \"Anterior\",\n \"next\": \"Siguiente\",\n \"page\": \"Página {n}\",\n \"first\": \"Primera página\",\n \"last\": \"Última página\",\n \"jumpTo\": \"Ir a\",\n \"total\": \"{from}–{to} de {total}\",\n \"status\": \"Página {page} de {count}\"\n },\n \"navbar\": {\n \"openMenu\": \"Abrir menú\"\n },\n \"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"}