From 3a9838f7fc41aefd1089e91186cac2a3511e2830 Mon Sep 17 00:00:00 2001 From: Selecta Keke Date: Sat, 15 Aug 2026 12:04:18 -0300 Subject: [PATCH] Theme Forgejo wiki for CCDS --- local-services/forgejo/README.md | 17 + local-services/forgejo/sync-theme.sh | 13 + local-services/forgejo/theme/ccds-wiki.css | 366 +++++++++++++++++++++ local-services/forgejo/theme/header.tmpl | 3 + 4 files changed, 399 insertions(+) create mode 100755 local-services/forgejo/sync-theme.sh create mode 100644 local-services/forgejo/theme/ccds-wiki.css create mode 100644 local-services/forgejo/theme/header.tmpl diff --git a/local-services/forgejo/README.md b/local-services/forgejo/README.md index d559790..f575585 100644 --- a/local-services/forgejo/README.md +++ b/local-services/forgejo/README.md @@ -34,3 +34,20 @@ docker compose --env-file .env.local down - base PostgreSQL : `local-services/forgejo/db` Ces dossiers restent sur votre machine entre les redemarrages. + +## Theme wiki + +La source versionnee du theme wiki se trouve ici : + +- feuille de style : `local-services/forgejo/theme/ccds-wiki.css` +- injection du CSS : `local-services/forgejo/theme/header.tmpl` + +Pour recopier ces fichiers dans le volume Forgejo local : + +```bash +cd /Users/selecta/Documents/portail-associations/local-services/forgejo +./sync-theme.sh +docker restart forgejo-local +``` + +Le chargement est volontairement limite aux pages wiki pour ne pas perturber les vues Git, admin et tickets. diff --git a/local-services/forgejo/sync-theme.sh b/local-services/forgejo/sync-theme.sh new file mode 100755 index 0000000..c988165 --- /dev/null +++ b/local-services/forgejo/sync-theme.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "$0")" && pwd)" +SRC_DIR="$ROOT_DIR/theme" +TARGET_DIR="$ROOT_DIR/data/custom" + +mkdir -p "$TARGET_DIR/public/assets/css" "$TARGET_DIR/templates/custom" + +cp "$SRC_DIR/ccds-wiki.css" "$TARGET_DIR/public/assets/css/ccds-wiki.css" +cp "$SRC_DIR/header.tmpl" "$TARGET_DIR/templates/custom/header.tmpl" + +echo "Forgejo wiki theme synced into $TARGET_DIR" diff --git a/local-services/forgejo/theme/ccds-wiki.css b/local-services/forgejo/theme/ccds-wiki.css new file mode 100644 index 0000000..b3229fd --- /dev/null +++ b/local-services/forgejo/theme/ccds-wiki.css @@ -0,0 +1,366 @@ +/* + * CCDS wiki theme for Forgejo. + * Scoped to wiki pages so repository code views and admin screens keep Forgejo defaults. + */ + +:root { + --ccds-ink: #17202f; + --ccds-ink-soft: #405068; + --ccds-line: rgba(23, 32, 47, 0.1); + --ccds-line-strong: rgba(16, 72, 132, 0.18); + --ccds-surface: #ffffff; + --ccds-surface-soft: rgba(255, 255, 255, 0.9); + --ccds-surface-muted: #f5f8fc; + --ccds-primary: #1565c0; + --ccds-primary-strong: #0d4e99; + --ccds-accent: #39b96b; + --ccds-accent-soft: rgba(57, 185, 107, 0.16); + --ccds-shadow: 0 18px 42px rgba(18, 34, 61, 0.08); + --ccds-radius-lg: 22px; + --ccds-radius-md: 16px; + --ccds-radius-sm: 12px; +} + +body:has(.page-content.repository.wiki) { + background: + radial-gradient(circle at top left, rgba(57, 185, 107, 0.12), transparent 20rem), + radial-gradient(circle at top right, rgba(21, 101, 192, 0.12), transparent 24rem), + linear-gradient(180deg, #f8fbff 0%, #eef4fb 100%); +} + +.page-content.repository.wiki { + color: var(--ccds-ink); +} + +.page-content.repository.wiki > .ui.container { + width: min(1240px, calc(100% - 32px)) !important; + margin-top: 26px; + margin-bottom: 60px; +} + +.page-content.repository.wiki .repo-button-row { + gap: 12px; + padding: 14px; + border: 1px solid var(--ccds-line); + border-radius: var(--ccds-radius-md); + background: var(--ccds-surface-soft); + box-shadow: 0 10px 24px rgba(18, 34, 61, 0.05); + backdrop-filter: blur(14px); +} + +.page-content.repository.wiki .repo-button-row .ui.button, +.page-content.repository.wiki .repo-button-row .ui.input > input { + min-height: 40px; + border-radius: 11px !important; +} + +.page-content.repository.wiki .repo-button-row .ui.basic.button { + border-color: rgba(21, 101, 192, 0.22); + background: #f6fbff; +} + +.page-content.repository.wiki .ui.dividing.header { + position: relative; + overflow: hidden; + margin: 18px 0 22px; + padding: 28px 30px !important; + border: 1px solid var(--ccds-line-strong) !important; + border-radius: var(--ccds-radius-lg); + background: + linear-gradient(135deg, rgba(255, 255, 255, 0.98), rgba(244, 249, 255, 0.97)); + box-shadow: var(--ccds-shadow); +} + +.page-content.repository.wiki .ui.dividing.header::before { + content: ""; + position: absolute; + inset: auto 0 0; + height: 5px; + background: linear-gradient(90deg, var(--ccds-accent), var(--ccds-primary)); +} + +.page-content.repository.wiki .ui.dividing.header::after { + content: "WIKI CCDS"; + position: absolute; + top: 22px; + right: 26px; + color: rgba(21, 101, 192, 0.12); + font-size: clamp(1.4rem, 4vw, 3rem); + font-weight: 900; + letter-spacing: 0.12em; + line-height: 1; + pointer-events: none; +} + +.page-content.repository.wiki .ui.dividing.header .column { + position: relative; + z-index: 1; +} + +.page-content.repository.wiki .ui.dividing.header > .ui.grid > .column:first-child { + font-size: clamp(1.4rem, 2.4vw, 2rem); + font-weight: 850; + letter-spacing: -0.025em; +} + +.page-content.repository.wiki .ui.sub.header { + margin-top: 8px; + color: var(--ccds-ink-soft); + font-size: 0.84rem; + font-weight: 500; +} + +.page-content.repository.wiki .ui.primary.button { + border-color: var(--ccds-primary) !important; + background: linear-gradient(135deg, #1e77d4, #0f5cac) !important; + color: #fff !important; + box-shadow: 0 8px 18px rgba(21, 101, 192, 0.22) !important; +} + +.page-content.repository.wiki .ui.primary.button:hover { + background: linear-gradient(135deg, #3086e1, #1364b8) !important; + transform: translateY(-1px); +} + +.page-content.repository.wiki .wiki-content-parts { + align-items: flex-start; + gap: 22px; +} + +.page-content.repository.wiki .wiki-content-main, +.page-content.repository.wiki .wiki-content-sidebar, +.page-content.repository.wiki .wiki-content-footer { + border: 1px solid var(--ccds-line); + border-radius: var(--ccds-radius-lg); + background: var(--ccds-surface); + box-shadow: var(--ccds-shadow); +} + +.page-content.repository.wiki .wiki-content-main { + min-width: 0; + padding: clamp(24px, 4vw, 46px); +} + +.page-content.repository.wiki .wiki-content-sidebar { + position: sticky; + top: 74px; + padding: 20px; + background: rgba(255, 255, 255, 0.94); + box-shadow: 0 14px 30px rgba(18, 34, 61, 0.08); +} + +.page-content.repository.wiki .wiki-content-sidebar .markup { + font-size: 0.95rem; +} + +.page-content.repository.wiki .wiki-content-sidebar ul { + margin: 0; + padding-left: 1.05rem; +} + +.page-content.repository.wiki .wiki-content-sidebar li + li { + margin-top: 0.4rem; +} + +.page-content.repository.wiki .wiki-content-footer { + margin-top: 22px; + padding: 18px 24px; + color: var(--ccds-ink-soft); + text-align: center; +} + +.page-content.repository.wiki .markup h1, +.page-content.repository.wiki .markup h2, +.page-content.repository.wiki .markup h3, +.page-content.repository.wiki .markup h4 { + color: var(--ccds-ink); + font-weight: 800; + letter-spacing: -0.025em; +} + +.page-content.repository.wiki .markup h1 { + margin-bottom: 1.2rem; + padding-bottom: 0.8rem; + border-bottom: 2px solid rgba(21, 101, 192, 0.15); + font-size: clamp(2rem, 5vw, 3rem); +} + +.page-content.repository.wiki .markup h2 { + position: relative; + margin-top: 2.4rem; + padding-left: 16px; + border-bottom: 0; + font-size: clamp(1.34rem, 3vw, 1.74rem); +} + +.page-content.repository.wiki .markup h2::before { + content: ""; + position: absolute; + inset: 0 auto 0 0; + width: 5px; + border-radius: 999px; + background: linear-gradient(180deg, var(--ccds-accent), var(--ccds-primary)); +} + +.page-content.repository.wiki .markup h3 { + margin-top: 1.8rem; + font-size: 1.16rem; +} + +.page-content.repository.wiki .markup p, +.page-content.repository.wiki .markup li { + color: #445164; + font-size: 1rem; + line-height: 1.8; +} + +.page-content.repository.wiki .markup strong { + color: var(--ccds-ink); +} + +.page-content.repository.wiki .markup a { + color: var(--ccds-primary); + font-weight: 650; + text-decoration-color: rgba(21, 101, 192, 0.28); + text-underline-offset: 3px; +} + +.page-content.repository.wiki .markup a:hover { + color: var(--ccds-primary-strong); + text-decoration-color: currentColor; +} + +.page-content.repository.wiki .markup blockquote { + margin: 1.5rem 0; + padding: 18px 20px; + border: 1px solid rgba(21, 101, 192, 0.16); + border-left: 5px solid var(--ccds-primary); + border-radius: 5px var(--ccds-radius-sm) var(--ccds-radius-sm) 5px; + background: linear-gradient(115deg, #f7fbff, #fefefe); + color: #445164; +} + +.page-content.repository.wiki .markup hr { + border-color: rgba(21, 101, 192, 0.1); +} + +.page-content.repository.wiki .markup ul li::marker, +.page-content.repository.wiki .markup ol li::marker { + color: var(--ccds-primary); +} + +.page-content.repository.wiki .markup table { + display: table; + width: 100%; + overflow: hidden; + border: 1px solid rgba(21, 101, 192, 0.12) !important; + border-radius: var(--ccds-radius-sm); + border-collapse: separate; + border-spacing: 0; + box-shadow: 0 10px 22px rgba(18, 34, 61, 0.05); +} + +.page-content.repository.wiki .markup table th { + border-color: rgba(21, 101, 192, 0.12) !important; + background: #eef6ff !important; + color: #173860; + font-weight: 760; +} + +.page-content.repository.wiki .markup table td { + border-color: rgba(21, 101, 192, 0.08) !important; + background: rgba(255, 255, 255, 0.78); +} + +.page-content.repository.wiki .markup table tr:hover td { + background: #f7fbff; +} + +.page-content.repository.wiki .markup code:not(pre code) { + border: 1px solid rgba(21, 101, 192, 0.12); + border-radius: 7px; + background: #f2f7fc; + color: #134d8f; +} + +.page-content.repository.wiki .markup pre { + border: 1px solid rgba(12, 38, 68, 0.32); + border-radius: 15px; + background: #12213a; + box-shadow: 0 12px 28px rgba(17, 29, 48, 0.16); +} + +.page-content.repository.wiki .markup pre code { + color: #f6fbff; +} + +.page-content.repository.wiki .markup img { + border-radius: 14px; + box-shadow: 0 14px 28px rgba(18, 34, 61, 0.08); +} + +.page-content.repository.wiki .wiki-pages-list { + overflow: hidden; + border: 1px solid var(--ccds-line) !important; + border-radius: 18px !important; + background: var(--ccds-surface) !important; + box-shadow: var(--ccds-shadow) !important; +} + +.page-content.repository.wiki .wiki-pages-list .item { + padding-top: 14px !important; + padding-bottom: 14px !important; +} + +.page-content.repository.wiki .ui.label, +.page-content.repository.wiki .markup .ui.label { + border-radius: 999px; + background: var(--ccds-accent-soft); + color: #157449; + font-weight: 700; +} + +@media (max-width: 960px) { + .page-content.repository.wiki > .ui.container { + width: calc(100% - 20px) !important; + margin-top: 16px; + } + + .page-content.repository.wiki .wiki-content-parts { + gap: 16px; + } + + .page-content.repository.wiki .wiki-content-sidebar { + position: static; + } + + .page-content.repository.wiki .ui.dividing.header { + padding: 22px 20px !important; + } + + .page-content.repository.wiki .ui.dividing.header::after { + top: auto; + right: 18px; + bottom: 18px; + font-size: 1.2rem; + } +} + +@media (max-width: 640px) { + .page-content.repository.wiki .repo-button-row { + padding: 12px; + } + + .page-content.repository.wiki .wiki-content-main { + padding: 20px 18px; + } + + .page-content.repository.wiki .markup h1 { + font-size: 1.8rem; + } + + .page-content.repository.wiki .markup p, + .page-content.repository.wiki .markup li { + font-size: 0.96rem; + } +} diff --git a/local-services/forgejo/theme/header.tmpl b/local-services/forgejo/theme/header.tmpl new file mode 100644 index 0000000..8d9fabe --- /dev/null +++ b/local-services/forgejo/theme/header.tmpl @@ -0,0 +1,3 @@ +{{if .PageIsWiki}} + +{{end}}