перейти к контенту
S strelchenko blog
компоненты

57 компонентов.

Тема Rocket поставляется с 57 компонентами из библиотеки Velocity.

Х

Ханс Мартенс

время чтения 1 мин

Astro Rocket унаследовал полную библиотеку компонентов пользовательского интерфейса от Velocity от Southwell Media. Это означает, что 57 готовых к использованию компонентов доступны сразу после установки темы - никаких пакетов npm для установки, никакой дополнительной настройки. Каждый компонент уже стилизован с использованием цветовых токенов системы дизайна, поэтому они автоматически адаптируются при смене темы или включении темного режима.

Библиотека организована в три уровня: 33 примитива пользовательского интерфейса, которые образуют строительные блоки, 7 компонентов шаблонов более высокого уровня и набор компонентов структуры страницы для уровней «Герой», «Заголовок», «Нижний колонтитул», «Блог» и «SEO».


UI primitives

Эти 33 компонента охватывают все распространенные потребности пользовательского интерфейса. Они принимают варианты и размеры через свойства и разработаны с учетом доступности - навигация с помощью клавиатуры, атрибуты ARIA и управление фокусом обрабатываются автоматически.

Форма (7 компонентов)

Слой форм охватывает все стандартные типы ввода. Слой форм охватывает все стандартные типы ввода.

КомпонентКак работает
КнопкаОсновной интерактивный элемент. Поддерживает variant (brand, secondary, outline, ghost, destructive) и size (sm, md, lg). Работает как <button> или отображается как <a> при наличии href.
InputОднострочное текстовое поле ввода с поддержкой метки, вспомогательного текста и состояния ошибки..
TextareaМногострочный текстовый ввод с тем же шаблоном метки/ошибки, что и в поле ввода.
SelectСтилизованный стандартный элемент выбора с тем же шаблоном поля формы.
CheckboxAccessible checkbox with custom styling that follows the active theme.
RadioПереключатель с тем же оформлением, что и флажок.
SwitchПереключатель для включения/выключения с плавным CSS-переходом.
---
import Button from '@/components/ui/form/Button/Button.astro';
import Input from '@/components/ui/form/Input/Input.astro';
---

<Button variant="brand" size="md">Поехали</Button>
<Button variant="outline" size="md">Узнать больше</Button>

<Input label="Email address" type="email" placeholder="you@example.com" />

Data display (9 components)

КомпонентКак работает
CardКонтейнер с рамкой и закругленными углами. Используйте его для любого сгруппированного блока контента..
BadgeНебольшая встроенная метка. Поддерживает свойства variant (brand, secondary, success, warning, destructive) и pill для округлого стиля..
AvatarКруглое изображение или инициалы в качестве запасного варианта.
AvatarGroupРяд аватаров, расположенных друг над другом, для списков команд или участников..
TableСтилизованная HTML-таблица с поддержкой заголовка, основного содержимого и полосатых строк..
PaginationНавигация по страницам с кнопками «Предыдущая/Следующая» и нумерацией страниц..
ProgressГоризонтальная полоса прогресса, заполняющаяся в процентах..
SkeletonЗаполнитель загрузки, который пульсирует, повторяя форму заменяемого им контента..
GoogleMapВстраивает интерактивную карту Google через iframe. Принимает свойства address, zoom и size..
---
import Badge from '@/components/ui/data-display/Badge/Badge.astro';
import Card from '@/components/ui/data-display/Card/Card.astro';
---

<Badge variant="brand" pill>Новое</Badge>
<Badge variant="success">Активно</Badge>

<Card>
  <p>Здесь любой контент.</p>
</Card>

Feedback Обратная связь (3 components)

КомпонентКак работает
AlertВстроенное сообщение для отображения состояния «информация», «успех», «предупреждение» или «ошибка»..
ToastВременное уведомление, которое появляется в углу экрана и автоматически закрывается..
TooltipТекстовая метка, которая появляется при наведении курсора или фокусировке на любой элемент..

Overlay перекрытие(6 components)

КомпонентКак работает
AccordionСворачиваемые панели контента - любое количество элементов, но одновременно открыт только один.
DialogМодальное окно с фоном, блокировкой фокуса и закрытием с помощью клавиатуры..
DropdownFloating menu that opens below a trigger button.
TabsГоризонтальная панель вкладок, позволяющая переключаться между панелями контента..
VerticalTabsАналогично вкладкам, но со списком вкладок слева. Удобно для панелей настроек..
ConsentBannerБаннер согласия на использование файлов cookie с кнопками «Принять»/«Отклонить»..
---
import Accordion from '@/components/ui/overlay/Accordion/Accordion.astro';
---

