@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
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Чистая логика значения OTP-поля: алфавит, нормализация ввода и разбивка на
3
+ * группы. Без Vue и без DOM — здесь дёшево перебрать края, а края тут и есть
4
+ * весь риск.
5
+ */
6
+ export declare const GR_OTP_INPUT_TYPES: readonly ["numeric", "alphanumeric", "text"];
7
+ export type GrOtpInputType = typeof GR_OTP_INPUT_TYPES[number];
8
+ /**
9
+ * Алфавиты по типу. `text` — любой непробельный символ: пробел в коде не несёт
10
+ * смысла, а при вставке из мессенджера приходит вместе с ним.
11
+ */
12
+ export declare const OTP_TYPE_PATTERNS: Record<GrOtpInputType, string>;
13
+ /** Раскладка клавиатуры на мобильном: цифровой блок только там, где он уместен. */
14
+ export declare const OTP_TYPE_INPUT_MODES: Record<GrOtpInputType, 'numeric' | 'text'>;
15
+ export type OtpMatcher = (char: string) => boolean;
16
+ /**
17
+ * Матчер алфавита. Своя регулярка потребителя перекрывает тип; сломанная —
18
+ * повод сказать об этом в dev и вернуться к типу, а не уронить рендер.
19
+ */
20
+ export declare function createOtpMatcher(type: GrOtpInputType, pattern?: string): OtpMatcher;
21
+ export interface NormalizeOtpOptions {
22
+ /** Значение до правки: по нему считается, сколько символов вставлено. */
23
+ previous: string;
24
+ /** Сырое содержимое поля после события `input`. */
25
+ raw: string;
26
+ /** Каретка в координатах **сырой** строки. */
27
+ caret: number;
28
+ length: number;
29
+ matcher: OtpMatcher;
30
+ /** Приводить ли к верхнему регистру: коды печатают капсом. */
31
+ uppercase: boolean;
32
+ }
33
+ export interface NormalizedOtp {
34
+ value: string;
35
+ caret: number;
36
+ }
37
+ /**
38
+ * Свести сырое содержимое поля к коду фиксированной длины.
39
+ *
40
+ * Одна функция на все источники ввода — символ с клавиатуры, вставка из буфера,
41
+ * подстановка кода из SMS, — потому что различить их по событию нельзя:
42
+ * мобильные клавиатуры и автозаполнение присылают целую строку одним `input`.
43
+ *
44
+ * Три шага, и каждый закрывает свой отказ:
45
+ *
46
+ * 1. **Отсев чужих символов с переносом каретки.** Индексы после отсева
47
+ * съезжают, и каретку надо считать в новых координатах, иначе вставка
48
+ * `123-456` поставит её на два символа правее конца.
49
+ * 2. **Печать заменяет, а не сдвигает.** Ячейка держит ровно один символ, и
50
+ * напечатанное в неё занимает её место, а хвост кода остаётся где стоял.
51
+ * Правило безусловное, а не «когда поле заполнено»: иначе одно и то же
52
+ * нажатие в начале кода то заменяло бы символ, то двигало весь остаток —
53
+ * в зависимости от того, сколько ячеек занято.
54
+ * 3. **Обрезка по длине.** Вставка длиннее поля режется со стороны каретки:
55
+ * выкусывать за ней уже нечего, а сдвигать набранное нельзя.
56
+ */
57
+ export declare function normalizeOtpInput(options: NormalizeOtpOptions): NormalizedOtp;
58
+ /** Отсев без каретки — для значения, пришедшего из `v-model`. */
59
+ export declare function sanitizeOtpValue(value: string, options: {
60
+ length: number;
61
+ matcher: OtpMatcher;
62
+ uppercase: boolean;
63
+ }): string;
64
+ /**
65
+ * Индексы ячеек, **перед** которыми стоит разделитель.
66
+ *
67
+ * Разбивка, не сходящаяся с длиной, — ошибка потребителя, а не повод рисовать
68
+ * половину: группы игнорируются целиком, о чём говорит предупреждение в вызове.
69
+ */
70
+ export declare function otpSeparatorIndexes(length: number, groups?: number[]): Set<number>;
71
+ export declare function isOtpGroupsValid(length: number, groups?: number[]): boolean;
@@ -0,0 +1,7 @@
1
+ export declare const grOtpInputClassTokens: {
2
+ readonly root: readonly string[];
3
+ readonly field: string[];
4
+ readonly cell: readonly string[];
5
+ readonly decoration: readonly string[];
6
+ };
7
+ export declare const grOtpInputSafelist: string[];
@@ -1,5 +1,5 @@
1
1
  import { type GrSwitchLabelPosition, type GrSwitchSize } from './grSwitchStyles';
