Дизайн-система playva

Открытая страница: смотреть можно всем. Она вшивает настоящие стили продукта и рисует настоящую разметку компонентов — это не перерисовка, а те же самые кнопки, бейджи и поля. Значения собраны из tokens.css при сборке, поэтому разойтись с продуктом им нечем. Тема одна — светлая.

Цвет

Основа

#FFFFFF--background фон экрана
#0F0F0F--on-background текст на фоне
#EFEFEF--surface поверхность карточки
#F7F7F7--surface-light приподнятая поверхность

Акцент

#C2E900--accent ТОЛЬКО заливка
#10120A--on-accent текст поверх заливки
#5E7200--accent-ink лайм как ТЕКСТ или иконка на белом
#A8CB00--accent-pressed нажатое состояние

Служебные

#00DE73--abstract второй акцент
#6E6E6E--secondary вторичный текст
#CCCCCC--secondary-surface декоративные заливки, плейсхолдеры
#2F2F2F--secondary-dark тёмная вторичная
#A3A3A3--light-grey светло-серая
#D62839--error ошибка
#E85A1C--warning предупреждение
#407FDB--success успех
Лайм живёт двумя токенами. Сырой #c2e900 на белом даёт контраст около 1.4:1 — как текст он нечитаем. Заливка — --accent, текст поверх неё --on-accent. Лаймовый текст или иконка на белом — только --accent-ink (#5e7200, контраст 5.4:1).

Полупрозрачные: --background-50 rgba(255, 255, 255, 0.5) · --surface-75 rgba(255, 255, 255, 0.75) · --accent-soft rgba(194, 233, 0, 0.18)

Типографика

основнаяHelvetica Neue Cyr — --font-body
заголовочнаяHelvetica Display, начертание 900 — --font-display
моношириннаяDisket Mono — --font-mono. Без строчной кириллицы: «чат» превращается в «ЧАТ». Для русского не использовать.

Ниже — настоящие классы .text-* продукта. Кегль крупных строк уменьшен для показа, остальное как в коде.

класскегль / вес / интерлиньяжобразец
text-alpha 112px / 900 / 124px Играем сегодня
text-xxl-1 72px / 900 / 84px Играем сегодня
text-xxl-2 56px / 900 / 68px Играем сегодня
text-xl 48px / 900 / 56px Играем сегодня
text-lg 28px / 900 / 36px Играем сегодня
text-title1 24px / 500 / 32px Играем сегодня
text-title2 20px / 600 / 24px Играем сегодня
text-body-1 17px / 600 / 22px Играем сегодня
text-body-2 15px / 500 / 20px Играем сегодня
text-callout 13px / 500 / 18px Играем сегодня
text-caption 12px / 600 / 16px Играем сегодня

Кнопки

Настоящие .btn продукта: четыре размера, пять видов, выключенное состояние.

размервысота / кеглькнопка
btn--sm 32px / 15px
btn--md 44px / 17px
btn--lg 52px / 19px
btn--xl 60px / 22px
btn--primary btn--dark btn--surface btn--ghost btn--danger disabled

Бейджи

NEWbadge 7badge--large badge--dot (пульсирует)

Обычный бейдж набирается ПРОПИСНЫМИ (text-transform: uppercase) — помните про кириллицу в моношрифте, здесь она набирается основной гарнитурой и потому читается.

Поля и состояния

Настоящий .input. Состояние фокуса живьём показать статикой нельзя — рядом приведены его значения из кода.

обычное
с значением
disabled
textarea

Карточки и поверхности

Заголовок карточки

Поверхность --surface, радиус --border-radius-regular.

Акцентная карточка

Заливка --accent, текст --on-accent.

В продукте карточку обрезает суперэллипс (clip-path), а её тень рисует отдельный слой SVG по тому же контуру. Здесь показана обычная CSS-геометрия: приём с обрезкой требует скриптов, а эта страница обязана читаться без них.

Радиусы и сглаживание

4px
8px
12px
16px
32px

