From 414513803cdb40d07722190bad69168b875bb9f2 Mon Sep 17 00:00:00 2001 From: Fedorov Vladimir Date: Wed, 14 Oct 2026 23:39:17 +0700 Subject: [PATCH] up --- docs/DESIGN_SYSTEM.md | 301 ++++++++++ docs/FRONTEND_CODE_STANDARD.md | 6 +- src/assets/base.css | 15 + src/components/CaseBoard.vue | 179 ++++++ src/components/CaseFolder.vue | 122 ++++ src/components/ComponentDesignCatalog.vue | 480 ++++++++++++++++ src/components/DesignBrand.vue | 31 ++ src/components/DesignSystemPage.vue | 93 ++++ src/components/DossierFooter.vue | 23 + src/components/GameDesignPreview.vue | 160 ++++++ src/components/ObjectCover.vue | 72 +++ src/components/SectionHeading.vue | 32 ++ src/components/SiteDesignPreview.vue | 647 ++++++++++++++++++++++ src/components/SiteThemeProvider.vue | 72 +++ src/components/StatusStamp.vue | 17 + src/components/TextHighlight.vue | 21 + src/router/index.ts | 9 + src/views/DesignSystemView.vue | 7 + 18 files changed, 2285 insertions(+), 2 deletions(-) create mode 100644 docs/DESIGN_SYSTEM.md create mode 100644 src/components/CaseBoard.vue create mode 100644 src/components/CaseFolder.vue create mode 100644 src/components/ComponentDesignCatalog.vue create mode 100644 src/components/DesignBrand.vue create mode 100644 src/components/DesignSystemPage.vue create mode 100644 src/components/DossierFooter.vue create mode 100644 src/components/GameDesignPreview.vue create mode 100644 src/components/ObjectCover.vue create mode 100644 src/components/SectionHeading.vue create mode 100644 src/components/SiteDesignPreview.vue create mode 100644 src/components/SiteThemeProvider.vue create mode 100644 src/components/StatusStamp.vue create mode 100644 src/components/TextHighlight.vue create mode 100644 src/views/DesignSystemView.vue diff --git a/docs/DESIGN_SYSTEM.md b/docs/DESIGN_SYSTEM.md new file mode 100644 index 0000000..a5d7ae9 --- /dev/null +++ b/docs/DESIGN_SYSTEM.md @@ -0,0 +1,301 @@ +# Дизайн-система сайта и игры «Вечерний детектив» + +Два направления с общим логотипом: сайт помогает выбрать дело и управлять +участием, игра погружает в расследование. Визуальные правила описаны здесь; +единственный источник правил реализации — [FRONTEND_CODE_STANDARD.md](FRONTEND_CODE_STANDARD.md). +Рабочие страницы мигрируют постепенно; образцы не меняют их оформление. + +## Области применения + +| Направление | Где применяется | Характер | +| --------------------- | ----------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | +| Сайт «Золотой вечер» | Главная, каталог, кабинет, страницы организатора, редакторы и обычные формы | Тёмные ровные панели, машинописный шрифт, ярко-жёлтые действия, лёгкие фактуры | +| Игра «Материалы дела» | Расследование команды, улики, сюжетные документы, игровое управление и печатные материалы | Существующие бумага, кожа, металл, машинописный текст, бронзовые надписи и фактурные кнопки | + +Превью сюжетного документа внутри каталога или редактора использует игровой +стиль; окружающие управление и формы — стиль сайта. Игровые изображения и +фоны сценариев сохраняют собственное оформление. + +## Живые образцы + +Запустить `npm run dev` и открыть `/design-system` на адресе Vite. Вкладка +«Сайт» открывается первой, «Игра» показывает отдельные материалы и управление, +«Компоненты» — последовательный каталог: заголовок компонента, живой пример, +описание контракта и код подключения; затем следующий компонент. +Страница доступна только в разработке, без входа и пункта основного меню; +маршрут и компоненты образцов исключены из production-сборки. + +Все данные вымышлены. Форма, модальное окно и ход игры работают локально; +игровой ход не вызывает API и не меняет данные игры. Сайт использует `SiteThemeProvider`, игровые образцы — +собственный `NConfigProvider`: тема сайта не попадает в игровые компоненты. + +## Общий бренд и логотип + +Использовать [существующий знак](../src/assets/images/лого.jpg): детектив в +шляпе, чёрный круг, золотая окантовка. Не растягивать, не обрезать окантовку, +не перерисовывать. Свободное поле — не меньше четверти диаметра; +промежуток до названия — от 12 px. Размеры образцов — 48 и 144 px. + +Изображение рядом с названием имеет пустой `alt`, самостоятельный знак — +описательный. JPEG сохраняет белый фон внутри круга, круглое размещение +допускает `border-radius: 50%`. Прозрачного и векторного исходника нет; +качество крупной печати и узнаваемость favicon проверяются отдельно. + +Основной цвет текста обоих стилей на тёмных поверхностях — светлый `#EEE`, +второстепенный — `#BDB8AE`. Игровой бежевый `#BFA07D` используется точечно: +в бренде, декоративных надписях и текстовыделителе. Цвета статусов сохраняют +значение; текст на бумаге и жёлтых кнопках остаётся тёмным. Общий блок бренда +`DesignBrand` содержит логотип 48 px, промежуток 12 px и название +«Вечерний детектив» через `HeaderText`. На узком экране название может +переноситься; название направления «Материалы дела» располагается отдельно. + +Общие правила: mobile-first, desktop от 1024 px, текущие контейнеры 700/1200 px, +явные состояния ошибки и загрузки, доступность с клавиатуры. Шкала отступов: +4, 8, 12, 16, 24, 32, 48, 64 px. Цвета задавать семантическими CSS-переменными. + +## Сайт «Золотой вечер» + +### Палитра + +Токены находятся в `src/assets/base.css`. `--brand-bronze` и бумага связывают +оформление с игрой; жёлтый primary относится к сайту, а не к игровым действиям. + +| CSS-переменная | Цвет | Назначение | +| ------------------------ | --------- | -------------------------------------------------- | +| `--brand-background` | `#111111` | Фон сайта; текст на золотой кнопке и бумаге | +| `--brand-surface` | `#222222` | Карточки, панели, окна | +| `--brand-surface-hover` | `#2E2E39` | Подсветка поверхности при наведении | +| `--brand-text` | `#EEEEEE` | Основной текст | +| `--brand-text-muted` | `#BDB8AE` | Пояснения, подписи, второстепенные данные | +| `--brand-accent` | `#FFD43B` | Основное действие, ссылки, активный элемент, focus | +| `--brand-accent-hover` | `#FFE066` | Наведение на основное действие | +| `--brand-accent-pressed` | `#F5C518` | Нажатие на основное действие | +| `--brand-border` | `#77737F` | Границы полей и панелей | +| `--brand-success` | `#87C99D` | Успех | +| `--brand-info` | `#94BFEE` | Информация | +| `--brand-error` | `#F29A9A` | Ошибка и опасное действие | +| `--brand-bronze` | `#BFA07D` | Бренд, текстовыделитель и декоративные надписи | +| `--brand-paper` | `#F4EDE0` | Бумажные материалы | + +Предупреждение использует золото и явную подпись. Статусы не передавать только +цветом: добавлять текст и штатную иконку. Жёлтый акцент не использовать как цвет +обычного текста на бумаге или белом фоне. + +## Типографика и компоновка + +Весь стиль сайта использует существующий `font_old_typer`: заголовки, основной +текст, подписи, меню, кнопки, формы, таблицы и модальные окна. Новые шрифты не +загружаются. Шрифт задаётся на контейнере и в локальной теме Naive UI, чтобы +сохраняться в телепортируемых окнах. Игровая типографика остаётся прежней. + +| Элемент | Размер | Вес | Межстрочный интервал | +| ----------------------------- | ------------------------ | ------------------------------- | -------------------- | +| Главный заголовок | `clamp(32px, 4vw, 48px)` | 600 | 1.15 | +| Заголовок раздела | 28 px | 600 | 1.3 | +| Заголовок блока | 22 px | 600 | 1.4 | +| Вступление | 18 px | 400 | 1.5 | +| Основной текст | 18 px | 400 | 1.5 | +| Подпись | 14 px | 400 | 1.5 | +| Короткая надпись над разделом | 14 px | 400 | 1.5 | +| Бумажный текст | 18 px | существующий вес `MessagePaper` | 1.5 | + +Шкала отступов: 4, 8, 12, 16, 24, 32, 48, 64 px. На мобильном экране внешние +поля 16 px, на desktop — 24 px; между разделами 32 px на мобильном и 48 px на desktop, без сложения +верхних и нижних отступов соседних секций. Базовое скругление +8 px. Панели имеют тонкую границу; выраженную тень оставить бумажному слою и +существующим фактурным компонентам. + +Использовать текущие контейнеры `.width700` для дел и `.width1200` для списков, +прокрутку `.center-block-custom` и шапку высотой 70 px. Mobile-first; +desktop-порог — `@media (width >= 1024px)`. До него колонки складываются +вертикально, кнопки переносятся; широкая таблица прокручивается внутри себя. + +Главный блок выравнивается по верхнему краю, между колонками 32 px. Внутри +карточек поля 16 px на мобильном и 24 px на desktop, между элементами 16 px, +перед главным действием 24 px. Отступы абзацев по умолчанию нулевые; +интервалы задаются контейнерами. Не сжимать машинописный заголовок отрицательным +межбуквенным интервалом. Небольшие папки каталога сохраняют подписи не меньше 14 px. + +### Компоненты и материалы + +Использовать Naive UI. `NConfigProvider` берёт тему из CSS-токенов. Primary +имеет сплошную заливку `#FFD43B`, hover `#FFE066`, pressed `#F5C518`, текст +`#111`; сохранять машинописный шрифт и видимый focus. Опасное действие +использует красный акцент. Disabled и loading — штатные состояния Naive UI. + +Главный блок, карточки, формы, таблицы и окна имеют ровные поверхности. Кожа +допускается как небольшая полоса в шапке (`BeltBlock`), бумага — в документальных фрагментах превью дела (`paper.jpg`); +не оформлять весь сайт стопками листов. Название с логотипом в обоих стилях использует общий `DesignBrand` и +существующий `HeaderText`: бежевый `#BFA07D`, машинописный шрифт 22 px, +вес 600 и разрядка 2 px. Меню и основной текст сайта используют `font_old_typer`. + +Ссылки жёлтые на тёмном фоне; на светлом ярлыке текст тёмный. Формы имеют +подписи и ошибки у полей, таблицы — локальную прокрутку при необходимости. +Модальные окна — `n-modal` + `n-card`, заголовок, role dialog и aria-modal. + +### Доска расследования + +Без градиентов и свечения. Главный блок использует композицию +из текстовых улик: записка, билет, время отправления, номера и соединительные +линии приглушённого бронзового цвета. Логотип остаётся в шапке, не заменяет +обложку каждого дела. Под композицией — название, параметры и жёлтое действие. + +На desktop фрагменты расположены асимметрично с небольшими поворотами; +на мобильном — вертикально, без наложения текста. Бумага использует существующую +фактуру. Машинописный шрифт допустим внутри документальных фрагментов; +описания, навигация, формы и кнопки тоже используют `font_old_typer`. + +Документальные фрагменты декоративные, не имеют самостоятельных hover или действий. Линии не перехватывают +клики. Формы и служебные панели сохраняют ровные поверхности. Большая доска использует `CaseBoard`; каталог — повторяемые папки +`CaseFolder` с предметными обложками. + +### Детали досье + +| Приём | Где и как применять | +| -------------------- | --------------------------------------------------------------------------------------------------- | +| Папка с ярлыком | Карточка каталога, номер на выступающем ярлыке; оставлять 32 px между карточками | +| Бежевый маркер | Одно важное выражение в заголовке, тёмный текст на бежевой неровной полосе | +| Улика на обороте | Явная кнопка раскрывает цитату, `aria-expanded` и `aria-controls`; без 3D-переворота | +| Архивные разделители | Пунктир между разделами, номера и уголки на обложках; не дополнительные рамки вокруг каждого текста | +| Предметная обложка | Билет, ключ или письмо из существующих иконок и бумажных фактур; тот же символ рядом с названием | +| Заметка на полях | Короткая сюжетная подпись рядом с большой доской; на мобильном — ниже композиции | +| Штамп статуса | «Новое дело», «Скоро», «Пройдено»; только при наличии соответствующего реального состояния | +| Подсветка связи | Одна бронзовая линия становится жёлтой при hover или фокусе действия в карточке | +| Конец досье | Номер листа, название проекта, тонкая линия и «Продолжение — в следующем деле» | + +Карточки поднимаются на 3 px при наведении мыши и фокусе внутри. Переходы +занимают 160 ms; при `prefers-reduced-motion` подъём и переходы отключаются, +раскрытие цитат продолжает работать. Touch не зависит от hover: цитата +открывается кнопкой. Декоративные слои и линии не перехватывают клики. + +Три папки в образцах вымышлены, их штампы не обозначают реальные публикации +или историю пользователя. В образце дело «Скоро» имеет отключённое основное действие через отдельный +`disabled`; сам статус не управляет доступностью. +На рабочем сайте привязать состояния к данным; не вычислять «новое» или +«пройдено» по предположениям. Формы и таблицы сохраняют спокойный вид. + +## Игра «Материалы дела» + +### Эталон и палитра + +Эталон — текущее оформление расследования команды, а не тема сайта. +Сохранить `MessagePaper`, `IntroBlock`, `GameInputForm`, `BeltBlock`, +`MetalPlate` и их фактуры. Окружение тёмное `#111`, панели `#222`, основной текст +`#EEE`, бумажный текст чёрный, декоративные надписи бронзовые `#BFA07D`. +Существующие мятные состояния и фактурные игровые кнопки сохраняются; +жёлтую тему сайта не передавать игровому provider. + +### Материалы и управление + +| Материал | Источник | Применение | +| ------------------ | ------------------------------------------------- | ------------------------------------------------------------ | +| Бумага | `MessagePaper`, `paper.jpg`, `paper_white.jpg` | Вступление, точки, улики и фотографии; сохранять слои и тени | +| Кожа | `BeltBlock`, `belt.png` | Полосы управления и фактурные действия | +| Металл | `MetalPlate`, `metal.png`, `pin.png` | Детали панелей, без заливки всей страницы | +| Игровое управление | `GameInputForm`, `input_center.png`, `button.png` | Место назначения, счётчики и фактурная кнопка | + +Машинописный шрифт сохраняется в документах и существующих игровых +компонентах; сайт использует тот же шрифт по собственным правилам компоновки. `HeaderText` — для +бронзовых игровых надписей. В образцах подписи на коже и металле используют +чёрную подложку 80% для читаемости. Это локальное оформление образцов, +не массовая переделка рабочих игровых компонентов. + +Вступление и улика используют настоящие компоненты с демонстрационными +данными. Панель хода повторяет поведение игры: успешный локальный ход очищает +поле и показывает результат. В образцах панель размещена в потоке страницы; +в рабочей игре остаётся её существующее фиксированное положение. + +### Печатные материалы + +Светлые внутренние страницы, тёмный текст, небольшие золотые метки. Тёмное +оформление допустимо для обложек. Не печатать свечение интерфейса. Номера, +подписи и статусы должны читаться в чёрно-белом виде; сюжетные изображения +сохраняют собственную стилистику. + +## Проверка изменённого экрана + +- На ширинах 375, 768 и 1280 px нет горизонтальной прокрутки всей страницы; + таблица может прокручиваться локально. +- Текст имеет контраст от 4.5:1; крупный текст и значимые границы управления — + от 3:1. Проверять реальные пары цветов, в том числе hover и pressed. +- Все действия доступны с клавиатуры; focus виден, окно закрывается и возвращает + фокус на открывший его элемент. +- Ошибка, успех, загрузка и пустое состояние различимы без цвета. +- Логотип не деформирован; весь UI сайта использует `font_old_typer`, включая окна. +- Компонентные стили локальны, глобальная тема изменяется только при осознанной + миграции. Типы, ESLint и Stylelint проходят; изменения маршрутов проверены сборкой. + +- Переключение вкладок доступно с клавиатуры; сайт открывается первым. +- Жёлтая тема сайта не меняет игровые кнопки и документы. +- Игровой ход в образцах работает без сетевых запросов. + +## Подключение библиотеки + +Компоненты находятся в `src/components`, импортируются напрямую и не зависят +от dev-маршрута. Отдельного пакета и глобальной регистрации нет. Демонстрационные +данные остаются в `SiteDesignPreview`, `GameDesignPreview` и `ComponentDesignCatalog`. +Рабочие экраны пока не мигрируют. + +```vue + + + +``` + +Provider читает существующие CSS-токены при монтировании, задаёт darkTheme, +цвета, машинописный шрифт и размеры Naive UI; кнопки, поля, таблицы и окна +используются непосредственно из `naive-ui`. Телепортируемые окна сохраняют +тему; для текста внутри `NCard` используйте машинописный шрифт на классе окна, +как в каталоге. `--site-card-padding` позволяет контейнеру задавать поля карточек. +Игровые компоненты размещайте вне provider сайта, под своим +`NConfigProvider :theme="darkTheme" :theme-overrides="{}"`. + +| Компонент | Props | Slots / события | +| --- | --- | --- | +| `SiteThemeProvider` | Нет | default / нет | +| `DesignBrand` | Нет | Нет | +| `CaseFolder` | number, title, description, quote, object: ticket/key/letter, coverLabel, coverCaption; status?, disabled=false, actionLabel='Открыть дело' | Нет / open(title: string) | +| `CaseBoard` | label, fragments: readonly массив { number, title, text, caption?, detail?, kind?: note/ticket/timetable }, footer? | footer / нет | +| `ObjectCover` | object: ticket/key/letter, label, caption, status? | Нет | +| `StatusStamp` | text? | default заменяет text / нет | +| `TextHighlight` | Нет | default / нет | +| `SectionHeading` | title, id?, eyebrow? | default заменяет title / нет | +| `DossierFooter` | label | default / нет | +| `MessagePaper` | Нет | default / нет | +| `HeaderText` | Нет | default / нет | +| `BeltBlock` | Нет | default / нет | +| `MetalPlate` | Нет | default / нет | +| `IntroBlock` | introduction: EditableIntroduction, mode: show/show-editor/edit | default в режиме edit / update:mode | +| `GameInputForm` | addAction: (code: string) => Promise, allPlacesCount, newPlacesCount, gameStatus | Нет; true от addAction очищает поле | + +Статус папки необязателен и только показывает текст. Доступность задаёт родитель +через `disabled`, подпись действия — через `actionLabel`. Событие `open` передаёт +название; маршрутизация и API остаются у родителя. Каждая цитата получает +уникальный Vue `useId()`, даже для повторных карточек одного дела. + +Вкладки переключаются стрелками по кругу, Home открывает «Сайт», End — +«Компоненты». Каталог показывает disabled, loading, ошибку и успешную форму, +обрабатывает open локально и не отправляет запросы к серверу. diff --git a/docs/FRONTEND_CODE_STANDARD.md b/docs/FRONTEND_CODE_STANDARD.md index 0454e89..792016b 100644 --- a/docs/FRONTEND_CODE_STANDARD.md +++ b/docs/FRONTEND_CODE_STANDARD.md @@ -125,8 +125,10 @@ `@media (width >= 1024px)`. - Сохраняй текущий flow: `HeaderMenu` сверху, `.center-block-custom` для прокрутки, `.width700` для дел и `.width1200` для списков. -- Бумажные листы используют `MessagePaper` и `font_old_typer`; UI-формы, меню и - кнопки этот шрифт не используют. +- Бумажные листы используют `MessagePaper` и `font_old_typer`. В стиле сайта + `font_old_typer` используется также для текста, меню, кнопок и форм согласно + `docs/DESIGN_SYSTEM.md` (выбор владельца от 14.10.2026). Игровые компоненты + сохраняют существующую типографику. Рабочие экраны мигрируют отдельно. - Не добавляй глобальный utility-класс для одного компонента. ## 8. Формы, доступность и состояния diff --git a/src/assets/base.css b/src/assets/base.css index cec9894..0e64ea2 100644 --- a/src/assets/base.css +++ b/src/assets/base.css @@ -1,5 +1,20 @@ /* color palette from */ :root { + /* «Золотой вечер»: применяется при миграции экранов на дизайн-систему. */ + --brand-background: #111; + --brand-surface: #222; + --brand-surface-hover: #2e2e39; + --brand-text: #eee; + --brand-text-muted: #bdb8ae; + --brand-accent: #ffd43b; + --brand-accent-hover: #ffe066; + --brand-accent-pressed: #f5c518; + --brand-border: #77737f; + --brand-success: #87c99d; + --brand-info: #94bfee; + --brand-error: #f29a9a; + --brand-paper: #f4ede0; + --brand-bronze: #bfa07d; --vt-c-white: #fff; --vt-c-white-soft: #f8f8f8; --vt-c-white-mute: #f2f2f2; diff --git a/src/components/CaseBoard.vue b/src/components/CaseBoard.vue new file mode 100644 index 0000000..e318475 --- /dev/null +++ b/src/components/CaseBoard.vue @@ -0,0 +1,179 @@ + + + diff --git a/src/components/CaseFolder.vue b/src/components/CaseFolder.vue new file mode 100644 index 0000000..f2dbb26 --- /dev/null +++ b/src/components/CaseFolder.vue @@ -0,0 +1,122 @@ + + + + + diff --git a/src/components/ComponentDesignCatalog.vue b/src/components/ComponentDesignCatalog.vue new file mode 100644 index 0000000..c0e564e --- /dev/null +++ b/src/components/ComponentDesignCatalog.vue @@ -0,0 +1,480 @@ + + + diff --git a/src/components/DesignBrand.vue b/src/components/DesignBrand.vue new file mode 100644 index 0000000..3040f8f --- /dev/null +++ b/src/components/DesignBrand.vue @@ -0,0 +1,31 @@ + + + + + diff --git a/src/components/DesignSystemPage.vue b/src/components/DesignSystemPage.vue new file mode 100644 index 0000000..36e5ac7 --- /dev/null +++ b/src/components/DesignSystemPage.vue @@ -0,0 +1,93 @@ + + + + + diff --git a/src/components/DossierFooter.vue b/src/components/DossierFooter.vue new file mode 100644 index 0000000..9320478 --- /dev/null +++ b/src/components/DossierFooter.vue @@ -0,0 +1,23 @@ + + + diff --git a/src/components/GameDesignPreview.vue b/src/components/GameDesignPreview.vue new file mode 100644 index 0000000..dadb1a2 --- /dev/null +++ b/src/components/GameDesignPreview.vue @@ -0,0 +1,160 @@ + + + + + diff --git a/src/components/ObjectCover.vue b/src/components/ObjectCover.vue new file mode 100644 index 0000000..a15b062 --- /dev/null +++ b/src/components/ObjectCover.vue @@ -0,0 +1,72 @@ + + + diff --git a/src/components/SectionHeading.vue b/src/components/SectionHeading.vue new file mode 100644 index 0000000..818c8b6 --- /dev/null +++ b/src/components/SectionHeading.vue @@ -0,0 +1,32 @@ + + + diff --git a/src/components/SiteDesignPreview.vue b/src/components/SiteDesignPreview.vue new file mode 100644 index 0000000..a6a5d03 --- /dev/null +++ b/src/components/SiteDesignPreview.vue @@ -0,0 +1,647 @@ + + + + + diff --git a/src/components/SiteThemeProvider.vue b/src/components/SiteThemeProvider.vue new file mode 100644 index 0000000..0c128b8 --- /dev/null +++ b/src/components/SiteThemeProvider.vue @@ -0,0 +1,72 @@ + + + diff --git a/src/components/StatusStamp.vue b/src/components/StatusStamp.vue new file mode 100644 index 0000000..f286791 --- /dev/null +++ b/src/components/StatusStamp.vue @@ -0,0 +1,17 @@ + + + diff --git a/src/components/TextHighlight.vue b/src/components/TextHighlight.vue new file mode 100644 index 0000000..be2f2d9 --- /dev/null +++ b/src/components/TextHighlight.vue @@ -0,0 +1,21 @@ + + diff --git a/src/router/index.ts b/src/router/index.ts index ab4db0c..3a89efc 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -3,6 +3,15 @@ import { createRouter, createWebHistory } from 'vue-router' const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), routes: [ + ...(import.meta.env.DEV + ? [ + { + path: '/design-system', + name: 'design-system', + component: () => import('../views/DesignSystemView.vue'), + }, + ] + : []), { path: '/participation', name: 'participation', diff --git a/src/views/DesignSystemView.vue b/src/views/DesignSystemView.vue new file mode 100644 index 0000000..a515502 --- /dev/null +++ b/src/views/DesignSystemView.vue @@ -0,0 +1,7 @@ + + +