Files
archicratie-edition/src/pages/glossaire/index.astro
Archicratia 9d8d60d00f
All checks were successful
SMOKE / smoke (push) Successful in 4s
CI / build-and-anchors (push) Successful in 42s
CI / build-and-anchors (pull_request) Successful in 38s
feat(glossaire): enrichit la cartographie archicratique et les archicrations
2026-03-14 19:55:16 +01:00

410 lines
11 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
import SiteLayout from "../../layouts/SiteLayout.astro";
import { getCollection } from "astro:content";
const entries = await getCollection("glossaire");
const slugOf = (entry) => String(entry.id).replace(/\.(md|mdx)$/i, "");
const hrefOf = (entry) => `/glossaire/${slugOf(entry)}/`;
const collator = new Intl.Collator("fr", { sensitivity: "base", numeric: true });
const sorted = [...entries].sort((a, b) => collator.compare(a.data.term, b.data.term));
function groupByInitial(list) {
const map = new Map();
for (const entry of list) {
const letter = (entry.data.term || "").trim().charAt(0).toUpperCase() || "#";
if (!map.has(letter)) map.set(letter, []);
map.get(letter).push(entry);
}
return [...map.entries()].sort((a, b) => collator.compare(a[0], b[0]));
}
const groupedAlpha = groupByInitial(sorted);
const byPredicate = (fn) => sorted.filter(fn);
const fondamentaux = byPredicate(
(e) => e.data.kind === "concept" && e.data.level === "fondamental"
);
const intermediaires = byPredicate(
(e) => e.data.kind === "concept" && e.data.level === "intermediaire"
);
const avances = byPredicate(
(e) => e.data.kind === "concept" && e.data.level === "avance"
);
const diagnostics = byPredicate((e) => e.data.kind === "diagnostic");
const topologies = byPredicate((e) => e.data.kind === "topologie");
const verbes = byPredicate((e) => e.data.kind === "verbe");
const paradigmes = byPredicate((e) => e.data.kind === "paradigme");
const doctrines = byPredicate((e) => e.data.kind === "doctrine");
const paradigmesPreview = paradigmes.slice(0, 8);
const doctrinesPreview = doctrines.slice(0, 4);
---
<SiteLayout title="Glossaire archicratique">
<section class="glossary-home">
<header class="glossary-hero">
<p class="glossary-kicker">Référentiel terminologique</p>
<h1>Glossaire archicratique</h1>
<p class="glossary-intro">
Ce glossaire rassemble les concepts, diagnostics, topologies, doctrines
et paradigmes utiles à la lecture du paradigme archicratique. Il ne se
contente pas daligner des définitions : il organise une cartographie
des prises théoriques, des régimes de régulation et des fondations
doctrinales mobilisés dans lessai-thèse.
</p>
</header>
<nav class="glossary-toc" aria-label="Sommaire du glossaire">
<a href="#reperes">Repères</a>
<a href="/glossaire/archicrations/">Page archicrations</a>
<a href="#cartographie">Cartographie théorique</a>
<a href="/glossaire/paradigmes/">Page paradigmes et doctrines</a>
<a href="#alphabetique">Index alphabétique</a>
</nav>
<section id="reperes" class="glossary-section">
<h2>Repères</h2>
{fondamentaux.length > 0 && (
<section class="glossary-block">
<h3>Repères fondamentaux</h3>
<div class="glossary-cards">
{fondamentaux.map((e) => (
<a class="glossary-card" href={hrefOf(e)}>
<strong>{e.data.term}</strong>
<span>{e.data.definitionShort}</span>
</a>
))}
</div>
</section>
)}
{intermediaires.length > 0 && (
<section class="glossary-block">
<h3>Concepts intermédiaires</h3>
<div class="glossary-cards">
{intermediaires.map((e) => (
<a class="glossary-card" href={hrefOf(e)}>
<strong>{e.data.term}</strong>
<span>{e.data.definitionShort}</span>
</a>
))}
</div>
</section>
)}
{avances.length > 0 && (
<section class="glossary-block">
<h3>Concepts avancés</h3>
<div class="glossary-cards">
{avances.map((e) => (
<a class="glossary-card" href={hrefOf(e)}>
<strong>{e.data.term}</strong>
<span>{e.data.definitionShort}</span>
</a>
))}
</div>
</section>
)}
{diagnostics.length > 0 && (
<section class="glossary-block">
<h3>Diagnostics</h3>
<div class="glossary-cards">
{diagnostics.map((e) => (
<a class="glossary-card" href={hrefOf(e)}>
<strong>{e.data.term}</strong>
<span>{e.data.definitionShort}</span>
</a>
))}
</div>
</section>
)}
{topologies.length > 0 && (
<section class="glossary-block">
<h3>Topologies</h3>
<div class="glossary-cards">
{topologies.map((e) => (
<a class="glossary-card" href={hrefOf(e)}>
<strong>{e.data.term}</strong>
<span>{e.data.definitionShort}</span>
</a>
))}
</div>
</section>
)}
{verbes.length > 0 && (
<section class="glossary-block">
<h3>Verbes de la scène archicratique</h3>
<div class="glossary-cards">
{verbes.map((e) => (
<a class="glossary-card" href={hrefOf(e)}>
<strong>{e.data.term}</strong>
<span>{e.data.definitionShort}</span>
</a>
))}
</div>
</section>
)}
</section>
<section class="glossary-block">
<h3>Archicrations du chapitre 2</h3>
<div class="glossary-cards">
<a class="glossary-card" href="/glossaire/archicrations/">
<strong>Cartographie des archicrations</strong>
<span>
Vue densemble des 13 types darchicrations élaborés dans le chapitre 2,
regroupés par blocs conceptuels.
</span>
</a>
</div>
</section>
<section id="cartographie" class="glossary-section">
<div class="glossary-section__head">
<div>
<h2>Cartographie théorique</h2>
<p class="glossary-intro">
Larchicratie dialogue avec deux grands ensembles : dune part des
<strong> doctrines fondatrices</strong>, qui posent un principe premier
de légitimité ou dordre ; dautre part des <strong>paradigmes de
régulation</strong>, qui décrivent des modes de tenue, de conflictualité,
dadministration ou de transformation des collectifs.
</p>
</div>
<a class="glossary-cta" href="/glossaire/paradigmes/">
Explorer la page dédiée
</a>
</div>
{doctrines.length > 0 && (
<section class="glossary-block">
<h3>Doctrines fondatrices</h3>
<div class="glossary-cards">
{doctrinesPreview.map((e) => (
<a class="glossary-card" href={hrefOf(e)}>
<strong>{e.data.term}</strong>
<span>{e.data.definitionShort}</span>
</a>
))}
</div>
</section>
)}
{paradigmes.length > 0 && (
<section class="glossary-block">
<h3>Paradigmes régulateurs</h3>
<div class="glossary-cards">
{paradigmesPreview.map((e) => (
<a class="glossary-card" href={hrefOf(e)}>
<strong>{e.data.term}</strong>
<span>{e.data.definitionShort}</span>
</a>
))}
</div>
</section>
)}
</section>
<section id="alphabetique" class="glossary-section">
<h2>Index alphabétique</h2>
<nav class="glossary-alpha-nav" aria-label="Lettres du glossaire">
{groupedAlpha.map(([letter]) => (
<a href={`#letter-${letter}`}>{letter}</a>
))}
</nav>
<div class="glossary-alpha-groups">
{groupedAlpha.map(([letter, items]) => (
<section class="glossary-letter-group" id={`letter-${letter}`}>
<h3>{letter}</h3>
<ul class="glossary-list">
{items.map((e) => (
<li>
<a href={hrefOf(e)}>{e.data.term}</a>
<span> — {e.data.definitionShort}</span>
</li>
))}
</ul>
</section>
))}
</div>
</section>
</section>
</SiteLayout>
<style>
.glossary-empty{
opacity: .82;
font-style: italic;
}
.glossary-home{
padding: 8px 0 32px;
}
.glossary-hero{
margin-bottom: 24px;
}
.glossary-kicker{
font-size: 12px;
letter-spacing: .08em;
text-transform: uppercase;
opacity: .72;
margin-bottom: 8px;
}
.glossary-intro{
max-width: 72ch;
opacity: .92;
}
.glossary-toc{
display: flex;
flex-wrap: wrap;
gap: 10px;
margin: 18px 0 30px;
}
.glossary-toc a{
border: 1px solid rgba(127,127,127,0.28);
border-radius: 999px;
padding: 6px 12px;
text-decoration: none;
}
.glossary-section{
margin-top: 40px;
scroll-margin-top: calc(var(--sticky-offset) + 75px);
}
.glossary-section__head{
display: flex;
justify-content: space-between;
align-items: start;
gap: 16px;
flex-wrap: wrap;
}
.glossary-cta{
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 38px;
border: 1px solid rgba(127,127,127,0.28);
border-radius: 999px;
padding: 6px 14px;
text-decoration: none;
white-space: nowrap;
}
.glossary-block{
margin-top: 18px;
}
.glossary-cards{
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 12px;
margin-top: 12px;
}
.glossary-card{
display: flex;
flex-direction: column;
gap: 8px;
padding: 14px 16px;
border: 1px solid rgba(127,127,127,0.22);
border-radius: 16px;
background: rgba(127,127,127,0.05);
text-decoration: none;
transition: transform 120ms ease, background 120ms ease;
}
.glossary-card:hover{
transform: translateY(-1px);
background: rgba(127,127,127,0.08);
text-decoration: none;
}
.glossary-card strong{
font-size: 15px;
}
.glossary-card span{
font-size: 14px;
line-height: 1.45;
opacity: .92;
}
.glossary-alpha-nav{
display: flex;
flex-wrap: wrap;
gap: 8px;
margin: 12px 0 20px;
}
.glossary-alpha-nav a{
min-width: 32px;
text-align: center;
border: 1px solid rgba(127,127,127,0.22);
border-radius: 10px;
padding: 5px 8px;
text-decoration: none;
}
.glossary-alpha-groups{
display: flex;
flex-direction: column;
gap: 24px;
}
.glossary-letter-group h3{
margin-bottom: 10px;
}
.glossary-list{
margin: 0;
padding-left: 18px;
}
.glossary-list li{
margin-bottom: 8px;
}
@media (max-width: 720px){
.glossary-section__head{
flex-direction: column;
align-items: stretch;
}
.glossary-cta{
width: fit-content;
}
}
@media (prefers-color-scheme: dark){
.glossary-card{
background: rgba(255,255,255,0.04);
}
.glossary-card:hover{
background: rgba(255,255,255,0.07);
}
}
</style>