Система компонентов с темами · Новый ресурс

Система дизайна Chakra UI.

Справочник по Chakra UI v3: токены, семантические роли цветов, рецепты и составные компоненты форм. Изучите реальные шкалы отступов и типографики, а затем попробуйте встроенную форму профиля рабочего пространства с валидацией, имитацией ошибки сохранения и светлым и тёмным оформлением.

Руководство OpenDesign9 глав47 справочных записейАвторское руководство по приложению
01

Предварительный просмотр интерфейса системы дизайна Chakra UI

Проверьте валидацию пустого поля, имитацию ошибки сохранения, сохранение введённых данных, успешное локальное подтверждение и переключение оформления.

Профиль рабочего пространства на нативных компонентах ChakraОткрыть полный пример
Нативный Chakra UI 3.37.0 с React 19; автономный пакет. Пользовательские семантические токены и рецепты приложения приведены полностью. · Справочник по реализации
02

Справочник по системе дизайна Chakra UI

Справочные материалы по теме по умолчанию Chakra UI 3.37.0 и явно обозначенные токены приложения OpenDesign. Значения в rem зависят от размера корневого шрифта; эквиваленты в пикселях рассчитаны для 16px. Это избранный практический справочник, а не полная экспортированная тема.

Семантические цвета по умолчанию

Источник
Название / правилоЗначение / конфигурацияПрименение
bgwhite / blackФон страницы для светлой и тёмной темы.
bg.panelwhite / gray.950Поверхность карточки для светлой и тёмной темы.
bg.subtlegray.50 / gray.950Ненавязчивая поверхность.
fgblack / gray.50Основной текст.
fg.mutedgray.600 / gray.400Вспомогательный текст.
bordergray.200 / gray.800Граница панели и элемента управления.
fg.errorred.500 / red.400Текст ошибки.
bg.errorred.50 / red.950Поверхность ошибки.
teal.fgteal.700 / teal.300Текст на ненавязчивой бирюзовой поверхности.
teal.subtleteal.100 / teal.900Оформление текущего шага.

Исходные значения, используемые в этом примере

Источник
Название / правилоЗначение / конфигурацияПрименение
gray.50#fafafa Светлый фон.
gray.200#e4e4e7 Светлая граница.
gray.800#27272a Тёмная граница.
gray.950#111111 Тёмный фон.
teal.700#0c5d56 Это значение используется пользовательским действием для светлой темы.
teal.300#5eead4 Это значение используется пользовательским действием для тёмной темы.

Подмножество стандартных интервалов

Источник
Название / правилоЗначение / конфигурацияПрименение
spacing.10.25rem / 4pxВертикальные внутренние отступы статуса.
spacing.20.5rem / 8pxИнтервал между элементами управления в строке.
spacing.30.75rem / 12pxИнтервал между действиями в группе.
spacing.41rem / 16pxВнутренние отступы на узком экране.
spacing.61.5rem / 24pxРасстояние между полями формы.
spacing.82rem / 32pxБольшой интервал в макете.
spacing.102.5rem / 40pxДоступный увеличенный интервал.
spacing.123rem / 48pxДоступный интервал между разделами.

Подмножество стандартной типографики

Источник
Название / правилоЗначение / конфигурацияПрименение
fonts.body / fonts.headingInter, system fallbacksТокен шрифта сам по себе не загружает Inter.
fontSizes.xs0.75remАннотация образца.
fontSizes.sm0.875remВспомогательный текст.
fontSizes.md1remПоля ввода и обычный текст для чтения.
fontSizes.lg1.125remДоступен увеличенный размер основного текста.
fontSizes.xl1.25remЗаголовок карточки.
fontSizes.2xl1.5remЗаголовок образца.
fontWeights.medium / semibold500 / 600Иерархия подписей.
lineHeights.shorter / moderate1.25 / 1.5Ритм заголовков и абзацев.
letterSpacings.wide0.025emНебольшой надзаголовок.

Стандартные радиусы

Источник
Название / правилоЗначение / конфигурацияПрименение
radii.sm0.25rem / 4pxОстрый край.
radii.md0.375rem / 6pxМетка статуса в этом примере.
radii.lg0.5rem / 8pxУмеренное скругление.
radii.xl0.75rem / 12pxКарточка профиля в этом примере.
radii.full9999pxФорма таблетки; в форме не используется.

