diff --git a/public/textures/paper-grain.png b/public/textures/paper-grain.png new file mode 100644 index 0000000..cc7ae34 Binary files /dev/null and b/public/textures/paper-grain.png differ diff --git a/src/components/Card.astro b/src/components/Card.astro deleted file mode 100644 index 8cfc725..0000000 --- a/src/components/Card.astro +++ /dev/null @@ -1,66 +0,0 @@ ---- -export interface Props { - title: string; - body: string; - href: string; -} - -const { href, title, body } = Astro.props; ---- - - - \ No newline at end of file diff --git a/src/components/ContentSearch.astro b/src/components/ContentSearch.astro new file mode 100644 index 0000000..7c05cfa --- /dev/null +++ b/src/components/ContentSearch.astro @@ -0,0 +1,163 @@ +--- +import type { CollectionEntry } from 'astro:content'; +import GoldButton from './ui/GoldButton.astro'; + +interface Props { + posts: CollectionEntry<'journal' | 'logs'>[]; + tags: string[]; + basePath: 'journal' | 'logs'; +} + +const { posts, tags, basePath } = Astro.props; +--- + +
+
+ +
+ +
+ + { + tags.map((tag) => ( + + )) + } +
+ +
+ { + posts.map((post) => ( + + )) + } +
+ +
+ + + + \ No newline at end of file diff --git a/src/components/icons/ScrollIcon.astro b/src/components/icons/ScrollIcon.astro new file mode 100644 index 0000000..0893e59 --- /dev/null +++ b/src/components/icons/ScrollIcon.astro @@ -0,0 +1,10 @@ +--- +// Ce composant accepte les props SVG standards comme `class`. +const { ...props } = Astro.props; +--- + + + + + + diff --git a/src/components/ui/GameNav.astro b/src/components/ui/GameNav.astro new file mode 100644 index 0000000..fa668be --- /dev/null +++ b/src/components/ui/GameNav.astro @@ -0,0 +1,87 @@ +--- +const { pathname } = Astro.url; + +// Dans une application réelle, ces liens pourraient provenir d'un fichier de configuration. +const navItems = [ + { href: '/', label: 'Accueil' }, + { href: '/atelier', label: 'Atelier' }, + { href: '/observatoire', label: 'Observatoire' }, + { href: '/boussole', label: 'Boussole' }, + { href: '/journal', label: 'Journal' }, + { href: '/auteur', label: 'Auteur' }, + { href: '/logs', label: 'Logs' }, +]; +--- + + + + \ No newline at end of file diff --git a/src/components/ui/GoldButton.astro b/src/components/ui/GoldButton.astro new file mode 100644 index 0000000..5aaa332 --- /dev/null +++ b/src/components/ui/GoldButton.astro @@ -0,0 +1,17 @@ +--- +interface Props { + href: string; + title: string; + body: string; +} + +const { href, title, body } = Astro.props; +--- + + + +
{title}
+

{body}

