site web agence - hugo
- JavaScript 55.8%
- HTML 34.6%
- CSS 6.6%
- Dockerfile 3%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
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). |
||
| .agents/skills | ||
| .scratch | ||
| .serena | ||
| .zed | ||
| assets | ||
| content | ||
| data | ||
| docs/agents | ||
| layouts | ||
| node_modules | ||
| static/admin | ||
| .dockerignore | ||
| .gitignore | ||
| .ignore | ||
| AGENTS.md | ||
| Dockerfile | ||
| hugo.toml | ||
| hugo_stats.json | ||
| opencode.json | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
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 dansassets/css/main.css - Basecoat 1.0 (
basecoat-css) — style pack Vega par défaut, dark mode inclus @tailwindcss/typography— classesprosepour 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"dansmain.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…) + attributsdata-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
.darksur<html>(convention shadcn). Posée avant la première peinture par le script inline anti-FOUC debaseof.html, basculée par le toggle du header, mémorisée danslocalStorage(clétheme). Le variantdark:de Tailwind suithtml.dark(défini par Basecoat — ne pas redéfinir@custom-variant dark). - Thème : variables CSS compatibles shadcn/ui (
--primary,--background…) — surchargeables dansmain.cssou 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-monopuis 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.TailwindCSSappelle le CLI npm Tailwind v4 (le binaire standalone n'est plus supporté par Hugo ≥ 0.161.0).skipInlineImportsNotFound(partialhead/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@pluginet n'en a pas besoin.build.buildStatsgénèrehugo_stats.json(inventaire des classes HTML), consommé par@sourcedansmain.css→ purge Tailwind correcte.templates.Deferretarde la construction du CSS en fin de build pour que l'inventaire soit complet.--disableFastRenderest obligatoire en dev : sans lui, le CSS n'est pas reconstruit quand seuls les templates changent.security.exec.allowautorisetailwindcss/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.