Сглаживание угла — --shape-smoothing: 0.6. Это буквально параметр Figma «Corner smoothing» (у пресета iOS он 60%). В макете: ставьте нужный радиус и сглаживание 60%.

Рамка — 1px solid rgba(var(--border-color), var(--border-opacity)).

Тени и стекло

shadow-soft
shadow-card
shadow-float
--shadow-soft0 2px 8px rgba(15, 15, 15, 0.06)
--shadow-card0 6px 16px rgba(15, 15, 15, 0.07), 0 2px 4px rgba(15, 15, 15, 0.05)
--shadow-float0 24px 60px rgba(15, 15, 15, 0.12), 0 6px 16px rgba(15, 15, 15, 0.07)
--glass-bgrgba(255, 255, 255, 0.72)
--glass-blurblur(24px) saturate(140%)
--glass-borderrgba(15, 15, 15, 0.08)

Канонические числа тени карточки, которую рисует слой SVG: смещение вниз 8, размытие ≈18px, #0F0F0F при 14%.

Состояния

состояниекак выражено
нажатиекнопка темнеет до --accent-pressed #a8cb00 и слегка сжимается
выключено:disabled — прозрачность и запрет указателя, см. образец выше
фокус:focus-visible — видимое кольцо; появляется только при вводе с клавиатуры
загрузкакласс .skeleton — серая плашка с бегущим бликом вместо содержимого
ошибкацвет --error #d62839; текст ошибки называет, ЧТО делать, а не только что сломалось
живое событие.badge--dot и .card--live — пульсация, а не заливка
.skeleton

Движение

Кривые заданы функцией linear(), а не cubic-bezier: пружину тремя точками Безье не описать, а именно она даёт фирменный отскок.

токенназначение
--ease-springпружина: появление и перелёт
--ease-popрождение «из ничего»
--ease-snapрезкий доводчик, null
--ease-standardnull
--dur-fade
--dur-slide
--dur-scale
--dur-scale-xl
--dur-twitch
--dur-loop

Ритм экрана

--space-block56pxмежду блоками
--space-head20pxзаголовок блока → содержимое
--space-cards24pxмежду карточками
--tabbar-height88pxвысота нижней навигации

Иконки — 36 шт.

Достаны разбором icons.tsx: это те же самые контуры, что в продукте, а не срисованные. Основа — 24×24, обводка currentColor толщиной 2, скруглённые концы. Цвет наследуется от текста, поэтому иконка красится там, где стоит.

IconHome
IconTrophy
IconPlus
IconChat
IconUser
IconSwords
IconFlag
IconMap
IconPin
IconQr
IconShare
IconVerified
IconAlert
IconScore
IconLock
IconUnlock
IconCheck
IconChevronRight
IconClose
IconTelegram
IconLink
IconEdit
IconBell
IconSound
IconClock
IconChart
IconDice
IconUserPlus
IconImagePlus
IconLogout
IconGlobe
IconVk
IconPhone
IconRoute
IconTaxi
IconCopy
одна и та же иконка в разных цветах текста

Виды спорта

Фотографии видов и знаки режимов игры: solo — одиночная, pvp — на двоих, tournament — турнирная.

/sports/billiards.jpg
/sports/chess.jpg
/sports/table-tennis.jpg
/sports/tennis.jpg
/icons/pvp-billiards.png
/icons/pvp-chess.png
/icons/pvp-table_tennis.png
/icons/solo-billiards.png
/icons/solo-chess.png
/icons/solo-table_tennis.png
/icons/tournament-billiards.png
/icons/tournament-chess.png
/icons/tournament-table_tennis.png

Логотип

/logos/pingtable.png

Карточки для пересылки

Картинки и ролики, которыми приглашение и результат уходят в мессенджер.

/cards/battle-billiards.jpg
/cards/battle-chess.jpg
/cards/battle-table_tennis.jpg
/cards/invite.jpg
/cards/reminder.jpg
/cards/result-lose.jpg
/cards/result-win.jpg

Обложки — 87 шт.

Заставки турниров и разделов.