+
\ No newline at end of file diff --git a/src/components/ui/ParchmentCard.astro b/src/components/ui/ParchmentCard.astro new file mode 100644 index 0000000..ee11986 --- /dev/null +++ b/src/components/ui/ParchmentCard.astro @@ -0,0 +1,20 @@ +--- +// Ce composant est un simple conteneur stylisé. +// Il n'a pas besoin de props, il affiche simplement le contenu passé à l'intérieur. +--- + +
+ +
+ + \ No newline at end of file diff --git a/src/content/config.ts b/src/content/config.ts index 7ad283d..7d1f999 100644 --- a/src/content/config.ts +++ b/src/content/config.ts @@ -1,31 +1,27 @@ -// 1. Importer les utilitaires de `astro:content` -import { z, defineCollection } from 'astro:content'; +import { defineCollection, z } from 'astro:content'; -// 2. Définir une collection pour le journal d'aventure +// Collection pour les articles du 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(), - }), + type: 'content', + schema: z.object({ + title: z.string(), + author: z.string(), + publishDate: z.date(), + tags: z.array(z.string()).optional(), // Ajout des balises (optionnel) + }), }); -// 3. Définir une collection pour les logs de construction +// Collection pour les logs de construction const logsCollection = defineCollection({ - type: 'content', - schema: z.object({ - title: z.string(), - publishDate: z.date(), - }), + type: 'content', + schema: z.object({ + title: z.string(), + publishDate: z.date(), + tags: z.array(z.string()).optional(), + }), }); -// 4. Exporter les collections pour les enregistrer export const collections = { - 'journal': journalCollection, - 'logs': logsCollection, -}; + journal: journalCollection, + logs: logsCollection, +}; \ No newline at end of file diff --git a/src/content/journal/eveil.md b/src/content/journal/eveil.md index d0ba309..a903593 100644 --- a/src/content/journal/eveil.md +++ b/src/content/journal/eveil.md @@ -2,11 +2,12 @@ title: "L'Éveil du Cul Brillant" author: "G'Mas" publishDate: 2026-01-10 +tags: ["Yeuze-sur-Chenarde", "Exploration", "Gurdil", "Bulle", "Social", "Mystère"] --- ### 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 +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. @@ -76,4 +77,3 @@ Kwel semble être une source d'informations aussi riche qu'incertaine. Voici les **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/acquis.md b/src/content/logs/acquis.md new file mode 100644 index 0000000..e88b1d3 --- /dev/null +++ b/src/content/logs/acquis.md @@ -0,0 +1,35 @@ +--- +title: "Acquis et Paradigmes d'Astro" +publishDate: 2026-01-13 +tags: ["Astro", "Architecture", "Paradigmes", "Composants", "Routage", "Contenu"] +--- + +Ce log est une halte. Un moment pour observer le chemin parcouru, non pas comme une liste de compétences acquises, mais comme la compréhension des fondations sur lesquelles nous nous tenons. Cette version du site est une étape nécessaire : l'apprentissage des langages et des structures du web "plat", pour mieux en déceler les limites et préparer le véritable saut dans l'immersion. + +### 1. L'Apprentissage du Langage des Bâtisseurs + +Avant de pouvoir façonner le sable en mondes, il fallait apprendre à tailler la pierre. L'architecture actuelle repose sur les paradigmes d'Astro, qui sont ceux des bâtisseurs de la toile moderne. + +* **L'Art de la Brique (`Composants Astro`)** : Nous avons appris à créer des "briques" réutilisables (`GoldButton`, `ParchmentCard`). C'est un art de l'efficacité, de la modularité. Chaque brique est autonome, avec ses propres styles. C'est puissant, mais cela nous enferme dans une logique de "boîtes" empilées les unes sur les autres. + +* **Le Grimoire Ordonné (`Content Collections`)** : Nous avons appris à cataloguer nos récits et nos logs. Chaque parchemin est validé, chaque métadonnée est à sa place. C'est la sagesse de l'archiviste, qui assure l'ordre et la cohérence. Mais un livre, même magique, reste une succession de pages linéaires. + +* **Les Sentiers Tracés (`Routage Dynamique`)** : Nous avons appris à tracer les chemins qui relient nos pages. De l'index du journal à un article, d'un article à sa balise. Ces chemins sont clairs, rapides, générés à l'avance. Mais ce sont des sentiers balisés sur une carte en deux dimensions, pas une exploration libre dans un monde vivant. + +### 2. La Conscience des Murs Invisibles + +Cette architecture modulaire, si prisée, est aussi une cage dorée. Elle nous a permis de construire vite et bien, mais elle nous a aussi forcés à penser en "pages", en "blocs", en "liens". L'immersion que permet Three.js ne peut se contenter de cela. + +Le paradigme actuel est celui du **document**. On navigue d'un document à l'autre. L'ambition est de passer au paradigme de l'**espace**. Un monde unique et persistant dans lequel le contenu n'est pas une page que l'on charge, mais un objet avec lequel on interagit. + +C'est ici que des logiques ont été abandonnées, non par erreur, mais par nécessité. Le menu hamburger, par exemple, est une convention du web 2D. Dans un monde 3D, la navigation pourrait être un objet dans la scène, une carte que l'on déplie, un chemin de lumière que l'on suit. + +### 3. Le Prochain Pas : Façonner le Sable + +Cette fondation n'est pas vaine. Elle est le sol stable sur lequel nous allons maintenant ériger un sanctuaire en trois dimensions. La prochaine grande étape n'est pas d'ajouter une fonctionnalité, mais de changer de regard. + +* **Comprendre chaque grain** : Il s'agira de déconstruire. Comment une scène Three.js peut-elle devenir le "layout" principal ? Comment faire en sorte que le routage d'Astro ne recharge pas une page, mais déclenche une animation dans la scène 3D ? + +* **Construire avec intention** : Chaque choix devra être conscient. Nous n'appliquerons pas des solutions toutes faites, mais nous chercherons à comprendre les principes fondamentaux de la 3D sur le web pour créer une expérience qui a du sens. Le but n'est pas de "faire" un site 3D, mais de **comprendre** comment le faire naître. + +Cette étape est terminée. Le pèlerin a appris les cartes du vieux monde. Il est temps, maintenant, de les brûler pour dessiner la sienne. \ No newline at end of file diff --git a/src/content/logs/initialisation.md b/src/content/logs/initialisation.md index 19f322b..6552269 100644 --- a/src/content/logs/initialisation.md +++ b/src/content/logs/initialisation.md @@ -1,6 +1,7 @@ --- title: "Initialisation du projet" publishDate: 2026-01-09 +tags: ["Setup", "Infrastructure", "Docker", "Raspberry Pi", "Astro"] --- Le projet a été initialisé avec Astro. La structure de base est en place. diff --git a/src/content/logs/matiere.md b/src/content/logs/matiere.md index 238827c..9a06c10 100644 --- a/src/content/logs/matiere.md +++ b/src/content/logs/matiere.md @@ -1,7 +1,7 @@ --- title: "Ajout de la matière du passé" publishDate: 2026-01-12 -description: "Création du contenu narratif principal du site à travers la voix de G'Mas." +tags: ["Contenu", "Design", "Narratif", "Composants"] --- Le site a été enrichi avec le contenu principal, donnant vie à l'univers narratif du projet. L'ensemble du site adopte désormais la voix et la perspective de G'Mas, le pèlerin Grung. diff --git a/src/layouts/GameLayout.astro b/src/layouts/GameLayout.astro new file mode 100644 index 0000000..3eaea46 --- /dev/null +++ b/src/layouts/GameLayout.astro @@ -0,0 +1,252 @@ +--- +import { ViewTransitions } from 'astro:transitions'; +import GameNav from '../components/ui/GameNav.astro'; + +interface Props { + title: string; +} + +const { title } = Astro.props; +--- + + + + + + + + + + {title} + + + +
+ +
+ + + + + \ No newline at end of file diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro deleted file mode 100644 index 309e0d2..0000000 --- a/src/layouts/Layout.astro +++ /dev/null @@ -1,50 +0,0 @@ ---- -interface Props { - title: string; -} - -const { title } = Astro.props; ---- - - - - - - - - - - {title} - - - -
- -
-
- -
- - diff --git a/src/pages/atelier.astro b/src/pages/atelier.astro index 5b5f56e..2d2b5bc 100644 --- a/src/pages/atelier.astro +++ b/src/pages/atelier.astro @@ -1,45 +1,48 @@ --- -import Layout from '../layouts/Layout.astro'; +import GameLayout from '../layouts/GameLayout.astro'; +import ParchmentCard from '../components/ui/ParchmentCard.astro'; --- - -

