@feugene/granularity 0.48.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.
- package/README.md +3 -3
- package/dist/chunks/{config-2vrOFn2f.js → config-AKpLyIGD.js} +2 -2
- package/dist/chunks/{config-2vrOFn2f.js.map → config-AKpLyIGD.js.map} +1 -1
- package/dist/chunks/config-BBtBQE3s.js +108 -0
- package/dist/chunks/config-BBtBQE3s.js.map +1 -0
- package/dist/chunks/{config-BscVxZR3.js → config-DF1ezU6y.js} +1 -1
- package/dist/chunks/{config-BscVxZR3.js.map → config-DF1ezU6y.js.map} +1 -1
- package/dist/chunks/config-MUkhktTP.js +267 -0
- package/dist/chunks/config-MUkhktTP.js.map +1 -0
- package/dist/chunks/{en-Bxyn5lW7.js → en-CsQUoBS2.js} +5 -1
- package/dist/chunks/en-CsQUoBS2.js.map +1 -0
- package/dist/chunks/{es-Dtl-a7ui.js → es-9nbkPvdA.js} +5 -1
- package/dist/chunks/es-9nbkPvdA.js.map +1 -0
- package/dist/chunks/{es-Bj_vc18Z.js → es-DrUz5J6I.js} +3 -3
- package/dist/chunks/{es-Bj_vc18Z.js.map → es-DrUz5J6I.js.map} +1 -1
- package/dist/chunks/{generated-hELWB0gZ.js → generated-CxvC5O0V.js} +42 -0
- package/dist/chunks/{generated-hELWB0gZ.js.map → generated-CxvC5O0V.js.map} +1 -1
- package/dist/chunks/{grBadgeStyles-DV0DrAew.js → grBadgeStyles-D51AXbj5.js} +57 -1
- package/dist/chunks/grBadgeStyles-D51AXbj5.js.map +1 -0
- package/dist/chunks/{grChipStyles-DcDyxAL0.js → grChipStyles-CA9Wj1_E.js} +1 -1
- package/dist/chunks/{grChipStyles-DcDyxAL0.js.map → grChipStyles-CA9Wj1_E.js.map} +1 -1
- package/dist/chunks/{granular-provider-BOQp7N5o.js → granular-provider-B6xomapW.js} +5 -3
- package/dist/chunks/granular-provider-B6xomapW.js.map +1 -0
- package/dist/chunks/{ru-hrB4I1u_.js → ru-88i1WG0b.js} +5 -1
- package/dist/chunks/ru-88i1WG0b.js.map +1 -0
- package/dist/chunks/{safelist-x8USecK8.js → safelist-CSfynUC1.js} +5 -1
- package/dist/chunks/safelist-CSfynUC1.js.map +1 -0
- package/dist/components/GrAutocomplete/chunks/{GrAutocomplete-C-uovdv8.js → GrAutocomplete-Chhw65pI.js} +2 -2
- package/dist/components/GrAutocomplete/chunks/{GrAutocomplete-C-uovdv8.js.map → GrAutocomplete-Chhw65pI.js.map} +1 -1
- package/dist/components/GrAutocomplete/index.js +1 -1
- package/dist/components/GrBadge/chunks/GrBadge-C42KLyUD.js +71 -0
- package/dist/components/GrBadge/chunks/GrBadge-C42KLyUD.js.map +1 -0
- package/dist/components/GrBadge/index.js +3 -3
- package/dist/components/GrBadge/styles.css +1 -1
- package/dist/components/GrChip/chunks/{GrChip-CKqyzYcv.js → GrChip-DoyS1Dr4.js} +1 -1
- package/dist/components/GrChip/chunks/{GrChip-CKqyzYcv.js.map → GrChip-DoyS1Dr4.js.map} +1 -1
- package/dist/components/GrChip/index.js +2 -2
- package/dist/components/GrInputTag/chunks/{GrInputTag-CO0YU-ok.js → GrInputTag-qnRdAZnn.js} +2 -2
- package/dist/components/GrInputTag/chunks/{GrInputTag-CO0YU-ok.js.map → GrInputTag-qnRdAZnn.js.map} +1 -1
- package/dist/components/GrInputTag/index.js +1 -1
- package/dist/components/GrOtpInput/chunks/GrOtpInput-B_Q-RDLw.js +419 -0
- package/dist/components/GrOtpInput/chunks/GrOtpInput-B_Q-RDLw.js.map +1 -0
- package/dist/components/GrOtpInput/index.js +3 -0
- package/dist/components/GrOtpInput/styles.css +1 -0
- package/dist/components/GrPagination/chunks/{GrPagination-BbaF5eXk.js → GrPagination-CMrLPzvL.js} +1 -1
- package/dist/components/GrPagination/chunks/{GrPagination-BbaF5eXk.js.map → GrPagination-CMrLPzvL.js.map} +1 -1
- package/dist/components/GrPagination/index.js +1 -1
- package/dist/components/GrSelect/chunks/{GrSelect-0iI4wdR_.js → GrSelect-DvSq-nV-.js} +2 -2
- package/dist/components/GrSelect/chunks/{GrSelect-0iI4wdR_.js.map → GrSelect-DvSq-nV-.js.map} +1 -1
- package/dist/components/GrSelect/index.js +1 -1
- package/dist/components/GrSwitch/chunks/{GrSwitch-CriHWT2A.js → GrSwitch-D7X42uIA.js} +61 -7
- package/dist/components/GrSwitch/chunks/GrSwitch-D7X42uIA.js.map +1 -0
- package/dist/components/GrSwitch/index.js +2 -2
- package/dist/granular-provider-node.js +1 -1
- package/dist/granular-provider.js +1 -1
- package/dist/i18n/all.js +1 -1
- package/dist/i18n/index.js +1 -1
- package/dist/index.js +14 -13
- package/dist/theme.js +1 -1
- package/dist/tokens.js +1 -1
- package/dist/types/components/GrBadge/GrBadge.vue.d.ts +15 -1
- package/dist/types/components/GrBadge/grBadgeStyles.d.ts +57 -0
- package/dist/types/components/GrBadge/index.d.ts +1 -1
- package/dist/types/components/GrOtpInput/GrOtpInput.vue.d.ts +164 -0
- package/dist/types/components/GrOtpInput/config.d.ts +1 -0
- package/dist/types/components/GrOtpInput/defaults.d.ts +15 -0
- package/dist/types/components/GrOtpInput/grOtpInputStyles.d.ts +62 -0
- package/dist/types/components/GrOtpInput/index.d.ts +9 -0
- package/dist/types/components/GrOtpInput/otpValue.d.ts +71 -0
- package/dist/types/components/GrOtpInput/safelist.d.ts +7 -0
- package/dist/types/components/GrSwitch/GrSwitch.vue.d.ts +42 -4
- package/dist/types/components/GrSwitch/defaults.d.ts +2 -0
- package/dist/types/components/GrSwitch/grSwitchStyles.d.ts +129 -25
- package/dist/types/components/GrSwitch/index.d.ts +1 -1
- package/dist/types/components/GrSwitch/safelist.d.ts +4 -3
- package/dist/types/granular-provider/shared.d.ts +1 -0
- package/dist/types/i18n/messages/en.d.ts +4 -0
- package/dist/types/i18n/messages/es.d.ts +4 -0
- package/dist/types/i18n/messages/ru.d.ts +4 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/web-types.json +254 -8
- package/package.json +5 -1
- package/dist/chunks/config-Yy67uWHY.js +0 -140
- package/dist/chunks/config-Yy67uWHY.js.map +0 -1
- package/dist/chunks/en-Bxyn5lW7.js.map +0 -1
- package/dist/chunks/es-Dtl-a7ui.js.map +0 -1
- package/dist/chunks/grBadgeStyles-DV0DrAew.js.map +0 -1
- package/dist/chunks/granular-provider-BOQp7N5o.js.map +0 -1
- package/dist/chunks/ru-hrB4I1u_.js.map +0 -1
- package/dist/chunks/safelist-x8USecK8.js.map +0 -1
- package/dist/components/GrBadge/chunks/GrBadge-DBeQXEir.js +0 -47
- package/dist/components/GrBadge/chunks/GrBadge-DBeQXEir.js.map +0 -1
- package/dist/components/GrSwitch/chunks/GrSwitch-CriHWT2A.js.map +0 -1
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { type GrOtpInputSize } from './grOtpInputStyles';
|
|
2
|
+
import { type GrOtpInputType } from './otpValue';
|
|
3
|
+
export type { GrOtpInputSize } from './grOtpInputStyles';
|
|
4
|
+
export type { GrOtpInputType } from './otpValue';
|
|
5
|
+
export interface GrOtpInputProps {
|
|
6
|
+
/** Код целиком, без разделителей. */
|
|
7
|
+
modelValue?: string;
|
|
8
|
+
/** Число ячеек. */
|
|
9
|
+
length?: number;
|
|
10
|
+
/** Допустимый алфавит и раскладка мобильной клавиатуры. */
|
|
11
|
+
type?: GrOtpInputType;
|
|
12
|
+
/** Свой алфавит регуляркой на **один символ**. Перекрывает `type`. */
|
|
13
|
+
pattern?: string;
|
|
14
|
+
/** Разбивка на группы: `[3, 3]` рисует `123 – 456`. Сумма обязана равняться `length`. */
|
|
15
|
+
groups?: number[];
|
|
16
|
+
/** Точки вместо символов — сценарий PIN. На `modelValue` не влияет. */
|
|
17
|
+
masked?: boolean;
|
|
18
|
+
/** Знак в пустой ячейке. */
|
|
19
|
+
placeholder?: string;
|
|
20
|
+
size?: GrOtpInputSize;
|
|
21
|
+
autofocus?: boolean;
|
|
22
|
+
/** `autocomplete="one-time-code"`: код из SMS подставляется на iOS и macOS. */
|
|
23
|
+
oneTimeCode?: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Приём кода из SMS на Android через WebOTP. Выключен: требует HTTPS и
|
|
26
|
+
* особого хвоста в тексте сообщения, который добавляет бэкенд.
|
|
27
|
+
*/
|
|
28
|
+
webOtp?: boolean;
|
|
29
|
+
/** Имя поля для нативной отправки формы. */
|
|
30
|
+
name?: string;
|
|
31
|
+
/** `id` формы, если поле лежит вне неё. */
|
|
32
|
+
form?: string;
|
|
33
|
+
disabled?: boolean;
|
|
34
|
+
readonly?: boolean;
|
|
35
|
+
invalid?: boolean;
|
|
36
|
+
required?: boolean;
|
|
37
|
+
ariaLabel?: string;
|
|
38
|
+
}
|
|
39
|
+
export interface GrOtpInputEmits {
|
|
40
|
+
(e: 'update:modelValue', value: string): void;
|
|
41
|
+
(e: 'change', value: string): void;
|
|
42
|
+
(e: 'focus', event: FocusEvent): void;
|
|
43
|
+
(e: 'blur', event: FocusEvent): void;
|
|
44
|
+
/** Код набран целиком. Точка автосабмита. */
|
|
45
|
+
(e: 'complete', value: string): void;
|
|
46
|
+
}
|
|
47
|
+
type __VLS_Slots = {
|
|
48
|
+
/** Своё оформление ячейки. Размер и рамку по-прежнему держит компонент. */
|
|
49
|
+
cell?: (props: {
|
|
50
|
+
char: string;
|
|
51
|
+
index: number;
|
|
52
|
+
active: boolean;
|
|
53
|
+
filled: boolean;
|
|
54
|
+
masked: boolean;
|
|
55
|
+
}) => any;
|
|
56
|
+
/** Знак между группами. По умолчанию — тире. */
|
|
57
|
+
separator?: (props: {
|
|
58
|
+
index: number;
|
|
59
|
+
}) => any;
|
|
60
|
+
};
|
|
61
|
+
declare function focus(): void;
|
|
62
|
+
declare function blur(): void;
|
|
63
|
+
/** Штатный сценарий: сервер отверг код, поле чистится и снова ждёт ввода. */
|
|
64
|
+
declare function clear(): void;
|
|
65
|
+
declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToOption<GrOtpInputProps>, {
|
|
66
|
+
modelValue: string;
|
|
67
|
+
length: undefined;
|
|
68
|
+
type: string;
|
|
69
|
+
pattern: undefined;
|
|
70
|
+
groups: undefined;
|
|
71
|
+
masked: undefined;
|
|
72
|
+
placeholder: string;
|
|
73
|
+
size: undefined;
|
|
74
|
+
autofocus: boolean;
|
|
75
|
+
oneTimeCode: boolean;
|
|
76
|
+
webOtp: boolean;
|
|
77
|
+
name: undefined;
|
|
78
|
+
form: undefined;
|
|
79
|
+
disabled: boolean;
|
|
80
|
+
readonly: boolean;
|
|
81
|
+
invalid: boolean;
|
|
82
|
+
required: boolean;
|
|
83
|
+
ariaLabel: undefined;
|
|
84
|
+
}>>, {
|
|
85
|
+
focus: typeof focus;
|
|
86
|
+
blur: typeof blur;
|
|
87
|
+
clear: typeof clear;
|
|
88
|
+
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
89
|
+
"update:modelValue": (value: string) => void;
|
|
90
|
+
change: (value: string) => void;
|
|
91
|
+
focus: (event: FocusEvent) => void;
|
|
92
|
+
blur: (event: FocusEvent) => void;
|
|
93
|
+
complete: (value: string) => void;
|
|
94
|
+
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToOption<GrOtpInputProps>, {
|
|
95
|
+
modelValue: string;
|
|
96
|
+
length: undefined;
|
|
97
|
+
type: string;
|
|
98
|
+
pattern: undefined;
|
|
99
|
+
groups: undefined;
|
|
100
|
+
masked: undefined;
|
|
101
|
+
placeholder: string;
|
|
102
|
+
size: undefined;
|
|
103
|
+
autofocus: boolean;
|
|
104
|
+
oneTimeCode: boolean;
|
|
105
|
+
webOtp: boolean;
|
|
106
|
+
name: undefined;
|
|
107
|
+
form: undefined;
|
|
108
|
+
disabled: boolean;
|
|
109
|
+
readonly: boolean;
|
|
110
|
+
invalid: boolean;
|
|
111
|
+
required: boolean;
|
|
112
|
+
ariaLabel: undefined;
|
|
113
|
+
}>>> & Readonly<{
|
|
114
|
+
onBlur?: ((event: FocusEvent) => any) | undefined;
|
|
115
|
+
onChange?: ((value: string) => any) | undefined;
|
|
116
|
+
onFocus?: ((event: FocusEvent) => any) | undefined;
|
|
117
|
+
"onUpdate:modelValue"?: ((value: string) => any) | undefined;
|
|
118
|
+
onComplete?: ((value: string) => any) | undefined;
|
|
119
|
+
}>, {
|
|
120
|
+
length: number;
|
|
121
|
+
disabled: boolean;
|
|
122
|
+
readonly: boolean;
|
|
123
|
+
form: string;
|
|
124
|
+
pattern: string;
|
|
125
|
+
type: GrOtpInputType;
|
|
126
|
+
size: GrOtpInputSize;
|
|
127
|
+
masked: boolean;
|
|
128
|
+
name: string;
|
|
129
|
+
invalid: boolean;
|
|
130
|
+
ariaLabel: string;
|
|
131
|
+
modelValue: string;
|
|
132
|
+
required: boolean;
|
|
133
|
+
placeholder: string;
|
|
134
|
+
groups: number[];
|
|
135
|
+
autofocus: boolean;
|
|
136
|
+
oneTimeCode: boolean;
|
|
137
|
+
webOtp: boolean;
|
|
138
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
139
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
140
|
+
declare const _default: typeof __VLS_export;
|
|
141
|
+
export default _default;
|
|
142
|
+
type __VLS_TypePropsToOption<T> = {
|
|
143
|
+
[K in keyof T]-?: {} extends Pick<T, K> ? {
|
|
144
|
+
type: import('vue').PropType<Required<T>[K]>;
|
|
145
|
+
} : {
|
|
146
|
+
type: import('vue').PropType<T[K]>;
|
|
147
|
+
required: true;
|
|
148
|
+
};
|
|
149
|
+
};
|
|
150
|
+
type __VLS_WithDefaults<P, D> = {
|
|
151
|
+
[K in keyof Pick<P, keyof P>]: K extends keyof D ? __VLS_PrettifyLocal<P[K] & {
|
|
152
|
+
default: D[K];
|
|
153
|
+
}> : P[K];
|
|
154
|
+
};
|
|
155
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
156
|
+
new (): {
|
|
157
|
+
$slots: S;
|
|
158
|
+
};
|
|
159
|
+
};
|
|
160
|
+
type __VLS_PrettifyLocal<T> = (T extends any ? {
|
|
161
|
+
[K in keyof T]: T[K];
|
|
162
|
+
} : {
|
|
163
|
+
[K in keyof T as K]: T[K];
|
|
164
|
+
}) & {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const grOtpInputConfig: import("@feugene/unocss-preset-granular/contract").GranularComponentDescriptor<"GrOtpInput">;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { GrComponentSize } from '../GrConfigProvider/context';
|
|
2
|
+
/**
|
|
3
|
+
* Пропы `GrOtpInput`, настраиваемые глобально через `componentDefaults`.
|
|
4
|
+
* Только оформление и поведение по умолчанию — см. `GrButton/defaults.ts`.
|
|
5
|
+
*/
|
|
6
|
+
export interface GrOtpInputConfigurableProps {
|
|
7
|
+
size: GrComponentSize;
|
|
8
|
+
length: number;
|
|
9
|
+
masked: boolean;
|
|
10
|
+
}
|
|
11
|
+
declare module '../../composables/useGrComponentConfig' {
|
|
12
|
+
interface GrComponentDefaultsRegistry {
|
|
13
|
+
GrOtpInput: GrOtpInputConfigurableProps;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { GrComponentSize } from '../shared/sizes';
|
|
2
|
+
export type GrOtpInputSize = GrComponentSize;
|
|
3
|
+
/**
|
|
4
|
+
* `w-fit` тут не украшение. Гридовый или флексовый родитель **блокифицирует**
|
|
5
|
+
* `inline-flex`, и ряд растягивался на всю колонку: сами ячейки оставались на
|
|
6
|
+
* месте, а невидимое поле поверх них ловило клики далеко справа от кода.
|
|
7
|
+
*/
|
|
8
|
+
export declare const rootBaseClass = "relative inline-flex w-fit items-center";
|
|
9
|
+
export declare const rootGaps: Record<GrOtpInputSize, string>;
|
|
10
|
+
/**
|
|
11
|
+
* Настоящее поле лежит **поверх** ряда ячеек и невидимо: текст, каретка и
|
|
12
|
+
* подсветка выделения прозрачны, всё видимое рисуют ячейки.
|
|
13
|
+
*
|
|
14
|
+
* Оно остаётся полноценным `<input>`, и потому даром достаются вставка,
|
|
15
|
+
* автозаполнение кода из SMS, отмена, выделение и вся каретка со стрелками —
|
|
16
|
+
* см. `docs/components/GrOtpInput.md`.
|
|
17
|
+
*
|
|
18
|
+
* `z-index` не нужен: поле позиционировано, ячейки — нет, а позиционированный
|
|
19
|
+
* элемент и так красится поверх статичных соседей. Литерал слоя тут был бы
|
|
20
|
+
* лишней записью в шкале `docs/z-index.md`.
|
|
21
|
+
*/
|
|
22
|
+
export declare const fieldClass = "absolute inset-0 w-full cursor-text bg-transparent text-transparent [caret-color:transparent] outline-none selection:bg-transparent disabled:cursor-not-allowed";
|
|
23
|
+
export declare const cellBaseClass = "relative inline-flex shrink-0 items-center justify-center rounded-[var(--gr-radius-control)] border [font-variant-numeric:tabular-nums] transition-colors duration-[var(--gr-duration-fast)]";
|
|
24
|
+
/**
|
|
25
|
+
* Сторона ячейки повторяет высоту `GrInput` на той же ступени: код стоит в
|
|
26
|
+
* форме рядом с полями, и ряд обязан садиться с ними в одну линию.
|
|
27
|
+
*
|
|
28
|
+
* Через хук, а не классом-числом: квадратная ячейка — решение оформления, и
|
|
29
|
+
* макет вправе сделать её шире.
|
|
30
|
+
*/
|
|
31
|
+
export declare const cellSizes: Record<GrOtpInputSize, string>;
|
|
32
|
+
export declare const cellIdleClass = "border-[var(--gr-brd)] bg-[var(--gr-bg)] text-[var(--gr-fg)]";
|
|
33
|
+
/** Активная ячейка — та, в которой стоит каретка, и только пока поле в фокусе. */
|
|
34
|
+
export declare const cellActiveClass = "border-[var(--gr-otp-input-active-brd,var(--gr-primary))] ring-2 ring-[var(--gr-ring)]";
|
|
35
|
+
/**
|
|
36
|
+
* Вердикт валидации красится своей ролью, а не декоративным `danger`: тема
|
|
37
|
+
* вправе развести подсветку по решению разработчика и ошибку формы.
|
|
38
|
+
*/
|
|
39
|
+
export declare const cellInvalidClass = "border-[var(--gr-invalid-brd)] bg-[var(--gr-bg)] text-[var(--gr-fg)]";
|
|
40
|
+
export declare const cellInvalidActiveClass = "ring-2 ring-[var(--gr-invalid-ring)]";
|
|
41
|
+
/**
|
|
42
|
+
* Недоступность гасится фоном, а не `opacity`: прозрачность разбавляет
|
|
43
|
+
* выверенные на AA токены текста и роняет контраст кода.
|
|
44
|
+
*/
|
|
45
|
+
export declare const cellDisabledClass = "border-[var(--gr-disabled-brd)] bg-[var(--gr-disabled-bg)] text-[var(--gr-disabled-fg)]";
|
|
46
|
+
export declare const placeholderClass = "text-[var(--gr-muted-fg)]";
|
|
47
|
+
/**
|
|
48
|
+
* Каретка рисуется своей, потому что настоящая скрыта вместе с текстом.
|
|
49
|
+
* Мигание — CSS-анимация, значит подчиняется глобальному клампу движения
|
|
50
|
+
* пакета (`docs/motion.md`), а не собственному таймеру.
|
|
51
|
+
*/
|
|
52
|
+
export declare const caretClass = "pointer-events-none absolute h-[1em] w-px bg-[var(--gr-otp-input-caret,var(--gr-primary))]";
|
|
53
|
+
export declare const separatorClass = "select-none px-0.5 text-[var(--gr-muted-fg)]";
|
|
54
|
+
export declare function grOtpInputRootClass(size: GrOtpInputSize): string;
|
|
55
|
+
type GrOtpInputCellClassOptions = {
|
|
56
|
+
size: GrOtpInputSize;
|
|
57
|
+
active: boolean;
|
|
58
|
+
invalid: boolean;
|
|
59
|
+
disabled: boolean;
|
|
60
|
+
};
|
|
61
|
+
export declare function grOtpInputCellClass(options: GrOtpInputCellClassOptions): string;
|
|
62
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ComponentExposed } from '../shared/instance';
|
|
2
|
+
import type GrOtpInputComponent from './GrOtpInput.vue';
|
|
3
|
+
export { default } from './GrOtpInput.vue';
|
|
4
|
+
export { default as GrOtpInput } from './GrOtpInput.vue';
|
|
5
|
+
export { grOtpInputConfig } from './config';
|
|
6
|
+
export type { GrOtpInputConfigurableProps } from './defaults';
|
|
7
|
+
export { grOtpInputSafelist } from './safelist';
|
|
8
|
+
export type { GrOtpInputEmits, GrOtpInputProps, GrOtpInputSize, GrOtpInputType } from './GrOtpInput.vue';
|
|
9
|
+
export type GrOtpInputInstance = ComponentExposed<typeof GrOtpInputComponent>;
|
|
@@ -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;
|
|
@@ -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
|
-
|
|
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
|
-
*
|
|
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
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* горизонтали он обязан быть
|
|
44
|
+
* Дорожка — `border-box` с рамкой 1px, и по вертикали зазор задан геометрией:
|
|
45
|
+
* `(content-height − thumb) / 2` даёт ровно 1 на всех ступенях. Значит и по
|
|
46
|
+
* горизонтали он обязан быть тем же: иначе бегунок в покое выглядит вдавленным
|
|
30
47
|
* внутрь, а в крайнем положении прижатым к краю — именно так и было, зазоры
|
|
31
48
|
* расходились на 1–2px у `xs`, `sm` и `lg`.
|
|
32
49
|
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
*
|
|
41
|
-
* `
|
|
42
|
-
*
|
|
63
|
+
* Обе величины анимируются, и композиция даёт строго линейный ход: в момент `t`
|
|
64
|
+
* смещение равно `t · (ширина − бегунок)`. Поэтому режим `autoWidth` не требует
|
|
65
|
+
* ни измерений, ни ResizeObserver — только эти два класса.
|
|
43
66
|
*/
|
|
44
|
-
export declare const
|
|
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
|
|
9
|
-
readonly
|
|
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[];
|