# Пульс — дизайн-система (pulse-ds) 1.0.0 > Общий визуальный язык приложений s25/PartsBooster: токены, шрифты (Onest, Inter, JetBrains Mono), значки Material Symbols Rounded и Web Components от кнопки до дровера. Работает одинаково в чистом HTML, React, Svelte, Astro и PHP-шаблонах. Этот файл — всё, что нужно, чтобы собрать интерфейс. Не придумывай стили: бери компоненты и раскладки .pz-*; свой CSS — только для сетки страницы, через токены var(--pz-*). ## Подключение Любая страница (две строки в ; канал v1 получает исправления сам, без пересборки приложения): ```html ``` Тема: класс .dark (или data-theme="dark") на или любом блоке; data-theme="auto" — по системе. На — класс pz-app (земля, шрифт, цвет). Tailwind v4 (после `@import "tailwindcss";`): ```css @import url("https://ds.partsbooster.com/v1/tailwind.css"); ``` Tailwind v3 — пресет `https://ds.partsbooster.com/v1/tailwind-preset.cjs` (скачать в проект) в `presets: [...]`. Утилиты: bg-pz-surface, text-pz-fg, text-pz-muted, rounded-pz-card, shadow-pz-card, font-pz-head, text-pz-h1, bg-pz-ground. События компонентов — `pz-*` (pz-change, pz-select, pz-close…), значение в `e.detail`. Чистый JS: `el.addEventListener('pz-change', e => e.detail.value)`. Атрибуты-обработчики вида onpz-change в HTML не работают. React (18 и 19) — обёртки, они правильно передают булевы атрибуты и события. Установка: `npm i git+ssh://git@gitlab.s25.app/labs/pulse-ds.git`; CSS и pulse-ds.js всё равно — с CDN в index.html. ```jsx import { PzButton, PzSegmented } from '@s25/pulse-ds/react'; setV(e.detail.value)}>… ``` Svelte 5 — теги как есть, события атрибутом: ` v = e.detail.value}>`. Типы тегов: `https://ds.partsbooster.com/v1/pulse-ds.d.ts`. Закреплённая версия (для релиза, который не должен меняться): https://ds.partsbooster.com/1.0.0/… ## Правила ### ДНК: по чему узнают Пульс 1. **Парящие карточки на тонированной земле.** Фон — земля (`.pz-app`, `--pz-ground`); каждый виджет — отдельная белая карточка `` с многослойной мягкой тенью. Внутри карточки вложенные блоки — колодцы (``), без тени. 2. **Пластика.** Все контролы — пилюли. Главное действие чернильное (`variant="ink"`), одно на экран (не считая «+ Создать» в шапке). Активный пункт меню — белая пилюля с тенью. Плитка пространства, темы и типа записи — тонированная (цвет 15 %) с глифом того же цвета (``); тёмного глифа на насыщенном цвете не бывает. 3. **Параметры пилюлями.** Исполнитель, срок, важность, связи — пилюли-выпадашки в одну строку (`` в ``). Таблицы «подпись — значение» нет. 4. **Запись открывается дровером** (``) с тремя режимами: справа рядом со списком, окном по центру, на весь экран. Отдельной страницы записи нет. 5. **Степпер статуса.** Этапы пилюлями, подсказка «что дальше» и действие — в одной рейке (``). 6. **Стекло** — для плавающего: шапки, меню, листы, палитра. Меню и листы почти непрозрачны (`--pz-glass-strong` 0.98), размытие только усиливает. 7. **Телефон: всё плавает.** Шапка-пилюля, таб-бар с круглой чернильной «+» (``), меню превращаются в листы снизу (``). 8. **ИИ** — свой тёплый слой: градиент `--pz-ai-a → --pz-ai-b`, текст `--pz-ai-fg`, значок `auto_awesome` (``, `tone="ai"`). ### Цвет Нейтральные с холодным синим подтоном. Акцент бренда — оранжевый градиент (`--pz-grad`: логотип, «ждут тебя», горящий срок). Ссылки и фокус — `--pz-link`. Цвет несут типы записей и этапы: идея `idea`, задача `task`, баг `bug`, документ `doc`, объявление `ann` — у каждого мягкая пара `*-soft`. Кнопки цвет не несут: они чернильные или белые. Тёмная тема держит ту же глубину: земля почти чёрная с синим и лиловым свечением, у поверхностей светлая кромка; главное действие в тёмной теме светлое. ### Типографика и значки Заголовки — Onest 600 с плотным трекингом (до −0.04em на крупных), текст — Inter 400/500/600, номера записей — JetBrains Mono. Заглавные подписи секций — 11 px, трекинг 0.08em (`.pz-cap`). Цифры в столбцах — табличные (`.pz-num`). Значки — Material Symbols Rounded, размеры 16/18/20/24; значок без подписи — всегда с `label`. Эмодзи — только в реакциях чата. ### Движение Появление панелей, листов, меню — `--pz-ease`, 220–280 мс, сдвиг 8–12 px. Нажатие пилюли, рост числа, сегмент — `--pz-spring`, 160–200 мс. Наведение: карточка поднимается на 3 px, пилюля на 1 px. При `prefers-reduced-motion` остаются только проявления. ### Чего не делаем - плоских таблиц с линиями-разделителями вместо парящих карточек и строк; группы отделяются воздухом и колодцами; - прямоугольных кнопок и полей с радиусом 8–10 px; - листа свойств «Исполнитель / Срок / Метки» вместо пилюль-параметров; - встроенного блока «Обсуждение» с комментариями вместо чата-мессенджера; - отдельной страницы записи вместо дровера с режимами; - теней слабее `--pz-sh-btn` на белых контролах; - текста в пилюлях: пилюля — для параметров и действий; поле ввода прямоугольное (радиус 13) с подписью сверху (``); - белой плашки с тенью как выделения на белой поверхности: в меню и списках наведение — тонированная заливка, выбор — акцент и галочка; - своих цветов, теней и радиусов в коде экрана: только токены `var(--pz-*)` или утилиты Tailwind `*-pz-*`; - своих версий компонентов: если нужного нет — дополнить pulse-ds, а не верстать рядом. ## Раскладки и типографика (классы светлого DOM) - `.pz-app` на body — земля (градиент --pz-ground), шрифт Inter, цвет текста. - `.pz-page` — колонка страницы до 1240 px с полями; `.pz-stack` (gap 16; .tight 12, .loose 32), `.pz-row` (ряд с переносом, gap 8; .end, .between, .nowrap), `.pz-grid` — сетка карточек от 320 px, `.pz-spacer`. - Размер ряда: `.pz-sm` / `.pz-md` / `.pz-lg` на предке — все контролы внутри одной высоты (32/40/48). - Текст: `.pz-h0`…`.pz-h4` (Onest), `.pz-body-lg`, `.pz-body`, `.pz-small`, `.pz-micro`, `.pz-cap` (заглавная подпись секции), `.pz-id` (номер записи, моно), `.pz-num` (табличные цифры), `.pz-muted`, `.pz-faint`, `.pz-link`. ## Токены CSS-переменные `--pz-<имя>`; в Tailwind — утилиты с префиксом pz-. Значения тем переключаются сами. ### color - --pz-bg — Земля: фон приложения под градиентом --ground. - --pz-bg-2 — Фон дровера и вложенных панелей. - --pz-surface — Карточки, белые пилюли, выбранный сегмент. - --pz-surface-2 — Колодцы внутри карточек, поля форм. - --pz-well — Дорожки полос этапов и колец. - --pz-seg — Дорожка сегмента и степпера. - --pz-fg — Основной текст и заголовки. - --pz-text-2 — Вторичный текст, описания. - --pz-muted — Подписи, мета-строки. - --pz-faint — Плейсхолдеры, заглавные подписи. - --pz-chev — Шевроны, выключенные точки, ручки. - --pz-hair — Подложка hover, чипы, тончайшие заливки. - --pz-hair-2 — Контуры пустых пилюль и полей. - --pz-ink — Главное действие, тосты, выбранный чип. - --pz-ink-2 — Верх градиента чернил. - --pz-on-ink — Текст на чернилах. - --pz-link — Ссылки, кольцо фокуса, непрочитанное. - --pz-link-soft — Ореол фокуса, выделение. - --pz-accent — Бренд: логотип, «ждут тебя», горящий срок. - --pz-accent-2 — Светлый край оранжевого градиента. - --pz-accent-soft — Подложка горящего срока. - --pz-accent-deep — Текст на accent-soft. - --pz-accent-fg — Текст на оранжевом градиенте. - --pz-idea — Идея. - --pz-idea-soft — Идея. - --pz-task — Задача. - --pz-task-soft — Задача. - --pz-bug — Баг. - --pz-bug-soft — Баг. - --pz-doc — Документ. - --pz-doc-soft — Документ. - --pz-ann — Объявление. - --pz-ann-soft — Объявление. - --pz-ok — Успех. - --pz-ok-soft — Успех. - --pz-ok-bright — Успех. - --pz-warn — Внимание. - --pz-warn-soft — Внимание. - --pz-danger — Ошибка и удаление. - --pz-danger-soft — Ошибка и удаление. - --pz-st-new — Цвет этапа в полосе. - --pz-st-disc — Цвет этапа в полосе. - --pz-st-work — Цвет этапа в полосе. - --pz-st-done — Цвет этапа в полосе. - --pz-glass — Стекло плавающих шапок. - --pz-glass-strong — Стекло меню, листов, палитры. - --pz-glass-edge — Светлая кромка стекла. - --pz-scrim — Затемнение под окном и листом. - --pz-chat-a — Фон чата, верх. - --pz-chat-b — Фон чата, низ. - --pz-bub — Чужой пузырь. - --pz-bub-me — Свой пузырь. - --pz-bub-me-fg — Текст своего пузыря. - --pz-ai-a — Слой ИИ, начало градиента. - --pz-ai-b — Слой ИИ, конец градиента. - --pz-ai-fg — Текст и иконки ИИ. - --pz-pri-high — Важность «Высокая»: янтарный текст. - --pz-pri-high-soft — Важность «Высокая»: подложка, отличается от danger-soft. - --pz-selection — Выделение текста. - --pz-hover — Наведение на пункт меню, день календаря, строку на белом. - --pz-veil — Полупрозрачная подложка значка на ИИ-пилюле. - --pz-toast-btn — Кнопка внутри чернильного тоста. - --pz-orb-a — Шар пустого состояния, блик. - --pz-orb-b — Шар пустого состояния, край. ### gradient - --pz-ground — Земля: фон приложения, три пятна света на тонированной основе. - --pz-grad — Бренд: логотип, «ждут тебя», горячие счётчики. - --pz-grad-ink — Чернила: главное действие, выбранный сегмент, тост. - --pz-grad-blue — Синяя пилюля: отправка в чате, счётчик «обращаются ко мне», включённый тумблер. ### shadow - --pz-sh-card — Парящая карточка. - --pz-sh-card-hover — Карточка и пилюля на hover. - --pz-sh-btn — Белые пилюли и круглые кнопки. - --pz-sh-seg — Выбранный сегмент, активный пункт меню, открытая строка. - --pz-sh-pop — Меню и выпадашки. - --pz-sh-float — Дровер, панель чатов, окна, листы. - --pz-sh-ink — Чернильные кнопки и тосты. - --pz-sh-glass — Стеклянные шапки и поле чата. ### radius - --pz-r-pill — Все контролы. - --pz-r-card — Парящая карточка. - --pz-r-panel — Дровер, панель чатов, окна. - --pz-r-in — Вложенные блоки, пункт меню. - --pz-r-tile — Плитка типа записи. - --pz-r-ctl — Поле ввода (прямоугольник с подписью сверху). - --pz-r-well — Колодцы внутри карточек, строки списка. - --pz-r-menu — Меню и выпадашки. - --pz-r-area — Многострочное поле. - --pz-r-tip — Подсказки, скелетон. ### spacing - --pz-space-2 — Между строками списка. - --pz-space-4 — Внутри групп иконок. - --pz-space-8 — Между пилюлями в строке. - --pz-space-12 — Между блоками в карточке. - --pz-space-16 — Между карточками. - --pz-space-24 — Поля карточки. - --pz-space-32 — Между секциями. ### size - --pz-c-h-xs — Высота чипа. - --pz-c-h-sm — Плотные строки и панели. - --pz-c-h-md — Контрол по умолчанию. - --pz-c-h-lg — Верхняя строка: поиск, группа значков, «Создать». - --pz-c-h-field — Поле ввода. - --pz-c-fs-xs — Шрифт чипа. - --pz-c-fs-sm — Шрифт контрола sm. - --pz-c-fs-md — Шрифт контрола md. - --pz-c-fs-lg — Шрифт контрола lg. - --pz-c-fs-field — Шрифт поля; на телефоне 16, чтобы iOS не увеличивал страницу. - --pz-c-px-xs — Отступ чипа. - --pz-c-px-sm — Отступ контрола sm. - --pz-c-px-md — Отступ контрола md. - --pz-c-px-lg — Отступ контрола lg. - --pz-c-ic-xs — Значок в чипе. - --pz-c-ic-sm — Значок в контроле sm. - --pz-c-ic-md — Значок в контроле md. - --pz-c-ic-lg — Значок в контроле lg. - --pz-sidebar-w — Ширина сайдбара. - --pz-drawer-w — Ширина дровера справа. - --pz-tabbar-h — Таб-бар телефона. ### easing - --pz-ease — Появление панелей, листов, меню. - --pz-spring — Нажатие, счётчики, сегмент. ### duration - --pz-dur-press — Нажатие и hover. - --pz-dur-pop — Меню, тосты. - --pz-dur-panel — Дровер, чаты, листы. ### type - --pz-t-h0 (font shorthand) + --pz-t-h0-ls — 56px/56px 600, заголовки: Листы-манифесты, первый экран. - --pz-t-h1 (font shorthand) + --pz-t-h1-ls — 34px/38px 600, заголовки: Заголовок страницы и записи. - --pz-t-h2 (font shorthand) + --pz-t-h2-ls — 24px/29px 600, заголовки: Заголовок окна, героя. - --pz-t-h3 (font shorthand) + --pz-t-h3-ls — 18px/23px 600, заголовки: Заголовок карточки. - --pz-t-h4 (font shorthand) + --pz-t-h4-ls — 15px/20px 600, заголовки: Заголовок колодца, строки. - --pz-t-body-lg (font shorthand) + --pz-t-body-lg-ls — 16px/25px 400, текст: Описание записи. - --pz-t-body (font shorthand) + --pz-t-body-ls — 14px/21px 400, текст: Основной текст интерфейса. - --pz-t-small (font shorthand) + --pz-t-small-ls — 13px/18px 400, текст: Мета-строки, подписи. - --pz-t-micro (font shorthand) + --pz-t-micro-ls — 12px/16px 500, текст: Время, счётчики. - --pz-t-cap (font shorthand) + --pz-t-cap-ls — 11px/14px 600, текст: Заглавная подпись секции. - --pz-t-id (font shorthand) + --pz-t-id-ls — 13px/16px 600, моно: Номер записи. ## Компоненты ### Микро — контролы #### — Значок Значок Material Symbols Rounded по имени. Размеры 16/18/20/24; у активного пункта и статуса — заливка (fill). Атрибуты: - name: string — Имя значка из Material Symbols (add, search, forum, monitor_heart…). - size: number — Размер в px. По умолчанию — размер значка контрола (--ic), иначе 20. - fill: boolean — Залитый вариант: активный пункт, статус. - tone: 'muted' | 'faint' | 'link' | 'accent' | 'ok' | 'danger' | 'ai' — Цвет. Без атрибута — цвет текста. Правила: - Значок без подписи рядом — только внутри pz-icon-button с label (aria-label обязателен). - Эмодзи вместо значков не используются, кроме реакций в чате. Пример — Размеры и тона: ```html
``` #### — Кнопка Кнопка-пилюля. Белая — обычное действие, чернильная — одно главное на экран, тихая (ghost), синяя — отправка в чате, danger — удаление. Атрибуты: - variant: 'white' | 'ink' | 'ghost' | 'blue' | 'danger' (по умолчанию white) — Вид. ink — главное действие (в тёмной теме светлое). - size: 'sm' | 'md' | 'lg' (по умолчанию md) — Высота 32/40/48. Обычно задаётся рядом (.pz-sm/.pz-lg на предке), а не кнопкой. - icon: string — Значок слева. - icon-end: string — Значок справа. - dropdown: boolean — Шеврон справа — кнопка открывает меню. - loading: boolean — Кольцо вместо значка, нажатия не проходят. - disabled: boolean - block: boolean — На всю ширину. - href: string — Сделать ссылкой . - type: 'button' | 'submit' | 'reset' (по умолчанию button) — submit отправляет форму, в которой стоит кнопка. События: - click — Обычный click; при disabled и loading не всплывает. Слоты: - по умолчанию — Подпись. - slot="start" — Перед подписью (аватар, плитка). - slot="end" — После подписи (счётчик pz-counter). Правила: - На экране одно чернильное действие, не считая «+ Создать» в шапке. - Кнопки цвет не несут: только чернильные, белые или тихие. Цветная — только синяя «Отправить» в чате. - Прямоугольных кнопок с радиусом 8–10 px не бывает. - Элементы одного ряда — одной высоты: размер задаёт ряд (класс .pz-sm / .pz-lg), а не отдельная кнопка. Пример — Варианты: ```html
СоздатьПоделитьсяОтменаОтправитьУдалить
``` Пример — Размеры рядом и состояния: ```html
МалаяФильтр
СохраняюНедоступна
Создать
``` #### — Кнопка-значок Круглая кнопка со значком. Без заливки по умолчанию, solid — белая с тенью, ink — чернильная. Счётчик и точка непрочитанного. Атрибуты: - icon: string — Значок. - label: string — Подпись для экранных дикторов и подсказка. Обязательна. - variant: 'plain' | 'solid' | 'ink' | 'blue' (по умолчанию plain) - size: 'sm' | 'md' | 'lg' (по умолчанию md) - on: boolean — Выбрана (в группе — чернильная). - badge: string — Число в чернильном кружке. - dot: boolean — Оранжевая точка — есть новое. - fill: boolean — Залитый значок. - href: string - disabled: boolean События: - click Правила: - label обязателен: иконка без подписи всегда с aria-label. - Несколько кнопок-значков рядом — в pz-icon-group (белая пилюля), а не россыпью. Пример — Варианты: ```html
``` #### — Группа значков Белая пилюля с кнопками-значками внутри: шапка страницы (чаты, объявления, колокольчик), переключатель вида. Выбранная — чернильная. Атрибуты: - size: 'sm' | 'md' | 'lg' (по умолчанию md) - label: string — aria-label группы. Слоты: - по умолчанию — pz-icon-button и разделители . Пример — Шапка и переключатель вида: ```html
``` #### — Поле ввода Поле с подписью сверху и подсказкой или ошибкой снизу: однострочное, многострочное (multiline), поиск-пилюля (variant="search"). Работает в
как обычный input. Атрибуты: - label: string — Подпись сверху (500 13 px, без капслока). - value: string - placeholder: string - name: string — Имя в FormData. - type: 'text' | 'email' | 'password' | 'number' | 'search' | 'tel' | 'url' | 'date' | 'time' (по умолчанию text) - hint: string — Подсказка под полем. - error: string — Текст ошибки: поле красным ореолом, текст вместо подсказки. - icon: string — Значок слева. - kbd: string — Клавиша справа (⌘K). - multiline: boolean — Многострочное, от 88 px. - rows: number (по умолчанию 3) - autogrow: boolean — Растёт по тексту. - clearable: boolean — Крестик очистки, когда есть текст. - variant: 'field' | 'search' (по умолчанию field) — search — пилюля с тенью для поиска. - size: 'sm' | 'md' | 'lg' (по умолчанию md) — Для поиска — высота пилюли; для поля sm — 32. - required: boolean - disabled: boolean - readonly: boolean - autofocus: boolean - autocomplete: string - maxlength: number - min: string - max: string - inputmode: string Свойства JS: - .value: string — Текущее значение. - .input: HTMLInputElement — Внутренний input/textarea. Методы: - focus() — Фокус в поле. - select() — Выделить текст. - reportValidity() — Проверить и показать ошибку браузера. События: - input (detail: —) — Каждый ввод (родное событие; значение — el.value). - pz-change (detail: { value }) — Значение зафиксировано (blur, Enter, очистка). Слоты: - slot="start" — Перед текстом (аватар, чип). - slot="end" — После текста (кнопка-значок). Правила: - Поле — прямоугольник с подписью сверху, не пилюля. Пилюля — только поиск (variant="search"). - Ошибка — в атрибуте error, а не отдельным текстом рядом. - На телефоне шрифт поля 16 px — iOS не увеличивает страницу (токен уже это делает). Пример — Поля формы: ```html
``` Пример — Поиск-пилюля: ```html
``` #### — Флажок и радио Флажок 18 px (включённый — синий с галочкой) и радио (type="radio" в ). Подпись — содержимое, пояснение — hint. Атрибуты: - checked: boolean - indeterminate: boolean — Частично выбрано (минус). - type: 'checkbox' | 'radio' (по умолчанию checkbox) - name: string - value: string (по умолчанию on) - hint: string — Вторая строка серым. - disabled: boolean События: - pz-change (detail: { checked, value }) Слоты: - по умолчанию — Подпись. Правила: - Включить/выключить настройку — pz-toggle в pz-setting-row; флажок — для выбора нескольких пунктов и чеклистов. - Выбор одного из 2–5 вариантов в строке — pz-segmented, а не радио. Пример — Флажки и радио: ```html
Сверстать корзинуПроверить оплатуЧеклист
Каждый деньРаз в неделю
``` #### — Тумблер Тумблер 44×26: включённый — синий градиент. Для настроек — внутри pz-setting-row, подпись и пояснение даёт строка. Атрибуты: - checked: boolean - label: string — aria-label, если рядом нет подписи. - name: string - value: string (по умолчанию on) - disabled: boolean События: - pz-change (detail: { checked }) Пример — Состояния: ```html
``` #### — Сегмент и вкладки Выбор одного из 2–6 вариантов в строке: вкладки страницы, переключатель вида, фильтр. Выбранный — чернильная пилюля; на белой карточке — мягкая синяя заливка (variant="soft"). Атрибуты: - value: string — Выбранный вариант (value у pz-option). По умолчанию — первый. - variant: 'ink' | 'soft' (по умолчанию ink) — soft — на белой карточке, в меню, дровере. - size: 'sm' | 'md' (по умолчанию md) — sm 28 — вторичный фильтр внутри карточки (сразу soft). - fill: boolean — Растянуть на всю ширину. - icons: boolean — Только значки (подписи — в подсказках). - label: string — aria-label группы. - name: string События: - pz-change (detail: { value }) Слоты: - по умолчанию — Подпись — варианты. Правила: - Сегмент не бывает выше 40 px; вкладки страницы — тоже сегмент. - Счётчик count — серым, горящий (hot) — оранжевым. Пример — Вкладки и фильтр: ```html
ВсеВ работеЖдут меняГотовоДеньНеделяМесяцСписокДоска
``` #### — Чип Метка 26 px: тип записи, тег, срок. Ненажимаемый — тонированный; нажимаемый (clickable) — белый с тенью; выбранный фильтр — чернильный (on). Атрибуты: - tone: 'neutral' | 'idea' | 'task' | 'bug' | 'doc' | 'ann' | 'ok' | 'warn' | 'hot' | 'lnk' | 'ai' | 'danger' (по умолчанию neutral) - icon: string - clickable: boolean — Кнопка-фильтр. - on: boolean — Выбран (чернильный). - out: boolean — Белый с тенью, ненажимаемый. - removable: boolean — Крестик, событие pz-remove. События: - click - pz-remove — Нажат крестик. Слоты: - по умолчанию — Текст. Правила: - Статус записи — pz-badge (точка + слово), а не чип. - Горящий срок — tone="hot". Пример — Типы и смыслы: ```html
ИдеяЗадачаБагДокументОбъявлениеСегодняИИ-итогоплата
``` Пример — Фильтры: ```html
ВсеБагиИсполнитель: Дима
``` #### — Бейдж статуса Статус записи: белая пилюля 28 с точкой цвета этапа и словом. Этапы: новые, обсуждаем, в работе, на проверке, сделано, выключено, блокер. Атрибуты: - status: 'new' | 'disc' | 'work' | 'rev' | 'done' | 'off' | 'block' — Этап → цвет точки. - color: string — Свой цвет точки (CSS-цвет или var(--pz-…)). Слоты: - по умолчанию — Название статуса. Пример — Этапы: ```html
НоваяОбсуждаемВ работеНа проверкеСделаноБлокерВ архиве
``` #### — Счётчик Число в пилюле 22 px: синий — обращаются ко мне, оранжевый (hot) — ждут тебя, серый (mute), чернильный (ink), plain — серое число без подложки. Атрибуты: - tone: 'blue' | 'hot' | 'mute' | 'ink' | 'plain' (по умолчанию blue) - value: string — Число (или содержимое). Пример — Тона: ```html
``` #### — Клавиша Подсказка клавиши: ⌘K, ⌘N, ↵, Esc. В поле — атрибут kbd у pz-field, в пункте меню — kbd у pz-menu-item. Слоты: - по умолчанию — Клавиша. Пример — Клавиши: ```html
⌘K⌘N↵Esc
``` #### — Аватар и лица Аватар: фото или инициалы на мягкой подложке (цвет стабилен по имени). — стопка лиц участников с «+N». Атрибуты: - name: string — Имя: инициалы, цвет и подсказка. - src: string — Фото; при ошибке загрузки — инициалы. - size: number (по умолчанию 30) — 24 / 30 / 36 / 44 / 56 / 72. - solid: boolean — Сплошной цвет, белые буквы. - icon: string — Значок вместо инициалов. - ring: boolean — Белая обводка (в стопке ставится сама). Пример — Аватары и стопка: ```html
``` #### — Плитка значка Тонированная плитка со значком: тип записи, пространство, тема, раздел. Подложка — цвет 15 %, глиф того же цвета. logo — оранжевый градиент бренда. Атрибуты: - icon: string - tone: 'idea' | 'task' | 'bug' | 'doc' | 'ann' | 'ok' | 'warn' | 'hot' | 'lnk' | 'ai' | 'danger' | 'ink' | 'logo' - color: string — Свой цвет (цвет пространства/темы): #hex или var(--pz-…). - size: 'xs' | 'sm' | 'md' | 'lg' (по умолчанию md) — 28 / 36 / 44 / 56. - round: boolean - label: string — Подпись для экранных дикторов, если плитка несёт смысл. Правила: - Тёмного глифа на насыщенном цвете не бывает: только подложка 15 % и глиф того же цвета. Пример — Типы, размеры, свой цвет: ```html
``` #### — Подсказка Чернильная плашка над элементом по наведению и фокусу (задержка 400 мс), с клавишей. Оборачивает элемент. Атрибуты: - text: string - kbd: string — Клавиша справа. - placement: 'top' | 'bottom' (по умолчанию top) Слоты: - по умолчанию — Элемент, к которому подсказка. Правила: - Для кнопки-значка подсказка уже есть (title из label); pz-tooltip — когда нужна клавиша или длинный текст. Пример — С клавишей: ```html
Поиск
``` #### — Кольцо загрузки Кольцо загрузки цвета текста. Для кнопки — атрибут loading у pz-button, для содержимого — pz-skeleton. Атрибуты: - size: number (по умолчанию 20) - label: string (по умолчанию Загрузка) Пример — Размеры: ```html
``` #### — Скелетон Заглушка на время загрузки: строки текста (lines) или блок нужного размера. Форма повторяет будущее содержимое. Атрибуты: - lines: number — Сколько строк текста. - width: string (по умолчанию 100%) - height: string (по умолчанию 12px) - radius: string (по умолчанию 10px) Пример — Карточка загружается: ```html
``` ### Средние — составные элементы #### — Карточка и колодец Парящая белая карточка — виджет, блок формы, секция. Шапка: плитка, заголовок, счётчик, подзаголовок, действия справа. Вложенные блоки — (колодец без тени). Атрибуты: - title: string — Заголовок h3. - subtitle: string - count: string — Серое число рядом с заголовком. - icon: string — Плитка слева от заголовка. - tone: string — Тон плитки (как у pz-tile). - color: string — Свой цвет плитки. - hover: boolean — Поднимается на 3 px при наведении (кликабельная карточка). - href: string — Вся карточка — ссылка. - pad: 'md' | 'sm' | 'none' (по умолчанию md) — Поля 22×24 / 16×18 / 0 (для списков и картинок до края). - tint: 'ai' | 'hot' — Тонированная подложка: ИИ-итог, горящее. Слоты: - по умолчанию — Содержимое. - slot="actions" — Справа в шапке (кнопки sm, сегмент). - slot="header" — Под заголовком (чипы, лица). - slot="lead" — Вместо плитки (аватар). - slot="footer" — Низ карточки (кнопки). Правила: - Каждый виджет — отдельная карточка; карточки не вкладываются друг в друга — внутри колодцы. - Карточки раскладываются .pz-grid или .pz-stack с зазором 16. Пример — Виджет с колодцами: ```html
Все
Проверить оплату PayPal
Дима отдал на проверку 8 ч назад
Ответить по возвратам
срок сегодня