🏜️ Le Sanctuaire des Grains

-

- Entrez dans mon lieu de méditation. D'où je viens, la création n'est pas une affaire de métal et de feu, mais de patience, de concentration et de sable. Chaque grain est une possibilité, chaque ligne de code un chemin tracé dans les dunes de l'esprit. Cette section dévoile les arts que j'emploie pour donner forme à ce monde. -

+ + +

🏜️ Le Sanctuaire des Grains

+

+ Entrez dans mon lieu de méditation. D'où je viens, la création n'est pas une affaire de métal et de feu, mais de patience, de concentration et de sable. Chaque grain est une possibilité, chaque ligne de code un chemin tracé dans les dunes de l'esprit. Cette section dévoile les arts que j'emploie pour donner forme à ce monde. +

-

Le Façonnage du Sable : Les Arts Techniques

-

- Au lieu d'une forge, mon art s'exprime par le façonnage. Les idées brutes sont comme du sable sauvage ; il faut le canaliser, le modeler avec discipline pour qu'il devienne une histoire, une expérience. Pour invoquer un monde 3D dans le navigateur, le choix des arts est aussi crucial que le choix du sable. -

-

Pourquoi Three.js ?

-

Three.js est mon art martial numérique. C'est un ensemble de katas (fonctions) en JavaScript qui me permet de maîtriser le flux de la 3D dans le navigateur. Chaque mouvement est précis : je peux dicter la course de la lumière, orchestrer la danse des objets et appliquer les textures comme on applique un pigment. C'est le ki qui donne vie à la matière inerte.

-

Pourquoi Blender ?

-

Si Three.js est l'art du mouvement, Blender est l'art de la méditation. C'est dans ce monde intérieur que je voyage pour façonner les personnages, les paysages et les rêves de mon peuple. C'est un outil open source qui me permet de donner une forme tangible à mes visions, avant de leur insuffler le souffle de vie sur le web.

+

Le Façonnage du Sable : Les Arts Techniques

+

+ Au lieu d'une forge, mon art s'exprime par le façonnage. Les idées brutes sont comme du sable sauvage ; il faut le canaliser, le modeler avec discipline pour qu'il devienne une histoire, une expérience. Pour invoquer un monde 3D dans le navigateur, le choix des arts est aussi crucial que le choix du sable. +

+

Pourquoi Three.js ?

+

Three.js est mon art martial numérique. C'est un ensemble de katas (fonctions) en JavaScript qui me permet de maîtriser le flux de la 3D dans le navigateur. Chaque mouvement est précis : je peux dicter la course de la lumière, orchestrer la danse des objets et appliquer les textures comme on applique un pigment. C'est le ki qui donne vie à la matière inerte.

+

Pourquoi Blender ?

+

Si Three.js est l'art du mouvement, Blender est l'art de la méditation. C'est dans ce monde intérieur que je voyage pour façonner les personnages, les paysages et les rêves de mon peuple. C'est un outil open source qui me permet de donner une forme tangible à mes visions, avant de leur insuffler le souffle de vie sur le web.

-

Le Kit du Pèlerin : Outils de Prédilection

-

Tout pèlerin transporte avec lui des outils essentiels. Les miens ne sont pas faits de bois ou de métal, mais ils sont tout aussi vitaux pour mon voyage.

-
-
Visual Studio Code : Mon Grimoire de Rituels
-
C'est ici que je calligraphie les incantations (le code) qui donnent leurs instructions au sable. Chaque fonction est un mantra, chaque variable un grain choisi avec soin pour construire le monde.
+

Le Kit du Pèlerin : Outils de Prédilection

+

Tout pèlerin transporte avec lui des outils essentiels. Les miens ne sont pas faits de bois ou de métal, mais ils sont tout aussi vitaux pour mon voyage.