air_hockey-1280.webp
air_hockey-640.webp
air_hockey-960.webp
backgammon-1280.webp
backgammon-640.webp
backgammon-960.webp
badminton-1280.webp
badminton-640.webp
badminton-960.webp
basketball-1280.webp
basketball-640.webp
basketball-960.webp
bowling-1280.webp
bowling-640.webp
bowling-960.webp
checkers-1280.webp
checkers-640.webp
checkers-960.webp
cs2-1280.webp
cs2-640.webp
cs2-960.webp
darts-1280.webp
darts-640.webp
darts-960.webp
dnd-1280.webp
dnd-640.webp
dnd-960.webp
dominoes-1280.webp
dominoes-640.webp
dominoes-960.webp
dota2-1280.webp
dota2-640.webp
dota2-960.webp
ea_fc-1280.webp
ea_fc-640.webp
ea_fc-960.webp
foosball-1280.webp
foosball-640.webp
foosball-960.webp
football-1280.webp
football-640.webp
football-960.webp
go-1280.webp
go-640.webp
go-960.webp
hockey-1280.webp
hockey-640.webp
hockey-960.webp
mafia-1280.webp
mafia-640.webp
mafia-960.webp
mahjong-1280.webp
mahjong-640.webp
mahjong-960.webp
monopoly-1280.webp
monopoly-640.webp
monopoly-960.webp
mtg-1280.webp
mtg-640.webp
mtg-960.webp
padel-1280.webp
padel-640.webp
padel-960.webp
pickleball-1280.webp
pickleball-640.webp
pickleball-960.webp
poker-1280.webp
poker-640.webp
poker-960.webp
scrabble-1280.webp
scrabble-640.webp
scrabble-960.webp
squash-1280.webp
squash-640.webp
squash-960.webp
tekken-1280.webp
tekken-640.webp
tekken-960.webp
tennis-1280.webp
tennis-640.webp
tennis-960.webp
volleyball-1280.webp
volleyball-640.webp
volleyball-960.webp
warhammer-1280.webp
warhammer-640.webp
warhammer-960.webp

Баннеры — 32 шт.

arena-1440.webp
arena-1920.webp
arena-640.webp
arena-960.webp
core-1440.webp
core-1920.webp
core-640.webp
core-960.webp
dune-1440.webp
dune-1920.webp
dune-640.webp
dune-960.webp
field-1440.webp
field-1920.webp
field-640.webp
field-960.webp
fold-1440.webp
fold-1920.webp
fold-640.webp
fold-960.webp
forest-1440.webp
forest-1920.webp
forest-640.webp
forest-960.webp
stadium-1440.webp
stadium-1920.webp
stadium-640.webp
stadium-960.webp
wave-1440.webp
wave-1920.webp
wave-640.webp
wave-960.webp

Портреты по умолчанию — 36 шт.

«Смуф»-квадраты вместо пустого аватара. Круглых портретов в продукте нет вовсе — решение владельца.

Графики

График рейтинга — лента с прокруткой, а не карточка: точки идут ровным шагом по 26px, в кадре около пятнадцати, остальное листается пальцем в прошлое. Открывается лента на КОНЦЕ — свежая игра важнее первой. Ось X по играм, не по времени: у любителя игры редкие и кучные, шкала дат дала бы пустые недели и слипшиеся вечера.

Всё пунктирное и без заливки. Решение владельца: «просто сухая пунктирная линия с точечками», «засветка салатовая как будто портит». Площадь под кривой ничего не значит — Эло это не объём и не деньги. Лайм из оформления убран целиком и оставлен единственной роли — отмечать ВЫБОР. Точка сделана из двух окружностей с зазором: он читается как визир прибора, а не как маркер данных.

