@carparkteam/parz-ui 0.0.0-stage → 1.0.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/LICENSE +40 -0
- package/README.hy.md +99 -0
- package/README.md +98 -2
- package/README.ru.md +99 -0
- package/dist/parz-ui.css +1 -0
- package/dist/parz-ui.js +1442 -0
- package/dist/types/Icon.d.ts +49 -0
- package/dist/types/ParzCheckbox.d.ts +41 -0
- package/dist/types/ParzCredit.d.ts +13 -0
- package/dist/types/ParzMenu.d.ts +240 -0
- package/dist/types/ParzSlider.d.ts +68 -0
- package/dist/types/ParzToggle.d.ts +42 -0
- package/dist/types/Wordmark.d.ts +42 -0
- package/dist/types/icons.d.ts +2 -0
- package/dist/types/index.d.ts +16 -0
- package/docs/animologo.en.md +35 -0
- package/docs/animologo.hy.md +35 -0
- package/docs/animologo.ru.md +35 -0
- package/docs/parz-checkbox.en.md +58 -0
- package/docs/parz-checkbox.hy.md +58 -0
- package/docs/parz-checkbox.ru.md +58 -0
- package/docs/parz-menu.en.md +394 -0
- package/docs/parz-menu.hy.md +395 -0
- package/docs/parz-menu.ru.md +393 -0
- package/docs/parz-slider.en.md +76 -0
- package/docs/parz-slider.hy.md +76 -0
- package/docs/parz-slider.ru.md +76 -0
- package/docs/parz-toggle.en.md +62 -0
- package/docs/parz-toggle.hy.md +62 -0
- package/docs/parz-toggle.ru.md +62 -0
- package/package.json +65 -4
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Иконка пункта меню. Варианты:
|
|
4
|
+
* - 'film', 'ticket', 'pin', 'bell'… — встроенные иконки (как в Meridian): контур, у активного — заливка
|
|
5
|
+
* - 'ms:home' / 'ms:home:outlined' — Material Symbols (Rounded по умолчанию; стиль: rounded | outlined | sharp).
|
|
6
|
+
* У активного пункта заливка плавно перетекает (FILL 0 → 1)
|
|
7
|
+
* - 'mi:home' / 'mi:home:outlined' — классические Material Icons (filled | outlined | round | sharp | two-tone)
|
|
8
|
+
* - любой ReactNode — своя иконка (svg, картинка, компонент из любой библиотеки)
|
|
9
|
+
*/
|
|
10
|
+
export type IconSpec = string | ReactNode;
|
|
11
|
+
declare const MS_STYLES: {
|
|
12
|
+
readonly rounded: "Rounded";
|
|
13
|
+
readonly outlined: "Outlined";
|
|
14
|
+
readonly sharp: "Sharp";
|
|
15
|
+
};
|
|
16
|
+
declare const MI_STYLES: {
|
|
17
|
+
readonly filled: "";
|
|
18
|
+
readonly outlined: "Outlined";
|
|
19
|
+
readonly round: "Round";
|
|
20
|
+
readonly sharp: "Sharp";
|
|
21
|
+
readonly 'two-tone': "Two Tone";
|
|
22
|
+
};
|
|
23
|
+
type MsStyle = keyof typeof MS_STYLES;
|
|
24
|
+
type MiStyle = keyof typeof MI_STYLES;
|
|
25
|
+
export declare function parseIcon(spec: IconSpec): {
|
|
26
|
+
kind: 'builtin';
|
|
27
|
+
name: string;
|
|
28
|
+
} | {
|
|
29
|
+
kind: 'ms';
|
|
30
|
+
name: string;
|
|
31
|
+
style: MsStyle;
|
|
32
|
+
} | {
|
|
33
|
+
kind: 'mi';
|
|
34
|
+
name: string;
|
|
35
|
+
style: MiStyle;
|
|
36
|
+
} | {
|
|
37
|
+
kind: 'node';
|
|
38
|
+
};
|
|
39
|
+
/** Подключает шрифт Material Symbols / Material Icons с Google Fonts (один раз на страницу). */
|
|
40
|
+
export declare function loadMaterialFont(kind: 'ms' | 'mi', style?: string): void;
|
|
41
|
+
/**
|
|
42
|
+
* Рисует иконку. `activeIcon` — отдельная иконка для активного состояния (необязательно):
|
|
43
|
+
* у встроенных и Material Symbols активный вид и так есть (заливка).
|
|
44
|
+
*/
|
|
45
|
+
export declare function Icon({ icon, activeIcon }: {
|
|
46
|
+
icon: IconSpec;
|
|
47
|
+
activeIcon?: IconSpec;
|
|
48
|
+
}): import("react").JSX.Element;
|
|
49
|
+
export {};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type CSSProperties, type ReactNode } from 'react';
|
|
2
|
+
import './ParzCheckbox.css';
|
|
3
|
+
export type ParzCheckboxSize = 'sm' | 'md' | 'lg' | number;
|
|
4
|
+
/** Parz UI · Parz Checkbox — флажок с жидкой заливкой: капля цвета растекается по квадрату, галочка дорисовывается штрихом. */
|
|
5
|
+
export interface ParzCheckboxProps {
|
|
6
|
+
/** Состояние (управляемый режим). */
|
|
7
|
+
checked?: boolean;
|
|
8
|
+
/** Начальное состояние (неуправляемый режим). */
|
|
9
|
+
defaultChecked?: boolean;
|
|
10
|
+
/** Вызывается при переключении — кликом или с клавиатуры. */
|
|
11
|
+
onChange?: (checked: boolean) => void;
|
|
12
|
+
/** «Частично выбрано» — вместо галочки чёрточка. Например, у «Выбрать все», когда выбрана часть списка. */
|
|
13
|
+
indeterminate?: boolean;
|
|
14
|
+
/** Подпись рядом с флажком. Без неё задайте ariaLabel. */
|
|
15
|
+
label?: ReactNode;
|
|
16
|
+
/** Мелкий поясняющий текст под подписью. */
|
|
17
|
+
description?: ReactNode;
|
|
18
|
+
/** С какой стороны подпись. По умолчанию 'end' (справа). */
|
|
19
|
+
labelPosition?: 'start' | 'end';
|
|
20
|
+
disabled?: boolean;
|
|
21
|
+
/** Ошибка: рамка и заливка красным, например «нужно согласиться с условиями». */
|
|
22
|
+
invalid?: boolean;
|
|
23
|
+
/** 'sm' | 'md' | 'lg' или сторона квадрата в px. По умолчанию 'md' (20 px). */
|
|
24
|
+
size?: ParzCheckboxSize;
|
|
25
|
+
/** Скругление углов в px. По умолчанию — треть от размера. */
|
|
26
|
+
radius?: number;
|
|
27
|
+
/** Цвет заливки, когда отмечен. */
|
|
28
|
+
accent?: string;
|
|
29
|
+
/** Цвет рамки, когда не отмечен. */
|
|
30
|
+
borderColor?: string;
|
|
31
|
+
/** Цвет галочки. */
|
|
32
|
+
checkColor?: string;
|
|
33
|
+
/** Подпись для экранных дикторов, если нет видимой label. */
|
|
34
|
+
ariaLabel?: string;
|
|
35
|
+
name?: string;
|
|
36
|
+
value?: string;
|
|
37
|
+
id?: string;
|
|
38
|
+
className?: string;
|
|
39
|
+
style?: CSSProperties;
|
|
40
|
+
}
|
|
41
|
+
export declare function ParzCheckbox({ checked, defaultChecked, onChange, indeterminate, label, description, labelPosition, disabled, invalid, size, radius, accent, borderColor, checkColor, ariaLabel, name, value, id, className, style }: ParzCheckboxProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { CSSProperties } from 'react';
|
|
2
|
+
import './ParzCredit.css';
|
|
3
|
+
export declare const PARZ_CREDIT_URL = "https://dev.carpark.am/parz-ui";
|
|
4
|
+
/** Parz UI · ParzCredit — подпись «Components by CarPark Team» со ссылкой, которую требует лицензия Parz UI. */
|
|
5
|
+
export interface ParzCreditProps {
|
|
6
|
+
/** Начало подписи на языке вашего продукта, например 'Компоненты от'. По умолчанию 'Components by'. */
|
|
7
|
+
prefix?: string;
|
|
8
|
+
/** Цвет текста. По умолчанию наследуется, с прозрачностью 0.6. */
|
|
9
|
+
color?: string;
|
|
10
|
+
className?: string;
|
|
11
|
+
style?: CSSProperties;
|
|
12
|
+
}
|
|
13
|
+
export declare function ParzCredit({ prefix, color, className, style }: ParzCreditProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { type CSSProperties, type ReactNode } from 'react';
|
|
2
|
+
import { type IconSpec } from './Icon';
|
|
3
|
+
import './ParzMenu.css';
|
|
4
|
+
/** Бейдж: число (0 — скрыт), строка («new»), 'dot' или true — точка. */
|
|
5
|
+
export type BadgeValue = number | string | 'dot' | boolean | null | undefined;
|
|
6
|
+
export interface TabItem {
|
|
7
|
+
id: string;
|
|
8
|
+
label: string;
|
|
9
|
+
icon: IconSpec;
|
|
10
|
+
/** Иконка активного состояния. Не нужна для встроенных и Material Symbols — у них есть заливка. */
|
|
11
|
+
activeIcon?: IconSpec;
|
|
12
|
+
badge?: BadgeValue;
|
|
13
|
+
disabled?: boolean;
|
|
14
|
+
/** Подпись для экранного диктора, если label не подходит. */
|
|
15
|
+
ariaLabel?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface ActionItem {
|
|
18
|
+
id: string;
|
|
19
|
+
/** Подпись для экранного диктора — обязательна: у кнопки нет текста. */
|
|
20
|
+
ariaLabel: string;
|
|
21
|
+
icon?: IconSpec;
|
|
22
|
+
activeIcon?: IconSpec;
|
|
23
|
+
/** Кнопка-аватар вместо иконки: буквы или картинка. */
|
|
24
|
+
avatar?: {
|
|
25
|
+
text?: string;
|
|
26
|
+
src?: string;
|
|
27
|
+
};
|
|
28
|
+
badge?: BadgeValue;
|
|
29
|
+
/** accent — залитая цветом кнопка для главного действия («+», «Купить»). default — обычная, как колокольчик. */
|
|
30
|
+
variant?: 'default' | 'accent';
|
|
31
|
+
}
|
|
32
|
+
export interface LiquidTabBarTheme {
|
|
33
|
+
/** Акцент: точка-бейдж, кольцо фокуса. */
|
|
34
|
+
accent: string;
|
|
35
|
+
text: string;
|
|
36
|
+
textActive: string;
|
|
37
|
+
/** Стекло панели: верх и низ градиента. */
|
|
38
|
+
surfaceTop: string;
|
|
39
|
+
surfaceBottom: string;
|
|
40
|
+
/** Тонкая обводка панели. */
|
|
41
|
+
border: string;
|
|
42
|
+
/** Объёмный блик капсул: светлая линия сверху и тень снизу. На светлой теме нижнюю делайте почти прозрачной. */
|
|
43
|
+
bevelTop: string;
|
|
44
|
+
bevelBottom: string;
|
|
45
|
+
/** Капля-подсветка активного пункта: верх и низ градиента. */
|
|
46
|
+
highlightTop: string;
|
|
47
|
+
highlightBottom: string;
|
|
48
|
+
/** Тень и блик капли (CSS box-shadow). На светлой теме — мягкая тень снизу, как у «таблетки». */
|
|
49
|
+
highlightShadow: string;
|
|
50
|
+
/** Фон круглых кнопок справа. */
|
|
51
|
+
actionBg: string;
|
|
52
|
+
actionActiveBg: string;
|
|
53
|
+
actionActiveText: string;
|
|
54
|
+
/** Акцентная круглая кнопка (variant: 'accent'), например «+». */
|
|
55
|
+
actionAccentBg: string;
|
|
56
|
+
actionAccentText: string;
|
|
57
|
+
badgeBg: string;
|
|
58
|
+
badgeText: string;
|
|
59
|
+
/** Кольцо вокруг бейджа — обычно цвет панели, чтобы бейдж «вырезался» из иконки. */
|
|
60
|
+
badgeRing: string;
|
|
61
|
+
avatarFrom: string;
|
|
62
|
+
avatarTo: string;
|
|
63
|
+
avatarText: string;
|
|
64
|
+
fontFamily: string;
|
|
65
|
+
/** Размеры — числа в px. */
|
|
66
|
+
radius: number;
|
|
67
|
+
padding: number;
|
|
68
|
+
gap: number;
|
|
69
|
+
itemPaddingY: number;
|
|
70
|
+
iconSize: number;
|
|
71
|
+
fontSize: number;
|
|
72
|
+
actionSize: number;
|
|
73
|
+
blur: number;
|
|
74
|
+
maxWidth: number;
|
|
75
|
+
/** Отступ от края экрана для position: 'bottom' | 'top'. */
|
|
76
|
+
offset: number;
|
|
77
|
+
/** Ширина пункта, когда меню без кнопок справа и стоит по центру. Если пункты не влезают, они делят ширину поровну. */
|
|
78
|
+
itemMinWidth: number;
|
|
79
|
+
/** Тень под панелью (CSS box-shadow). */
|
|
80
|
+
shadow: string;
|
|
81
|
+
/** Фон шапки на большом экране: сверху и в середине, ниже — растворяется. */
|
|
82
|
+
headerTop: string;
|
|
83
|
+
headerMid: string;
|
|
84
|
+
/** Размытие под шапкой, px. */
|
|
85
|
+
headerBlur: number;
|
|
86
|
+
/** Строка поиска: фон и обводка. */
|
|
87
|
+
searchBg: string;
|
|
88
|
+
searchBorder: string;
|
|
89
|
+
}
|
|
90
|
+
export interface LiquidMotion {
|
|
91
|
+
/** Время ведущего края капли, мс. */
|
|
92
|
+
lead: number;
|
|
93
|
+
/** Время отстающего края капли, мс. Чем больше разница с lead — тем сильнее капля тянется. */
|
|
94
|
+
lag: number;
|
|
95
|
+
/** Насколько капля сплющивается в полёте, 0…0.6. 0 — без сплющивания. */
|
|
96
|
+
squash: number;
|
|
97
|
+
/** Упругость кнопок справа и «всплеск» их капсулы при нажатии. */
|
|
98
|
+
jelly: boolean;
|
|
99
|
+
/** Пружинистость ведущего края, 1 — без перелёта, 1.6 — сильный перелёт. */
|
|
100
|
+
overshoot: number;
|
|
101
|
+
/** Время, за которое группа справа появляется/прячется и пункты переезжают по центру, мс. */
|
|
102
|
+
shift: number;
|
|
103
|
+
/** Упругая «волна» всей капсулы с пунктами при переключении — в сторону, куда уехала капля. 0 — выключено, 0.03–0.05 — мягко, 0.08 — сильно. */
|
|
104
|
+
wave: number;
|
|
105
|
+
}
|
|
106
|
+
/** Режим шапки для больших экранов (beta). */
|
|
107
|
+
export interface DesktopOptions {
|
|
108
|
+
/** Где кнопка поиска в группе справа (для search: 'button' | 'expand'): start — первой (по умолчанию), end — последней. */
|
|
109
|
+
searchAt?: 'start' | 'end';
|
|
110
|
+
/** С какой ширины включается шапка, px. По умолчанию 1100. */
|
|
111
|
+
breakpoint?: number;
|
|
112
|
+
/** По ширине чего решать: окна браузера (обычно) или родителя меню (если меню живёт в узком контейнере или в превью). */
|
|
113
|
+
breakpointBy?: 'window' | 'parent';
|
|
114
|
+
/** Логотип слева: строка — простая надпись, или любой React-элемент (например, анимированный логотип). */
|
|
115
|
+
logo?: ReactNode;
|
|
116
|
+
/** Поиск: строка (bar), круглая кнопка (button), кнопка, которая раскрывается в строку (expand), или без поиска (none). */
|
|
117
|
+
search?: 'bar' | 'button' | 'expand' | 'none';
|
|
118
|
+
searchPlaceholder?: string;
|
|
119
|
+
/** Текст поиска (управляемый режим). */
|
|
120
|
+
searchValue?: string;
|
|
121
|
+
onSearchChange?: (value: string) => void;
|
|
122
|
+
/** Нажали Enter в строке поиска. */
|
|
123
|
+
onSearch?: (value: string) => void;
|
|
124
|
+
/** Нажали кнопку поиска (вид button). */
|
|
125
|
+
onSearchClick?: () => void;
|
|
126
|
+
/** Клавиша, которая открывает поиск. По умолчанию «/», false — выключить. */
|
|
127
|
+
searchShortcut?: string | false;
|
|
128
|
+
/** Ширина строки поиска, px. По умолчанию 420. */
|
|
129
|
+
searchWidth?: number;
|
|
130
|
+
/** Раскладка пунктов в шапке. По умолчанию inline — иконка и подпись в строку. */
|
|
131
|
+
layout?: 'stacked' | 'inline' | 'icons';
|
|
132
|
+
/** Где стоит группа справа, если нет строки поиска: end — прижата к правому краю (по умолчанию), next — сразу за пунктами. */
|
|
133
|
+
actionsAlign?: 'end' | 'next';
|
|
134
|
+
/** Ширина содержимого шапки, px. По умолчанию 1360. */
|
|
135
|
+
maxWidth?: number;
|
|
136
|
+
/** Высота шапки, px. По умолчанию 80. */
|
|
137
|
+
height?: number;
|
|
138
|
+
}
|
|
139
|
+
/** Поиск на узком экране (как в iOS): лупа в группе справа раскрывается в строку на всю ширину. */
|
|
140
|
+
export interface MobileSearchOptions {
|
|
141
|
+
/** Где лупа в группе справа: start — первой (по умолчанию), end — последней. */
|
|
142
|
+
searchAt?: 'start' | 'end';
|
|
143
|
+
searchPlaceholder?: string;
|
|
144
|
+
/** Текст поиска (управляемый режим). */
|
|
145
|
+
searchValue?: string;
|
|
146
|
+
onSearchChange?: (value: string) => void;
|
|
147
|
+
/** Нажали стрелку «→» или Enter. */
|
|
148
|
+
onSearch?: (value: string) => void;
|
|
149
|
+
}
|
|
150
|
+
export interface LiquidTabBarProps {
|
|
151
|
+
items: TabItem[];
|
|
152
|
+
/** Активный пункт (управляемый режим). Можно передать id действия справа или null — тогда капля прячется. */
|
|
153
|
+
value?: string | null;
|
|
154
|
+
/** Активный пункт по умолчанию (неуправляемый режим). */
|
|
155
|
+
defaultValue?: string;
|
|
156
|
+
onChange?: (id: string) => void;
|
|
157
|
+
/** Круглые кнопки справа — не больше двух. Любые: уведомления, профиль, «+», поиск… Лишние отбрасываются. */
|
|
158
|
+
actions?: ActionItem[];
|
|
159
|
+
/** Какая кнопка справа сейчас «нажата» (подсвечена). */
|
|
160
|
+
activeAction?: string | null;
|
|
161
|
+
onAction?: (id: string) => void;
|
|
162
|
+
/** Спрятать круглые кнопки справа, не убирая actions. Без них меню сжимается по пунктам и встаёт по центру. */
|
|
163
|
+
hideActions?: boolean;
|
|
164
|
+
/** bottom / top — прилипает к краю экрана; static — встаёт в поток страницы. */
|
|
165
|
+
position?: 'bottom' | 'top' | 'static';
|
|
166
|
+
/** stacked — иконка над подписью (как в Meridian); inline — в строку; icons — только иконки. */
|
|
167
|
+
layout?: 'stacked' | 'inline' | 'icons';
|
|
168
|
+
theme?: Partial<LiquidTabBarTheme>;
|
|
169
|
+
motion?: Partial<LiquidMotion>;
|
|
170
|
+
/** Числа больше этого показываются как «99+». */
|
|
171
|
+
maxBadge?: number;
|
|
172
|
+
/** Подпись бейджа для экранного диктора. */
|
|
173
|
+
badgeLabel?: (label: string, badge: Exclude<BadgeValue, null | undefined | false>) => string;
|
|
174
|
+
/**
|
|
175
|
+
* Прозрачность стекла капсул: число 0…100 (% прозрачности) или готовый пресет.
|
|
176
|
+
* 0 — сплошной фон, 100 — фона нет совсем. Цвет берётся из темы (surfaceTop/surfaceBottom), меняется только прозрачность.
|
|
177
|
+
* Пресет задаёт ещё и размытие; число меняет только прозрачность, размытие тогда из theme.blur.
|
|
178
|
+
*/
|
|
179
|
+
glass?: number | GlassPreset;
|
|
180
|
+
/**
|
|
181
|
+
* Что делать, если пункты не помещаются по ширине.
|
|
182
|
+
* more — последние пункты прячутся в кнопку «Меню» (•••), по нажатию всплывает их список; none — ничего не прятать.
|
|
183
|
+
*/
|
|
184
|
+
overflow?: 'more' | 'none';
|
|
185
|
+
/** Меньше какой ширины пункт считается «не помещается», px. По умолчанию 64 (stacked), 104 (inline), 52 (icons). */
|
|
186
|
+
minItemWidth?: number;
|
|
187
|
+
/** Подпись кнопки «Меню». */
|
|
188
|
+
moreLabel?: string;
|
|
189
|
+
/** Иконка кнопки «Меню». По умолчанию — встроенная 'more' (три точки в круге, IconMCP): контур, у активной — заливка. */
|
|
190
|
+
moreIcon?: IconSpec;
|
|
191
|
+
/**
|
|
192
|
+
* Шапка для больших экранов (beta): на широком экране меню становится верхней шапкой во всю ширину —
|
|
193
|
+
* логотип, пункты в строку, поиск и кнопки справа, под шапкой затенение с размытием. На узком экране всё как обычно.
|
|
194
|
+
* true — с настройками по умолчанию.
|
|
195
|
+
*/
|
|
196
|
+
desktop?: boolean | DesktopOptions;
|
|
197
|
+
/**
|
|
198
|
+
* Поиск на узком экране, как в iOS: лупа встаёт первой в группу справа (из кнопок остаётся последняя — всего две).
|
|
199
|
+
* По нажатию группа растекается на всю ширину: слева «✕» (закрыть), посередине поле, справа «→» (искать). Пункты на это время уходят.
|
|
200
|
+
*/
|
|
201
|
+
mobileSearch?: boolean | MobileSearchOptions;
|
|
202
|
+
/** Язык встроенных подписей: «Меню», поиск, озвучка бейджей. По умолчанию en. Свои moreLabel, ariaLabel, searchPlaceholder важнее. */
|
|
203
|
+
locale?: LiquidLocale;
|
|
204
|
+
/** Сам подключать шрифты Material, если они встретились в иконках. По умолчанию — да. */
|
|
205
|
+
autoLoadFonts?: boolean;
|
|
206
|
+
ariaLabel?: string;
|
|
207
|
+
className?: string;
|
|
208
|
+
style?: CSSProperties;
|
|
209
|
+
}
|
|
210
|
+
export declare const DEFAULT_THEME: LiquidTabBarTheme;
|
|
211
|
+
export type GlassPreset = 'solid' | 'frosted' | 'glass' | 'clear' | 'none';
|
|
212
|
+
/** Готовые пресеты стекла: прозрачность фона в % и размытие в px. frosted — как в Meridian. */
|
|
213
|
+
export declare const GLASS_PRESETS: Record<GlassPreset, {
|
|
214
|
+
label: string;
|
|
215
|
+
transparency: number;
|
|
216
|
+
blur: number;
|
|
217
|
+
}>;
|
|
218
|
+
/** Тот же цвет с другой прозрачностью. Понимает #rgb, #rrggbb, rgb() и rgba(); остальные цвета возвращает как есть. */
|
|
219
|
+
export declare function withAlpha(color: string, alpha: number): string;
|
|
220
|
+
export declare const DEFAULT_MOTION: LiquidMotion;
|
|
221
|
+
export type LiquidLocale = 'en' | 'ru' | 'hy';
|
|
222
|
+
/** Встроенные подписи компонента (кнопка «Меню», поиск, озвучка бейджа) на трёх языках. */
|
|
223
|
+
export declare const LTB_STRINGS: Record<LiquidLocale, {
|
|
224
|
+
more: string;
|
|
225
|
+
nav: string;
|
|
226
|
+
search: string;
|
|
227
|
+
closeSearch: string;
|
|
228
|
+
go: string;
|
|
229
|
+
hasNew: string;
|
|
230
|
+
}>;
|
|
231
|
+
export declare function Badge({ value, max, inline }: {
|
|
232
|
+
value: BadgeValue;
|
|
233
|
+
max?: number;
|
|
234
|
+
inline?: boolean;
|
|
235
|
+
}): import("react").JSX.Element | null;
|
|
236
|
+
export declare function LiquidTabBar({ items, value, defaultValue, onChange, actions: allActions, activeAction, onAction, hideActions, position: positionProp, layout: layoutProp, theme, motion, maxBadge, badgeLabel: badgeLabelProp, locale, glass, overflow, minItemWidth, moreLabel: moreLabelProp, moreIcon, desktop, mobileSearch, autoLoadFonts, ariaLabel: ariaLabelProp, className, style }: LiquidTabBarProps): import("react").JSX.Element;
|
|
237
|
+
/** Parz UI · Parz Menu — основное имя компонента. LiquidTabBar оставлен для совместимости. */
|
|
238
|
+
export declare const ParzMenu: typeof LiquidTabBar;
|
|
239
|
+
export type ParzMenuProps = LiquidTabBarProps;
|
|
240
|
+
export type { ReactNode };
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { type CSSProperties, type ReactNode } from 'react';
|
|
2
|
+
import './ParzSlider.css';
|
|
3
|
+
export type ParzSliderSize = 'sm' | 'md' | 'lg' | number;
|
|
4
|
+
export type ParzSliderMark = number | {
|
|
5
|
+
value: number;
|
|
6
|
+
label?: ReactNode;
|
|
7
|
+
};
|
|
8
|
+
interface SliderCommon {
|
|
9
|
+
/** Минимум. По умолчанию 0. */
|
|
10
|
+
min?: number;
|
|
11
|
+
/** Максимум. По умолчанию 100. */
|
|
12
|
+
max?: number;
|
|
13
|
+
/** Шаг. По умолчанию 1. */
|
|
14
|
+
step?: number;
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
/** 'sm' | 'md' | 'lg' или диаметр бегунка в px. По умолчанию 'md' (20 px). */
|
|
17
|
+
size?: ParzSliderSize;
|
|
18
|
+
/** Цвет заполненной части. */
|
|
19
|
+
accent?: string;
|
|
20
|
+
/** Цвет дорожки. */
|
|
21
|
+
trackColor?: string;
|
|
22
|
+
/** Цвет бегунка. */
|
|
23
|
+
thumbColor?: string;
|
|
24
|
+
/** Пузырёк со значением над бегунком: 'auto' — пока тянут или фокус, 'always', 'never'. По умолчанию 'auto'. */
|
|
25
|
+
showValue?: 'auto' | 'always' | 'never';
|
|
26
|
+
/** Метки на дорожке: true — на каждом шаге, или список значений (можно с подписями). */
|
|
27
|
+
marks?: boolean | ParzSliderMark[];
|
|
28
|
+
/** Как показывать число: например v => `${v} ₽`. */
|
|
29
|
+
formatValue?: (v: number) => string;
|
|
30
|
+
/** Подпись над ползунком. */
|
|
31
|
+
label?: ReactNode;
|
|
32
|
+
/** Показывать текущее значение справа от подписи. По умолчанию да, если есть label. */
|
|
33
|
+
showOutput?: boolean;
|
|
34
|
+
/** Имя для форм — значения уходят скрытыми input. */
|
|
35
|
+
name?: string;
|
|
36
|
+
className?: string;
|
|
37
|
+
style?: CSSProperties;
|
|
38
|
+
}
|
|
39
|
+
/** Parz UI · Parz Slider — ползунок с жидким бегунком. */
|
|
40
|
+
export interface ParzSliderProps extends SliderCommon {
|
|
41
|
+
value?: number;
|
|
42
|
+
defaultValue?: number;
|
|
43
|
+
/** Вызывается при каждом движении. */
|
|
44
|
+
onChange?: (value: number) => void;
|
|
45
|
+
/** Вызывается, когда отпустили бегунок или закончили нажатие клавиши. */
|
|
46
|
+
onChangeEnd?: (value: number) => void;
|
|
47
|
+
/** Подпись для экранных дикторов, если нет label. */
|
|
48
|
+
ariaLabel?: string;
|
|
49
|
+
}
|
|
50
|
+
/** Parz UI · Parz Range — ползунок промежутка: от 2 до 5 бегунков на одной дорожке. */
|
|
51
|
+
export interface ParzRangeProps extends SliderCommon {
|
|
52
|
+
/** Значения бегунков по возрастанию: от 2 до 5 штук. */
|
|
53
|
+
value?: number[];
|
|
54
|
+
defaultValue?: number[];
|
|
55
|
+
onChange?: (value: number[]) => void;
|
|
56
|
+
onChangeEnd?: (value: number[]) => void;
|
|
57
|
+
/** Минимальное расстояние между соседними бегунками. По умолчанию 0. */
|
|
58
|
+
minDistance?: number;
|
|
59
|
+
/** Подписи бегунков для экранных дикторов, например ['From', 'To']. */
|
|
60
|
+
ariaLabels?: string[];
|
|
61
|
+
/** Что заливать: 'span' — от первого до последнего бегунка, 'pairs' — пары 1–2, 3–4 (например, «работа — перерыв — работа»). По умолчанию 'span'. */
|
|
62
|
+
fill?: 'span' | 'pairs';
|
|
63
|
+
}
|
|
64
|
+
/** Число бегунков у Parz Range: не меньше 2 и не больше 5. */
|
|
65
|
+
export declare const RANGE_MIN_THUMBS = 2, RANGE_MAX_THUMBS = 5;
|
|
66
|
+
export declare function ParzSlider({ value, defaultValue, onChange, onChangeEnd, ariaLabel, ...rest }: ParzSliderProps): import("react").JSX.Element;
|
|
67
|
+
export declare function ParzRange({ value, defaultValue, onChange, onChangeEnd, minDistance, ariaLabels, fill, ...rest }: ParzRangeProps): import("react").JSX.Element;
|
|
68
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type CSSProperties, type ReactNode } from 'react';
|
|
2
|
+
import './ParzToggle.css';
|
|
3
|
+
export type ParzToggleSize = 'sm' | 'md' | 'lg' | number;
|
|
4
|
+
/** Parz UI · Parz Toggle — переключатель с жидким бегунком: тянется, сплющивается и чуть перелетает. */
|
|
5
|
+
export interface ParzToggleProps {
|
|
6
|
+
/** Состояние (управляемый режим). */
|
|
7
|
+
checked?: boolean;
|
|
8
|
+
/** Начальное состояние (неуправляемый режим). */
|
|
9
|
+
defaultChecked?: boolean;
|
|
10
|
+
/** Вызывается при переключении — кликом, клавиатурой или перетаскиванием. */
|
|
11
|
+
onChange?: (checked: boolean) => void;
|
|
12
|
+
/** Подпись рядом с тумблером. Без неё задайте ariaLabel. */
|
|
13
|
+
label?: ReactNode;
|
|
14
|
+
/** С какой стороны подпись. По умолчанию 'end' (справа). */
|
|
15
|
+
labelPosition?: 'start' | 'end';
|
|
16
|
+
disabled?: boolean;
|
|
17
|
+
/** 'sm' | 'md' | 'lg' или высота дорожки в px. По умолчанию 'md' (20 px). */
|
|
18
|
+
size?: ParzToggleSize;
|
|
19
|
+
/** Цвет включённой дорожки. */
|
|
20
|
+
accent?: string;
|
|
21
|
+
/** Цвет выключенной дорожки. */
|
|
22
|
+
trackColor?: string;
|
|
23
|
+
/** Цвет бегунка. */
|
|
24
|
+
thumbColor?: string;
|
|
25
|
+
/** Подпись для экранных дикторов, если нет видимой label. */
|
|
26
|
+
ariaLabel?: string;
|
|
27
|
+
/** Можно ли тянуть бегунок пальцем или мышью. По умолчанию да. */
|
|
28
|
+
draggable?: boolean;
|
|
29
|
+
/** Минимальная пауза между переключениями, мс. Слишком частая попытка отклоняется: тумблер на секунду краснеет и вздрагивает. По умолчанию 0 — без ограничения. */
|
|
30
|
+
cooldown?: number;
|
|
31
|
+
/** Своя проверка: вернёт false — переключение отклоняется так же, как при cooldown. */
|
|
32
|
+
canChange?: (next: boolean) => boolean;
|
|
33
|
+
/** Вызывается, когда попытку отклонили. */
|
|
34
|
+
onReject?: (next: boolean) => void;
|
|
35
|
+
/** Цвет отказа. По умолчанию #ff5c5c. */
|
|
36
|
+
rejectColor?: string;
|
|
37
|
+
name?: string;
|
|
38
|
+
id?: string;
|
|
39
|
+
className?: string;
|
|
40
|
+
style?: CSSProperties;
|
|
41
|
+
}
|
|
42
|
+
export declare function ParzToggle({ checked, defaultChecked, onChange, label, labelPosition, disabled, size, accent, trackColor, thumbColor, ariaLabel, draggable, cooldown, canChange, onReject, rejectColor, name, id, className, style }: ParzToggleProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type CSSProperties } from 'react';
|
|
2
|
+
import './Wordmark.css';
|
|
3
|
+
/** Parz UI · AnimoLogo — живой логотип-надпись (из Meridian). Каждая буква — отдельный «огонёк». */
|
|
4
|
+
export interface AnimoLogoProps {
|
|
5
|
+
/** Текст логотипа. По умолчанию 'PARZ'. */
|
|
6
|
+
text?: string;
|
|
7
|
+
/** Анимация появления при монтировании: буквы выплывают из размытия, по ним проходит блик. По умолчанию да. */
|
|
8
|
+
intro?: boolean;
|
|
9
|
+
/** Задержка перед появлением, мс. */
|
|
10
|
+
introDelay?: number;
|
|
11
|
+
/** Редкое мерцание букв в покое. По умолчанию да. */
|
|
12
|
+
idle?: boolean;
|
|
13
|
+
/** Волна акцентного цвета при наведении мышью. По умолчанию да. */
|
|
14
|
+
hoverWave?: boolean;
|
|
15
|
+
/** Удержание: буквы сходятся и гаснут, снизу заполняется линия, по окончании — загораются акцентом. По умолчанию да. */
|
|
16
|
+
holdEffect?: boolean;
|
|
17
|
+
/** Сколько держать до «заполнения», мс. */
|
|
18
|
+
holdDuration?: number;
|
|
19
|
+
/** Удержали до конца — например, открыть секретное меню или «О приложении». */
|
|
20
|
+
onHoldComplete?: () => void;
|
|
21
|
+
/** Обычное нажатие (клик или Enter). Если есть — логотип становится кнопкой. */
|
|
22
|
+
onClick?: () => void;
|
|
23
|
+
/** Размер букв: число (px) или любая CSS-величина. По умолчанию 13. */
|
|
24
|
+
size?: number | string;
|
|
25
|
+
/** Цвет крайних (тусклых) букв. */
|
|
26
|
+
dimColor?: string;
|
|
27
|
+
/** Цвет центральных (ярких) букв. */
|
|
28
|
+
brightColor?: string;
|
|
29
|
+
/** Цвет при наведении. */
|
|
30
|
+
hoverColor?: string;
|
|
31
|
+
/** Акцент: волна, линия удержания, свечение. */
|
|
32
|
+
accent?: string;
|
|
33
|
+
/** Межбуквенный интервал, em. По умолчанию 0.34. */
|
|
34
|
+
spacing?: number;
|
|
35
|
+
ariaLabel?: string;
|
|
36
|
+
className?: string;
|
|
37
|
+
style?: CSSProperties;
|
|
38
|
+
}
|
|
39
|
+
export declare function AnimoLogo({ text, intro, introDelay, idle, hoverWave, holdEffect, holdDuration, onHoldComplete, onClick, size, dimColor, brightColor, hoverColor, accent, spacing, ariaLabel, className, style }: AnimoLogoProps): import("react").JSX.Element;
|
|
40
|
+
/** Старое имя — оставлено для совместимости. */
|
|
41
|
+
export declare const Wordmark: typeof AnimoLogo;
|
|
42
|
+
export type WordmarkProps = AnimoLogoProps;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export { ParzMenu, LiquidTabBar, Badge, DEFAULT_THEME, DEFAULT_MOTION, GLASS_PRESETS, LTB_STRINGS, withAlpha } from './ParzMenu';
|
|
2
|
+
export type { ParzMenuProps, LiquidTabBarProps, LiquidTabBarTheme, LiquidMotion, TabItem, ActionItem, BadgeValue, GlassPreset, DesktopOptions, MobileSearchOptions, LiquidLocale } from './ParzMenu';
|
|
3
|
+
export { Icon, loadMaterialFont, parseIcon } from './Icon';
|
|
4
|
+
export type { IconSpec } from './Icon';
|
|
5
|
+
export { BUILTIN_ICONS } from './icons';
|
|
6
|
+
export type { BuiltinIconName } from './icons';
|
|
7
|
+
export { AnimoLogo, Wordmark } from './Wordmark';
|
|
8
|
+
export type { AnimoLogoProps, WordmarkProps } from './Wordmark';
|
|
9
|
+
export { ParzToggle } from './ParzToggle';
|
|
10
|
+
export type { ParzToggleProps, ParzToggleSize } from './ParzToggle';
|
|
11
|
+
export { ParzCheckbox } from './ParzCheckbox';
|
|
12
|
+
export type { ParzCheckboxProps, ParzCheckboxSize } from './ParzCheckbox';
|
|
13
|
+
export { ParzSlider, ParzRange, RANGE_MIN_THUMBS, RANGE_MAX_THUMBS } from './ParzSlider';
|
|
14
|
+
export type { ParzSliderProps, ParzRangeProps, ParzSliderSize, ParzSliderMark } from './ParzSlider';
|
|
15
|
+
export { ParzCredit, PARZ_CREDIT_URL } from './ParzCredit';
|
|
16
|
+
export type { ParzCreditProps } from './ParzCredit';
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# AnimoLogo
|
|
2
|
+
|
|
3
|
+
`AnimoLogo` is a separate Parz UI component: a text logo where every letter is a small light. Letters toward the center are brighter. It works on its own anywhere, and fits the header’s `logo` slot.
|
|
4
|
+
|
|
5
|
+
- **appear** — letters float in out of a blur, a highlight runs across them;
|
|
6
|
+
- **hover** — a wave of the accent color;
|
|
7
|
+
- **press and hold** — letters gather and dim, a line fills underneath, after `holdDuration` they light up in the accent;
|
|
8
|
+
- **release** — they spread back out and briefly brighten, nothing abrupt;
|
|
9
|
+
- **idle** — a rare soft shimmer.
|
|
10
|
+
|
|
11
|
+
```tsx
|
|
12
|
+
import { ParzMenu, AnimoLogo } from '@carparkteam/parz-ui';
|
|
13
|
+
|
|
14
|
+
<ParzMenu items={items} desktop={{ logo: <AnimoLogo text="CARPARK" /> }} />
|
|
15
|
+
|
|
16
|
+
<AnimoLogo text="PARZ" size={22} onClick={() => navigate('/')} onHoldComplete={openAbout} />
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
| Prop | Default | What it does |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| `text` | `'PARZ'` | Logo text |
|
|
22
|
+
| `size` | `13` | Letter size: px or any CSS value |
|
|
23
|
+
| `intro` / `introDelay` | `true` / `150` | Appear animation on mount and its delay, ms |
|
|
24
|
+
| `idle` | `true` | Rare shimmer at rest |
|
|
25
|
+
| `hoverWave` | `true` | Wave on mouse hover |
|
|
26
|
+
| `holdEffect` / `holdDuration` | `true` / `1000` | Press-and-hold effect and how long to hold, ms |
|
|
27
|
+
| `onHoldComplete` | — | Held to the end — e.g. open “About” or a hidden menu |
|
|
28
|
+
| `onClick` | — | Regular tap or Enter. With it the logo becomes a button |
|
|
29
|
+
| `dimColor` / `brightColor` | `#7d7d87` / `#fafafa` | Edge and center letter colors. For a light page swap them |
|
|
30
|
+
| `hoverColor` | `#fff` | Color on hover |
|
|
31
|
+
| `accent` | `#6ee7a0` | Wave, hold line and glow |
|
|
32
|
+
| `spacing` | `0.34` | Letter spacing, em |
|
|
33
|
+
| `ariaLabel` | `text` | Screen reader label |
|
|
34
|
+
|
|
35
|
+
The font is inherited from the parent, weight 700. With the system “reduce motion” setting only color changes remain.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# AnimoLogo
|
|
2
|
+
|
|
3
|
+
`AnimoLogo`-ը Parz UI-ի առանձին կոմպոնենտ է՝ լոգո-մակագրություն, որտեղ յուրաքանչյուր տառ փոքրիկ լույս է, կենտրոնին մոտ տառերն ավելի պայծառ են։ Աշխատում է ինքնուրույն ցանկացած տեղում և հարմար է վերնագոտու `logo` սլոտին։
|
|
4
|
+
|
|
5
|
+
- **հայտնվել** — տառերը դուրս են գալիս մշուշից, դրանց վրայով անցնում է փայլ.
|
|
6
|
+
- **սավառում** — շեշտի գույնի ալիք.
|
|
7
|
+
- **սեղմած պահել** — տառերը հավաքվում ու մարում են, ներքևում լցվում է գիծ, `holdDuration`-ից հետո վառվում են շեշտի գույնով.
|
|
8
|
+
- **բաց թողնել** — սահուն ցրվում են և կարճ ժամանակով պայծառանում, առանց կտրուկ բռնկումների.
|
|
9
|
+
- **հանգիստ** — հազվադեպ մեղմ առկայծում։
|
|
10
|
+
|
|
11
|
+
```tsx
|
|
12
|
+
import { ParzMenu, AnimoLogo } from '@carparkteam/parz-ui';
|
|
13
|
+
|
|
14
|
+
<ParzMenu items={items} desktop={{ logo: <AnimoLogo text="CARPARK" /> }} />
|
|
15
|
+
|
|
16
|
+
<AnimoLogo text="PARZ" size={22} onClick={() => navigate('/')} onHoldComplete={openAbout} />
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
| Պրոպ | Լռելյայն | Ինչ է անում |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| `text` | `'PARZ'` | Լոգոյի տեքստը |
|
|
22
|
+
| `size` | `13` | Տառերի չափը՝ px կամ ցանկացած CSS արժեք |
|
|
23
|
+
| `intro` / `introDelay` | `true` / `150` | Հայտնվելու անիմացիա մոնտաժելիս և դրա ուշացումը, մվ |
|
|
24
|
+
| `idle` | `true` | Հազվադեպ առկայծում հանգստի վիճակում |
|
|
25
|
+
| `hoverWave` | `true` | Ալիք մկնիկով սավառելիս |
|
|
26
|
+
| `holdEffect` / `holdDuration` | `true` / `1000` | Սեղմած պահելու էֆեկտը և որքան պահել, մվ |
|
|
27
|
+
| `onHoldComplete` | — | Պահեցին մինչև վերջ՝ օրինակ, բացել «Հավելվածի մասին» կամ թաքնված մենյու |
|
|
28
|
+
| `onClick` | — | Սովորական սեղմում կամ Enter։ Դրանով լոգոն դառնում է կոճակ |
|
|
29
|
+
| `dimColor` / `brightColor` | `#7d7d87` / `#fafafa` | Եզրային և կենտրոնական տառերի գույնը։ Բաց էջի համար փոխեք տեղերով |
|
|
30
|
+
| `hoverColor` | `#fff` | Գույնը սավառելիս |
|
|
31
|
+
| `accent` | `#6ee7a0` | Ալիք, պահելու գիծ և փայլ |
|
|
32
|
+
| `spacing` | `0.34` | Տառերի միջև հեռավորություն, em |
|
|
33
|
+
| `ariaLabel` | `text` | Պիտակ ընթերցիչի համար |
|
|
34
|
+
|
|
35
|
+
Տառատեսակը ժառանգվում է ծնողից, հաստությունը՝ 700։ Համակարգային «նվազեցնել շարժումը» կարգավորման դեպքում մնում է միայն գույնի փոփոխությունը։
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# AnimoLogo
|
|
2
|
+
|
|
3
|
+
`AnimoLogo` — отдельный компонент Parz UI: логотип-надпись, где каждая буква — маленький огонёк, к центру буквы ярче. Работает сам по себе где угодно и подходит в слот `logo` шапки.
|
|
4
|
+
|
|
5
|
+
- **появление** — буквы выплывают из размытия, по ним проходит блик;
|
|
6
|
+
- **наведение** — волна акцентного цвета;
|
|
7
|
+
- **удержание** — буквы сходятся и гаснут, снизу заполняется линия, через `holdDuration` загораются акцентом;
|
|
8
|
+
- **отпускание** — плавно расходятся и ненадолго светлеют, без резких вспышек;
|
|
9
|
+
- **в покое** — редкое мягкое мерцание.
|
|
10
|
+
|
|
11
|
+
```tsx
|
|
12
|
+
import { ParzMenu, AnimoLogo } from '@carparkteam/parz-ui';
|
|
13
|
+
|
|
14
|
+
<ParzMenu items={items} desktop={{ logo: <AnimoLogo text="CARPARK" /> }} />
|
|
15
|
+
|
|
16
|
+
<AnimoLogo text="PARZ" size={22} onClick={() => navigate('/')} onHoldComplete={openAbout} />
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
| Проп | По умолчанию | Что делает |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| `text` | `'PARZ'` | Текст логотипа |
|
|
22
|
+
| `size` | `13` | Размер букв: px или любая CSS-величина |
|
|
23
|
+
| `intro` / `introDelay` | `true` / `150` | Анимация появления при монтировании и её задержка, мс |
|
|
24
|
+
| `idle` | `true` | Редкое мерцание в покое |
|
|
25
|
+
| `hoverWave` | `true` | Волна при наведении мышью |
|
|
26
|
+
| `holdEffect` / `holdDuration` | `true` / `1000` | Эффект удержания и сколько держать, мс |
|
|
27
|
+
| `onHoldComplete` | — | Удержали до конца — например, открыть «О приложении» или скрытое меню |
|
|
28
|
+
| `onClick` | — | Обычное нажатие или Enter. С ним логотип становится кнопкой |
|
|
29
|
+
| `dimColor` / `brightColor` | `#7d7d87` / `#fafafa` | Цвет крайних и центральных букв. Для светлой страницы поменяйте местами |
|
|
30
|
+
| `hoverColor` | `#fff` | Цвет при наведении |
|
|
31
|
+
| `accent` | `#6ee7a0` | Волна, линия удержания и свечение |
|
|
32
|
+
| `spacing` | `0.34` | Расстояние между буквами, em |
|
|
33
|
+
| `ariaLabel` | `text` | Подпись для диктора |
|
|
34
|
+
|
|
35
|
+
Шрифт наследуется от родителя, жирность 700. При системной настройке «уменьшить движение» остаётся только смена цвета.
|