EN

заметки

6 мин чтения

claude designhugo

Как я сделал дизайн личного сайта в Claude Design и собрал его на Hugo

Основа сайта заняла три дня: дизайн-система в Claude Design, страницы на Hugo и анимации из нулей и единиц в скрипте меньше 5 КБ. Показываю каждый шаг и почему выбрал так.

содержание

Что получилось

Так выглядит главная на десктопе. Тёмная тема включается по настройке системы, переключателя нет. Если она включена у вас, картинка ниже тоже тёмная.

Главная на десктопе: имя, планета из цифр с кольцом, орбиты от знака в шапке и звёзды на небе

А так главная выглядит на телефоне в обеих темах. Каждый экран сначала делается на ширину 390 пикселей и только потом на десктоп.

Главная на телефоне в светлой и тёмной теме: имя, планета из цифр рядом с ним и строки разделов

Образ собран из градиента и цифр 0 и 1

В основе образа две детали: градиент от синего через фиолетовый к розовому, как у пиксельного баннера в терминале, и анимация цифр 0 и 1. Сначала они жили только в мелочах, а в одно целое их связал космос, и сложился он на третий день. Знак сайта — слово torbek и квадрат-курсор справа.

Космос сделан из тех же деталей. Курсор стал солнцем, цифры 0 и 1 звёздами, а звезда мерцает, когда переворачивается её бит. Космос собран из того, что на сайте уже есть, и новых картинок не нужно. Фотографий, иконок и логотипа на сайте нет, стрелки набраны шрифтом.

Дизайн-система появилась раньше страниц

Первой в Claude Design появилась дизайн-система «Торбек» с токенами цвета, шрифтов и отступов, компонентами и принципами. Рядом лежит холст с макетами: главная в двух темах, список заметок, заметка, разделы, десктоп.

Токены дизайн-системы: цвета светлой и тёмной темы с контрастом к фону, шрифты от имени до подписи и размеры сетки

CSS сайта начинается с тех же токенов, а классы называются как компоненты в дизайн-системе:

/* Токены дизайн-системы «Торбек» (tokens.json, версия 4) */
:root {
  --paper: #f7f7f9;
  --ink: #14141a;
  --grad-blue: #2563eb;
  --grad-violet: #6d4ae0;
  --grad-pink: #c8287a;
  --sec-notes: #9a39ad;
}

Страница не придумывает свои цвета и отступы, и вёрстку можно положить рядом с превью компонента и сравнить.

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

Разделы стали точками градиента

Разделов пять: обо мне, работа, проекты, заметки, факты. Каждый занимает свою точку градиента, от синего «обо мне» до розовых «фактов». Цвет раздела получают квадрат в строке навигации, курсор знака на странице раздела, метка над заголовком и стрелка под курсором.

Доска из Claude Design: пять разделов в точках градиента и курсор знака на странице раздела в светлой и тёмной теме

Порядок разделов задан одной строкой в конфиге Hugo:

sections = ["about", "work", "projects", "notes", "facts"]

Порядок и есть точки градиента, поэтому он живёт в конфиге: правка одного файла с текстом не должна его сдвигать. Раздел появляется на сайте, когда опубликована его страница, а заметки вместе с первой заметкой. Поэтому сейчас открыты проекты, заметки и факты. «Обо мне» и «работа» ждут текстов.

Двигаются только цифры

Главное правило дизайна такое: двигается только то, что сделано из 0 и 1, а страницы для чтения стоят спокойно. При «уменьшить движение» в настройках системы всё стоит, и петли в этой заметке тоже.

Ссылка в одну строку под курсором на 420 миллисекунд рассыпается в случайные цифры и проявляется слева направо. Цифры лежат отдельным слоем поверх настоящего слова, поэтому вёрстка не сдвигается ни на пиксель. Скринридер читает само слово.

Строки разделов на главной: под курсором каждое слово рассыпается в цифры и собирается слева направо

Раскадровка эффекта на строке «заметки»: покой, 0, 140, 280 и 420 миллисекунд после наведения

На телефоне наведения нет, а нажатие не должно ждать анимацию. Поэтому там метки разделов проявляются один раз, когда доезжают до экрана, а имя при первом заходе.

Планета из цифр крутится на главной рядом с именем: материки из единиц, море из нулей, оборот за минуту. Под курсором она рассыпается, как ссылки, и собирается за 650 миллисекунд. Кольцо набрано словом torbek в двоичном коде.

Планета из цифр с кольцом: под курсором рассыпается в случайные биты и собирается обратно