2
- export type { GrSwitchLabelPosition, GrSwitchSize } from './grSwitchStyles';
2
+ export type { GrSwitchLabelPosition, GrSwitchSize, GrSwitchStateTextSize, } from './grSwitchStyles';
3
3
  /**
4
4
  * Пропсы публичного GR-примитива «Switch».
5
5
  */
@@ -35,6 +35,20 @@ export interface GrSwitchProps {
35
35
  activeBackgroundColor?: string;
36
36
  /** Кастомный цвет фона в неактивном состоянии. Если не задан — `var(--gr-muted)`. */
37
37
  inactiveBackgroundColor?: string;
38
+ /**
39
+ * Подпись состояния внутри дорожки — на свободной от бегунка стороне.
40
+ * Помещается только на `md` и `lg`; на мелких ступенях не рисуется.
41
+ */
42
+ showStateText?: boolean;
43
+ /** Текст включённого состояния. Без него — `gr.switch.on` из локали. */
44
+ checkedText?: string;
45
+ /** Текст выключенного состояния. Без него — `gr.switch.off` из локали. */
46
+ uncheckedText?: string;
47
+ /**
48
+ * Дорожка растягивается под подпись, а ступень размера становится нижней
49
+ * границей ширины. Без `showStateText` смысла не имеет: тянуться не под что.
50
+ */
51
+ autoWidth?: boolean;
38
52
  }
