@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,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,67 @@
1
1
  {
2
2
  "name": "@carparkteam/parz-ui",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.0",
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
+ ".": { "types": "./dist/types/index.d.ts", "import": "./dist/parz-ui.js" },
38
+ "./style.css": "./dist/parz-ui.css",
39
+ "./package.json": "./package.json"
40
+ },
41
+ "files": ["dist", "docs", "README.md", "README.ru.md", "README.hy.md", "LICENSE"],
42
+ "sideEffects": ["*.css"],
43
+ "scripts": {
44
+ "dev": "vite",
45
+ "build": "vite build",
46
+ "build:lib": "vite build --config vite.lib.config.ts && tsc -p tsconfig.lib.json",
47
+ "prepare": "npm run build:lib",
48
+ "typecheck": "tsc --noEmit -p tsconfig.json",
49
+ "preview": "vite preview"
50
+ },
51
+ "peerDependencies": {
52
+ "react": ">=18",
53
+ "react-dom": ">=18"
54
+ },
55
+ "devDependencies": {
56
+ "@types/react": "^18.3.12",
57
+ "@types/react-dom": "^18.3.1",
58
+ "@vitejs/plugin-react": "^4.3.4",
59
+ "react": "^18.3.1",
60
+ "react-dom": "^18.3.1",
61
+ "typescript": "^5.6.3",
62
+ "vite": "^5.4.11"
63
+ },
64
+ "publishConfig": {
65
+ "access": "public"
66
+ }
67
+ }