Стандартные адаптивные пороги

Источник
Название / правилоЗначение / конфигурацияПрименение
sm480pxСтроку действий можно расположить горизонтально.
md768pxКолонка прогресса размещается рядом с формой.
lg1024pxДоступный порог для широкого макета.
xl1280pxДоступный порог для настольных устройств.
2xl1536pxДоступный порог для сверхширокого макета.

Семантические токены приложения: определены ниже

Источник
Название / правилоЗначение / конфигурацияПрименение
workspace.canvasgray.50 / gray.950Пользовательское сопоставление фона для светлой и тёмной тем.
workspace.actionbrand.700 / brand.300Пользовательский фон действия; базовые цвета бренда объявлены в theme.js.
workspace.onActionwhite / gray.950Пользовательский цвет текста действия, сочетающийся с его фоном.
03

Полное руководство по системе дизайна Chakra UI

Практическое руководство по выбору, применению и оценке этой системы для реального интерфейса.

DESIGN-chakra-ui.md

Подробные рекомендации, отправная точка для реализации и ссылки на источники.

Скачать руководство

Система дизайна Chakra UI: система v3 — конфигурация, токены и компоненты

Создайте систему вместо передачи устаревшего объекта темы

Реализация состоит из трёх уровней: theme.js задаёт решения по дизайну, main.jsx предоставляет полученную систему, а App.jsx собирает форму. createSystem(defaultConfig, config) сохраняет стандартные рецепты компонентов и объединяет их с конфигурацией приложения. Для полностью самостоятельной пользовательской системы потребовалось бы описать больше параметров; здесь намеренно расширяются настройки по умолчанию.

Из этого руководства OpenDesign

В предварительном просмотре используются компоненты Chakra, а не нарисованные имитации. Боковая панель — созданный для приложения упорядоченный список шагов, а не утверждение, что используется компонент Chakra Steps. Карточка профиля, поля, список выбора, уведомления и кнопки собраны из нативных компонентов Chakra.

Прочитать вспомогательную спецификацию

Что входит в каждый уровень

  • tokens: повторно используемые исходные значения, включая два фирменных цвета из примера.
  • semanticTokens: роли с учётом условий, например workspace.action, не зависящие от отдельных экранов.
  • recipes: варианты компонентов для повторного использования; состояние React приложения определяет, является ли форма недействительной, ожидающей, завершившейся ошибкой или подтверждённой.

Система дизайна Chakra UI: исходные цвета и семантические роли темы

Используйте роли, когда оформление меняется

bg.panel и fg.muted обозначают назначение поверхности и текста; исходные значения — gray.950 и gray.400. В справочной таблице показано, как они разрешаются для светлой и тёмной темы. В демонстрации переключение корневого элемента документа между светлой и тёмной темами активирует соответствующие условные значения без изменения каждого Field или Card. Этот локальный переключатель намеренно не сохраняет настройки и не учитывает системные предпочтения.

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

Прочитать вспомогательную спецификацию

Синтаксис ссылок отличается от сокращённой записи компонентов

В определениях токенов используйте полную ссылку {colors.gray.950}. В свойстве стиля bg="workspace.canvas" разрешается в рамках категории цветов. В составном значении CSS снова требуется полный путь к токену. Это различие не позволяет принять обычную строку за ссылку на тему.

jsx
<Box bg="workspace.canvas" color="fg" border="1px solid {colors.gray.200}" p="4" />

Справочник по коду

Система дизайна Chakra UI: удобная для чтения шкала размеров с явно заданными токенами

Адаптируйте шкалу под эту композицию

Для заголовка страницы заданы fontSize="2xl" и lineHeight="shorter", для заголовка карточки — xl, для вспомогательного текста — sm, а для аннотации образца — xs. Так создаётся визуальная иерархия без изменения семантических уровней заголовков: заголовок страницы — h1, а заголовок формы — h2. Обычный текст формы сохраняет размер по умолчанию.

В стандартном стеке шрифтов Chakra для основного текста и заголовков первым указан Inter, за которым следуют системные шрифты. Автономная демонстрация не загружает шрифты извне, поэтому отображаемый запасной шрифт может различаться в зависимости от операционной системы. Если нужна точная типографика, разместите локально шрифт с подходящей лицензией: одного задания токена шрифта недостаточно для загрузки файлов шрифтов.

