site web agence - hugo
  • JavaScript 55.8%
  • HTML 34.6%
  • CSS 6.6%
  • Dockerfile 3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
QaldeK 3489dc850a feat(cms): switch Sveltia backend to self-hosted Forgejo with PKCE
Backend gitea pointé sur git.oupla.net (base_url + api_root + app_id du client OAuth public PKCE « sveltia »). Bundle CDN épinglé en 0.208.2 — le skill Sveltia recommande l'épinglage au déploiement. Option locale retirée : inexistante en Sveltia (l'UI suit la langue du navigateur).
2026-09-09 03:39:54 +02:00
.agents/skills chore(skills): replace vendored sveltia-cms copy with symlinked install 2026-09-04 17:41:55 +02:00
.scratch feat(landing): Implement homepage with sections and CMS structure 2026-08-24 10:10:51 +02:00
.serena init config 2026-09-09 00:02:45 +02:00
.zed init 2026-08-22 14:05:39 +02:00
assets feat(ui): optimize accordion animation and accessibility 2026-08-24 12:25:06 +02:00
content feat(cms): accueil éditable section par section 2026-09-04 13:12:07 +02:00
data fix(cms): load site CSS from stable path 2026-09-04 13:23:17 +02:00
docs/agents init 2026-08-22 14:05:39 +02:00
layouts feat(docker): add pinned-hugo Dockerfile and test-phase noindex 2026-09-09 01:41:07 +02:00
node_modules init 2026-08-22 14:05:39 +02:00
static/admin feat(cms): switch Sveltia backend to self-hosted Forgejo with PKCE 2026-09-09 03:39:54 +02:00
.dockerignore feat(docker): add pinned-hugo Dockerfile and test-phase noindex 2026-09-09 01:41:07 +02:00
.gitignore init config 2026-09-09 00:02:45 +02:00
.ignore init config 2026-09-09 00:02:45 +02:00
AGENTS.md fix(cms): load site CSS from stable path 2026-09-04 13:23:17 +02:00
Dockerfile feat(docker): add pinned-hugo Dockerfile and test-phase noindex 2026-09-09 01:41:07 +02:00
hugo.toml feat(docker): add pinned-hugo Dockerfile and test-phase noindex 2026-09-09 01:41:07 +02:00
hugo_stats.json feat(cms): accueil éditable section par section 2026-09-04 13:12:07 +02:00
opencode.json init 2026-08-22 14:05:39 +02:00
package-lock.json init 2026-08-22 14:05:39 +02:00
package.json init 2026-08-22 14:05:39 +02:00
README.md init 2026-08-22 14:05:39 +02:00

Hugo Starter — Basecoat

Starter de site statique Hugo, 100 % self-hosté (zéro CDN), basé sur Basecoat — l'implémentation CSS/JS vanilla de shadcn/ui, fonctionne avec n'importe quelle stack, sans React.

Stack

  • Hugo ≥ 0.161.0 (testé 0.162.1) — le CLI npm Tailwind est requis
  • Tailwind CSS 4.3.3 + @tailwindcss/cli — config CSS-first dans assets/css/main.css
  • Basecoat 1.0 (basecoat-css) — style pack Vega par défaut, dark mode inclus
  • @tailwindcss/typography — classes prose pour le contenu markdown
  • Alpine.js 3.16.2 + 9 plugins officiels — interactions custom (assets/js/main.js)
  • lucide-static 1.33.0 — icônes SVG inline au build
  • npm uniquement (pas bun/yarn/pnpm)

Commandes

npm install        # installe les dépendances
npm run dev        # serveur dev — --disableFastRender OBLIGATOIRE (purge Tailwind correcte)
npm run build      # build production (--gc --minify)
npm run clean      # supprime public/ + resources/

Structure

├── hugo.toml                  # config centrale : mounts, buildStats, cachebusters, security.exec
├── assets/css/main.css        # imports Tailwind + Basecoat, purge via hugo_stats.json
├── assets/js/main.js          # socle : Alpine (+plugins) + runtime Basecoat, un seul start()
├── layouts/
│   ├── _default/              # baseof (anti-FOUC dark), home, single, list
│   ├── partials/              # header (nav+toggle+burger), footer, head/css, head/js
│   │   └── lucide.html        # icône Lucide inline (partials + shortcodes)
│   └── shortcodes/lucide.html
├── content/pages/             # démo : composants.md (vitrine Basecoat + Alpine), à-propos
└── static/favicon.svg

