openspec: архив changes series-taxonomy-and-header, archive-by-year-month, deploy-sftp-incremental (2026-09-25)
deploy-dedinit / Build & SFTP Deploy (push) Successful in 7m13s

This commit is contained in:
2026-09-25 08:31:28 +00:00
parent 92b7094fc7
commit 800f93a22f
16 changed files with 97 additions and 4 deletions
@@ -0,0 +1,50 @@
# Design: Серии постов, переключатель темы справа, соцсети в меню
## Constraints
- Тема `rDedInit` (форк PaperMod) НЕ модифицируется. Все правки — через
штатные хуки: корневой `layouts/partials/extend_footer.html` (JS-инжект),
корневой `layouts/partials/extend_head.html` (CSS), `assets/css/extended/`,
`hugo.toml`.
- OpenSpec: change создаётся до правок.
## 1. Таксономия series
- `hugo.toml`: `[taxonomies] series = "series"` (в дополнение к
`category`/`tag`).
- Новый партиал `layouts/partials/series_nav.html`:
- принимает страницу, читает `.Params.series` (массив) и `.Params.series_order`;
- для первой серии берёт `site.Taxonomies.series` → term → `.Pages`,
сортирует по `series_order`, ищет текущий, выводит блок:
«Серия: НАЗВАНИЕ · № текущий из N» + ссылки «← Пред.» / «След. →»;
- если параметров нет — не выводит ничего.
- Подключение: в корневом `layouts/_default/single.html` (override с
`{{- define "main" }}`? НЕТ — переопределять весь single.html опасно).
Вместо этого: тот же подход, что у PaperMod — вывод БЛОКА серии в начале
`.post-content`. В rDedInit single.html НЕ имеет content-хука. Безопасный
вариант — **JS-инжект невозможен для контента**, поэтому навешиваем через
partial в `single.html`... но это правка темы!
Обход: PaperMod'ы имеют `layouts/partials/extend_head.html` и
`extend_footer.html`, но для контента single.html нет хука. Классический
PaperMod-приём: **`assets/scss/extended/` + margin**, нет.
Реально: тема rDedInit НЕ поддерживает серии. Добавить можно только:
(а) форкнуть single.html в корневой `layouts/_default/single.html`
(переопределение — штатный механизм Hugo, тема не трогается), и вставить
`{{- partial "series_nav.html" . -}}` перед `.post-content`.
Это переопределение будет жить в репозитории сайта и переживёт апдейты темы
(требует ручного обновления при изменении темы — приемлемо, тема
статична).
Решение: **переопределить `layouts/_default/single.html`** в корне сайта,
скопировав из темы (65 строк) и добавив `{{- partial "series_nav.html" . }}`.
## 2. Переключатель темы справа
- `layouts/partials/extend_footer.html` (уже есть) — добавить JS:
```js
const nav = document.querySelector('.nav');
const sw = document.querySelector('.logo .logo-switches');
if (nav && sw && !sw.dataset.moved) {
sw.dataset.moved = '1';
nav.appendChil...[truncated]
@@ -0,0 +1,29 @@
# Proposal: Серии постов (series), переключатель темы справа, соцсети в меню
## Why
Три улучшения шапки и контента dedinit.ru:
1. **Таксономия `series`** (как в Blowfish): сгруппировать посты в серии.
Статья, помеченная `series`, показывает на странице модуль серии со
ссылками на другие части (навигация «Серия: N из M»). Без новых сущностей
контента — только taxonomies + вывод.
2. **Переключатель темы (солнце/луна) — вправо, рядом с меню**. Сейчас он
вложен в `.logo` (структура PaperMod) и не перемещается CSS-селектором
`.nav > .logo-switches`. Нужен перенос элемента в конец `.nav` (после
`#menu`) — через JS-инжект в `extend_footer.html` (штатный хук темы),
чтобы не трогать саму тему.
3. **Иконки соцсетей в верхнем меню**. Стандартные `[params.socialIcons]`
(как в Blowfish) рендерятся партиалом `social_icons.html`, но он вызывается
только в профиле/на главной. Нужно вывести иконки (github, telegram,
mastodon, rss) в шапку рядом с меню — через the same JS-инжект.
## User-Facing Behavior
- В `hugo.toml` появляется `[taxonomies] series = "series"`.
- Пост с `series: ["Имя"]` и `series_order: N` показывает в начале контента
блок «Серия: Имя (N)» со ссылками на предыдущую/следующую часть.
- В шапке солнце/луна стоит справа, сразу после пунктов меню.
- Рядом с меню — иконки соцсетей (из `[params.socialIcons]`).
@@ -0,0 +1,41 @@
# Series and Menu Capability
## ADDED Requirements
### Requirement: Series taxonomy
Таксономия `series` позволяет группировать посты в серии и показывает на
странице поста модуль навигации по серии.
#### Scenario: Taxonomy enabled
- Given hugo.toml has `[taxonomies] series = "series"`
- When site is built
- Then `/series/` term page exists and posts can be marked with `series`
#### Scenario: Series module on a post
- Given a post with `series: ["Test"]` and `series_order: 2` in front-matter
- When that post is rendered
- Then a "Серия" block is visible at the top of the content
- And it shows the series name, position («2 из N»)
- And it links to the previous article (if any) and next article (if any)
### Requirement: Theme toggle on the right
Переключатель темы (солнце/луна) отображается в правой части шапки, сразу
после пунктов меню.
#### Scenario: Toggle next to the menu
- Given the header markup with `.logo-switches` inside `.logo`
- When the page is rendered
- Then the theme toggle button is displayed at the right end of `.nav`,
after `#menu`
### Requirement: Social icons in the header
Иконки соцсетей из `[params.socialIcons]` отображаются в верхнем меню рядом
с переключателем темы.
#### Scenario: Icons rendered from params
- Given `[params.socialIcons]` with github and telegram entries
- When the page is rendered
- Then links with SVG icons appear in the header nav, next to the menu
@@ -0,0 +1,39 @@
# Tasks: Series taxonomy, theme toggle right, social icons in menu
## 1. Таксономия series
- [x] 1.1 Добавить `[taxonomies] series = "series"` в `hugo.toml`
- [x] 1.2 Создать `layouts/partials/series_nav.html` — модуль «Серия: N из M» со
ссылками на пред./след. часть (сортировка по `series_order`)
- [x] 1.3 Переопределить `layouts/_default/single.html` (копия из темы) и
подключить `series_nav.html` перед `.post-content`
## 2. Переключатель темы справа
- [x] 2.1 В `layouts/partials/extend_footer.html` добавить JS: перенос
`.logo .logo-switches` в конец `.nav` (под флагом, чтобы не дублировать)
- [x] 2.2 В `assets/css/extended/typewriter.css` закрепить `.logo-switches`
(margin-inline-start) — чтобы встал сразу после `#menu`
## 3. Соцсети в меню
- [x] 3.1 Добавить `[params.socialIcons]` в `hugo.toml` (github, telegram, rss)
- [x] 3.2 В `extend_footer.html` добавить server-rendered блок иконок
(`social_icons` через `svg.html` темы) и JS-перенос в `.nav` рядом с меню
- [x] 3.3 ФИКС: убрать inline `style="display:none"` (перебивал CSS при переносе),
скрытие через `#__social-icons` (CSS), JS снимает id → блок видим
## 4. Теги в логотипе (typewriter)
- [x] 4.1 Слова печати = реальные `site.Taxonomies.tags` (популярные первыми,
топ-24, без служебных) вместо хардкода `[params.typewriter].words`
- [x] 4.2 Удалить устаревший `[params.typewriter]` из `hugo.toml`
## 5. Проверка и деплой
- [x] 5.1 `make build` без ошибок
- [x] 5.2 Локальные проверки: series-nav на странице серии (2 поста — prev/next
работают), таксономия `/series/` собрана, соцсети в шапке (CSS-скрытие +
снятие id), переключатель переносится JS, теги в JS-массиве
- [ ] 5.3 `git commit` + push
- [ ] 5.4 `make deploy`