Прочитать вспомогательную спецификацию

Разделяйте типографику и смысл

Метка текущего шага — компактная дополнительная информация, а не основная инструкция. Сообщения об обязательном поле и ошибке остаются рядом с полем и набраны читаемым размером. Изменение межбуквенного интервала надзаголовка не затрагивает подписи полей, а длинное название рабочего пространства помещается внутри поля ввода, не меняя ширину окружающей карточки.

Система дизайна Chakra UI: компоненты Field, NativeSelect, Card и Alert

Field — это группа связанных элементов, а не стилизованное поле ввода

Field.Root объединяет подпись, элемент управления, вспомогательный текст и сообщение об ошибке. Обязательность поля обозначают флаг required и RequiredIndicator; параметр invalid задаёт состояние ошибки. В примере значение поля контролируется через React, а сообщение об ошибке для названия рабочего пространства помещено в Field.ErrorText. Стили ошибки не задаются отдельно для несвязанного с полем абзаца.

Для размера команды используются NativeSelect.Root, NativeSelect.Field и NativeSelect.Indicator. Это сохраняет нативное поведение списка выбора для короткого фиксированного набора вариантов. Компонент не имитирует поиск по удалённым результатам: для этого потребовались бы другой элемент управления и иной сценарий взаимодействия с данными.

Прочитать вспомогательную спецификацию

Для обратной связи используется отдельная композиция

Прочитать вспомогательную спецификацию

Система дизайна Chakra UI: используйте токены интервалов и адаптивные свойства стилей

Конкретная политика отступов

Используйте gap="6" между группами полей, gap="3" между действиями и gap="8" между колонкой прогресса и формой. При md значение страницы меняется с p="4" на p="8". При корневом размере шрифта 16px этим значениям соответствуют 24px, 12px, 32px, 16px и 32px. Значения в rem масштабируются вместе с корневым размером шрифта пользователя.

Для карточки используется rounded="xl", а для чипа статуса — rounded="md". Разница в радиусах намеренная: у большого контейнера и компактной метки разная геометрия. Не воспринимайте эти варианты использования как правила по умолчанию для всех приложений Chakra.

Прочитать вспомогательную спецификацию

Измените композицию при md

Ниже md сетка состоит из одной колонки, а начиная с md рядом с гибкой формой располагается колонка прогресса шириной 220px. minmax(0, 1fr) позволяет форме сжиматься внутри сетки. При sm меняется расположение действий. Эти значения объектов — переопределения в подходе mobile-first, а не определение типа устройства.

jsx
<Grid templateColumns={{ base: "1fr", md: "220px minmax(0, 1fr)" }} gap="8">
  <Box as="nav" aria-label="Setup progress">…</Box>
  <Card.Root rounded="xl">…</Card.Root>
</Grid>

Справочник по коду

Дизайн-система Chakra UI: объедините проверку, загрузку и восстановление

Конечный автомат состояний предпросмотра

Если отправить пустое имя после удаления пробелов по краям, задаётся состояние invalid и фокус переходит на поле ввода. При отправке корректного значения форма переходит в состояние pending, редактирование блокируется, а кнопка показывает Button loadingText. По окончании локального таймера флажок ошибки определяет, будет ли показан результат failed или complete. Ни одна из веток не отправляет сетевой запрос и не сохраняет данные.

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

Прочитать вспомогательную спецификацию

Проверьте состояния по порядку

  1. Сбросьте форму и отправьте её без имени; проверьте сообщение поля и фокус на поле ввода.
  2. Введите имя, включите имитацию ошибки при сохранении и отправьте форму; убедитесь, что после ошибки значения не сбрасываются.
  3. Отключите имитацию ошибки и отправьте форму ещё раз; проверьте подтверждённое резюме, а затем измените оформление.

Дизайн-система Chakra UI: сохраняйте нативную семантику при композиции

Проверка и прогресс должны оставаться понятными

В форме используется noValidate, чтобы этот пример показывал пользовательский сценарий ошибки Field, а не останавливался на интерфейсе встроенной проверки браузера. Метка остаётся связанной с полем через Field, а фокус при первой ошибке перемещается на соответствующее поле ввода. О ходе обработки сообщает область с динамическим статусом; одного индикатора загрузки недостаточно.

