From 34e5c342f8f18cc67d7e56534eb44638534cef36 Mon Sep 17 00:00:00 2001 From: LATCHIMY Nicolas Date: Sun, 11 Jan 2026 15:54:07 +0400 Subject: [PATCH] =?UTF-8?q?premi=C3=A8re=20publication?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/content/config.ts | 31 ++++++++++++ src/content/journal/eveil.md | 79 ++++++++++++++++++++++++++++++ src/content/logs/initialisation.md | 8 +++ src/layouts/Layout.astro | 51 ++++++++++++++----- src/pages/index.astro | 11 ++--- src/pages/journal/[slug].astro | 24 +++++++++ src/pages/journal/index.astro | 18 +++++++ src/pages/logs/[slug].astro | 24 +++++++++ src/pages/logs/index.astro | 18 +++++++ 9 files changed, 246 insertions(+), 18 deletions(-) create mode 100644 src/content/config.ts create mode 100644 src/content/journal/eveil.md create mode 100644 src/content/logs/initialisation.md create mode 100644 src/pages/journal/[slug].astro create mode 100644 src/pages/journal/index.astro create mode 100644 src/pages/logs/[slug].astro create mode 100644 src/pages/logs/index.astro diff --git a/src/content/config.ts b/src/content/config.ts new file mode 100644 index 0000000..7ad283d --- /dev/null +++ b/src/content/config.ts @@ -0,0 +1,31 @@ +// 1. Importer les utilitaires de `astro:content` +import { z, defineCollection } from 'astro:content'; + +// 2. Définir une collection pour le journal d'aventure +const journalCollection = defineCollection({ + type: 'content', // 'content' pour les fichiers .md ou .mdx + schema: z.object({ + title: z.string(), + author: z.string(), + publishDate: z.date(), + image: z.object({ + src: z.string(), + alt: z.string(), + }).optional(), + }), +}); + +// 3. Définir une collection pour les logs de construction +const logsCollection = defineCollection({ + type: 'content', + schema: z.object({ + title: z.string(), + publishDate: z.date(), + }), +}); + +// 4. Exporter les collections pour les enregistrer +export const collections = { + 'journal': journalCollection, + 'logs': logsCollection, +}; diff --git a/src/content/journal/eveil.md b/src/content/journal/eveil.md new file mode 100644 index 0000000..d0ba309 --- /dev/null +++ b/src/content/journal/eveil.md @@ -0,0 +1,79 @@ +--- +title: "L'Éveil du Cul Brillant" +author: "G'Mas" +publishDate: 2026-01-10 +--- + +### Chroniques de Yeuze-sur-Chenarde + +L'arrivée à **Yeuze-sur-Chenarde** restera gravée dans ma mémoire, non pas par le sang, mais par la glace. Nous sommes arrivés en début d'après-midi, et le froid m'a immédiatement saisi les os, moi qui suis si sensible à ce "souffle de vie" qui anime le monde. Accompagné de la fée Bulle, je ne pensais qu'à une chose : le **Grand Chêne**. Cet arbre colossal, mon but, mon phare dans cette immensité blanche qui se dresse dorénavant devant nous + +Soudain, le chaos. Un projectile percute l'arrière de mon crâne. Gurdil le nain, plus chanceux ou plus bas, l'évite de justesse. Nyrae, notre Tabaxi, n'a pas cette chance, bien qu'elle ait aperçu nos assaillants avant l'impact. Ce n'était pas une embuscade de brigands, mais une armée de gamins du village armés de boules de neige ! Frigorifié, incapable de réagir, je me suis laissé "exploser" par leurs tirs. Une défaite tactique cuisante qui nous a forcés à nous réfugier, tels des vaincus, dans la chaleur de l'auberge. + +Là, sous le toit de **Liam** et de la vigoureuse **Mara**, j'ai découvert un monde peuplé d'êtres que je n'imaginais qu'en rêve. Entre les artisans Gobelins (Iben et ses jumeaux Ran et Zas) et les Arengon, ces étranges humanoïdes lapins, le village grouillait de vie. + +Un **Sang-dragon** aux récits nébuleux est devenu notre conteur d'un soir. Il nous a parlé d'un dragon infernal tapi dans la mine, de la fondation du village il y a plus de mille ans, et de la fois où des villageois héroïques ont sauvé le Grand Chêne des griffes des ogres. Jinn, notre Génasi, payait sa chambre en mélodies pendant que je savourais une salade étonnamment bonne. Mais l'humilité m'attendait encore : j'ai accepté un bras de fer contre Mara... et j'ai perdu lamentablement. Décidément, ce pays de neige forge des corps d'acier. + +Le lendemain, après une nuit de repos sans mon sable habituel mais réparatrice, l'inquiétude a gagné le village. Des outils disparaissaient dans les ateliers. Les enfants, dont le petit Nils et Hope la Tieffelin, semblaient liés à ces mystères. + +Mon instinct me portait vers le manoir d'un noble, lieu de jeu favori des petits, mais la neige y était vierge de toute trace. Nous avons donc fait demi-tour pour suivre la piste du Sangdragon : **la mine**. + +Nous progressions sous la guidance de **Jinn**, l'aventurier dont les pas connaissent cette terre mieux que quiconque. Tel un cartographe de l'invisible, il a transformé la géographie de la région et les murmures de ses histoires en mélodies, nous ouvrant la voie par sa connaissance des sentiers. + +C'est à l'approche de notre destination que nous avons croisé **Maielan**, la bourgmestre. Son visage, d’ordinaire empreint de l’autorité des Elfes, était marqué par l'angoisse alors qu’elle serrait contre elle le petit **Gablo**. Le pauvre enfant, écorché et tremblant, laissait couler des larmes qui semblaient geler sur ses joues. Sans hésiter, notre druidesse et Tabaxi **Nyrae** s'est approchée. D'un geste délicat, elle a appliqué un onguent de soin dont la douceur a immédiatement apaisé les sanglots du petit. Soulagé par cette magie bienveillante, Gablo a fini par trouver la force de nous confier son récit, dévoilant l'ombre de ce qui s'était réellement joué là-bas. + +Pas de temps pour les longs discours : le danger rôde encore. **Maielan**, la bourgmestre, sait que le temps presse pour les autres enfants encore pris au piège dans les profondeurs. Désormais au nombre de **six**, le groupe arrive à l'entrée de la mine. Un spectacle troublant fige les premiers pas des sauveteurs : + +**Les empreintes d'enfants :** De petites traces de pas dans la neige, désordonnées, témoignant de la panique ou de la fuite. + +**L'inconnu :** Entremêlées à ces empreintes légères, on découvre des marques bien plus sombres. Des traces de "choses" issues des entrailles de la mine, dont la forme ne ressemble à rien d'humain. + +A l'intérieur, l'obscurité y était totale, une gueule noire dévorant la lumière. C'est alors que **Bulle**, notre fée, a eu une idée... disons, lumineuse. D'un revers de magie, elle a lancé un sort de _Lumière_ directement sur le caleçon de Gurdil. Le nain, d'abord stupéfait, n'a eu d'autre choix que d'accepter son destin. + +C’est ainsi que **Gurdil**, désormais baptisé **"Cul Brillant"**, est devenu notre phare, notre cap, que dis-je notre firmament. Et c'est guidés par son postérieur rayonnant que nous nous sommes enfoncés dans les entrailles de la terre, prêts à affronter l'obscurité. + +--- +### Aventuriers + +| **Nom** | **Race** | **Notes particulières** | +| ---------- | --------- | ---------------------------------------------------------------------- | +| **G'mas** | Grung | A perdu au bras de fer contre Mara ; frigorifié par les enfants. | +| **Nyrae** | Tabaxi | En voyage hors de sa forêt ; a repéré l'embuscade des boules de neige. | +| **Bulle** | Fée | A lancé _Lumière_ sur le caleçon de Gurdil pour explorer la mine. | +| **Gurdil** | Nain | Désormais surnommé "Cul Brillant" à cause du sort de Bulle. | +| **Jinn** | Genasi | Musicien du groupe ; a payé sa chambre d'auberge en jouant. | +### Personnages + +| **Nom** | **Race / Rôle** | **Relation / Détails** | +| ------------- | ------------------ | ------------------------------------------------ | +| **Kwel** | Sangdragon | Conteur d'histoires vivant à l'auberge. | +| **Maielan** | Elfe / Bourgmestre | La responsable du village. | +| **Maielten** | Elfe | Enfant de Maielan. | +| **Liam** | Humain | Tavernier de l'auberge. | +| **Mara** | Humaine | Femme du tavernier et championne de bras de fer. | +| **Diesa** | Naine | Mère de Gablo. | +| **Gablo** | Nain | Enfant du village. | +| **Hope** | Tieffelin | Enfant du tavernier. | +| **Nils** | Humain | Enfant du tavernier. | +| **Kalinci** | Arengon | Paysanne. Mère de Zajic. | +| **Zajic** | Arengon | Enfant du village. | +| **Iben** | Gobelin | Père des jumeaux Ran et Zas ; Tient l'atelier. | +| **Tritte** | Gobeline | Mère des jumeaux Ran et Zas ; Tient l'atelier. | +| **Ran & Zas** | Gobelins | Enfants de Tritte et Iben. | +| **Alvin** | Gnome | Enfant du village. | + +--- +### Les légendes de Kwel le Sang-dragon + +Kwel semble être une source d'informations aussi riche qu'incertaine. Voici les détails de ses récits : + +**Le Dragon de la Mine :** Il affirme qu'un "Dragon Infernal" vit dans la mine. Il raconte cette histoire de deux façons : dans l'une, il était enfant quand cela s'est produit, dans l'autre, il y travaillait. + +**La Fondation de l'Auberge :** Il prétend avoir bâti l'auberge lui-même avec l'aide d'un groupe d'aventuriers. Bien qu'il soit originaire du village, il loge à l'auberge. + +**La Bataille du Grand Arbre :** Il y a plus de 1000 ans, des ogres ont attaqué la forêt. L'arbre millénaire devait être détruit, mais il a été sauvé par un groupe d'aventuriers dont Kwel prétend avoir fait partie. + +**Paradoxe Temporel :** Il affirme avoir fait partie d'aventuriers il y a un millénaire, tout en disant qu'il a lui-même moins de 1000 ans (alors que le village, lui, dépasse cet âge). + +**Connaissance des Grungs :** Il a mentionné avoir déjà croisé des membres de votre espèce (Grung) au cours de sa vie. + diff --git a/src/content/logs/initialisation.md b/src/content/logs/initialisation.md new file mode 100644 index 0000000..04c26b2 --- /dev/null +++ b/src/content/logs/initialisation.md @@ -0,0 +1,8 @@ +--- +title: "Initialisation du projet" +publishDate: 2026-01-09 +--- + +Le projet a été initialisé avec Astro. La structure de base est en place. + +Le déploiement est géré par Docker et Docker Compose, ce qui permet de lancer le site sur le Raspberry Pi avec une seule commande. diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro index e455c61..96e35cc 100644 --- a/src/layouts/Layout.astro +++ b/src/layouts/Layout.astro @@ -1,22 +1,49 @@ +--- +interface Props { + title: string; +} + +const { title } = Astro.props; +--- + - + + - Astro Basics + {title} + - +
+ +
+
+ +
- - diff --git a/src/pages/index.astro b/src/pages/index.astro index c04f360..f4d21bb 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -1,11 +1,10 @@ --- -import Welcome from '../components/Welcome.astro'; import Layout from '../layouts/Layout.astro'; - -// Welcome to Astro! Wondering what to do next? Check out the Astro documentation at https://docs.astro.build -// Don't want to use any of this? Delete everything in this file, the `assets`, `components`, and `layouts` directories, and start fresh. --- - - + +

