Сделать своей
Всё в этой части — файлы твоего сайта: палитра, стили, партиалы, строки интерфейса, второй язык. В тему при этом не попадает ни одна правка, и её обновление остаётся обычным git pull.
#Палитра — один файл
Фирменный цвет сайта — это toml-файл в data/themes/ на стороне сайта:
name = "Моя" # имя в пикере
weight = 80 # позиция в списке пикера
"bg-deep" = "#101418"
"bg-surface" = "#1a2027"
"text-primary" = "#d8dee6"Hugo мержит данные темы и сайта (при совпадении имён побеждает сайт), поэтому файл сам попадает и в CSS, и в пикер палитр в шапке. Не нужна палитра из комплекта темы — переопредели её файл с disabled = true, и она исчезнет отовсюду. Как из toml получаются CSS-блоки и свотчи — разобрано в «Палитра — это один файл».
#custom.css и хуки
Точечные правки поверх палитры — assets/css/custom.css сайта: если файл существует, тема подключает его последним в CSS-бандл, так что твои правила побеждают без !important. Дизайн-токены — публичный API: имена CSS-переменных стабильны и перечислены в docs/customizing.md темы.
Для аналитики, своих meta-тегов и сторонних скриптов есть hooks-партиалы: hooks/head-extra.html и hooks/foot-extra.html в теме пустые, сайт кладёт одноимённые файлы в свой layouts/_partials/ — и их содержимое попадает в head и в конец body. А если нужно поменять сам рендер — любой партиал темы переопределяется одноимённым файлом сайта: lookup order Hugo всегда предпочитает файлы сайта. Мелкие именованные партиалы — логотип, футер, карточка ленты — существуют ровно для такого точечного переопределения.
#Свой раздел
Понадобился раздел, которого в теме нет, — глоссарий, каталог, песочница с тренажёром. Для него не нужны ни новый layout, ни правки темы: это обычная страница или бандл, а интерактив — те же widgets.js рядом с текстом, механизм работает для любого бандла, не только для гайдов. Пункт меню добавляется в [[menus.main]] конфига; параметр params.badge = "β" у пункта рисует бейдж — это генерик-фича навигации, а не признак особого раздела.
На этом демо так собрана «Песочница»: в теме от неё нет ни следа, весь раздел — три файла на стороне сайта.
#Свои строки
Тексты интерфейса не захардкожены в шаблонах. Серверные строки живут в i18n/*.toml: сайт кладёт свой файл с частичным набором ключей, и он мержится с файлом темы — переопределяешь только нужное. Строки, живущие в JS — поповер «Вид», подсказки минимап, — переопределяются объектом window.THEME_I18N; список ключей — в docs/customizing.md.
#Второй язык
Добавление языка — аддитивный шаг, а не миграция. В конфиг дописывается блок [languages.en] (плюс [languages.en.params] для hero-строки и [languages.en.menus] для меню). Переводы — суффиксами файлов: index.en.md рядом с index.md, включая _index рубрик и серий; Hugo связывает версии сам. Переключатель языков появляется в шапке, когда языков больше одного, а Pagefind строит отдельный индекс на каждый язык по lang страницы. Правок шаблонов — ноль; пошаговый чеклист — в docs/i18n.md темы.
Инвариант всей этой части: кастомизация — это файлы твоего сайта. В каталог темы не попадает ни одна правка, поэтому обновление темы — git pull или бамп версии модуля, без ручного мержа своих изменений.
Теперь ты можешь увезти сайт сколь угодно далеко от этого демо — не форкая тему.
#Что дальше
Руководство на этом закончено: тема стоит, гайды пишутся, сайт выглядит по-своему. Если интересно, почему это устроено именно так, — в «Устройстве» есть серия «Анатомия темы»: папка-бандл, арифметика серий, палитры-как-данные. А все компоненты разом собраны на полигоне в «Справочнике».