Для списка прогресса используется семантика упорядоченного списка, а активный пункт помечен атрибутом aria-current="step". Здесь нет фиктивных ссылок на недоступные экраны. Второй и третий шаги предпросмотра описывают контекст, но по ним нельзя перейти. Так становится заметно ограничение демонстрации.

Прочитать вспомогательную спецификацию

Фокус — часть пользовательского рецепта действия

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

Дизайн-система Chakra UI: рецепты, настройка провайдера и границы версий

Расширьте Button; определите Status локально

Вариант Button для онбординга добавляется в theme.recipes.button. Существующие варианты, например outline, остаются доступны, поскольку конфигурация расширяет defaultConfig. Для чипа статуса локально используются defineRecipe и useRecipe: варианты состояний связывают current, complete и waiting с разными семантическими ролями. Это компонент приложения, а не экспорт Chakra.

Рецепт для одного элемента возвращает один объект стилей. Составные компоненты, например Field, содержат несколько слотов; если их части оформляются вместе, нужны рецепты слотов. Рецепт для кнопки не позволит отдельно управлять меткой, полем управления и сообщением об ошибке в Field.

Прочитать вспомогательную спецификацию

Используйте предоставленные файлы вместе

Не импортируйте конфигурацию v2 с extendTheme и не передавайте theme={...} этому провайдеру v3. В корневом компоненте используется ChakraProvider value={system}. В примере намеренно не добавлен второй провайдер цветового режима: локального переключения классов light/dark достаточно для изолированного предпросмотра, а реальному приложению может понадобиться сохранять предпочтение и поддерживать серверный рендеринг.

Прочитать вспомогательную спецификацию

Дизайн-система Chakra UI: проверьте тему и форму вместе

Что демонстрирует этот пример

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

Сравните справочную таблицу с вычисленным интерфейсом. Пользовательское действие бирюзового цвета должно отличаться от стандартного действия с вариантом outline; между полями должен быть отступ 6; ниже md сетка должна переходить в одну колонку. Эти проверки связывают описанные правила с отображаемым результатом.

Что не входит в этот пример

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

Примеры компонентов дизайн-системы Chakra UI

theme.js — примитивные токены, семантические роли и рецепты

Полная тема приложения для этого примера. Роли workspace и вариант для онбординга добавлены специально; defaultConfig предоставляет стандартную тему Chakra.

javascript
import { createSystem, defaultConfig, defineConfig, defineRecipe } from '@chakra-ui/react';

export const statusRecipe = defineRecipe({
  base: { display: 'inline-flex', px: '2', py: '1', rounded: 'md', fontSize: 'xs', fontWeight: 'semibold' },
  variants: {
    state: {
      current: { bg: 'teal.subtle', color: 'teal.fg' },
      complete: { bg: 'bg.success', color: 'fg.success' },
      waiting: { bg: 'bg.muted', color: 'fg.muted' },
    },
  },
  defaultVariants: { state: 'waiting' },
});

const config = defineConfig({
  theme: {
    tokens: { colors: { brand: { 700: { value: '#0c5d56' }, 300: { value: '#5eead4' } } } },
    semanticTokens: { colors: {
      'workspace.canvas': { value: { base: '{colors.gray.50}', _dark: '{colors.gray.950}' } },
      'workspace.action': { value: { base: '{colors.brand.700}', _dark: '{colors.brand.300}' } },
      'workspace.onAction': { value: { base: '{colors.white}', _dark: '{colors.gray.950}' } },
    } },
    recipes: {
      button: defineRecipe({ variants: { variant: {
        onboarding: {
          bg: 'workspace.action', color: 'workspace.onAction',
          _hover: { opacity: 0.9 },
          _focusVisible: { outline: '2px solid', outlineColor: 'workspace.action', outlineOffset: '2px' },
        },
      } } }),
    },
  },
});
export const system = createSystem(defaultConfig, config);

Справочник по коду

  • Значения бренда намеренно соответствуют указанным примитивам бирюзового цвета.
  • Рецепт статуса локальный; вариант Button зарегистрирован в системе.

App.jsx — пример нативной формы и её состояний

Фактическая композиция React, используемая в предпросмотре. Включает переключение темы, проверку Field, нативный список выбора, обратную связь при обработке, имитацию ошибки, подтверждение и сброс.

