@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.
@@ -0,0 +1,395 @@
1
+ # Parz Menu
2
+
3
+ [English](parz-menu.en.md) · **Հայերեն** · [Русский](parz-menu.ru.md)
4
+
5
+ CarPark-ի ներքևի մենյուն՝ առանձնացված React կոմպոնենտի տեսքով։ Ակտիվ կետի լուսավորումը հոսում է ներդիրների միջև կաթիլի պես, իսկ աջ կողմի կլոր կոճակները առաձգական են արձագանքում սեղմմանը։ Տեսքն ամբողջությամբ կարգավորելի է՝ գույներ, չափեր, կլորացումներ, ապակի, անիմացիաների արագություն և ուժ։
6
+
7
+ - 5–6 կետ՝ պատկերակով և պիտակով, թվով կամ կետով նշան ցանկացած կետի վրա.
8
+ - աջ կողմի կլոր կոճակներ՝ պատկերակ կամ ավատար (տառեր կամ լուսանկար), նույնպես նշանով.
9
+ - պատկերակներ՝ ներկառուցված, Material Symbols, Material Icons կամ ձեր ցանկացած React տարրը.
10
+ - երեք դասավորություն՝ պատկերակ պիտակի վրա, տողով, միայն պատկերակներ.
11
+ - կպչում է էկրանի ներքևին կամ վերևին, կամ կանգնում է էջի հոսքում.
12
+ - ներկառուցված պիտակներ անգլերեն, հայերեն և ռուսերեն (`locale`).
13
+ - հարգում է համակարգային «նվազեցնել շարժումը» կարգավորումը և աշխատում է ստեղնաշարով։
14
+
15
+ ## Տեղադրում
16
+
17
+ ```bash
18
+ npm install @carparkteam/parz-ui
19
+ ```
20
+
21
+ ```tsx
22
+ import { ParzMenu } from '@carparkteam/parz-ui';
23
+ import '@carparkteam/parz-ui/style.css';
24
+ ```
25
+
26
+ ## Արագ մեկնարկ
27
+
28
+ ```tsx
29
+ import { useState } from 'react';
30
+ import { ParzMenu } from '@carparkteam/parz-ui';
31
+ import '@carparkteam/parz-ui/style.css';
32
+
33
+ export function AppNav() {
34
+ const [tab, setTab] = useState('garage');
35
+ const [panel, setPanel] = useState<string | null>(null);
36
+
37
+ return (
38
+ <ParzMenu
39
+ locale="hy"
40
+ items={[
41
+ { id: 'garage', label: 'Ավտոտնակ', icon: 'ms:directions_car' },
42
+ { id: 'parking', label: 'Կայանատեղի', icon: 'ms:local_parking', badge: 2 },
43
+ { id: 'map', label: 'Քարտեզ', icon: 'pin' }
44
+ ]}
45
+ value={panel ?? tab}
46
+ onChange={id => { setPanel(null); setTab(id); }}
47
+ actions={[
48
+ { id: 'notif', ariaLabel: 'Ծանուցումներ', icon: 'bell', badge: 'dot' },
49
+ { id: 'profile', ariaLabel: 'Պրոֆիլ', avatar: { text: 'A' } }
50
+ ]}
51
+ activeAction={panel}
52
+ onAction={id => setPanel(p => (p === id ? null : id))}
53
+ />
54
+ );
55
+ }
56
+ ```
57
+
58
+ Երբ բաց է կլոր կոճակից բացվող բաժինը, `value`-ին փոխանցեք դրա id-ն․ կետերի տակի կաթիլը կթաքնվի, քանի որ այդպիսի կետ չկա։ Այդպես է արված CarPark-ում։
59
+
60
+ ## Պրոպսներ
61
+
62
+ | Պրոպ | Տիպ | Լռելյայն | Ինչ է անում |
63
+ |---|---|---|---|
64
+ | `items` | `TabItem[]` | — | Մենյուի կետերը |
65
+ | `value` | `string \| null` | — | Ակտիվ կետը (կառավարվող ռեժիմ)։ Այդպիսի կետ չկա կամ `null` — կաթիլը թաքնվում է |
66
+ | `defaultValue` | `string` | առաջին կետը | Ակտիվ կետը առանց արտաքին կառավարման |
67
+ | `onChange` | `(id) => void` | — | Սեղմեցին կետը |
68
+ | `actions` | `ActionItem[]` | `[]` | Աջ կլոր կոճակներ, ոչ ավելի, քան երկու։ Ցանկացած՝ զանգ, պրոֆիլ, «+», որոնում… |
69
+ | `activeAction` | `string \| null` | `null` | Որ կլոր կոճակն է լուսավորված |
70
+ | `onAction` | `(id) => void` | — | Սեղմեցին կլոր կոճակը |
71
+ | `hideActions` | `boolean` | `false` | Թաքցնել աջ կլոր կոճակները։ Մենյուն կսեղմվի կետերի չափով և կկանգնի կենտրոնում |
72
+ | `position` | `'bottom' \| 'top' \| 'static'` | `'bottom'` | Կպչել էկրանի ներքևին կամ վերևին, կամ կանգնել հոսքում |
73
+ | `layout` | `'stacked' \| 'inline' \| 'icons'` | `'stacked'` | Պատկերակ պիտակի վրա, տողով կամ միայն պատկերակներ |
74
+ | `theme` | `Partial<ParzMenuTheme>` | — | Գույներ և չափեր, տե՛ս ստորև |
75
+ | `glass` | `number \| GlassPreset` | — | Ապակու թափանցիկություն՝ 0…100 % կամ նախադրված, տե՛ս «Ապակի» |
76
+ | `overflow` | `'more' \| 'none'` | `'more'` | Ինչ անել, եթե կետերը չեն տեղավորվում՝ թաքցնել «Մենյու» կոճակում, թե ոչ |
77
+ | `minItemWidth` | `number` | 64 / 104 / 52 | Այս լայնությունից նեղ կետը տեղափոխվում է «Մենյու», px։ Լռելյայն կախված է `layout`-ից |
78
+ | `locale` | `'en' \| 'ru' \| 'hy'` | `'en'` | Ներկառուցված պիտակների լեզուն՝ «Մենյու», որոնում, նշանների բարձրաձայնում։ Ձեր `moreLabel`, `ariaLabel`, `searchPlaceholder`-ն առաջնահերթ են |
79
+ | `moreLabel` | `string` | ըստ `locale`-ի | «Մենյու» կոճակի պիտակը |
80
+ | `mobileSearch` | `boolean \| MobileSearchOptions` | — | Որոնում նեղ էկրանին, ինչպես iOS-ում, տե՛ս «Որոնում հեռախոսում» |
81
+ | `desktop` | `boolean \| DesktopOptions` | — | **Beta.** Վերնագոտի մեծ էկրանների համար, տե՛ս «Վերնագոտի համակարգչի համար» |
82
+ | `moreIcon` | `IconSpec` | `'more'` | «Մենյու» կոճակի պատկերակը։ Լռելյայն՝ երեք կետ շրջանակում․ եզրագիծ, իսկ թաքնված կետը բաց լինելիս՝ լցված |
83
+ | `motion` | `Partial<LiquidMotion>` | — | Անիմացիաներ, տե՛ս ստորև |
84
+ | `maxBadge` | `number` | `99` | Ավելի մեծ թվերը ցուցադրվում են որպես «99+» |
85
+ | `badgeLabel` | `(label, badge) => string` | — | Ինչպես է էկրանի ընթերցիչը կարդում նշանով կետը |
86
+ | `autoLoadFonts` | `boolean` | `true` | Ինքնուրույն միացնել Material տառատեսակները, եթե դրանք կան պատկերակներում |
87
+ | `ariaLabel` | `string` | ըստ `locale`-ի | Ամբողջ մենյուի պիտակը ընթերցիչի համար |
88
+ | `className`, `style` | — | — | Սովորական |
89
+
90
+ ### TabItem
91
+
92
+ | Դաշտ | Տիպ | Ինչ է անում |
93
+ |---|---|---|
94
+ | `id` | `string` | Եզակի բանալի |
95
+ | `label` | `string` | Պիտակ |
96
+ | `icon` | `IconSpec` | Պատկերակ, տե՛ս «Պատկերակներ» |
97
+ | `activeIcon` | `IconSpec` | Սեփական պատկերակ ակտիվ վիճակի համար։ Ներկառուցվածներին և Material Symbols-ին պետք չէ |
98
+ | `badge` | `number \| string \| 'dot' \| boolean` | Նշան։ `0`, `false`, `null` — նշան չկա |
99
+ | `disabled` | `boolean` | Կետն անջատված է |
100
+ | `ariaLabel` | `string` | Պիտակ ընթերցիչի համար `label`-ի փոխարեն |
101
+
102
+ ### ActionItem
103
+
104
+ | Դաշտ | Տիպ | Ինչ է անում |
105
+ |---|---|---|
106
+ | `id` | `string` | Եզակի բանալի |
107
+ | `ariaLabel` | `string` | Պիտակ ընթերցիչի համար։ Պարտադիր է՝ կոճակը տեքստ չունի |
108
+ | `icon`, `activeIcon` | `IconSpec` | Պատկերակ |
109
+ | `avatar` | `{ text?: string; src?: string }` | Ավատար պատկերակի փոխարեն՝ տառեր կամ լուսանկար |
110
+ | `badge` | ինչպես կետինը | Նշան |
111
+ | `variant` | `'default' \| 'accent'` | `accent` — գույնով լցված կոճակ գլխավոր գործողության համար, օրինակ «+» |
112
+
113
+ ## Աջ կոճակներ
114
+
115
+ Աջ խմբում կա մինչև երկու կլոր կոճակ, ցանկացած։ Օրինակներում զանգն ու ավատարը պարզապես ամենահաճախ տարբերակն են։ Եթե փոխանցեք երկուսից ավելի, կցուցադրվեն առաջին երկուսը, իսկ վահանակում կլինի նախազգուշացում։
116
+
117
+ Կոճակը լինում է երեք տեսակի՝
118
+ - **պատկերակ** — ինչպես զանգը՝ `{ id: 'notif', ariaLabel: 'Ծանուցումներ', icon: 'bell' }`.
119
+ - **շեշտված** — լցված է գույնով, գլխավոր գործողության համար՝ `{ id: 'add', ariaLabel: 'Ավելացնել', icon: 'plus', variant: 'accent' }`.
120
+ - **ավատար** — տառեր կամ լուսանկար՝ `{ id: 'profile', ariaLabel: 'Պրոֆիլ', avatar: { src: '/me.jpg' } }`։
121
+
122
+ Կոճակը կարող է բացել իր բաժինը (այդ դեպքում փոխանցեք դրա id-ն `activeAction`-ին․ այն կլուսավորվի, իսկ կետերի տակի կաթիլը կթաքնվի) կամ պարզապես կատարել գործողություն, ինչպես «+»-ը․ այդ դեպքում ոչինչ լուսավորել պետք չէ։
123
+
124
+ ```tsx
125
+ <ParzMenu
126
+ items={items}
127
+ value={panel ?? tab}
128
+ onChange={id => { setPanel(null); setTab(id); }}
129
+ actions={[
130
+ { id: 'notif', ariaLabel: 'Ծանուցումներ', icon: 'bell', badge: 3 },
131
+ { id: 'add', ariaLabel: 'Ավելացնել', icon: 'plus', variant: 'accent' }
132
+ ]}
133
+ activeAction={panel}
134
+ onAction={id => (id === 'add' ? openCreateSheet() : setPanel(p => (p === id ? null : id)))}
135
+ />
136
+ ```
137
+
138
+ ## Կետեր և կոճակներ «թռիչքի վրա»
139
+
140
+ Կետերը և աջ կոճակները կարելի է ավելացնել ու հեռացնել ցանկացած պահի․ օրինակ՝ կայքի սկրիպտը միացնում է «Ակցիաներ» կետը, երբ սկսվել է զեղչը։ Ոչինչ չի ցնցվում՝
141
+
142
+ - հեռացող կետը կամ կոճակը սահուն փլվում է, հարևանները տեղաշարժվում են նրա տեղը.
143
+ - նորը «աճում» է զրոյից՝ առաձգական թռիչքով.
144
+ - «Մենյու» կոճակը նույն կերպ հայտնվում և անհետանում է, երբ կետերը դադարում կամ նորից սկսում են տեղավորվել.
145
+ - կաթիլը շարժվում է իր կետի հետ։
146
+
147
+ Տևողությունը նույն `motion.shift`-ն է։ Բավական է պարզապես փոխել `items` կամ `actions` զանգվածը՝
148
+
149
+ ```tsx
150
+ const items = [garage, parking, ...(saleIsOn ? [sale] : [])];
151
+ ```
152
+
153
+ ## Մենյու առանց աջ կոճակների
154
+
155
+ Եթե չփոխանցեք `actions` կամ դնեք `hideActions`, աջ խումբ չի լինի։ `hideActions`-ի փոխարկումն անիմացված է՝ խումբը ծալվում է, կետերով պատիճը սահուն նեղանում է և տեղափոխվում կենտրոն, կաթիլը հետևում է իր կետին։ Արագությունը տալիս է `motion.shift`-ը։ Այդ դեպքում կետերով պատիճը չի ձգվում ամբողջ լայնությամբ, այլ սեղմվում է բովանդակության չափով և կանգնում կենտրոնում։ Ազատված տեղը կարելի է տալ կետերին՝ հեռախոսում հանգիստ տեղավորվում է 5–6։
156
+
157
+ ```tsx
158
+ <ParzMenu
159
+ items={[
160
+ { id: 'home', label: 'Գլխավոր', icon: 'ms:home' },
161
+ { id: 'search', label: 'Որոնում', icon: 'ms:search' },
162
+ { id: 'parking', label: 'Կայանատեղի', icon: 'ms:local_parking', badge: 2 },
163
+ { id: 'saved', label: 'Ընտրյալ', icon: 'ms:favorite' },
164
+ { id: 'profile', label: 'Պրոֆիլ', icon: 'ms:person', badge: 'dot' }
165
+ ]}
166
+ value={tab}
167
+ onChange={setTab}
168
+ />
169
+ ```
170
+
171
+ Կետերը նույն լայնության են, այն տալիս է `theme.itemMinWidth`-ը (84 px)։ Պատիճի լայնությունը «կետեր × այդ լայնություն» է, բայց ոչ ավելի լայն, քան էկրանը։ Եթե կետերը չեն տեղավորվում, դրանք հավասարապես են բաժանում լայնությունը, իսկ երկար պիտակները կտրվում են բազմակետով․ այդ դեպքում ավելի լավ է `layout="icons"`։
172
+
173
+ ## Եթե կետերը չեն տեղավորվում
174
+
175
+ Կոմպոնենտն ինքն է հետևում լայնությանը։ Երբ կետը դառնում է `minItemWidth`-ից նեղ («պատկերակ պիտակի վրա» դասավորության համար 64 px), վերջին կետերը տեղափոխվում են «Մենյու» կոճակ (երեք կետ շրջանակում)։ Սեղմելիս դրա վերևում բացվում է թաքնված կետերի ցուցակը՝ պատկերակ, պիտակ և նշան։
176
+
177
+ - Եթե բաց է թաքնված կետը, կաթիլը կանգնած է «Մենյու»-ի տակ, իսկ ցուցակում այն լուսավորված է։
178
+ - Թաքնված կետերի նշանները հավաքվում են «Մենյու»-ի վրա՝ թվերը գումարվում են, իսկ եթե թվեր չկան, դրվում է կետ։
179
+ - Ցուցակը փակվում է կետ ընտրելով, «Մենյու»-ին կրկին սեղմելով, դրսում սեղմելով կամ Esc ստեղնով։
180
+ - Լայնությունը վերահաշվարկվում է պատուհանի չափը փոխելիս, ուստի պլանշետում և համակարգչում ավելի շատ կետեր են երևում։
181
+
182
+ ```tsx
183
+ <ParzMenu items={tenItems} value={tab} onChange={setTab} moreLabel="Այլ" />
184
+ ```
185
+
186
+ Որպեսզի երբեք ոչինչ չթաքցվի, դրեք `overflow="none"`․ այդ դեպքում կետերը պարզապես սեղմվում են։
187
+
188
+ ## Որոնում հեռախոսում
189
+
190
+ `mobileSearch`-ը նեղ էկրանին ավելացնում է iOS-ի ոճով որոնում։ Խոշորացույցը դառնում է աջ խմբի առաջին կոճակը, `actions`-ից մնում է վերջինը, որպեսզի խմբում դեռ երկու կոճակ լինի։
191
+
192
+ Խոշորացույցին սեղմելիս խումբը հեղուկի պես տարածվում է մենյուի ամբողջ լայնությամբ, իսկ կետերով պատիճը փլվում է։ Ներսում՝
193
+ - ձախից խոշորացույցը վերածվում է ավելի փոքր «✕»-ի՝ փակել որոնումը և մաքրել դաշտը, կետերը վերադառնում են.
194
+ - մեջտեղում մուտքագրման դաշտն է, ստեղնաշարն անմիջապես բաց է.
195
+ - աջից, առանձին կլոր կոճակով իր ապակու մեջ՝ «→» (որոնել)․ այն դուրս է գալիս խմբի հետևից և լուսավորվում շեշտի գույնով, երբ դաշտում տեքստ կա։
196
+
197
+ ```tsx
198
+ <ParzMenu
199
+ items={items}
200
+ actions={[bell, profile]} // հեռախոսում խմբում կլինեն խոշորացույցն ու պրոֆիլը
201
+ mobileSearch={{ searchPlaceholder: 'Մակնիշ կամ կայանատեղի', onSearch: q => navigate(`/search?q=${q}`) }}
202
+ />
203
+ ```
204
+
205
+ Դաշտերը նույնն են, ինչ վերնագոտու որոնմանը՝ `searchPlaceholder`, `searchValue` / `onSearchChange`, `onSearch`։ Լայն էկրանին, եթե վերնագոտին միացված է, աշխատում է դրա որոնումը։
206
+
207
+ ## Վերնագոտի համակարգչի համար (beta)
208
+
209
+ Լայն էկրանին մենյուն կարող է դառնալ լիարժեք վերին գոտի՝ ձախից լոգո, հետո կետեր տողով, կենտրոնում որոնում, աջից կոճակներ։ Գոտու տակ մշուշով ստվերում է, և բովանդակությունը գեղեցիկ անցնում է դրա տակով ոլորելիս։ Նեղ էկրանին մենյուն մնում է սովորական ներքևի։
210
+
211
+ ```tsx
212
+ <ParzMenu
213
+ items={items}
214
+ value={tab}
215
+ onChange={setTab}
216
+ actions={actions}
217
+ desktop={{
218
+ logo: 'CARPARK', // տող կամ ցանկացած տարր՝ <img>, svg, անիմացված լոգո
219
+ search: 'expand', // 'bar' | 'button' | 'expand' | 'none'
220
+ searchPlaceholder: 'Մակնիշ, մոդել կամ կայանատեղի…',
221
+ onSearch: q => navigate(`/search?q=${q}`)
222
+ }}
223
+ />
224
+ ```
225
+
226
+ | Դաշտ | Լռելյայն | Ինչ է անում |
227
+ |---|---|---|
228
+ | `breakpoint` | `1100` | Որ լայնությունից է միանում վերնագոտին, px |
229
+ | `breakpointBy` | `'window'` | Չափել պատուհանի, թե մենյուի ծնողի լայնությունը (`'parent'`՝ նեղ կոնտեյներների և նախադիտումների համար) |
230
+ | `logo` | — | Լոգո ձախից՝ տող կամ React տարր |
231
+ | `search` | `'bar'` | `bar` — առանձին որոնման տող. `button` — կլոր որոնման կոճակ աջ խմբում. `expand` — աջ խմբի կոճակ, որը բացվում է տողի հենց խմբի ներսում. `none` — առանց որոնման |
232
+ | `searchPlaceholder` | ըստ `locale`-ի | Հուշում տողում |
233
+ | `searchValue` / `onSearchChange` | — | Որոնման տեքստը, եթե ուզում եք ինքներդ կառավարել |
234
+ | `onSearch` | — | Սեղմեցին Enter (կամ որոնման կոճակը բացված տողում) |
235
+ | `onSearchClick` | — | Սեղմեցին `button` տեսքի որոնման կոճակը՝ օրինակ, ձեր որոնումը բացելու համար |
236
+ | `searchShortcut` | `'/'` | Ստեղն, որը բացում է որոնումը. `false` — անջատել |
237
+ | `searchWidth` | `420` / `320` | Որոնման տողի լայնությունը, px՝ առանձին տողինը 420, խմբի ներսում բացվածինը 320 |
238
+ | `searchAt` | `'start'` | Որտեղ է որոնման կոճակը աջ խմբում (`button`, `expand` և հեռախոսի որոնումը)՝ `start` — առաջինը, `end` — վերջինը |
239
+ | `actionsAlign` | `'end'` | Որտեղ է աջ խումբը, եթե որոնման տող չկա՝ `end` — աջ եզրին, `next` — անմիջապես կետերից հետո |
240
+ | `layout` | `'inline'` | Կետերի դասավորությունը վերնագոտում |
241
+ | `maxWidth` | `1360` | Վերնագոտու բովանդակության լայնությունը, px |
242
+ | `height` | `80` | Վերնագոտու բարձրությունը, px |
243
+
244
+ Վերնագոտու գույները թեմայում են՝ `headerTop`, `headerMid` (ստվերում), `headerBlur` (մշուշ), `searchBg`, `searchBorder` (որոնման տող)։ Եթե կետերը չեն տեղավորվում լոգոյի և որոնման կողքին, աշխատում է նույն «Մենյու»-ն, միայն ցուցակը բացվում է ներքև։ Վերնագոտու բոլոր փոխարկումները սահուն են՝ որոնման տեսքի փոփոխությունը (տողը փլվում է, կոճակը «աճում» է խմբում), խմբի տեղափոխումը եզրի և կետերի միջև, լոգոյի հայտնվելը և փոխվելը, անցումը վերնագոտու և ներքևի մենյուի միջև լայնությունը փոխելիս։
245
+
246
+ `button` և `expand` տեսքերի որոնման կոճակը աջ խմբում առաջինն է և չի հաշվվում երկու կոճակի սահմանաչափում։ Բացվող որոնումը ձգում է ամբողջ խումբը․ եթե կետերին նեղ է դառնում, ավելորդները սահուն անցնում են «Մենյու»։ Փակվում է Esc ստեղնով կամ դրսում սեղմելով, եթե ոչինչ մուտքագրված չէ։
247
+
248
+ ## Նշաններ
249
+
250
+ ```tsx
251
+ { id: 'fines', label: 'Տուգանքներ', icon: 'ms:receipt_long', badge: 3 } // թիվ
252
+ { id: 'fines', label: 'Տուգանքներ', icon: 'ms:receipt_long', badge: 150 } // ցույց կտա «99+»
253
+ { id: 'news', label: 'Նորույթ', icon: 'sparkles', badge: 'dot' } // կետ
254
+ { id: 'sale', label: 'Ակցիաներ', icon: 'gift', badge: 'new' } // տեքստ
255
+ ```
256
+
257
+ Նշանը հայտնվում է առաձգական «ցատկով» և նորից ցատկում, երբ թիվը փոխվում է։ Գույներ՝ `badgeBg` և `badgeText` թվի համար, `accent` կետի համար։
258
+
259
+ ## Պատկերակներ
260
+
261
+ | Գրառում | Ինչ է դա |
262
+ |---|---|
263
+ | `'pin'` | Ներկառուցված պատկերակ։ Ակտիվ կետի մոտ եզրագիծը փոխարինվում է լցվածով |
264
+ | `'ms:home'` | Material Symbols Rounded։ Ակտիվ կետի մոտ լցումը սահուն հոսում է |
265
+ | `'ms:home:outlined'`, `'ms:home:sharp'` | Այլ ոճի Material Symbols |
266
+ | `'mi:home'` | Դասական Material Icons (լցված) |
267
+ | `'mi:home:outlined'` | Նաև `round`, `sharp`, `two-tone` |
268
+ | `<MyIcon />` | Ցանկացած React տարր՝ svg, նկար, ցանկացած գրադարանի պատկերակ |
269
+
270
+ Ներկառուցվածներ՝ `film`, `ticket`, `pin`, `bell`, `glasses3d`, `clapperboard`, `flame`, `gift`, `card`, `globe`, `sparkles`, `info`, `logout`, `bulb`, `rotate`, `star`, `check`, `chevL`, `chevR`, `popcorn`, `calendar`, `wallet`, `route`, `users`, `more`, `plus`, `search`, `close`, `arrowR`։
271
+
272
+ Material տառատեսակները կոմպոնենտն ինքն է միացնում Google Fonts-ից, երբ տեսնում է `ms:` կամ `mi:`։ Եթե տառատեսակներն արդեն միացված են ձեզ մոտ կամ Google Fonts-ը հասանելի չէ, անջատեք՝ `autoLoadFonts={false}`։ Պատկերակների անունները՝ [fonts.google.com/icons](https://fonts.google.com/icons)։
273
+
274
+ Ձեր պատկերակների համար ակտիվ վիճակի այլ տեսքը տրվում է `activeIcon`-ով՝
275
+
276
+ ```tsx
277
+ { id: 'home', label: 'Գլխավոր', icon: <HomeOutline />, activeIcon: <HomeFilled /> }
278
+ ```
279
+
280
+ ## Լեզու
281
+
282
+ `locale`-ը փոխում է կոմպոնենտի սեփական պիտակները՝ «Մենյու» կոճակը, մենյուի պիտակը ընթերցիչի համար, որոնման հուշումներն ու կոճակները և կետ-նշանի բարձրաձայնումը։
283
+
284
+ | `locale` | «Մենյու» | Որոնում | Կետ-նշան |
285
+ |---|---|---|---|
286
+ | `'en'` (լռելյայն) | More | Search | «Parking, new» |
287
+ | `'hy'` | Մենյու | Որոնում | «Կայանատեղի, նոր» |
288
+ | `'ru'` | Меню | Поиск | «Парковка, есть новое» |
289
+
290
+ ```tsx
291
+ <ParzMenu locale="hy" items={items} />
292
+ ```
293
+
294
+ Կետերի պիտակները և կոճակների `ariaLabel`-ը ձերն են՝ թարգմանեք դրանք ձեր հավելվածում։ Տողերն իրենք արտահանվում են որպես `LTB_STRINGS`, եթե պետք են այլ տեղ։
295
+
296
+ ## Թեմա
297
+
298
+ Բոլոր դաշտերը պարտադիր չեն։ Գույները՝ ցանկացած CSS գույն, չափերը՝ թվեր պիքսելներով։
299
+
300
+ | Դաշտ | Լռելյայն | Ինչ է տալիս |
301
+ |---|---|---|
302
+ | `accent` | `#6ee7a0` | Կետ-նշան, ֆոկուսի օղակ, ակտիվ ավատարի եզրագիծ |
303
+ | `text` / `textActive` | `#8b8b93` / `#fff` | Պիտակներ և պատկերակներ |
304
+ | `surfaceTop` / `surfaceBottom` | մուգ ապակի | Պատիճների գրադիենտ |
305
+ | `border` | `rgba(255,255,255,.06)` | Պատիճների բարակ եզրագիծ |
306
+ | `bevelTop` / `bevelBottom` | սպիտակ 14% / սև 40% | Պատիճների ծավալային փայլ՝ գիծ վերևում և ստվեր ներքևում։ Բաց թեմայում ներքևինը արեք գրեթե թափանցիկ |
307
+ | `highlightTop` / `highlightBottom` | սպիտակ 13% / 5% | Կաթիլի գրադիենտ |
308
+ | `highlightShadow` | բարակ փայլ | Կաթիլի ստվեր և փայլ (CSS box-shadow)։ Բաց թեմայում՝ մեղմ ստվեր ներքևում |
309
+ | `actionBg` | սպիտակ 7% | Կլոր կոճակների ֆոն |
310
+ | `actionActiveBg` / `actionActiveText` | `#fff` / `#000` | Սեղմված կլոր կոճակ |
311
+ | `actionAccentBg` / `actionAccentText` | `#6ee7a0` / `#04130a` | Շեշտված կլոր կոճակ (`variant: 'accent'`) |
312
+ | `badgeBg` / `badgeText` | `#ff4d5e` / `#fff` | Թվով նշան |
313
+ | `badgeRing` | `#1d1d21` | Նշանի շուրջ օղակ՝ դրեք վահանակի գույնը |
314
+ | `avatarFrom` / `avatarTo` / `avatarText` | կանաչ գրադիենտ | Ավատար |
315
+ | `fontFamily` | `inherit` | Պիտակների տառատեսակ |
316
+ | `radius` | `999` | Պատիճների և կաթիլի կլորացում |
317
+ | `padding` | `6` | Ներքին լուսանցք պատիճներում |
318
+ | `gap` | `10` | Հեռավորություն պատիճների միջև |
319
+ | `itemPaddingY` | `8` | Կետերի բարձրություն |
320
+ | `iconSize` | `22` | Պատկերակների չափ |
321
+ | `fontSize` | `11` | Պիտակների չափ |
322
+ | `actionSize` | `50` | Կլոր կոճակների տրամագիծ |
323
+ | `blur` | `20` | Ապակու մշուշ |
324
+ | `maxWidth` | `540` | Մենյուի լայնությունը լայն էկրաններին |
325
+ | `offset` | `12` | Հեռավորություն էկրանի եզրից |
326
+ | `itemMinWidth` | `84` | Կետի լայնությունը առանց աջ կոճակների մենյուում |
327
+ | `shadow` | մեղմ ստվեր | Ստվեր պատիճների տակ |
328
+ | `headerTop` / `headerMid` | գրեթե սև 96% / 82% | Ստվերում վերնագոտու տակ մեծ էկրանին՝ վերևում և մեջտեղում, ներքևում լուծվում է |
329
+ | `headerBlur` | `14` | Մշուշ վերնագոտու տակ |
330
+ | `searchBg` / `searchBorder` | սպիտակ 6% / 8% | Որոնման տող՝ ֆոն և եզրագիծ |
331
+
332
+ Նույնը կարելի է տալ CSS-ով․ յուրաքանչյուր դաշտ `--ltb-*` փոփոխական է՝
333
+
334
+ ```css
335
+ .my-bar {
336
+ --ltb-accent: #ff7a00;
337
+ --ltb-surface-top: rgba(255, 255, 255, .8);
338
+ --ltb-surface-bottom: rgba(240, 240, 245, .9);
339
+ --ltb-text: #6b6b75;
340
+ --ltb-text-active: #111;
341
+ }
342
+ ```
343
+
344
+ ```tsx
345
+ <ParzMenu className="my-bar" items={items} />
346
+ ```
347
+
348
+ ## Ապակի
349
+
350
+ `glass` պրոպը տալիս է, թե որքան թափանցիկ է պատիճների ֆոնը՝ թիվ 0-ից 100 (թափանցիկության տոկոս) կամ պատրաստի նախադրված։ Գույնը մնում է թեմայից (`surfaceTop` / `surfaceBottom`), փոխվում է միայն թափանցիկությունը։
351
+
352
+ | Նախադրված | Թափանցիկություն | Մշուշ | Ինչպես է երևում |
353
+ |---|---|---|---|
354
+ | `'solid'` | 0 % | 0 | Ամբողջական թիթեղ, բովանդակությունը դրա միջով չի երևում |
355
+ | `'frosted'` | 15 % | 20 px | Փայլատ ապակի՝ ինչպես CarPark-ում |
356
+ | `'glass'` | 40 % | 16 px | Նկատելիորեն թափանցում է |
357
+ | `'clear'` | 70 % | 10 px | Գրեթե թափանցիկ, պահվում է մշուշի և եզրագծի վրա |
358
+ | `'none'` | 100 % | 0 | Ֆոն չկա՝ միայն պատկերակներ, պիտակներ և կաթիլ |
359
+
360
+ ```tsx
361
+ <ParzMenu glass="glass" items={items} /> // նախադրված
362
+ <ParzMenu glass={55} items={items} /> // 55 % թափանցիկություն, մշուշը թեմայից
363
+ ```
364
+
365
+ Նախադրվածը տալիս է նաև մշուշը։ Պետք է ձեր մշուշը՝ փոխանցեք `glass`-ը թվով, իսկ մշուշը տվեք `theme.blur`-ում։ Առանց `glass`-ի թափանցիկությունը վերցվում է թեմայի գույներից՝ ինչպես կա։ `hsl()`, `oklch()` ձևաչափի և `navy`-ի նման անուններով գույների թափանցիկությունը չի փոխվում․ տվեք դրանք `#rrggbb` կամ `rgb()` ձևաչափով։
366
+
367
+ ## Անիմացիաներ
368
+
369
+ | Դաշտ | Լռելյայն | Ինչ է տալիս |
370
+ |---|---|---|
371
+ | `lead` | `360` | Կաթիլի առաջատար եզրի ժամանակը, մվ |
372
+ | `lag` | `660` | Հետ մնացող եզրի ժամանակը, մվ։ Որքան մեծ է տարբերությունը `lead`-ից, այնքան ուժեղ է կաթիլը ձգվում |
373
+ | `squash` | `0.26` | Որքան է կաթիլը տափակում թռիչքի ժամանակ։ `0` — առանց դրա |
374
+ | `overshoot` | `1.35` | Զսպանակություն՝ `1` — առանց թռիչքի, `1.6` — ուժեղ |
375
+ | `jelly` | `true` | Կլոր կոճակների առաձգական արձագանքը և դրանց պատիճի «շաղ տալը» |
376
+ | `wave` | `0.035` | Կետերով ամբողջ պատիճի առաձգական ալիք՝ անցման ժամանակ՝ կաթիլի ընթացքի ուղղությամբ, աջ կոճակներից վերադառնալիս՝ ձախ, բաց կետին կրկին սեղմելիս՝ կենտրոնից։ `0` — անջատված, `0.08` — ուժեղ |
377
+ | `shift` | `550` | Քանի մվ-ում է աջ խումբը հայտնվում կամ թաքնվում, իսկ կետերը տեղափոխվում կենտրոն |
378
+
379
+ ```tsx
380
+ <ParzMenu motion={{ lead: 280, lag: 820, squash: 0.35 }} items={items} />
381
+ ```
382
+
383
+ Համակարգային «նվազեցնել շարժումը» կարգավորման դեպքում կաթիլը պարզապես արագ տեղափոխվում է՝ առանց ձգման և առաձգականության։
384
+
385
+ ## Մատչելիություն
386
+
387
+ - Մենյուն `nav` տարր է, ակտիվ կետը նշված է `aria-current="page"`-ով, կլոր կոճակները՝ `aria-pressed`։
388
+ - Նշանը կարդացվում է կետի հետ միասին՝ «Տուգանքներ, 3», «Նորույթ, նոր»։ Ձևակերպումը փոխում է `badgeLabel`-ը, լեզուն՝ `locale`-ը։
389
+ - Ամեն ինչ աշխատում է ստեղնաշարով՝ Tab և Enter, ֆոկուսի օղակը տեսանելի է։
390
+
391
+ ## Ինչ չկա այստեղ
392
+
393
+ - Սեփական հաղորդագրություններ, երթուղավորում և էջերի վիճակ․ կոմպոնենտը միայն ցույց է տալիս մենյուն և հաղորդում սեղմումների մասին։
394
+ - Կետերի քաշում և ներդիրների միջև սահեցում։
395
+ - Առանց `backdrop-filter`-ի դիտարկիչների աջակցություն․ այնտեղ պատիճները կլինեն առանց մշուշի, բայց ֆոնով։