diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..4cb4917 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,78 @@ +# Tria UI + +**Tria UI** — UI‑кит и набор паттернов для разработки интерфейсов с единым дизайном под: +- Web +- VK Mini Apps +- Telegram Mini Apps + +Цель: единый API компонентов и единый подход к токенам/темам (`theme/platform/skin`), чтобы ваш интерфейс выглядел нативно (в том числе **Cupertino‑ощущение** на iOS). + +--- + +## Быстрый старт + +1) Установите пакет: + +```bash +pnpm add @tria/ui +# или npm i @tria/ui / yarn add @tria/ui +``` + +2) Подключите стили (рекомендуется): + +```ts +import "@tria/ui/styles"; +``` + +3) Оберните приложение провайдером: + +```tsx +import React from "react"; +import { UIProvider } from "@tria/ui"; + +export function App() { + return ( + + {/* ... */} + + ); +} +``` + +--- + +## Два способа подключения стилей + +### Вариант A: отдельный импорт CSS (рекомендуется) + +```ts +import "@tria/ui/styles"; +import { UIProvider, Button } from "@tria/ui"; +``` + +### Вариант B: auto‑entry + +Если вы хотите одним импортом подтянуть и JS и CSS: + +```ts +import "@tria/ui/auto"; +import { UIProvider, Button } from "@tria/ui"; +``` + +> Не используйте `@tria/ui/styles` вместе с `@tria/ui/auto`, чтобы не получить двойную загрузку CSS. + +--- + +## Ключевые понятия + +- **theme**: `light | dark` +- **platform**: `web | vk | tg` +- **skin**: `web | ios | android` + +Комбинации параметров управляют пресетами (`presets.css`) и компонентными токенами (`--btn-*`, `--input-*`, `--cell-*`, `--tabbar-*`, …). + +--- + +## Контакты и вклад в проект + +См. раздел **Contributing**. diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md new file mode 100644 index 0000000..35eab9d --- /dev/null +++ b/docs/SUMMARY.md @@ -0,0 +1,36 @@ +# Summary + +* [Tria UI](README.md) + +## Getting Started +* [Installation](getting-started/installation.md) +* [Styles & Bundling](getting-started/styles.md) +* [Theming (theme/platform/skin)](getting-started/theming.md) + +## Design System +* [Tokens overview](design-system/tokens.md) +* [Presets: web/vk/tg × ios/android × light/dark](design-system/presets.md) +* [Customization without forking](design-system/customization.md) + +## Providers +* [UIProvider](providers/uiprovider.md) +* [Snackbar Provider](providers/snackbar.md) + +## Components +* [Button](components/button.md) +* [TabBar](components/tabbar.md) +* [Cells & Lists](components/cells-and-lists.md) +* [Forms](components/forms.md) +* [Feedback](components/feedback.md) +* [Modals & Overlays](components/modals.md) +* [Dates](components/dates.md) +* [Display](components/display.md) + +## Patterns & Recipes +* [VK Mini Apps](patterns/vk-miniapps.md) +* [Telegram Mini Apps](patterns/tg-miniapps.md) +* [Responsive layout](patterns/responsive-layout.md) + +## Contributing +* [Local development](contributing/development.md) +* [Release & versioning](contributing/release.md) diff --git a/docs/components/button.md b/docs/components/button.md new file mode 100644 index 0000000..9403724 --- /dev/null +++ b/docs/components/button.md @@ -0,0 +1,27 @@ +# Button + +## Import + +```ts +import { Button } from "@tria/ui"; +``` + +## Variants + +Рекомендуемая модель: +- `data-variant="primary" | "outline" | "ghost" | "danger"` +- `data-size="sm" | "md" | "lg"` + +## Example + +```tsx + + +``` + +## Design tokens + +- `--btn-h-sm/md/lg` +- `--btn-px-sm/md/lg` +- `--btn-radius` +- `--btn-gap` diff --git a/docs/components/cells-and-lists.md b/docs/components/cells-and-lists.md new file mode 100644 index 0000000..89ca07a --- /dev/null +++ b/docs/components/cells-and-lists.md @@ -0,0 +1,24 @@ +# Cells & Lists + +Списки и ячейки — основной паттерн для настроек и навигации. + +## Import + +```ts +import { List, Cell, SimpleCell, RichCell } from "@tria/ui"; +``` + +## Examples + +```tsx + + + + +``` + +## Design tokens + +- `--cell-h`, `--cell-px`, `--cell-gap` +- `--cell-before`, `--cell-chev` +- `--cell-badge-*` diff --git a/docs/components/dates.md b/docs/components/dates.md new file mode 100644 index 0000000..816e5ae --- /dev/null +++ b/docs/components/dates.md @@ -0,0 +1,13 @@ +# Dates + +Calendar / CalendarRange / DateInput / DateRangeInput. + +## Import + +```ts +import { Calendar, CalendarRange, DateInput, DateRangeInput } from "@tria/ui"; +``` + +## Tokens + +- `--cal-day`, `--cal-day-radius`, `--cal-gap`, `--cal-p` diff --git a/docs/components/display.md b/docs/components/display.md new file mode 100644 index 0000000..9301e5e --- /dev/null +++ b/docs/components/display.md @@ -0,0 +1,15 @@ +# Display + +Компоненты отображения: GridAvatar, Gallery, Accordion и др. + +## Import + +```ts +import { GridAvatar, Gallery, Accordion } from "@tria/ui"; +``` + +## Examples + +```tsx + +``` diff --git a/docs/components/feedback.md b/docs/components/feedback.md new file mode 100644 index 0000000..4ac4686 --- /dev/null +++ b/docs/components/feedback.md @@ -0,0 +1,16 @@ +# Feedback + +Компоненты обратной связи: alert/progress/spinner/skeleton/snackbar/pull-to-refresh. + +## Import + +```ts +import { Alert, Progress, Spinner, Skeleton, Snackbar, PullToRefresh } from "@tria/ui"; +``` + +## Snackbar + +```tsx +const [open, setOpen] = useState(false); + +``` diff --git a/docs/components/forms.md b/docs/components/forms.md new file mode 100644 index 0000000..1380543 --- /dev/null +++ b/docs/components/forms.md @@ -0,0 +1,25 @@ +# Forms + +Набор форм‑компонентов: input/select/chips/segmented/file/writebar. + +## Import (examples) + +```ts +import { + Input, Textarea, Switch, Checkbox, Radio, + Slider, SegmentedControl, + NativeSelect, CustomSelect, SelectMimicry, + ChipsInput, ChipsSelect, + DropZone, File, + WriteBar +} from "@tria/ui"; +``` + +## Controlled inputs + +Все поля предпочтительно держать controlled (через state), чтобы унифицировать поведение на платформах. + +## Design tokens + +- `--input-h-*`, `--input-radius`, `--input-px` +- `--chip-*`, `--chipsbox-*` (если применимо) diff --git a/docs/components/modals.md b/docs/components/modals.md new file mode 100644 index 0000000..2e5ff6c --- /dev/null +++ b/docs/components/modals.md @@ -0,0 +1,28 @@ +# Modals & Overlays + +Набор оверлеев: ActionSheet, ModalCard, ModalPage, Popover/Tooltip. + +## Import + +```ts +import { ActionSheet, ModalCard, ModalPage, Popover, Tooltip } from "@tria/ui"; +``` + +## ActionSheet + +```tsx + {} }, + { title: "Delete", tone: "destructive", onClick: () => {} }, + ]} +/> +``` + +## Tokens + +- `--modal-w`, `--modal-p`, `--modal-radius` +- `--modal-overlay`, `--modal-blur` diff --git a/docs/components/tabbar.md b/docs/components/tabbar.md new file mode 100644 index 0000000..59c0104 --- /dev/null +++ b/docs/components/tabbar.md @@ -0,0 +1,37 @@ +# TabBar + +TabBar — навигация нижнего уровня (в стиле mobile). В web/tablet режимах может менять размещение. + +## Import + +```ts +import { TabBar } from "@tria/ui"; +``` + +## Basic + +```tsx + +``` + +## Responsive placement + +- mobile portrait → `bottom` +- desktop/tablet landscape → `right-top | right-center | right-bottom` + +## Design tokens + +- `--tabbar-h` +- `--tabbar-radius` +- `--tabbar-w` +- `--tabbar-gap` +- `--safe-bottom/right` diff --git a/docs/contributing/development.md b/docs/contributing/development.md new file mode 100644 index 0000000..92262c8 --- /dev/null +++ b/docs/contributing/development.md @@ -0,0 +1,15 @@ +# Local development + +Рекомендуемая схема для монорепо (pnpm): + +```bash +pnpm i +pnpm -C packages/ui dev +pnpm -C apps/web dev +``` + +## Vite library mode + +Tria UI собирается через Vite library mode. Для docs важны: +- корректные `exports` в `package.json` +- запрет deep-imports (`@tria/ui/src/...`) в приложениях diff --git a/docs/contributing/release.md b/docs/contributing/release.md new file mode 100644 index 0000000..ffe038f --- /dev/null +++ b/docs/contributing/release.md @@ -0,0 +1,14 @@ +# Release & versioning + +Semver рекомендации: + +- **patch**: bugfix, не меняющий API и имена токенов +- **minor**: новые компоненты, новые токены (обратно совместимо) +- **major**: изменения публичного контракта (имена токенов, props, data‑атрибуты) + +## Public contract + +Часть публичного API: +- экспортируемые компоненты из `@tria/ui` +- имена токенов (`--ui-*`, `--btn-*`, `--input-*`, …) +- `data-theme/platform/skin` diff --git a/docs/design-system/customization.md b/docs/design-system/customization.md new file mode 100644 index 0000000..cbb8ce4 --- /dev/null +++ b/docs/design-system/customization.md @@ -0,0 +1,41 @@ +# Customization without forking + +Цель: дать пользователю возможность менять дизайн **не изменяя библиотеку**. + +Есть три уровня кастомизации: + +## 1) Switch theme/platform/skin + +```tsx + +``` + +## 2) Runtime overrides (vars) + +```tsx + +``` + +## 3) App-level CSS layer + +```css +:root[data-platform="web"]{ + --ui-primary: #8b5cf6; +} +``` + +## Contract (совместимость) + +Мы считаем частью публичного контракта: +- имена токенов `--ui-*` и `--btn-*`/`--input-*`/… +- data attributes `data-theme`, `data-platform`, `data-skin` + +Изменения этих сущностей должны быть semver‑major. diff --git a/docs/design-system/presets.md b/docs/design-system/presets.md new file mode 100644 index 0000000..825523e --- /dev/null +++ b/docs/design-system/presets.md @@ -0,0 +1,33 @@ +# Presets: web/vk/tg × ios/android × light/dark + +`presets.css` — слой, который задаёт значения токенов в зависимости от: + +- `data-theme` +- `data-platform` +- `data-skin` + +## iOS (Cupertino feel) + +Для `data-skin="ios"` характерно: +- выше контролы (`--btn-h-md: 44px`, `--input-h-md: 44px`) +- более мягкие радиусы (`--ui-radius: 16px`) +- более “воздушные” отступы +- умеренный blur/overlay в модалках + +## Android (Material feel) + +Для `data-skin="android"` характерно: +- более компактные радиусы (`--ui-radius: 12px`) +- высоты ближе к material baseline +- более “плоское” ощущение + +## Platform accents + +- `vk` → `--ui-primary: #2d81e0` +- `tg` → `--ui-primary: #3390ec` + +## Debug checklist + +1) Проверьте, что `UIProvider` ставит `data-*` на `documentElement`. +2) Проверьте, что компоненты используют токены, а не захардкоженные px. +3) Убедитесь, что `@tria/ui/styles` импортируется один раз. diff --git a/docs/design-system/tokens.md b/docs/design-system/tokens.md new file mode 100644 index 0000000..9b162ec --- /dev/null +++ b/docs/design-system/tokens.md @@ -0,0 +1,43 @@ +# Tokens overview + +Tria UI строится на CSS переменных. База начинается с `--ui-*`, а компоненты используют специализированные токены. + +## Global tokens (`--ui-*`) + +- `--ui-bg`, `--ui-panel`, `--ui-fg`, `--ui-muted` +- `--ui-border`, `--ui-shadow` +- `--ui-primary`, `--ui-primary-fg` +- `--ui-radius`, `--ui-radius-sm`, `--ui-radius-lg` +- `--ui-space-1..4` +- `--ui-ease`, `--ui-duration*` +- `--safe-top/right/bottom/left` + +## Component tokens (examples) + +### Button +- `--btn-h-sm/md/lg` +- `--btn-px-sm/md/lg` +- `--btn-radius` +- `--btn-gap` + +### Input +- `--input-h-sm/md/lg` +- `--input-px` +- `--input-radius` + +### Cell +- `--cell-h`, `--cell-px`, `--cell-gap` +- `--cell-before`, `--cell-chev` +- `--cell-badge-*` + +### Modal +- `--modal-w`, `--modal-p`, `--modal-radius`, `--modal-overlay`, `--modal-blur` + +### Calendar +- `--cal-day`, `--cal-day-radius`, `--cal-gap` + +## Where tokens are set + +- `tokens.css` — базовые значения и алиасы +- `presets.css` — значения под theme/platform/skin +- кастомизация — через `UIProvider.config.vars` или отдельным CSS слоем в приложении diff --git a/docs/getting-started/installation.md b/docs/getting-started/installation.md new file mode 100644 index 0000000..fb0a69b --- /dev/null +++ b/docs/getting-started/installation.md @@ -0,0 +1,49 @@ +# Installation + +## Requirements +- React 18+ +- TypeScript 5+ (рекомендуется) +- Vite 5+ (для dev/примера) + +## Install + +```bash +pnpm add @tria/ui +``` + +## Import styles + +Рекомендуемый способ: + +```ts +import "@tria/ui/styles"; +``` + +Альтернатива: + +```ts +import "@tria/ui/auto"; +``` + +## First render + +```tsx +import React from "react"; +import { UIProvider, Button } from "@tria/ui"; + +export function App() { + return ( + + + + ); +} +``` + +## Monorepo note (pnpm workspaces) + +Если `@tria/ui` подключён как workspace‑пакет, и вы используете `package.json#exports`, +избегайте deep‑imports вида `@tria/ui/src/...`. Все публичные сущности должны импортироваться из `@tria/ui`: + +✅ `import { TabBar } from "@tria/ui";` +❌ `import { TabBar } from "@tria/ui/src/components/tabbar/TabBar";` diff --git a/docs/getting-started/styles.md b/docs/getting-started/styles.md new file mode 100644 index 0000000..95cd2ce --- /dev/null +++ b/docs/getting-started/styles.md @@ -0,0 +1,36 @@ +# Styles & Bundling + +Tria UI использует **CSS tokens** и глобальные классы компонентов. Предпочтительная схема — один импорт CSS‑пакета. + +## Recommended: global styles pack + +```ts +import "@tria/ui/styles"; +``` + +Преимущества: +- предсказуемый порядок слоёв (base → tokens → presets → components) +- меньше дублей CSS +- проще кастомизация (вы добавляете свой слой после `@tria/ui/styles`) + +## Auto entry + +```ts +import "@tria/ui/auto"; +``` + +Подходит для быстрых прототипов. В production чаще используют отдельный импорт `@tria/ui/styles`. + +## CSS entry layout + +Внутри пакета (ориентир): + +- `styles/base.css` — reset/база +- `styles/tokens.css` — базовые токены (`--ui-*`) +- `styles/presets.css` — platform/skin/theme значения +- `styles/components/*.css` — стили конкретных компонентов + +## Don’t do + +- Не импортируйте CSS из каждого компонента (можно получить дубли и хаос порядка). +- Не смешивайте `@tria/ui/auto` и `@tria/ui/styles` одновременно. diff --git a/docs/getting-started/theming.md b/docs/getting-started/theming.md new file mode 100644 index 0000000..bca7e3c --- /dev/null +++ b/docs/getting-started/theming.md @@ -0,0 +1,41 @@ +# Theming (theme/platform/skin) + +Tria UI использует три измерения конфигурации: + +- `theme`: `light | dark` +- `platform`: `web | vk | tg` +- `skin`: `web | ios | android` + +Комбинация управляет *CSS пресетами* и компонентными токенами. + +## UIProvider + +```tsx +import { UIProvider } from "@tria/ui"; + + + ... + +``` + +UIProvider устанавливает `data-theme`, `data-platform`, `data-skin` на `document.documentElement` +(или на `config.root`), и может применить `config.vars` — набор CSS variables. + +## Runtime switching + +```tsx +const [theme, setTheme] = useState<"light"|"dark">("dark"); + +``` + +## Which combos matter + +- `platform="vk" + skin="ios"` — VK iOS‑вид (Cupertino‑ощущение) +- `platform="vk" + skin="android"` — VK Android‑вид (Material‑ощущение) +- `platform="tg"` — более “telegram‑ui” акценты +- `platform="web"` — нейтральный web preset + +## Troubleshooting + +Если визуально не меняется “skin”, значит компоненты ещё используют жёсткие px. +Нужно заменить размеры на токены (`--btn-*`, `--input-*`, `--cell-*`, `--tabbar-*`) и т.п. diff --git a/docs/patterns/responsive-layout.md b/docs/patterns/responsive-layout.md new file mode 100644 index 0000000..9c370fc --- /dev/null +++ b/docs/patterns/responsive-layout.md @@ -0,0 +1,15 @@ +# Responsive layout + +## TabBar placement + +- mobile portrait → bottom +- tablet/desktop landscape → right-top / right-center / right-bottom + +## Testing matrix + +Минимум: +- iOS dark / light +- Android dark / light +- VK iOS / VK Android +- TG iOS / TG Android +- Web desktop diff --git a/docs/patterns/tg-miniapps.md b/docs/patterns/tg-miniapps.md new file mode 100644 index 0000000..ab74f88 --- /dev/null +++ b/docs/patterns/tg-miniapps.md @@ -0,0 +1,11 @@ +# Telegram Mini Apps + +## Recommended config + +```tsx + +``` + +## Safe areas + +Используйте `--safe-bottom`, чтобы TabBar/WriteBar не упирались в системные зоны. diff --git a/docs/patterns/vk-miniapps.md b/docs/patterns/vk-miniapps.md new file mode 100644 index 0000000..b5dce4c --- /dev/null +++ b/docs/patterns/vk-miniapps.md @@ -0,0 +1,24 @@ +# VK Mini Apps + +## Recommended config + +```tsx + +``` + +Для Android: + +```tsx + +``` + +## Safe areas + +Используйте токены `--safe-*` (или задайте их через vars), если окружение отдаёт insets. + +## Navigation + +Паттерн: +- верхняя панель с back‑кнопкой +- TabBar на главных разделах +- list/cell для настроек diff --git a/docs/providers/snackbar.md b/docs/providers/snackbar.md new file mode 100644 index 0000000..4894a87 --- /dev/null +++ b/docs/providers/snackbar.md @@ -0,0 +1,33 @@ +# Snackbar Provider + +Tria UI поддерживает Snackbar как компонент и (опционально) как глобальный провайдер/хук. + +## Component usage + +```tsx +import { Snackbar } from "@tria/ui"; + +const [open, setOpen] = useState(false); + + {} }} +/> +``` + +## Provider usage (optional) + +Если у вас есть `SnackbarProvider` и `useSnackbar()`: + +```tsx + + + +``` + +```ts +const { push } = useSnackbar(); +push({ text: "Saved", action: { label: "OK", onClick: ... }}); +``` diff --git a/docs/providers/uiprovider.md b/docs/providers/uiprovider.md new file mode 100644 index 0000000..cca425b --- /dev/null +++ b/docs/providers/uiprovider.md @@ -0,0 +1,34 @@ +# UIProvider + +`UIProvider` — точка управления темой/платформой/скином и CSS overrides. + +## Import + +```ts +import { UIProvider } from "@tria/ui"; +``` + +## Config + +```ts +type UIConfig = Partial<{ + theme: "light" | "dark"; + platform: "web" | "vk" | "tg"; + skin: "web" | "ios" | "android"; + root: HTMLElement; + vars: Record<`--${string}`, string>; +}>; +``` + +## Example + +```tsx + + ... + +``` + +## Notes + +- избегайте deep-import UIProvider из внутренних путей — импортируйте из `@tria/ui` +- для `vars` используйте `useMemo`, чтобы не создавать новый объект на каждый рендер