# Slackware Projects Section Implementation Plan > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** Add a `slackware` Hugo section with a clickable hub page that aggregates per-project deep-dive pages (styled rows), restructure the main menu (rename two entries, add nested "Slackware" parent with desktop hover + mobile indented submenu), reuse the shared `tags` taxonomy for project tech, and index projects in site search. **Architecture:** New Hugo section `content/{en,it}/slackware/` with `_index.md` (hub) and `/index.md` pages. Hub list layout loops project pages into full-width alternating rows (option #3 shape, #2 styling). Project single layout reuses the `repository/single.html` shell plus a project-header partial. Menu nesting via `parent =` in `hugo.toml`; desktop submenu is CSS-only (`group-hover` + `group-focus-within`), mobile shows indented children. Tech tags use the existing `tags` taxonomy. **Tech Stack:** Hugo (extended), Tailwind CSS (npm build → `main.min.css`), Alpine.js (existing, unchanged here), Hugo i18n YAML. **Verification model:** No unit-test runner exists for templates. Each task verifies with `hugo` build/render checks (build succeeds, expected HTML/text present in output) and ends with a commit. Theme files commit inside the `themes/danix-xyz-hacker/` submodule; content/config/i18n commit in the content repo, per CLAUDE.md Git workflow. **Pre-flight (run once before Task 1):** - Content repo root: `/home/danix/Programming/GIT/danix.xyz-hacker-theme` - Confirm theme submodule is on master: `cd themes/danix-xyz-hacker && git checkout master && cd ../..` - All `hugo` build checks below run from the content repo root. --- ### Task 1: Scaffold the slackware section content (EN + IT) Creates the section so later layout work has real pages to render. Includes one sample project used by every later render check. **Files:** - Create: `content/en/slackware/_index.md` - Create: `content/it/slackware/_index.md` - Create: `content/en/slackware/sample-project/index.md` - Create: `content/it/slackware/sample-project/index.md` - [ ] **Step 1: Create EN hub index** `content/en/slackware/_index.md`: ```toml +++ title = "Slackware" date = 2026-06-26T00:00:00Z +++ I build and run everything on **Slackware**. This page collects the projects I maintain around it, and the reasons I keep choosing it: simplicity, transparency, and staying out of my way. ``` - [ ] **Step 2: Create IT hub index** `content/it/slackware/_index.md`: ```toml +++ title = "Slackware" date = 2026-06-26T00:00:00Z +++ Costruisco e uso tutto su **Slackware**. Questa pagina raccoglie i progetti che mantengo intorno ad essa, e i motivi per cui continuo a sceglierla: semplicità, trasparenza, e non mettersi in mezzo. ``` - [ ] **Step 3: Create EN sample project** `content/en/slackware/sample-project/index.md`: ```toml +++ title = "Sample Project" tagline = "A placeholder project to validate the section layout." status = "active" repo_url = "https://git.danix.xyz/sample-project" tags = ["bash", "slackbuild", "python"] +++ ## What it is Freeform body content for the sample project. ## How it works Details here. ## Rationale Why it exists. ``` - [ ] **Step 4: Create IT sample project** `content/it/slackware/sample-project/index.md`: ```toml +++ title = "Progetto di Esempio" tagline = "Un progetto segnaposto per validare il layout della sezione." status = "active" repo_url = "https://git.danix.xyz/sample-project" tags = ["bash", "slackbuild", "python"] +++ ## Cos'è Contenuto libero per il progetto di esempio. ## Come funziona Dettagli qui. ## Motivazione Perché esiste. ``` - [ ] **Step 5: Verify build succeeds and pages exist** Run: `hugo --quiet && ls public/en/slackware/sample-project/index.html public/it/slackware/sample-project/index.html` Expected: build completes with no errors; both files listed. (Pages render with Hugo's default `_default` layouts for now — that's fine; dedicated layouts come in Tasks 5–6.) - [ ] **Step 6: Commit (content repo)** ```bash git add content/en/slackware content/it/slackware git commit -m "feat: scaffold slackware projects section (EN/IT) with sample project" ``` --- ### Task 2: Add i18n keys and rename menu labels Renames "Git Repository"→Projects and "Repo"→Packages via i18n values (menu labels render through `i18n .Name`), and adds all new keys the later layouts need. **Files:** - Modify: `i18n/en.yaml` - Modify: `i18n/it.yaml` - [ ] **Step 1: Rename + add EN keys** In `i18n/en.yaml`, change the existing values: ```yaml gitrepo: "Projects" repo: "Packages" ``` Then add these new keys (anywhere in the file): ```yaml slackware: "Slackware" slackwareTitle: "Slackware" slackwareSubtitle: "Projects I build and maintain on Slackware." projectStatus: "Status" viewRepo: "View repository" status-active: "active" status-maintained: "maintained" status-wip: "wip" status-archived: "archived" ``` - [ ] **Step 2: Rename + add IT keys** In `i18n/it.yaml`, change the existing values: ```yaml gitrepo: "Progetti" repo: "Pacchetti" ``` Then add: ```yaml slackware: "Slackware" slackwareTitle: "Slackware" slackwareSubtitle: "Progetti che costruisco e mantengo su Slackware." projectStatus: "Stato" viewRepo: "Vedi repository" status-active: "attivo" status-maintained: "mantenuto" status-wip: "in corso" status-archived: "archiviato" ``` - [ ] **Step 3: Verify build + label rendering** Run: `hugo --quiet && grep -o "Projects\|Packages" public/en/index.html | sort -u` Expected: build succeeds; output contains both `Projects` and `Packages` (the renamed desktop menu labels). - [ ] **Step 4: Commit (content repo)** ```bash git add i18n/en.yaml i18n/it.yaml git commit -m "feat: rename menu labels (Projects/Packages) and add slackware i18n keys" ``` --- ### Task 3: Restructure menu config (nest Packages + Slackware hub) Adds the Slackware parent (→ hub) and nests Packages under it, in both language menus. Keeps Projects external. **Files:** - Modify: `hugo.toml` (Italian menu block ~lines 76–94; English menu block ~lines 122–140) - [ ] **Step 1: Add Slackware parent + nest repository (IT)** In `hugo.toml`, in the `languages.it.menus.main` block: leave the `gitrepo` (external) entry as-is. Replace the existing `repository` entry with a new Slackware parent plus the nested Packages entry: ```toml [[languages.it.menus.main]] identifier = "slackware" pageRef = "/slackware" name = "slackware" weight = 5 [[languages.it.menus.main]] identifier = "repository" pageRef = "/repository" name = "repo" parent = "slackware" weight = 1 ``` (Leave the `legal` entry at weight 6.) - [ ] **Step 2: Add Slackware parent + nest repository (EN)** In the `languages.en.menus.main` block, make the identical change: ```toml [[languages.en.menus.main]] identifier = "slackware" pageRef = "/slackware" name = "slackware" weight = 5 [[languages.en.menus.main]] identifier = "repository" pageRef = "/repository" name = "repo" parent = "slackware" weight = 1 ``` - [ ] **Step 2b: Add project pages into the submenu (both languages)** Hugo does not auto-add section pages to a menu. To make project pages appear in the Slackware submenu, add `menu` front-matter to each project. Update both sample project files from Task 1 by adding to their front-matter: `content/en/slackware/sample-project/index.md` and `content/it/slackware/sample-project/index.md`, add inside the `+++`: ```toml [menus.main] parent = "slackware" weight = 10 ``` - [ ] **Step 3: Verify menu nesting** Run: `hugo --quiet && hugo list all >/dev/null 2>&1; echo "build ok"` Then confirm the parent renders without breaking the existing top-level menu: `grep -c "Slackware" public/en/index.html` Expected: build ok; count >= 1. (Submenu HTML wiring is added in Tasks 4 & 7; here we only assert config builds and the parent label appears.) - [ ] **Step 4: Commit (content repo)** ```bash git add hugo.toml content/en/slackware/sample-project/index.md content/it/slackware/sample-project/index.md git commit -m "feat: nest Packages under new Slackware menu parent (both languages)" ``` --- ### Task 4: Desktop header submenu (CSS-only hover + focus-within) Makes the desktop nav render children as a centered row below the bar on hover/focus, for any menu item that has children. Items without children are unchanged. **Files:** - Modify: `themes/danix-xyz-hacker/layouts/partials/header.html:13-27` - [ ] **Step 1: Replace the desktop menu loop** In `header.html`, replace the desktop menu block (the `` containing the `range .Site.Menus.main`) with a parent-aware version: ```html ``` Note: this also fixes the pre-existing bug where external top-level items (Projects) rendered `i18n .Name` and lacked `target="_blank"` in the desktop bar. Now external items use `.Name` + new tab, matching the overlay. - [ ] **Step 2: Verify submenu HTML renders** Run: `hugo --quiet && grep -o "group-hover:flex" public/en/index.html | head -1` Expected: build succeeds; `group-hover:flex` present (submenu wrapper emitted). Also confirm Packages link is inside: `grep -A30 "aria-haspopup" public/en/index.html | grep -c "/en/repository/"` → >= 1. - [ ] **Step 3: Commit (theme submodule)** ```bash cd themes/danix-xyz-hacker git add layouts/partials/header.html git commit -m "feat: desktop nav submenu for nested menu items (CSS hover + focus-within)" git push origin master cd ../.. ``` --- ### Task 5: Project header partial Renders the light-schema header (tagline, status badge, repo link, optional image, tech pills) above project body. Used by the single layout (Task 6). **Files:** - Create: `themes/danix-xyz-hacker/layouts/partials/project-header.html` - [ ] **Step 1: Write the partial** A11y/house-style note: status colors map to the existing theme-aware `--type-*` vars (each ships a matched WCAG-AA `-text` color), archived uses `--text-dim` bg with `--bg` text. No literal hex, no theme-breaking. Tag links and the repo link get the project's standard focus-ring pattern. `themes/danix-xyz-hacker/layouts/partials/project-header.html`: ```html {{ $status := .Params.status | default "active" }} {{/* status -> theme-aware bg/text var pair (all defined in main.css) */}} {{ $bgVar := "--type-tech" }}{{ $txtVar := "--type-tech-text" }} {{ if eq $status "maintained" }}{{ $bgVar = "--type-quote" }}{{ $txtVar = "--type-quote-text" }}{{ end }} {{ if eq $status "wip" }}{{ $bgVar = "--type-life" }}{{ $txtVar = "--type-life-text" }}{{ end }} {{ if eq $status "archived" }}{{ $bgVar = "--text-dim" }}{{ $txtVar = "--bg" }}{{ end }} {{ $imageURL := "" }} {{ if .Params.image }} {{ $res := .Resources.GetMatch .Params.image }} {{ if $res }}{{ $imageURL = $res.RelPermalink }}{{ else }}{{ $imageURL = .Params.image }}{{ end }} {{ end }}
{{ if $imageURL }} {{ .Title }} {{ end }}

