Component Preview
ComponentPreview — компонент для живого предпросмотра Svelte-компонентов прямо на странице документации. Показывает интерактивное демо сверху и исходный код снизу с подсветкой синтаксиса и вкладками.
Как это выглядит
Демонстрация на примере ThemeToggle — кнопки переключения тёмной/светлой темы. Вкладки показывают полный исходный код компонента и его store:
Нажмите на кнопку выше — тема переключится. Вкладки внизу показывают полный исходный код обоих файлов с подсветкой и кнопкой копирования.
Как подключить
ComponentPreview не входит в список автоимпортируемых markdown-компонентов, поэтому его нужно импортировать вручную через блок script в .svx файле.
Шаг 1: Добавить импорты
В начале .svx файла, после frontmatter, добавьте блок script с импортом ComponentPreview, самого компонента и его исходного кода через суффикс ?raw:
Импорт с суффиксом ?raw возвращает содержимое файла как строку — это и есть исходный код для вкладок. Импорт без суффикса — живой компонент для превью. Чтобы избежать проблем с source maps внутри .svx файлов, ?raw импорты вынесите в отдельный .ts модуль (например demo-sources.ts) и импортируйте оттуда.
Шаг 2: Использовать в markdown
Передайте компонент в children (между открывающим и закрывающим тегом), а исходный код — в пропс sources как массив вкладок:
Пропсы
| Пропс | Тип | Назначение |
|---|---|---|
code | string | Исходный код для отображения в панели снизу (одна вкладка) |
language | string | Язык подсветки синтаксиса (по умолчанию typescript) |
label | string | Название вкладки с кодом (по умолчанию Code) |
sources | SourceTab[] | Массив вкладок с кодом (заменяёт code) |
controls | ComponentPreviewControl[] | Массив контролов для управления пропсами компонента |
refreshOnControlChange | boolean | Перезагружать превью при изменении контролов |
refreshOnFullScreen | boolean | Перезагружать превью при переходе в полноэкранный режим |
children | Snippet | Живой превью компонента (принимает объект значений контролов) |
class | string | Дополнительные классы для области превью |
Интерактивные контролы
Пропс controls позволяет добавить панель управления пропсами компонента. Контролы связывают параметры демо с UI — пользователь может менять значения и сразу видеть результат. Значения передаются в сниппет children как объект.
Базовая структура контрола
Поддерживаемые типы
| Тип | Описание | Дополнительные поля |
|---|---|---|
boolean | Переключатель (toggle) | — |
number | Слайдер | min, max, step, unit |
text | Текстовое поле | placeholder |
color | Цветовой пикер (HSV) | placeholder |
select | Выпадающий список | options: { label, value }[] |
file | Загрузка файла | accept |
Пример контрола
Использование значений в сниппете
Значения контролов передаются в сниппет children как аргумент:
Сохранение в URL
Изменённые значения автоматически сохраняются в параметры URL. При перезагрузке страницы значения восстанавливаются. Кнопка сброса возвращает все значения к defaultValue.
Типы контролов (TypeScript)
Полноэкранный режим
Кнопка в правом верхнем углу превью разворачивает демо на весь экран. Анимация перехода использует GSAP Flip. Кнопка перезагрузки сбрасывает состояние превью.
Несколько вкладок с кодом
Если нужно показать несколько файлов, используйте пропс sources вместо code. Передайте массив объектов с полями name, code и language — каждый объект станет отдельной вкладкой. Демонстрация выше использует именно этот подход с двумя вкладками: ThemeToggle.svelte и theme.svelte.ts.
Каждый объект в массиве sources содержит:
| Поле | Тип | Назначение |
|---|---|---|
name | string | Название вкладки |
code | string | Исходный код |
language | string | Язык подсветки (по умолчанию typescript) |
Особенности
- Превью рендерится в изолированной области с прокруткой
- Код подсвечивается через Shiki (github-light / github-dark)
- Вкладки переключаются стрелками на клавиатуре (ArrowLeft / ArrowRight)
- Кнопка копирования кода в правом верхнем углу панели с кодом
- Тема превью наследует текущую тему сайта