+
+
Visual Studio Code : Mon Grimoire de Rituels
+
C'est ici que je calligraphie les incantations (le code) qui donnent leurs instructions au sable. Chaque fonction est un mantra, chaque variable un grain choisi avec soin pour construire le monde.
-
Lenovo Yoga 530 (Ubuntu) : Ma Pierre de Méditation
-
C'est sur cette surface que je m'installe pour me concentrer. Sa flexibilité me permet de trouver la posture juste, et son cœur (Ubuntu) bat au rythme du partage et de la liberté, des valeurs chères à tout pèlerin.
+
Lenovo Yoga 530 (Ubuntu) : Ma Pierre de Méditation
+
C'est sur cette surface que je m'installe pour me concentrer. Sa flexibilité me permet de trouver la posture juste, et son cœur (Ubuntu) bat au rythme du partage et de la liberté, des valeurs chères à tout pèlerin.
-
Wacom One, GIMP & Krita : Ma Toile de Sable et mes Pigments de Songe
-
La tablette est une étendue de sable fin sur laquelle je dessine les premières formes de mes visions. GIMP et Krita m'offre les pigments extraits des rêves pour leur donner couleur et vie.
+
Wacom One, GIMP & Krita : Ma Toile de Sable et mes Pigments de Songe
+
La tablette est une étendue de sable fin sur laquelle je dessine les premières formes de mes visions. GIMP et Krita m'offre les pigments extraits des rêves pour leur donner couleur et vie.
-
Obsidian & Carnet à dessin : Ma Carte des Étoiles et mon Journal de Piste
-
Le carnet recueille les croquis bruts de mon voyage. Obsidian, lui, est ma carte du ciel intérieure ; il me permet de relier chaque idée, chaque souvenir et chaque rêve en une constellation de savoir qui guide ma quête.
+
Obsidian & Carnet à dessin : Ma Carte des Étoiles et mon Journal de Piste
+
Le carnet recueille les croquis bruts de mon voyage. Obsidian, lui, est ma carte du ciel intérieure ; il me permet de relier chaque idée, chaque souvenir et chaque rêve en une constellation de savoir qui guide ma quête.
-
Raspberry Pi : Mon Foyer de Pèlerin
-
Ce petit autel est le cœur de mon campement numérique. C'est un serveur humble mais résilient, d'où je publie mes récits et partage mes créations avec le monde. Il bat au rythme de plusieurs esprits bienveillants :
-
-
    -
  • Docker : L'art de créer des bocaux à songes. Chaque service est contenu dans son propre terrarium magique, parfait et isolé, pour s'assurer que les rêves ne se mélangent pas.
  • -
  • Nginx Proxy Manager : Le gardien des carrefours, qui guide les visiteurs égarés vers la bonne histoire, le bon outil.
  • -
  • Nextcloud & Wallabag : Ma besace sans fond et mon filet à murmures. L'un stocke mes trouvailles et mes grains de sable précieux, l'autre capture les histoires du vent pour une lecture future.
  • -
  • Dolibarr & Superset : Mon grand livre de marchand et ma lentille d'analyse. Ils m'aident à tenir les comptes de mes échanges de rêves et à scruter la nature profonde de chaque grain de sable (donnée) que je collecte.
  • -
-
-
- \ No newline at end of file +
Raspberry Pi : Mon Foyer de Pèlerin
+
Ce petit autel est le cœur de mon campement numérique. C'est un serveur humble mais résilient, d'où je publie mes récits et partage mes créations avec le monde. Il bat au rythme de plusieurs esprits bienveillants :
+
+
    +
  • Docker : L'art de créer des bocaux à songes. Chaque service est contenu dans son propre terrarium magique, parfait et isolé, pour s'assurer que les rêves ne se mélangent pas.
  • +
  • Nginx Proxy Manager : Le gardien des carrefours, qui guide les visiteurs égarés vers la bonne histoire, le bon outil.
  • +
  • Nextcloud & Wallabag : Ma besace sans fond et mon filet à murmures. L'un stocke mes trouvailles et mes grains de sable précieux, l'autre capture les histoires du vent pour une lecture future.
  • +
  • Dolibarr & Superset : Mon grand livre de marchand et ma lentille d'analyse. Ils m'aident à tenir les comptes de mes échanges de rêves et à scruter la nature profonde de chaque grain de sable (donnée) que je collecte.
  • +
+
+
+
+
\ No newline at end of file diff --git a/src/pages/auteur.astro b/src/pages/auteur.astro index 7122974..e6ff7f1 100644 --- a/src/pages/auteur.astro +++ b/src/pages/auteur.astro @@ -1,42 +1,46 @@ --- -import Layout from '../layouts/Layout.astro'; +import GameLayout from '../layouts/GameLayout.astro'; +import ParchmentCard from '../components/ui/ParchmentCard.astro'; --- - -

🐸 L'Artisan derrière le Pèlerin

-

- Je suis G'Mas, un pèlerin fait de sable et de songes. Mais qui est l'artisan qui me rêve ? Qui est celui dont les mains façonnent mon voyage ? Laissez-moi vous parler de lui, car son histoire est la source de la mienne. -

-

- Il se nomme Nicolas Latchimy. Artiste, développeur, un esprit ubiquiste qui, depuis l'âge de trois ans, utilise le dessin pour donner une forme à ses émotions. Son parcours est un long pèlerinage entre deux mondes : celui de l'Art, étudié à Paris et à La Réunion, et celui du Code, appris plus tard pour construire de nouvelles formes de récits. -

+ + +

🐸 L'Artisan derrière le Pèlerin

+

+ Je suis G'Mas, un pèlerin fait de sable et de songes. Mais qui est l'artisan qui me rêve ? Qui est celui dont les mains façonnent mon voyage ? Laissez-moi vous parler de lui, car son histoire est la source de la mienne. +