Bienvenue sur le projet Sweet !

+

+ Ce site est une expérience communautaire. Explorez le journal d'aventure pour suivre la quête, ou consultez les logs de construction pour voir les coulisses techniques. +

diff --git a/src/pages/journal/[slug].astro b/src/pages/journal/[slug].astro new file mode 100644 index 0000000..c23aba0 --- /dev/null +++ b/src/pages/journal/[slug].astro @@ -0,0 +1,24 @@ +--- +import { getCollection } from 'astro:content'; +import Layout from '../../layouts/Layout.astro'; + +// 1. Génère une page pour chaque entrée de la collection 'journal' +export async function getStaticPaths() { + const journalEntries = await getCollection('journal'); + return journalEntries.map(entry => ({ + params: { slug: entry.slug }, + props: { entry }, + })); +} + +// 2. Récupère les props pour la page actuelle +const { entry } = Astro.props; +const { Content } = await entry.render(); +--- + + +

{entry.data.title}

+

Par {entry.data.author}, le {entry.data.publishDate.toLocaleDateString('fr-FR')}

+
+ +
diff --git a/src/pages/journal/index.astro b/src/pages/journal/index.astro new file mode 100644 index 0000000..a3ec5dc --- /dev/null +++ b/src/pages/journal/index.astro @@ -0,0 +1,18 @@ +--- +import { getCollection } from 'astro:content'; +import Layout from '../../layouts/Layout.astro'; + +const allJournalEntries = await getCollection('journal'); +--- + + +

