Compare commits
2 Commits
refactor/g
...
refactor/g
| Author | SHA1 | Date | |
|---|---|---|---|
| e6c18d6b16 | |||
| a3092f5d5b |
16
src/components/GlossaryEntryBody.astro
Normal file
16
src/components/GlossaryEntryBody.astro
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<div class="glossary-entry-body">
|
||||||
|
<slot />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.glossary-entry-body{
|
||||||
|
margin-bottom: 28px;
|
||||||
|
}
|
||||||
|
|
||||||
|
:global(.glossary-entry-body h2),
|
||||||
|
:global(.glossary-entry-body h3),
|
||||||
|
:global(.glossary-relations h2),
|
||||||
|
:global(.glossary-relations h3){
|
||||||
|
scroll-margin-top: calc(var(--sticky-offset-px, 96px) + 18px);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
203
src/components/GlossaryEntryHero.astro
Normal file
203
src/components/GlossaryEntryHero.astro
Normal file
@@ -0,0 +1,203 @@
|
|||||||
|
---
|
||||||
|
interface Props {
|
||||||
|
term: string;
|
||||||
|
definitionShort: string;
|
||||||
|
displayFamily: string;
|
||||||
|
displayDomain?: string;
|
||||||
|
displayLevel?: string;
|
||||||
|
mobilizedAuthors?: string[];
|
||||||
|
comparisonTraditions?: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
const {
|
||||||
|
term,
|
||||||
|
definitionShort,
|
||||||
|
displayFamily,
|
||||||
|
displayDomain = "",
|
||||||
|
displayLevel = "",
|
||||||
|
mobilizedAuthors = [],
|
||||||
|
comparisonTraditions = [],
|
||||||
|
} = Astro.props;
|
||||||
|
|
||||||
|
const hasScholarlyMeta =
|
||||||
|
mobilizedAuthors.length > 0 ||
|
||||||
|
comparisonTraditions.length > 0;
|
||||||
|
---
|
||||||
|
|
||||||
|
<header class="glossary-entry-head" data-ge-hero>
|
||||||
|
<div class="glossary-entry-head__title">
|
||||||
|
<h1>{term}</h1>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="glossary-entry-summary">
|
||||||
|
<p class="glossary-entry-dek">
|
||||||
|
<em>{definitionShort}</em>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="glossary-entry-signals" aria-label="Repères de lecture">
|
||||||
|
<span class="glossary-pill glossary-pill--family">
|
||||||
|
<strong>Famille :</strong> {displayFamily}
|
||||||
|
</span>
|
||||||
|
|
||||||
|
{displayDomain && (
|
||||||
|
<span class="glossary-pill">
|
||||||
|
<strong>Domaine :</strong> {displayDomain}
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{displayLevel && (
|
||||||
|
<span class="glossary-pill">
|
||||||
|
<strong>Niveau :</strong> {displayLevel}
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{hasScholarlyMeta && (
|
||||||
|
<div class="glossary-entry-meta">
|
||||||
|
{mobilizedAuthors.length > 0 && (
|
||||||
|
<p>
|
||||||
|
<strong>Auteurs mobilisés :</strong> {mobilizedAuthors.join(" / ")}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{comparisonTraditions.length > 0 && (
|
||||||
|
<p>
|
||||||
|
<strong>Traditions de comparaison :</strong> {comparisonTraditions.join(" / ")}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.glossary-entry-head{
|
||||||
|
position: sticky;
|
||||||
|
top: calc(var(--sticky-header-h, 0px) + var(--page-gap, 12px));
|
||||||
|
z-index: 11;
|
||||||
|
margin: 0 0 24px;
|
||||||
|
border: 1px solid rgba(127,127,127,0.18);
|
||||||
|
border-radius: 28px;
|
||||||
|
background:
|
||||||
|
linear-gradient(180deg, rgba(0,0,0,0.60), rgba(0,0,0,0.92)),
|
||||||
|
radial-gradient(900px 240px at 20% 0%, rgba(0,217,255,0.08), transparent 60%);
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
-webkit-backdrop-filter: blur(10px);
|
||||||
|
overflow: hidden;
|
||||||
|
transition:
|
||||||
|
border-radius 180ms ease,
|
||||||
|
box-shadow 180ms ease,
|
||||||
|
border-color 180ms ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glossary-entry-head__title{
|
||||||
|
padding: 18px 18px 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glossary-entry-head h1{
|
||||||
|
margin: 0;
|
||||||
|
font-size: clamp(2.2rem, 4vw, 3.15rem);
|
||||||
|
line-height: 1.02;
|
||||||
|
letter-spacing: -.04em;
|
||||||
|
font-weight: 850;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glossary-entry-summary{
|
||||||
|
display: grid;
|
||||||
|
gap: 14px;
|
||||||
|
padding: 16px 18px 18px;
|
||||||
|
border-top: 1px solid rgba(127,127,127,0.14);
|
||||||
|
background: rgba(255,255,255,0.02);
|
||||||
|
}
|
||||||
|
|
||||||
|
.glossary-entry-dek{
|
||||||
|
margin: 0;
|
||||||
|
max-width: 76ch;
|
||||||
|
font-size: 1.04rem;
|
||||||
|
line-height: 1.55;
|
||||||
|
opacity: .94;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glossary-entry-signals{
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 8px;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glossary-pill{
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
padding: 5px 10px;
|
||||||
|
border: 1px solid rgba(127,127,127,0.24);
|
||||||
|
border-radius: 999px;
|
||||||
|
background: rgba(127,127,127,0.05);
|
||||||
|
font-size: 13px;
|
||||||
|
line-height: 1.35;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glossary-pill--family{
|
||||||
|
border-color: rgba(127,127,127,0.36);
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glossary-entry-meta{
|
||||||
|
margin: 0;
|
||||||
|
padding: 10px 12px;
|
||||||
|
border: 1px solid rgba(127,127,127,0.18);
|
||||||
|
border-radius: 12px;
|
||||||
|
background: rgba(127,127,127,0.04);
|
||||||
|
}
|
||||||
|
|
||||||
|
.glossary-entry-meta p{
|
||||||
|
margin: 0;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glossary-entry-meta p + p{
|
||||||
|
margin-top: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 720px){
|
||||||
|
.glossary-entry-signals{
|
||||||
|
gap: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glossary-pill{
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 860px){
|
||||||
|
.glossary-entry-head{
|
||||||
|
position: static;
|
||||||
|
border-radius: 22px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glossary-entry-head__title{
|
||||||
|
padding: 14px 14px 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glossary-entry-summary{
|
||||||
|
gap: 12px;
|
||||||
|
padding: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glossary-entry-dek{
|
||||||
|
max-width: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark){
|
||||||
|
.glossary-entry-meta{
|
||||||
|
background: rgba(255,255,255,0.03);
|
||||||
|
}
|
||||||
|
|
||||||
|
.glossary-pill{
|
||||||
|
background: rgba(255,255,255,0.04);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
31
src/components/GlossaryEntryLegacyNote.astro
Normal file
31
src/components/GlossaryEntryLegacyNote.astro
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
interface Props {
|
||||||
|
canonicalHref: string;
|
||||||
|
term: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const { canonicalHref, term } = Astro.props;
|
||||||
|
---
|
||||||
|
|
||||||
|
<p class="glossary-legacy-note">
|
||||||
|
Cette entrée a été renommée. L’intitulé canonique est :
|
||||||
|
<a href={canonicalHref}>{term}</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.glossary-legacy-note{
|
||||||
|
padding: 10px 12px;
|
||||||
|
border: 1px solid rgba(127,127,127,0.22);
|
||||||
|
border-radius: 12px;
|
||||||
|
background: rgba(127,127,127,0.05);
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 1.45;
|
||||||
|
margin-bottom: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark){
|
||||||
|
.glossary-legacy-note{
|
||||||
|
background: rgba(255,255,255,0.04);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
172
src/components/GlossaryEntryStickySync.astro
Normal file
172
src/components/GlossaryEntryStickySync.astro
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
<script is:inline>
|
||||||
|
(() => {
|
||||||
|
const boot = () => {
|
||||||
|
const body = document.body;
|
||||||
|
const root = document.documentElement;
|
||||||
|
const hero = document.querySelector("[data-ge-hero]");
|
||||||
|
const follow = document.getElementById("reading-follow");
|
||||||
|
const mqMobile = window.matchMedia("(max-width: 860px)");
|
||||||
|
|
||||||
|
if (!body || !root || !hero || !follow) return;
|
||||||
|
|
||||||
|
const BODY_CLASS = "is-glossary-entry-page";
|
||||||
|
const FOLLOW_ON_CLASS = "glossary-entry-follow-on";
|
||||||
|
|
||||||
|
let lastHeight = -1;
|
||||||
|
let lastFollowOn = null;
|
||||||
|
let raf = 0;
|
||||||
|
|
||||||
|
body.classList.add(BODY_CLASS);
|
||||||
|
|
||||||
|
const heroHeight = () =>
|
||||||
|
Math.max(0, Math.round(hero.getBoundingClientRect().height || 0));
|
||||||
|
|
||||||
|
const computeFollowOn = () =>
|
||||||
|
!mqMobile.matches &&
|
||||||
|
follow.classList.contains("is-on") &&
|
||||||
|
follow.style.display !== "none" &&
|
||||||
|
follow.getAttribute("aria-hidden") !== "true";
|
||||||
|
|
||||||
|
const stripLocalSticky = () => {
|
||||||
|
document
|
||||||
|
.querySelectorAll(
|
||||||
|
".glossary-entry-body h2, .glossary-entry-body h3, .glossary-relations h2, .glossary-relations h3"
|
||||||
|
)
|
||||||
|
.forEach((el) => {
|
||||||
|
el.classList.remove("is-sticky");
|
||||||
|
el.removeAttribute("data-sticky-active");
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const applyLocalStickyHeight = () => {
|
||||||
|
const h = mqMobile.matches ? 0 : heroHeight();
|
||||||
|
if (h === lastHeight) return;
|
||||||
|
lastHeight = h;
|
||||||
|
|
||||||
|
if (typeof window.__archiSetLocalStickyHeight === "function") {
|
||||||
|
window.__archiSetLocalStickyHeight(h);
|
||||||
|
} else {
|
||||||
|
root.style.setProperty("--glossary-local-sticky-h", `${h}px`);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const syncFollowState = () => {
|
||||||
|
const on = computeFollowOn();
|
||||||
|
if (on === lastFollowOn) return;
|
||||||
|
lastFollowOn = on;
|
||||||
|
body.classList.toggle(FOLLOW_ON_CLASS, on);
|
||||||
|
};
|
||||||
|
|
||||||
|
const syncAll = () => {
|
||||||
|
stripLocalSticky();
|
||||||
|
syncFollowState();
|
||||||
|
applyLocalStickyHeight();
|
||||||
|
};
|
||||||
|
|
||||||
|
const schedule = () => {
|
||||||
|
if (raf) return;
|
||||||
|
raf = requestAnimationFrame(() => {
|
||||||
|
raf = 0;
|
||||||
|
syncAll();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const followObserver = new MutationObserver(schedule);
|
||||||
|
followObserver.observe(follow, {
|
||||||
|
attributes: true,
|
||||||
|
attributeFilter: ["class", "style", "aria-hidden"],
|
||||||
|
subtree: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
const heroResizeObserver =
|
||||||
|
typeof ResizeObserver !== "undefined"
|
||||||
|
? new ResizeObserver(schedule)
|
||||||
|
: null;
|
||||||
|
|
||||||
|
heroResizeObserver?.observe(hero);
|
||||||
|
|
||||||
|
window.addEventListener("resize", schedule);
|
||||||
|
window.addEventListener("pageshow", schedule);
|
||||||
|
|
||||||
|
if (document.fonts?.ready) {
|
||||||
|
document.fonts.ready.then(schedule).catch(() => {});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mqMobile.addEventListener) {
|
||||||
|
mqMobile.addEventListener("change", schedule);
|
||||||
|
} else if (mqMobile.addListener) {
|
||||||
|
mqMobile.addListener(schedule);
|
||||||
|
}
|
||||||
|
|
||||||
|
schedule();
|
||||||
|
};
|
||||||
|
|
||||||
|
if (document.readyState === "loading") {
|
||||||
|
document.addEventListener("DOMContentLoaded", boot, { once: true });
|
||||||
|
} else {
|
||||||
|
boot();
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
:global(body.is-glossary-entry-page #reading-follow){
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
:global(body.is-glossary-entry-page.glossary-entry-follow-on .glossary-entry-head){
|
||||||
|
margin-bottom: 0;
|
||||||
|
border-bottom-left-radius: 0;
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
:global(body.is-glossary-entry-page.glossary-entry-follow-on .glossary-entry-summary){
|
||||||
|
gap: 10px;
|
||||||
|
padding-top: 12px;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
:global(body.is-glossary-entry-page.glossary-entry-follow-on .glossary-entry-signals){
|
||||||
|
gap: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
:global(body.is-glossary-entry-page.glossary-entry-follow-on .glossary-entry-meta){
|
||||||
|
padding: 8px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
:global(body.is-glossary-entry-page.glossary-entry-follow-on #reading-follow){
|
||||||
|
transform: translateY(-1px);
|
||||||
|
}
|
||||||
|
|
||||||
|
:global(body.is-glossary-entry-page.glossary-entry-follow-on #reading-follow .reading-follow__inner){
|
||||||
|
margin-top: -1px;
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
:global(body.is-glossary-entry-page .glossary-entry-body h2.is-sticky),
|
||||||
|
:global(body.is-glossary-entry-page .glossary-entry-body h2[data-sticky-active="true"]),
|
||||||
|
:global(body.is-glossary-entry-page .glossary-entry-body h3.is-sticky),
|
||||||
|
:global(body.is-glossary-entry-page .glossary-entry-body h3[data-sticky-active="true"]),
|
||||||
|
:global(body.is-glossary-entry-page .glossary-relations h2.is-sticky),
|
||||||
|
:global(body.is-glossary-entry-page .glossary-relations h2[data-sticky-active="true"]),
|
||||||
|
:global(body.is-glossary-entry-page .glossary-relations h3.is-sticky),
|
||||||
|
:global(body.is-glossary-entry-page .glossary-relations h3[data-sticky-active="true"]){
|
||||||
|
position: static !important;
|
||||||
|
top: auto !important;
|
||||||
|
z-index: auto !important;
|
||||||
|
padding: 0 !important;
|
||||||
|
border: 0 !important;
|
||||||
|
background: transparent !important;
|
||||||
|
box-shadow: none !important;
|
||||||
|
backdrop-filter: none !important;
|
||||||
|
-webkit-backdrop-filter: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 860px){
|
||||||
|
:global(body.is-glossary-entry-page.glossary-entry-follow-on .glossary-entry-head){
|
||||||
|
margin-bottom: 20px;
|
||||||
|
border-radius: 22px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -30,3 +30,60 @@ const { relationBlocks = [] } = Astro.props;
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.glossary-relations{
|
||||||
|
margin-top: 26px;
|
||||||
|
padding-top: 18px;
|
||||||
|
border-top: 1px solid rgba(127,127,127,0.18);
|
||||||
|
}
|
||||||
|
|
||||||
|
.glossary-relations h2{
|
||||||
|
margin-bottom: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glossary-relations-grid{
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
|
||||||
|
gap: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glossary-relations-card{
|
||||||
|
border: 1px solid rgba(127,127,127,0.22);
|
||||||
|
border-radius: 16px;
|
||||||
|
padding: 14px 16px;
|
||||||
|
background: rgba(127,127,127,0.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
.glossary-relations-card h3{
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
font-size: 15px;
|
||||||
|
line-height: 1.35;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glossary-relations-card ul{
|
||||||
|
margin: 0;
|
||||||
|
padding-left: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glossary-relations-card li{
|
||||||
|
margin-bottom: 8px;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 1.45;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glossary-relations-card li:last-child{
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glossary-relations-card span{
|
||||||
|
opacity: .9;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark){
|
||||||
|
.glossary-relations-card{
|
||||||
|
background: rgba(255,255,255,0.04);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -2,6 +2,10 @@
|
|||||||
import GlossaryLayout from "../../layouts/GlossaryLayout.astro";
|
import GlossaryLayout from "../../layouts/GlossaryLayout.astro";
|
||||||
import GlossaryAside from "../../components/GlossaryAside.astro";
|
import GlossaryAside from "../../components/GlossaryAside.astro";
|
||||||
import GlossaryRelationCards from "../../components/GlossaryRelationCards.astro";
|
import GlossaryRelationCards from "../../components/GlossaryRelationCards.astro";
|
||||||
|
import GlossaryEntryLegacyNote from "../../components/GlossaryEntryLegacyNote.astro";
|
||||||
|
import GlossaryEntryHero from "../../components/GlossaryEntryHero.astro";
|
||||||
|
import GlossaryEntryBody from "../../components/GlossaryEntryBody.astro";
|
||||||
|
import GlossaryEntryStickySync from "../../components/GlossaryEntryStickySync.astro";
|
||||||
import { getCollection, render } from "astro:content";
|
import { getCollection, render } from "astro:content";
|
||||||
import {
|
import {
|
||||||
getDisplayDomain,
|
getDisplayDomain,
|
||||||
@@ -61,10 +65,6 @@ const relationBlocks = getRelationBlocks(entry, allEntries);
|
|||||||
const displayFamily = getDisplayFamily(entry);
|
const displayFamily = getDisplayFamily(entry);
|
||||||
const displayDomain = getDisplayDomain(entry);
|
const displayDomain = getDisplayDomain(entry);
|
||||||
const displayLevel = getDisplayLevel(entry);
|
const displayLevel = getDisplayLevel(entry);
|
||||||
|
|
||||||
const hasScholarlyMeta =
|
|
||||||
(entry.data.mobilizedAuthors?.length ?? 0) > 0 ||
|
|
||||||
(entry.data.comparisonTraditions?.length ?? 0) > 0;
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<GlossaryLayout
|
<GlossaryLayout
|
||||||
@@ -77,434 +77,27 @@ const hasScholarlyMeta =
|
|||||||
</Fragment>
|
</Fragment>
|
||||||
|
|
||||||
{isAliasRoute && (
|
{isAliasRoute && (
|
||||||
<p class="glossary-legacy-note">
|
<GlossaryEntryLegacyNote
|
||||||
Cette entrée a été renommée. L’intitulé canonique est :
|
canonicalHref={canonicalHref}
|
||||||
<a href={canonicalHref}>{entry.data.term}</a>.
|
term={entry.data.term}
|
||||||
</p>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<header class="glossary-entry-head" data-ge-hero>
|
<GlossaryEntryHero
|
||||||
<div class="glossary-entry-head__title">
|
term={entry.data.term}
|
||||||
<h1>{entry.data.term}</h1>
|
definitionShort={entry.data.definitionShort}
|
||||||
</div>
|
displayFamily={displayFamily}
|
||||||
|
displayDomain={displayDomain}
|
||||||
|
displayLevel={displayLevel}
|
||||||
|
mobilizedAuthors={entry.data.mobilizedAuthors ?? []}
|
||||||
|
comparisonTraditions={entry.data.comparisonTraditions ?? []}
|
||||||
|
/>
|
||||||
|
|
||||||
<div class="glossary-entry-summary">
|
<GlossaryEntryBody>
|
||||||
<p class="glossary-entry-dek">
|
|
||||||
<em>{entry.data.definitionShort}</em>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<div class="glossary-entry-signals" aria-label="Repères de lecture">
|
|
||||||
<span class="glossary-pill glossary-pill--family">
|
|
||||||
<strong>Famille :</strong> {displayFamily}
|
|
||||||
</span>
|
|
||||||
|
|
||||||
{displayDomain && (
|
|
||||||
<span class="glossary-pill">
|
|
||||||
<strong>Domaine :</strong> {displayDomain}
|
|
||||||
</span>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{displayLevel && (
|
|
||||||
<span class="glossary-pill">
|
|
||||||
<strong>Niveau :</strong> {displayLevel}
|
|
||||||
</span>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{hasScholarlyMeta && (
|
|
||||||
<div class="glossary-entry-meta">
|
|
||||||
{(entry.data.mobilizedAuthors?.length ?? 0) > 0 && (
|
|
||||||
<p>
|
|
||||||
<strong>Auteurs mobilisés :</strong> {entry.data.mobilizedAuthors.join(" / ")}
|
|
||||||
</p>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{(entry.data.comparisonTraditions?.length ?? 0) > 0 && (
|
|
||||||
<p>
|
|
||||||
<strong>Traditions de comparaison :</strong> {entry.data.comparisonTraditions.join(" / ")}
|
|
||||||
</p>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<div class="glossary-entry-body">
|
|
||||||
<Content />
|
<Content />
|
||||||
</div>
|
</GlossaryEntryBody>
|
||||||
|
|
||||||
<GlossaryRelationCards relationBlocks={relationBlocks} />
|
<GlossaryRelationCards relationBlocks={relationBlocks} />
|
||||||
</GlossaryLayout>
|
|
||||||
|
|
||||||
<script is:inline>
|
<GlossaryEntryStickySync />
|
||||||
(() => {
|
</GlossaryLayout>
|
||||||
const boot = () => {
|
|
||||||
const body = document.body;
|
|
||||||
const root = document.documentElement;
|
|
||||||
const hero = document.querySelector("[data-ge-hero]");
|
|
||||||
const follow = document.getElementById("reading-follow");
|
|
||||||
const mqMobile = window.matchMedia("(max-width: 860px)");
|
|
||||||
|
|
||||||
if (!body || !root || !hero || !follow) return;
|
|
||||||
|
|
||||||
const BODY_CLASS = "is-glossary-entry-page";
|
|
||||||
const FOLLOW_ON_CLASS = "glossary-entry-follow-on";
|
|
||||||
|
|
||||||
let lastHeight = -1;
|
|
||||||
let lastFollowOn = null;
|
|
||||||
let raf = 0;
|
|
||||||
|
|
||||||
body.classList.add(BODY_CLASS);
|
|
||||||
|
|
||||||
const heroHeight = () =>
|
|
||||||
Math.max(0, Math.round(hero.getBoundingClientRect().height || 0));
|
|
||||||
|
|
||||||
const computeFollowOn = () =>
|
|
||||||
!mqMobile.matches &&
|
|
||||||
follow.classList.contains("is-on") &&
|
|
||||||
follow.style.display !== "none" &&
|
|
||||||
follow.getAttribute("aria-hidden") !== "true";
|
|
||||||
|
|
||||||
const stripLocalSticky = () => {
|
|
||||||
document
|
|
||||||
.querySelectorAll(
|
|
||||||
".glossary-entry-body h2, .glossary-entry-body h3, .glossary-relations h2, .glossary-relations h3"
|
|
||||||
)
|
|
||||||
.forEach((el) => {
|
|
||||||
el.classList.remove("is-sticky");
|
|
||||||
el.removeAttribute("data-sticky-active");
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const applyLocalStickyHeight = () => {
|
|
||||||
const h = mqMobile.matches ? 0 : heroHeight();
|
|
||||||
if (h === lastHeight) return;
|
|
||||||
lastHeight = h;
|
|
||||||
|
|
||||||
if (typeof window.__archiSetLocalStickyHeight === "function") {
|
|
||||||
window.__archiSetLocalStickyHeight(h);
|
|
||||||
} else {
|
|
||||||
root.style.setProperty("--glossary-local-sticky-h", `${h}px`);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const syncFollowState = () => {
|
|
||||||
const on = computeFollowOn();
|
|
||||||
if (on === lastFollowOn) return;
|
|
||||||
lastFollowOn = on;
|
|
||||||
body.classList.toggle(FOLLOW_ON_CLASS, on);
|
|
||||||
};
|
|
||||||
|
|
||||||
const syncAll = () => {
|
|
||||||
stripLocalSticky();
|
|
||||||
syncFollowState();
|
|
||||||
applyLocalStickyHeight();
|
|
||||||
};
|
|
||||||
|
|
||||||
const schedule = () => {
|
|
||||||
if (raf) return;
|
|
||||||
raf = requestAnimationFrame(() => {
|
|
||||||
raf = 0;
|
|
||||||
syncAll();
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const followObserver = new MutationObserver(schedule);
|
|
||||||
followObserver.observe(follow, {
|
|
||||||
attributes: true,
|
|
||||||
attributeFilter: ["class", "style", "aria-hidden"],
|
|
||||||
subtree: false,
|
|
||||||
});
|
|
||||||
|
|
||||||
const heroResizeObserver =
|
|
||||||
typeof ResizeObserver !== "undefined"
|
|
||||||
? new ResizeObserver(schedule)
|
|
||||||
: null;
|
|
||||||
|
|
||||||
heroResizeObserver?.observe(hero);
|
|
||||||
|
|
||||||
window.addEventListener("resize", schedule);
|
|
||||||
window.addEventListener("pageshow", schedule);
|
|
||||||
|
|
||||||
if (document.fonts?.ready) {
|
|
||||||
document.fonts.ready.then(schedule).catch(() => {});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mqMobile.addEventListener) {
|
|
||||||
mqMobile.addEventListener("change", schedule);
|
|
||||||
} else if (mqMobile.addListener) {
|
|
||||||
mqMobile.addListener(schedule);
|
|
||||||
}
|
|
||||||
|
|
||||||
schedule();
|
|
||||||
};
|
|
||||||
|
|
||||||
if (document.readyState === "loading") {
|
|
||||||
document.addEventListener("DOMContentLoaded", boot, { once: true });
|
|
||||||
} else {
|
|
||||||
boot();
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.glossary-legacy-note{
|
|
||||||
padding: 10px 12px;
|
|
||||||
border: 1px solid rgba(127,127,127,0.22);
|
|
||||||
border-radius: 12px;
|
|
||||||
background: rgba(127,127,127,0.05);
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: 1.45;
|
|
||||||
margin-bottom: 18px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossary-entry-head{
|
|
||||||
position: sticky;
|
|
||||||
top: calc(var(--sticky-header-h, 0px) + var(--page-gap, 12px));
|
|
||||||
z-index: 11;
|
|
||||||
margin: 0 0 24px;
|
|
||||||
border: 1px solid rgba(127,127,127,0.18);
|
|
||||||
border-radius: 28px;
|
|
||||||
background:
|
|
||||||
linear-gradient(180deg, rgba(0,0,0,0.60), rgba(0,0,0,0.92)),
|
|
||||||
radial-gradient(900px 240px at 20% 0%, rgba(0,217,255,0.08), transparent 60%);
|
|
||||||
backdrop-filter: blur(10px);
|
|
||||||
-webkit-backdrop-filter: blur(10px);
|
|
||||||
overflow: hidden;
|
|
||||||
transition:
|
|
||||||
border-radius 180ms ease,
|
|
||||||
box-shadow 180ms ease,
|
|
||||||
border-color 180ms ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossary-entry-head__title{
|
|
||||||
padding: 18px 18px 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossary-entry-head h1{
|
|
||||||
margin: 0;
|
|
||||||
font-size: clamp(2.2rem, 4vw, 3.15rem);
|
|
||||||
line-height: 1.02;
|
|
||||||
letter-spacing: -.04em;
|
|
||||||
font-weight: 850;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossary-entry-summary{
|
|
||||||
display: grid;
|
|
||||||
gap: 14px;
|
|
||||||
padding: 16px 18px 18px;
|
|
||||||
border-top: 1px solid rgba(127,127,127,0.14);
|
|
||||||
background: rgba(255,255,255,0.02);
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossary-entry-dek{
|
|
||||||
margin: 0;
|
|
||||||
max-width: 76ch;
|
|
||||||
font-size: 1.04rem;
|
|
||||||
line-height: 1.55;
|
|
||||||
opacity: .94;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossary-entry-signals{
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
gap: 8px;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossary-pill{
|
|
||||||
display: inline-flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 6px;
|
|
||||||
padding: 5px 10px;
|
|
||||||
border: 1px solid rgba(127,127,127,0.24);
|
|
||||||
border-radius: 999px;
|
|
||||||
background: rgba(127,127,127,0.05);
|
|
||||||
font-size: 13px;
|
|
||||||
line-height: 1.35;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossary-pill--family{
|
|
||||||
border-color: rgba(127,127,127,0.36);
|
|
||||||
font-weight: 700;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossary-entry-meta{
|
|
||||||
margin: 0;
|
|
||||||
padding: 10px 12px;
|
|
||||||
border: 1px solid rgba(127,127,127,0.18);
|
|
||||||
border-radius: 12px;
|
|
||||||
background: rgba(127,127,127,0.04);
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossary-entry-meta p{
|
|
||||||
margin: 0;
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: 1.5;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossary-entry-meta p + p{
|
|
||||||
margin-top: 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossary-entry-body{
|
|
||||||
margin-bottom: 28px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossary-entry-body h2,
|
|
||||||
.glossary-entry-body h3,
|
|
||||||
.glossary-relations h2,
|
|
||||||
.glossary-relations h3{
|
|
||||||
scroll-margin-top: calc(var(--sticky-offset-px, 96px) + 18px);
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossary-relations{
|
|
||||||
margin-top: 26px;
|
|
||||||
padding-top: 18px;
|
|
||||||
border-top: 1px solid rgba(127,127,127,0.18);
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossary-relations h2{
|
|
||||||
margin-bottom: 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossary-relations-grid{
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
|
|
||||||
gap: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossary-relations-card{
|
|
||||||
border: 1px solid rgba(127,127,127,0.22);
|
|
||||||
border-radius: 16px;
|
|
||||||
padding: 14px 16px;
|
|
||||||
background: rgba(127,127,127,0.05);
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossary-relations-card h3{
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
font-size: 15px;
|
|
||||||
line-height: 1.35;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossary-relations-card ul{
|
|
||||||
margin: 0;
|
|
||||||
padding-left: 18px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossary-relations-card li{
|
|
||||||
margin-bottom: 8px;
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: 1.45;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossary-relations-card li:last-child{
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossary-relations-card span{
|
|
||||||
opacity: .9;
|
|
||||||
}
|
|
||||||
|
|
||||||
:global(body.is-glossary-entry-page #reading-follow){
|
|
||||||
z-index: 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
:global(body.is-glossary-entry-page.glossary-entry-follow-on .glossary-entry-head){
|
|
||||||
margin-bottom: 0;
|
|
||||||
border-bottom-left-radius: 0;
|
|
||||||
border-bottom-right-radius: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
:global(body.is-glossary-entry-page.glossary-entry-follow-on .glossary-entry-summary){
|
|
||||||
gap: 10px;
|
|
||||||
padding-top: 12px;
|
|
||||||
padding-bottom: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
:global(body.is-glossary-entry-page.glossary-entry-follow-on .glossary-entry-signals){
|
|
||||||
gap: 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
:global(body.is-glossary-entry-page.glossary-entry-follow-on .glossary-entry-meta){
|
|
||||||
padding: 8px 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
:global(body.is-glossary-entry-page.glossary-entry-follow-on #reading-follow){
|
|
||||||
transform: translateY(-1px);
|
|
||||||
}
|
|
||||||
|
|
||||||
:global(body.is-glossary-entry-page.glossary-entry-follow-on #reading-follow .reading-follow__inner){
|
|
||||||
margin-top: -1px;
|
|
||||||
border-top-left-radius: 0;
|
|
||||||
border-top-right-radius: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
:global(body.is-glossary-entry-page .glossary-entry-body h2.is-sticky),
|
|
||||||
:global(body.is-glossary-entry-page .glossary-entry-body h2[data-sticky-active="true"]),
|
|
||||||
:global(body.is-glossary-entry-page .glossary-entry-body h3.is-sticky),
|
|
||||||
:global(body.is-glossary-entry-page .glossary-entry-body h3[data-sticky-active="true"]),
|
|
||||||
:global(body.is-glossary-entry-page .glossary-relations h2.is-sticky),
|
|
||||||
:global(body.is-glossary-entry-page .glossary-relations h2[data-sticky-active="true"]),
|
|
||||||
:global(body.is-glossary-entry-page .glossary-relations h3.is-sticky),
|
|
||||||
:global(body.is-glossary-entry-page .glossary-relations h3[data-sticky-active="true"]){
|
|
||||||
position: static !important;
|
|
||||||
top: auto !important;
|
|
||||||
z-index: auto !important;
|
|
||||||
padding: 0 !important;
|
|
||||||
border: 0 !important;
|
|
||||||
background: transparent !important;
|
|
||||||
box-shadow: none !important;
|
|
||||||
backdrop-filter: none !important;
|
|
||||||
-webkit-backdrop-filter: none !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 720px){
|
|
||||||
.glossary-entry-signals{
|
|
||||||
gap: 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossary-pill{
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 860px){
|
|
||||||
.glossary-entry-head{
|
|
||||||
position: static;
|
|
||||||
border-radius: 22px;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossary-entry-head__title{
|
|
||||||
padding: 14px 14px 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossary-entry-summary{
|
|
||||||
gap: 12px;
|
|
||||||
padding: 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossary-entry-dek{
|
|
||||||
max-width: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
:global(body.is-glossary-entry-page.glossary-entry-follow-on .glossary-entry-head){
|
|
||||||
margin-bottom: 20px;
|
|
||||||
border-radius: 22px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark){
|
|
||||||
.glossary-entry-meta{
|
|
||||||
background: rgba(255,255,255,0.03);
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossary-legacy-note,
|
|
||||||
.glossary-pill,
|
|
||||||
.glossary-relations-card{
|
|
||||||
background: rgba(255,255,255,0.04);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
Reference in New Issue
Block a user