+

+ Il se nomme Nicolas Latchimy. Artiste, développeur, un esprit ubiquiste qui, depuis l'âge de trois ans, utilise le dessin pour donner une forme à ses émotions. Son parcours est un long pèlerinage entre deux mondes : celui de l'Art, étudié à Paris et à La Réunion, et celui du Code, appris plus tard pour construire de nouvelles formes de récits. +

-

Hatjan Krâpo, le Cousin du grung

-

- Avant que je n'existe, un autre batracien est né de son crayon : Hatjan Krâpo. Mon lointain cousin de papier. Si je suis un pèlerin des sables, Hatjan est un symbole du rejet, du dégoût, mais aussi d'une humanité cinglante. À travers lui, Nicolas explore les thèmes qui le hantent : l'exclusion, les discriminations, le harcèlement. C'est un cri silencieux contre les écarts qui fracturent nos sociétés. -

+

Hatjan Krâpo, le Cousin du grung

+

+ Avant que je n'existe, un autre batracien est né de son crayon : Hatjan Krâpo. Mon lointain cousin de papier. Si je suis un pèlerin des sables, Hatjan est un symbole du rejet, du dégoût, mais aussi d'une humanité cinglante. À travers lui, Nicolas explore les thèmes qui le hantent : l'exclusion, les discriminations, le harcèlement. C'est un cri silencieux contre les écarts qui fracturent nos sociétés. +

-

Mosaic Chantilly, l'Armateur d'Art

-

- Le 14 septembre 2024, un autre chemin s'est ouvert. Sous le nom de Mosaic Chantilly, il est devenu un "armateur d'art à corps perdu". Sa mission : déconstruire l'art comme une mosaïque pour en révéler l'essence. C'est une quête de dix ans qui commence, un nouveau voyage dans la matière et la forme. -

+

Mosaic Chantilly, l'Armateur d'Art

+

+ Le 14 septembre 2024, un autre chemin s'est ouvert. Sous le nom de Mosaic Chantilly, il est devenu un "armateur d'art à corps perdu". Sa mission : déconstruire l'art comme une mosaïque pour en révéler l'essence. C'est une quête de dix ans qui commence, un nouveau voyage dans la matière et la forme. +

-

Du Pinceau au Code

-

- Après des années à questionner le monde à travers l'art, il s'est tourné vers le développement web. Non pas pour abandonner le dessin, mais pour lui offrir un nouveau terrain de jeu. Il voit le code comme un autre langage pour raconter des histoires, pour créer des ponts. Ce site en est la preuve : un lieu où la 3D, la narration et la technique se rencontrent. -

+

Du Pinceau au Code

+

+ Après des années à questionner le monde à travers l'art, il s'est tourné vers le développement web. Non pas pour abandonner le dessin, mais pour lui offrir un nouveau terrain de jeu. Il voit le code comme un autre langage pour raconter des histoires, pour créer des ponts. Ce site en est la preuve : un lieu où la 3D, la narration et la technique se rencontrent. +

-

Retrouver l'Artisan

-

Pour suivre ses autres pérégrinations, qu'elles soient dessinées ou codées :

- +

Retrouver l'Artisan

+

Pour suivre ses autres pérégrinations, qu'elles soient dessinées ou codées :

+ +
+
\ No newline at end of file diff --git a/src/pages/boussole.astro b/src/pages/boussole.astro index c92be34..a55267f 100644 --- a/src/pages/boussole.astro +++ b/src/pages/boussole.astro @@ -1,17 +1,19 @@ --- -import Layout from '../layouts/Layout.astro'; +import GameLayout from '../layouts/GameLayout.astro'; +import ParchmentCard from '../components/ui/ParchmentCard.astro'; --- - -

⚖️ La Boussole Éthique

-

- Mon voyage a commencé à cause d'un fléau : un sable sombre, dépourvu de vie, qui corrompt mes terres et empoisonne les rêves de mon peuple. Cette quête m'a enseigné à distinguer le sable pur du sable vicié. Il en va de même pour les créations des mortels. Certaines sont conçues pour apporter un repos réparateur, d'autres sont des pièges, aussi subtils que le poison sur ma peau. -

+ + +

⚖️ La Boussole Éthique

+

+ Mon voyage a commencé à cause d'un fléau : un sable sombre, dépourvu de vie, qui corrompt mes terres et empoisonne les rêves de mon peuple. Cette quête m'a enseigné à distinguer le sable pur du sable vicié. Il en va de même pour les créations des mortels. Certaines sont conçues pour apporter un repos réparateur, d'autres sont des pièges, aussi subtils que le poison sur ma peau. +

-

Les Sables de Vie : Les Chemins à Suivre

-

Ce sont les modèles basés sur le respect et la valeur. L'**Open Source**, par exemple, est comme une oasis où chaque pèlerin peut puiser de l'eau, mais aussi y ajouter une goutte pour le suivant. C'est un cycle de don où la connaissance n'est pas un trésor gardé, mais une source qui abreuve la communauté. Ma conviction est que l'on peut bâtir de grandes choses avec des matériaux que d'autres jugent obsolètes, en laissant une empreinte légère. L'autonomie est possible sans dévaster le monde ; c'est une question de culture. Se souvenir de la naissance de la grande toile (le web) et voir où elle en est aujourd'hui doit nous inspirer à créer en harmonie avec l'ensemble.