Август
чтокак задано в коде
линия--on-background, толщина 1.75, пунктир 6 4, прозрачность 0.85, скруглённые концы, без заливки
сеткапунктир 2 4 при 0.08; базовая линия — 5 5 при 0.22
визирпунктир 3 4 при 0.35
точкакольцо r 5.5 при 0.28 + ядро r 2.4, цвет --on-background
выбранная точкакольцо r 8.5 толщиной 2 + ядро r 3.6, цвет --accent — единственное место, где на графике есть лайм
размерывысота 240, поля сверху 22 и снизу 34, шаг точки 26, отступ ленты 22
криваямонотонный сплайн Fritsch–Carlson — не перелетает узлы
сетка значений3–4 линии на круглых значениях, шаг из ряда 10·20·25·50·100·200·500
подпись временимесяц словом под лентой, липнет к левому краю, пока не въедет следующий

Места

Карточка площадки (.place-card): снимок, название .text-title2, строка «адрес · расстояние» .text-caption.text-secondary, описание .text-body-2 и лента чипов .place-chips с видами спорта. Есть и узкий вариант строкой — .place-row. Содержимое приходит из базы, поэтому здесь показана ФОРМА, а не выдуманная площадка.

Название площадки

адрес · расстояние

короткое описание

ВИД СПОРТАЕЩЁ ОДИН

Навигация и оверлеи

Нижняя навигация — пять ячеек, высота 88px, низ учитывает безопасную зону. Слева направо: Главная (дом), Рейтинг (кубок), Создать игру (круглая лаймовая), Места (пин), Профиль. Названия живут в aria-label: подписей под значками нет, но для скринридера пять безымянных ссылок были бы неразличимы. Иконки 26×26, у кнопки создания 28×28.

Шторка (.sheet) выезжает снизу, высотой до 85% экрана, с полоской-ручкой сверху; фон за ней затемняется и размывается. Само движение статикой не показать — оно на живой витрине.

Оболочка десктопа

Продукт мобильный. На широком экране он показывается в рамке телефона по центру, а витрина — вьюпортами: по одному или двумя рядом («Мобильный» + «Десктоп»). У телефона и планшета ширина фиксирована, у десктопа — по свободной ширине. Высота ограничена высотой НАСТОЯЩЕГО устройства: иначе расчёты от vh (например max-height: 85vh у шторки) на большом мониторе разошлись бы с телефоном. На низком окне кадр ниже — это видно по подписи.

Мобильный390 × 844
Планшет768 × 1024
Десктоппо ширине окна

Состояния загрузки

Настоящий .skeleton: серая плашка с бегущим бликом на месте будущего содержимого. Формой повторяет то, что заменяет, — иначе при подстановке экран прыгает.

Звук — 10 сигналов

Каждый сигнал лежит двумя форматами: webm и m4a. Два не про запас — Safari отвечает, что webm играет, и на Opus падает с ошибкой раскодирования, поэтому нужен запасной. Ниже можно послушать и скачать.

error m4a webm
hover m4a webm
magic m4a webm
message m4a webm
notify m4a webm
open m4a webm
sent m4a webm
success m4a webm
tap m4a webm
warning m4a webm

Контент — можно скачать

Всё, что есть в продукте: заставки, баннеры, карточки пересылки, портреты, знаки режимов, логотип, шрифты. Нажатие на имя файла скачивает его.

Заставки и обложки — 87 шт.