39
53
  export interface GrSwitchEmits {
40
54
  (e: 'update:modelValue', value: boolean): void;
@@ -42,12 +56,24 @@ export interface GrSwitchEmits {
42
56
  (e: 'focus', event: FocusEvent): void;
43
57
  (e: 'blur', event: FocusEvent): void;
44
58
  }
45
- declare function focus(): void;
46
- declare function blur(): void;
47
59
  type __VLS_Slots = {
48
60
  /** Подпись переключателя. */
49
- default?: () => any;
61
+ 'default'?: () => any;
62
+ /**
63
+ * Знак на бегунке во включённом состоянии — галочка, замок, что угодно.
64
+ *
65
+ * Размер задаёт обёртка по ступени `size`, поэтому содержимое слота тянется
66
+ * до неё: `class="h-full w-full"`, как у `GrBadge` и `GrChip`.
67
+ *
68
+ * Знак декоративен — бегунок целиком `aria-hidden`, а состояние диктор берёт
69
+ * из `aria-checked`. Смысла, которого нет больше нигде, сюда класть нельзя.
70
+ */
71
+ 'checked-icon'?: () => any;
72
+ /** То же для выключенного состояния. Слоты независимы. */
73
+ 'unchecked-icon'?: () => any;
50
74
  };
75
+ declare function focus(): void;
76
+ declare function blur(): void;
51
77
  declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToOption<GrSwitchProps>, {
52
78
  modelValue: boolean;
53
79
  disabled: boolean;
@@ -64,6 +90,10 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
64
90
  form: undefined;
65
91
  activeBackgroundColor: undefined;
66
92
  inactiveBackgroundColor: undefined;
93
+ showStateText: undefined;
94
+ checkedText: undefined;
95
+ uncheckedText: undefined;
96
+ autoWidth: undefined;
67
97
  }>>, {
68
98
  focus: typeof focus;
69
99
  blur: typeof blur;
@@ -88,6 +118,10 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
88
118
  form: undefined;
89
119
  activeBackgroundColor: undefined;
90
120
  inactiveBackgroundColor: undefined;
121
+ showStateText: undefined;
122
+ checkedText: undefined;
123
+ uncheckedText: undefined;
124
+ autoWidth: undefined;
91
125
  }>>> & Readonly<{
92
126
  onBlur?: ((event: FocusEvent) => any) | undefined;
93
127
  onChange?: ((value: boolean) => any) | undefined;
@@ -100,6 +134,8 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
100
134
  size: GrSwitchSize;
101
135
  labelPosition: GrSwitchLabelPosition;
102
136
  loading: boolean;
137
+ showStateText: boolean;
138
+ autoWidth: boolean;
103
139
  value: string;
104
140
  name: string;
105
141
  invalid: boolean;
@@ -109,6 +145,8 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
109
145
  loadingText: string;
110
146
  activeBackgroundColor: string;
111
147
  inactiveBackgroundColor: string;
148
+ checkedText: string;
149
+ uncheckedText: string;
112
150
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
113
151
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
114
152
  declare const _default: typeof __VLS_export;
@@ -6,6 +6,8 @@ import type { GrSwitchSize } from './grSwitchStyles';
6
6
  */
7
7
  export interface GrSwitchConfigurableProps {
8
8
  size: GrSwitchSize;
9
+ showStateText: boolean;
10
+ autoWidth: boolean;
9
11
  }
10
12
  declare module '../../composables/useGrComponentConfig' {
11
13
  interface GrComponentDefaultsRegistry {
@@ -12,39 +12,59 @@ export declare const rootBase = "inline-flex items-center gap-2 select-none disa
12
12
  export declare const rootLabelPositions: Record<GrSwitchLabelPosition, string>;
13
13
  export declare const trackBase = "relative inline-flex shrink-0 items-center rounded-[var(--gr-radius-full)] border border-[var(--gr-switch-track-brd)] transition-colors duration-[var(--gr-duration-fast)]";
14
14
  export declare const trackSizes: Record<GrSwitchSize, string>;
15
- export declare const thumbBase = "inline-flex shrink-0 items-center justify-center rounded-[var(--gr-radius-full)] bg-[var(--gr-card)] shadow-[var(--gr-shadow-1)] transition-transform duration-[var(--gr-duration-fast)]";
15
+ /**
16
+ * Дорожка в режиме `autoWidth`: та же ступень становится **нижней границей**,
17
+ * а ширину берёт подпись. Высота остаётся фиксированной — тянется только строка.
18
+ */
19
+ export declare const trackAutoSizes: Record<GrSwitchSize, string>;
20
+ export declare const thumbBase = "absolute top-[1px] inline-flex shrink-0 items-center justify-center rounded-[var(--gr-radius-full)] bg-[var(--gr-card)] shadow-[var(--gr-shadow-1)] transition-[left,transform] duration-[var(--gr-duration-fast)]";
16
21
  export declare const thumbSizes: Record<GrSwitchSize, string>;
17
- /** Спиннер загрузки живёт в бегунке, поэтому мельче его на ступень. */
18
- export declare const thumbSpinnerSizes: Record<GrSwitchSize, string>;
19
- export declare const thumbSpinnerBase = "animate-spin text-[var(--gr-muted-fg)]";
20
22
  /**
21
- * Сдвиг бегунка по горизонтали.
23
+ * Содержимое бегунка спиннер загрузки или иконка действия — мельче его на
24
+ * ступень: иначе знак упирается в края круга и теряет форму.
25
+ */
26
+ export declare const thumbContentSizes: Record<GrSwitchSize, string>;
27
+ /**
28
+ * Цвет содержимого бегунка — один на спиннер и иконку.
29
+ *
30
+ * Хук с фолбэком в самом классе, а не инлайн-значение: инлайн победил бы CSS
31
+ * потребителя, и переопределить цвет было бы нечем.
22
32
  *
23
- * Бегунок обычный флекс-ребёнок дорожки, поэтому сдвиг отсчитывается от её
24
- * **content-box**, а он на 2px уже внешнего размера: рамка по 1px с каждой
25
- * стороны. Отсюда и весь расчёт.
33
+ * По состоянию цвет не ветвится и в `disabled` не тускнеет: гасится дорожка, а
34
+ * бегунок остаётся `--gr-card` в любом состоянии содержимое, меняющее цвет,
35
+ * разошлось бы со своей же подложкой.
36
+ */
37
+ export declare const thumbContentColorClass = "text-[var(--gr-switch-thumb-fg,var(--gr-muted-fg))]";
38
+ export declare const thumbSpinnerBase = "animate-spin text-[var(--gr-switch-thumb-fg,var(--gr-muted-fg))]";
39
+ /** Обёртка иконки держит размер, содержимое слота тянется до неё `h-full w-full`. */
40
+ export declare const thumbIconBase = "inline-flex shrink-0 items-center justify-center text-[var(--gr-switch-thumb-fg,var(--gr-muted-fg))]";
41
+ /**
42
+ * Зазор бегунка со всех сторон, px.
26
43
  *
27
- * Зазор по вертикали задан геометрией и равен 1px на всех ступенях
28
- * (`(content-height − thumb) / 2`, дорожка центрирует бегунок сама). Значит и по
29
- * горизонтали он обязан быть 1px: иначе бегунок в покое выглядит вдавленным
44
+ * Дорожка `border-box` с рамкой 1px, и по вертикали зазор задан геометрией:
45
+ * `(content-height − thumb) / 2` даёт ровно 1 на всех ступенях. Значит и по
46
+ * горизонтали он обязан быть тем же: иначе бегунок в покое выглядит вдавленным
30
47
  * внутрь, а в крайнем положении прижатым к краю — именно так и было, зазоры
31
48
  * расходились на 1–2px у `xs`, `sm` и `lg`.
32
49
  *
33
- * | ступень | дорожка | content | бегунок | покой | крайнее |
34
- * | --- | --- | --- | --- | --- | --- |
35
- * | `xs` | 28 | 26 | 12 | 1 | 13 |
36
- * | `sm` | 36 | 34 | 16 | 1 | 17 |
37
- * | `md` | 44 | 42 | 20 | 1 | 21 |
38
- * | `lg` | 56 | 54 | 24 | 1 | 29 |
50
+ * Гейт живёт в `__tests__/GrSwitch.test.ts` и считает вертикаль заново из
51
+ * `trackSizes`/`thumbSizes`, поэтому смена любой ступени размера сразу покажет
52
+ * разъехавшийся зазор.
53
+ */
54
+ export declare const SWITCH_THUMB_GAP = 1;
55
+ /**
56
+ * Положение бегунка — **без единого числа, зависящего от ширины дорожки**.
57
+ *
58
+ * Крайнее положение выражено парой `left: calc(100% − зазор)` и
59
+ * `translateX(-100%)`: процент в `left` считается от padding-box дорожки,
60
+ * процент в `transform` — от самого бегунка. В сумме левый край встаёт на
61
+ * `ширина − бегунок − зазор`, какой бы ширина ни была.
39
62
  *
40
- * Крайнее положение `content thumb зазор`. Гейт на эту арифметику живёт в
41
- * `__tests__/GrSwitch.test.ts`: он считает её заново из `trackSizes`/`thumbSizes`,
42
- * поэтому смена любой ступени размера сразу покажет разъехавшийся зазор.
63
+ * Обе величины анимируются, и композиция даёт строго линейный ход: в момент `t`
64
+ * смещение равно `t · (ширина бегунок)`. Поэтому режим `autoWidth` не требует
65
+ * ни измерений, ни ResizeObserver только эти два класса.
43
66
  */
44
- export declare const thumbTranslations: Record<GrSwitchSize, {
45
- checked: string;
46
- unchecked: string;
47
- }>;
67
+ export declare const thumbPositions: Record<'checked' | 'unchecked', string>;
48
68
  export declare const labelBase = "text-[var(--gr-muted-fg)]";
49
69
  /**
50
70
  * Недоступность гасится токеном, а не `opacity`: прозрачность разбавляет
@@ -53,8 +73,92 @@ export declare const labelBase = "text-[var(--gr-muted-fg)]";
53
73
  export declare const labelDisabledClass = "text-[var(--gr-disabled-fg)]";
54
74
  export declare const labelSizes: Record<GrSwitchSize, string>;
55
75
  export declare function grSwitchRootClass(labelPosition: GrSwitchLabelPosition): string;
56
- export declare function grSwitchTrackClass(size: GrSwitchSize): string;
76
+ export declare function grSwitchTrackClass(size: GrSwitchSize, autoWidth?: boolean): string;
57
77
  export declare function grSwitchThumbClass(options: GrSwitchThumbClassOptions): string;
58
78
  export declare function grSwitchSpinnerClass(size: GrSwitchSize): string;
79
+ export declare function grSwitchThumbIconClass(size: GrSwitchSize): string;
59
80
  export declare function grSwitchLabelClass(size: GrSwitchSize, disabled?: boolean): string;
81
+ /**
82
+ * Ступени, на которых подпись состояния помещается внутрь дорожки.
83
+ *
84
+ * Свободное место рядом с бегунком — `content − (бегунок + зазор)`, то есть
85
+ * 13 / 17 / 21 / 29px на `xs` / `sm` / `md` / `lg`. Минимальная ступень
86
+ * типографики пакета — `--gr-text-xs` (12px), и «OFF» на ней занимает ~25px;
87
+ * собственные 10px дают ~20px. В 13 и 17 не встаёт и это, а ужимать шрифт
88
+ * дальше значит сделать подпись нечитаемой ради того, чтобы она была.
89
+ */
90
+ export declare const GR_SWITCH_STATE_TEXT_SIZES: readonly ["md", "lg"];
91
+ export type GrSwitchStateTextSize = typeof GR_SWITCH_STATE_TEXT_SIZES[number];
92
+ /** Свободное место в дорожке рядом с бегунком, px. Считается гейтом заново. */
93
+ export declare const stateTextRoom: Record<GrSwitchSize, number>;
94
+ export declare function isGrSwitchStateTextSize(size: GrSwitchSize): size is GrSwitchStateTextSize;
95
+ /**
96
+ * Ячейка подписи. Грид, а не флекс, ради второго режима: в `autoWidth` в ту же
97
+ * клетку кладётся невидимый дубль противоположного текста, и ширина ячейки
98
+ * становится максимумом из двух — иначе дорожка дёргалась бы на каждом щелчке
99
+ * («ON» 15.6px против «OFF» 19.9px).
100
+ */
101
+ export declare const stateTextBase = "pointer-events-none grid items-center justify-items-center overflow-hidden font-semibold uppercase leading-none";
102
+ /**
103
+ * Где ячейка живёт. При фиксированной ширине она накрывает дорожку и на её
104
+ * размер не влияет; в `autoWidth` встаёт в поток и ширину как раз задаёт.
105
+ */
106
+ export declare const stateTextLayouts: Record<'fixed' | 'auto', string>;
107
+ /** Оба текста ложатся в одну клетку грида — отсюда максимум по ширине. */
108
+ export declare const stateTextStackClass = "col-start-1 row-start-1";
109
+ /** Дубль занимает место, но не рисуется: `visibility`, а не `display`. */
110
+ export declare const stateTextGhostClass = "col-start-1 row-start-1 invisible";
111
+ /**
112
+ * Кегль подписи — свой, а не ступень шкалы пакета: минимальный `--gr-text-xs`
113
+ * это 12px, и трёхбуквенное слово на нём занимает ~24px при 21px места.
114
+ *
115
+ * Значения меряны, а не выведены (Inter 600, uppercase). На `md` в 21px:
116
+ * «OFF» 17.9, «НЕТ» 18.8, «ВКЛ» 19.4 — то есть 9px берёт трёхбуквенные слова
117
+ * во всех трёх локалях с запасом; 10px оставлял «НЕТ» 0.1px до обреза.
118
+ * На `lg` места 29px, и 11px там читается лучше, не рискуя ничем.
119
+ *
120
+ * Четырёхбуквенное «ВЫКЛ» не встаёт ни на одной ступени и ни при каком кегле
121
+ * (31px на 10px кегля) — поэтому русский дефолт «ДА»/«НЕТ», а не «ВКЛ»/«ВЫКЛ».
122
+ */
123
+ export declare const stateTextSizes: Record<GrSwitchStateTextSize, string>;
124
+ /** Отступ со стороны бегунка — `бегунок + зазор`; остаток и есть место подписи. */
125
+ export declare const stateTextPaddings: Record<GrSwitchStateTextSize, {
126
+ checked: string;
127
+ unchecked: string;
128
+ }>;
129
+ /**
130
+ * Отступы в `autoWidth` — те же, плюс воздух с **обеих** сторон.
131
+ *
132
+ * При фиксированной ширине текст центруется в остатке и сам ни во что не
133
+ * упирается. Здесь остатка нет: ширину задаёт сам текст, и без воздуха он
134
+ * прилипает к бегунку с одной стороны и к закруглению с другой — проверено
135
+ * глазами, «ОНЛАЙН» вплотную к бегунку читается как дефект вёрстки.
136
+ *
137
+ * Поэтому со стороны бегунка отступ равен `бегунок + зазор + воздух`, а со
138
+ * свободной — просто воздуху. Воздух: 8px на `md`, 10px на `lg`.
139
+ */
140
+ export declare const stateTextAutoPaddings: Record<GrSwitchStateTextSize, {
141
+ checked: string;
142
+ unchecked: string;
143
+ }>;
144
+ /**
145
+ * Цвет подписи — роль `-fg` той заливки, на которой она лежит.
146
+ *
147
+ * Хук стоит фолбэком в самом классе, а не инлайн-значением: инлайн победил бы
148
+ * CSS потребителя, и переопределить токен было бы нечем. Заливку дорожки задают
149
+ * произвольным цветом (`activeBackgroundColor`), и безопасный цвет текста на
150
+ * ней библиотека не вычислит — его называет тот же, кто задал фон.
151
+ */
152
+ export declare const stateTextColors: {
153
+ readonly checked: "text-[var(--gr-switch-state-text-fg,var(--gr-primary-fg))]";
154
+ readonly unchecked: "text-[var(--gr-switch-state-text-fg,var(--gr-muted-fg))]";
155
+ readonly disabled: "text-[var(--gr-switch-state-text-fg,var(--gr-disabled-fg))]";
156
+ };
157
+ type GrSwitchStateTextClassOptions = {
158
+ size: GrSwitchStateTextSize;
159
+ checked: boolean;
160
+ disabled: boolean;
161
+ autoWidth: boolean;
162
+ };
163
+ export declare function grSwitchStateTextClass(options: GrSwitchStateTextClassOptions): string;
60
164
  export {};
@@ -5,6 +5,6 @@ export { default as GrSwitch } from './GrSwitch.vue';
5
5
  export { grSwitchConfig } from './config';
6
6
  export type { GrSwitchConfigurableProps } from './defaults';
7
7
  export { grSwitchSafelist } from './safelist';
8
- export type { GrSwitchLabelPosition, GrSwitchProps, GrSwitchSize } from './GrSwitch.vue';
8
+ export type { GrSwitchLabelPosition, GrSwitchProps, GrSwitchSize, GrSwitchStateTextSize, } from './GrSwitch.vue';
9
9
  export type { GrSwitchEmits } from './GrSwitch.vue';
10
10
  export type GrSwitchInstance = ComponentExposed<typeof GrSwitchComponent>;
@@ -2,12 +2,13 @@ export declare const grSwitchClassTokens: {
2
2
  readonly rootBase: string[];
3
3
  readonly rootLabelPositions: string[];
4
4
  readonly trackBase: string[];
5
- readonly trackSizes: string[];
5
+ readonly trackSizes: readonly string[];
6
6
  readonly thumbBase: string[];
7
7
  readonly thumbSizes: string[];
8
- readonly thumbSpinner: readonly string[];
9
- readonly thumbTranslations: string[];
8
+ readonly thumbContent: readonly string[];
9
+ readonly thumbPositions: string[];
10
10
  readonly labelBase: readonly string[];
11
11
  readonly labelSizes: string[];
12
+ readonly stateText: readonly string[];
12
13
  };
13
14
  export declare const grSwitchSafelist: string[];
@@ -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";
@@ -61,6 +61,7 @@ export declare const granularityComponentConfigs: {
61
61
  GrModal: GranularComponentDescriptor<"GrModal">;
62
62
  GrNavbar: GranularComponentDescriptor<"GrNavbar">;
63
63
  GrNumberInput: GranularComponentDescriptor<"GrNumberInput">;
64
+ GrOtpInput: GranularComponentDescriptor<"GrOtpInput">;
64
65
  GrPagination: GranularComponentDescriptor<"GrPagination">;
65
66
  GrPopover: GranularComponentDescriptor<"GrPopover">;
66
67
  GrProgressBar: GranularComponentDescriptor<"GrProgressBar">;
@@ -105,6 +105,14 @@ export declare const en: {
105
105
  columnMoved: string;
106
106
  resizeColumn: string;
107
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;
108
116
  };
109
117
  breadcrumbs: {
110
118
  label: string;
@@ -146,6 +154,8 @@ export declare const en: {
146
154
  };
147
155
  switch: {
148
156
  loading: string;
157
+ on: string;
158
+ off: string;
149
159
  };
150
160
  slider: {
151
161
  min: string;
@@ -500,6 +510,14 @@ export declare const en: {
500
510
  columnMoved: string;
501
511
  resizeColumn: string;
502
512
  columnResized: string;
513
+ expandRow: string;
514
+ collapseRow: string;
515
+ detailLoading: string;
516
+ detailError: string;
517
+ detailRetry: string;
518
+ detailExpanded: string;
519
+ detailCollapsed: string;
520
+ detailReady: string;
503
521
  };
504
522
  breadcrumbs: {
505
523
  label: string;
@@ -541,6 +559,8 @@ export declare const en: {
541
559
  };
542
560
  switch: {
543
561
  loading: string;
562
+ on: string;
563
+ off: string;
544
564
  };
545
565
  slider: {
546
566
  min: string;
@@ -98,6 +98,14 @@ export declare const es: {
98
98
  columnMoved: string;
99
99
  resizeColumn: string;
100
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;
101
109
  };
102
110
  breadcrumbs: {
103
111
  label: string;
@@ -140,6 +148,8 @@ export declare const es: {
140
148
  };
141
149
  switch: {
142
150
  loading: string;
151
+ on: string;
152
+ off: string;
143
153
  };
144
154
  slider: {
145
155
  min: string;
@@ -495,6 +505,14 @@ export declare const es: {
495
505
  columnMoved: string;
496
506
  resizeColumn: string;
497
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;
498
516
  };
499
517
  breadcrumbs: {
500
518
  label: string;
@@ -537,6 +555,8 @@ export declare const es: {
537
555
  };
538
556
  switch: {
539
557
  loading: string;
558
+ on: string;
559
+ off: string;
540
560
  };
541
561
  slider: {
542
562
  min: string;
@@ -98,6 +98,14 @@ export declare const ru: {
98
98
  columnMoved: string;
99
99
  resizeColumn: string;
100
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;
101
109
  };
102
110
  breadcrumbs: {
103
111
  label: string;
@@ -141,6 +149,8 @@ export declare const ru: {
141
149
  };
142
150
  switch: {
143
151
  loading: string;
152
+ on: string;
153
+ off: string;
144
154
  };
145
155
  slider: {
146
156
  min: string;
@@ -497,6 +507,14 @@ export declare const ru: {
497
507
  columnMoved: string;
498
508
  resizeColumn: string;
499
509
  columnResized: string;
510
+ expandRow: string;
511
+ collapseRow: string;
512
+ detailLoading: string;
513
+ detailError: string;
514
+ detailRetry: string;
515
+ detailExpanded: string;
516
+ detailCollapsed: string;
517
+ detailReady: string;
500
518
  };
501
519
  breadcrumbs: {
502
520
  label: string;
@@ -540,6 +558,8 @@ export declare const ru: {
540
558
  };
541
559
  switch: {
542
560
  loading: string;
561
+ on: string;
562
+ off: string;
543
563
  };
544
564
  slider: {
545
565
  min: string;
@@ -48,6 +48,7 @@ export * from './components/GrLoading';
48
48
  export * from './components/GrModal';
49
49
  export * from './components/GrNavbar';
50
50
  export * from './components/GrNumberInput';
51
+ export * from './components/GrOtpInput';
51
52
  export * from './components/GrPagination';
52
53
  export * from './components/GrPopover';
53
54
  export * from './components/GrProgressBar';