diff --git a/.gitignore b/.gitignore index b04e82d9..4f7b16fc 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ content/stats/images .venv __pycache__ .env +.codex \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md index e4a9b2c2..bd3fbc0e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -48,6 +48,10 @@ Il s'agit d'un site statique généré avec Hugo, dont la version peut être vé - S'assurer de l'harmonisation des entrées/sorties - Toujours utiliser le français dans les interactions avec l'utilisateur +- Pour toute vérification locale avec Hugo, l'agent doit isoler son instance de celle de l'utilisateur + - En mode serveur: `hugo server --port 1314 --renderToDisk --destination .codex/public` + - En mode build: `hugo --cleanDestinationDir --destination .codex/public` + - Ne pas utiliser `public/` pour ces vérifications afin d'éviter les conflits de cache ### Python diff --git a/config/_default/config.yaml b/config/_default/config.yaml index 7582c586..8f52f13a 100644 --- a/config/_default/config.yaml +++ b/config/_default/config.yaml @@ -6,4 +6,7 @@ copyright: "© Richard Dern" disableHugoGeneratorInject: true enableEmoji: true timeZone: Europe/Paris -theme: ["default", 42] +theme: ["2026"] +params: + lists: + layout: spotlight diff --git a/content/stats/index.md b/content/stats/index.md index 1970dee8..f38681a2 100644 --- a/content/stats/index.md +++ b/content/stats/index.md @@ -6,16 +6,12 @@ title: Statistiques ## Visites -
-
-Pages vues -{{< stats-var key="pageviews_per_month" >}} -
-
-Visiteurs uniques -{{< stats-var key="unique_visitors_per_month_value" >}} -
-
+
+
Pages vues
+
{{< stats-var key="pageviews_per_month" >}}
+
Visiteurs uniques
+
{{< stats-var key="unique_visitors_per_month_value" >}}
+
Ces statistiques sont extraites des journaux de [mon serveur web](https://caddyserver.com) _uniquement_ et passées à l'outil [GoAccess](https://goaccess.io/) qui les anonymise (option `--anonymize-ip`). Elles sont construites à partir d'agrégats globaux **sur 30 jours glissants**. @@ -34,16 +30,12 @@ L'essentiel des accès à mon site se fait donc via le flux RSS. ## Habitudes d'écriture -
-
-Record -{{< stats-var key="most_prolific_month" >}} -
-
-Articles par mois -{{< stats-var key="articles_avg_per_month" >}} -
-
+
+
Record
+
{{< stats-var key="most_prolific_month" >}}
+
Articles par mois
+
{{< stats-var key="articles_avg_per_month" >}}
+
![](images/articles_per_year.png) diff --git a/themes/2026/assets/css/article-header.css b/themes/2026/assets/css/article-header.css new file mode 100644 index 00000000..ce66dc81 --- /dev/null +++ b/themes/2026/assets/css/article-header.css @@ -0,0 +1,304 @@ +/* En-tête d’article (pages). */ + +.article-header { + --article-meta-vertical-space: var(--space-2); + gap: var(--space-4); + padding-bottom: var(--space-6); +} + +.article-header > h1 { + margin-top: var(--space-5); + margin-bottom: var(--space-5); + max-width: 30ch; + width: 100%; + margin-inline: auto; + font-size: clamp(1.9rem, 3.6vw, 3.5rem); + line-height: 1.05; + text-transform: uppercase; + letter-spacing: 0.01em; + text-align: center; +} + +.article-header > .article-meta-block { + margin-top: 0; + display: grid; + grid-template-columns: minmax(0, 1.7fr) minmax(0, 1fr); + gap: var(--space-6); + align-items: stretch; +} + +.article-header > .article-meta-block.article-meta-block--without-cover { + grid-template-columns: 1fr; +} + +.article-header > .article-meta-block.article-meta-block--without-cover > .article-meta { + width: min(100%, var(--max-width-reading)); + margin-inline: auto; + align-items: center; + border-left: 0; + padding-left: 0; +} + +.article-header > .article-meta-block.article-meta-block--without-cover .article-meta-main { + align-items: center; +} + +.article-header > .article-meta-block.article-meta-block--without-cover .breadcrumbs > ol, +.article-header > .article-meta-block.article-meta-block--without-cover .article-publication, +.article-header > .article-meta-block.article-meta-block--without-cover .page-links > ul { + justify-content: center; +} + +.article-header > .article-meta-block.article-meta-block--without-cover .cover-meta { + width: 100%; +} + +.article-header .article-cover { + margin-top: 0; +} + +.article-header .article-cover > a { + display: block; +} + +.article-header .article-cover img { + width: 100%; + height: auto; +} + +.article-header .article-meta { + margin-top: 0; + border-left: 1px solid var(--color-border-strong); + padding-left: var(--space-6); + display: flex; + flex-direction: column; + gap: var(--space-3); + min-height: 100%; +} + +.article-header .article-meta-main { + margin-top: 0; + display: flex; + flex-direction: column; + gap: 0; + flex: 1 1 auto; +} + +.article-header .article-meta-main > * + * { + margin-top: var(--article-meta-vertical-space); +} + +.article-header .breadcrumbs li, +.article-header .article-publication { + font-family: var(--font-heading); + font-size: 0.86rem; + text-transform: uppercase; + letter-spacing: 0.04em; + color: var(--color-text-muted); +} + +.article-header .breadcrumbs { + margin-top: 0; +} + +.article-header .article-publication { + margin-top: var(--article-meta-vertical-space); + display: flex; + flex-wrap: wrap; + gap: var(--space-1); +} + +.article-header .article-publication > time { + color: inherit; +} + +.article-header .page-links { + margin-top: var(--article-meta-vertical-space); +} + +.article-header .page-links a { + min-height: 2.35rem; +} + +.article-header .article-origin-link { + margin-top: var(--article-meta-vertical-space); + border-left: var(--border-width-regular) solid var(--color-section-divider-1); + padding: var(--space-3); + background-color: rgba(231, 184, 63, 0.14); +} + +.article-header .article-origin-link-kicker { + margin-top: 0; + font-family: var(--font-heading); + font-size: 0.82rem; + text-transform: uppercase; + letter-spacing: 0.08em; + color: var(--color-heading); +} + +.article-header .article-origin-link-hint { + margin-top: var(--space-2); + font-size: 1rem; + line-height: 1.5; + color: var(--color-text); +} + +.article-header .article-origin-link-button { + margin-top: var(--space-3); +} + +.article-header .article-origin-link-button > a { + width: 100%; + min-height: 2.8rem; + padding: 0.5rem 1rem; + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: flex-start; + gap: var(--space-1); + font-family: var(--font-body); + font-size: 1rem; + text-transform: none; + letter-spacing: normal; +} + +.article-header .article-origin-link-button > a.ui-button { + border-color: color-mix(in srgb, var(--color-section-divider-1) 62%, var(--color-border-strong)); + background: linear-gradient(180deg, rgba(217, 122, 63, 0.36) 0%, rgba(17, 27, 42, 0.94) 100%); +} + +.article-header .article-origin-link-button > a.ui-button:is(:hover, :focus-visible) { + background: linear-gradient(180deg, rgba(217, 122, 63, 0.52) 0%, rgba(17, 27, 42, 0.98) 100%); +} + +.article-header .article-origin-link-button > a.ui-button:visited { + color: var(--color-heading); +} + +.article-header .article-origin-link-button > a.ui-button:hover .article-origin-link-button-url, +.article-header .article-origin-link-button > a.ui-button:focus-visible .article-origin-link-button-url { + color: #ffffff; +} + +.article-header .article-origin-link-button-label { + font-family: var(--font-heading); + font-size: 0.92rem; + text-transform: uppercase; + letter-spacing: 0.06em; + color: inherit; +} + +.article-header .article-origin-link-button-url { + font-size: 0.84rem; + line-height: 1.35; + word-break: break-all; + color: inherit; + text-transform: none; + letter-spacing: normal; +} + +.article-header .cover-meta { + margin-top: auto; + border-top: var(--border-width-regular) solid var(--color-accent-2); + padding-top: var(--space-4); +} + +.article-header .cover-meta > h2 { + margin-top: 0; + font-family: var(--font-heading); + font-size: 0.86rem; + text-transform: uppercase; + letter-spacing: 0.04em; + color: var(--color-text-muted); +} + +.article-header .cover-meta > p { + color: var(--color-heading); +} + +.article-header .cover-title, +main > article figure.figure-media > figcaption.cover-meta .cover-title { + font-family: var(--font-heading); + font-size: 1.36rem; + line-height: 1.15; + letter-spacing: 0.01em; + font-weight: 400; + text-transform: none; + color: var(--color-heading); +} + +.article-header .cover-description, +main > article figure.figure-media > figcaption.cover-meta .cover-description { + font-family: var(--font-body); + font-size: 0.95rem; + letter-spacing: normal; + text-transform: none; + color: var(--color-text); +} + +.article-header .cover-meta > * + * { + margin-top: var(--article-meta-vertical-space); +} + +.article-header .cover-attribution, +main > article figure.figure-media > figcaption.cover-meta .cover-attribution { + display: flex; + flex-wrap: wrap; + gap: var(--space-1); + align-items: baseline; + font-family: var(--font-heading); + font-size: 0.86rem; + text-transform: uppercase; + letter-spacing: 0.04em; + color: var(--color-text-muted); +} + +.article-header .cover-attribution > strong, +main > article figure.figure-media > figcaption.cover-meta .cover-attribution > strong { + font: inherit; + color: var(--color-heading); + background-image: none; + padding: 0; + box-decoration-break: slice; + -webkit-box-decoration-break: slice; +} + +.article-header .cover-meta > details { + margin-top: var(--article-meta-vertical-space); +} + +.article-header .cover-meta > details > summary, +main > article figure.figure-media > figcaption.cover-meta details > summary { + font-family: var(--font-heading); + font-size: 0.86rem; + letter-spacing: 0.04em; + text-transform: uppercase; + color: var(--color-text-muted); +} + +.article-header .cover-meta > details > p, +main > article figure.figure-media > figcaption.cover-meta details > p { + margin-top: var(--space-2); + font-family: var(--font-body); + font-size: 0.95rem; + letter-spacing: normal; + text-transform: none; + color: var(--color-text); +} + +@media (max-width: 1100px) { + .article-header > .article-meta-block { + grid-template-columns: 1fr; + } + + .article-header .article-meta { + border-left: 0; + padding-left: 0; + } +} + +@media (max-width: 800px) { + .article-header > h1 { + font-size: clamp(1.6rem, 8.4vw, 2.4rem); + } +} diff --git a/themes/2026/assets/css/base.css b/themes/2026/assets/css/base.css new file mode 100644 index 00000000..99b17f6b --- /dev/null +++ b/themes/2026/assets/css/base.css @@ -0,0 +1,257 @@ +html { + color-scheme: dark; + font-size: max(100%, var(--font-size-root-min)); +} + +body { + font-family: var(--font-body); + font-size: var(--font-size-body); + line-height: 1.7; + background: linear-gradient( + 170deg, + color-mix(in srgb, var(--color-background-wash) 16%, var(--color-background-alt)) 0%, + color-mix(in srgb, var(--color-background-wash) 8%, var(--color-background-alt)) 46%, + color-mix(in srgb, var(--color-background-wash) 4%, var(--color-background-deep)) 100% + ); + color: var(--color-text); + padding: var(--space-4); +} + +body > header, +body > main, +body > footer { + width: min(100%, var(--max-width)); + margin-inline: auto; +} + +body > main, +body > footer { + margin-bottom: var(--space-6); +} + +body > main { + display: grid; + grid-template-columns: minmax(0, 1fr); + gap: var(--space-6); +} + +main > article { + min-width: 0; + width: min(100%, var(--max-width-reading)); +} + +h1, +h2, +h3 { + font-family: var(--font-heading); + line-height: 1.15; + color: var(--color-heading); + text-wrap: balance; + letter-spacing: 0.01em; + font-weight: 700; +} + +h1 { + font-size: clamp(2rem, 4.2vw, 4rem); + text-transform: uppercase; +} + +h2 { + font-size: clamp(1.35rem, 2.2vw, 2rem); +} + +h3 { + font-size: clamp(1.05rem, 1.7vw, 1.35rem); +} + +main > article :is(strong, b) { + font-weight: 800; + color: var(--color-heading); + text-shadow: none; + background-image: linear-gradient( + to bottom, + color-mix(in srgb, var(--color-strong-highlight) 82%, var(--color-background-deep)) 0%, + color-mix(in srgb, var(--color-strong-highlight) 92%, var(--color-background-deep)) 100% + ); + background-size: 100% 1em; + background-position: 0 52%; + background-repeat: no-repeat; + padding: 0 0.12em; + box-decoration-break: clone; + -webkit-box-decoration-break: clone; +} + +p, +ul, +ol, +figure, +pre, +blockquote, +table, +section, +article, +aside, +nav, +details, +dl { + margin-top: var(--space-3); +} + +a { + color: var(--color-link); + text-decoration: underline; + text-decoration-thickness: 1px; + text-decoration-color: color-mix(in srgb, currentColor 72%, transparent); + text-underline-offset: 0.15em; + word-break: break-word; +} + +a:hover, +a:focus-visible { + color: var(--color-link-hover); + text-decoration-thickness: 2px; + text-decoration-color: currentColor; + text-underline-offset: 0.2em; +} + +a.link-external:not(.link-affiliated) { + color: var(--color-link-external); +} + +a.link-external:not(.link-affiliated):is(:hover, :focus-visible) { + color: var(--color-link-external-hover); +} + +a.link-affiliated { + color: var(--color-link-affiliated); +} + +a.link-affiliated:is(:hover, :focus-visible) { + color: var(--color-link-affiliated-hover); +} + +img, +video, +audio, +svg { + max-width: 100%; +} + +figure img { + display: block; +} + +time, +sub, +small { + color: var(--color-text-muted); +} + +hr { + border: 0; + border-top: 1px solid var(--color-border); + margin-top: var(--space-5); +} + +table { + width: 100%; + border-collapse: collapse; + font-size: 1.03rem; +} + +th, +td { + border: 1px solid var(--color-border); + padding: var(--space-2); + text-align: left; + vertical-align: top; +} + +thead th { + color: var(--color-heading); + background: rgba(255, 255, 255, 0.03); +} + +dt { + color: var(--color-text-muted); +} + +dd { + color: var(--color-heading); +} + +details > summary { + cursor: pointer; + color: var(--color-heading); +} + +/* Habillage commun des boutons contextuels (Sommaire, liens d'en-tête, oeuvres). */ +.ui-button { + list-style: none; + display: inline-flex; + align-items: center; + justify-content: center; + gap: var(--space-2); + min-height: 2.35rem; + padding: 0.45rem 0.85rem; + border: 1px solid var(--color-border-strong); + background: linear-gradient(180deg, rgba(118, 167, 215, 0.22) 0%, rgba(17, 27, 42, 0.9) 100%); + color: var(--color-heading); + text-decoration: none; + font-family: var(--font-heading); + font-size: 0.82rem; + text-transform: uppercase; + letter-spacing: 0.08em; + line-height: 1.2; + cursor: pointer; + user-select: none; +} + +.ui-button:is(:hover, :focus-visible) { + border-color: color-mix(in srgb, var(--color-accent-1) 62%, var(--color-border-strong)); + background: linear-gradient(180deg, rgba(118, 167, 215, 0.32) 0%, rgba(17, 27, 42, 0.96) 100%); + color: #ffffff; + text-decoration: none; +} + +a.ui-button:visited, +a.ui-button.link-external:not(.link-affiliated), +a.ui-button.link-affiliated { + color: var(--color-heading); +} + +.ui-button--vertical { + width: 2.25rem; + min-height: 7.2rem; + padding: 0; +} + +.ui-button--vertical > span { + display: inline-block; + transform: rotate(90deg); + white-space: nowrap; +} + +main > section, +main > aside, +main > article { + border-top: var(--border-width-regular) solid var(--color-border); + padding-top: var(--space-4); +} + +main > section:nth-of-type(3n+1) { + border-top-color: var(--color-section-divider-1); +} + +main > article { + border-top-color: var(--color-accent-1); +} + +main > section:nth-of-type(3n+2) { + border-top-color: var(--color-section-divider-2); +} + +main > section:nth-of-type(3n), +main > aside:last-child { + border-top-color: var(--color-section-divider-3); +} diff --git a/themes/2026/assets/css/content.css b/themes/2026/assets/css/content.css new file mode 100644 index 00000000..ba0de2e8 --- /dev/null +++ b/themes/2026/assets/css/content.css @@ -0,0 +1,1029 @@ +main > section > header, +main > aside > header { + display: flex; + flex-wrap: wrap; + align-items: baseline; + justify-content: space-between; + gap: var(--space-2); + margin-top: 0; +} + +main > section > header > h2, +main > aside > header > h2 { + text-transform: uppercase; + letter-spacing: 0.06em; + font-size: clamp(1.08rem, 1.8vw, 1.45rem); +} + +main > section > header > h2 > a, +main > aside > header > h2 > a { + color: inherit; + text-decoration: none; +} + +main > section > header > h2 > a:is(:hover, :focus-visible), +main > aside > header > h2 > a:is(:hover, :focus-visible) { + color: var(--color-link-hover); +} + +main > section > header > p, +main > aside > header > p { + width: 100%; + margin-top: 0; + color: var(--color-text-muted); + font-size: 1rem; +} + +main nav.articles-list { + margin-top: var(--space-3); +} + +main nav.articles-list > ol { + list-style: none; + display: grid; + grid-template-columns: repeat(auto-fit, minmax(17rem, 1fr)); + gap: var(--space-5) var(--space-4); +} + +main nav.articles-list article { + border-top: 1px solid var(--color-border); + padding-top: var(--space-3); + background: transparent; +} + +main nav.articles-list article > a { + text-decoration: none; + color: inherit; +} + +main nav.articles-list figure { + margin-top: 0; + min-height: 11rem; + background: linear-gradient(150deg, rgba(118, 167, 215, 0.12) 0%, rgba(93, 134, 173, 0.09) 50%, rgba(195, 208, 223, 0.08) 100%); + border: 1px solid var(--color-border); +} + +main nav.articles-list figure img { + width: 100%; + height: 100%; + object-fit: cover; +} + +main nav.articles-list h3 { + margin-top: var(--space-3); + font-size: clamp(1.22rem, 2.1vw, 1.65rem); +} + +main nav.articles-list h3 > a { + color: inherit; + text-decoration: none; +} + +main nav.articles-list article > a:is(:hover, :focus-visible) > h3, +main nav.articles-list article > header > h3 > a:is(:hover, :focus-visible), +main nav.articles-list article:has(> header > a:is(:hover, :focus-visible)) > header > h3 > a { + color: var(--color-link-hover); + text-decoration: underline; + text-decoration-thickness: 1px; + text-underline-offset: 0.15em; +} + +main nav.articles-list article > p:last-child { + display: flex; + flex-wrap: wrap; + gap: var(--space-2); + font-size: 0.9rem; + color: var(--color-text-muted); + text-transform: uppercase; + letter-spacing: 0.04em; +} + +body > main:has(> article:first-child):has(> aside) { + grid-template-columns: minmax(0, 1.65fr) minmax(18rem, 0.95fr); + align-items: start; + column-gap: var(--space-6); +} + +body:has(> header.article-header) > main:has(> article:first-child):has(> aside.article-toc) { + grid-template-columns: minmax(0, 1fr); +} + +body:has(> header.article-header) > main:has(> article:first-child):has(> aside.article-toc) > article:first-child { + width: min(100%, var(--max-width-reading)); + max-width: var(--max-width-reading); + margin-inline: auto; +} + +body > main:has(> article:first-child):has(> aside) > article:first-child { + max-width: none; + width: 100%; + font-size: var(--font-size-reading); + line-height: 1.85; +} + +body > main:has(> article:first-child):has(> aside) > article:first-child > :not(figure):not(table):not(pre):not(.highlight):not(section.article-books) { + max-width: 74ch; +} + +body > main:has(> article:first-child):has(> aside) > article:first-child > figure.figure-media { + max-width: none; + width: 100%; + margin-inline: auto; +} + +body > main:has(> article:first-child):has(> aside) > article:first-child > :is(h3, h4, h5, h6) { + max-width: 34ch; +} + +body > main:has(> article:first-child):has(> aside) > aside { + margin-top: 0; + border-top: 0; + padding-top: 0; + display: grid; + gap: var(--space-4); + align-content: start; +} + +body > main:has(> article:first-child):has(> aside) > aside > section, +body > main:has(> article:first-child):has(> aside) > aside > nav { + margin-top: 0; + border-top: 1px solid var(--color-border); + padding-top: var(--space-3); +} + +body > main:has(> article:first-child):has(> aside) > aside > section > h2, +body > main:has(> article:first-child):has(> aside) > aside > nav h2, +body > main:has(> article:first-child):has(> aside) > aside > section > article > h2 { + margin-top: 0; + font-size: 1.02rem; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +body > main:has(> article:first-child):has(> aside) > aside > section > article > p, +body > main:has(> article:first-child):has(> aside) > aside > section > p, +body > main:has(> article:first-child):has(> aside) > aside > nav > p { + font-size: 1rem; + line-height: 1.65; +} + +body > main:has(> article:first-child):has(> aside) > aside > section figure { + margin-top: 0; +} + +main > article { + --article-feature-block-margin: calc(var(--space-5) * 2); + border-top-width: var(--border-width-regular); +} + +body:has(> header.article-header) > main > article { + border-top: 0; + padding-top: 0; + margin-inline: auto; +} + +/* Titres de sections dans le corps d'article : + alignés avec la sobriété des en-têtes de blocs de l'accueil. */ +main > article :is(h2, h3, h4, h5, h6) { + --article-heading-accent: var(--color-accent-1); + --article-heading-rule-width: clamp(13rem, 42vw, 18rem); + margin-top: var(--space-6); + margin-bottom: 0; + padding-top: calc(var(--space-3) + 0.15rem); + position: relative; + line-height: 1.2; + text-wrap: balance; + font-family: var(--font-heading); + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.06em; + color: var(--color-heading); +} + +main > article img { + background-color: #ffffff; +} + +main > article :is(h2, h3, h4, h5, h6)::before { + content: ""; + position: absolute; + inset-block-start: 0; + inset-inline-start: 0; + width: min(100%, var(--article-heading-rule-width)); + border-top: var(--border-width-regular) solid color-mix(in srgb, var(--article-heading-accent) 65%, var(--color-border)); +} + +main > article h2 { + --article-heading-accent: var(--color-accent-1); + --article-heading-rule-width: 100%; + margin-top: calc(var(--article-feature-block-margin) * 2); + font-size: clamp(1.55rem, 2.55vw, 2.15rem); + color: color-mix(in srgb, var(--color-accent-1) 18%, var(--color-heading)); +} + +body:has(> header.article-header) > main > article > h2:first-child { + margin-top: 0; +} + +main > article h3 { + --article-heading-accent: var(--color-section-divider-1); + font-size: clamp(1.36rem, 2.08vw, 1.8rem); + color: color-mix(in srgb, var(--color-section-divider-1) 34%, var(--color-heading)); +} + +main > article h4 { + --article-heading-accent: var(--color-section-divider-2); + font-size: clamp(1.2rem, 1.82vw, 1.5rem); + color: color-mix(in srgb, var(--color-section-divider-2) 22%, var(--color-heading)); +} + +main > article h5 { + --article-heading-accent: var(--color-border-strong); + font-size: clamp(1.08rem, 1.5vw, 1.28rem); +} + +main > article h6 { + --article-heading-accent: var(--color-border-strong); + font-size: clamp(1rem, 1.3vw, 1.16rem); +} + +main > article h2 + :is(h3, h4, h5, h6), +main > article h3 + :is(h4, h5, h6), +main > article h4 + :is(h5, h6), +main > article h5 + h6 { + margin-top: var(--space-5); +} + +main > article > p { + text-align: justify; +} + +main > article ul, +main > article ol { + padding-left: 1.3rem; +} + +main > article li + li { + margin-top: 0.35rem; +} + +main > article > footer.article-footer { + margin-top: var(--space-6); + border-top: 1px solid var(--color-border); + padding-top: var(--space-4); +} + +main > article > footer.article-footer > nav.article-footer-dossier-nav { + margin-top: 0; + border-left: var(--border-width-regular) solid var(--color-accent-2); + padding-left: var(--space-3); +} + +main > article > footer.article-footer > nav.article-footer-dossier-nav > p.article-footer-dossier-nav-label { + margin-top: 0; + display: flex; + flex-wrap: wrap; + align-items: baseline; + gap: var(--space-1); + font-family: var(--font-heading); +} + +main > article > footer.article-footer > nav.article-footer-dossier-nav > p.article-footer-dossier-nav-label > span { + font-size: 0.76rem; + text-transform: uppercase; + letter-spacing: 0.07em; + color: var(--color-text-muted); +} + +main > article > footer.article-footer > nav.article-footer-dossier-nav > p.article-footer-dossier-nav-label > strong { + font-size: 0.9rem; + color: var(--color-heading); + letter-spacing: 0.04em; +} + +main > article > footer.article-footer > nav.article-footer-dossier-nav > div.article-footer-dossier-nav-links { + margin-top: var(--space-2); + display: grid; + grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr)); + gap: var(--space-3); +} + +main > article > footer.article-footer > nav.article-footer-dossier-nav > div.article-footer-dossier-nav-links > p.article-footer-dossier-nav-link { + margin-top: 0; + border-top: 1px solid var(--color-border); + padding-top: var(--space-2); + display: flex; + flex-direction: column; + gap: 0.2rem; +} + +main > article > footer.article-footer > nav.article-footer-dossier-nav > div.article-footer-dossier-nav-links > p.article-footer-dossier-nav-link > span { + font-family: var(--font-heading); + font-size: 0.74rem; + text-transform: uppercase; + letter-spacing: 0.07em; + color: var(--color-text-muted); +} + +main > article > footer.article-footer > nav.article-footer-dossier-nav > div.article-footer-dossier-nav-links > p.article-footer-dossier-nav-link > a { + color: var(--color-heading); + text-decoration: underline; + text-decoration-thickness: 1px; + text-underline-offset: 0.15em; + line-height: 1.3; +} + +main > article > footer.article-footer > nav.article-footer-dossier-nav > div.article-footer-dossier-nav-links > p.article-footer-dossier-nav-link > a:is(:hover, :focus-visible) { + color: var(--color-link-hover); +} + +main > article > footer.article-footer > nav.article-footer-dossier-nav > div.article-footer-dossier-nav-links > p.article-footer-dossier-nav-link-prev > span::before { + content: "← "; +} + +main > article > footer.article-footer > nav.article-footer-dossier-nav > div.article-footer-dossier-nav-links > p.article-footer-dossier-nav-link-next > span::after { + content: " →"; +} + +main > article blockquote { + border-left: var(--border-width-regular) solid var(--color-accent-2); + padding-left: var(--space-3); + color: var(--color-text-muted); +} + +main > article pre { + background: rgba(0, 0, 0, 0.35); + border: 1px solid var(--color-border); +} + +main > article code:not(pre code) { + color: var(--color-text-muted); + background: rgba(0, 0, 0, 0.35); + border: 1px solid var(--color-border); + padding: 0.05rem 0.3rem; +} + +main > article pre { + padding: var(--space-3); + max-height: 90vh; + overflow: auto; + font-size: 0.92rem; + line-height: 1.5; +} + +main > article > :is(pre, .highlight) { + margin-block: var(--article-feature-block-margin); +} + +main > article > .highlight { + width: max-content; + min-width: 100%; + max-width: 100%; +} + +main > article > .highlight > pre { + margin-block: 0; +} + +main > article pre > code { + color: inherit; + background: transparent; + border: 0; + padding: 0; + font-size: inherit; + line-height: inherit; +} + +main > article > table { + margin-block: var(--article-feature-block-margin); + width: max-content; + min-width: 100%; + max-width: 100%; + border-collapse: collapse; + border-spacing: 0; + border: 1px solid color-mix(in srgb, var(--color-section-divider-1) 46%, #5f3f1a); + border-radius: 0; + background: linear-gradient(180deg, rgba(37, 23, 10, 0.82) 0%, rgba(15, 10, 6, 0.9) 100%); + color: var(--color-text); +} + +main > article > table :is(th, td) { + border: 1px solid color-mix(in srgb, var(--color-section-divider-3) 36%, #4e3218); + padding: 0.55rem 0.72rem; + vertical-align: top; +} + +main > article > table thead th { + background: linear-gradient(180deg, rgba(148, 96, 25, 0.52) 0%, rgba(83, 52, 14, 0.74) 100%); + color: #fff3d8; + font-family: var(--font-heading); + font-size: 0.82rem; + text-transform: uppercase; + letter-spacing: 0.05em; +} + +main > article > table tbody tr:nth-child(odd) td { + background: rgba(24, 14, 7, 0.62); +} + +main > article > table tbody tr:nth-child(even) td { + background: rgba(255, 186, 85, 0.06); +} + +main > article > section.article-books { + margin-block: var(--article-feature-block-margin); +} + +main > article > section.article-books > header { + margin-top: 0; + display: flex; + flex-wrap: wrap; + align-items: baseline; + justify-content: space-between; + gap: var(--space-2); +} + +main > article > section.article-books > header > h2 { + margin-top: 0; + margin-bottom: 0; + padding-top: 0; + line-height: 1.15; + position: static; + font-size: clamp(1.08rem, 1.8vw, 1.45rem); + text-transform: uppercase; + letter-spacing: 0.06em; + color: var(--color-heading); +} + +main > article > section.article-books > header > h2::before { + content: none; +} + +main > article > section.article-books > header > p { + width: 100%; + margin-top: var(--space-2); + border-left: var(--border-width-regular) solid var(--color-accent-2); + padding: 0.62rem 0.9rem; + background: linear-gradient(90deg, rgba(93, 134, 173, 0.16) 0%, rgba(93, 134, 173, 0.04) 100%); + color: var(--color-heading); + font-size: clamp(1.08rem, 0.98rem + 0.45vw, 1.28rem); + font-weight: 400; + line-height: 1.3; + text-align: center; +} + +main > article > section.article-books > div { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(18rem, 22rem)); + justify-content: center; + gap: var(--space-5); + margin-top: var(--space-3); +} + +main > article > section.article-books > div > section { + margin-top: 0; + width: 100%; + max-width: 22rem; +} + +main > article > section.article-books > div > section > article { + display: flex; + flex-direction: column; + margin-top: 0; + border-top: var(--border-width-regular) solid var(--color-border-strong); + padding-top: var(--space-3); + background: var(--color-surface-soft); + padding-inline: var(--space-3); + padding-bottom: var(--space-3); +} + +main > article > section.article-books > div > section:nth-child(2n+1) > article { + border-top-color: var(--color-accent-2); +} + +main > article > section.article-books > div > section:nth-child(2n) > article { + border-top-color: var(--color-accent-3); +} + +main > article > section.article-books > div > section figure { + margin-top: 0; + width: min(13rem, 100%); + align-self: center; + aspect-ratio: 2 / 3; + border: 1px solid var(--color-border); + background: rgba(255, 255, 255, 0.02); + min-height: 0; + overflow: hidden; +} + +main > article > section.article-books > div > section figure img { + width: 100%; + height: 100%; + object-fit: cover; +} + +main > article > section.article-books > div > section h2 { + margin-top: var(--space-3); + margin-bottom: 0; + padding-top: 0; + position: static; + line-height: 1.2; + font-size: clamp(1.12rem, 1.8vw, 1.38rem); + text-transform: none; + letter-spacing: 0.01em; + color: var(--color-heading); + text-align: center; +} + +main > article > section.article-books > div > section h2::before { + content: none; +} + +main > article > section.article-books > div > section p { + margin-top: 0; + font-size: 1rem; +} + +main > article > section.article-books > div > section p:last-child { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: var(--space-2); + margin-top: var(--space-3); +} + +main > article > section.article-books > div > section p:last-child > a.ui-button { + width: 100%; + min-height: 2.35rem; + border-color: color-mix(in srgb, var(--color-link-external) 58%, var(--color-border-strong)); + background: linear-gradient( + 180deg, + color-mix(in srgb, var(--color-link-external) 38%, var(--color-background-alt)) 0%, + color-mix(in srgb, var(--color-link-external) 12%, var(--color-background-alt)) 100% + ); +} + +main > article > section.article-books > div > section p:last-child > a.ui-button:is(:hover, :focus-visible) { + border-color: color-mix(in srgb, var(--color-link-external-hover) 70%, var(--color-border-strong)); + background: linear-gradient( + 180deg, + color-mix(in srgb, var(--color-link-external-hover) 44%, var(--color-background-alt)) 0%, + color-mix(in srgb, var(--color-link-external) 18%, var(--color-background-alt)) 100% + ); +} + +main > article > dl { + margin-block: var(--article-feature-block-margin); + padding-block: var(--space-3) var(--space-2); + border-top: var(--border-width-regular) solid color-mix(in srgb, var(--color-section-divider-1) 62%, var(--color-section-divider-3)); + border-bottom: 1px solid color-mix(in srgb, var(--color-border-strong) 72%, transparent); + display: grid; + grid-template-columns: minmax(13rem, 0.9fr) minmax(0, 2.1fr); + column-gap: var(--space-4); + row-gap: var(--space-2); + background: linear-gradient(90deg, rgba(217, 122, 63, 0.08) 0%, rgba(217, 122, 63, 0) 42%); +} + +main > article > dl > dt { + margin: 0; + grid-column: 1; + align-self: stretch; + display: flex; + align-items: center; + padding-left: var(--space-2); + font-family: var(--font-heading); + font-size: 0.84rem; + text-transform: uppercase; + letter-spacing: 0.06em; + line-height: 1.35; + color: color-mix(in srgb, var(--color-section-divider-1) 55%, var(--color-heading)); +} + +main > article > dl > dd { + margin: 0; + grid-column: 2; + padding-left: var(--space-3); + border-left: var(--border-width-regular) solid color-mix(in srgb, var(--color-section-divider-3) 65%, var(--color-border)); + font-size: 1.03rem; + line-height: 1.6; + color: var(--color-text); +} + +main > article > dl > dd + dt, +main > article > dl > dd + dt + dd { + margin-top: var(--space-1); + padding-top: var(--space-2); + border-top: 1px solid color-mix(in srgb, var(--color-border-strong) 55%, transparent); +} + +body:has(> header.article-header) > main > article > pre { + max-width: none; + width: min(calc(100vw - (2 * var(--space-2))), var(--max-width)); + margin-inline: 0; + margin-left: 50%; + transform: translateX(-50%); +} + +body:has(> header.article-header) > main > article > .highlight { + max-width: min(calc(100vw - (2 * var(--space-2))), var(--max-width)); + margin-inline: 0; + margin-left: 50%; + transform: translateX(-50%); +} + +body:has(> header.article-header) > main > article > table { + max-width: min(calc(100vw - (2 * var(--space-2))), var(--max-width)); + margin-inline: 0; + margin-left: 50%; + transform: translateX(-50%); +} + +body:has(> header.article-header) > main > article > section.article-books { + width: min(calc(100vw - (2 * var(--space-2))), var(--max-width)); + max-width: min(calc(100vw - (2 * var(--space-2))), var(--max-width)); + margin-inline: 0; + margin-left: 50%; + transform: translateX(-50%); +} + +main > article figure { + margin-block: var(--article-feature-block-margin); + padding-top: 0; +} + +main > article figure.figure-media { + --figure-media-column: 1; + --figure-meta-column: 2; + --figure-media-justify: end; + display: grid; + grid-template-columns: minmax(0, 1.7fr) minmax(0, 1fr); + gap: var(--space-3) var(--space-6); + align-items: stretch; +} + +main > article > figure.figure-media.figure-media-with-meta:nth-of-type(odd) { + --figure-media-column: 2; + --figure-meta-column: 1; + --figure-media-justify: start; + grid-template-columns: minmax(0, 1fr) minmax(0, 1.7fr); +} + +main > article > figure.figure-media.figure-media-with-meta:nth-of-type(odd) > figcaption.figure-media-meta { + text-align: right; + border-left: 0; + padding-left: 0; + border-right: 1px solid var(--color-border-strong); + padding-right: var(--space-6); +} + +main > article figure.figure-media > :is(video, img, a) { + grid-column: var(--figure-media-column); + grid-row: 1; + justify-self: var(--figure-media-justify); + margin: 0; + max-width: 100%; +} + +main > article figure.figure-media > a, +main > article figure.figure-media > img, +main > article figure.figure-media > video { + display: block; + width: fit-content; + max-width: 100%; +} + +main > article figure.figure-media > a > img, +main > article figure.figure-media > img, +main > article figure.figure-media > video { + display: block; + width: auto; + max-width: 100%; + max-height: 90vh; + height: auto; + object-fit: contain; +} + +main > article figure > a { + display: block; +} + +main > article figure.figure-media.figure-media-without-meta { + grid-template-columns: minmax(0, 1fr); + --figure-media-justify: center; +} + +main > article figure.figure-media.figure-media-without-meta > :is(video, img, a) { + grid-column: 1; +} + +main > article figure.figure-media > figcaption.figure-media-meta { + grid-column: var(--figure-meta-column); + grid-row: 1; + margin-top: 0; + border-left: 1px solid var(--color-border-strong); + padding-left: var(--space-6); + display: flex; + flex-direction: column; + min-height: 100%; + gap: var(--space-2); +} + +main > article figure.figure-media > figcaption.figure-media-meta > .figure-media-meta-main { + margin-top: 0; + display: flex; + flex-direction: column; + gap: var(--space-2); +} + +main > article figure.figure-media > figcaption.figure-media-meta > .figure-media-meta-extra { + margin-top: auto; + display: flex; + flex-direction: column; + gap: var(--space-2); +} + +main > article figure.figure-media > figcaption.figure-media-meta > .figure-media-meta-extra > p.cover-attribution { + border-top: var(--border-width-regular) solid var(--color-accent-2); + padding-top: var(--space-4); +} + +main > article figure.figure-media > figcaption.figure-media-meta p { + margin-top: 0; +} + +main > article > figure.figure-media.figure-media-with-meta:nth-of-type(odd) > figcaption.figure-media-meta > .figure-media-meta-extra > p.cover-attribution { + justify-content: flex-end; +} + +main > article figure.figure-media > figcaption.figure-media-meta > .figure-media-meta-extra > details { + margin-top: 0; +} + +main > article figure:not(.figure-media) figcaption p { + margin-top: 0; + color: var(--color-text-muted); + font-size: 1.02rem; +} + +aside section > p:first-of-type { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: var(--space-3); +} + +aside section > p:first-of-type img { + width: 3rem; + height: 3rem; +} + +aside section dl { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr)); + gap: var(--space-2); +} + +aside section dl > div { + border-top: 1px solid var(--color-border); + padding-top: var(--space-2); +} + +body:has(> header.article-header) > main > aside.article-toc { + position: fixed; + inset-inline-end: var(--space-2); + inset-block-start: 50%; + transform: translateY(-50%); + z-index: 30; + margin-top: 0; + border-top: 0; + padding-top: 0; + display: flex; + flex-direction: column; + gap: var(--space-4); + align-items: flex-end; +} + +body:has(> header.article-header) > main > aside.article-toc > details.article-toc-drawer { + position: relative; +} + +body:has(> header.article-header) > main > aside.article-toc > details.article-toc-drawer > summary { + list-style: none; + width: 2.25rem; + min-height: 7.2rem; +} + +body:has(> header.article-header) > main > aside.article-toc > details.article-toc-drawer > summary::-webkit-details-marker { + display: none; +} + +body:has(> header.article-header) > main > aside.article-toc > details.article-toc-drawer > summary > span { + color: var(--color-heading); +} + +body:has(> header.article-header) > main > aside.article-toc > details.article-toc-drawer > .article-toc-drawer-panel { + position: absolute; + inset-inline-end: calc(100% + var(--space-2)); + inset-block-start: 50%; + transform: translateY(-50%); + width: min(22rem, 76vw); + max-height: min(72vh, 44rem); + overflow-y: auto; + overflow-x: hidden; + overscroll-behavior: contain; + scrollbar-gutter: stable both-edges; + border: 1px solid var(--color-border-strong); + background: rgba(6, 12, 20, 0.96); + padding: var(--space-3); +} + +body:has(> header.article-header) > main > aside.article-toc > details.article-toc-drawer:not([open]) > .article-toc-drawer-panel { + display: none; +} + +body:has(> header.article-header) > main > aside.article-toc > details.article-toc-drawer-dossier > .article-toc-drawer-panel { + width: min(19rem, 70vw); + padding-top: var(--space-1); +} + +body:has(> header.article-header) > main > aside.article-toc > details.article-toc-drawer > .article-toc-drawer-panel > h2, +body:has(> header.article-header) > main > aside.article-toc nav[aria-label="Sommaire du dossier"] > p > strong { + margin-top: 0; + font-family: var(--font-heading); + font-size: 0.86rem; + text-transform: uppercase; + letter-spacing: 0.07em; + color: var(--color-heading); +} + +body:has(> header.article-header) > main > aside.article-toc .article-toc-list { + margin-top: var(--space-2); +} + +body:has(> header.article-header) > main > aside.article-toc .article-toc-list ol, +body:has(> header.article-header) > main > aside.article-toc nav[aria-label="Sommaire du dossier"] > ol { + list-style: none; + margin: 0; + padding-left: 0; +} + +body:has(> header.article-header) > main > aside.article-toc .article-toc-list > ol > li + li, +body:has(> header.article-header) > main > aside.article-toc nav[aria-label="Sommaire du dossier"] > ol > li + li { + margin-top: var(--space-1); +} + +body:has(> header.article-header) > main > aside.article-toc .article-toc-list li > ol { + margin-top: var(--space-1); + margin-left: var(--space-2); + padding-left: var(--space-2); + border-left: 1px solid var(--color-border-strong); +} + +body:has(> header.article-header) > main > aside.article-toc .article-toc-list a, +body:has(> header.article-header) > main > aside.article-toc nav[aria-label="Sommaire du dossier"] > ol :is(a, strong) { + display: block; + color: var(--color-text-muted); + text-decoration: none; + font-size: 0.8rem; + line-height: 1.35; + letter-spacing: 0.01em; +} + +body:has(> header.article-header) > main > aside.article-toc .article-toc-list li > ol a { + font-size: 0.76rem; +} + +body:has(> header.article-header) > main > aside.article-toc .article-toc-list a:is(:hover, :focus-visible), +body:has(> header.article-header) > main > aside.article-toc nav[aria-label="Sommaire du dossier"] a:is(:hover, :focus-visible) { + color: var(--color-link-hover); + text-decoration: underline; +} + +body:has(> header.article-header) > main > aside.article-toc nav[aria-label="Sommaire du dossier"] > ol > li > a { + color: #d9e3ef; + text-decoration: underline; + text-decoration-color: rgba(217, 227, 239, 0.38); + text-underline-offset: 0.14em; +} + +body:has(> header.article-header) > main > aside.article-toc nav[aria-label="Sommaire du dossier"] > ol > li > a:is(:hover, :focus-visible) { + color: var(--color-link-hover); + text-decoration-color: currentColor; +} + +body:has(> header.article-header) > main > aside.article-toc nav[aria-label="Sommaire du dossier"] > ol > li > strong { + color: #ffffff; + text-decoration: none; + font-weight: 700; +} + +body:has(> header.article-header) > main > aside.article-toc nav[aria-label="Sommaire du dossier"] > p { + margin-top: 0; +} + +body:has(> header.article-header) > main > aside.article-toc nav[aria-label="Sommaire du dossier"] { + margin-top: 0; +} + +@media (min-width: 1101px) { + body > main:has(> article:first-child):has(> aside) > article:first-child > figure.figure-media { + width: min(calc(100vw - (2 * var(--space-2))), var(--max-width)); + margin-inline: 0; + margin-left: 50%; + transform: translateX(-50%); + } +} + +@media (max-width: 1100px) { + body:has(> header.article-header) > main > article > table { + width: 100%; + max-width: 100%; + margin-inline: 0; + margin-left: 0; + transform: none; + table-layout: fixed; + } + + body:has(> header.article-header) > main > article > table :is(th, td) { + overflow-wrap: anywhere; + word-break: break-word; + } + + main > article > dl { + grid-template-columns: minmax(0, 1fr); + row-gap: var(--space-1); + background: linear-gradient(180deg, rgba(217, 122, 63, 0.08) 0%, rgba(217, 122, 63, 0) 40%); + } + + main > article > dl > :is(dt, dd) { + grid-column: 1; + } + + main > article > dl > dd { + padding-left: var(--space-2); + } + + main > article figure.figure-media { + --figure-media-justify: start; + grid-template-columns: minmax(0, 1fr); + gap: var(--space-2); + } + + main > article > figure.figure-media.figure-media-with-meta:nth-of-type(odd) { + --figure-media-column: 1; + --figure-meta-column: 1; + --figure-media-justify: start; + grid-template-columns: minmax(0, 1fr); + } + + main > article figure.figure-media > :is(video, img, a), + main > article figure.figure-media > figcaption.figure-media-meta { + grid-column: 1; + grid-row: auto; + } + + main > article figure.figure-media > figcaption.figure-media-meta { + min-height: 0; + border-left: 0; + border-right: 0; + padding-left: 0; + padding-right: 0; + } + + main > article figure.figure-media > figcaption.figure-media-meta > .figure-media-meta-extra { + margin-top: 0; + } + + main > article > figure.figure-media.figure-media-with-meta:nth-of-type(odd) > figcaption.figure-media-meta { + text-align: left; + } + + main > article > figure.figure-media.figure-media-with-meta:nth-of-type(odd) > figcaption.figure-media-meta > .figure-media-meta-extra > p.cover-attribution { + justify-content: flex-start; + } + + body:has(> header.article-header) > main > aside.article-toc { + inset-inline-end: var(--space-1); + gap: var(--space-3); + } + + body:has(> header.article-header) > main > aside.article-toc > details.article-toc-drawer > summary.ui-button--vertical { + width: 2rem; + min-height: 6.1rem; + } + + body:has(> header.article-header) > main > aside.article-toc > details.article-toc-drawer > .article-toc-drawer-panel { + width: min(20rem, calc(100vw - 4.2rem)); + max-height: min(70vh, 34rem); + } +} + +main section > ul, +main section > ol { + padding-left: 1.25rem; +} + +main section > ul li, +main section > ol li { + margin-top: 0.25rem; +} diff --git a/themes/2026/assets/css/footer.css b/themes/2026/assets/css/footer.css new file mode 100644 index 00000000..7567239e --- /dev/null +++ b/themes/2026/assets/css/footer.css @@ -0,0 +1,161 @@ +body > footer { + --color-footer-text: #c6d2e0; + --color-footer-muted: #95a4b8; + --color-footer-soft: #8796aa; + display: grid; + gap: var(--space-2); + border-top: 0; + padding: var(--space-3) var(--space-3) var(--space-4); + background: var(--color-footer-background); + text-align: center; +} + +body > footer > * { + margin-top: 0; +} + +body > footer h2 { + margin-top: 0; + text-transform: uppercase; + letter-spacing: 0.08em; + font-size: 0.82rem; + color: var(--color-footer-soft); +} + +body > footer > nav { + margin-top: 0; +} + +body > footer > nav > ul { + list-style: none; + display: grid; + grid-template-columns: 1fr; + gap: 0.35rem; +} + +body > footer > nav > ul > li { + display: flex; + flex-wrap: wrap; + align-items: baseline; + justify-content: center; + gap: 0.15rem 0.65rem; + padding-top: 0; +} + +body > footer > nav h2 a, +body > footer > nav h2 span { + text-decoration: none; + color: var(--color-footer-muted); + font-size: 0.78rem; +} + +body > footer > nav ul ul { + list-style: none; + display: flex; + flex-wrap: wrap; + justify-content: center; + row-gap: 0.15rem; + column-gap: 0; + margin-top: 0; +} + +body > footer > nav ul ul a, +body > footer > nav ul ul span { + color: var(--color-footer-muted); + text-decoration: none; + font-size: 0.84rem; + line-height: 1.25; +} + +body > footer > nav ul ul > li { + display: inline-flex; + align-items: center; +} + +body > footer > nav ul ul a:is(:hover, :focus-visible) { + color: var(--color-link-hover); + text-decoration: underline; +} + +body > footer > nav ul ul > li + li::before { + content: "•"; + margin-inline: 0.45rem; + color: var(--color-border-strong); +} + +body > footer > section:nth-of-type(1) { + margin-top: 0; +} + +body > footer > section:nth-of-type(1) > dl { + margin-top: 0.2rem; + display: grid; + grid-template-columns: 1fr; + gap: 0; +} + +body > footer > section:nth-of-type(1) > dl > div { + margin-top: 0; + border-left: 0; + padding-left: 0; + text-align: center; +} + +body > footer > section:nth-of-type(1) dt { + text-transform: uppercase; + letter-spacing: 0.05em; + font-size: 0.72rem; + color: var(--color-footer-soft); +} + +body > footer > section:nth-of-type(1) dd { + margin-top: 0.2rem; + color: var(--color-footer-text); + font-size: 0.88rem; + line-height: 1.3; +} + +body > footer > section:nth-of-type(1) dd > a { + color: inherit; + text-decoration: none; +} + +body > footer > section:nth-of-type(1) dd > a:is(:hover, :focus-visible) { + color: var(--color-link-hover); + text-decoration: underline; +} + +body > footer > section:nth-of-type(1) dd > time { + display: block; + margin-top: 0.2rem; + color: var(--color-footer-soft); + font-size: 0.72rem; + text-transform: uppercase; + letter-spacing: 0.04em; +} + +body > footer > p { + margin-top: var(--space-1); + border-top: 1px solid var(--color-border); + padding-top: var(--space-2); + color: var(--color-footer-soft); + font-size: 0.8rem; +} + +body > footer > p > span { + display: block; +} + +body > footer > p > span + span { + margin-top: 0.25rem; +} + +body > footer > p a { + color: var(--color-footer-text); + text-decoration: none; +} + +body > footer > p a:is(:hover, :focus-visible) { + color: var(--color-link-hover); + text-decoration: underline; +} diff --git a/themes/2026/assets/css/header.css b/themes/2026/assets/css/header.css new file mode 100644 index 00000000..f6266b12 --- /dev/null +++ b/themes/2026/assets/css/header.css @@ -0,0 +1,218 @@ +body > header { + position: relative; + padding-bottom: var(--space-5); +} + +body > header:has(> h1) { + display: grid; + gap: var(--space-3); + padding-bottom: var(--space-6); +} + +body > header:has(> h1)::before { + content: ""; + width: min(18rem, 40vw); + height: 0.55rem; + background: + linear-gradient(90deg, var(--color-accent-1) 0%, var(--color-accent-2) 50%, var(--color-accent-3) 100%); +} + +body > header > section:first-of-type { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: var(--space-3); +} + +body > header > section:first-of-type > a { + display: inline-flex; + align-items: center; + gap: var(--space-3); + text-decoration: none; + color: var(--color-heading); +} + +body > header > section:first-of-type > a strong { + font-family: var(--font-heading); + font-size: clamp(1.6rem, 3vw, 2.3rem); + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.03em; +} + +body > header > section:first-of-type > a img { + width: 3.5rem; + height: auto; +} + +body > header > section.site-stats { + margin-top: var(--space-5); +} + +body > header > section.site-stats > h2 { + font-size: 1.02rem; + letter-spacing: 0.11em; + text-transform: uppercase; + color: var(--color-text-muted); +} + +body > header > section.site-stats > ul { + list-style: none; + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: var(--space-4); +} + +body > header > section.site-stats li { + border-top: 1px solid var(--color-border); + padding-top: var(--space-2); +} + +body > header > section.site-stats span { + display: block; + font-size: 0.88rem; + letter-spacing: 0.06em; + text-transform: uppercase; + color: var(--color-text-muted); +} + +body > header > section.site-stats strong { + display: block; + margin-top: var(--space-1); + font-size: 1.38rem; + color: var(--color-heading); + font-family: var(--font-heading); +} + +body > header .breadcrumbs { + margin-top: 0; +} + +.breadcrumbs > ol { + list-style: none; + display: flex; + flex-wrap: wrap; + gap: var(--space-2); +} + +.breadcrumbs li { + display: inline-flex; + align-items: center; + gap: var(--space-2); + color: var(--color-text-muted); + font-size: 0.9rem; + letter-spacing: 0.04em; + text-transform: uppercase; +} + +.breadcrumbs li::after { + content: ">"; + color: var(--color-border-strong); +} + +.breadcrumbs li:last-child::after { + content: ""; +} + +body > header > p { + margin-top: var(--space-2); + color: var(--color-text-muted); + display: flex; + flex-wrap: wrap; + gap: var(--space-2); + font-size: 1rem; +} + +body > header:has(> h1) > h1 { + max-width: 18ch; + margin-top: 0; + font-size: clamp(2rem, 5.4vw, 4.6rem); + line-height: 0.95; + letter-spacing: 0.02em; +} + +body > header:has(> h1) > p:has(time) { + margin-top: 0; + display: flex; + flex-wrap: wrap; + gap: var(--space-2); + font-size: 0.88rem; + text-transform: uppercase; + letter-spacing: 0.09em; + color: var(--color-text-muted); +} + +body > header:has(> h1) > p:not(:has(time)) { + margin-top: var(--space-1); + max-width: 64ch; + font-size: 1.14rem; + color: var(--color-text); +} + +.page-links > ul { + list-style: none; + display: flex; + flex-wrap: wrap; + gap: var(--space-2); +} + +.page-links a { + display: inline-block; + text-decoration: none; + border: 1px solid var(--color-border); + padding: 0.35rem 0.65rem; + color: var(--color-text); + font-size: 0.94rem; + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.page-links a:hover { + color: var(--color-heading); + border-color: var(--color-accent-1); +} + +.page-links a.ui-button { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 2.35rem; + padding: 0.45rem 0.85rem; + border: 1px solid var(--color-border-strong); + color: var(--color-heading); + font-family: var(--font-heading); + font-size: 0.82rem; + text-transform: uppercase; + letter-spacing: 0.08em; + line-height: 1.2; +} + +.page-links a.ui-button:is(:hover, :focus-visible) { + border-color: color-mix(in srgb, var(--color-accent-1) 62%, var(--color-border-strong)); + color: #ffffff; +} + +body:has(> main.listing-page) > header { + gap: var(--space-2); + padding-bottom: var(--space-4); +} + +body:has(> main.listing-page) > header:has(> h1)::before { + content: none; +} + +body:has(> main:not(.listing-page)) > header:has(> h1)::before { + content: none; +} + +body:has(> main.listing-page) > header:has(> h1) > h1 { + max-width: 100%; + font-size: clamp(1.75rem, 3.1vw, 2.8rem); + text-transform: none; + letter-spacing: 0.01em; +} + +body:has(> main.listing-page) > header .breadcrumbs li { + font-size: 0.84rem; + letter-spacing: 0.03em; +} diff --git a/themes/2026/assets/css/home.css b/themes/2026/assets/css/home.css new file mode 100644 index 00000000..f6400062 --- /dev/null +++ b/themes/2026/assets/css/home.css @@ -0,0 +1,948 @@ +body > main.home-main > section.home-critiques-category { + border-top-color: var(--color-border); +} + +body > main > section > header > h2 > a, +body > main.home-main:has(> section.home-spotlight > div.spotlight > article) > aside.home-watch > header > h2 > a, +body > main.home-main > section.home-collections.collections-section > div > article > h3 > a { + color: var(--color-heading); + text-decoration: underline; + text-decoration-thickness: 1px; + text-underline-offset: 0.15em; +} + +body > main > section > header > h2 > a:is(:hover, :focus-visible), +body > main.home-main:has(> section.home-spotlight > div.spotlight > article) > aside.home-watch > header > h2 > a:is(:hover, :focus-visible), +body > main.home-main > section.home-collections.collections-section > div > article > h3 > a:is(:hover, :focus-visible) { + color: var(--color-link-hover); +} + +body > main > section > div.spotlight { + display: grid; + grid-template-columns: minmax(0, 1.7fr) minmax(0, 1fr); + gap: var(--space-6); + margin-top: var(--space-4); +} + +body > main > section > div.spotlight { + align-items: start; + overflow: hidden; + overflow: clip; +} + +body > main > section > div.spotlight > article { + display: none; + grid-column: 1; + grid-row: 1; +} + +body > main > section > div.spotlight > article:first-of-type { + display: block; +} + +body > main > section > div.spotlight:has(> aside > ol > li:is(:hover, :focus-within)) > article { + display: none; +} + +body > main > section > div.spotlight:has(> aside > ol > li:nth-child(1):is(:hover, :focus-within)) > article:nth-of-type(1), +body > main > section > div.spotlight:has(> aside > ol > li:nth-child(2):is(:hover, :focus-within)) > article:nth-of-type(2), +body > main > section > div.spotlight:has(> aside > ol > li:nth-child(3):is(:hover, :focus-within)) > article:nth-of-type(3), +body > main > section > div.spotlight:has(> aside > ol > li:nth-child(4):is(:hover, :focus-within)) > article:nth-of-type(4), +body > main > section > div.spotlight:has(> aside > ol > li:nth-child(5):is(:hover, :focus-within)) > article:nth-of-type(5), +body > main > section > div.spotlight:has(> aside > ol > li:nth-child(6):is(:hover, :focus-within)) > article:nth-of-type(6), +body > main > section > div.spotlight:has(> aside > ol > li:nth-child(7):is(:hover, :focus-within)) > article:nth-of-type(7), +body > main > section > div.spotlight:has(> aside > ol > li:nth-child(8):is(:hover, :focus-within)) > article:nth-of-type(8) { + display: block; +} + +body > main > section > div.spotlight.spotlight-aside-first { + grid-template-columns: minmax(0, 1fr) minmax(0, 1.7fr); +} + +body > main > section > div.spotlight > aside { + grid-column: 2; +} + +body > main > section > div.spotlight.spotlight-aside-first > aside:first-child { + grid-column: 1; +} + +body > main > section > div.spotlight.spotlight-aside-first > article { + grid-column: 2; +} + +body > main > section > div.spotlight > article { + margin-top: 0; + padding-top: 0; + border-top: 0; +} + +body > main > section > div.spotlight > article > a { + text-decoration: none; +} + +body > main > section > div.spotlight > article figure { + margin-top: 0; + min-height: 21rem; + border: 1px solid var(--color-border); + background: linear-gradient(150deg, rgba(118, 167, 215, 0.18) 0%, rgba(93, 134, 173, 0.12) 50%, rgba(195, 208, 223, 0.1) 100%); +} + +body > main > section > div.spotlight > article figure img { + width: 100%; + height: 100%; + object-fit: cover; +} + +body > main > section > div.spotlight > article h3 { + margin-top: var(--space-4); + font-size: clamp(1.65rem, 3.2vw, 3rem); + text-transform: uppercase; + letter-spacing: 0.01em; + line-height: 1.05; +} + +body > main > section > div.spotlight > article > p:nth-of-type(1) { + font-size: 1.14rem; + max-width: none; +} + +body > main > section > div.spotlight > article > p:nth-of-type(2) { + display: flex; + flex-wrap: wrap; + gap: var(--space-2); + font-size: 0.86rem; + color: var(--color-text-muted); + text-transform: uppercase; + letter-spacing: 0.04em; + font-family: var(--font-heading); +} + +body > main > section > div.spotlight > aside { + margin-top: 0; + border-left: 1px solid var(--color-border-strong); + padding-left: var(--space-6); +} + +body > main > section > div.spotlight > aside > h3 { + margin-top: 0; + font-size: 0.96rem; + text-transform: uppercase; + letter-spacing: 0.13em; + color: var(--color-text-muted); +} + +body > main > section > div.spotlight > aside > h3 + ol { + margin-top: var(--space-3); +} + +body > main > section > div.spotlight > aside > ol { + list-style: none; + margin-top: 0; + display: flex; + flex-direction: column; + gap: var(--space-4); +} + +body > main > section > div.spotlight > aside > ol > li { + border-top: 1px solid var(--color-border); + padding-top: var(--space-2); +} + +body > main > section > div.spotlight > aside > ol > li { + position: relative; + padding-left: var(--space-3); +} + +body > main > section > div.spotlight > aside > ol { + gap: 0; +} + +body > main > section > div.spotlight > aside > ol > li::before { + content: ""; + position: absolute; + inset-block: 0.05rem 0.05rem; + inset-inline-start: 0; + width: var(--border-width-regular); + background: transparent; +} + +body > main > section > div.spotlight > aside > ol > li:first-child::before, +body > main > section > div.spotlight > aside > ol > li:is(:hover, :focus-within)::before { + background: var(--color-accent-1); +} + +body > main > section > div.spotlight:has(> aside > ol > li:not(:first-child):is(:hover, :focus-within)) > aside > ol > li:first-child::before { + background: transparent; +} + +body > main > section > div.spotlight > aside > ol > li > a { + display: flex; + flex-direction: column; + gap: var(--space-3); + padding-block: var(--space-2); + cursor: pointer; + position: relative; +} + +body > main > section > div.spotlight > aside > ol > li > a::before { + content: ""; + position: absolute; + inset-block: -100vh; + inset-inline-start: -62rem; + inset-inline-end: 100%; + pointer-events: none; +} + +body > main > section > div.spotlight.spotlight-aside-first > aside > ol > li > a::before { + inset-inline-start: 100%; + inset-inline-end: -62rem; +} + +body > main > section > div.spotlight > aside > ol > li:is(:hover, :focus-within) > a::before { + pointer-events: auto; +} + +body > main > section > div.spotlight > aside > ol > li > a > span:first-child { + display: block; +} + +body > main > section > div.spotlight > aside > ol > li > a > span:last-child { + font-size: 0.86rem; + color: var(--color-text-muted); + display: flex; + flex-wrap: wrap; + gap: var(--space-1); + text-transform: uppercase; + letter-spacing: 0.04em; + font-family: var(--font-heading); +} + +body > main > section > div.spotlight > aside > ol > li:first-child { + border-top: 0; + padding-top: 0; +} + +body > main > section > div.spotlight > aside > ol > li > a, +body > main.home-main > section.home-rubrics > div > article > ul > li > a { + text-decoration: none; + color: var(--color-heading); + font-family: var(--font-heading); + line-height: 1.15; + letter-spacing: 0.01em; +} + +body > main > section > div.spotlight > aside > ol > li > a { + font-size: 1.36rem; + font-weight: 400; +} + +body > main > section > div.spotlight > article > a > h3 { + transition: color 0.16s ease; +} + +body > main > section > div.spotlight > article:is(:hover, :focus-within) > a > h3 { + color: var(--color-link-hover); + text-decoration: underline; + text-decoration-thickness: 1px; + text-underline-offset: 0.15em; +} + +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li article > a:is(:hover, :focus-visible) > h3, +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li article > header > h3 > a:is(:hover, :focus-visible), +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li article:has(> header > a:is(:hover, :focus-visible)) > header > h3 > a { + color: var(--color-link-hover); + text-decoration: underline; + text-decoration-thickness: 1px; + text-underline-offset: 0.15em; +} + +body > main > section > div.spotlight > article:is(:hover, :focus-within) > a > h3, +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li article > a:is(:hover, :focus-visible) > h3, +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li article > header > h3 > a:is(:hover, :focus-visible), +body > main > section > div.spotlight > aside > ol > li > a:is(:hover, :focus-visible), +body > main.home-main > section.home-rubrics > div > article > h3 > a:is(:hover, :focus-visible), +body > main.home-main > section.home-rubrics > div > article > ul > li > a:is(:hover, :focus-visible), +body > main.home-main:has(> section.home-spotlight > div.spotlight > article) > aside.home-watch > div > article > div > h3 > a:is(:hover, :focus-visible) { + color: var(--color-link-hover); +} + +body > main > section > div.spotlight:has(> aside > ol > li:nth-child(1):is(:hover, :focus-within)) > article:nth-of-type(1) > a > h3, +body > main > section > div.spotlight:has(> aside > ol > li:nth-child(2):is(:hover, :focus-within)) > article:nth-of-type(2) > a > h3, +body > main > section > div.spotlight:has(> aside > ol > li:nth-child(3):is(:hover, :focus-within)) > article:nth-of-type(3) > a > h3, +body > main > section > div.spotlight:has(> aside > ol > li:nth-child(4):is(:hover, :focus-within)) > article:nth-of-type(4) > a > h3, +body > main > section > div.spotlight:has(> aside > ol > li:nth-child(5):is(:hover, :focus-within)) > article:nth-of-type(5) > a > h3, +body > main > section > div.spotlight:has(> aside > ol > li:nth-child(6):is(:hover, :focus-within)) > article:nth-of-type(6) > a > h3, +body > main > section > div.spotlight:has(> aside > ol > li:nth-child(7):is(:hover, :focus-within)) > article:nth-of-type(7) > a > h3, +body > main > section > div.spotlight:has(> aside > ol > li:nth-child(8):is(:hover, :focus-within)) > article:nth-of-type(8) > a > h3 { + color: var(--color-link-hover); +} + +body > main > section > div.spotlight > aside > ol > li > p { + margin-top: var(--space-1); + font-size: 0.86rem; + color: var(--color-text-muted); + display: flex; + flex-wrap: wrap; + gap: var(--space-1); + text-transform: uppercase; + letter-spacing: 0.04em; + font-family: var(--font-heading); +} + +body > main > section > div.spotlight > aside:first-child { + border-left: 0; + border-right: 1px solid var(--color-border-strong); + padding-left: 0; + padding-right: var(--space-4); +} + +body > main.home-main > section.home-books > div { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(18rem, 22rem)); + justify-content: center; + gap: var(--space-5); + margin-top: var(--space-3); +} + +body > main.home-main > section.home-books > header > p { + margin-top: var(--space-2); + width: 100%; + border-left: var(--border-width-regular) solid var(--color-accent-2); + padding: 0.62rem 0.9rem; + background: linear-gradient(90deg, rgba(93, 134, 173, 0.16) 0%, rgba(93, 134, 173, 0.04) 100%); + color: var(--color-heading); + font-size: clamp(1.08rem, 0.98rem + 0.45vw, 1.28rem); + font-weight: 400; + line-height: 1.3; + text-align: center; +} + +body > main.home-main > section.home-books > div > section { + margin-top: 0; + width: 100%; + max-width: 22rem; +} + +body > main.home-main > section.home-books > div > section > article { + display: flex; + flex-direction: column; + margin-top: 0; + border-top: var(--border-width-regular) solid var(--color-border-strong); + padding-top: var(--space-3); + background: var(--color-surface-soft); + padding-inline: var(--space-3); + padding-bottom: var(--space-3); +} + +body > main.home-main > section.home-books > div > section:nth-child(2n+1) > article { + border-top-color: var(--color-accent-2); +} + +body > main.home-main > section.home-books > div > section:nth-child(2n) > article { + border-top-color: var(--color-accent-3); +} + +body > main.home-main > section.home-books > div > section figure { + margin-top: 0; + width: min(13rem, 100%); + align-self: center; + aspect-ratio: 2 / 3; + border: 1px solid var(--color-border); + background: rgba(255, 255, 255, 0.02); + min-height: 0; + overflow: hidden; +} + +body > main.home-main > section.home-books > div > section figure img { + width: 100%; + height: 100%; + object-fit: cover; +} + +body > main.home-main > section.home-books > div > section h2 { + font-size: clamp(1.12rem, 1.8vw, 1.38rem); + margin-top: var(--space-3); + line-height: 1.2; + text-align: center; +} + +body > main.home-main > section.home-books > div > section p { + margin-top: 0; + font-size: 1rem; +} + +body > main.home-main > section.home-books > div > section p:last-child { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: var(--space-2); + margin-top: var(--space-3); +} + +body > main.home-main > section.home-books > div > section p:last-child > a.ui-button { + width: 100%; + min-height: 2.35rem; + border-color: color-mix(in srgb, var(--color-link-external) 58%, var(--color-border-strong)); + background: linear-gradient( + 180deg, + color-mix(in srgb, var(--color-link-external) 38%, var(--color-background-alt)) 0%, + color-mix(in srgb, var(--color-link-external) 12%, var(--color-background-alt)) 100% + ); +} + +body > main.home-main > section.home-books > div > section p:last-child > a.ui-button:is(:hover, :focus-visible) { + border-color: color-mix(in srgb, var(--color-link-external-hover) 70%, var(--color-border-strong)); + background: linear-gradient( + 180deg, + color-mix(in srgb, var(--color-link-external-hover) 44%, var(--color-background-alt)) 0%, + color-mix(in srgb, var(--color-link-external) 18%, var(--color-background-alt)) 100% + ); +} + +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol { + grid-template-columns: repeat(12, minmax(0, 1fr)); + grid-auto-flow: row dense; + gap: var(--space-6); +} + +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list { + --articles-deep-flow-gap: 0.78rem; +} + +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list article { + border-top: 0; + padding-top: 0; +} + +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li article > header > a { + color: inherit; + text-decoration: none; +} + +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li article > header > p { + margin-top: var(--articles-deep-flow-gap); + font-size: 0.84rem; + letter-spacing: 0.05em; + text-transform: uppercase; + color: var(--color-text-muted); +} + +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li article > header > p > a { + color: inherit; + text-decoration: none; + font-family: var(--font-heading); +} + +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li article > header > p > a:is(:hover, :focus-visible) { + color: var(--color-link-hover); +} + +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li article > header > h3 { + margin-top: var(--articles-deep-flow-gap); +} + +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li article h3 { + font-weight: 400; +} + +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li article > header:has(> p) > h3 { + margin-top: calc(var(--articles-deep-flow-gap) * 0.4); +} + +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li article > p:nth-of-type(1) { + margin-top: var(--articles-deep-flow-gap); + font-size: 1.14rem; +} + +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li article > p:last-child { + margin-top: var(--articles-deep-flow-gap); + display: flex; + flex-wrap: wrap; + gap: var(--space-1); + font-size: 0.86rem; + color: var(--color-text-muted); + text-transform: uppercase; + letter-spacing: 0.04em; + font-family: var(--font-heading); +} + +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li article > p:last-child > a { + color: inherit; + text-decoration: underline; + text-decoration-thickness: 1px; + text-underline-offset: 0.15em; +} + +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li article > p:last-child > a:is(:hover, :focus-visible) { + color: inherit; + filter: brightness(1.28); +} + +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li { + grid-column: span 3; +} + +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+1) { + grid-column: 1 / span 3; +} + +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+2), +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+4) { + grid-column: 4 / span 3; +} + +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+3), +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+5) { + grid-column: 7 / span 6; +} + +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+3) { + grid-column: 1 / span 3; +} + +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+5) { + grid-row: span 2; +} + +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+6) { + grid-column: 1 / span 6; + grid-row: span 2; +} + +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+7), +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+9) { + grid-column: 7 / span 3; +} + +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+8), +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+10) { + grid-column: 10 / span 3; +} + +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+5) article figure, +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+6) article figure { + min-height: 19rem; +} + +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+1) article figure, +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+2) article figure, +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+3) article figure, +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+4) article figure, +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+7) article figure, +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+8) article figure, +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+9) article figure, +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+10) article figure { + min-height: 9rem; +} + +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+5) article h3, +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+6) article h3 { + font-size: clamp(1.46rem, 2.45vw, 2.05rem); +} + +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+1) article h3, +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+2) article h3, +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+3) article h3, +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+4) article h3, +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+7) article h3, +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+8) article h3, +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+9) article h3, +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+10) article h3 { + font-size: 1.36rem; +} + +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+1) article > p:last-child, +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+2) article > p:last-child, +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+3) article > p:last-child, +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+4) article > p:last-child, +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+7) article > p:last-child, +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+8) article > p:last-child, +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+9) article > p:last-child, +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+10) article > p:last-child { + margin-top: var(--space-1); +} + +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+1) article > p:nth-of-type(1), +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+2) article > p:nth-of-type(1), +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+3) article > p:nth-of-type(1), +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+4) article > p:nth-of-type(1), +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+7) article > p:nth-of-type(1), +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+8) article > p:nth-of-type(1), +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+9) article > p:nth-of-type(1), +body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li:nth-child(10n+10) article > p:nth-of-type(1) { + display: none; +} + +body > main.home-main > section.home-rubrics > div { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: var(--space-4); + margin-top: var(--space-3); +} + +body > main.home-main > section.home-rubrics > div > article { + margin-top: 0; + padding-top: var(--space-3); + border-top: var(--border-width-regular) solid var(--color-border-strong); + background: var(--color-surface-soft); + padding-inline: var(--space-3); + padding-bottom: var(--space-3); +} + +body > main.home-main > section.home-rubrics > div > article:nth-child(3n+1) { + border-top-color: var(--color-accent-1); +} + +body > main.home-main > section.home-rubrics > div > article:nth-child(3n+2) { + border-top-color: var(--color-accent-2); +} + +body > main.home-main > section.home-rubrics > div > article:nth-child(3n+3) { + border-top-color: var(--color-accent-3); +} + +body > main.home-main > section.home-rubrics > div > article > header { + margin-top: 0; + display: flex; + align-items: baseline; + justify-content: space-between; + gap: var(--space-2); +} + +body > main.home-main > section.home-rubrics > div > article > header > h3 { + margin-top: 0; + min-width: 0; + flex: 1 1 auto; +} + +body > main.home-main > section.home-rubrics > div > article > header > h3 > a { + color: inherit; + text-decoration: underline; + text-decoration-thickness: 1px; + text-underline-offset: 0.15em; + text-transform: uppercase; + letter-spacing: 0.05em; + font-size: 1.13rem; +} + +body > main.home-main > section.home-rubrics > div > article > header > h3 > a:is(:hover, :focus-visible) { + color: var(--color-link-hover); +} + +body > main.home-main > section.home-rubrics > div > article > header > p { + margin-top: 0; + flex: 0 0 auto; + font-size: 0.78rem; + letter-spacing: 0.05em; + text-transform: uppercase; + color: var(--color-text-muted); + white-space: nowrap; +} + +body > main.home-main > section.home-rubrics > div > article > ul { + list-style: none; + padding-left: 0; +} + +body > main.home-main > section.home-rubrics > div > article > ul > li { + display: grid; + grid-template-columns: 1fr auto; + gap: var(--space-2); + align-items: baseline; + border-top: 1px solid var(--color-border); + padding-top: var(--space-2); + margin-top: var(--space-2); +} + +body > main.home-main > section.home-rubrics > div > article > ul > li > a { + font-size: 1.08rem; +} + +body > main.home-main > section.home-rubrics > div > article > ul > li > a:hover { + text-decoration: underline; +} + +body > main.home-main > section.home-rubrics > div > article > ul > li > p { + grid-column: 1 / -1; + margin-top: 0; + font-size: 0.82rem; + letter-spacing: 0.04em; + text-transform: uppercase; + color: var(--color-text-muted); +} + +body > main.home-main > section.home-rubrics > div > article > ul > li > p > a { + color: inherit; + text-decoration: none; + font-family: var(--font-heading); +} + +body > main.home-main > section.home-rubrics > div > article > ul > li > p > a:is(:hover, :focus-visible) { + color: var(--color-link-hover); +} + +body > main.home-main > section.home-rubrics > div > article > ul > li > time { + font-size: 0.86rem; + white-space: nowrap; + letter-spacing: 0.04em; + text-transform: uppercase; + color: var(--color-text-muted); + font-family: var(--font-heading); +} + +body > main.home-main:has(> section.home-spotlight > div.spotlight > article) > aside.home-watch { + border-top-color: var(--color-accent-2); +} + +body > main.home-main:has(> section.home-spotlight > div.spotlight > article) > aside.home-watch > header { + margin-top: 0; + margin-bottom: var(--space-3); +} + +body > main.home-main:has(> section.home-spotlight > div.spotlight > article) > aside.home-watch > div { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: var(--space-3); +} + +body > main.home-main:has(> section.home-spotlight > div.spotlight > article) > aside.home-watch > div > article { + margin-top: 0; + border: 1px solid var(--color-border); + padding: var(--space-3); + background: + linear-gradient(160deg, rgba(118, 167, 215, 0.1) 0%, rgba(118, 167, 215, 0.02) 28%, rgba(93, 134, 173, 0.1) 100%); + display: grid; + grid-template-columns: auto minmax(0, 1fr); + gap: var(--space-3); + align-items: start; +} + +body > main.home-main:has(> section.home-spotlight > div.spotlight > article) > aside.home-watch > div > article > a { + display: block; + text-decoration: none; + color: var(--color-heading); +} + +body > main.home-main:has(> section.home-spotlight > div.spotlight > article) > aside.home-watch > div > article > a > figure { + margin-top: 0; + min-height: 0; + border: 1px solid var(--color-border); + background: rgba(0, 0, 0, 0.22); + overflow: hidden; + height: auto; +} + +body > main.home-main:has(> section.home-spotlight > div.spotlight > article) > aside.home-watch > div > article > a > figure img { + width: auto; + max-width: 100%; + height: auto; + display: block; +} + +body > main.home-main:has(> section.home-spotlight > div.spotlight > article) > aside.home-watch > div > article > div { + display: grid; + align-content: start; + gap: var(--space-2); +} + +body > main.home-main:has(> section.home-spotlight > div.spotlight > article) > aside.home-watch > div > article > div > h3 { + margin-top: 0; + font-size: 1.08rem; + line-height: 1.2; + text-transform: none; +} + +body > main.home-main:has(> section.home-spotlight > div.spotlight > article) > aside.home-watch > div > article > div > h3 > a { + text-decoration: none; + color: var(--color-heading); +} + +body > main.home-main:has(> section.home-spotlight > div.spotlight > article) > aside.home-watch > div > article > div > h3 > a:is(:hover, :focus-visible), +body > main.home-main:has(> section.home-spotlight > div.spotlight > article) > aside.home-watch > div > article:has(> a:is(:hover, :focus-visible)) > div > h3 > a { + color: var(--color-link-hover); + text-decoration: underline; + text-decoration-thickness: 1px; + text-underline-offset: 0.15em; +} + +body > main.home-main:has(> section.home-spotlight > div.spotlight > article) > aside.home-watch > div > article > div > p { + margin-top: 0; + font-size: 0.93rem; + line-height: 1.45; + color: var(--color-text); +} + +body > main.home-main:has(> section.home-spotlight > div.spotlight > article) > aside.home-watch > div > article > div > footer { + margin-top: 0; +} + +body > main.home-main:has(> section.home-spotlight > div.spotlight > article) > aside.home-watch > div > article > div > footer > p { + margin-top: 0; + display: flex; + flex-wrap: wrap; + gap: var(--space-1); + align-items: center; + font-size: 0.86rem; + letter-spacing: 0.04em; + text-transform: uppercase; + color: var(--color-text-muted); + font-family: var(--font-heading); +} + +body > main.home-main:has(> section.home-spotlight > div.spotlight > article) > aside.home-watch > div > article > div > footer > p + p { + margin-top: 0.2rem; +} + +body > main.home-main:has(> section.home-spotlight > div.spotlight > article) > aside.home-watch > div > article > div > footer > p > a { + color: inherit; + text-decoration: underline; + text-decoration-thickness: 1px; + text-underline-offset: 0.15em; +} + +body > main.home-main:has(> section.home-spotlight > div.spotlight > article) > aside.home-watch > div > article > div > footer > p > a:is(:hover, :focus-visible) { + color: var(--color-link-hover); +} + +body > main.home-main:has(> section.home-spotlight > div.spotlight > article) > aside.home-watch > div > article > div > footer > p > strong { + border: 1px solid var(--color-border); + padding: 0.2rem 0.48rem; + font-size: 0.75rem; + letter-spacing: 0.06em; + color: var(--color-heading); + background: rgba(29, 45, 64, 0.32); +} + +body > main.home-main:has(> section.home-spotlight > div.spotlight > article) > aside.home-watch > div > article > div > footer > p > strong[data-state="ok"] { + border-color: rgba(118, 167, 215, 0.6); + color: #b8d8f8; + background: rgba(48, 84, 122, 0.28); +} + +body > main.home-main:has(> section.home-spotlight > div.spotlight > article) > aside.home-watch > div > article > div > footer > p > strong[data-state="warn"] { + border-color: rgba(212, 172, 102, 0.7); + color: #f2d59e; + background: rgba(110, 78, 24, 0.32); + box-shadow: inset 0 0 0 1px rgba(246, 214, 155, 0.12); +} + +body > main.home-main:has(> section.home-spotlight > div.spotlight > article) > aside.home-watch > div > article > div > footer > p > strong[data-state="dead"] { + border-color: rgba(219, 126, 147, 0.72); + color: #ffd4df; + background: rgba(124, 39, 62, 0.36); + box-shadow: inset 0 0 0 1px rgba(255, 212, 223, 0.14); +} + +body > main.home-main:has(> section.home-spotlight > div.spotlight > article) > aside.home-watch > div > article > div > footer > p > strong:is([data-state="warn"], [data-state="dead"]) { + cursor: help; +} + +body > main.home-main > section.home-collections.collections-section > div { + margin-top: var(--space-3); + display: grid; + gap: var(--space-3); + min-width: 0; +} + +body > main.home-main > section.home-collections.collections-section > div > article { + margin-top: 0; + border-top: 1px solid var(--color-border); + padding-top: var(--space-2); + width: 100%; + min-width: 0; + overflow-x: hidden; +} + +body > main.home-main > section.home-collections.collections-section > div > article > h3 { + margin-top: 0; + font-size: clamp(1.04rem, 1.35vw, 1.18rem); + text-transform: uppercase; + letter-spacing: 0.03em; +} + +body > main.home-main > section.home-collections.collections-section > div > article > h3 > a:is(:hover, :focus-visible) { + color: var(--color-link-hover); +} + +body > main.home-main > section.home-collections.collections-section > div > article > ul { + list-style: none; + margin-top: var(--space-2); + margin-inline: 0; + padding-left: 0; + width: 100%; + max-width: 100%; + min-width: 0; + box-sizing: border-box; + display: flex; + flex-wrap: nowrap; + gap: var(--space-1); + overflow-x: auto; + overflow-y: hidden; + overscroll-behavior-x: contain; + -webkit-overflow-scrolling: touch; + padding-bottom: 0.2rem; + scrollbar-width: thin; +} + +body > main.home-main > section.home-collections.collections-section > div > article > ul > li { + flex: 0 0 auto; + margin-top: 0; +} + +body > main.home-main > section.home-collections.collections-section > div > article > ul > li > a { + display: block; + text-decoration: none; +} + +body > main.home-main > section.home-collections.collections-section > div > article > ul > li > a > figure { + margin-top: 0; + width: max-content; + border: 1px solid var(--color-border); + background: linear-gradient(145deg, rgba(118, 167, 215, 0.12) 0%, rgba(93, 134, 173, 0.09) 100%); + overflow: hidden; +} + +body > main.home-main > section.home-collections.collections-section > div > article > ul > li > a > figure img { + width: auto; + height: 128px; + max-width: none; + display: block; +} + +body > main.home-main > section.home-collections.collections-section > div > article > ul > li > a:is(:hover, :focus-visible) > figure { + border-color: var(--color-link-hover); +} + +body > main.home-main > section.home-collections.collections-section > div > article > p { + margin-top: var(--space-1); + display: flex; + flex-wrap: wrap; + gap: var(--space-2); + font-size: 0.8rem; + color: var(--color-text-muted); + text-transform: uppercase; + letter-spacing: 0.04em; +} + +body > main.home-main > section.home-collections.collections-section > div > article > p > a { + text-transform: none; + letter-spacing: 0; + color: var(--color-text); + text-decoration: none; + border: 1px solid var(--color-border); + padding: 0.1rem 0.4rem; + font-size: 0.84rem; + line-height: 1.2; +} + +body > main.home-main > section.home-collections.collections-section > div > article > p > a:is(:hover, :focus-visible) { + color: var(--color-link-hover); + border-color: var(--color-link-hover); +} + +/* Le carrousel des collections ne doit pas élargir le viewport mobile. */ +html:has(body > main.home-main > section.home-collections.collections-section), +body:has(> main.home-main > section.home-collections.collections-section) { + overflow-x: clip; +} diff --git a/themes/2026/assets/css/index.css b/themes/2026/assets/css/index.css new file mode 100644 index 00000000..783c4bd6 --- /dev/null +++ b/themes/2026/assets/css/index.css @@ -0,0 +1,10 @@ +@import "variables.css"; +@import "reset.css"; +@import "base.css"; +@import "header.css"; +@import "article-header.css"; +@import "content.css"; +@import "list.css"; +@import "home.css"; +@import "footer.css"; +@import "responsive.css"; diff --git a/themes/2026/assets/css/list.css b/themes/2026/assets/css/list.css new file mode 100644 index 00000000..7d787fb3 --- /dev/null +++ b/themes/2026/assets/css/list.css @@ -0,0 +1,387 @@ +body > main.listing-page > section.listing-articles > nav.articles-list > ol { + grid-template-columns: repeat(12, minmax(0, 1fr)); + grid-auto-flow: row dense; + gap: var(--space-6); +} + +body > main.listing-page > section.listing-articles > nav.articles-list { + --articles-deep-flow-gap: 0.78rem; +} + +body > main.listing-page > section.listing-articles > nav.articles-list article { + border-top: 0; + padding-top: 0; +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li article > header > a { + color: inherit; + text-decoration: none; +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li article > header > p { + margin-top: var(--articles-deep-flow-gap); + font-size: 0.84rem; + letter-spacing: 0.05em; + text-transform: uppercase; + color: var(--color-text-muted); +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li article > header > p > a { + color: inherit; + text-decoration: none; + font-family: var(--font-heading); +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li article > header > p > a:is(:hover, :focus-visible) { + color: var(--color-link-hover); +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li article > header > h3 { + margin-top: var(--articles-deep-flow-gap); +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li article > header:has(> p) > h3 { + margin-top: calc(var(--articles-deep-flow-gap) * 0.4); +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li article > p:nth-of-type(1) { + margin-top: var(--articles-deep-flow-gap); + font-size: 1.14rem; +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li article > p:last-child { + margin-top: var(--articles-deep-flow-gap); + display: flex; + flex-wrap: wrap; + gap: var(--space-1); + font-size: 0.86rem; + color: var(--color-text-muted); + text-transform: uppercase; + letter-spacing: 0.04em; + font-family: var(--font-heading); +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li article > p:last-child > a { + color: inherit; + text-decoration: underline; + text-decoration-thickness: 1px; + text-underline-offset: 0.15em; +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li article > p:last-child > a:is(:hover, :focus-visible) { + color: inherit; + filter: brightness(1.28); +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li article > footer.external-link-meta { + margin-top: var(--articles-deep-flow-gap); +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li article > footer.external-link-meta > p { + margin-top: 0; + display: flex; + flex-wrap: wrap; + gap: var(--space-1); + align-items: center; + font-size: 0.86rem; + letter-spacing: 0.04em; + text-transform: uppercase; + color: var(--color-text-muted); + font-family: var(--font-heading); +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li article > footer.external-link-meta > p + p { + margin-top: 0.2rem; +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li article > footer.external-link-meta > p > a { + color: inherit; + text-decoration: underline; + text-decoration-thickness: 1px; + text-underline-offset: 0.15em; +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li article > footer.external-link-meta > p > a:is(:hover, :focus-visible) { + color: var(--color-link-hover); +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li article > footer.external-link-meta > p > strong { + border: 1px solid var(--color-border); + padding: 0.2rem 0.48rem; + font-size: 0.75rem; + letter-spacing: 0.06em; + color: var(--color-heading); + background: rgba(29, 45, 64, 0.32); +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li article > footer.external-link-meta > p > strong[data-state="ok"] { + border-color: rgba(118, 167, 215, 0.6); + color: #b8d8f8; + background: rgba(48, 84, 122, 0.28); +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li article > footer.external-link-meta > p > strong[data-state="warn"] { + border-color: rgba(212, 172, 102, 0.7); + color: #f2d59e; + background: rgba(110, 78, 24, 0.32); + box-shadow: inset 0 0 0 1px rgba(246, 214, 155, 0.12); +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li article > footer.external-link-meta > p > strong[data-state="dead"] { + border-color: rgba(219, 126, 147, 0.72); + color: #ffd4df; + background: rgba(124, 39, 62, 0.36); + box-shadow: inset 0 0 0 1px rgba(255, 212, 223, 0.14); +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li article > footer.external-link-meta > p > strong:is([data-state="warn"], [data-state="dead"]) { + cursor: help; +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li { + grid-column: span 3; +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+1) { + grid-column: 1 / span 3; +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+2), +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+4) { + grid-column: 4 / span 3; +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+3), +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+5) { + grid-column: 7 / span 6; +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+3) { + grid-column: 1 / span 3; +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+5) { + grid-row: span 2; +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+6) { + grid-column: 1 / span 6; + grid-row: span 2; +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+7), +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+9) { + grid-column: 7 / span 3; +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+8), +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+10) { + grid-column: 10 / span 3; +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+5) article figure, +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+6) article figure { + min-height: 19rem; +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+1) article figure, +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+2) article figure, +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+3) article figure, +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+4) article figure, +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+7) article figure, +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+8) article figure, +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+9) article figure, +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+10) article figure { + min-height: 9rem; +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+5) article h3, +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+6) article h3 { + font-size: clamp(1.46rem, 2.45vw, 2.05rem); + font-weight: 400; +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+1) article h3, +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+2) article h3, +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+3) article h3, +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+4) article h3, +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+7) article h3, +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+8) article h3, +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+9) article h3, +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+10) article h3 { + font-size: 1.36rem; + font-weight: 400; +} + +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+1) article > p:nth-of-type(1), +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+2) article > p:nth-of-type(1), +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+3) article > p:nth-of-type(1), +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+4) article > p:nth-of-type(1), +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+7) article > p:nth-of-type(1), +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+8) article > p:nth-of-type(1), +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+9) article > p:nth-of-type(1), +body > main.listing-page > section.listing-articles > nav.articles-list > ol > li:nth-child(10n+10) article > p:nth-of-type(1) { + display: none; +} + +body > main.listing-page > section.listing-timeline > ol { + list-style: none; + margin-top: var(--space-4); + padding-left: 0; + display: grid; + gap: var(--space-4); + position: relative; +} + +body > main.listing-page > section.listing-timeline > ol::before { + content: ""; + position: absolute; + inset-block: 0 0; + inset-inline-start: 0.58rem; + width: 1px; + background: var(--color-border-strong); +} + +body > main.listing-page > section.listing-timeline > ol > li { + position: relative; + margin-top: 0; + padding-inline-start: var(--space-5); +} + +body > main.listing-page > section.listing-timeline > ol > li::before { + content: ""; + position: absolute; + inset-inline-start: 0.2rem; + inset-block-start: 1.05rem; + width: 0.72rem; + height: 0.72rem; + border: var(--border-width-regular) solid var(--color-accent-2); + border-radius: 999px; + background: var(--color-background-alt); +} + +body > main.listing-page > section.listing-timeline > ol > li > article { + margin-top: 0; + border: 1px solid var(--color-border); + background: var(--color-surface-soft); + padding: var(--space-3); + display: grid; + grid-template-columns: minmax(7.2rem, 9.5rem) minmax(0, 1fr); + gap: var(--space-3); + align-items: start; +} + +body > main.listing-page > section.listing-timeline > ol > li > article:not(:has(> a)) { + grid-template-columns: 1fr; +} + +body > main.listing-page > section.listing-timeline > ol > li > article > a { + display: block; + color: inherit; + text-decoration: none; +} + +body > main.listing-page > section.listing-timeline > ol > li > article > a > figure { + margin-top: 0; + min-height: 6.2rem; + border: 1px solid var(--color-border); + overflow: hidden; +} + +body > main.listing-page > section.listing-timeline > ol > li > article > a > figure img { + width: 100%; + height: 100%; + object-fit: cover; +} + +body > main.listing-page > section.listing-timeline > ol > li > article > div { + display: grid; + gap: var(--space-2); + align-content: start; +} + +body > main.listing-page > section.listing-timeline > ol > li > article > div > header { + margin-top: 0; + display: grid; + gap: var(--space-1); +} + +body > main.listing-page > section.listing-timeline > ol > li > article > div > header > p:first-of-type { + margin-top: 0; + font-size: 0.86rem; + color: var(--color-text-muted); + text-transform: uppercase; + letter-spacing: 0.04em; + font-family: var(--font-heading); +} + +body > main.listing-page > section.listing-timeline > ol > li > article > div > header > p + p { + margin-top: 0; + font-size: 0.84rem; + color: var(--color-text-muted); + text-transform: uppercase; + letter-spacing: 0.04em; + font-family: var(--font-heading); +} + +body > main.listing-page > section.listing-timeline > ol > li > article > div > header > p + p > a { + color: inherit; + text-decoration: none; +} + +body > main.listing-page > section.listing-timeline > ol > li > article > div > header > p + p > a:is(:hover, :focus-visible) { + color: var(--color-link-hover); +} + +body > main.listing-page > section.listing-timeline > ol > li > article > div > header > h3 { + margin-top: 0; + font-size: clamp(1.25rem, 1.8vw, 1.65rem); + font-weight: 400; +} + +body > main.listing-page > section.listing-timeline > ol > li > article > div > header > h3 > a { + color: var(--color-heading); + text-decoration: none; +} + +body > main.listing-page > section.listing-timeline > ol > li > article > div > header > h3 > a:is(:hover, :focus-visible), +body > main.listing-page > section.listing-timeline > ol > li > article:has(> a:is(:hover, :focus-visible)) > div > header > h3 > a { + color: var(--color-link-hover); + text-decoration: underline; + text-decoration-thickness: 1px; + text-underline-offset: 0.15em; +} + +body > main.listing-page > section.listing-timeline > ol > li > article > div > p { + margin-top: 0; + font-size: 1rem; + color: var(--color-text); +} + +body > main.listing-page > section.listing-timeline > ol > li > article > div > footer { + margin-top: 0; +} + +body > main.listing-page > section.listing-timeline > ol > li > article > div > footer > p { + margin-top: 0; + display: flex; + flex-wrap: wrap; + gap: var(--space-1); + font-size: 0.86rem; + color: var(--color-text-muted); + text-transform: uppercase; + letter-spacing: 0.04em; + font-family: var(--font-heading); +} + +body > main.listing-page > section.listing-timeline > ol > li > article > div > footer > p > a { + color: inherit; + text-decoration: underline; + text-decoration-thickness: 1px; + text-underline-offset: 0.15em; +} + +body > main.listing-page > section.listing-timeline > ol > li > article > div > footer > p > a:is(:hover, :focus-visible) { + color: inherit; + filter: brightness(1.28); +} diff --git a/themes/2026/assets/css/reset.css b/themes/2026/assets/css/reset.css new file mode 100644 index 00000000..4e13dcab --- /dev/null +++ b/themes/2026/assets/css/reset.css @@ -0,0 +1,5 @@ +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} diff --git a/themes/2026/assets/css/responsive.css b/themes/2026/assets/css/responsive.css new file mode 100644 index 00000000..d8b17a66 --- /dev/null +++ b/themes/2026/assets/css/responsive.css @@ -0,0 +1,247 @@ +@media (max-width: 1100px) { + body > header > section.site-stats > ul { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + body > main > section > div.spotlight { + grid-template-columns: 1fr; + } + + body > main > section > div.spotlight > article, + body > main > section > div.spotlight.spotlight-aside-first > article { + grid-column: 1; + grid-row: 1; + } + + body > main > section > div.spotlight > aside, + body > main > section > div.spotlight.spotlight-aside-first > aside:first-child { + grid-column: 1; + grid-row: 2; + } + + body > main > section > div.spotlight > aside { + border-left: 0; + border-right: 0; + border-top: 1px solid var(--color-border); + padding-left: 0; + padding-right: 0; + padding-top: var(--space-4); + } + + body > main > section > div.spotlight > aside > ol { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: var(--space-3); + } + + body > main > section > div.spotlight > aside > ol { + gap: 0; + } + + body > main > section > div.spotlight > aside > ol > li, + body > main > section > div.spotlight > aside > ol > li:first-child { + border-top: 0; + padding-top: 0; + } + + body > main.home-main > section.home-books > div { + grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr)); + justify-content: center; + } + + body > main.home-main > section.home-books > div > section { + max-width: 22rem; + } + + body > main.home-main > section.home-rubrics > div { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li { + grid-column: auto; + grid-row: auto; + } + + body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li article figure { + min-height: 12rem; + } + + body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li article > p:nth-of-type(1) { + display: block; + } + + body > main.listing-page.listing-mode-spotlight > section.listing-articles > nav.articles-list > ol { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + body > main.listing-page.listing-mode-spotlight > section.listing-articles > nav.articles-list > ol > li { + grid-column: auto; + grid-row: auto; + } + + body > main.listing-page.listing-mode-spotlight > section.listing-articles > nav.articles-list > ol > li article figure { + min-height: 12rem; + } + + body > main.listing-page.listing-mode-spotlight > section.listing-articles > nav.articles-list > ol > li article > p:nth-of-type(1) { + display: block; + } + + body > main.listing-page.listing-mode-timeline > section.listing-timeline > ol > li > article { + grid-template-columns: minmax(6.4rem, 8rem) minmax(0, 1fr); + } + + body > main:has(> article:first-child):has(> aside) { + grid-template-columns: 1fr; + } + + body > main:has(> article:first-child):has(> aside) > article:first-child { + width: 100%; + } + + body > main:has(> article:first-child):has(> aside) > aside { + border-top: 1px solid var(--color-border); + padding-top: var(--space-4); + } + + body > main.home-main:has(> section.home-spotlight > div.spotlight > article) > aside.home-watch > div { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + body > footer > section:nth-of-type(1) > dl { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} + +@media (max-width: 800px) { + body { + font-size: var(--font-size-body-mobile); + padding: var(--space-3); + } + + body > main, + body > footer { + margin-bottom: var(--space-5); + } + + body > header > section.site-stats > ul { + grid-template-columns: 1fr; + } + + body > header:has(> h1) > h1 { + max-width: 100%; + } + + main nav.articles-list > ol { + grid-template-columns: 1fr; + } + + body > main > section > div.spotlight > article figure { + min-height: 14rem; + } + + body > main > section > div.spotlight > article h3 { + font-size: clamp(1.4rem, 8vw, 2.1rem); + } + + body > main > section > div.spotlight > aside > ol { + grid-template-columns: 1fr; + } + + body > main.home-main > section.home-books > div > section figure { + min-height: 0; + width: min(11rem, 100%); + } + + body > main.home-main > section.home-rubrics > div { + grid-template-columns: 1fr; + } + + body > main.home-main > section.home-rubrics > div > article > ul > li { + grid-template-columns: 1fr; + } + + body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol { + grid-template-columns: 1fr; + } + + body:has(> main.home-main > section.home-spotlight > div.spotlight > article) > main.home-main > section.home-deep > nav.articles-list > ol > li article figure { + min-height: 10rem; + } + + body > main.listing-page.listing-mode-spotlight > section.listing-articles > nav.articles-list > ol { + grid-template-columns: 1fr; + } + + body > main.listing-page.listing-mode-spotlight > section.listing-articles > nav.articles-list > ol > li article figure { + min-height: 10rem; + } + + body > main.listing-page.listing-mode-timeline > section.listing-timeline > ol::before { + inset-inline-start: 0; + } + + body > main.listing-page.listing-mode-timeline > section.listing-timeline > ol > li { + padding-inline-start: var(--space-4); + } + + body > main.listing-page.listing-mode-timeline > section.listing-timeline > ol > li::before { + inset-inline-start: -0.35rem; + } + + body > main.listing-page.listing-mode-timeline > section.listing-timeline > ol > li > article { + grid-template-columns: 1fr; + } + + body > main.listing-page.listing-mode-timeline > section.listing-timeline > ol > li > article > a > figure { + min-height: 9rem; + } + + body > main.home-main:has(> section.home-spotlight > div.spotlight > article) > aside.home-watch > div { + grid-template-columns: 1fr; + } + + body > main.home-main:has(> section.home-spotlight > div.spotlight > article) > aside.home-watch > div > article { + grid-template-columns: 1fr; + } + + body > main.home-main:has(> section.home-spotlight > div.spotlight > article) > aside.home-watch > div > article > a > figure { + min-height: 0; + } + + body > main:has(> article:first-child):has(> aside) > article:first-child { + font-size: 1.14rem; + line-height: 1.82; + } + + body > main:has(> article:first-child):has(> aside) > article:first-child > * { + max-width: 100%; + } + + body > footer { + padding-top: var(--space-3); + padding-inline: var(--space-1); + gap: var(--space-2); + } + + body > footer > section:nth-of-type(1) > dl { + grid-template-columns: 1fr; + } + + body > footer > section:nth-of-type(1) > dl > div { + border-left: 0; + border-top: 1px solid var(--color-border); + padding-left: 0; + padding-top: var(--space-1); + } + + body > footer > section:nth-of-type(1) > dl > div:first-child { + border-top: 0; + padding-top: 0; + } + +} diff --git a/themes/2026/assets/css/variables.css b/themes/2026/assets/css/variables.css new file mode 100644 index 00000000..500effc0 --- /dev/null +++ b/themes/2026/assets/css/variables.css @@ -0,0 +1,47 @@ +:root { + --color-background: #060c14; + --color-background-alt: #111b2a; + --color-background-deep: #040914; + --color-footer-background: #02050d; + --color-surface-soft: rgba(255, 255, 255, 0.025); + --color-border: #273446; + --color-border-strong: #3b536d; + --color-text: #e7edf6; + --color-text-muted: #a5b3c4; + --color-heading: #f7fbff; + --color-link: #ffd369; + --color-link-hover: #fff1b8; + --color-link-external: #6de0b8; + --color-link-external-hover: #9ef7d6; + --color-link-affiliated: #e792ff; + --color-link-affiliated-hover: #f3b8ff; + --color-accent-1: #76a7d7; + --color-accent-2: #5d86ad; + --color-accent-3: #c3d0df; + --color-background-wash-light: #76a7d7; + --color-background-wash-mid: #5d86ad; + --color-background-wash-deep: #273446; + --color-background-wash: var(--color-background-wash-mid); + --color-section-divider-1: #e7b83f; + --color-section-divider-2: #8f6ad8; + --color-section-divider-3: #d97a3f; + --color-strong-highlight: #8f3340; + --border-width-regular: 2px; + + --font-body: "Source Sans 3", "Noto Sans", "DejaVu Sans", sans-serif; + --font-heading: "Avenir Next Condensed", "Franklin Gothic Medium", "Arial Narrow", sans-serif; + --font-size-root-min: 16px; + --font-size-body: clamp(1.1875rem, 1.05rem + 0.55vw, 1.3125rem); + --font-size-body-mobile: 1.1875rem; + --font-size-reading: clamp(1.2rem, 1.08rem + 0.45vw, 1.34rem); + + --space-1: 0.35rem; + --space-2: 0.6rem; + --space-3: 0.9rem; + --space-4: 1.2rem; + --space-5: 1.7rem; + --space-6: 2.4rem; + + --max-width: 92rem; + --max-width-reading: 54rem; +} diff --git a/themes/2026/layouts/404.html b/themes/2026/layouts/404.html new file mode 100644 index 00000000..92217af6 --- /dev/null +++ b/themes/2026/layouts/404.html @@ -0,0 +1,20 @@ +{{ define "main" }} +{{- $recentPages := first 6 (site.RegularPages.ByDate.Reverse) -}} +
+ {{ partialCached "header-brand.html" .Site .Site.Title (.Site.Params.logo | default "logo-large.png") }} +

Page introuvable

+
+
+
+

Le contenu que vous recherchez n'existe pas.

+

Si vous pensez qu'il s'agit d'une erreur, je vous invite à me contacter en me communiquant l'adresse visitée et l'adresse ciblée.

+
+ + {{ if gt (len $recentPages) 0 }} +
+

Derniers articles

+ {{ partial "articles-list.html" (dict "Pages" $recentPages "Context" .) }} +
+ {{ end }} +
+{{ end }} diff --git a/themes/2026/layouts/_markup/render-image.html b/themes/2026/layouts/_markup/render-image.html new file mode 100644 index 00000000..898f3327 --- /dev/null +++ b/themes/2026/layouts/_markup/render-image.html @@ -0,0 +1 @@ +{{- partial "media/render-image.html" . -}} diff --git a/themes/2026/layouts/_markup/render-link.html b/themes/2026/layouts/_markup/render-link.html new file mode 100644 index 00000000..2d82e86e --- /dev/null +++ b/themes/2026/layouts/_markup/render-link.html @@ -0,0 +1 @@ +{{- partial "render/link.html" . -}} diff --git a/themes/2026/layouts/_partials/article-footer.html b/themes/2026/layouts/_partials/article-footer.html new file mode 100644 index 00000000..e84ea79e --- /dev/null +++ b/themes/2026/layouts/_partials/article-footer.html @@ -0,0 +1,49 @@ +{{- $page := . -}} +{{- with $page.Params.dossier -}} + {{- $dossierID := index . 0 -}} + {{- if $dossierID -}} + {{- $group := where site.RegularPages "Params.dossier" "intersect" (slice $dossierID) -}} + {{- $sorted := sort $group "RelPermalink" "asc" -}} + {{- $sorted = sort $sorted "Date" "asc" -}} + {{- $sorted = sort $sorted "Weight" "asc" -}} + {{- if gt (len $sorted) 1 -}} + {{- $scratch := newScratch -}} + {{- $scratch.Set "index" -1 -}} + {{- range $i, $item := $sorted -}} + {{- if eq $item.Permalink $page.Permalink -}} + {{- $scratch.Set "index" $i -}} + {{- end -}} + {{- end -}} + {{- $index := $scratch.Get "index" -}} + {{- if ge $index 0 -}} + {{- $prev := false -}} + {{- $next := false -}} + {{- if gt $index 0 -}} + {{- $prev = index $sorted (sub $index 1) -}} + {{- end -}} + {{- if lt (add $index 1) (len $sorted) -}} + {{- $next = index $sorted (add $index 1) -}} + {{- end -}} + + {{- end -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/themes/2026/layouts/_partials/article-header.html b/themes/2026/layouts/_partials/article-header.html new file mode 100644 index 00000000..c1491f53 --- /dev/null +++ b/themes/2026/layouts/_partials/article-header.html @@ -0,0 +1,189 @@ +{{- $page := .Page -}} +{{- $coverPath := .Params.cover -}} +{{- $isInterestingLink := strings.HasPrefix .RelPermalink "/interets/liens-interessants/" -}} +{{- $showCover := and $coverPath (not $isInterestingLink) -}} +{{- $linksParam := .Params.links -}} +{{- $links := slice -}} +{{- if $linksParam -}} + {{- $type := printf "%T" $linksParam -}} + {{- if hasPrefix $type "[]" -}} + {{- $links = $linksParam -}} + {{- else -}} + {{- $links = slice $linksParam -}} + {{- end -}} +{{- end -}} + +{{- $originLink := dict -}} +{{- if $isInterestingLink -}} + {{- range $links -}} + {{- if and (eq (len $originLink) 0) .url -}} + {{- $rawLabel := default "" (default .name .text) -}} + {{- $normalizedLabel := lower (replace (replace (printf "%v" $rawLabel) "'" "") "’" "") -}} + {{- if eq $normalizedLabel "page dorigine" -}} + {{- $originLink = . -}} + {{- end -}} + {{- end -}} + {{- end -}} + {{- if and (eq (len $originLink) 0) (gt (len $links) 0) -}} + {{- range $links -}} + {{- if and (eq (len $originLink) 0) .url -}} + {{- $originLink = . -}} + {{- end -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{- $originURL := "" -}} +{{- $originLabel := "Page d'origine" -}} +{{- if gt (len $originLink) 0 -}} + {{- $originURL = default "" (index $originLink "url") -}} + {{- with (default (index $originLink "name") (index $originLink "text")) -}} + {{- $originLabel = . -}} + {{- end -}} +{{- end -}} +{{- $originIsExternal := strings.HasPrefix $originURL "http" -}} + +{{- $remainingLinks := $links -}} +{{- if and $isInterestingLink (ne $originURL "") -}} + {{- $remainingLinks = slice -}} + {{- range $links -}} + {{- if and .url (ne .url $originURL) -}} + {{- $remainingLinks = $remainingLinks | append . -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{- $coverData := dict -}} +{{- if $coverPath -}} + {{- $coverName := path.Base $coverPath | replaceRE "\\.[^.]+$" "" -}} + {{- $coverDataFile := $page.Resources.Get (printf "data/images/%s.yaml" $coverName) -}} + {{- if not $coverDataFile -}} + {{- $coverDataFile = $page.Resources.Get (printf "data/%s.yaml" $coverName) -}} + {{- end -}} + {{- if $coverDataFile -}} + {{- $coverData = $coverDataFile.Content | transform.Unmarshal -}} + {{- end -}} +{{- end -}} + +{{- $coverImage := false -}} +{{- $coverDisplay := false -}} +{{- if $showCover -}} + {{- $coverImage = $page.Resources.GetMatch $coverPath -}} + {{- if $coverImage -}} + {{- $coverDisplay = $coverImage -}} + {{- if and (ne $coverDisplay.MediaType.SubType "svg") (gt $coverDisplay.Width 1480) -}} + {{- $coverDisplay = $coverImage.Resize "1480x" -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{- $coverImageTitle := default .Title (index $coverData "title") -}} +{{- $coverTitle := index $coverData "title" -}} +{{- $coverDescription := index $coverData "description" -}} +{{- $coverAttribution := index $coverData "attribution" -}} +{{- $coverPrompt := index $coverData "prompt" -}} +{{- $hasCoverImage := and $showCover $coverImage -}} +{{- $hasCoverMeta := or $coverTitle $coverDescription $coverAttribution $coverPrompt -}} +{{- $showReadingTime := ge .ReadingTime 5 -}} +{{- $hasPublication := $showReadingTime -}} +{{- with .Date -}} + {{- $hasPublication = true -}} +{{- end -}} +{{- $breadcrumbsMarkup := partial "breadcrumbs.html" . -}} +{{- $hasBreadcrumbs := ne (strings.TrimSpace $breadcrumbsMarkup) "" -}} +{{- $pageLinksMarkup := partial "page-links.html" (dict + "Page" . + "CommentsURL" .Params.comments_url + "CommentsLabel" "Commentaires" + "LinkClass" "ui-button" + "Links" $remainingLinks +) -}} +{{- $hasPageLinks := ne (strings.TrimSpace $pageLinksMarkup) "" -}} +{{- $hasOriginCallout := and $isInterestingLink (ne $originURL "") -}} +{{- $hasMetaMain := or $hasBreadcrumbs $hasPublication $hasPageLinks $hasOriginCallout -}} +{{- $showCoverMeta := and (not $isInterestingLink) $coverPath $hasCoverMeta -}} +{{- $hasMetaBlock := or $hasCoverImage $hasMetaMain $showCoverMeta -}} + +
+ {{ partialCached "header-brand.html" .Site .Site.Title (.Site.Params.logo | default "logo-large.png") }} +

{{ .Title }}

+ + {{- if $hasMetaBlock -}} +
+ {{- if $hasCoverImage -}} +
+ + {{ $coverImageTitle }} + +
+ {{- end -}} + + +
+ {{- end -}} +
diff --git a/themes/2026/layouts/_partials/articles-list.html b/themes/2026/layouts/_partials/articles-list.html new file mode 100644 index 00000000..38f11465 --- /dev/null +++ b/themes/2026/layouts/_partials/articles-list.html @@ -0,0 +1,38 @@ +{{- $pages := slice -}} +{{- $showDossierBeforeTitle := false -}} +{{- $showInterestingLinksMeta := false -}} +{{- $externalLinksReport := dict -}} +{{- if reflect.IsMap . -}} + {{- with .Pages -}} + {{- $pages = . -}} + {{- end -}} + {{- if isset . "ShowDossierBeforeTitle" -}} + {{- $showDossierBeforeTitle = index . "ShowDossierBeforeTitle" -}} + {{- end -}} + {{- if isset . "ShowInterestingLinksMeta" -}} + {{- $showInterestingLinksMeta = index . "ShowInterestingLinksMeta" -}} + {{- end -}} + {{- if isset . "ExternalLinksReport" -}} + {{- $externalLinksReport = index . "ExternalLinksReport" -}} + {{- end -}} +{{- end -}} +{{- if gt (len $pages) 0 -}} + +{{- end -}} diff --git a/themes/2026/layouts/_partials/asides/comments.html b/themes/2026/layouts/_partials/asides/comments.html new file mode 100644 index 00000000..a65817bd --- /dev/null +++ b/themes/2026/layouts/_partials/asides/comments.html @@ -0,0 +1,7 @@ +{{- $url := .Params.comments_url -}} +{{- if $url -}} +
+

Échanger autour de ce texte

+

Si vous souhaitez réagir publiquement, un fil dédié vous attend ici.

+
+{{- end -}} diff --git a/themes/2026/layouts/_partials/asides/keywords.html b/themes/2026/layouts/_partials/asides/keywords.html new file mode 100644 index 00000000..82e8264a --- /dev/null +++ b/themes/2026/layouts/_partials/asides/keywords.html @@ -0,0 +1,38 @@ +{{- $ctx := . -}} +{{- $scratch := newScratch -}} +{{- $scratch.Set "blocks" 0 -}} +{{- range $taxonomy, $_ := $ctx.Site.Taxonomies -}} + {{- with $ctx.Page.GetTerms $taxonomy -}} + {{- $scratch.Add "blocks" 1 -}} + {{- end -}} +{{- end -}} +{{- with $ctx.Params.keywords -}} + {{- if gt (len .) 0 -}} + {{- $scratch.Add "blocks" 1 -}} + {{- end -}} +{{- end -}} + +{{- if gt ($scratch.Get "blocks") 0 -}} +
+
+ Taxonomies + {{- range $taxonomy, $_ := $ctx.Site.Taxonomies -}} + {{- with $ctx.Page.GetTerms $taxonomy -}} +
+ {{- $taxonomyPage := $ctx.Site.GetPage "taxonomy" $taxonomy -}} +

{{ with $taxonomyPage }}{{ .Title }}{{ else }}{{ humanize $taxonomy }}{{ end }}

+ {{- partial "keywords.html" . -}} +
+ {{- end -}} + {{- end -}} + {{- with $ctx.Params.keywords -}} + {{- if gt (len .) 0 -}} +
+

Mots-clés libres

+ {{- partial "keywords.html" . -}} +
+ {{- end -}} + {{- end -}} +
+
+{{- end -}} diff --git a/themes/2026/layouts/_partials/asides/oeuvres.html b/themes/2026/layouts/_partials/asides/oeuvres.html new file mode 100644 index 00000000..bf832833 --- /dev/null +++ b/themes/2026/layouts/_partials/asides/oeuvres.html @@ -0,0 +1,10 @@ +{{- $page := . -}} +{{- with $page.Params.oeuvres -}} + {{- range . -}} + {{- if eq . "L'Anankéisme" -}} + {{- partial "oeuvres/l-anankeisme.html" $page -}} + {{- else if eq . "L'Humain, cette espèce primitive" -}} + {{- partial "oeuvres/l-humain-cette-espece-primitive.html" $page -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/themes/2026/layouts/_partials/asides/toc.html b/themes/2026/layouts/_partials/asides/toc.html new file mode 100644 index 00000000..0bfb8427 --- /dev/null +++ b/themes/2026/layouts/_partials/asides/toc.html @@ -0,0 +1,30 @@ +{{- $toc := .TableOfContents -}} +{{- $hasTOC := gt (len (findRE "
  • " $toc)) 0 -}} +{{- $dossierSummary := partial "dossier-summary.html" (dict "Page" .) -}} +{{- $hasDossierSummary := ne (strings.TrimSpace $dossierSummary) "" -}} +{{- if or $hasDossierSummary $hasTOC -}} + {{- $tocMarkup := "" -}} + {{- if $hasTOC -}} + {{- $tocMarkup = replace $toc `` `` -}} + {{- end -}} + +{{- end -}} diff --git a/themes/2026/layouts/_partials/breadcrumbs.html b/themes/2026/layouts/_partials/breadcrumbs.html new file mode 100644 index 00000000..993d3d63 --- /dev/null +++ b/themes/2026/layouts/_partials/breadcrumbs.html @@ -0,0 +1,26 @@ +{{- $page := . -}} +{{- with .Page }}{{ $page = . }}{{ end -}} +{{- $trail := slice -}} +{{- if $page -}} + {{- range $page.Ancestors.Reverse -}} + {{- if ne .RelPermalink "/" -}} + {{- $trail = $trail | append . -}} + {{- end -}} + {{- end -}} + {{- if eq $page.Kind "term" -}} + {{- with site.GetPage "taxonomy" $page.Data.Plural -}} + {{- if not (in $trail .) -}} + {{- $trail = $trail | append . -}} + {{- end -}} + {{- end -}} + {{- end -}} +{{- end -}} +{{- if gt (len $trail) 0 -}} + +{{- end -}} diff --git a/themes/2026/layouts/_partials/card.html b/themes/2026/layouts/_partials/card.html new file mode 100644 index 00000000..45f53555 --- /dev/null +++ b/themes/2026/layouts/_partials/card.html @@ -0,0 +1,182 @@ +{{- $page := . -}} +{{- $showSection := true -}} +{{- $linkSection := true -}} +{{- $showMeta := true -}} +{{- $showDossierBeforeTitle := false -}} +{{- $showInterestingLinksMeta := false -}} +{{- $thumbnailSize := "large" -}} +{{- $externalLinksReport := dict -}} + +{{- if reflect.IsMap . -}} + {{- if isset . "Page" -}} + {{- $page = index . "Page" -}} + {{- end -}} + {{- if isset . "ShowSection" -}} + {{- $showSection = index . "ShowSection" -}} + {{- end -}} + {{- if isset . "LinkSection" -}} + {{- $linkSection = index . "LinkSection" -}} + {{- end -}} + {{- if isset . "ShowMeta" -}} + {{- $showMeta = index . "ShowMeta" -}} + {{- end -}} + {{- if isset . "ShowDossierBeforeTitle" -}} + {{- $showDossierBeforeTitle = index . "ShowDossierBeforeTitle" -}} + {{- end -}} + {{- if isset . "ShowInterestingLinksMeta" -}} + {{- $showInterestingLinksMeta = index . "ShowInterestingLinksMeta" -}} + {{- end -}} + {{- if isset . "ThumbnailSize" -}} + {{- $thumbnailSize = index . "ThumbnailSize" -}} + {{- end -}} + {{- if isset . "ExternalLinksReport" -}} + {{- $externalLinksReport = index . "ExternalLinksReport" -}} + {{- end -}} +{{- end -}} + +{{- $thumbnailTransform := "700x394" -}} +{{- if eq $thumbnailSize "small" -}} + {{- $thumbnailTransform = "340x191" -}} +{{- else if eq $thumbnailSize "spotlight" -}} + {{- $thumbnailTransform = "900x506" -}} +{{- end -}} + +{{- $coverPath := $page.Params.cover -}} +{{- $image := false -}} +{{- if $coverPath -}} + {{- if strings.HasSuffix $coverPath ".yaml" -}} + {{- $coverAbsPath := printf "%s%s" $page.File.Dir $coverPath -}} + {{- $coverRaw := readFile $coverAbsPath -}} + {{- $coverData := $coverRaw | transform.Unmarshal -}} + {{- with $coverData.file -}} + {{- $image = $page.Resources.GetMatch . -}} + {{- end -}} + {{- else -}} + {{- $image = $page.Resources.GetMatch $coverPath -}} + {{- end -}} +{{- end -}} + +{{- $dossierTitle := "" -}} +{{- $dossierFirstPage := false -}} +{{- with $page.Params.dossier -}} + {{- with index . 0 -}} + {{- $dossierTitle = . -}} + {{- if $showDossierBeforeTitle -}} + {{- $dossierFirstPage = partial "dossier-first-page.html" $page -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{- $originLink := "" -}} +{{- $originHost := "" -}} +{{- $statusTone := "unknown" -}} +{{- $statusLabel := "État inconnu" -}} +{{- $statusTitle := "" -}} +{{- $statusChecked := "" -}} +{{- if and $showMeta $showInterestingLinksMeta -}} + {{- with $page.Params.links -}} + {{- range . -}} + {{- if and (eq $originLink "") (not .archive) -}} + {{- with .url -}} + {{- $originLink = . -}} + {{- end -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- with partial "external-link-status.html" (dict "URL" $originLink "Report" $externalLinksReport) -}} + {{- with index . "Host" -}} + {{- $originHost = . -}} + {{- end -}} + {{- with index . "Tone" -}} + {{- $statusTone = . -}} + {{- end -}} + {{- with index . "Label" -}} + {{- $statusLabel = . -}} + {{- end -}} + {{- with index . "Title" -}} + {{- $statusTitle = . -}} + {{- end -}} + {{- with index . "CheckedAt" -}} + {{- $statusChecked = . -}} + {{- end -}} + {{- end -}} +{{- end -}} + +
    + {{- if $showDossierBeforeTitle -}} +
    + +
    + {{- with $image -}} + {{- $resized := .Fill $thumbnailTransform -}} + Image de couverture pour {{ $page.Title }} + {{- end -}} +
    +
    + {{- with $dossierTitle -}} + {{- with $dossierFirstPage -}} +

    {{ $dossierTitle }}

    + {{- end -}} + {{- end -}} +

    {{ $page.Title }}

    +
    + {{- else -}} + +
    + {{- with $image -}} + {{- $resized := .Fill $thumbnailTransform -}} + Image de couverture pour {{ $page.Title }} + {{- end -}} +
    +

    {{ $page.Title }}

    +
    + {{- end -}} + {{- with $page.Summary -}} +

    {{ . | plainify | truncate 180 }}

    + {{- end -}} + {{- if $showMeta -}} + {{- if $showInterestingLinksMeta -}} +
    +

    + {{- with $page.Date -}}{{- end -}} + {{- if and $page.Date $originHost -}}·{{- end -}} + {{- with $originHost -}} + {{- if $originLink -}} + {{ . }} + {{- else -}} + {{ . }} + {{- end -}} + {{- end -}} +

    +

    + {{ $statusLabel }} + {{- with $statusChecked -}}·{{- end -}} +

    +
    + {{- else -}} +

    + {{- with $page.Date -}} + + {{- end -}} + {{- if $showSection -}} + {{- with $page.Parent -}} + · + {{- if $linkSection -}} + {{ with .LinkTitle }}{{ . }}{{ else }}{{ .Title }}{{ end }} + {{- else -}} + {{ with .LinkTitle }}{{ . }}{{ else }}{{ .Title }}{{ end }} + {{- end -}} + {{- end -}} + {{- end -}} + {{- if and (not $showDossierBeforeTitle) $dossierTitle -}} + · + {{ $dossierTitle }} + {{- end -}} + {{- if and (not $page.IsSection) (ge $page.ReadingTime 5) -}} + · {{ $page.ReadingTime }} min + {{- end -}} +

    + {{- end -}} + {{- end -}} +
    diff --git a/themes/2026/layouts/_partials/dossier-first-page.html b/themes/2026/layouts/_partials/dossier-first-page.html new file mode 100644 index 00000000..d0cb5a9c --- /dev/null +++ b/themes/2026/layouts/_partials/dossier-first-page.html @@ -0,0 +1,31 @@ +{{- $page := . -}} +{{- $firstPage := false -}} + +{{- with $page.Params.dossier -}} + {{- $dossierID := index . 0 -}} + {{- if $dossierID -}} + {{- $group := where site.RegularPages "Params.dossier" "intersect" (slice $dossierID) -}} + {{- if gt (len $group) 0 -}} + {{- $weighted := slice -}} + {{- range $group -}} + {{- if isset .Params "weight" -}} + {{- $weighted = $weighted | append . -}} + {{- end -}} + {{- end -}} + + {{- $candidates := $group -}} + {{- if gt (len $weighted) 0 -}} + {{- $sortedByWeight := sort $weighted "Weight" "asc" -}} + {{- $minWeight := (index $sortedByWeight 0).Weight -}} + {{- $candidates = where $sortedByWeight "Weight" $minWeight -}} + {{- end -}} + + {{- $sortedByDate := sort $candidates "Date" "asc" -}} + {{- $firstDate := (index $sortedByDate 0).Date -}} + {{- $sameDate := where $sortedByDate "Date" $firstDate -}} + {{- $firstPage = index (sort $sameDate "RelPermalink" "asc") 0 -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{- return $firstPage -}} diff --git a/themes/2026/layouts/_partials/dossier-summary.html b/themes/2026/layouts/_partials/dossier-summary.html new file mode 100644 index 00000000..720bf4be --- /dev/null +++ b/themes/2026/layouts/_partials/dossier-summary.html @@ -0,0 +1,33 @@ +{{- $current := . -}} +{{- if reflect.IsMap . -}} + {{- with index . "Page" -}} + {{- $current = . -}} + {{- end -}} +{{- end -}} + +{{- with $current.Params.dossier -}} + {{- $dossierID := index . 0 -}} + {{- if $dossierID -}} + {{- $allPages := site.RegularPages -}} + {{- $filtered := where $allPages "Params.dossier" "intersect" (slice $dossierID) -}} + {{- $sorted := sort $filtered "RelPermalink" "asc" -}} + {{- $sorted = sort $sorted "Date" "asc" -}} + {{- $sorted = sort $sorted "Weight" "asc" -}} + {{- if gt (len $sorted) 1 -}} + + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/themes/2026/layouts/_partials/external-link-status.html b/themes/2026/layouts/_partials/external-link-status.html new file mode 100644 index 00000000..75da4594 --- /dev/null +++ b/themes/2026/layouts/_partials/external-link-status.html @@ -0,0 +1,128 @@ +{{- $url := "" -}} +{{- $report := dict -}} +{{- if reflect.IsMap . -}} + {{- with index . "URL" -}} + {{- $url = . -}} + {{- end -}} + {{- with index . "Report" -}} + {{- $report = . -}} + {{- end -}} +{{- end -}} + +{{- $entries := default (dict) (index $report "entries") -}} +{{- $deadLinks := default (slice) (index $report "links") -}} + +{{- $host := "" -}} +{{- with $url -}} + {{- $host = . | replaceRE "^https?://([^/]+).*$" "$1" | replaceRE "^www\\." "" -}} +{{- end -}} + +{{- $lookupURLs := slice -}} +{{- with $url -}} + {{- $lookupURLs = $lookupURLs | append . -}} + {{- if strings.HasSuffix . "/" -}} + {{- $withoutSlash := strings.TrimSuffix "/" . -}} + {{- if ne $withoutSlash . -}} + {{- $lookupURLs = $lookupURLs | append $withoutSlash -}} + {{- end -}} + {{- else -}} + {{- $lookupURLs = $lookupURLs | append (printf "%s/" .) -}} + {{- end -}} +{{- end -}} + +{{- $entry := dict -}} +{{- range $lookupURLs -}} + {{- if and (eq (len $entry) 0) (isset $entries .) -}} + {{- $entry = index $entries . -}} + {{- end -}} +{{- end -}} + +{{- $deadInfo := dict -}} +{{- range $lookupURLs -}} + {{- if eq (len $deadInfo) 0 -}} + {{- $matches := where $deadLinks "url" . -}} + {{- if gt (len $matches) 0 -}} + {{- $deadInfo = index $matches 0 -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{- $statusCode := 0 -}} +{{- $statusRaw := "" -}} +{{- $statusChecked := "" -}} +{{- $statusErrorType := "" -}} +{{- $statusTone := "unknown" -}} +{{- $statusLabel := "État inconnu" -}} +{{- $statusTitle := "" -}} + +{{- if gt (len $entry) 0 -}} + {{- with index $entry "status" -}} + {{- $statusString := printf "%v" . -}} + {{- if gt (len (findRE "^[0-9]+$" $statusString)) 0 -}} + {{- $statusCode = int $statusString -}} + {{- else -}} + {{- $statusRaw = $statusString -}} + {{- end -}} + {{- end -}} + {{- with index $entry "checkedAt" -}} + {{- $statusChecked = . -}} + {{- end -}} + {{- with index $entry "errorType" -}} + {{- $statusErrorType = . -}} + {{- end -}} +{{- end -}} + +{{- if and (eq $statusCode 0) (eq $statusRaw "") (gt (len $deadInfo) 0) -}} + {{- with index $deadInfo "status" -}} + {{- $statusString := printf "%v" . -}} + {{- if gt (len (findRE "^[0-9]+$" $statusString)) 0 -}} + {{- $statusCode = int $statusString -}} + {{- else -}} + {{- $statusRaw = $statusString -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{- if and (eq $statusErrorType "") (gt (len $deadInfo) 0) -}} + {{- with index $deadInfo "errorType" -}} + {{- $statusErrorType = . -}} + {{- end -}} +{{- end -}} + +{{- if gt $statusCode 0 -}} + {{- if lt $statusCode 400 -}} + {{- $statusTone = "ok" -}} + {{- $statusLabel = printf "OK %d" $statusCode -}} + {{- else if lt $statusCode 500 -}} + {{- $statusTone = "warn" -}} + {{- $statusLabel = printf "Erreur %d" $statusCode -}} + {{- $statusTitle = printf "Réponse HTTP %d lors de la dernière vérification" $statusCode -}} + {{- else -}} + {{- $statusTone = "dead" -}} + {{- $statusLabel = printf "Erreur %d" $statusCode -}} + {{- $statusTitle = printf "Réponse HTTP %d lors de la dernière vérification" $statusCode -}} + {{- end -}} +{{- else if ne $statusRaw "" -}} + {{- $statusTone = "dead" -}} + {{- $statusLabel = "Erreur" -}} + {{- $statusTitle = printf "Erreur %s lors de la dernière vérification" (upper $statusRaw) -}} +{{- else if ne $statusErrorType "" -}} + {{- $statusTone = "dead" -}} + {{- $statusLabel = "Erreur" -}} + {{- $statusTitle = printf "Erreur %s lors de la dernière vérification" (upper $statusErrorType) -}} +{{- end -}} + +{{- if and (ne $statusTitle "") (ne $statusChecked "") -}} + {{- $statusTitle = printf "%s (vérifié le %s)" $statusTitle ((time $statusChecked) | time.Format "02/01/2006") -}} +{{- end -}} + +{{- return dict + "Host" $host + "Code" $statusCode + "Raw" $statusRaw + "CheckedAt" $statusChecked + "ErrorType" $statusErrorType + "Tone" $statusTone + "Label" $statusLabel + "Title" $statusTitle +-}} diff --git a/themes/2026/layouts/_partials/footer.html b/themes/2026/layouts/_partials/footer.html new file mode 100644 index 00000000..5be7565e --- /dev/null +++ b/themes/2026/layouts/_partials/footer.html @@ -0,0 +1,37 @@ + diff --git a/themes/2026/layouts/_partials/head.html b/themes/2026/layouts/_partials/head.html new file mode 100644 index 00000000..d62618cc --- /dev/null +++ b/themes/2026/layouts/_partials/head.html @@ -0,0 +1,14 @@ + + +{{ if .IsHome }}{{ site.Title }}{{ else }}{{ printf "%s | %s" .Title site.Title }}{{ end }} +{{ with .Description }} + +{{ else }} +{{ with site.Params.description }} + +{{ end }} +{{ end }} + + + +{{ partialCached "head/css.html" . }} diff --git a/themes/2026/layouts/_partials/head/css.html b/themes/2026/layouts/_partials/head/css.html new file mode 100644 index 00000000..1cb9ed46 --- /dev/null +++ b/themes/2026/layouts/_partials/head/css.html @@ -0,0 +1,9 @@ +{{- $mainCSS := resources.Get "css/index.css" | postCSS (dict "inlineImports" true) -}} +{{- $bundle := slice $mainCSS | resources.Concat "css/bundle.css" -}} +{{- if eq hugo.Environment "development" -}} + +{{- else -}} +{{- with $bundle | minify | fingerprint -}} + +{{- end -}} +{{- end -}} diff --git a/themes/2026/layouts/_partials/header-brand.html b/themes/2026/layouts/_partials/header-brand.html new file mode 100644 index 00000000..a7e48b59 --- /dev/null +++ b/themes/2026/layouts/_partials/header-brand.html @@ -0,0 +1,3 @@ +
    + {{ partialCached "site-title.html" (dict "Site" .) .Title (.Params.logo | default "logo-large.png") }} +
    diff --git a/themes/2026/layouts/_partials/hero-page.html b/themes/2026/layouts/_partials/hero-page.html new file mode 100644 index 00000000..4ba8cb0b --- /dev/null +++ b/themes/2026/layouts/_partials/hero-page.html @@ -0,0 +1,14 @@ +
    + {{ partialCached "header-brand.html" .Site .Site.Title (.Site.Params.logo | default "logo-large.png") }} + {{ partial "breadcrumbs.html" . }} + {{ partial "page-meta.html" . }} +

    {{ .Title }}

    + {{ with .Description }} +

    {{ . }}

    + {{ else }} + {{ with .Summary }} +

    {{ . | plainify | truncate 220 }}

    + {{ end }} + {{ end }} + {{ partial "page-links.html" . }} +
    diff --git a/themes/2026/layouts/_partials/hero-section.html b/themes/2026/layouts/_partials/hero-section.html new file mode 100644 index 00000000..bb01875a --- /dev/null +++ b/themes/2026/layouts/_partials/hero-section.html @@ -0,0 +1,5 @@ +
    + {{ partialCached "header-brand.html" .Site .Site.Title (.Site.Params.logo | default "logo-large.png") }} + {{ partial "breadcrumbs.html" . }} +

    {{ .Title }}

    +
    diff --git a/themes/2026/layouts/_partials/hero.html b/themes/2026/layouts/_partials/hero.html new file mode 100644 index 00000000..00a80cfa --- /dev/null +++ b/themes/2026/layouts/_partials/hero.html @@ -0,0 +1,3 @@ +
    + {{ partialCached "header-brand.html" .Site .Site.Title (.Site.Params.logo | default "logo-large.png") }} +
    diff --git a/themes/2026/layouts/_partials/is-dossier-lead.html b/themes/2026/layouts/_partials/is-dossier-lead.html new file mode 100644 index 00000000..8d9bf622 --- /dev/null +++ b/themes/2026/layouts/_partials/is-dossier-lead.html @@ -0,0 +1,30 @@ +{{- $page := . -}} +{{- $isLead := true -}} +{{- with $page.Params.dossier -}} + {{- $dossierID := index . 0 -}} + {{- if $dossierID -}} + {{- $group := where site.RegularPages "Params.dossier" "intersect" (slice $dossierID) -}} + {{- if gt (len $group) 1 -}} + {{- $weighted := slice -}} + {{- range $group -}} + {{- if isset .Params "weight" -}} + {{- $weighted = $weighted | append . -}} + {{- end -}} + {{- end -}} + + {{- $candidates := $group -}} + {{- if gt (len $weighted) 0 -}} + {{- $sortedByWeight := sort $weighted "Weight" "asc" -}} + {{- $minWeight := (index $sortedByWeight 0).Weight -}} + {{- $candidates = where $sortedByWeight "Weight" $minWeight -}} + {{- end -}} + + {{- $sortedByDate := sort $candidates "Date" "asc" -}} + {{- $firstDate := (index $sortedByDate 0).Date -}} + {{- $sameDate := where $sortedByDate "Date" $firstDate -}} + {{- $firstPage := index (sort $sameDate "RelPermalink" "asc") 0 -}} + {{- $isLead = eq $firstPage.File.Path $page.File.Path -}} + {{- end -}} + {{- end -}} +{{- end -}} +{{- if $isLead -}}true{{- end -}} diff --git a/themes/2026/layouts/_partials/keywords.html b/themes/2026/layouts/_partials/keywords.html new file mode 100644 index 00000000..3b5b26f8 --- /dev/null +++ b/themes/2026/layouts/_partials/keywords.html @@ -0,0 +1,25 @@ +{{- $items := . -}} +{{- if gt (len $items) 0 -}} + +{{- end -}} diff --git a/themes/2026/layouts/_partials/liens-morts/report.html b/themes/2026/layouts/_partials/liens-morts/report.html new file mode 100644 index 00000000..c4d5be48 --- /dev/null +++ b/themes/2026/layouts/_partials/liens-morts/report.html @@ -0,0 +1,76 @@ +{{- $defaultReportPath := "tools/cache/external_links.yaml" -}} +{{- $reportPath := default $defaultReportPath .ReportPath -}} +{{- $report := default (dict) .Report -}} +{{- if or (eq (len $report) 0) (not (isset $report "links")) -}} + {{- if fileExists $reportPath -}} + {{- $report = transform.Unmarshal (readFile $reportPath) -}} + {{- else -}} + {{- warnf "Rapport des liens morts introuvable (%s)" $reportPath -}} + {{- end -}} +{{- end -}} + +{{- $allPages := where site.Pages ".File" "!=" nil -}} +{{- $links := default (slice) $report.links -}} +{{- $generatedLabel := "" -}} +{{- with $report.generatedAt -}} + {{- $generatedLabel = (time .).Format "02/01/2006" -}} +{{- end -}} + +
    +
    Dernière mise à jour
    +
    {{ $generatedLabel }}
    +
    Liens morts détectés
    +
    {{ len $links }}
    +
    + + + + + + + + + + + {{- range $links -}} + + + + + + {{- end -}} + +
    URLEmplacementsStatut
    {{ .url }} + {{- $locations := default (slice) .locations -}} + {{- if gt (len $locations) 0 -}} + {{- range $locations -}} + {{- $file := .file -}} + {{- $line := .line -}} + {{- $pagePath := .page -}} + {{- $matchedPage := false -}} + {{- if $pagePath -}} + {{- $candidate := site.GetPage $pagePath -}} + {{- if $candidate -}} + {{- $matchedPage = $candidate -}} + {{- end -}} + {{- end -}} + {{- if and (not $matchedPage) $file -}} + {{- $normalized := replaceRE "^content/" "" $file -}} + {{- $candidates := where $allPages "File.Path" $normalized -}} + {{- if gt (len $candidates) 0 -}} + {{- $matchedPage = index $candidates 0 -}} + {{- end -}} + {{- end -}} + {{- if $matchedPage -}} + {{ $matchedPage.Title }} + {{- else if $file -}} + {{ $file }}{{ if $line }}:{{ $line }}{{ end }} + {{- else -}} + Emplacement inconnu + {{- end -}} +
    + {{- end -}} + {{- else -}} + Emplacements inconnus + {{- end -}} +
    {{ .status }}
    diff --git a/themes/2026/layouts/_partials/list-layout.html b/themes/2026/layouts/_partials/list-layout.html new file mode 100644 index 00000000..df7a8968 --- /dev/null +++ b/themes/2026/layouts/_partials/list-layout.html @@ -0,0 +1,136 @@ +{{- $pages := .Pages -}} +{{- $context := .Context -}} +{{- $spotlightTitle := default "À la une" .SpotlightTitle -}} +{{- $showInterestingLinksMeta := false -}} +{{- $excludeInterestingLinks := false -}} +{{- $groupBySubSections := false -}} +{{- $subSections := slice -}} +{{- $externalLinksReport := dict -}} +{{- if fileExists "tools/cache/external_links.yaml" -}} + {{- $externalLinksReport = transform.Unmarshal (readFile "tools/cache/external_links.yaml") -}} +{{- end -}} +{{- with $context -}} + {{- if eq (strings.TrimSuffix "/" .RelPermalink) "/interets" -}} + {{- $excludeInterestingLinks = true -}} + {{- end -}} + {{- if and (eq .Kind "section") (gt (len .Sections) 0) -}} + {{- $groupBySubSections = true -}} + {{- range .Sections -}} + {{- $subSections = $subSections | append . -}} + {{- end -}} + {{- end -}} + {{- if eq .RelPermalink "/interets/liens-interessants/" -}} + {{- $showInterestingLinksMeta = true -}} + {{- end -}} +{{- end -}} + +{{- if $excludeInterestingLinks -}} + {{- $filteredPages := slice -}} + {{- range $pages -}} + {{- if not (strings.HasPrefix .RelPermalink "/interets/liens-interessants/") -}} + {{- $filteredPages = $filteredPages | append . -}} + {{- end -}} + {{- end -}} + {{- $pages = $filteredPages -}} +{{- end -}} +{{- $spotlightPages := first 8 $pages -}} +{{- $spotlightPermalinks := slice -}} +{{- range $spotlightPages -}} + {{- $spotlightPermalinks = $spotlightPermalinks | append .RelPermalink -}} +{{- end -}} +{{- $remainingPages := $pages -}} +{{- if gt (len $spotlightPermalinks) 0 -}} + {{- $remainingPages = where $pages "RelPermalink" "not in" $spotlightPermalinks -}} +{{- end -}} +{{- if gt (len $spotlightPages) 0 -}} +
    +
    +

    {{ $spotlightTitle }}

    +
    + {{ partial "spotlight-block.html" (dict + "Cards" $spotlightPages + "FeedPages" $spotlightPages + "ShowFeedTitle" false + "FeedRich" true + "ShowSection" true + "AsideFirst" false + ) }} +
    +{{- end -}} + +{{- if gt (len $remainingPages) 0 -}} +{{- if and $groupBySubSections (gt (len $subSections) 0) -}} +{{- $groupedPermalinks := slice -}} +{{- $groupedSections := slice -}} +{{- range $subSections -}} + {{- $subSection := . -}} + {{- $subSectionPages := slice -}} + {{- range $remainingPages -}} + {{- if strings.HasPrefix .RelPermalink $subSection.RelPermalink -}} + {{- $subSectionPages = $subSectionPages | append . -}} + {{- $groupedPermalinks = $groupedPermalinks | append .RelPermalink -}} + {{- end -}} + {{- end -}} + {{- if gt (len $subSectionPages) 0 -}} + {{- $latestDateKey := "00000000000000" -}} + {{- with index $subSectionPages 0 -}} + {{- $latestDateKey = .Date.Format "20060102150405" -}} + {{- end -}} + {{- $groupedSections = $groupedSections | append (dict + "Section" $subSection + "Pages" $subSectionPages + "LatestDateKey" $latestDateKey + ) -}} + {{- end -}} +{{- end -}} +{{- $groupedSections = sort $groupedSections "LatestDateKey" "desc" -}} +{{- range $groupedSections -}} + {{- $subSection := index . "Section" -}} + {{- $subSectionPages := index . "Pages" -}} +
    +
    +

    {{ with $subSection.LinkTitle }}{{ . }}{{ else }}{{ $subSection.Title }}{{ end }}

    +
    + {{ partial "articles-list.html" (dict + "Pages" $subSectionPages + "Context" $context + "ShowDossierBeforeTitle" true + "ShowInterestingLinksMeta" $showInterestingLinksMeta + "ExternalLinksReport" $externalLinksReport + ) }} +
    +{{- end -}} + +{{- $ungroupedPages := $remainingPages -}} +{{- if gt (len $groupedPermalinks) 0 -}} + {{- $ungroupedPages = where $remainingPages "RelPermalink" "not in" $groupedPermalinks -}} +{{- end -}} +{{- if gt (len $ungroupedPages) 0 -}} +
    +
    +

    Autres articles

    +
    + {{ partial "articles-list.html" (dict + "Pages" $ungroupedPages + "Context" $context + "ShowDossierBeforeTitle" true + "ShowInterestingLinksMeta" $showInterestingLinksMeta + "ExternalLinksReport" $externalLinksReport + ) }} +
    +{{- end -}} +{{- else -}} +
    +
    +

    Tous les articles

    +
    + {{ partial "articles-list.html" (dict + "Pages" $remainingPages + "Context" $context + "ShowDossierBeforeTitle" true + "ShowInterestingLinksMeta" $showInterestingLinksMeta + "ExternalLinksReport" $externalLinksReport + ) }} +
    +{{- end -}} +{{- end -}} diff --git a/themes/2026/layouts/_partials/media/render-image.html b/themes/2026/layouts/_partials/media/render-image.html new file mode 100644 index 00000000..9ad07247 --- /dev/null +++ b/themes/2026/layouts/_partials/media/render-image.html @@ -0,0 +1,51 @@ +{{- $imgPath := .Destination -}} +{{- $imgName := path.Base $imgPath | replaceRE "\\.[^.]+$" "" -}} +{{- $dataPath := printf "data/images/%s.yaml" $imgName -}} +{{- $dataFile := .Page.Resources.Get $dataPath -}} +{{- $data := dict -}} +{{- if $dataFile -}} + {{- $data = $dataFile.Content | transform.Unmarshal -}} +{{- end -}} +{{- $alt := .PlainText | default $data.title | default "" -}} +{{- $title := .Title | default $data.title | default .Page.Title -}} +{{- $description := $data.description | default "" -}} +{{- $image := .Page.Resources.GetMatch $imgPath -}} +{{- if not $image -}} + {{- return -}} +{{- end -}} +{{- $display := $image -}} +{{- if and (ne $display.MediaType.SubType "svg") (gt $display.Height 810) -}} + {{- $display = $image.Resize "x810" -}} +{{- end -}} +{{- $metaTitle := index $data "title" -}} +{{- $hasMeta := or $metaTitle (or $description (or $data.attribution $data.prompt)) -}} +
    + + {{ $alt }} + + {{- if $hasMeta -}} +
    +
    + {{- with $metaTitle -}} +

    {{ . | markdownify }}

    + {{- end -}} + {{- with $description -}} +

    {{ . | markdownify }}

    + {{- end -}} +
    + {{- if or $data.attribution $data.prompt -}} +
    + {{- with $data.attribution -}} +

    Attribution : {{ . | markdownify }}

    + {{- end -}} + {{- with $data.prompt -}} +
    + Prompt +

    {{ . | markdownify }}

    +
    + {{- end -}} +
    + {{- end -}} +
    + {{- end -}} +
    diff --git a/themes/2026/layouts/_partials/oeuvres/l-anankeisme.html b/themes/2026/layouts/_partials/oeuvres/l-anankeisme.html new file mode 100644 index 00000000..1e4af0bc --- /dev/null +++ b/themes/2026/layouts/_partials/oeuvres/l-anankeisme.html @@ -0,0 +1,18 @@ +
    +
    +
    + {{- $assetPath := "images/oeuvres/l-anankeisme.png" -}} + {{- $source := resources.Get $assetPath -}} + {{- if $source -}} + {{- $img := $source.Resize "320x" -}} + Couverture de L'Anankéisme + {{- end -}} +
    +

    L'Anankéisme

    +

    L'Anankéisme propose un cadre axiomatique en dix propositions pour penser un déterminisme absolu, une vérité indépendante de toute cognition et une définition rigoureuse du vivant.

    +

    + Acheter le livre + Découvrir le site dédié à l'Anankéisme +

    +
    +
    diff --git a/themes/2026/layouts/_partials/oeuvres/l-humain-cette-espece-primitive.html b/themes/2026/layouts/_partials/oeuvres/l-humain-cette-espece-primitive.html new file mode 100644 index 00000000..ca0bac8f --- /dev/null +++ b/themes/2026/layouts/_partials/oeuvres/l-humain-cette-espece-primitive.html @@ -0,0 +1,18 @@ +
    +
    +
    + {{- $assetPath := "images/oeuvres/l-humain-cette-espece-primitive.jpeg" -}} + {{- $source := resources.Get $assetPath -}} + {{- if $source -}} + {{- $img := $source.Resize "320x" -}} + Couverture de L'Humain, cette espèce primitive + {{- end -}} +
    +

    L'Humain, cette espèce primitive

    +

    L'Humain, cette espèce primitive est un essai dans lequel vous explorez plusieurs facettes de ce que nous appelons notre évolution, en adoptant la perspective de l'exploration spatiale.

    +

    + Acheter la version numérique + Lire le livre en ligne +

    +
    +
    diff --git a/themes/2026/layouts/_partials/page-links.html b/themes/2026/layouts/_partials/page-links.html new file mode 100644 index 00000000..898693b4 --- /dev/null +++ b/themes/2026/layouts/_partials/page-links.html @@ -0,0 +1,96 @@ +{{- $page := . -}} +{{- $commentsURL := "" -}} +{{- $commentsLabel := "Commentaires" -}} +{{- $linkClass := "" -}} +{{- $linksParam := $page.Params.links -}} + +{{- if reflect.IsMap . -}} + {{- if isset . "Page" -}} + {{- $page = index . "Page" -}} + {{- end -}} + {{- if isset . "CommentsURL" -}} + {{- with (index . "CommentsURL") -}} + {{- $commentsURL = . -}} + {{- end -}} + {{- end -}} + {{- if isset . "CommentsLabel" -}} + {{- with (index . "CommentsLabel") -}} + {{- $commentsLabel = . -}} + {{- end -}} + {{- end -}} + {{- if isset . "LinkClass" -}} + {{- with (index . "LinkClass") -}} + {{- $linkClass = . -}} + {{- end -}} + {{- end -}} + {{- if isset . "Links" -}} + {{- $linksParam = index . "Links" -}} + {{- end -}} +{{- end -}} + +{{- $links := slice -}} +{{- if $linksParam -}} + {{- $type := printf "%T" $linksParam -}} + {{- if hasPrefix $type "[]" -}} + {{- $links = $linksParam -}} + {{- else -}} + {{- $links = slice $linksParam -}} + {{- end -}} +{{- end -}} + +{{- $hasWikipediaLink := false -}} +{{- range $links -}} + {{- if and (not $hasWikipediaLink) (and .url (in .url "wikipedia.org")) -}} + {{- $hasWikipediaLink = true -}} + {{- end -}} +{{- end -}} + +{{- $addWikiLink := false -}} +{{- if and (eq $page.Kind "term") (not $hasWikipediaLink) -}} + {{- $addWikiLink = true -}} +{{- end -}} + +{{- if or (ne $commentsURL "") (gt (len $links) 0) $addWikiLink -}} + +{{- end -}} diff --git a/themes/2026/layouts/_partials/page-meta.html b/themes/2026/layouts/_partials/page-meta.html new file mode 100644 index 00000000..db9111b4 --- /dev/null +++ b/themes/2026/layouts/_partials/page-meta.html @@ -0,0 +1,8 @@ +

    + {{ with .Date }} + + {{ end }} + {{ if ge .ReadingTime 5 }} + {{ .ReadingTime }} min de lecture + {{ end }} +

    diff --git a/themes/2026/layouts/_partials/render/link.html b/themes/2026/layouts/_partials/render/link.html new file mode 100644 index 00000000..83adb563 --- /dev/null +++ b/themes/2026/layouts/_partials/render/link.html @@ -0,0 +1,115 @@ +{{- $isExternal := strings.HasPrefix .Destination "http" -}} +{{- $parsed := urls.Parse .Destination -}} +{{- $host := $parsed.Host -}} +{{- $path := $parsed.Path -}} +{{- $query := $parsed.RawQuery -}} +{{- $page := .Page -}} +{{- $site := $page.Site -}} +{{- $aff := index $site.Data.affiliates.sites $host -}} +{{- $isAffiliated := false -}} +{{- $newURL := .Destination -}} +{{- $customClass := "" -}} + +{{- if reflect.IsMap . -}} + {{- if isset . "Class" -}} + {{- with (index . "Class") -}} + {{- $customClass = . -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{- if and $isExternal $aff -}} + {{- $isAffiliated = true -}} + {{- if $query -}} + {{- $newURL = printf "%s://%s%s?%s&%s=%s" $parsed.Scheme $host $path $query $aff.param $aff.value -}} + {{- else -}} + {{- $newURL = printf "%s://%s%s?%s=%s" $parsed.Scheme $host $path $aff.param $aff.value -}} + {{- end -}} +{{- end -}} + +{{- $internalPage := "" -}} +{{- $internalPageFound := false -}} +{{- if not $isExternal -}} + {{- if strings.HasPrefix .Destination "/" -}} + {{- with $site.GetPage .Destination -}} + {{- $internalPage = . -}} + {{- $internalPageFound = true -}} + {{- end -}} + {{- else if and $path (ne $path "") -}} + {{- with $page.GetPage $path -}} + {{- $internalPage = . -}} + {{- $internalPageFound = true -}} + {{- end -}} + {{- end -}} + {{- if and (not $internalPageFound) $path (ne $path "") -}} + {{- with $site.GetPage $path -}} + {{- $internalPage = . -}} + {{- $internalPageFound = true -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{- $report := dict -}} +{{- if fileExists "tools/cache/external_links.yaml" -}} + {{- $report = transform.Unmarshal (readFile "tools/cache/external_links.yaml") -}} +{{- end -}} +{{- $deadList := default (slice) (index $report "links") -}} +{{- $entriesMap := default (dict) (index $report "entries") -}} +{{- $cacheEntry := index $entriesMap .Destination -}} +{{- $deadInfo := dict -}} +{{- $isDeadLink := false -}} +{{- with (first 1 (where $deadList "url" .Destination)) -}} + {{- $deadInfo = index . 0 -}} + {{- $isDeadLink = true -}} +{{- end -}} + +{{- $titleParts := slice -}} +{{- if $isAffiliated -}} + {{- $titleParts = $titleParts | append "Lien affilié" -}} +{{- else if $isExternal -}} + {{- $titleParts = $titleParts | append "Lien externe" -}} +{{- end -}} +{{- if and (not $isExternal) $internalPageFound -}} + {{- $internalTitle := $internalPage.LinkTitle | default $internalPage.Title -}} + {{- with $internalPage.Date -}} + {{- $internalTitle = printf "%s (%s)" $internalTitle (. | time.Format "02/01/2006") -}} + {{- end -}} + {{- $titleParts = $titleParts | append $internalTitle -}} +{{- else -}} + {{- with .Title -}} + {{- $titleParts = $titleParts | append . -}} + {{- end -}} +{{- end -}} +{{- if $isDeadLink -}} + {{- $deadDetails := slice -}} + {{- with (index $cacheEntry "checkedAt") -}} + {{- $deadDetails = $deadDetails | append (printf "inaccessible depuis le %s" (time.Format "02/01/2006" (time .))) -}} + {{- end -}} + {{- with (index $cacheEntry "errorType") -}} + {{- $deadDetails = $deadDetails | append (printf "raison %s" .) -}} + {{- end -}} + {{- with (index $deadInfo "status") -}} + {{- $deadDetails = $deadDetails | append (printf "statut %v" .) -}} + {{- end -}} + {{- if gt (len $deadDetails) 0 -}} + {{- $titleParts = $titleParts | append (printf "(%s)" (delimit $deadDetails " ; ")) -}} + {{- end -}} +{{- end -}} + +{{- $titleValue := delimit $titleParts " - " -}} +{{- $linkClasses := slice -}} +{{- if $isExternal -}} + {{- $linkClasses = $linkClasses | append "link-external" -}} +{{- end -}} +{{- if $isAffiliated -}} + {{- $linkClasses = $linkClasses | append "link-affiliated" -}} +{{- end -}} +{{- with $customClass -}} + {{- range (split . " ") -}} + {{- if ne . "" -}} + {{- $linkClasses = $linkClasses | append . -}} + {{- end -}} + {{- end -}} +{{- end -}} +{{- $classValue := delimit $linkClasses " " -}} +{{- strings.TrimSpace .Text | safeHTML -}}{{- "" -}} diff --git a/themes/2026/layouts/_partials/render/weather.html b/themes/2026/layouts/_partials/render/weather.html new file mode 100644 index 00000000..b6179352 --- /dev/null +++ b/themes/2026/layouts/_partials/render/weather.html @@ -0,0 +1,81 @@ +{{- $w := .Params.weather -}} +{{- if or (not $w) (eq (len $w) 0) -}} + {{- return -}} +{{- end -}} + +{{- $date := .Date -}} +{{- $hour := (time $date).Hour -}} +{{- $isNight := false -}} +{{- if or (lt $hour 6) (ge $hour 18) -}} + {{- $isNight = true -}} +{{- end -}} + +{{- $precip := $w.precipitations -}} +{{- $wind := $w.wind_speed -}} +{{- $humidity := $w.humidity -}} +{{- $illum := $w.illuminance -}} + +{{- $icon := "clear-day.svg" -}} +{{- if $isNight -}} + {{- $icon = "clear-night.svg" -}} +{{- end -}} + +{{- if $precip -}} + {{- $icon = "rain.svg" -}} +{{- else if and $wind (ge $wind 45) -}} + {{- $icon = "wind.svg" -}} +{{- else if and $humidity (ge $humidity 90) (or (not $illum) (lt $illum 80)) -}} + {{- $icon = "fog.svg" -}} +{{- else if and $humidity (ge $humidity 75) -}} + {{- if $isNight -}} + {{- $icon = "partly-cloudy-night.svg" -}} + {{- else -}} + {{- $icon = "cloudy.svg" -}} + {{- end -}} +{{- end -}} + +{{- $label := "Météo" -}} +{{- if eq $icon "clear-day.svg" -}}{{- $label = "Grand soleil" -}}{{- end -}} +{{- if eq $icon "clear-night.svg" -}}{{- $label = "Ciel dégagé" -}}{{- end -}} +{{- if eq $icon "partly-cloudy-day.svg" -}}{{- $label = "Partiellement nuageux" -}}{{- end -}} +{{- if eq $icon "partly-cloudy-night.svg" -}}{{- $label = "Partiellement nuageux" -}}{{- end -}} +{{- if eq $icon "cloudy.svg" -}}{{- $label = "Nuageux" -}}{{- end -}} +{{- if eq $icon "drizzle.svg" -}}{{- $label = "Bruine" -}}{{- end -}} +{{- if eq $icon "rain.svg" -}}{{- $label = "Pluvieux" -}}{{- end -}} +{{- if eq $icon "snow.svg" -}}{{- $label = "Neige" -}}{{- end -}} +{{- if eq $icon "thunderstorms-day.svg" -}}{{- $label = "Orage" -}}{{- end -}} +{{- if eq $icon "fog.svg" -}}{{- $label = "Brouillard" -}}{{- end -}} +{{- if eq $icon "wind.svg" -}}{{- $label = "Vent fort" -}}{{- end -}} + +{{- $sources := slice -}} +{{- with $w.source -}} + {{- if reflect.IsSlice . -}} + {{- $sources = . -}} + {{- else -}} + {{- $sources = slice . -}} + {{- end -}} +{{- end -}} + +
    +

    Météo observée

    +

    + {{ $label }} + {{ printf "%s à %s" (time.Format "02/01/2006" $date) (time.Format ":time_short" $date) }} +

    +
    + {{- with $w.temperature -}}
    Température
    {{ printf "%.1f" (mul . 1.0) }} °C
    {{- end -}} + {{- with $w.humidity -}}
    Humidité
    {{ printf "%.0f" (mul . 1.0) }} %
    {{- end -}} + {{- with $w.pressure -}}
    Pression
    {{ printf "%.0f" (mul . 1.0) }} hPa
    {{- end -}} + {{- with $w.illuminance -}}
    Luminosité
    {{ printf "%.0f" (mul . 1.0) }} lx
    {{- end -}} + {{- with $w.wind_speed -}}
    Vent
    {{ printf "%.1f" (mul . 1.0) }} km/h
    {{- end -}} + {{- with $w.wind_direction -}}
    Direction
    {{ printf "%.0f" (mul . 1.0) }}°
    {{- end -}} +
    + {{- if gt (len $sources) 0 -}} +

    + Sources: + {{- range $i, $source := $sources -}} + {{- if gt $i 0 -}}, {{- end -}}{{ $source }} + {{- end -}} +

    + {{- end -}} +
    diff --git a/themes/2026/layouts/_partials/site-stats.html b/themes/2026/layouts/_partials/site-stats.html new file mode 100644 index 00000000..d2932d4c --- /dev/null +++ b/themes/2026/layouts/_partials/site-stats.html @@ -0,0 +1,17 @@ +{{- $allSections := where .Site.Pages "Kind" "section" -}} +{{- $allSections = where $allSections "RelPermalink" "!=" "/" -}} +{{- $leafSections := slice -}} +{{- range $allSections -}} +{{- if eq (len .Sections) 0 -}} +{{- $leafSections = $leafSections | append . -}} +{{- end -}} +{{- end -}} +{{- $lastMod := .Site.Lastmod | time.Format "02/01/2006" -}} +
    +

    Statistiques

    + +
    diff --git a/themes/2026/layouts/_partials/site-title.html b/themes/2026/layouts/_partials/site-title.html new file mode 100644 index 00000000..3f9e421c --- /dev/null +++ b/themes/2026/layouts/_partials/site-title.html @@ -0,0 +1,13 @@ +{{- $site := .Site -}} +{{- if not $site -}} + {{- $site = . -}} +{{- end -}} +{{- $logoPath := $site.Params.logo | default "logo-large.png" -}} +{{- $logo := resources.GetMatch $logoPath -}} + + {{- with $logo -}} + {{- $resized := .Resize "64x" -}} + + {{- end -}} + {{ $site.Title }} + diff --git a/themes/2026/layouts/_partials/spotlight-block.html b/themes/2026/layouts/_partials/spotlight-block.html new file mode 100644 index 00000000..3227e6ec --- /dev/null +++ b/themes/2026/layouts/_partials/spotlight-block.html @@ -0,0 +1,38 @@ +{{- $cards := slice -}} +{{- with .Cards -}} + {{- $cards = . -}} +{{- end -}} + +{{- $feedPages := slice -}} +{{- with .FeedPages -}} + {{- $feedPages = . -}} +{{- end -}} + +{{- $asideFirst := false -}} +{{- with .AsideFirst -}} + {{- $asideFirst = . -}} +{{- end -}} + +{{- $showSection := false -}} +{{- with .ShowSection -}} + {{- $showSection = . -}} +{{- end -}} + +{{- $spotlightClass := "spotlight" -}} +{{- if $asideFirst -}} + {{- $spotlightClass = printf "%s spotlight-aside-first" $spotlightClass -}} +{{- end -}} + +
    + {{- if and $asideFirst (gt (len $feedPages) 0) -}} + {{ partial "spotlight-feed.html" . }} + {{- end -}} + + {{- range $cards -}} + {{ partial "card.html" (dict "Page" . "ShowSection" $showSection "LinkSection" false "ShowMeta" false "ThumbnailSize" "spotlight") }} + {{- end -}} + + {{- if and (not $asideFirst) (gt (len $feedPages) 0) -}} + {{ partial "spotlight-feed.html" . }} + {{- end -}} +
    diff --git a/themes/2026/layouts/_partials/spotlight-feed.html b/themes/2026/layouts/_partials/spotlight-feed.html new file mode 100644 index 00000000..8f711365 --- /dev/null +++ b/themes/2026/layouts/_partials/spotlight-feed.html @@ -0,0 +1,85 @@ +{{- $feedTitle := "Fil" -}} +{{- with .FeedTitle -}} + {{- $feedTitle = . -}} +{{- end -}} + +{{- $showFeedTitle := true -}} +{{- if isset . "ShowFeedTitle" -}} + {{- $showFeedTitle = index . "ShowFeedTitle" -}} +{{- end -}} + +{{- $feedPages := slice -}} +{{- with .FeedPages -}} + {{- $feedPages = . -}} +{{- end -}} + +{{- $feedRich := false -}} +{{- with .FeedRich -}} + {{- $feedRich = . -}} +{{- end -}} + +{{- $showSection := false -}} +{{- with .ShowSection -}} + {{- $showSection = . -}} +{{- end -}} + + diff --git a/themes/2026/layouts/_partials/terms.html b/themes/2026/layouts/_partials/terms.html new file mode 100644 index 00000000..2ca6f1b8 --- /dev/null +++ b/themes/2026/layouts/_partials/terms.html @@ -0,0 +1,14 @@ +{{- $page := .page -}} +{{- $taxonomy := .taxonomy -}} + +{{- with $page.GetTerms $taxonomy -}} + {{- $label := (index . 0).Parent.LinkTitle -}} +
    +

    {{ $label }}

    + +
    +{{- end -}} diff --git a/themes/2026/layouts/_partials/timeline-list.html b/themes/2026/layouts/_partials/timeline-list.html new file mode 100644 index 00000000..a6beb8bd --- /dev/null +++ b/themes/2026/layouts/_partials/timeline-list.html @@ -0,0 +1,78 @@ +{{- $pages := .Pages -}} +{{- if gt (len $pages) 0 -}} +
    +
    +

    Chronologie

    +
    +
      + {{- range $pages -}} + {{- $page := . -}} + {{- $coverPath := $page.Params.cover -}} + {{- $image := false -}} + {{- if $coverPath -}} + {{- if strings.HasSuffix $coverPath ".yaml" -}} + {{- $coverAbsPath := printf "%s%s" $page.File.Dir $coverPath -}} + {{- $coverRaw := readFile $coverAbsPath -}} + {{- $coverData := $coverRaw | transform.Unmarshal -}} + {{- with $coverData.file -}} + {{- $image = $page.Resources.GetMatch . -}} + {{- end -}} + {{- else -}} + {{- $image = $page.Resources.GetMatch $coverPath -}} + {{- end -}} + {{- end -}} + + {{- $dossierTitle := "" -}} + {{- $dossierFirstPage := false -}} + {{- with $page.Params.dossier -}} + {{- with index . 0 -}} + {{- $dossierTitle = . -}} + {{- $dossierFirstPage = partial "dossier-first-page.html" $page -}} + {{- end -}} + {{- end -}} + +
    1. +
      + {{- with $image -}} + +
      + {{- $resized := .Fill "600x340" -}} + Image de couverture pour {{ $page.Title }} +
      +
      + {{- end -}} +
      +
      +

      + {{- with $page.Date -}} + + {{- end -}} +

      + {{- with $dossierFirstPage -}} + {{- with $dossierTitle -}} +

      {{ $dossierTitle }}

      + {{- end -}} + {{- end -}} +

      {{ $page.Title }}

      +
      + {{- with $page.Summary -}} +

      {{ . | plainify | truncate 240 }}

      + {{- end -}} + +
      +
      +
    2. + {{- end -}} +
    +
    +{{- end -}} diff --git a/themes/2026/layouts/_shortcodes/extimage.html b/themes/2026/layouts/_shortcodes/extimage.html new file mode 100644 index 00000000..587af7ce --- /dev/null +++ b/themes/2026/layouts/_shortcodes/extimage.html @@ -0,0 +1,34 @@ +{{- $imageURL := .Get 0 -}} +{{- $title := .Get 2 | default "" -}} +{{- $description := .Get 3 | default "" -}} +{{- $attribution := .Get 4 | default "" -}} +{{- $remoteURL := printf "%s?raw=true" $imageURL -}} +{{- $remoteImage := resources.GetRemote $remoteURL -}} +{{- $hash := md5 $remoteURL -}} +{{- $extension := path.Ext $remoteURL -}} +{{- $cleanFilename := printf "%s%s" $hash $extension | replace "?raw=true" "" -}} +{{- $localImage := $remoteImage | resources.Copy (printf "remote-images/%s" $cleanFilename) -}} +{{- $resizedImage := $localImage.Resize "1024x" -}} +{{- $hasMeta := or $title (or $description $attribution) -}} +
    + + {{ $title }} + + {{- if $hasMeta -}} +
    +
    + {{- with $title -}} +

    {{ . | markdownify }}

    + {{- end -}} + {{- with $description -}} +

    {{ . | markdownify }}

    + {{- end -}} +
    + {{- with $attribution -}} +
    +

    Attribution : {{ . | markdownify }}

    +
    + {{- end -}} +
    + {{- end -}} +
    diff --git a/themes/2026/layouts/_shortcodes/sound.html b/themes/2026/layouts/_shortcodes/sound.html new file mode 100644 index 00000000..3dc85dd2 --- /dev/null +++ b/themes/2026/layouts/_shortcodes/sound.html @@ -0,0 +1,21 @@ +{{- $soundData := .Get 0 -}} +{{- $dataFile := .Page.Resources.Get (printf "data/sounds/%s.yaml" $soundData) -}} +{{- if $dataFile -}} + {{- $data := $dataFile.Content | transform.Unmarshal -}} + {{- $audio := .Page.Resources.Get $data.file -}} + {{- if $audio -}} +
    + + {{- if or $data.title (or $data.description $data.attribution) -}} +
    + {{- with $data.title -}}

    {{ . }}

    {{- end -}} + {{- with $data.description -}}

    {{ . | markdownify }}

    {{- end -}} + {{- with $data.attribution -}}

    Attribution : {{ . | markdownify }}

    {{- end -}} +
    + {{- end -}} +
    + {{- end -}} +{{- end -}} diff --git a/themes/2026/layouts/_shortcodes/video.html b/themes/2026/layouts/_shortcodes/video.html new file mode 100644 index 00000000..b75e6c5e --- /dev/null +++ b/themes/2026/layouts/_shortcodes/video.html @@ -0,0 +1,40 @@ +{{- $videoData := .Get 0 -}} +{{- $dataFile := .Page.Resources.Get (printf "data/videos/%s.yaml" $videoData) -}} +{{- if $dataFile -}} + {{- $data := $dataFile.Content | transform.Unmarshal -}} + {{- $video := .Page.Resources.Get $data.file -}} + {{- if $video -}} +{{- $hasMeta := or $data.title (or $data.description (or $data.attribution $data.prompt)) -}} +
    + + {{- if $hasMeta -}} +
    +
    + {{- with $data.title -}} +

    {{ . | markdownify }}

    + {{- end -}} + {{- with $data.description -}} +

    {{ . | markdownify }}

    + {{- end -}} +
    + {{- if or $data.attribution $data.prompt -}} +
    + {{- with $data.attribution -}} +

    Attribution : {{ . | markdownify }}

    + {{- end -}} + {{- with $data.prompt -}} +
    + Prompt +

    {{ . | markdownify }}

    +
    + {{- end -}} +
    + {{- end -}} +
    + {{- end -}} +
    + {{- end -}} +{{- end -}} diff --git a/themes/2026/layouts/baseof.html b/themes/2026/layouts/baseof.html new file mode 100644 index 00000000..41b7408f --- /dev/null +++ b/themes/2026/layouts/baseof.html @@ -0,0 +1,10 @@ + + + + {{ partial "head.html" . }} + + + {{ block "main" . }}{{ end }} + {{ partial "footer.html" . }} + + diff --git a/themes/2026/layouts/contact/single.html b/themes/2026/layouts/contact/single.html new file mode 100644 index 00000000..01276ff4 --- /dev/null +++ b/themes/2026/layouts/contact/single.html @@ -0,0 +1,23 @@ +{{ define "main" }} +{{ partial "article-header.html" . }} +
    +
    + {{ .Content }} + + {{- with .Params.oeuvres -}} +
    +
    +

    Mes livres

    +

    Si vous aimez ce blog, vous apprécierez mes livres. En les achetant, vous m'aidez à continuer de le faire vivre.

    +
    +
    + {{ partial "asides/oeuvres.html" $ }} +
    +
    + {{- end -}} + + {{ partial "article-footer.html" . }} +
    + {{ partial "asides/toc.html" . }} +
    +{{ end }} diff --git a/themes/2026/layouts/home.html b/themes/2026/layouts/home.html new file mode 100644 index 00000000..de2243c3 --- /dev/null +++ b/themes/2026/layouts/home.html @@ -0,0 +1,415 @@ +{{- define "main" -}} +{{- $site := .Site -}} +{{- $allArticles := $site.RegularPages.ByDate.Reverse -}} +{{- $recettesPrefix := "/interets/recettes/" -}} +{{- $interestsArticles := slice -}} +{{- $recettesArticles := slice -}} +{{- $critiquesArticles := slice -}} +{{- $veilleArticles := slice -}} +{{- range $allArticles -}} + {{- if eq (partial "is-dossier-lead.html" .) "true" -}} + {{- if strings.Contains .RelPermalink "/interets/liens-interessants/" -}} + {{- $veilleArticles = $veilleArticles | append . -}} + {{- else if strings.Contains .RelPermalink $recettesPrefix -}} + {{- $recettesArticles = $recettesArticles | append . -}} + {{- else if and (strings.Contains .RelPermalink "/interets/") (not (strings.Contains .RelPermalink $recettesPrefix)) -}} + {{- $interestsArticles = $interestsArticles | append . -}} + {{- else if strings.Contains .RelPermalink "/critiques/" -}} + {{- $critiquesArticles = $critiquesArticles | append . -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{- $interestsSections := slice -}} +{{- with $site.GetPage "/interets" -}} + {{- range .Sections -}} + {{- if and (not (strings.Contains .RelPermalink "/interets/liens-interessants/")) (not (strings.Contains .RelPermalink $recettesPrefix)) -}} + {{- $interestsSections = $interestsSections | append . -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{- $veilleRoot := $site.GetPage "/interets/liens-interessants" -}} +{{- $recettesRoot := $site.GetPage "/interets/recettes" -}} +{{- $collectionsRoot := $site.GetPage "/collections" -}} +{{- $critiquesRoot := $site.GetPage "/critiques" -}} +{{- $externalLinksReport := dict -}} +{{- if fileExists "tools/cache/external_links.yaml" -}} + {{- $externalLinksReport = transform.Unmarshal (readFile "tools/cache/external_links.yaml") -}} +{{- end -}} + +{{- partial "hero.html" . -}} + +{{- $interestsUsed := slice -}} +{{- $interestsSpotlight := first 8 $interestsArticles -}} +{{- range $interestsSpotlight -}} + {{- $interestsUsed = $interestsUsed | append .File.Path -}} +{{- end -}} + +{{- $interestsDeep := slice -}} +{{- range $interestsArticles -}} + {{- if and (lt (len $interestsDeep) 15) (not (in $interestsUsed .File.Path)) -}} + {{- $interestsDeep = $interestsDeep | append . -}} + {{- $interestsUsed = $interestsUsed | append .File.Path -}} + {{- end -}} +{{- end -}} + +{{- $interestsSectionEntries := slice -}} +{{- range $interestsSections -}} + {{- $section := . -}} + {{- $sectionPages := slice -}} + {{- $publishedCount := 0 -}} + {{- range $section.RegularPagesRecursive.ByDate.Reverse -}} + {{- if eq (partial "is-dossier-lead.html" .) "true" -}} + {{- $publishedCount = add $publishedCount 1 -}} + {{- if and (lt (len $sectionPages) 5) (not (in $interestsUsed .File.Path)) -}} + {{- $sectionPages = $sectionPages | append . -}} + {{- end -}} + {{- end -}} + {{- end -}} + {{- if gt (len $sectionPages) 0 -}} + {{- $latestDateKey := "00000000000000" -}} + {{- with index $sectionPages 0 -}} + {{- $latestDateKey = .Date.Format "20060102150405" -}} + {{- end -}} + {{- $interestsSectionEntries = $interestsSectionEntries | append (dict + "Section" $section + "Pages" $sectionPages + "PublishedCount" $publishedCount + "LatestDateKey" $latestDateKey + ) -}} + {{- end -}} +{{- end -}} +{{- $interestsSectionEntries = sort $interestsSectionEntries "LatestDateKey" "desc" -}} +{{- $recettesSpotlight := first 8 $recettesArticles -}} +{{- $collectionsEntries := slice -}} +{{- with $collectionsRoot -}} + {{- range .Sections -}} + {{- $section := . -}} + {{- $items := $section.RegularPagesRecursive.ByDate.Reverse -}} + {{- $latestItems := $items -}} + {{- $latestDateKey := "00000000000000" -}} + {{- if gt (len $items) 0 -}} + {{- with index $items 0 -}} + {{- $latestDateKey = .Date.Format "20060102150405" -}} + {{- end -}} + {{- end -}} + {{- $collectionsEntries = $collectionsEntries | append (dict + "Section" $section + "Items" (len $items) + "LatestItems" $latestItems + "LatestDateKey" $latestDateKey + ) -}} + {{- end -}} +{{- end -}} +{{- $collectionsEntries = sort $collectionsEntries "LatestDateKey" "desc" -}} + +{{- $critiquesDisplayed := slice -}} + +{{- $critiquesCategoryDefs := slice -}} +{{- $critiquesCategoryDefs = $critiquesCategoryDefs | append (dict "Path" "/critiques/films") -}} +{{- $critiquesCategoryDefs = $critiquesCategoryDefs | append (dict "Path" "/critiques/series") -}} +{{- $critiquesCategoryDefs = $critiquesCategoryDefs | append (dict "Path" "/critiques/jeux-video") -}} +{{- $critiquesCategoryDefs = $critiquesCategoryDefs | append (dict "Path" "/critiques/livres") -}} + +
    + {{- if gt (len $interestsSpotlight) 0 -}} +
    +
    +

    À la une

    +
    + {{ partial "spotlight-block.html" (dict + "Cards" $interestsSpotlight + "FeedPages" $interestsSpotlight + "FeedTitle" "Fil de publication" + "ShowFeedTitle" false + "FeedRich" true + "ShowSection" true + "AsideFirst" false + ) }} +
    + {{- end -}} + + {{- if gt (len $interestsDeep) 0 -}} +
    +
    +

    Articles de fond

    +
    + {{ partial "articles-list.html" (dict "Pages" $interestsDeep "Context" . "ShowDossierBeforeTitle" true) }} +
    + {{- end -}} + +
    +
    +

    Mes livres

    +

    Si vous aimez ce blog, vous apprécierez mes livres. En les achetant, vous m'aidez à continuer de le faire vivre.

    +
    +
    + {{ partial "oeuvres/l-anankeisme.html" . }} + {{ partial "oeuvres/l-humain-cette-espece-primitive.html" . }} +
    +
    + + {{- if gt (len $interestsSectionEntries) 0 -}} +
    +
    +

    Rubriques

    +
    +
    + {{- range $interestsSectionEntries -}} + {{- $section := index . "Section" -}} + {{- $sectionPages := index . "Pages" -}} + {{- $publishedCount := index . "PublishedCount" -}} + {{- if gt (len $sectionPages) 0 -}} +
    +
    +

    {{ with $section.LinkTitle }}{{ . }}{{ else }}{{ $section.Title }}{{ end }}

    +

    {{ $publishedCount }} {{ if eq $publishedCount 1 }}article{{ else }}articles{{ end }}

    +
    +
      + {{- range $sectionPages -}} + {{- $page := . -}} + {{- $dossierTitle := "" -}} + {{- $dossierFirstPage := false -}} + {{- with $page.Params.dossier -}} + {{- with index . 0 -}} + {{- $dossierTitle = . -}} + {{- $dossierFirstPage = partial "dossier-first-page.html" $page -}} + {{- end -}} + {{- end -}} +
    • + {{- with $dossierFirstPage -}} + {{- with $dossierTitle -}} +

      {{ $dossierTitle }}

      + {{- end -}} + {{- end -}} + {{ $page.Title }} + {{- with $page.Date -}}{{- end -}} +
    • + {{- end -}} +
    +
    + {{- end -}} + {{- end -}} +
    +
    + {{- end -}} + + {{- if gt (len $critiquesArticles) 0 -}} +
    +
    +

    + {{- with $critiquesRoot -}} + {{ with .LinkTitle }}{{ . }}{{ else }}{{ .Title }}{{ end }} + {{- else -}} + Critiques + {{- end -}} +

    +
    +
    + {{- end -}} + + {{- range $critiqueIndex, $critiqueDef := $critiquesCategoryDefs -}} + {{- $critiquePath := index $critiqueDef "Path" -}} + {{- $critiquePrefix := printf "%s/" (strings.TrimSuffix "/" $critiquePath) -}} + {{- $critiqueSection := $site.GetPage $critiquePath -}} + {{- $critiquePool := slice -}} + {{- range $critiquesArticles -}} + {{- if and (strings.Contains .RelPermalink $critiquePrefix) (not (in $critiquesDisplayed .File.Path)) -}} + {{- $critiquePool = $critiquePool | append . -}} + {{- end -}} + {{- end -}} + + {{- $critiqueSpotlight := first 8 $critiquePool -}} + {{- range $critiqueSpotlight -}} + {{- $critiquesDisplayed = $critiquesDisplayed | append .File.Path -}} + {{- end -}} + + {{- if gt (len $critiqueSpotlight) 0 -}} +
    +
    +

    + {{- with $critiqueSection -}} + {{- with .LinkTitle -}}{{ . }}{{- else -}}{{ .Title }}{{- end -}} + {{- else -}} + Critiques + {{- end -}} +

    +
    + {{ partial "spotlight-block.html" (dict + "Cards" $critiqueSpotlight + "FeedPages" $critiqueSpotlight + "FeedTitle" "Dernières critiques" + "ShowFeedTitle" false + "FeedRich" true + "ShowSection" false + "AsideFirst" (eq (mod $critiqueIndex 2) 1) + ) }} +
    + {{- end -}} + {{- end -}} + + {{- if gt (len $veilleArticles) 0 -}} + + {{- end -}} + + {{- if gt (len $recettesSpotlight) 0 -}} +
    +
    +

    + {{- with $recettesRoot -}} + {{ with .LinkTitle }}{{ . }}{{ else }}{{ .Title }}{{ end }} + {{- else -}} + Recettes + {{- end -}} +

    +
    + {{ partial "spotlight-block.html" (dict + "Cards" $recettesSpotlight + "FeedPages" $recettesSpotlight + "FeedTitle" "Dernières recettes" + "ShowFeedTitle" false + "FeedRich" true + "ShowSection" false + "AsideFirst" false + ) }} +
    + {{- end -}} + + {{- if gt (len $collectionsEntries) 0 -}} +
    +
    +

    + {{- with $collectionsRoot -}} + {{ with .LinkTitle }}{{ . }}{{ else }}{{ .Title }}{{ end }} + {{- else -}} + Collections + {{- end -}} +

    +
    +
    + {{- range $collectionsEntries -}} + {{- $section := index . "Section" -}} + {{- $latestItems := index . "LatestItems" -}} +
    +

    {{ with $section.LinkTitle }}{{ . }}{{ else }}{{ $section.Title }}{{ end }}

    + {{- if gt (len $latestItems) 0 -}} + + {{- end -}} +

    + {{ index . "Items" }} objets + {{- range $section.Sections.ByTitle -}} + {{ with .LinkTitle }}{{ . }}{{ else }}{{ .Title }}{{ end }} + {{- end -}} +

    +
    + {{- end -}} +
    +
    + {{- end -}} +
    +{{- end -}} diff --git a/themes/2026/layouts/index.rss.xml b/themes/2026/layouts/index.rss.xml new file mode 100644 index 00000000..fa1c6c1b --- /dev/null +++ b/themes/2026/layouts/index.rss.xml @@ -0,0 +1,58 @@ +{{- $authorEmail := "" -}} +{{- $authorName := "" -}} +{{- $favicon := "favicon.png" | absURL -}} +{{- with site.Params.author -}} + {{- if reflect.IsMap . -}} + {{- with .email }}{{- $authorEmail = . -}}{{- end -}} + {{- with .name }}{{- $authorName = . -}}{{- end -}} + {{- else -}} + {{- $authorName = . -}} + {{- end -}} +{{- end -}} + +{{- $pctx := . -}} +{{- if .IsHome -}}{{- $pctx = .Site -}}{{- end -}} + +{{- $pages := slice -}} +{{- if or .IsHome .IsSection -}} + {{- $pages = $pctx.RegularPages -}} +{{- else -}} + {{- $pages = $pctx.Pages -}} +{{- end -}} + +{{- $pages = $pages.ByLastmod.Reverse -}} +{{- $limit := .Site.Config.Services.RSS.Limit -}} +{{- if ge $limit 1 -}} + {{- $pages = first $limit $pages -}} +{{- end -}} +{{- printf "" | safeHTML -}} + + + {{ .Site.Title }} + {{ .Permalink }} + {{ .Site.Title }} + + {{ $favicon }} + {{ .Site.Title }} + {{ .Permalink }} + + {{ site.Language.LanguageCode }}{{ with $authorEmail }} + {{.}}{{ with $authorName }} ({{ . }}){{ end }}{{ end }}{{ with $authorEmail }} + {{ . }}{{ with $authorName }} ({{ . }}){{ end }}{{ end }}{{ with .Site.Copyright }} + {{ . }}{{ end }}{{ if not .Date.IsZero }} + {{ (index $pages.ByLastmod.Reverse 0).Lastmod.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}{{ end }} + {{- with .OutputFormats.Get "RSS" }} + {{ printf "" .Permalink .MediaType | safeHTML }} + {{- end }} + {{- range $pages }} + + {{ .Title }} + {{ .Permalink }} + {{ .PublishDate.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }} + {{- with $authorEmail }}{{ . }}{{ with $authorName }} ({{ . }}){{ end }}{{ end }} + {{ .Permalink }} + {{ .Summary | transform.XMLEscape | safeHTML }} + + {{- end }} + + diff --git a/themes/2026/layouts/liens-morts/single.html b/themes/2026/layouts/liens-morts/single.html new file mode 100644 index 00000000..1687c95c --- /dev/null +++ b/themes/2026/layouts/liens-morts/single.html @@ -0,0 +1,11 @@ +{{ define "main" }} +{{ partial "article-header.html" . }} +
    +
    + {{ .Content }} + {{ partial "liens-morts/report.html" (dict "Page" .) }} + {{ partial "article-footer.html" . }} +
    + {{ partial "asides/toc.html" . }} +
    +{{ end }} diff --git a/themes/2026/layouts/page.html b/themes/2026/layouts/page.html new file mode 100644 index 00000000..113cb180 --- /dev/null +++ b/themes/2026/layouts/page.html @@ -0,0 +1,10 @@ +{{ define "main" }} +{{ partial "article-header.html" . }} +
    +
    + {{ .Content }} + {{ partial "article-footer.html" . }} +
    + {{ partial "asides/toc.html" . }} +
    +{{ end }} diff --git a/themes/2026/layouts/section.html b/themes/2026/layouts/section.html new file mode 100644 index 00000000..c989c135 --- /dev/null +++ b/themes/2026/layouts/section.html @@ -0,0 +1,13 @@ +{{ define "main" }} +{{ partial "hero.html" . }} +
    + {{- $pages := .RegularPagesRecursive.ByDate.Reverse -}} + {{ with .Content }} +
    + {{ . }} +
    + {{ end }} + + {{ partial "list-layout.html" (dict "Pages" $pages "Context" . "Site" .Site "SpotlightTitle" .Title) }} +
    +{{ end }} diff --git a/themes/2026/layouts/taxonomies/taxonomies.html b/themes/2026/layouts/taxonomies/taxonomies.html new file mode 100644 index 00000000..7a3168eb --- /dev/null +++ b/themes/2026/layouts/taxonomies/taxonomies.html @@ -0,0 +1,25 @@ +{{ define "main" }} +{{ partial "article-header.html" . }} +
    +
    + {{ .Content }} + +
    +

    Taxonomies

    +
      + {{- range $taxonomy, $terms := .Site.Taxonomies -}} + {{- with $.Site.GetPage $taxonomy -}} +
    • + {{ .Title }} + {{ len $terms }} +
    • + {{- end -}} + {{- end -}} +
    +
    + + {{ partial "article-footer.html" . }} +
    + {{ partial "asides/toc.html" . }} +
    +{{ end }} diff --git a/themes/2026/layouts/taxonomy.html b/themes/2026/layouts/taxonomy.html new file mode 100644 index 00000000..58dbb010 --- /dev/null +++ b/themes/2026/layouts/taxonomy.html @@ -0,0 +1,63 @@ +{{ define "main" }} +{{ partial "hero-section.html" . }} +
    + {{ with .Content }} +
    + {{ . }} +
    + {{ end }} + + {{- $pages := .Pages -}} + {{- if gt (len $pages) 0 -}} + {{- $sorted := $pages.ByTitle -}} + {{- $scratch := newScratch -}} + {{- $scratch.Set "group" "" -}} + + {{- range $sorted -}} + {{- $title := strings.TrimSpace (default .Title .LinkTitle) -}} + {{- if $title -}} + {{- $firstChar := slicestr $title 0 1 -}} + {{- $upper := strings.ToUpper $firstChar -}} + {{- $normalized := $upper -}} + {{- $normalized = replaceRE "[ÀÁÂÃÄÅĀĂĄÆ]" "A" $normalized -}} + {{- $normalized = replaceRE "[ÇĆĈĊČ]" "C" $normalized -}} + {{- $normalized = replaceRE "[ÈÉÊËĒĔĖĘĚ]" "E" $normalized -}} + {{- $normalized = replaceRE "[ÌÍÎÏĨĪĬĮİ]" "I" $normalized -}} + {{- $normalized = replaceRE "[ÑŃŅŇ]" "N" $normalized -}} + {{- $normalized = replaceRE "[ÒÓÔÕÖŌŎŐØŒ]" "O" $normalized -}} + {{- $normalized = replaceRE "[ÙÚÛÜŨŪŬŮŰŲ]" "U" $normalized -}} + {{- $normalized = replaceRE "[ÝŸŶ]" "Y" $normalized -}} + + {{- $letterKey := "#" -}} + {{- if gt (len (findRE "^[A-Z]$" $normalized)) 0 -}} + {{- $letterKey = $normalized -}} + {{- end -}} + + {{- $current := $scratch.Get "group" -}} + {{- if ne $letterKey $current -}} + {{- if ne $current "" -}} + + + {{- end -}} +
    +

    {{ $letterKey }}

    +
      + {{- $scratch.Set "group" $letterKey -}} + {{- end -}} + +
    • + {{ $title }} + {{ with .Pages }}{{ len . }}{{ else }}0{{ end }} +
    • + {{- end -}} + {{- end -}} + + {{- if ne ($scratch.Get "group") "" -}} +
    +
    + {{- end -}} + {{- else -}} +

    Aucun mot-clé disponible pour cette taxonomie.

    + {{- end -}} +
    +{{ end }} diff --git a/themes/2026/layouts/term.html b/themes/2026/layouts/term.html new file mode 100644 index 00000000..ff5be306 --- /dev/null +++ b/themes/2026/layouts/term.html @@ -0,0 +1,13 @@ +{{ define "main" }} +{{ partial "hero.html" . }} +
    + {{- $pages := .Pages.ByDate.Reverse -}} + {{ with .Content }} +
    + {{ . }} +
    + {{ end }} + + {{ partial "list-layout.html" (dict "Pages" $pages "Context" . "Site" .Site "SpotlightTitle" .Title) }} +
    +{{ end }}