jsx
import React, { useEffect, useRef, useState } from 'react';
import { Box, Button, Card, Field, Grid, Heading, Input, NativeSelect, Stack, Text, Alert, chakra, useRecipe } from '@chakra-ui/react';
import { statusRecipe } from './theme';

function Status({ state, children }) {
  const recipe = useRecipe({ recipe: statusRecipe });
  return <chakra.span css={recipe({ state })}>{children}</chakra.span>;
}

export default function App() {
  const [dark, setDark] = useState(false);
  useEffect(() => { document.documentElement.className = dark ? 'dark' : 'light'; }, [dark]);
  const [name, setName] = useState('Northstar Studio');
  const [size, setSize] = useState('2–10');
  const [invalid, setInvalid] = useState(false);
  const [phase, setPhase] = useState('editing');
  const [simulateFailure, setSimulateFailure] = useState(false);
  const nameInput = useRef(null);
  const pending = phase === 'pending';
  const complete = phase === 'complete';
  const save = (event) => {
    event.preventDefault();
    if (!name.trim()) { setInvalid(true); nameInput.current?.focus(); return; }
    setInvalid(false); setPhase('pending');
    window.setTimeout(() => setPhase(simulateFailure ? 'failed' : 'complete'), 600);
  };
  return <Box className={dark ? 'dark' : 'light'} bg='workspace.canvas' color='fg' p={{ base: '4', md: '8' }}>
    <Box maxW='960px' mx='auto'>
      <Stack direction={{ base: 'column', sm: 'row' }} justify='space-between' align={{ base: 'stretch', sm: 'center' }} gap='4' mb='8'>
        <Box><Text fontSize='xs' fontWeight='semibold' color='teal.fg' letterSpacing='wide'>CHAKRA UI · NATIVE SPECIMEN</Text><Heading as='h1' fontSize='2xl' lineHeight='shorter' mt='2'>Set up your workspace</Heading></Box>
        <Button variant='outline' size='sm' onClick={() => setDark(!dark)} aria-pressed={dark}> {dark ? 'Light appearance' : 'Dark appearance'} </Button>
      </Stack>
      <Grid templateColumns={{ base: '1fr', md: '220px minmax(0, 1fr)' }} gap='8'>
        <Box as='nav' aria-label='Setup progress'>
          <Stack as='ol' gap='6' listStyleType='none' m='0' p='0'>
            <Box as='li' aria-current={complete ? undefined : 'step'}><Status state={complete ? 'complete' : 'current'}>{complete ? 'Complete' : 'Current'}</Status><Text fontWeight='semibold' mt='2'>1. Workspace profile</Text><Text fontSize='sm' color='fg.muted'>Name and team size</Text></Box>
            <Box as='li'><Status state='waiting'>Next</Status><Text fontWeight='medium' mt='2'>2. Invite your team</Text><Text fontSize='sm' color='fg.muted'>Available in the full product</Text></Box>
            <Box as='li'><Status state='waiting'>Optional</Status><Text fontWeight='medium' mt='2'>3. Connect tools</Text><Text fontSize='sm' color='fg.muted'>Complete this later</Text></Box>
          </Stack>
          <Box mt='8' borderTopWidth='1px' borderColor='border' pt='4'><Text fontSize='xs' color='fg.muted'>Scale in this specimen</Text><Text fontSize='sm' mt='2'>Field gap 6 · Card padding 6<br/>Page gap 8 · Radius xl</Text></Box>
        </Box>
        <Card.Root bg='bg.panel' borderColor='border' rounded='xl'>
          <Card.Header><Heading as='h2' fontSize='xl'>Workspace profile</Heading><Text color='fg.muted' fontSize='sm'>The name appears on your team's workspace.</Text></Card.Header>
          <Card.Body>
            <form onSubmit={save} noValidate>
              <Stack gap='6'>
                <Field.Root required invalid={invalid} disabled={pending || complete}>
                  <Field.Label>Workspace name <Field.RequiredIndicator /></Field.Label>
                  <Input ref={nameInput} value={name} onChange={e => {setName(e.target.value);setInvalid(false);}} autoComplete='organization' />
                  <Field.HelperText>Use a name your teammates will recognize.</Field.HelperText>
                  <Field.ErrorText>Enter a workspace name.</Field.ErrorText>
                </Field.Root>
                <Field.Root disabled={pending || complete}>
                  <Field.Label>Team size</Field.Label>
                  <NativeSelect.Root><NativeSelect.Field value={size} onChange={e => setSize(e.target.value)}><option>Just me</option><option>2–10</option><option>11–50</option><option>51+</option></NativeSelect.Field><NativeSelect.Indicator /></NativeSelect.Root>
                  <Field.HelperText>Used only for this local preview summary.</Field.HelperText>
                </Field.Root>
                <Box><label style={{display:'flex',gap:'8px',alignItems:'center',fontSize:'14px'}}><input type='checkbox' checked={simulateFailure} disabled={pending || complete} onChange={e=>setSimulateFailure(e.target.checked)} />Simulate a failed save</label></Box>
                {phase === 'failed' && <Alert.Root status='error'><Alert.Indicator /><Alert.Content><Alert.Title>Demo save failed</Alert.Title><Alert.Description>Your values are still here. Turn off failure simulation and retry.</Alert.Description></Alert.Content></Alert.Root>}
                {complete && <Alert.Root status='success'><Alert.Indicator /><Alert.Content><Alert.Title>Profile confirmed in this preview</Alert.Title><Alert.Description>{name.trim()} · {size} people. Nothing was sent or stored.</Alert.Description></Alert.Content></Alert.Root>}
                <Stack direction={{base:'column',sm:'row'}} gap='3'>
                  <Button type='submit' variant='onboarding' loading={pending} loadingText='Checking profile' disabled={complete}>Confirm profile</Button>
                  <Button type='button' variant='outline' disabled={pending} onClick={()=>{setPhase('editing');setInvalid(false);setName('');setSize('2–10');setSimulateFailure(false);nameInput.current?.focus();}}>Reset example</Button>
                </Stack>
                <Text role='status' aria-live='polite' fontSize='sm' color='fg.muted'>{pending ? 'Simulating a response. No network request is made.' : complete ? 'Profile step complete. Reset to try another state.' : 'Try an empty name, a failed save, or a different appearance.'}</Text>
              </Stack>
            </form>
          </Card.Body>
        </Card.Root>
      </Grid>
      <Text mt='6' fontSize='xs' color='fg.muted'>Actual Chakra UI 3.37.0 components. Custom workspace semantic tokens and button recipe. Memory-only demonstration.</Text>
    </Box>
  </Box>;
}