Закрыто 14 задач, 2 бага ждут решения. Больше всего движения в «Оплате».

Открыть сводку
``` #### — Пилюля-параметр Параметр записи одной пилюлей: исполнитель, срок, важность, тема, связи. Лид-круг (значок или аватар), значение, тихая подпись, шеврон. Ряд пилюль заменяет лист свойств. Атрибуты: - value: string — Значение (или содержимое). - label: string — Тихая подпись после значения («срок», «важность»). - icon: string — Значок в круге. - avatar: string — Имя человека — аватар в круге. - src: string — Фото для аватара. - none: boolean — Не задано: пунктирный контур, серый текст («+ Исполнитель»). - hot: boolean — Горит: просроченный или сегодняшний срок. - ai: boolean — Предложение ИИ. - open: boolean — Меню открыто — ореол (pz-dropdown ставит сам). - error: boolean - size: 'sm' | 'md' (по умолчанию md) - no-chevron: boolean — Без шеврона (параметр только для чтения). - disabled: boolean Слоты: - по умолчанию — Значение. - slot="lead" — Свой лид вместо icon/avatar. Правила: - Параметры — пилюлями в одну строку (.pz-row), таблицы «подпись — значение» нет. - Выбор значения — pz-dropdown с pz-menu (поиск-шапка) или pz-calendar. Пример — Ряд параметров: ```html
``` #### — Выпадашка Триггер + стеклянная плавающая панель (меню, календарь, любая форма). Верхний слой, закрытие кликом мимо и Esc, переворот у края экрана; на телефоне — лист снизу. Атрибуты: - open: boolean - placement: 'bottom-start' | 'bottom-end' | 'top-start' | 'top-end' (по умолчанию bottom-start) - flush: boolean — Без внутренних полей (календарь, своя разметка). - width: string — "trigger" — по ширине триггера, или CSS-длина. - sheet: boolean — Всегда листом снизу. - title: string — Заголовок листа на телефоне. Методы: - show() / hide() / toggle() — Открыть, закрыть, переключить. События: - pz-open - pz-close Слоты: - slot="trigger" — Кнопка, пилюля-параметр, аватар — что открывает. - по умолчанию — Содержимое панели: pz-menu, pz-calendar, форма. Правила: - Меню почти непрозрачно (glass-strong 0.98), размытие только усиливает — содержимое страницы сквозь меню не читается. - Выбор пункта закрывает панель и возвращает фокус на триггер. Пример — Исполнитель с поиском: ```html КомандаДима СмирновАнна КотоваОлег ПетровБорисБез исполнителя ``` Пример — Меню «Создать» и срок: ```html
СоздатьЗадачаБагИдеяДокументЧерновики
``` #### — Меню Список пунктов для pz-dropdown: действия или выбор значения. Поиск-шапка (search) фильтрует на месте, ↑↓ ↵ с клавиатуры, группы с подписями, галочка у выбранного. Атрибуты: - search: string — Плейсхолдер поиска — включает поиск-шапку. - select: 'single' | 'multiple' — Режим выбора: пункты отмечаются галочкой, событие pz-change. - empty: string (по умолчанию Ничего не нашлось) — Текст, когда поиск ничего не нашёл. Свойства JS: - .value: string | string[] — Выбранное (для select). События: - pz-select (detail: { value, item, selected }) — Нажат пункт (закрывает выпадашку, кроме multiple). - pz-change (detail: { value }) — Изменился выбор (select). - pz-search (detail: { query }) — Ввод в поиске — для подгрузки с сервера. Слоты: - по умолчанию — Текст, Группа, . Правила: - Наведение — тонированная заливка, выбранное — синий текст и галочка; белой плашки с тенью внутри меню нет. - Опасное действие (удалить) — danger, внизу, после разделителя. Пример — Меню записи (без выпадашки): ```html Во весь экранСкопировать ссылкуСлить с задачейУдалить ``` #### — Календарь Выбор даты в две панели: быстрые варианты слева (Сегодня, Завтра, Пятница, Через неделю…), месяц справа. На телефоне варианты — пилюли над месяцем. Обычно — внутри . Атрибуты: - value: string — ISO-дата YYYY-MM-DD; пусто — без срока. - no-quick: boolean — Без панели быстрых вариантов — только месяц. - no-none: boolean — Без варианта «Без срока» (дата обязательна). - min: string — Раньше этой даты выбрать нельзя. События: - pz-change (detail: { value }) - pz-select (detail: { value }) — Закрывает выпадашку. Пример — Отдельно: ```html ``` #### — Строка записи Строка списка записей внутри карточки: плитка типа, номер, заголовок, мета-строка, справа — лица, срок, статус. Наведение — колодец, открытая — мягкая синяя заливка. Атрибуты: - title: string — Заголовок (или содержимое). - meta: string — Вторая строка серым. - id-label: string — Номер записи (ПРО-140), моноширинным. - icon: string — Плитка слева. - tone: string - color: string - href: string - selected: boolean — Открыта в дровере. - unread: boolean — Синяя точка слева. - dense: boolean События: - click — Открыть запись (обычно — в pz-drawer). Слоты: - по умолчанию — Заголовок. - slot="meta" — Мета-строка с разметкой. - slot="lead" — Свой лид (аватар). - slot="end" — Справа: pz-faces, pz-chip, pz-badge, pz-counter. Правила: - Строки — внутри pz-card pad="sm" одна под другой (gap 2), без линий-разделителей. Пример — Список в карточке: ```html
СегодняВ работе
``` #### — Степпер и этапы Степпер статуса записи — одна рейка: этапы пилюлями, подсказка «что дальше», действие справа. — компактная лента этапов конвейера (сделано → сейчас → дальше). Атрибуты: - steps: string — Этапы через запятую: «Новая, Обсуждаем, В работе, Проверка, Готово». - current: number (по умолчанию 0) — Индекс текущего этапа (с нуля). - hint: string — Что дальше: «Ждёт ревью Анны». - interactive: boolean — Этапы нажимаются — событие pz-change. События: - pz-change (detail: { index, step }) Слоты: - по умолчанию — Действие справа (pz-button, обычно ink — «Отдать на проверку»). Пример — Статус записи: ```html На проверку ``` Пример — Этапы конвейера: ```html ``` #### — Вложение Файл, картинка или ссылка: ряд 56 с квадратом-превью и двумя строками. add — пунктирная кнопка «Прикрепить». Раскладка — .pz-row. Атрибуты: - name: string - meta: string — Размер, источник. - kind: 'file' | 'img' | 'link' (по умолчанию file) - thumb: string — Превью картинки. - href: string - icon: string - add: boolean - removable: boolean — Крестик при наведении, событие pz-remove. События: - click - pz-remove Пример — Вложения: ```html
``` #### — Строка настройки Настройка в колодце: заголовок и пояснение слева, контрол справа (тумблер, сегмент, кнопка). Стопка строк — .pz-stack.tight внутри карточки. Атрибуты: - title: string - hint: string — Пояснение серым. - icon: string — Плитка слева. - tone: string Слоты: - по умолчанию — Контрол справа. - slot="hint" — Пояснение с разметкой. Пример — Настройки уведомлений: ```html
TelegramПочтаНет
``` #### — Тост Короткое сообщение чернильной пилюлей снизу по центру, с действием («Вернуть»). Вызывается функцией toast(текст, { action, onAction, tone, ms }). Атрибуты: - action: string — Кнопка действия справа. - icon: string - tone: 'ok' | 'err' — Значок успеха или ошибки. Методы: - close() — Убрать с анимацией. - toast(text, opts) — import { toast } from '…/pulse-ds.js' — Показать тост; возвращает функцию закрытия. События: - pz-action — Нажата кнопка действия. Правила: - Тост — для подтверждения действия и отмены, не для ошибок формы (они — в error у поля). Пример — Вид (статично) и вызов: ```html
Задача удаленаСохраненоПоказать тост
``` #### — Пустое состояние Когда показывать нечего или загрузка упала: шар со значком, заголовок, короткий текст и действие. Атрибуты: - icon: string (по умолчанию inbox) - title: string - text: string - tone: 'err' | 'ok' — err — ошибка (значок cloud_off), ok — «всё сделано». - compact: boolean — Внутри карточки. Слоты: - по умолчанию — Действия (кнопки). - slot="text" — Текст с разметкой вместо атрибута text. Правила: - Текст говорит, что делать дальше, а не только «пусто». Пример — Пусто, всё сделано, ошибка: ```html
Новая идеяПовторить
``` ### Крупные — панели и каркас #### — Дровер записи Запись открывается дровером, а не отдельной страницей. Три режима: справа рядом со списком (side), окном (window), на весь экран (full). Шапка с ↑↓ «1 из 5», пилюлей номера и переключателем режимов; ряд параметров; тело; низ. На телефоне — на весь экран. Атрибуты: - open: boolean - mode: 'side' | 'window' | 'full' (по умолчанию side) - title: string — Заголовок записи (h2). - id-label: string — Номер записи в пилюле (ПРО-140). - icon: string — Плитка типа в пилюле номера. - tone: string - index: number — Позиция в списке (с 1). - total: number — Сколько в списке — показывает ↑↓ и «1 из N». - no-modes: boolean — Без переключателя режимов. - push: boolean — В режиме side ужимать страницу (pz-app-shell сдвигает контент). - width: string (по умолчанию 560px) — Ширина в режиме side. Методы: - show(mode?) / hide() — Открыть (можно сразу в режиме) и закрыть. События: - pz-open - pz-close - pz-mode (detail: { mode }) - pz-prev - pz-next Слоты: - по умолчанию — Тело: описание, чеклист (pz-well), вложения, степпер. - slot="params" — Ряд pz-param-pill / pz-dropdown под заголовком. - slot="actions" — Кнопки в шапке перед «Закрыть» (ещё, поделиться). - slot="header" — После пилюли номера (бейдж статуса). - slot="title" — Свой заголовок вместо title (правка на месте). - slot="footer" — Низ: главное действие справа. Правила: - Esc закрывает; ↑↓ — соседние записи (pz-prev / pz-next, данные меняет приложение). - Параметры — пилюлями в slot="params", не листом свойств. - Обсуждение записи — в чате (pz-chat), не блоком комментариев внизу. Пример — Запись в дровере: ```html Открыть записьВ работе