{{ .Title }}

{{ i18n (printf "status-%s" $status) }}
{{ with .Params.tagline }}

{{ . }}

{{ end }}
{{ with .Params.repo_url }} {{ i18n "viewRepo" }} {{ i18n "opensInNewTab" }} {{ end }} {{ with .Params.tags }} {{ end }}
``` - [ ] **Step 2: Commit (theme submodule)** (Partial is rendered by Task 6's layout; verification happens there. Commit now to keep tasks atomic.) ```bash cd themes/danix-xyz-hacker git add layouts/partials/project-header.html git commit -m "feat: add project-header partial (status badge, repo link, tech pills)" git push origin master cd ../.. ``` --- ### Task 6: Project single layout Wires `project-header.html` above the freeform body, reusing the `repository/single.html` shell idiom (breadcrumb, content-grid, prose, social-share). **Files:** - Create: `themes/danix-xyz-hacker/layouts/slackware/single.html` - [ ] **Step 1: Write the single layout** `themes/danix-xyz-hacker/layouts/slackware/single.html`: ```html {{ define "main" }}
{{ partial "breadcrumb.html" . }} {{ partial "project-header.html" . }}
{{ .Content }}
{{ partial "social-share.html" (dict "page" . "mode" "inline") }}
{{ end }} ``` - [ ] **Step 2: Verify project page renders header + body** Run: `hugo --quiet && grep -o "status-active\|active" public/en/slackware/sample-project/index.html | head -1 && grep -c "View repository" public/en/slackware/sample-project/index.html` Expected: build succeeds; the status badge text (`active`) present; `View repository` count >= 1. Also `grep -c "What it is" public/en/slackware/sample-project/index.html` → >= 1 (freeform body rendered). - [ ] **Step 3: Commit (theme submodule)** ```bash cd themes/danix-xyz-hacker git add layouts/slackware/single.html git commit -m "feat: slackware project single layout with project header" git push origin master cd ../.. ``` --- ### Task 7: Mobile overlay indented children Renders child links indented under their parent in the hamburger overlay. Items without children unchanged. **Files:** - Modify: `themes/danix-xyz-hacker/layouts/partials/hamburger-menu.html:30-45` - [ ] **Step 1: Replace the overlay menu loop** In `hamburger-menu.html`, replace the `{{ range .Site.Menus.main }}…{{ end }}` block inside `