<Accordion items={[
  { title: 'Что такое Astro Rocket??', content: 'Готовая к использованию тема оформления для Astro 6..' },
  { title: 'Это шара?', content: 'Да. Имеет лицензию MIT.' },
]} />

Layout & content (3 components)

КомпонентТак работает
IconЕдиный компонент иконок. Объединяет более 350 иконок Lucide UI и более 3000 иконок брендов Simple Icons через Iconify..
SeparatorГоризонтальная или вертикальная разделительная линия.
CodeBlockБлок кода с синтаксисной подсветкой, кнопкой копирования и языковой меткой..

Компонент Icon используется во всей теме. Вы можете ссылаться на любой значок Lucide по имени, или на любой значок бренда Simple Icons по его сокращенному названию (например, github, x-twitter, instagram) или с полным префиксом simple-icons:.

---
import Icon from '@/components/ui/primitives/Icon/Icon.astro';
---

<Icon name="arrow-right" size="sm" />
<Icon name="github" size="md" />
<Icon name="simple-icons:vercel" size="md" />

Marketing UI (5 components)

Это маркетинговые компоненты пользовательского интерфейса, отличающиеся от компонентов полнофункциональной целевой страницы, описанных ниже.

ComponentWhat it does
CTAБлок призыва к действию с заголовком, описанием и кнопкой.
LogoАвтоматически генерируемый логотип-значок - первая буква названия вашего сайта на фоне активного фирменного цвета. Обновления в режиме реального времени при переключении темы.
SocialProofОписание проекта и краткое пояснение (например, «Присоединяйтесь к более чем 2000 разработчикам»).
NpmCopyButtonКоманда npm install в один клик с иконкой копирования - полезна для страниц проектов с открытым исходным кодом..
TerminalDemoАнимированное окно терминала, отображающее последовательность команд..

Pattern components -Компоненты шаблона

Компоненты шаблонов позволяют комбинировать примитивы пользовательского интерфейса в конкретные сценарии использования в реальном мире. Они относятся к более высокому уровню и имеют более четкие требования.

ComponentWhat it does
ContactFormПолная форма обратной связи, интегрированная с Resend. Включает проверку Zod на стороне сервера и защиту от спама с помощью ловушек (honeypot).
NewsletterFormФорма для сбора адресов электронной почты, также подключенная к Resend.
StatCardКарточка для отображения метрик с крупным числом, подписью и дополнительным индикатором тренда. Используется на панели мониторинга или страницах с информацией о продукте.
EmptyStateЗаполнитель для пустых списков или результатов поиска (ноль результатов). Принимает значок, заголовок, описание и кнопку действия..
FormFieldОбщая метка + поле ввода + оболочка ошибки, используемая внутри всех компонентов формы.
SearchInputВведите текст с иконкой поиска и кнопкой очистки.
PasswordInputПоле ввода с возможностью отображения/скрытия пароля.

Компоненты структуры страницы

Эти компоненты являются фиксированными частями архитектуры сайта. Они используются один раз для каждого типа страницы и, как правило, не комбинируются с другими компонентами - они определяют страницу.

Герой - компонент Hero поддерживает два макета (centered, split) и четыре размера (sm, md, lg, xl). Весь контент героя использует именованные слоты: badge, title, description, actions и, опционально, image.

Заголовок - фиксированная верхняя панель навигации с логотипом, навигационными ссылками, панелью выбора цветового режима (выпадающее меню «Система» / «Светлая» / «Темная»), панелью выбора цветовой темы (выбор из 12 образцов) и опциональной кнопкой призыва к действию (CTA). Три варианта отображения: solid, transparent и default. Капсульный заголовок на главной странице представляет собой отдельный параметр shape="floating" - отличный от варианта. Включает индикатор выполнения прокрутки, если он включен.

Нижний колонтитул - нижняя навигация со ссылками на сайт, иконками социальных сетей и текстом об авторских правах.

Хлебные крошки - автоматически генерируются из текущего URL-адреса. Используются в верхней части записей блога и внутренних страниц.

ThemeModeDropdown / ThemeSelectorDropdown - два выпадающих списка в форме таблеток, расположенные рядом в заголовке. ThemeModeDropdown - это трехпозиционный выбор цветового режима (Системный / Светлый / Темный), основанный на localStorage; ThemeSelectorDropdown - это выбор цветовой темы с 12 вариантами, основанный на sessionStorage. Оба выпадающих списка скрываются ниже контрольной точки md и перерисовываются внутри мобильного меню - выпадающий список цветового режима остается, а выбор цветовой темы становится плоским рядом вариантов ThemeSelector. Полный дизайн смотрите в статье о цветовом режиме.

Компоненты блога - BlogCard (карточка с обложкой, тегами и временем чтения), ArticleHero (заголовок статьи во всю ширину с обложкой и метаданными), RelatedPosts (раздел из трех карточек внизу каждой статьи), ShareButtons (Twitter/X, LinkedIn, текст из буфера обмена) и BlogImageSVG (SVG-фоны фирменных цветов для обложек статей).