Покупатель оформляет заказ без аккаунта; аккаунт создаётся после оплаты, письмо со ссылкой на пароль.

Форма без пароляПисьмо после оплаты
ОтложитьНа проверку
``` #### — Диалог Окно по центру с затемнением: подтверждение, короткая форма. На телефоне — лист снизу. Подтверждение одной строкой — confirmDialog({ title, text, ok, danger }). Атрибуты: - open: boolean - title: string - text: string - icon: string — Плитка слева от заголовка. - tone: string - size: 'sm' | 'md' | 'lg' (по умолчанию md) — 400 / 480 / 720. - persistent: boolean — Не закрывать по Esc и клику мимо. Методы: - show() / close(value?) — Открыть, закрыть (value придёт в pz-close). - confirmDialog(opts) — import { confirmDialog } from '…/pulse-ds.js' — Готовое подтверждение, Promise. События: - pz-open - pz-close (detail: { value }) Слоты: - по умолчанию — Тело (поля формы). - slot="footer" — Действия справа: ghost «Отмена» + ink или danger. Правила: - Для записи — pz-drawer, не диалог. Диалог — для подтверждений и форм на 1–3 поля. Пример — Форма и подтверждение: ```html
ПригласитьОтменаПригласитьУдалить
``` #### — Лист снизу Стеклянный лист снизу с ручкой — действия и выбор на телефоне. Меню pz-dropdown становится листом само; pz-sheet — для своих экранов (фильтры, «ещё»). Атрибуты: - open: boolean - title: string Методы: - show() / hide() — События: - pz-close Слоты: - по умолчанию — Содержимое (pz-menu, поля, кнопки). - slot="actions" — Справа от заголовка. Пример — Фильтры: ```html ФильтрыСбросить
ВсеМоиЖдутПоказать 12
``` #### — Шапка страницы Заголовок страницы H1 с плиткой раздела и контекстным чипом, ИИ-строка или подзаголовок под ним; справа — действия высотой 48 (поиск, группа значков, «+ Создать», аватар); ниже — вкладки. Атрибуты: - title: string - subtitle: string - ai: string — ИИ-строка (бриф) со значком auto_awesome — вместо подзаголовка. - icon: string — Плитка раздела. - tone: string - color: string Слоты: - slot="actions" — Справа: pz-field variant="search", pz-icon-group, pz-dropdown с «Создать», pz-avatar. - slot="chip" — Рядом с заголовком: охват, статус, лица. - slot="tabs" — Вкладки и фильтры (pz-segmented). - slot="lead" — Свой лид. - slot="subtitle" — Подзаголовок с разметкой. Правила: - Заголовок страницы один; действия справа — одной высоты (48), это задаёт сама шапка. Пример — Мой Пульс: ```html Все пространстваСоздатьВсёМоя работаЖдут меня ``` #### — Каркас приложения Сайдбар слева прямо на тонированной земле и колонка контента; на телефоне вместо сайдбара — плавающий таб-бар. collapsed — рельс из значков. Дровер с push ужимает контент. Атрибуты: - collapsed: boolean — Рельс 76 px. - no-ground: boolean — Без своей земли (если она уже на body.pz-app). Слоты: - slot="brand" — Верх сайдбара: pz-nav-brand (переключатель пространства). - slot="sidebar" — pz-nav-item, pz-nav-section. - slot="sidebar-bottom" — Низ сайдбара: настройки, профиль. - по умолчанию — Контент: pz-page-header + карточки. - slot="tabbar" — pz-tabbar для телефона. Правила: - Сайдбар не карточка: пункты лежат на земле, активный — белая пилюля с тенью. - Пункты сайдбара — разделы текущего пространства; глобальные действия — в шапке страницы. Пример — Каркас (уменьшено): ```html
Мой ПульсИдеиДокументыТемыКорзинаДоставкаНастройки
``` #### — Навигация сайдбара Пункт сайдбара 42 px: значок или плитка темы, подпись, счётчик. Активный — белая пилюля с тенью. — подпись группы, — логотип и переключатель пространства (триггер для pz-dropdown). Атрибуты: - icon: string - tile: string — Значок в плитке (для тем и пространств). - color: string — Цвет плитки. - tone: string - href: string - active: boolean - count: string - count-tone: 'plain' | 'blue' | 'hot' | 'mute' (по умолчанию plain) — hot — ждут моего шага. - add: boolean — Тихий пункт «+ Тема». Слоты: - по умолчанию — Подпись. Пример — Сайдбар: ```html
ЗакреплённыеПродуктМагазин
Мой ПульсБорисИдеиТемыКорзинаОплатаТема
``` #### — Таб-бар телефона Плавающая стеклянная пилюля снизу на телефоне (≤760 px): 4 вкладки и круглая чернильная «+» по центру. На широком экране скрыт (always — показывать всегда). Атрибуты: - always: boolean — Показывать и на широком экране, в потоке (для витрины). Слоты: - по умолчанию — Подпись, . Пример — Таб-бар: ```html
ПульсИдеиЧатыЕщё
``` #### — ИИ-блок Тёплый слой ИИ: итог, вердикт, вопрос или предложение ИИ-исполнителя (Борис). Заголовок со значком, вердикт пилюлей, текст, этапы конвейера, действия. Атрибуты: - title: string (по умолчанию ИИ) - icon: string (по умолчанию auto_awesome) - verdict: string — Пилюля справа: «Готово к выкатке», «Нужен ответ». - verdict-tone: 'ok' | 'warn' | 'danger' - compact: boolean Слоты: - по умолчанию — Текст. - slot="avatar" — Аватар исполнителя слева от заголовка. - slot="stages" — pz-stages — этапы конвейера. - slot="actions" — Кнопки ответа. Правила: - ИИ всегда узнаётся: градиент ai, значок auto_awesome или аватар исполнителя. Не смешивать с обычными карточками. Пример — Вопрос Бориса: ```html Купон применять до расчёта доставки или после? В коде сейчас — после, а в ТЗ — до.До доставкиПослеОбсудить в чате ``` #### — Чат Обсуждение — как в мессенджере: фон с узором, пузыри (свой справа, голубой), стеклянное поле ввода с синей кнопкой «Отправить». — лента, — сообщение, — поле (Enter — отправить, Shift+Enter — строка). Атрибуты: - title: string Методы: - scrollToEnd() — Прокрутить к последнему сообщению (делается само при добавлении). События: - pz-send (detail: { value }) — От pz-composer: отправить сообщение (preventDefault — не очищать поле). - pz-attach — От pz-composer: нажата скрепка. Слоты: - по умолчанию — pz-bubble me author avatar time cont. - slot="header" — Плавающие стеклянные пилюли сверху (название, участники). - slot="composer" — pz-composer. Правила: - Обсуждение записи — только в чате; встроенного блока комментариев нет. - Подряд идущие сообщения одного автора — cont (без имени и аватара). Пример — Чат записи: ```html
Купон слетает после входа — воспроизвёл на стенде.Похоже, корзина гостя не сливается с корзиной аккаунта.Да, слияние теряет поле coupon. Поправлю сегодня.
``` ## Готовые блоки и страницы Копируй целиком и меняй данные — это эталонные композиции. ### Страница-список с дровером Каркас приложения, шапка с поиском и «Создать», вкладки, список записей в карточке; клик по строке открывает запись в дровере справа (страница ужимается). Основа любого раздела «реестр»: заявки, задачи, заказы, поставщики. ```html Входящие В доставке Возвраты Отчёты Выручка Настройки Заказ Все Оплачены Ждут ответа Фильтры
Новый ждёт 2 ч Собираем
Новый Дима СмирновАнна Котова
Колодки передние, 04465-334509 980 ₽
Доставка СДЭК2 500 ₽
Отменить заказ Взять в работу
ВходящиеДоставка ОтчётыЕщё
``` ### Дашборд: центр внимания Шапка с ИИ-брифом, сетка виджетов-карточек: «Ждут тебя», ключевые числа, «Где горит», ИИ-итог. Числа — табличные цифры, графики — sparkline/диаграммы по правилам dataviz. Основа «Моего Пульса» и любых сводок. ```html
Эта неделя
Все
горит
2,41 млн ₽
+8 % к плану1 284 заказа
Склад Москва
заказы старше 24 ч
Поставщик Emex
нет ответа по ценам
Больше всего движения в «Возвратах»: закрыто 14, новых 9. Предлагаю назначить второго ответственного по PayPal — очередь растёт третью неделю. НазначитьПозже
``` ### Форма записи Создание и правка: заголовок крупным полем, параметры пилюлями в одну строку (исполнитель, срок, важность), описание, вложения, действия внизу. Обычная : pz-field и pz-toggle отдают name/value в FormData, pz-button type="submit" отправляет. ```html
Дима СмирновАнна КотоваБорис ВысокаяОбычнаяНизкая
Очистить Сохранить черновик Создать
``` ### Настройки Секции — карточки с плиткой; строки — pz-setting-row в колодце, контрол справа. Профиль сверху, опасные действия — последней карточкой, кнопкой danger. ```html
Иван Якимов
владелец · 4 пространства
Изменить
СветлаяТёмнаяСистема
Выйти везде
```