@carparkteam/parz-ui 0.0.0-stage → 1.0.1
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/CHANGELOG.hy.md +39 -0
- package/CHANGELOG.md +39 -0
- package/CHANGELOG.ru.md +39 -0
- 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 +83 -6
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Parz Toggle
|
|
2
|
+
|
|
3
|
+
`ParzToggle` is a Parz UI switch with a liquid thumb. When it flips, the thumb stretches toward where it is going, squashes on arrival and settles with a light overshoot — the same feel as Parz Menu. Nothing jumps.
|
|
4
|
+
|
|
5
|
+
- **tap or click** — flips with the liquid motion;
|
|
6
|
+
- **press** — the thumb gently stretches like a drop;
|
|
7
|
+
- **drag** — pull the thumb with a finger or mouse; release past the middle to switch;
|
|
8
|
+
- **keyboard** — Tab to focus (a visible ring appears), Space or Enter to flip;
|
|
9
|
+
- **reduced motion** — with `prefers-reduced-motion` it just slides, no squash.
|
|
10
|
+
|
|
11
|
+
Under the hood it is a real `<input type="checkbox" role="switch">`, so forms, `name`, screen readers and focus work as usual.
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
import { useState } from 'react';
|
|
15
|
+
import { ParzToggle } from '@carparkteam/parz-ui';
|
|
16
|
+
import '@carparkteam/parz-ui/style.css';
|
|
17
|
+
|
|
18
|
+
const [on, setOn] = useState(true);
|
|
19
|
+
|
|
20
|
+
<ParzToggle checked={on} onChange={setOn} label="Wi-Fi" />
|
|
21
|
+
|
|
22
|
+
// uncontrolled, no visible label
|
|
23
|
+
<ParzToggle defaultChecked ariaLabel="Dark theme" size="lg" accent="#7aa7ff" />
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
| Prop | Default | What it does |
|
|
27
|
+
|---|---|---|
|
|
28
|
+
| `checked` | — | State (controlled mode) |
|
|
29
|
+
| `defaultChecked` | `false` | Initial state (uncontrolled mode) |
|
|
30
|
+
| `onChange` | — | `(checked: boolean) => void` — on click, keyboard or drag |
|
|
31
|
+
| `label` | — | Text or node next to the switch |
|
|
32
|
+
| `labelPosition` | `'end'` | `'end'` — label on the right, `'start'` — on the left |
|
|
33
|
+
| `ariaLabel` | — | Name for screen readers when there is no visible `label` |
|
|
34
|
+
| `disabled` | `false` | Turned off, dimmed, not focusable |
|
|
35
|
+
| `size` | `'md'` | `'sm'` (16 px), `'md'` (20 px), `'lg'` (28 px) or track height in px |
|
|
36
|
+
| `accent` | `#6ee7a0` | Track color when on |
|
|
37
|
+
| `trackColor` | `#2a2a30` | Track color when off. On a light page use something like `#d9dae1` |
|
|
38
|
+
| `thumbColor` | `#fff` | Thumb color |
|
|
39
|
+
| `draggable` | `true` | Whether the thumb can be dragged |
|
|
40
|
+
| `cooldown` | `0` | Minimum pause between switches, ms. A too-frequent attempt is rejected |
|
|
41
|
+
| `canChange` | — | `(next) => boolean` — your own check; `false` rejects the switch |
|
|
42
|
+
| `onReject` | — | `(next) => void` — called when an attempt was rejected |
|
|
43
|
+
| `rejectColor` | `#ff5c5c` | Track color while rejecting |
|
|
44
|
+
| `name` / `id` | — | Passed to the inner checkbox |
|
|
45
|
+
| `className` / `style` | — | On the root `<label>` |
|
|
46
|
+
|
|
47
|
+
## Rejected state
|
|
48
|
+
|
|
49
|
+
Protect from rapid on/off spam (for example, a setting that hits a server): set `cooldown`. If the user flips again too soon, the switch does not change — for a second the track turns red and the thumb gives a short shake, then everything calmly returns. The same happens when `canChange` returns `false`.
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
<ParzToggle checked={on} onChange={setOn} label="Notifications"
|
|
53
|
+
cooldown={1500} onReject={() => toast('Too fast — wait a moment')} />
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## CSS variables
|
|
57
|
+
|
|
58
|
+
Colors can also be set from CSS on the root or any parent: `--pz-tg-accent`, `--pz-tg-track`, `--pz-tg-knob`, `--pz-tg-reject`.
|
|
59
|
+
|
|
60
|
+
```css
|
|
61
|
+
.settings { --pz-tg-accent: #ff8a3d; }
|
|
62
|
+
```
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Parz Toggle
|
|
2
|
+
|
|
3
|
+
`ParzToggle`-ը Parz UI-ի անջատիչն է՝ հեղուկ սահնակով։ Փոխարկելիս սահնակը ձգվում է դեպի իր ուղղությունը, տեղ հասնելով տափակում է և հանգստանում թեթև անցումով՝ ինչպես Parz Menu-ում։ Ոչինչ կտրուկ չէ։
|
|
4
|
+
|
|
5
|
+
- **սեղմում կամ կտտոց** — փոխարկվում է հեղուկ անիմացիայով;
|
|
6
|
+
- **պահում** — սահնակը մեղմ ձգվում է կաթիլի պես;
|
|
7
|
+
- **քաշում** — քաշեք սահնակը մատով կամ մկնիկով, մեջտեղից այն կողմ բաց թողնելիս կփոխարկվի;
|
|
8
|
+
- **ստեղնաշար** — Tab-ը տալիս է ֆոկուս (երևում է օղակ), Space կամ Enter՝ փոխարկում;
|
|
9
|
+
- **քիչ շարժում** — `prefers-reduced-motion`-ի դեպքում պարզապես սահում է՝ առանց տափակելու։
|
|
10
|
+
|
|
11
|
+
Ներսում իսկական `<input type="checkbox" role="switch">` է, ուստի ձևերը, `name`-ը, էկրանի ընթերցողները և ֆոկուսը աշխատում են սովորականի պես։
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
import { useState } from 'react';
|
|
15
|
+
import { ParzToggle } from '@carparkteam/parz-ui';
|
|
16
|
+
import '@carparkteam/parz-ui/style.css';
|
|
17
|
+
|
|
18
|
+
const [on, setOn] = useState(true);
|
|
19
|
+
|
|
20
|
+
<ParzToggle checked={on} onChange={setOn} label="Wi-Fi" />
|
|
21
|
+
|
|
22
|
+
// չկառավարվող, առանց տեսանելի պիտակի
|
|
23
|
+
<ParzToggle defaultChecked ariaLabel="Մուգ թեմա" size="lg" accent="#7aa7ff" />
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
| Prop | Լռելյայն | Ինչ է անում |
|
|
27
|
+
|---|---|---|
|
|
28
|
+
| `checked` | — | Վիճակ (կառավարվող ռեժիմ) |
|
|
29
|
+
| `defaultChecked` | `false` | Սկզբնական վիճակ (չկառավարվող ռեժիմ) |
|
|
30
|
+
| `onChange` | — | `(checked: boolean) => void` — կտտոցով, ստեղնաշարով կամ քաշելով |
|
|
31
|
+
| `label` | — | Տեքստ կամ տարր անջատիչի կողքին |
|
|
32
|
+
| `labelPosition` | `'end'` | `'end'` — պիտակը աջից, `'start'` — ձախից |
|
|
33
|
+
| `ariaLabel` | — | Անուն էկրանի ընթերցողների համար, եթե տեսանելի `label` չկա |
|
|
34
|
+
| `disabled` | `false` | Անջատված, խամրած, ֆոկուս չի ստանում |
|
|
35
|
+
| `size` | `'md'` | `'sm'` (16 px), `'md'` (20 px), `'lg'` (28 px) կամ ուղու բարձրությունը px-ով |
|
|
36
|
+
| `accent` | `#6ee7a0` | Միացված ուղու գույնը |
|
|
37
|
+
| `trackColor` | `#2a2a30` | Անջատված ուղու գույնը։ Բաց էջում՝ օրինակ `#d9dae1` |
|
|
38
|
+
| `thumbColor` | `#fff` | Սահնակի գույնը |
|
|
39
|
+
| `draggable` | `true` | Կարելի՞ է քաշել սահնակը |
|
|
40
|
+
| `cooldown` | `0` | Նվազագույն դադարը փոխարկումների միջև, մվ։ Չափազանց հաճախ փորձը մերժվում է |
|
|
41
|
+
| `canChange` | — | `(next) => boolean` — սեփական ստուգում; `false`-ը մերժում է փոխարկումը |
|
|
42
|
+
| `onReject` | — | `(next) => void` — կանչվում է, երբ փորձը մերժվել է |
|
|
43
|
+
| `rejectColor` | `#ff5c5c` | Ուղու գույնը մերժման ժամանակ |
|
|
44
|
+
| `name` / `id` | — | Փոխանցվում են ներքին checkbox-ին |
|
|
45
|
+
| `className` / `style` | — | Արմատային `<label>`-ի վրա |
|
|
46
|
+
|
|
47
|
+
## Մերժման վիճակ
|
|
48
|
+
|
|
49
|
+
Պաշտպանություն հաճախակի միացնել/անջատելուց (օրինակ՝ սերվերին դիմող կարգավորում)՝ տվեք `cooldown`։ Եթե շատ շուտ նորից փոխարկեն, անջատիչը չի փոխվի․ մեկ վայրկյան ուղին կկարմրի, սահնակը կարճ կցնցվի, հետո ամեն ինչ հանգիստ կվերադառնա։ Նույնը՝ երբ `canChange`-ը վերադարձնում է `false`։
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
<ParzToggle checked={on} onChange={setOn} label="Ծանուցումներ"
|
|
53
|
+
cooldown={1500} onReject={() => toast('Չափազանց հաճախ է, սպասեք')} />
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## CSS փոփոխականներ
|
|
57
|
+
|
|
58
|
+
Գույները կարելի է տալ նաև CSS-ով՝ անջատիչի կամ ցանկացած ծնողի վրա՝ `--pz-tg-accent`, `--pz-tg-track`, `--pz-tg-knob`, `--pz-tg-reject`։
|
|
59
|
+
|
|
60
|
+
```css
|
|
61
|
+
.settings { --pz-tg-accent: #ff8a3d; }
|
|
62
|
+
```
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Parz Toggle
|
|
2
|
+
|
|
3
|
+
`ParzToggle` — переключатель Parz UI с жидким бегунком. При переключении бегунок тянется туда, куда едет, сплющивается на месте и успокаивается с лёгким перелётом — как в Parz Menu. Ничего резкого.
|
|
4
|
+
|
|
5
|
+
- **нажатие или клик** — переключается с жидкой анимацией;
|
|
6
|
+
- **удержание** — бегунок мягко вытягивается, как капля;
|
|
7
|
+
- **перетаскивание** — тяните бегунок пальцем или мышью; отпустите за серединой — переключится;
|
|
8
|
+
- **клавиатура** — Tab ставит фокус (появляется заметное кольцо), Пробел или Enter переключают;
|
|
9
|
+
- **меньше движения** — при `prefers-reduced-motion` просто скользит, без сплющивания.
|
|
10
|
+
|
|
11
|
+
Внутри — настоящий `<input type="checkbox" role="switch">`, поэтому формы, `name`, экранные дикторы и фокус работают как обычно.
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
import { useState } from 'react';
|
|
15
|
+
import { ParzToggle } from '@carparkteam/parz-ui';
|
|
16
|
+
import '@carparkteam/parz-ui/style.css';
|
|
17
|
+
|
|
18
|
+
const [on, setOn] = useState(true);
|
|
19
|
+
|
|
20
|
+
<ParzToggle checked={on} onChange={setOn} label="Wi-Fi" />
|
|
21
|
+
|
|
22
|
+
// неуправляемый, без видимой подписи
|
|
23
|
+
<ParzToggle defaultChecked ariaLabel="Тёмная тема" size="lg" accent="#7aa7ff" />
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
| Проп | По умолчанию | Что делает |
|
|
27
|
+
|---|---|---|
|
|
28
|
+
| `checked` | — | Состояние (управляемый режим) |
|
|
29
|
+
| `defaultChecked` | `false` | Начальное состояние (неуправляемый режим) |
|
|
30
|
+
| `onChange` | — | `(checked: boolean) => void` — при клике, с клавиатуры или перетаскиванием |
|
|
31
|
+
| `label` | — | Текст или элемент рядом с тумблером |
|
|
32
|
+
| `labelPosition` | `'end'` | `'end'` — подпись справа, `'start'` — слева |
|
|
33
|
+
| `ariaLabel` | — | Имя для экранных дикторов, если нет видимой `label` |
|
|
34
|
+
| `disabled` | `false` | Отключён, приглушён, не получает фокус |
|
|
35
|
+
| `size` | `'md'` | `'sm'` (16 px), `'md'` (20 px), `'lg'` (28 px) или высота дорожки в px |
|
|
36
|
+
| `accent` | `#6ee7a0` | Цвет включённой дорожки |
|
|
37
|
+
| `trackColor` | `#2a2a30` | Цвет выключенной дорожки. На светлой странице — например, `#d9dae1` |
|
|
38
|
+
| `thumbColor` | `#fff` | Цвет бегунка |
|
|
39
|
+
| `draggable` | `true` | Можно ли тянуть бегунок |
|
|
40
|
+
| `cooldown` | `0` | Минимальная пауза между переключениями, мс. Слишком частая попытка отклоняется |
|
|
41
|
+
| `canChange` | — | `(next) => boolean` — своя проверка; `false` отклоняет переключение |
|
|
42
|
+
| `onReject` | — | `(next) => void` — вызывается, когда попытку отклонили |
|
|
43
|
+
| `rejectColor` | `#ff5c5c` | Цвет дорожки при отказе |
|
|
44
|
+
| `name` / `id` | — | Передаются во внутренний чекбокс |
|
|
45
|
+
| `className` / `style` | — | На корневой `<label>` |
|
|
46
|
+
|
|
47
|
+
## Состояние отказа
|
|
48
|
+
|
|
49
|
+
Защита от частых вкл/выкл (например, настройка, которая ходит на сервер): задайте `cooldown`. Если переключить снова слишком рано, тумблер не изменится — на секунду дорожка станет красной, бегунок коротко вздрогнет, и всё спокойно вернётся. То же самое — когда `canChange` вернул `false`.
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
<ParzToggle checked={on} onChange={setOn} label="Уведомления"
|
|
53
|
+
cooldown={1500} onReject={() => toast('Слишком часто — подождите')} />
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## CSS-переменные
|
|
57
|
+
|
|
58
|
+
Цвета можно задать и из CSS — на самом тумблере или любом родителе: `--pz-tg-accent`, `--pz-tg-track`, `--pz-tg-knob`, `--pz-tg-reject`.
|
|
59
|
+
|
|
60
|
+
```css
|
|
61
|
+
.settings { --pz-tg-accent: #ff8a3d; }
|
|
62
|
+
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,83 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@carparkteam/parz-ui",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "@carparkteam/parz-ui",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "Parz UI — React components with liquid motion, crafted by CarPark Team & Dev.CarPark: Parz Menu, Parz Toggle, Parz Checkbox, Parz Slider, Parz Range, AnimoLogo.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"react",
|
|
7
|
+
"react-component",
|
|
8
|
+
"ui",
|
|
9
|
+
"ui-kit",
|
|
10
|
+
"components",
|
|
11
|
+
"animation",
|
|
12
|
+
"liquid",
|
|
13
|
+
"tabbar",
|
|
14
|
+
"navigation",
|
|
15
|
+
"toggle",
|
|
16
|
+
"switch",
|
|
17
|
+
"checkbox",
|
|
18
|
+
"slider",
|
|
19
|
+
"range-slider",
|
|
20
|
+
"parz"
|
|
21
|
+
],
|
|
22
|
+
"author": "CarPark Team & Dev.CarPark",
|
|
23
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
24
|
+
"homepage": "https://github.com/CarParkTeam-Dev/parz-ui#readme",
|
|
25
|
+
"repository": {
|
|
26
|
+
"type": "git",
|
|
27
|
+
"url": "git+https://github.com/CarParkTeam-Dev/parz-ui.git"
|
|
28
|
+
},
|
|
29
|
+
"bugs": {
|
|
30
|
+
"url": "https://github.com/CarParkTeam-Dev/parz-ui/issues"
|
|
31
|
+
},
|
|
32
|
+
"type": "module",
|
|
33
|
+
"main": "./dist/parz-ui.js",
|
|
34
|
+
"module": "./dist/parz-ui.js",
|
|
35
|
+
"types": "./dist/types/index.d.ts",
|
|
36
|
+
"exports": {
|
|
37
|
+
".": {
|
|
38
|
+
"types": "./dist/types/index.d.ts",
|
|
39
|
+
"import": "./dist/parz-ui.js"
|
|
40
|
+
},
|
|
41
|
+
"./style.css": "./dist/parz-ui.css",
|
|
42
|
+
"./package.json": "./package.json"
|
|
43
|
+
},
|
|
44
|
+
"files": [
|
|
45
|
+
"dist",
|
|
46
|
+
"docs",
|
|
47
|
+
"README.md",
|
|
48
|
+
"README.ru.md",
|
|
49
|
+
"README.hy.md",
|
|
50
|
+
"CHANGELOG.md",
|
|
51
|
+
"CHANGELOG.ru.md",
|
|
52
|
+
"CHANGELOG.hy.md",
|
|
53
|
+
"LICENSE"
|
|
54
|
+
],
|
|
55
|
+
"sideEffects": [
|
|
56
|
+
"*.css"
|
|
57
|
+
],
|
|
58
|
+
"scripts": {
|
|
59
|
+
"dev": "vite",
|
|
60
|
+
"build": "vite build",
|
|
61
|
+
"build:lib": "vite build --config vite.lib.config.ts && tsc -p tsconfig.lib.json",
|
|
62
|
+
"prepare": "npm run build:lib",
|
|
63
|
+
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
64
|
+
"release": "node scripts/release.mjs",
|
|
65
|
+
"preview": "vite preview"
|
|
66
|
+
},
|
|
67
|
+
"peerDependencies": {
|
|
68
|
+
"react": ">=18",
|
|
69
|
+
"react-dom": ">=18"
|
|
70
|
+
},
|
|
71
|
+
"devDependencies": {
|
|
72
|
+
"@types/react": "^18.3.12",
|
|
73
|
+
"@types/react-dom": "^18.3.1",
|
|
74
|
+
"@vitejs/plugin-react": "^4.3.4",
|
|
75
|
+
"react": "^18.3.1",
|
|
76
|
+
"react-dom": "^18.3.1",
|
|
77
|
+
"typescript": "^5.6.3",
|
|
78
|
+
"vite": "^5.4.11"
|
|
79
|
+
},
|
|
80
|
+
"publishConfig": {
|
|
81
|
+
"access": "public"
|
|
82
|
+
}
|
|
83
|
+
}
|