Почему canvas: в планете на десктопе около 400 цифр, и кадр меняется раз в 85 миллисекунд, как в терминале. Отдельный элемент страницы на каждую цифру дал бы тысячи изменений стилей в секунду, а WebGL потянул бы библиотеку ради двумерных цифр. Анимация стоит, когда планета ушла с экрана или вкладка скрыта.

Раз за визит по небу главной пролетает комета: хвост из семи цифр, яркий в голове и гаснущий к концу.

Комета из семи цифр пролетает по небу главной под шапкой и гаснет

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

На странице 404 кольцо набрано числом 110010100, это 404 в двоичной системе. Планета будто сошла с орбиты, а сама система осталась маленькой и далёкой в углу неба.

Страница 404: планета с кольцом из числа 404 в двоичном коде рассыпается под курсором, в углу неба далёкая система разделов

Созвездие заметок собирает Hugo

Заметки становятся звёздами. Слева направо идёт время, старые звёзды синие, новые розовые, а по размеру видно, сколько заметку читать. Под курсором звезда показывает заметку и линиями связывает её с заметками тех же тем. В конце заметки над похожими виден маленький кусок созвездия, где она отмечена курсором.

Так раздел будет выглядеть, когда заметок станет много. На записи после этой заметки идут заглушки, как в макете, на сайте их нет.

Раздел заметок, когда их много: созвездие из 24 звёзд, подсказка звезды под курсором, переход в заметку и маленькое созвездие похожих заметок в её конце

На десктопе темы собраны колонкой справа, и под курсором тема заранее показывает своё созвездие.

Раздел заметок на десктопе: созвездие из 24 звёзд и колонка тем справа с числом заметок в каждой

Почему Hugo: созвездие видно и без JavaScript, а скрипт добавляет только подсказку и мерцание пыли. Звёзды сделаны элементами страницы с координатами в процентах, линии нарисованы растянутым SVG толщиной в пиксель.

Один SVG на всё не подошёл: растянутый превращает квадраты звёзд в прямоугольники, а с сохранением пропорций сжимает подписи на телефоне до 6 пикселей. Линии темы складываются в кратчайшее дерево. Считает его сам шаблон при сборке.

Полосу планет на «проектах» Hugo собирает так же. Солнечная система появилась через два дня после космоса. Там знак станет солнцем, проекты планетами, и ближе к солнцу будет то, что сейчас в работе. Проектов на сайте пока нет, поэтому нет и полосы.

Hugo, скрипт меньше 5 КБ и проверка перед публикацией

Скрипт один и без библиотек: эффект 0/1, кнопка «скопировать ссылку», небо, планета, орбиты главной, подсказки созвездия и планет на «проектах». Второй файл только для главной сэкономил бы на страницах для чтения меньше килобайта. Предел 5 КБ в сжатом виде проверяет тест, и сейчас из 5120 байт свободно 45.

Hugo я выбрал после сравнения с Astro, Eleventy, Zola и чистым HTML. У него один исполняемый файл без дерева npm-пакетов, и в нём уже есть два языка, RSS и sitemap. Astro для сайта без интерактива избыточен, а на чистом HTML русскую и английскую версии пришлось бы вести руками. Версия Hugo закреплена, и проверка падает, если установлена другая.

Шрифты Golos Text и JetBrains Mono лежат на сайте файлами. Страница не ходит ни на Google Fonts, ни на другие чужие домены и не зависит от того, открывается ли сторонний сервис у читателя.

Сайт читают и машины. На «фактах» короткая справка с датой проверки для людей, поисковиков и языковых моделей, у каждой заметки есть версия в Markdown, у сайта есть llms.txt. Markdown открывается отдельным адресом рядом со страницей: так он работает на любом хостинге и виден человеку.

Перед каждой публикацией Playwright проверяет собранный сайт на телефоне и десктопе в обеих темах: от 320 до 1280 пикселей нет горизонтальной прокрутки, контраст не ниже 4.5:1, кольцо фокуса видно на каждой ссылке главной. Запускается всё одной командой:

npm run check

Если проверка падает, сайт не обновляется.

Каждое изменение идёт через OpenSpec

Порядок всегда один. Если меняется вид сайта, сначала идут макеты в Claude Design. Потом изменение в OpenSpec: предложение, дизайн с решениями, спеки и задачи. Код появляется только после них.

openspec/changes/site-system/
  proposal.md   что меняем и зачем
  design.md     решения и почему они такие
  specs/        что сайт должен делать
  tasks.md      задачи

Изменение начинается с /opsx:propose, выполняется /opsx:apply и уходит в архив /opsx:archive. Решения и их причины остаются в репозитории рядом с кодом. Почти все «почему» выше взяты из таких файлов, остальные из дизайн-системы.