Справочник по коду

  • Запрос не отправляется; задержка 600ms демонстрирует интерфейс состояния pending.
  • Следующие шаги — контекстные метки, а не работающая навигация.
04

Настройка агента дизайн-системы Chakra UI

Отправная точка для реализации

Используйте версию Node.js, поддерживаемую установленным выпуском Vite и Chakra (в документации Chakra указана Node 20 или новее). В этом блоке команды терминала отделены от src/main.jsx. Полные файлы темы и App приведены выше; никаких скрытых фрагментов кода провайдера или внешнего CSS не требуется.

текст
# Terminal: create a JavaScript React application
npm create vite@latest chakra-profile -- --template react
cd chakra-profile
npm install
npm install @chakra-ui/[email protected] @emotion/react

# Save the two complete examples as src/theme.js and src/App.jsx.
# Replace src/main.jsx with:
import React from 'react';
import { createRoot } from 'react-dom/client';
import { ChakraProvider } from '@chakra-ui/react';
import { system } from './theme';
import App from './App';
createRoot(document.getElementById('root')).render(<ChakraProvider value={system}><App /></ChakraProvider>);

# Start from the project directory:
npm run dev

Запрос для вашего проекта

Промпт для AI-агента
Используйте Chakra UI 3.37.0, а в качестве основы — предоставленные theme.js и App.jsx. Сохраните семантические роли workspace, композицию Field, нативный список выбора и различие между некорректным вводом и ошибкой отправки. Замените только имитацию таймера на фактический процесс сохранения API; не отмечайте профиль завершённым до подтверждения результата. Сохраните фокус клавиатуры, адаптивную раскладку base/md и значения для светлого и тёмного оформления. Объясните все новые токены и варианты рецептов.
05

Дизайн-система Chakra UI: источники и область применения

Оригинальное руководство по реализации OpenDesign на основе документированных принципов Chakra UI v3. Ссылки на стандартные токены отделены от специфичных для приложения ролей workspace. Нативный предпросмотр демонстрирует локальные состояния; он не сохраняет данные workspace и не реализует весь сценарий онбординга.