Basecoat : ce qu'il faut savoir

  • CSS : @import "basecoat-css" dans main.css = bundle Vega (style shadcn classique). Autres style packs : basecoat-css/nova, /maia, /lyra, /mira, /luma, /sera, /rhea. Toujours après @import "tailwindcss", jamais deux style packs superposés.
  • Composants : classes sémantiques (btn, card, field, alert, badge, accordion, tabs…) + attributs data-variant / data-size. Les champs de formulaire sont stylés sémantiquement (.field > input[type=text]).
  • JS : la plupart des composants sont CSS-only. Les interactifs (accordion, combobox, command, drawer, dropdown-menu, popover, range, select, sidebar, tabs, toast) sont portés par le runtime vanilla importé dans main.js (import 'basecoat-css/all'). HTML injecté après coup : window.basecoat.initAll().
  • Dark mode : classe .dark sur <html> (convention shadcn). Posée avant la première peinture par le script inline anti-FOUC de baseof.html, basculée par le toggle du header, mémorisée dans localStorage (clé theme). Le variant dark: de Tailwind suit html.dark (défini par Basecoat — ne pas redéfinir @custom-variant dark).
  • Thème : variables CSS compatibles shadcn/ui (--primary, --background…) — surchargeables dans main.css ou via un thème TweakCN importé après Basecoat.
  • Polices : les tokens Basecoat préfèrent Geist Sans/Mono avec fallbacks système. Pour Geist réel : npm install @fontsource/geist-sans @fontsource/geist-mono puis imports CSS après Basecoat.

Icônes Lucide

Dans les templates :

{{ partial "lucide.html" (dict "name" "arrow-right" "size" "18" "stroke-width" "1.5") }}

Dans le markdown :

{{</* lucide name="sun" size="20" */>}}

SVG inline au build : zéro requête HTTP, zéro JS client. Liste complète des icônes : node_modules/lucide-static/icons/.

Alléger le bundle

Dans assets/js/main.js :

  • Alpine : commenter les imports + Alpine.plugin(...) des plugins inutilisés (esbuild n'embarque que ce qui est importé).
  • Basecoat : remplacer import 'basecoat-css/all' par des imports sélectifs — import 'basecoat-css/basecoat' (runtime) puis uniquement les contrôleurs utilisés ('basecoat-css/tabs', 'basecoat-css/dropdown-menu'…).

Pourquoi ce pipeline ?

  • css.TailwindCSS appelle le CLI npm Tailwind v4 (le binaire standalone n'est plus supporté par Hugo ≥ 0.161.0).
  • skipInlineImportsNotFound (partial head/css.html) : l'inliner CSS de Hugo ne résout pas @import "basecoat-css" (package node_modules) — on le laisse au CLI Tailwind, qui le résout nativement. Spécificité de ce starter : le daisyUI n'utilise que @plugin et n'en a pas besoin.
  • build.buildStats génère hugo_stats.json (inventaire des classes HTML), consommé par @source dans main.css → purge Tailwind correcte.
  • templates.Defer retarde la construction du CSS en fin de build pour que l'inventaire soit complet.
  • --disableFastRender est obligatoire en dev : sans lui, le CSS n'est pas reconstruit quand seuls les templates changent.
  • security.exec.allow autorise tailwindcss/postcss/node/npx (obligatoire depuis Hugo 0.165.0).

Différences avec le starter daisyUI

Starter daisyUI Celui-ci
Composants daisyUI 5 (thèmes light/dark) Basecoat 1.0 / shadcn (style packs)
Dark mode data-theme sur <html> classe .dark sur <html> (convention shadcn)
Variantes classes (btn-primary, btn-sm) attributs (data-variant, data-size)
Interactivité composants Alpine (x-data) runtime vanilla Basecoat
Interactivité custom Alpine Alpine (identique)

Le mécanisme de variantes de chrome (chrome/resolve.html), la collection de shortcodes ui/ et les pages démos du starter daisyUI ne sont pas portés — à ajouter au besoin.