Разделы целевой страницы - Credibility (панель с логотипом), FeatureTabs (интерактивная витрина функций с вкладками), LighthouseScores (анимированные шкалы оценок) и TechStack (полоса с технологическими значками).

SEO - SEO (все метатеги, Open Graph, Twitter Cards), JsonLd (структурированные данные для веб-сайта, организации, публикаций в блоге, хлебных крошек, часто задаваемых вопросов) и Analytics (слот для скрипта аналитики).


Всё соответствует активной теме.

Каждый компонент использует цветовые токены CSS системы дизайна - --color-brand-500, --color-foreground, --color-background и так далее. Переключитесь с изумрудного на фиолетовый, и все кнопки, значки, индикаторы выполнения и кольца фокусировки мгновенно обновятся. Ни один компонент не имеет жестко заданного фирменного цвета.

То же самое относится и к темному режиму: все значения токенов изменяются при переключении класса dark на <html>, и каждый компонент обновляется без дополнительного кода.

Добавление собственных компонентов

Если вам нужно что-то, чего нет в библиотеке, следуйте тем же шаблонам, что и в кодовой базе, чтобы создать новые компоненты, соответствующие существующей системе.

Куда поместить

Разместите новые компоненты в соответствующем подкаталоге в src/components/:

src/components/
├── ui/
│   ├── form/          # Button, Input, Select, Checkbox, Radio, Switch, Textarea
│   ├── data-display/  # Card, Badge, Avatar, AvatarGroup, GoogleMap, Table, Pagination, Progress, Skeleton
│   ├── feedback/      # Alert, Toast, Tooltip
│   ├── overlay/       # Dialog, Dropdown, Tabs, VerticalTabs, Accordion, ConsentBanner
│   ├── layout/        # Separator
│   ├── primitives/    # Icon
│   ├── content/       # CodeBlock
│   └── marketing/     # Logo, CTA, NpmCopyButton, SocialProof, TerminalDemo
├── patterns/          # Composed patterns (ContactForm, SearchInput, etc.)
├── layout/            # Page structure (Header, Footer)
├── blog/              # Blog-specific
└── landing/           # Marketing pages

Базовая структура компонента

Типичный компонент пользовательского интерфейса определяет свои свойства в метаданных, сопоставляет варианты со строками классов и использует class:list для составления окончательного класса:`:

---
interface Props {
  variant?: 'default' | 'primary' | 'success';
  size?: 'sm' | 'md';
  class?: string;
}

const {
  variant = 'default',
  size = 'md',
  class: className = '',
} = Astro.props;

const variants = {
  default: 'bg-background-secondary text-foreground',
  primary:  'bg-primary text-primary-foreground',
  success:  'bg-success-light text-success-foreground',
};

const sizes = {
  sm: 'px-2 py-0.5 text-xs',
  md: 'px-3 py-1 text-sm',
};
---
<span
  class:list={[
    'inline-flex items-center rounded-full font-medium',
    variants[variant],
    sizes[size],
    className,
  ]}
>
  <slot />
</span>

Три правила, которым следует следовать

Используйте токены дизайна, а не жестко заданные значения. Каждый встроенный компонент использует bg-background, text-foreground, border-border и токены бренда. Если вы жестко зададите bg-white или text-gray-900, ваш компонент сломается в темном режиме и проигнорирует активную цветовую тему.

Поддерживайте именованные слоты для гибкого контента. Слоты позволяют пользователю передавать значки, действия или контент нижнего колонтитула без необходимости сообщать о них компоненту:

<FeatureCard title="Fast">
  <Icon name="zap" slot="icon" />
  Lightning быстрая сборка.
  <Button slot="footer">Узнай еще...</Button>
</FeatureCard>

Используйте React для интерактивности. Компоненты Astro отрисовываются на сервере и не имеют состояния на стороне клиента. Для всего, что требует useState, onClick или обновлений в реальном времени, создайте файл .tsx и используйте директиву client:visible при его подключении:

---
import { Counter } from '@/components/ui';
---
<Counter client:visible />

Просмотрите демонстрацию в реальном времени

Самый быстрый способ ознакомиться со всеми 57 компонентами - это демонстрация компонентов в реальном времени. Каждый компонент отображается с возможностью просмотра свойств в реальном времени:

/components

Эта демонстрация встроена в сам Astro Rocket. Все 57 компонентов отображаются там - та же разметка, те же варианты, те же свойства, которые вы будете использовать в своем собственном проекте.

Вернуться к блогу
Поделиться:

Следите за обновлениями

Будьте в курсе событий - новые статьи, идеи и обновления.