1

Nouveau thème pour 2026

This commit is contained in:
2026-02-21 01:50:39 +01:00
parent 27dd5f86e6
commit a7f539ceb4
67 changed files with 6137 additions and 21 deletions

View File

@@ -0,0 +1,304 @@
/* En-tête darticle (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);
}
}

View File

@@ -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);
}

File diff suppressed because it is too large Load Diff

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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";

View File

@@ -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);
}

View File

@@ -0,0 +1,5 @@
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}

View File

@@ -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;
}
}

View File

@@ -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;
}

View File

@@ -0,0 +1,20 @@
{{ define "main" }}
{{- $recentPages := first 6 (site.RegularPages.ByDate.Reverse) -}}
<header>
{{ partialCached "header-brand.html" .Site .Site.Title (.Site.Params.logo | default "logo-large.png") }}
<h1>Page introuvable</h1>
</header>
<main>
<article>
<p>Le contenu que vous recherchez n'existe pas.</p>
<p>Si vous pensez qu'il s'agit d'une erreur, je vous invite à <a href="/contact/">me contacter</a> en me communiquant l'adresse visitée et l'adresse ciblée.</p>
</article>
{{ if gt (len $recentPages) 0 }}
<section>
<header><h2>Derniers articles</h2></header>
{{ partial "articles-list.html" (dict "Pages" $recentPages "Context" .) }}
</section>
{{ end }}
</main>
{{ end }}

View File

@@ -0,0 +1 @@
{{- partial "media/render-image.html" . -}}

View File

@@ -0,0 +1 @@
{{- partial "render/link.html" . -}}

View File

@@ -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 -}}
<footer class="article-footer">
<nav class="article-footer-dossier-nav" aria-label="Navigation dans le dossier">
<p class="article-footer-dossier-nav-label"><span>Dossier</span><strong>{{ $dossierID }}</strong></p>
<div class="article-footer-dossier-nav-links">
{{- with $prev -}}
<p class="article-footer-dossier-nav-link article-footer-dossier-nav-link-prev">
<span>Page précédente</span>
<a href="{{ .RelPermalink }}" title="{{ .Title }}">{{ .Title }}</a>
</p>
{{- end -}}
{{- with $next -}}
<p class="article-footer-dossier-nav-link article-footer-dossier-nav-link-next">
<span>Page suivante</span>
<a href="{{ .RelPermalink }}" title="{{ .Title }}">{{ .Title }}</a>
</p>
{{- end -}}
</div>
</nav>
</footer>
{{- end -}}
{{- end -}}
{{- end -}}
{{- end -}}

View File

@@ -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 -}}
<header class="article-header{{ if $isInterestingLink }} article-header--interesting-link{{ end }}">
{{ partialCached "header-brand.html" .Site .Site.Title (.Site.Params.logo | default "logo-large.png") }}
<h1>{{ .Title }}</h1>
{{- if $hasMetaBlock -}}
<section class="article-meta-block{{ if not $hasCoverImage }} article-meta-block--without-cover{{ end }}">
{{- if $hasCoverImage -}}
<figure class="article-cover">
<a href="{{ $coverImage.RelPermalink }}" title="Cliquez pour agrandir l'image d'en-tête">
<img src="{{ $coverDisplay.RelPermalink }}" alt="{{ $coverImageTitle }}" title="{{ $coverImageTitle }}">
</a>
</figure>
{{- end -}}
<section class="article-meta">
<section class="article-meta-main">
{{- if $hasBreadcrumbs -}}
{{- $breadcrumbsMarkup | safeHTML -}}
{{- end -}}
{{- if $hasPublication -}}
<p class="article-publication">
{{ with .Date }}
{{- $timePart := . | time.Format "15:04:05" -}}
<time datetime="{{ . }}">
{{- if eq $timePart "00:00:00" -}}
{{ . | time.Format "02/01/2006" }}
{{- else -}}
{{ . | time.Format "02/01/2006 à 15:04" }}
{{- end -}}
</time>
{{- if $showReadingTime -}}
<span>·</span>
{{- end -}}
{{ end }}
{{- if $showReadingTime -}}
<span>{{ .ReadingTime }} min</span>
{{- end -}}
</p>
{{- end -}}
{{- if $hasOriginCallout -}}
<section class="article-origin-link" aria-label="Lien d'origine">
<p class="article-origin-link-kicker">À lire avant mon commentaire</p>
<p class="article-origin-link-hint">Ce billet n'est qu'une note de lecture. Lisez d'abord la source pour avoir le contexte complet.</p>
<p class="article-origin-link-button">
<a href="{{ $originURL }}" class="ui-button{{ if $originIsExternal }} link-external{{ end }}"{{ if $originIsExternal }} rel="noreferrer noopener"{{ end }} title="Lire la page d'origine">
<span class="article-origin-link-button-label">{{ $originLabel }}</span>
<span class="article-origin-link-button-url">{{ $originURL }}</span>
</a>
</p>
</section>
{{- end -}}
{{- if $hasPageLinks -}}
{{- $pageLinksMarkup | safeHTML -}}
{{- end -}}
</section>
{{- if $showCoverMeta -}}
<section class="cover-meta">
<h2>Image d'en-tête</h2>
{{- with $coverTitle -}}
<p class="cover-title">{{ . | markdownify }}</p>
{{- end -}}
{{- with $coverDescription -}}
<p class="cover-description">{{ . | markdownify }}</p>
{{- end -}}
{{- with $coverAttribution -}}
<p class="cover-attribution"><strong>Attribution:</strong> <span>{{ . | markdownify }}</span></p>
{{- end -}}
{{- with $coverPrompt -}}
<details>
<summary>Prompt</summary>
<p>{{ . | markdownify }}</p>
</details>
{{- end -}}
</section>
{{- end -}}
</section>
</section>
{{- end -}}
</header>

View File

@@ -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 -}}
<nav class="articles-list" aria-label="Liste d articles">
<ol>
{{- range $index, $page := $pages -}}
{{- $thumbnailSize := "small" -}}
{{- $positionInBlock := mod (add $index 1) 10 -}}
{{- if or (eq $positionInBlock 5) (eq $positionInBlock 6) -}}
{{- $thumbnailSize = "large" -}}
{{- end -}}
<li>{{ partial "card.html" (dict
"Page" $page
"ShowDossierBeforeTitle" $showDossierBeforeTitle
"ShowInterestingLinksMeta" $showInterestingLinksMeta
"ExternalLinksReport" $externalLinksReport
"ThumbnailSize" $thumbnailSize
) }}</li>
{{- end -}}
</ol>
</nav>
{{- end -}}

View File

@@ -0,0 +1,7 @@
{{- $url := .Params.comments_url -}}
{{- if $url -}}
<section>
<h2>Échanger autour de ce texte</h2>
<p>Si vous souhaitez réagir publiquement, <a href="{{ $url }}" target="_blank" rel="noopener">un fil dédié vous attend ici</a>.</p>
</section>
{{- end -}}

View File

@@ -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 -}}
<section>
<details>
<summary>Taxonomies</summary>
{{- range $taxonomy, $_ := $ctx.Site.Taxonomies -}}
{{- with $ctx.Page.GetTerms $taxonomy -}}
<section>
{{- $taxonomyPage := $ctx.Site.GetPage "taxonomy" $taxonomy -}}
<h2>{{ with $taxonomyPage }}{{ .Title }}{{ else }}{{ humanize $taxonomy }}{{ end }}</h2>
{{- partial "keywords.html" . -}}
</section>
{{- end -}}
{{- end -}}
{{- with $ctx.Params.keywords -}}
{{- if gt (len .) 0 -}}
<section>
<h2>Mots-clés libres</h2>
{{- partial "keywords.html" . -}}
</section>
{{- end -}}
{{- end -}}
</details>
</section>
{{- end -}}

View File

@@ -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 -}}

View File

@@ -0,0 +1,30 @@
{{- $toc := .TableOfContents -}}
{{- $hasTOC := gt (len (findRE "<li>" $toc)) 0 -}}
{{- $dossierSummary := partial "dossier-summary.html" (dict "Page" .) -}}
{{- $hasDossierSummary := ne (strings.TrimSpace $dossierSummary) "" -}}
{{- if or $hasDossierSummary $hasTOC -}}
{{- $tocMarkup := "" -}}
{{- if $hasTOC -}}
{{- $tocMarkup = replace $toc `<nav id="TableOfContents">` `<div class="article-toc-list">` -}}
{{- $tocMarkup = replace $tocMarkup `</nav>` `</div>` -}}
{{- end -}}
<aside class="article-toc">
{{- if $hasDossierSummary -}}
<details class="article-toc-drawer article-toc-drawer-dossier">
<summary class="ui-button ui-button--vertical"><span>Dossier</span></summary>
<div class="article-toc-drawer-panel">
{{- $dossierSummary | safeHTML -}}
</div>
</details>
{{- end -}}
{{- if $hasTOC -}}
<details class="article-toc-drawer article-toc-drawer-outline">
<summary class="ui-button ui-button--vertical"><span>Sommaire</span></summary>
<div class="article-toc-drawer-panel">
<h2>Sommaire</h2>
{{- $tocMarkup | safeHTML -}}
</div>
</details>
{{- end -}}
</aside>
{{- end -}}

View File

@@ -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 -}}
<nav class="breadcrumbs" aria-label="Fil d'Ariane">
<ol>
{{- range $trail -}}
<li><a href="{{ .RelPermalink }}">{{ with .LinkTitle }}{{ . }}{{ else }}{{ .Title }}{{ end }}</a></li>
{{- end -}}
</ol>
</nav>
{{- end -}}

View File

@@ -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 -}}
<article class="card">
{{- if $showDossierBeforeTitle -}}
<header>
<a href="{{ $page.RelPermalink }}">
<figure>
{{- with $image -}}
{{- $resized := .Fill $thumbnailTransform -}}
<img src="{{ $resized.RelPermalink }}" alt="Image de couverture pour {{ $page.Title }}" loading="lazy">
{{- end -}}
</figure>
</a>
{{- with $dossierTitle -}}
{{- with $dossierFirstPage -}}
<p><a href="{{ .RelPermalink }}">{{ $dossierTitle }}</a></p>
{{- end -}}
{{- end -}}
<h3><a href="{{ $page.RelPermalink }}">{{ $page.Title }}</a></h3>
</header>
{{- else -}}
<a href="{{ $page.RelPermalink }}">
<figure>
{{- with $image -}}
{{- $resized := .Fill $thumbnailTransform -}}
<img src="{{ $resized.RelPermalink }}" alt="Image de couverture pour {{ $page.Title }}" loading="lazy">
{{- end -}}
</figure>
<h3>{{ $page.Title }}</h3>
</a>
{{- end -}}
{{- with $page.Summary -}}
<p>{{ . | plainify | truncate 180 }}</p>
{{- end -}}
{{- if $showMeta -}}
{{- if $showInterestingLinksMeta -}}
<footer class="external-link-meta">
<p>
{{- with $page.Date -}}<time datetime="{{ . }}">{{ . | time.Format "02/01/2006" }}</time>{{- end -}}
{{- if and $page.Date $originHost -}}<span>·</span>{{- end -}}
{{- with $originHost -}}
{{- if $originLink -}}
<a href="{{ $originLink }}" title="Ouvrir le lien externe {{ . }}" rel="noopener noreferrer nofollow">{{ . }}</a>
{{- else -}}
<span>{{ . }}</span>
{{- end -}}
{{- end -}}
</p>
<p>
<strong data-state="{{ $statusTone }}"{{ with $statusTitle }} title="{{ . }}"{{ end }}>{{ $statusLabel }}</strong>
{{- with $statusChecked -}}<span>·</span><time datetime="{{ . }}">Vérifié {{ . | time.Format "02/01/2006" }}</time>{{- end -}}
</p>
</footer>
{{- else -}}
<p>
{{- with $page.Date -}}
<time datetime="{{ . }}">{{ . | time.Format "02/01/2006" }}</time>
{{- end -}}
{{- if $showSection -}}
{{- with $page.Parent -}}
<span>·</span>
{{- if $linkSection -}}
<a href="{{ .RelPermalink }}">{{ with .LinkTitle }}{{ . }}{{ else }}{{ .Title }}{{ end }}</a>
{{- else -}}
<span>{{ with .LinkTitle }}{{ . }}{{ else }}{{ .Title }}{{ end }}</span>
{{- end -}}
{{- end -}}
{{- end -}}
{{- if and (not $showDossierBeforeTitle) $dossierTitle -}}
<span>·</span>
<strong>{{ $dossierTitle }}</strong>
{{- end -}}
{{- if and (not $page.IsSection) (ge $page.ReadingTime 5) -}}
<span>· {{ $page.ReadingTime }} min</span>
{{- end -}}
</p>
{{- end -}}
{{- end -}}
</article>

View File

@@ -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 -}}

View File

@@ -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 -}}
<nav aria-label="Sommaire du dossier">
<p><strong>{{ $dossierID }}</strong></p>
<ol>
{{- range $sorted -}}
<li>
{{- if eq .Permalink $current.Permalink -}}
<strong>{{ .Title }}</strong>
{{- else -}}
<a href="{{ .RelPermalink }}">{{ .Title }}</a>
{{- end -}}
</li>
{{- end -}}
</ol>
</nav>
{{- end -}}
{{- end -}}
{{- end -}}

View File

@@ -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
-}}

View File

@@ -0,0 +1,37 @@
<footer>
<nav aria-label="Navigation principale">
<ul>
{{- range site.Menus.main -}}
<li>
<h2>
{{- if .PageRef -}}
<a href="{{ .PageRef }}" title="{{ .Title }}">{{ .Name }}</a>
{{- else -}}
<span>{{ .Name }}</span>
{{- end -}}
</h2>
{{- if gt (len .Children) 0 -}}
<ul>
{{- range .Children -}}
<li>
{{- if .PageRef -}}
<a href="{{ .PageRef }}" title="{{ .Title }}">{{ .Name }}</a>
{{- else -}}
<span title="{{ .Title }}">{{ .Name }}</span>
{{- end -}}
</li>
{{- end -}}
</ul>
{{- end -}}
</li>
{{- end -}}
</ul>
</nav>
<p>
<span>{{ .Site.Copyright | safeHTML }}</span>
<span>
Sauf mention contraire, l'intégralité du contenu de ce site est disponible sous licence
<a href="https://creativecommons.org/licenses/by-nc-nd/4.0/deed.fr" title="Consulter la licence Creative Commons CC BY-NC-ND 4.0">CC BY-NC-ND</a>.
</span>
</p>
</footer>

View File

@@ -0,0 +1,14 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{ if .IsHome }}{{ site.Title }}{{ else }}{{ printf "%s | %s" .Title site.Title }}{{ end }}</title>
{{ with .Description }}
<meta name="description" content="{{ . }}">
{{ else }}
{{ with site.Params.description }}
<meta name="description" content="{{ . }}">
{{ end }}
{{ end }}
<link rel="icon" href="{{ "favicon.ico" | absURL }}" type="image/x-icon">
<link rel="shortcut icon" href="{{ "favicon.ico" | absURL }}" type="image/x-icon">
<link rel="icon" href="{{ "favicon.png" | absURL }}" type="image/png" sizes="256x256">
{{ partialCached "head/css.html" . }}

View File

@@ -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" -}}
<link rel="stylesheet" href="{{ $bundle.RelPermalink }}" type="text/css">
{{- else -}}
{{- with $bundle | minify | fingerprint -}}
<link rel="stylesheet" href="{{ .RelPermalink }}" integrity="{{ .Data.Integrity }}" crossorigin="anonymous" type="text/css">
{{- end -}}
{{- end -}}

View File

@@ -0,0 +1,3 @@
<section>
{{ partialCached "site-title.html" (dict "Site" .) .Title (.Params.logo | default "logo-large.png") }}
</section>

View File

@@ -0,0 +1,14 @@
<header>
{{ partialCached "header-brand.html" .Site .Site.Title (.Site.Params.logo | default "logo-large.png") }}
{{ partial "breadcrumbs.html" . }}
{{ partial "page-meta.html" . }}
<h1>{{ .Title }}</h1>
{{ with .Description }}
<p>{{ . }}</p>
{{ else }}
{{ with .Summary }}
<p>{{ . | plainify | truncate 220 }}</p>
{{ end }}
{{ end }}
{{ partial "page-links.html" . }}
</header>

View File

@@ -0,0 +1,5 @@
<header>
{{ partialCached "header-brand.html" .Site .Site.Title (.Site.Params.logo | default "logo-large.png") }}
{{ partial "breadcrumbs.html" . }}
<h1>{{ .Title }}</h1>
</header>

View File

@@ -0,0 +1,3 @@
<header>
{{ partialCached "header-brand.html" .Site .Site.Title (.Site.Params.logo | default "logo-large.png") }}
</header>

View File

@@ -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 -}}

View File

@@ -0,0 +1,25 @@
{{- $items := . -}}
{{- if gt (len $items) 0 -}}
<ul>
{{- $type := printf "%T" $items -}}
{{- $isTextList := hasPrefix $type "[]string" -}}
{{- if $isTextList -}}
{{- range sort $items -}}
<li>{{ . }}</li>
{{- end -}}
{{- else -}}
{{- range sort $items "Title" -}}
{{- $itemType := printf "%T" . -}}
{{- $isPage := or (strings.HasPrefix $itemType "*hugolib.") (strings.HasPrefix $itemType "page.") -}}
{{- if $isPage -}}
<li>
<a href="{{ .RelPermalink }}">{{ with .LinkTitle }}{{ . }}{{ else }}{{ .Title }}{{ end }}</a>
{{ with .Pages }}<sub>{{ len . }}</sub>{{ else }}<sub>0</sub>{{ end }}
</li>
{{- else -}}
<li>{{ . }}</li>
{{- end -}}
{{- end -}}
{{- end -}}
</ul>
{{- end -}}

View File

@@ -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 -}}
<dl>
<dt>Dernière mise à jour</dt>
<dd>{{ $generatedLabel }}</dd>
<dt>Liens morts détectés</dt>
<dd>{{ len $links }}</dd>
</dl>
<table>
<thead>
<tr>
<th>URL</th>
<th>Emplacements</th>
<th>Statut</th>
</tr>
</thead>
<tbody>
{{- range $links -}}
<tr>
<td><a href="{{ .url }}" rel="noreferrer noopener" target="_blank">{{ .url }}</a></td>
<td>
{{- $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 -}}
<a href="{{ $matchedPage.RelPermalink }}">{{ $matchedPage.Title }}</a>
{{- else if $file -}}
<code>{{ $file }}{{ if $line }}:{{ $line }}{{ end }}</code>
{{- else -}}
<em>Emplacement inconnu</em>
{{- end -}}
<br>
{{- end -}}
{{- else -}}
<em>Emplacements inconnus</em>
{{- end -}}
</td>
<td><code>{{ .status }}</code></td>
</tr>
{{- end -}}
</tbody>
</table>

View File

@@ -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 -}}
<section class="listing-spotlight">
<header>
<h2>{{ $spotlightTitle }}</h2>
</header>
{{ partial "spotlight-block.html" (dict
"Cards" $spotlightPages
"FeedPages" $spotlightPages
"ShowFeedTitle" false
"FeedRich" true
"ShowSection" true
"AsideFirst" false
) }}
</section>
{{- 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" -}}
<section class="listing-articles">
<header>
<h2>{{ with $subSection.LinkTitle }}{{ . }}{{ else }}{{ $subSection.Title }}{{ end }}</h2>
</header>
{{ partial "articles-list.html" (dict
"Pages" $subSectionPages
"Context" $context
"ShowDossierBeforeTitle" true
"ShowInterestingLinksMeta" $showInterestingLinksMeta
"ExternalLinksReport" $externalLinksReport
) }}
</section>
{{- end -}}
{{- $ungroupedPages := $remainingPages -}}
{{- if gt (len $groupedPermalinks) 0 -}}
{{- $ungroupedPages = where $remainingPages "RelPermalink" "not in" $groupedPermalinks -}}
{{- end -}}
{{- if gt (len $ungroupedPages) 0 -}}
<section class="listing-articles">
<header>
<h2>Autres articles</h2>
</header>
{{ partial "articles-list.html" (dict
"Pages" $ungroupedPages
"Context" $context
"ShowDossierBeforeTitle" true
"ShowInterestingLinksMeta" $showInterestingLinksMeta
"ExternalLinksReport" $externalLinksReport
) }}
</section>
{{- end -}}
{{- else -}}
<section class="listing-articles">
<header>
<h2>Tous les articles</h2>
</header>
{{ partial "articles-list.html" (dict
"Pages" $remainingPages
"Context" $context
"ShowDossierBeforeTitle" true
"ShowInterestingLinksMeta" $showInterestingLinksMeta
"ExternalLinksReport" $externalLinksReport
) }}
</section>
{{- end -}}
{{- end -}}

View File

@@ -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)) -}}
<figure class="figure-media{{ if $hasMeta }} figure-media-with-meta{{ else }} figure-media-without-meta{{ end }}">
<a href="{{ $image.RelPermalink }}" title="Cliquez pour agrandir l'image">
<img src="{{ $display.RelPermalink }}" alt="{{ $alt }}" title="{{ $title }}">
</a>
{{- if $hasMeta -}}
<figcaption class="figure-media-meta cover-meta">
<div class="figure-media-meta-main">
{{- with $metaTitle -}}
<p class="figure-title cover-title">{{ . | markdownify }}</p>
{{- end -}}
{{- with $description -}}
<p class="figure-description cover-description">{{ . | markdownify }}</p>
{{- end -}}
</div>
{{- if or $data.attribution $data.prompt -}}
<div class="figure-media-meta-extra">
{{- with $data.attribution -}}
<p class="figure-attribution cover-attribution"><strong>Attribution :</strong> <span>{{ . | markdownify }}</span></p>
{{- end -}}
{{- with $data.prompt -}}
<details>
<summary>Prompt</summary>
<p>{{ . | markdownify }}</p>
</details>
{{- end -}}
</div>
{{- end -}}
</figcaption>
{{- end -}}
</figure>

View File

@@ -0,0 +1,18 @@
<section>
<article>
<figure>
{{- $assetPath := "images/oeuvres/l-anankeisme.png" -}}
{{- $source := resources.Get $assetPath -}}
{{- if $source -}}
{{- $img := $source.Resize "320x" -}}
<img src="{{ $img.RelPermalink }}" width="{{ $img.Width }}" height="{{ $img.Height }}" alt="Couverture de L'Anankéisme" loading="lazy">
{{- end -}}
</figure>
<h2>L'Anankéisme</h2>
<p><em>L'Anankéisme</em> 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.</p>
<p>
<a class="ui-button" href="https://librairie.bod.fr/lanankeisme-richard-dern-9782322634903">Acheter le livre</a>
<a class="ui-button" href="https://anankeisme.fr/">Découvrir le site dédié à l'Anankéisme</a>
</p>
</article>
</section>

View File

@@ -0,0 +1,18 @@
<section>
<article>
<figure>
{{- $assetPath := "images/oeuvres/l-humain-cette-espece-primitive.jpeg" -}}
{{- $source := resources.Get $assetPath -}}
{{- if $source -}}
{{- $img := $source.Resize "320x" -}}
<img src="{{ $img.RelPermalink }}" width="{{ $img.Width }}" height="{{ $img.Height }}" alt="Couverture de L'Humain, cette espèce primitive" loading="lazy">
{{- end -}}
</figure>
<h2>L'Humain, cette espèce primitive</h2>
<p><em>L'Humain, cette espèce primitive</em> est un essai dans lequel vous explorez plusieurs facettes de ce que nous appelons notre évolution, en adoptant la perspective de l'exploration spatiale.</p>
<p>
<a class="ui-button" href="https://www.amazon.fr/dp/B08VF4D2NT">Acheter la version numérique</a>
<a class="ui-button" href="/interets/philosophie/2023/05/18/lhumain-cette-espece-primitive-lhumain-cette-espece-primitive/">Lire le livre en ligne</a>
</p>
</article>
</section>

View File

@@ -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 -}}
<nav class="page-links" aria-label="Liens associés">
<ul>
{{- with $commentsURL -}}
<li>
{{- partial "render/link.html" (dict
"Destination" .
"Title" "Voir les commentaires"
"Text" $commentsLabel
"Class" $linkClass
"Page" $page
) -}}
</li>
{{- end -}}
{{- range $links -}}
{{- $text := default .name .text -}}
{{- $title := default $text .title -}}
<li>
{{- partial "render/link.html" (dict
"Destination" .url
"Title" $title
"Text" $text
"Class" $linkClass
"Page" $page
) -}}
</li>
{{- end -}}
{{- if $addWikiLink -}}
{{- $lang := default "fr" $page.Site.Language.Lang -}}
{{- $query := urlquery $page.Title -}}
{{- $searchUrl := printf "https://%s.wikipedia.org/w/index.php?search=%s" $lang $query -}}
<li>
{{- partial "render/link.html" (dict
"Destination" $searchUrl
"Title" (printf "Rechercher %s sur Wikipédia" $page.Title)
"Text" (printf "Rechercher %s sur Wikipédia" $page.Title)
"Class" $linkClass
"Page" $page
) -}}
</li>
{{- end -}}
</ul>
</nav>
{{- end -}}

View File

@@ -0,0 +1,8 @@
<p>
{{ with .Date }}
<time datetime="{{ . }}">{{ . | time.Format "02/01/2006" }}</time>
{{ end }}
{{ if ge .ReadingTime 5 }}
<span>{{ .ReadingTime }} min de lecture</span>
{{ end }}
</p>

View File

@@ -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 " " -}}
<a href="{{- $newURL -}}"{{ with $classValue }} class="{{- . -}}"{{ end }}{{ with $titleValue }} title="{{- . -}}"{{ end }}{{ if $isExternal }} rel="noreferrer noopener"{{ end }}>{{- strings.TrimSpace .Text | safeHTML -}}</a>{{- "" -}}

View File

@@ -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 -}}
<section>
<h2>Météo observée</h2>
<p>
<img src="/icons/weather/{{ $icon }}" alt="{{ $label }}" title="{{ $label }}" loading="lazy">
<strong>{{ printf "%s à %s" (time.Format "02/01/2006" $date) (time.Format ":time_short" $date) }}</strong>
</p>
<dl>
{{- with $w.temperature -}}<div><dt>Température</dt><dd>{{ printf "%.1f" (mul . 1.0) }} °C</dd></div>{{- end -}}
{{- with $w.humidity -}}<div><dt>Humidité</dt><dd>{{ printf "%.0f" (mul . 1.0) }} %</dd></div>{{- end -}}
{{- with $w.pressure -}}<div><dt>Pression</dt><dd>{{ printf "%.0f" (mul . 1.0) }} hPa</dd></div>{{- end -}}
{{- with $w.illuminance -}}<div><dt>Luminosité</dt><dd>{{ printf "%.0f" (mul . 1.0) }} lx</dd></div>{{- end -}}
{{- with $w.wind_speed -}}<div><dt>Vent</dt><dd>{{ printf "%.1f" (mul . 1.0) }} km/h</dd></div>{{- end -}}
{{- with $w.wind_direction -}}<div><dt>Direction</dt><dd>{{ printf "%.0f" (mul . 1.0) }}°</dd></div>{{- end -}}
</dl>
{{- if gt (len $sources) 0 -}}
<p>
Sources:
{{- range $i, $source := $sources -}}
{{- if gt $i 0 -}}, {{- end -}}{{ $source }}
{{- end -}}
</p>
{{- end -}}
</section>

View File

@@ -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" -}}
<section class="site-stats">
<h2>Statistiques</h2>
<ul>
<li><span>Articles publiés</span><strong>{{ len .Site.RegularPages }}</strong></li>
<li><span>Thématiques</span><strong>{{ len $leafSections }}</strong></li>
<li><span>Dernière mise à jour</span><strong>{{ $lastMod }}</strong></li>
</ul>
</section>

View File

@@ -0,0 +1,13 @@
{{- $site := .Site -}}
{{- if not $site -}}
{{- $site = . -}}
{{- end -}}
{{- $logoPath := $site.Params.logo | default "logo-large.png" -}}
{{- $logo := resources.GetMatch $logoPath -}}
<a href="{{ "/" | relURL }}" aria-label="Revenir à l'accueil">
{{- with $logo -}}
{{- $resized := .Resize "64x" -}}
<img src="{{ $resized.RelPermalink }}" alt="">
{{- end -}}
<strong>{{ $site.Title }}</strong>
</a>

View File

@@ -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 -}}
<div class="spotlight-block {{ $spotlightClass }}">
{{- 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 -}}
</div>

View File

@@ -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 -}}
<aside class="spotlight-feed">
{{- if $showFeedTitle -}}
<h3>{{ $feedTitle }}</h3>
{{- end -}}
<ol>
{{- range $feedPages -}}
<li>
{{- if $feedRich -}}
<a href="{{ .RelPermalink }}">
<span>{{ .Title }}</span>
<span>
{{- with .Date -}}
<time datetime="{{ . }}">{{ . | time.Format "02/01/2006" }}</time>
{{- end -}}
{{- if $showSection -}}
{{- with .Parent -}}
<span>·</span>
<span>{{ with .LinkTitle }}{{ . }}{{ else }}{{ .Title }}{{ end }}</span>
{{- end -}}
{{- end -}}
{{- with .Params.dossier -}}
{{- with index . 0 -}}
<span>·</span>
<strong>{{ . }}</strong>
{{- end -}}
{{- end -}}
{{- if and (not .IsSection) (ge .ReadingTime 5) -}}
<span>·</span>
<span>{{ .ReadingTime }} min</span>
{{- end -}}
</span>
</a>
{{- else -}}
<a href="{{ .RelPermalink }}">{{ .Title }}</a>
<p>
{{- with .Date -}}
<time datetime="{{ . }}">{{ . | time.Format "02/01/2006" }}</time>
{{- end -}}
{{- if $showSection -}}
{{- with .Parent -}}
<span>·</span>
<span>{{ with .LinkTitle }}{{ . }}{{ else }}{{ .Title }}{{ end }}</span>
{{- end -}}
{{- end -}}
{{- with .Params.dossier -}}
{{- with index . 0 -}}
<span>·</span>
<strong>{{ . }}</strong>
{{- end -}}
{{- end -}}
{{- if and (not .IsSection) (ge .ReadingTime 5) -}}
<span>·</span>
<span>{{ .ReadingTime }} min</span>
{{- end -}}
</p>
{{- end -}}
</li>
{{- end -}}
</ol>
</aside>

View File

@@ -0,0 +1,14 @@
{{- $page := .page -}}
{{- $taxonomy := .taxonomy -}}
{{- with $page.GetTerms $taxonomy -}}
{{- $label := (index . 0).Parent.LinkTitle -}}
<section>
<h3>{{ $label }}</h3>
<ul>
{{- range . -}}
<li><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></li>
{{- end -}}
</ul>
</section>
{{- end -}}

View File

@@ -0,0 +1,78 @@
{{- $pages := .Pages -}}
{{- if gt (len $pages) 0 -}}
<section class="listing-timeline">
<header>
<h2>Chronologie</h2>
</header>
<ol>
{{- 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 -}}
<li>
<article>
{{- with $image -}}
<a href="{{ $page.RelPermalink }}">
<figure>
{{- $resized := .Fill "600x340" -}}
<img src="{{ $resized.RelPermalink }}" alt="Image de couverture pour {{ $page.Title }}" loading="lazy">
</figure>
</a>
{{- end -}}
<div>
<header>
<p>
{{- with $page.Date -}}
<time datetime="{{ . }}">{{ . | time.Format "02/01/2006" }}</time>
{{- end -}}
</p>
{{- with $dossierFirstPage -}}
{{- with $dossierTitle -}}
<p><a href="{{ $dossierFirstPage.RelPermalink }}">{{ $dossierTitle }}</a></p>
{{- end -}}
{{- end -}}
<h3><a href="{{ $page.RelPermalink }}">{{ $page.Title }}</a></h3>
</header>
{{- with $page.Summary -}}
<p>{{ . | plainify | truncate 240 }}</p>
{{- end -}}
<footer>
<p>
{{- with $page.Parent -}}
<a href="{{ .RelPermalink }}">{{ with .LinkTitle }}{{ . }}{{ else }}{{ .Title }}{{ end }}</a>
{{- end -}}
{{- if and $page.Parent (ge $page.ReadingTime 5) -}}<span>·</span>{{- end -}}
{{- if ge $page.ReadingTime 5 -}}
<span>{{ $page.ReadingTime }} min</span>
{{- end -}}
</p>
</footer>
</div>
</article>
</li>
{{- end -}}
</ol>
</section>
{{- end -}}

View File

@@ -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) -}}
<figure class="figure-media{{ if $hasMeta }} figure-media-with-meta{{ else }} figure-media-without-meta{{ end }}">
<a href="{{ $localImage.RelPermalink }}" title="Cliquez pour agrandir l'image">
<img src="{{ $resizedImage.RelPermalink }}" alt="{{ $title }}" title="{{ $title }}">
</a>
{{- if $hasMeta -}}
<figcaption class="figure-media-meta cover-meta">
<div class="figure-media-meta-main">
{{- with $title -}}
<p class="figure-title cover-title">{{ . | markdownify }}</p>
{{- end -}}
{{- with $description -}}
<p class="figure-description cover-description">{{ . | markdownify }}</p>
{{- end -}}
</div>
{{- with $attribution -}}
<div class="figure-media-meta-extra">
<p class="figure-attribution cover-attribution"><strong>Attribution :</strong> <span>{{ . | markdownify }}</span></p>
</div>
{{- end -}}
</figcaption>
{{- end -}}
</figure>

View File

@@ -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 -}}
<figure>
<audio controls preload="metadata">
<source src="{{ $audio.RelPermalink }}">
Votre navigateur ne prend pas en charge la lecture audio.
</audio>
{{- if or $data.title (or $data.description $data.attribution) -}}
<figcaption>
{{- with $data.title -}}<p><strong>{{ . }}</strong></p>{{- end -}}
{{- with $data.description -}}<p>{{ . | markdownify }}</p>{{- end -}}
{{- with $data.attribution -}}<p><strong>Attribution :</strong> <em>{{ . | markdownify }}</em></p>{{- end -}}
</figcaption>
{{- end -}}
</figure>
{{- end -}}
{{- end -}}

View File

@@ -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)) -}}
<figure class="figure-media{{ if $hasMeta }} figure-media-with-meta{{ else }} figure-media-without-meta{{ end }}">
<video controls preload="metadata" width="100%">
<source src="{{ $video.RelPermalink }}" type="video/mp4">
Votre navigateur ne prend pas en charge la lecture des videos.
</video>
{{- if $hasMeta -}}
<figcaption class="figure-media-meta cover-meta">
<div class="figure-media-meta-main">
{{- with $data.title -}}
<p class="figure-title cover-title">{{ . | markdownify }}</p>
{{- end -}}
{{- with $data.description -}}
<p class="figure-description cover-description">{{ . | markdownify }}</p>
{{- end -}}
</div>
{{- if or $data.attribution $data.prompt -}}
<div class="figure-media-meta-extra">
{{- with $data.attribution -}}
<p class="figure-attribution cover-attribution"><strong>Attribution :</strong> <span>{{ . | markdownify }}</span></p>
{{- end -}}
{{- with $data.prompt -}}
<details>
<summary>Prompt</summary>
<p>{{ . | markdownify }}</p>
</details>
{{- end -}}
</div>
{{- end -}}
</figcaption>
{{- end -}}
</figure>
{{- end -}}
{{- end -}}

View File

@@ -0,0 +1,10 @@
<!DOCTYPE html>
<html lang="{{ site.Language.LanguageCode }}" dir="{{ or site.Language.LanguageDirection `ltr` }}">
<head>
{{ partial "head.html" . }}
</head>
<body>
{{ block "main" . }}{{ end }}
{{ partial "footer.html" . }}
</body>
</html>

View File

@@ -0,0 +1,23 @@
{{ define "main" }}
{{ partial "article-header.html" . }}
<main>
<article>
{{ .Content }}
{{- with .Params.oeuvres -}}
<section class="article-books">
<header>
<h2>Mes livres</h2>
<p>Si vous aimez ce blog, vous apprécierez mes livres. En les achetant, vous m'aidez à continuer de le faire vivre.</p>
</header>
<div>
{{ partial "asides/oeuvres.html" $ }}
</div>
</section>
{{- end -}}
{{ partial "article-footer.html" . }}
</article>
{{ partial "asides/toc.html" . }}
</main>
{{ end }}

View File

@@ -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") -}}
<main class="home-main">
{{- if gt (len $interestsSpotlight) 0 -}}
<section class="home-spotlight">
<header>
<h2>À la une</h2>
</header>
{{ partial "spotlight-block.html" (dict
"Cards" $interestsSpotlight
"FeedPages" $interestsSpotlight
"FeedTitle" "Fil de publication"
"ShowFeedTitle" false
"FeedRich" true
"ShowSection" true
"AsideFirst" false
) }}
</section>
{{- end -}}
{{- if gt (len $interestsDeep) 0 -}}
<section class="home-deep">
<header>
<h2>Articles de fond</h2>
</header>
{{ partial "articles-list.html" (dict "Pages" $interestsDeep "Context" . "ShowDossierBeforeTitle" true) }}
</section>
{{- end -}}
<section class="home-books">
<header>
<h2>Mes livres</h2>
<p>Si vous aimez ce blog, vous apprécierez mes livres. En les achetant, vous m'aidez à continuer de le faire vivre.</p>
</header>
<div>
{{ partial "oeuvres/l-anankeisme.html" . }}
{{ partial "oeuvres/l-humain-cette-espece-primitive.html" . }}
</div>
</section>
{{- if gt (len $interestsSectionEntries) 0 -}}
<section class="home-rubrics">
<header>
<h2>Rubriques</h2>
</header>
<div>
{{- range $interestsSectionEntries -}}
{{- $section := index . "Section" -}}
{{- $sectionPages := index . "Pages" -}}
{{- $publishedCount := index . "PublishedCount" -}}
{{- if gt (len $sectionPages) 0 -}}
<article>
<header>
<h3><a href="{{ $section.RelPermalink }}">{{ with $section.LinkTitle }}{{ . }}{{ else }}{{ $section.Title }}{{ end }}</a></h3>
<p>{{ $publishedCount }} {{ if eq $publishedCount 1 }}article{{ else }}articles{{ end }}</p>
</header>
<ul>
{{- range $sectionPages -}}
{{- $page := . -}}
{{- $dossierTitle := "" -}}
{{- $dossierFirstPage := false -}}
{{- with $page.Params.dossier -}}
{{- with index . 0 -}}
{{- $dossierTitle = . -}}
{{- $dossierFirstPage = partial "dossier-first-page.html" $page -}}
{{- end -}}
{{- end -}}
<li>
{{- with $dossierFirstPage -}}
{{- with $dossierTitle -}}
<p><a href="{{ $dossierFirstPage.RelPermalink }}">{{ $dossierTitle }}</a></p>
{{- end -}}
{{- end -}}
<a href="{{ $page.RelPermalink }}">{{ $page.Title }}</a>
{{- with $page.Date -}}<time datetime="{{ . }}">{{ . | time.Format "02/01/2006" }}</time>{{- end -}}
</li>
{{- end -}}
</ul>
</article>
{{- end -}}
{{- end -}}
</div>
</section>
{{- end -}}
{{- if gt (len $critiquesArticles) 0 -}}
<section class="home-critiques-title">
<header>
<h2>
{{- with $critiquesRoot -}}
<a href="{{ .RelPermalink }}">{{ with .LinkTitle }}{{ . }}{{ else }}{{ .Title }}{{ end }}</a>
{{- else -}}
Critiques
{{- end -}}
</h2>
</header>
</section>
{{- 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 -}}
<section class="home-critiques-category">
<header>
<h2>
{{- with $critiqueSection -}}
<a href="{{ .RelPermalink }}">{{- with .LinkTitle -}}{{ . }}{{- else -}}{{ .Title }}{{- end -}}</a>
{{- else -}}
Critiques
{{- end -}}
</h2>
</header>
{{ 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)
) }}
</section>
{{- end -}}
{{- end -}}
{{- if gt (len $veilleArticles) 0 -}}
<aside class="home-watch">
<header>
<h2>
{{- with $veilleRoot -}}
<a href="{{ .RelPermalink }}">Veille</a>
{{- else -}}
Veille
{{- end -}}
</h2>
</header>
<div>
{{- range first 10 $veilleArticles -}}
{{- $page := . -}}
{{- $originLink := "" -}}
{{- with $page.Params.links -}}
{{- range . -}}
{{- if and (eq $originLink "") (not .archive) -}}
{{- with .url -}}
{{- $originLink = . -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- $originHost := "" -}}
{{- $statusTone := "unknown" -}}
{{- $statusLabel := "État inconnu" -}}
{{- $statusTitle := "" -}}
{{- $statusChecked := "" -}}
{{- 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 -}}
{{- $image := false -}}
{{- with $page.Params.cover -}}
{{- $image = $page.Resources.GetMatch . -}}
{{- end -}}
<article>
<a href="{{ $page.RelPermalink }}">
<figure>
{{- with $image -}}
{{- $resized := .Fill "166x91" -}}
<img src="{{ $resized.RelPermalink }}" alt="Capture du lien {{ $page.Title }}" loading="lazy">
{{- end -}}
</figure>
</a>
<div>
<h3><a href="{{ $page.RelPermalink }}">{{ $page.Title }}</a></h3>
{{- with $page.Summary -}}
<p>{{ . | plainify | truncate 140 }}</p>
{{- end -}}
<footer>
<p>
{{- with $page.Date -}}<time datetime="{{ . }}">{{ . | time.Format "02/01/2006" }}</time>{{- end -}}
{{- if and $page.Date $originHost -}}<span>·</span>{{- end -}}
{{- with $originHost -}}
{{- if $originLink -}}
<a href="{{ $originLink }}" title="Ouvrir le lien externe {{ . }}" rel="noopener noreferrer nofollow">{{ . }}</a>
{{- else -}}
<span>{{ . }}</span>
{{- end -}}
{{- end -}}
</p>
<p>
<strong data-state="{{ $statusTone }}"{{ with $statusTitle }} title="{{ . }}"{{ end }}>{{ $statusLabel }}</strong>
{{- with $statusChecked -}}<span>·</span><time datetime="{{ . }}">Vérifié {{ . | time.Format "02/01/2006" }}</time>{{- end -}}
</p>
</footer>
</div>
</article>
{{- end -}}
</div>
</aside>
{{- end -}}
{{- if gt (len $recettesSpotlight) 0 -}}
<section class="home-recipes">
<header>
<h2>
{{- with $recettesRoot -}}
<a href="{{ .RelPermalink }}">{{ with .LinkTitle }}{{ . }}{{ else }}{{ .Title }}{{ end }}</a>
{{- else -}}
Recettes
{{- end -}}
</h2>
</header>
{{ partial "spotlight-block.html" (dict
"Cards" $recettesSpotlight
"FeedPages" $recettesSpotlight
"FeedTitle" "Dernières recettes"
"ShowFeedTitle" false
"FeedRich" true
"ShowSection" false
"AsideFirst" false
) }}
</section>
{{- end -}}
{{- if gt (len $collectionsEntries) 0 -}}
<section class="home-collections collections-section">
<header>
<h2>
{{- with $collectionsRoot -}}
<a href="{{ .RelPermalink }}">{{ with .LinkTitle }}{{ . }}{{ else }}{{ .Title }}{{ end }}</a>
{{- else -}}
Collections
{{- end -}}
</h2>
</header>
<div>
{{- range $collectionsEntries -}}
{{- $section := index . "Section" -}}
{{- $latestItems := index . "LatestItems" -}}
<article>
<h3><a href="{{ $section.RelPermalink }}" title="{{ with $section.LinkTitle }}{{ . }}{{ else }}{{ $section.Title }}{{ end }}">{{ with $section.LinkTitle }}{{ . }}{{ else }}{{ $section.Title }}{{ end }}</a></h3>
{{- if gt (len $latestItems) 0 -}}
<ul>
{{- range $latestItems -}}
{{- $item := . -}}
{{- $itemImage := false -}}
{{- with $item.Params.cover -}}
{{- $itemImage = $item.Resources.GetMatch . -}}
{{- end -}}
<li>
<a href="{{ $item.RelPermalink }}" title="{{ $item.Title }}">
<figure>
{{- with $itemImage -}}
{{- $resized := .Resize "x128" -}}
<img src="{{ $resized.RelPermalink }}" alt="{{ $item.Title }}" title="{{ $item.Title }}" loading="lazy">
{{- end -}}
</figure>
</a>
</li>
{{- end -}}
</ul>
{{- end -}}
<p>
<span>{{ index . "Items" }} objets</span>
{{- range $section.Sections.ByTitle -}}
<a href="{{ .RelPermalink }}" title="{{ with .LinkTitle }}{{ . }}{{ else }}{{ .Title }}{{ end }}">{{ with .LinkTitle }}{{ . }}{{ else }}{{ .Title }}{{ end }}</a>
{{- end -}}
</p>
</article>
{{- end -}}
</div>
</section>
{{- end -}}
</main>
{{- end -}}

View File

@@ -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 "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>" | safeHTML -}}
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>{{ .Site.Title }}</title>
<link>{{ .Permalink }}</link>
<description>{{ .Site.Title }}</description>
<image>
<url>{{ $favicon }}</url>
<title>{{ .Site.Title }}</title>
<link>{{ .Permalink }}</link>
</image>
<language>{{ site.Language.LanguageCode }}</language>{{ with $authorEmail }}
<managingEditor>{{.}}{{ with $authorName }} ({{ . }}){{ end }}</managingEditor>{{ end }}{{ with $authorEmail }}
<webMaster>{{ . }}{{ with $authorName }} ({{ . }}){{ end }}</webMaster>{{ end }}{{ with .Site.Copyright }}
<copyright>{{ . }}</copyright>{{ end }}{{ if not .Date.IsZero }}
<lastBuildDate>{{ (index $pages.ByLastmod.Reverse 0).Lastmod.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</lastBuildDate>{{ end }}
{{- with .OutputFormats.Get "RSS" }}
{{ printf "<atom:link href=%q rel=\"self\" type=%q />" .Permalink .MediaType | safeHTML }}
{{- end }}
{{- range $pages }}
<item>
<title>{{ .Title }}</title>
<link>{{ .Permalink }}</link>
<pubDate>{{ .PublishDate.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</pubDate>
{{- with $authorEmail }}<author>{{ . }}{{ with $authorName }} ({{ . }}){{ end }}</author>{{ end }}
<guid>{{ .Permalink }}</guid>
<description>{{ .Summary | transform.XMLEscape | safeHTML }}</description>
</item>
{{- end }}
</channel>
</rss>

View File

@@ -0,0 +1,11 @@
{{ define "main" }}
{{ partial "article-header.html" . }}
<main>
<article>
{{ .Content }}
{{ partial "liens-morts/report.html" (dict "Page" .) }}
{{ partial "article-footer.html" . }}
</article>
{{ partial "asides/toc.html" . }}
</main>
{{ end }}

View File

@@ -0,0 +1,10 @@
{{ define "main" }}
{{ partial "article-header.html" . }}
<main>
<article>
{{ .Content }}
{{ partial "article-footer.html" . }}
</article>
{{ partial "asides/toc.html" . }}
</main>
{{ end }}

View File

@@ -0,0 +1,13 @@
{{ define "main" }}
{{ partial "hero.html" . }}
<main class="listing-page listing-mode-spotlight">
{{- $pages := .RegularPagesRecursive.ByDate.Reverse -}}
{{ with .Content }}
<article>
{{ . }}
</article>
{{ end }}
{{ partial "list-layout.html" (dict "Pages" $pages "Context" . "Site" .Site "SpotlightTitle" .Title) }}
</main>
{{ end }}

View File

@@ -0,0 +1,25 @@
{{ define "main" }}
{{ partial "article-header.html" . }}
<main>
<article>
{{ .Content }}
<section>
<header><h2>Taxonomies</h2></header>
<ul>
{{- range $taxonomy, $terms := .Site.Taxonomies -}}
{{- with $.Site.GetPage $taxonomy -}}
<li>
<a href="{{ .RelPermalink }}">{{ .Title }}</a>
<sub>{{ len $terms }}</sub>
</li>
{{- end -}}
{{- end -}}
</ul>
</section>
{{ partial "article-footer.html" . }}
</article>
{{ partial "asides/toc.html" . }}
</main>
{{ end }}

View File

@@ -0,0 +1,63 @@
{{ define "main" }}
{{ partial "hero-section.html" . }}
<main>
{{ with .Content }}
<article>
{{ . }}
</article>
{{ 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 "" -}}
</ul>
</section>
{{- end -}}
<section>
<header><h2>{{ $letterKey }}</h2></header>
<ul>
{{- $scratch.Set "group" $letterKey -}}
{{- end -}}
<li>
<a href="{{ .RelPermalink }}">{{ $title }}</a>
{{ with .Pages }}<sub>{{ len . }}</sub>{{ else }}<sub>0</sub>{{ end }}
</li>
{{- end -}}
{{- end -}}
{{- if ne ($scratch.Get "group") "" -}}
</ul>
</section>
{{- end -}}
{{- else -}}
<p>Aucun mot-clé disponible pour cette taxonomie.</p>
{{- end -}}
</main>
{{ end }}

View File

@@ -0,0 +1,13 @@
{{ define "main" }}
{{ partial "hero.html" . }}
<main class="listing-page listing-mode-spotlight">
{{- $pages := .Pages.ByDate.Reverse -}}
{{ with .Content }}
<article>
{{ . }}
</article>
{{ end }}
{{ partial "list-layout.html" (dict "Pages" $pages "Context" . "Site" .Site "SpotlightTitle" .Title) }}
</main>
{{ end }}