air_hockey-1280.webp
air_hockey-640.webp
air_hockey-960.webp
backgammon-1280.webp
backgammon-640.webp
backgammon-960.webp
badminton-1280.webp
badminton-640.webp
badminton-960.webp
basketball-1280.webp
basketball-640.webp
basketball-960.webp
bowling-1280.webp
bowling-640.webp
bowling-960.webp
checkers-1280.webp
checkers-640.webp
checkers-960.webp
cs2-1280.webp
cs2-640.webp
cs2-960.webp
darts-1280.webp
darts-640.webp
darts-960.webp
dnd-1280.webp
dnd-640.webp
dnd-960.webp
dominoes-1280.webp
dominoes-640.webp
dominoes-960.webp
dota2-1280.webp
dota2-640.webp
dota2-960.webp
ea_fc-1280.webp
ea_fc-640.webp
ea_fc-960.webp
foosball-1280.webp
foosball-640.webp
foosball-960.webp
football-1280.webp
football-640.webp
football-960.webp
go-1280.webp
go-640.webp
go-960.webp
hockey-1280.webp
hockey-640.webp
hockey-960.webp
mafia-1280.webp
mafia-640.webp
mafia-960.webp
mahjong-1280.webp
mahjong-640.webp
mahjong-960.webp
monopoly-1280.webp
monopoly-640.webp
monopoly-960.webp
mtg-1280.webp
mtg-640.webp
mtg-960.webp
padel-1280.webp
padel-640.webp
padel-960.webp
pickleball-1280.webp
pickleball-640.webp
pickleball-960.webp
poker-1280.webp
poker-640.webp
poker-960.webp
scrabble-1280.webp
scrabble-640.webp
scrabble-960.webp
squash-1280.webp
squash-640.webp
squash-960.webp
tekken-1280.webp
tekken-640.webp
tekken-960.webp
tennis-1280.webp
tennis-640.webp
tennis-960.webp
volleyball-1280.webp
volleyball-640.webp
volleyball-960.webp
warhammer-1280.webp
warhammer-640.webp
warhammer-960.webp

Баннеры — 32 шт.

arena-1440.webp
arena-1920.webp
arena-640.webp
arena-960.webp
core-1440.webp
core-1920.webp
core-640.webp
core-960.webp
dune-1440.webp
dune-1920.webp
dune-640.webp
dune-960.webp
field-1440.webp
field-1920.webp
field-640.webp
field-960.webp
fold-1440.webp
fold-1920.webp
fold-640.webp
fold-960.webp
forest-1440.webp
forest-1920.webp
forest-640.webp
forest-960.webp
stadium-1440.webp
stadium-1920.webp
stadium-640.webp
stadium-960.webp
wave-1440.webp
wave-1920.webp
wave-640.webp
wave-960.webp

Карточки для пересылки — 7 шт.

battle-billiards.jpg
battle-chess.jpg
battle-table_tennis.jpg
invite.jpg
reminder.jpg
result-lose.jpg
result-win.jpg

Виды спорта — 4 шт.

billiards.jpg
chess.jpg
table-tennis.jpg
tennis.jpg

Знаки режимов игры — 9 шт.

pvp-billiards.png
pvp-chess.png
pvp-table_tennis.png
solo-billiards.png
solo-chess.png
solo-table_tennis.png
tournament-billiards.png
tournament-chess.png
tournament-table_tennis.png

Портреты по умолчанию — 36 шт.

m15.jpg
m18.jpg
m21.jpg
m24.jpg
m27.jpg
m3.jpg
m30.jpg
m33.jpg
m41.jpg
m42.jpg
m47.jpg
m52.jpg
m58.jpg
m64.jpg
m70.jpg
m76.jpg
m82.jpg
m88.jpg
m9.jpg
m94.jpg
w11.jpg
w17.jpg
w23.jpg
w29.jpg
w35.jpg
w44.jpg
w5.jpg
w50.jpg
w56.jpg
w62.jpg
w68.jpg
w74.jpg
w80.jpg
w86.jpg
w92.jpg
w96.jpg

Логотип — 1 шт.

pingtable.png

Шрифты — 6 файлов

Disket-Mono-Bold.ttfHelveticaDisplay-XBold.otfHelveticaNeueCyr-Bold.otfHelveticaNeueCyr-Heavy.otfHelveticaNeueCyr-Medium.otfHelveticaNeueCyr-Roman.otf

Чего здесь нет — и почему

Честный список: эти разделы живой витрины статикой не показать, и подделывать их картинкой было бы враньём.

движениекривые и длительности выписаны выше, но САМО движение — только в браузере
картаЯндекс.Карты, живой виджет
данныерейтинги, составы, расписания приходят из базы

Всё перечисленное есть на живой витрине — /design — там, где можно нажимать.

Живая витрина компонентов — /design (нужен браузер). Эта страница плоская: её читает и краулер, и curl. Стили на ней — файлы продукта, вшитые при сборке.