+

Les Sables de Vie : Les Chemins à Suivre

+

Ce sont les modèles basés sur le respect et la valeur. L'**Open Source**, par exemple, est comme une oasis où chaque pèlerin peut puiser de l'eau, mais aussi y ajouter une goutte pour le suivant. C'est un cycle de don où la connaissance n'est pas un trésor gardé, mais une source qui abreuve la communauté. Ma conviction est que l'on peut bâtir de grandes choses avec des matériaux que d'autres jugent obsolètes, en laissant une empreinte légère. L'autonomie est possible sans dévaster le monde ; c'est une question de culture. Se souvenir de la naissance de la grande toile (le web) et voir où elle en est aujourd'hui doit nous inspirer à créer en harmonie avec l'ensemble.

-

Les Marécages de Sable Noir : Les Chemins à Éviter

-

Ici se trouvent les sables mouvants. Je perçois dans le monde une tendance à la démesure, une soif de pouvoir qui oublie l'équilibre. On y cherche à dominer plutôt qu'à harmoniser, à prendre plutôt qu'à partager. Cette philosophie ressemble au sable noir : elle crée des systèmes où quelques-uns s'enrichissent en asséchant les rêves de la multitude. Mon art se refuse à emprunter cette voie.

- -
\ No newline at end of file +

Les Marécages de Sable Noir : Les Chemins à Éviter

+

Ici se trouvent les sables mouvants. Je perçois dans le monde une tendance à la démesure, une soif de pouvoir qui oublie l'équilibre. On y cherche à dominer plutôt qu'à harmoniser, à prendre plutôt qu'à partager. Cette philosophie ressemble au sable noir : elle crée des systèmes où quelques-uns s'enrichissent en asséchant les rêves de la multitude. Mon art se refuse à emprunter cette voie.

+ + \ No newline at end of file diff --git a/src/pages/index.astro b/src/pages/index.astro index 071507e..310a830 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -1,17 +1,9 @@ --- -import Layout from '../layouts/Layout.astro'; -import Card from '../components/Card.astro'; +import GameLayout from '../layouts/GameLayout.astro'; +import GoldButton from '../components/ui/GoldButton.astro'; --- - - +

Bienvenue sur le projet JDR Sweet Journey !

L'Ambition

L'objectif est de créer un clone entièrement web de l'application mobile AFK Journey. Ce projet sera une vitrine technologique utilisant :