Journal d'Aventure

+
    + {allJournalEntries.map(entry => ( +
  • + {entry.data.title} +

    Publié le: {entry.data.publishDate.toLocaleDateString('fr-FR')}

    +
  • + ))} +
+
diff --git a/src/pages/logs/[slug].astro b/src/pages/logs/[slug].astro new file mode 100644 index 0000000..e7fe756 --- /dev/null +++ b/src/pages/logs/[slug].astro @@ -0,0 +1,24 @@ +--- +import { getCollection } from 'astro:content'; +import Layout from '../../layouts/Layout.astro'; + +// 1. Génère une page pour chaque entrée de la collection 'logs' +export async function getStaticPaths() { + const journalEntries = await getCollection('logs'); + return journalEntries.map(entry => ({ + params: { slug: entry.slug }, + props: { entry }, + })); +} + +// 2. Récupère les props pour la page actuelle +const { entry } = Astro.props; +const { Content } = await entry.render(); +--- + + +

{entry.data.title}

+

Publié le {entry.data.publishDate.toLocaleDateString('fr-FR')}

+
+ +
\ No newline at end of file diff --git a/src/pages/logs/index.astro b/src/pages/logs/index.astro new file mode 100644 index 0000000..eeb33d7 --- /dev/null +++ b/src/pages/logs/index.astro @@ -0,0 +1,18 @@ +--- +import { getCollection } from 'astro:content'; +import Layout from '../../layouts/Layout.astro'; + +const allLogEntries = await getCollection('logs'); +--- + + +

Logs de Construction

+
    + {allLogEntries.map(entry => ( +
  • + {entry.data.title} +

    Publié le: {entry.data.publishDate.toLocaleDateString('fr-FR')}

    +
  • + ))} +
+