diff --git a/src/components/GlossaryAside.astro b/src/components/GlossaryAside.astro
new file mode 100644
index 0000000..8355148
--- /dev/null
+++ b/src/components/GlossaryAside.astro
@@ -0,0 +1,297 @@
+---
+const {
+ currentEntry,
+ allEntries = [],
+} = Astro.props;
+
+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 bySlug = new Map(allEntries.map((entry) => [slugOf(entry), entry]));
+const currentSlug = slugOf(currentEntry);
+
+const fondamentauxWanted = [
+ "archicratie",
+ "tension",
+ "arcalite",
+ "cratialite",
+ "archicration",
+ "co-viabilite",
+];
+
+const fondamentaux = fondamentauxWanted
+ .map((slug) => bySlug.get(slug))
+ .filter(Boolean);
+
+function resolveList(slugs = []) {
+ return slugs
+ .map((slug) => bySlug.get(slug))
+ .filter(Boolean);
+}
+
+function uniqueBySlug(entries) {
+ const seen = new Set();
+ const out = [];
+ for (const entry of entries) {
+ const slug = slugOf(entry);
+ if (seen.has(slug)) continue;
+ seen.add(slug);
+ out.push(entry);
+ }
+ return out;
+}
+
+const relatedEntries = uniqueBySlug(resolveList(currentEntry.data.related ?? []))
+ .sort((a, b) => collator.compare(a.data.term, b.data.term));
+
+const opposedEntries = uniqueBySlug(resolveList(currentEntry.data.opposedTo ?? []))
+ .sort((a, b) => collator.compare(a.data.term, b.data.term));
+
+const seeAlsoEntries = uniqueBySlug(resolveList(currentEntry.data.seeAlso ?? []))
+ .sort((a, b) => collator.compare(a.data.term, b.data.term));
+
+const paradigmes = [...allEntries]
+ .filter((e) => e.data.kind === "paradigme" && slugOf(e) !== currentSlug)
+ .sort((a, b) => collator.compare(a.data.term, b.data.term));
+
+function contextualParadigmsFor(entry) {
+ const relatedParadigms = (entry.data.related ?? [])
+ .map((slug) => bySlug.get(slug))
+ .filter((e) => e && e.data.kind === "paradigme");
+
+ const seeAlsoParadigms = (entry.data.seeAlso ?? [])
+ .map((slug) => bySlug.get(slug))
+ .filter((e) => e && e.data.kind === "paradigme");
+
+ const opposedParadigms = (entry.data.opposedTo ?? [])
+ .map((slug) => bySlug.get(slug))
+ .filter((e) => e && e.data.kind === "paradigme");
+
+ const merged = uniqueBySlug([
+ ...relatedParadigms,
+ ...seeAlsoParadigms,
+ ...opposedParadigms,
+ ]);
+
+ if (merged.length > 0) {
+ return merged.slice(0, 5);
+ }
+
+ if (entry.data.kind === "paradigme") {
+ const preferred = [
+ "gouvernementalite",
+ "gouvernementalite-algorithmique",
+ "cybernetique",
+ "biopolitique",
+ "bureaucratie",
+ "contractualisme-hobbesien",
+ "liberalisme-proprietaire",
+ "volonte-generale",
+ ];
+
+ return uniqueBySlug(
+ preferred
+ .filter((slug) => slug !== currentSlug)
+ .map((slug) => bySlug.get(slug))
+ .filter(Boolean)
+ ).slice(0, 5);
+ }
+
+ return paradigmes.slice(0, 4);
+}
+
+const contextualParadigms = contextualParadigmsFor(currentEntry);
+
+const kindLabels = {
+ concept: "Concept",
+ diagnostic: "Diagnostic",
+ topologie: "Topologie",
+ verbe: "Verbe",
+ paradigme: "Paradigme",
+};
+
+const domainLabels = {
+ transversal: "Transversal",
+ theorie: "Théorie",
+ "cas-ia": "Cas IA",
+};
+
+const levelLabels = {
+ fondamental: "Fondamental",
+ intermediaire: "Intermédiaire",
+ avance: "Avancé",
+};
+
+const metaLabel = [
+ kindLabels[currentEntry.data.kind] ?? currentEntry.data.kind,
+ domainLabels[currentEntry.data.domain] ?? currentEntry.data.domain,
+ levelLabels[currentEntry.data.level] ?? currentEntry.data.level,
+].join(" · ");
+---
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/glossaire/[...slug].astro b/src/pages/glossaire/[...slug].astro
index aed8f34..da3cdca 100644
--- a/src/pages/glossaire/[...slug].astro
+++ b/src/pages/glossaire/[...slug].astro
@@ -1,9 +1,11 @@
---
import EditionLayout from "../../layouts/EditionLayout.astro";
+import GlossaryAside from "../../components/GlossaryAside.astro";
import { getCollection, render } from "astro:content";
export async function getStaticPaths() {
const entries = await getCollection("glossaire");
+
return entries.map((entry) => ({
params: { slug: String(entry.id).replace(/\.(md|mdx)$/i, "") },
props: { entry },
@@ -11,6 +13,7 @@ export async function getStaticPaths() {
}
const { entry } = Astro.props;
+const allEntries = await getCollection("glossaire");
const { Content } = await render(entry);
---
@@ -18,11 +21,15 @@ const { Content } = await render(entry);
title={entry.data.title}
editionLabel="Glossaire"
editionKey="glossaire"
- statusLabel="référentiel"
+ statusLabel="Référentiel"
statusKey="referentiel"
level={1}
version={entry.data.version}
>
+
{entry.data.definitionShort}