@@ -20,10 +12,10 @@ import Card from '../components/Card.astro';
  • La retranscription de ces éléments dans le navigateur grâce à Three.js.
    • -

    Si en plus, cette plateforme peut servir de point de repère pour nos aventures de jeu de rôle, c'est une pierre deux coups !

    @@ -32,17 +24,17 @@ import Card from '../components/Card.astro';

    Ce site est aussi un levier pour maîtriser les paradigmes technologiques de demain. Explorez le journal d'aventure pour suivre la quête, ou consultez les logs de construction pour voir les coulisses techniques.

      - - -

      Quelle ambition, jeune batracien...

      - + diff --git a/src/pages/journal/[...slug].astro b/src/pages/journal/[...slug].astro new file mode 100644 index 0000000..452c48f --- /dev/null +++ b/src/pages/journal/[...slug].astro @@ -0,0 +1,45 @@ +--- +import { getCollection } from 'astro:content'; +import GameLayout from '../../layouts/GameLayout.astro'; +import ParchmentCard from '../../components/ui/ParchmentCard.astro'; + +// 1. Génère une page statique pour chaque article de la collection +export async function getStaticPaths() { + const posts = await getCollection('journal'); + return posts.map((post) => ({ + params: { slug: post.slug }, + props: post, + })); +} + +// 2. Récupère les props de l'article correspondant +const post = Astro.props; +const { Content } = await post.render(); +--- + + + +

      {post.data.title}

      +
      + Par {post.data.author} • Le {post.data.publishDate.toLocaleDateString('fr-FR')} +
      + {post.data.tags && ( +
      + {post.data.tags.map((tag) => ( + {tag} + ))} +
      + )} +
      + +
      +
      +
      + + \ No newline at end of file diff --git a/src/pages/journal/[slug].astro b/src/pages/journal/[slug].astro deleted file mode 100644 index c23aba0..0000000 --- a/src/pages/journal/[slug].astro +++ /dev/null @@ -1,24 +0,0 @@ ---- -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 index a3ec5dc..f82934c 100644 --- a/src/pages/journal/index.astro +++ b/src/pages/journal/index.astro @@ -1,18 +1,26 @@ --- import { getCollection } from 'astro:content'; -import Layout from '../../layouts/Layout.astro'; +import GameLayout from '../../layouts/GameLayout.astro'; +import ContentSearch from '../../components/ContentSearch.astro'; + +// 1. Récupère TOUS les articles et les trie. +const allPosts = await getCollection('journal'); +const sortedPosts = allPosts.sort( + (a, b) => b.data.publishDate.valueOf() - a.data.publishDate.valueOf() +); + +// 2. Extrait toutes les balises uniques +const allTags = [...new Set(allPosts.flatMap(post => post.data.tags || []))]; -const allJournalEntries = await getCollection('journal'); --- - -

      Journal d'Aventure

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

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

        -
      • - ))} -
      -
      + +

      📖 Journal d'Aventure

      +

      + Les chroniques de nos voyages. Utilisez la barre de recherche pour trouver un récit. +

      + + + + +
      \ No newline at end of file diff --git a/src/pages/journal/tags/[tag].astro b/src/pages/journal/tags/[tag].astro new file mode 100644 index 0000000..b9a8625 --- /dev/null +++ b/src/pages/journal/tags/[tag].astro @@ -0,0 +1,39 @@ +--- +import { getCollection } from 'astro:content'; +import GameLayout from '../../../layouts/GameLayout.astro'; +import GoldButton from '../../../components/ui/GoldButton.astro'; + +export async function getStaticPaths() { + const allPosts = await getCollection('journal'); + const allTags = [...new Set(allPosts.flatMap((post) => post.data.tags || []))]; + + return allTags.map((tag) => { + const filteredPosts = allPosts.filter((post) => post.data.tags?.includes(tag)); + return { + params: { tag }, + props: { posts: filteredPosts }, + }; + }); +} + +const { tag } = Astro.params; +const { posts } = Astro.props; +--- + + +

      Récits avec la balise : {tag}

      + +
      + { + posts.map((post) => ( + + )) + } +
      +
      + + \ No newline at end of file diff --git a/src/pages/logs/[...slug].astro b/src/pages/logs/[...slug].astro new file mode 100644 index 0000000..52d940b --- /dev/null +++ b/src/pages/logs/[...slug].astro @@ -0,0 +1,47 @@ +--- +import { getCollection } from 'astro:content'; +import GameLayout from '../../layouts/GameLayout.astro'; +import ParchmentCard from '../../components/ui/ParchmentCard.astro'; + +// 1. Génère une page pour chaque entrée de la collection 'logs' +export async function getStaticPaths() { + const logEntries = await getCollection('logs'); + return logEntries.map((entry) => ({ + params: { slug: entry.slug }, + props: entry, + })); +} + +// 2. Récupère les props pour la page actuelle +const post = Astro.props; +const { Content } = await post.render(); +--- + + + +

      {post.data.title}

      +
      + Publié le {post.data.publishDate.toLocaleDateString('fr-FR')} +
      + {post.data.tags && ( +
      + {post.data.tags.map((tag) => ( + {tag} + ))} +
      + )} +
      + +
      +
      +
      + + \ No newline at end of file diff --git a/src/pages/logs/[slug].astro b/src/pages/logs/[slug].astro deleted file mode 100644 index e7fe756..0000000 --- a/src/pages/logs/[slug].astro +++ /dev/null @@ -1,24 +0,0 @@ ---- -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 index eeb33d7..039d38e 100644 --- a/src/pages/logs/index.astro +++ b/src/pages/logs/index.astro @@ -1,18 +1,25 @@ --- import { getCollection } from 'astro:content'; -import Layout from '../../layouts/Layout.astro'; +import GameLayout from '../../layouts/GameLayout.astro'; +import ContentSearch from '../../components/ContentSearch.astro'; -const allLogEntries = await getCollection('logs'); +// 1. Récupère TOUS les logs et les trie. +const allPosts = await getCollection('logs'); +const sortedPosts = allPosts.sort( + (a, b) => b.data.publishDate.valueOf() - a.data.publishDate.valueOf() +); + +// 2. Extrait toutes les balises uniques +const allTags = [...new Set(allPosts.flatMap(post => post.data.tags || []))]; --- - -

      Logs de Construction

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

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

        -
      • - ))} -
      -
      + +

      ⚙️ Logs de Construction

      +

      + Les coulisses techniques du projet. Utilisez la barre de recherche pour trouver un log. +

      + + + + +
      diff --git a/src/pages/logs/tags/[tag].astro b/src/pages/logs/tags/[tag].astro new file mode 100644 index 0000000..a009cf7 --- /dev/null +++ b/src/pages/logs/tags/[tag].astro @@ -0,0 +1,39 @@ +--- +import { getCollection } from 'astro:content'; +import GameLayout from '../../../layouts/GameLayout.astro'; +import GoldButton from '../../../components/ui/GoldButton.astro'; + +export async function getStaticPaths() { + const allPosts = await getCollection('logs'); + const allTags = [...new Set(allPosts.flatMap((post) => post.data.tags || []))]; + + return allTags.map((tag) => { + const filteredPosts = allPosts.filter((post) => post.data.tags?.includes(tag)); + return { + params: { tag }, + props: { posts: filteredPosts }, + }; + }); +} + +const { tag } = Astro.params; +const { posts } = Astro.props; +--- + + +

      Logs avec la balise : {tag}

      + +
      + { + posts.map((post) => ( + + )) + } +
      +
      + + \ No newline at end of file diff --git a/src/pages/observatoire.astro b/src/pages/observatoire.astro index e834ce3..0bca8a7 100644 --- a/src/pages/observatoire.astro +++ b/src/pages/observatoire.astro @@ -1,28 +1,32 @@ --- -import Layout from '../layouts/Layout.astro'; +import GameLayout from '../layouts/GameLayout.astro'; +import ParchmentCard from '../components/ui/ParchmentCard.astro'; --- - -

      🔭 L'Observatoire des Songes

      -

      - Un pèlerin, même dans les mers de sable, doit lever les yeux vers les constellations pour ne pas perdre son chemin. Mon voyage n'est pas solitaire ; il est guidé par les échos d'autres mondes, les murmures d'autres créateurs. Cet observatoire est ma carte du ciel, où chaque étoile est une âme dont la lumière m'inspire. -

      + + +

      🔭 L'Observatoire des Songes

      +

      + Un pèlerin, même dans les mers de sable, doit lever les yeux vers les constellations pour ne pas perdre son chemin. Mon voyage n'est pas solitaire ; il est guidé par les échos d'autres mondes, les murmures d'autres créateurs. Cet observatoire est ma carte du ciel, où chaque étoile est une âme dont la lumière m'inspire. +

      -

      Les Tisseurs de Rêves : Artistes & Développeurs

      -

      Certains artisans, comme le maître Hayao Miyazaki, créent des mondes où le vent, les arbres et les esprits ont une voix. Leurs récits sont des leçons d'harmonie, un rappel que même la plus petite créature a sa place dans le grand cycle. J'étudie leurs œuvres comme un ancien grimoire, y cherchant la maîtrise de la forme et du mouvement.

      +

      Les Tisseurs de Rêves : Artistes & Développeurs

      +

      Certains artisans, comme le maître Hayao Miyazaki, créent des mondes où le vent, les arbres et les esprits ont une voix. Leurs récits sont des leçons d'harmonie, un rappel que même la plus petite créature a sa place dans le grand cycle. J'étudie leurs œuvres comme un ancien grimoire, y cherchant la maîtrise de la forme et du mouvement.

      -

      Mes Compagnons de Quête

      -

      Mon pèlerinage serait vain sans ceux qui marchent à mes côtés. Chacun est une étoile dans ma nuit, une source de force et de récits inattendus. Leur courage et leurs bizarreries nourrissent mon voyage autant que le sable :

      -
        -
      • Orson, le Gardien du Froid : Notre Maître de Jeu, un être aussi énigmatique et froid que sa patrie gelée. Il tisse les fils de notre destinée tout en suivant la sienne : une quête de vengeance pour sa sœur disparue, marquée au fer rouge par un symbole arcanique. Il est le vent glacial qui nous pousse en avant.
      • -
      • Gurdill "Cul Brillant" : Un prince nain en exil, dont le surnom lumineux cache une profonde connaissance de la forge. Banni par les siens, il cherche à prouver sa valeur, son marteau elfique à la main. Sa quête de rédemption est aussi flamboyante que son fameux caleçon.
      • -
      • Bulle aux Mains d’Or : Une fée guérisseuse, exilée volontaire de son royaume pour comprendre la souffrance du monde matériel. Sa lumière est un baume pour nos blessures, et sa naïveté un rappel constant de la pureté que nous cherchons à protéger.
      • -
      • Jinn le Mélodiste : Un barde Genasi au sang de feu, dont la musique est aussi ardente que son tempérament. Sa quête pour retrouver l'épée de ses ancêtres est un chant d'honneur qui rythme nos pas et enflamme nos cœurs.
      • -
      • Nyrae la Guérisseuse : Une Tabaxi dont les pas silencieux la guident loin de sa forêt natale. Son instinct et sa connaissance des onguents sont un réconfort précieux, une présence sauvage et apaisante dans notre groupe hétéroclite.
      • -
      +

      Mes Compagnons de Quête

      +

      Mon pèlerinage serait vain sans ceux qui marchent à mes côtés. Chacun est une étoile dans ma nuit, une source de force et de récits inattendus. Leur courage et leurs bizarreries nourrissent mon voyage autant que le sable :

      +
        +
      • Orson, le Gardien du Froid : Notre Maître de Jeu, un être aussi énigmatique et froid que sa patrie gelée. Il tisse les fils de notre destinée tout en suivant la sienne : une quête de vengeance pour sa sœur disparue, marquée au fer rouge par un symbole arcanique. Il est le vent glacial qui nous pousse en avant.
      • +
      • Gurdill "Cul Brillant" : Un prince nain en exil, dont le surnom lumineux cache une profonde connaissance de la forge. Banni par les siens, il cherche à prouver sa valeur, son marteau elfique à la main. Sa quête de rédemption est aussi flamboyante que son fameux caleçon.
      • +
      • Bulle aux Mains d’Or : Une fée guérisseuse, exilée volontaire de son royaume pour comprendre la souffrance du monde matériel. Sa lumière est un baume pour nos blessures, et sa naïveté un rappel constant de la pureté que nous cherchons à protéger.
      • +
      • Jinn le Mélodiste : Un barde Genasi au sang de feu, dont la musique est aussi ardente que son tempérament. Sa quête pour retrouver l'épée de ses ancêtres est un chant d'honneur qui rythme nos pas et enflamme nos cœurs.
      • +
      • Nyrae la Guérisseuse : Une Tabaxi dont les pas silencieux la guident loin de sa forêt natale. Son instinct et sa connaissance des onguents sont un réconfort précieux, une présence sauvage et apaisante dans notre groupe hétéroclite.
      • +
      -

      Les Murmures du Vent

      - -

      Les Chroniques d'Autres Mondes

      +

      Les Murmures du Vent

      + +

      Les Chroniques d'Autres Mondes

      +
      +
      \ No newline at end of file