Compare commits
1 Commits
feat/v13-b
...
feat/v13-c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e90a7e12ef |
10
package-lock.json
generated
10
package-lock.json
generated
@@ -10,6 +10,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@astrojs/node": "^10.1.0",
|
"@astrojs/node": "^10.1.0",
|
||||||
"@astrojs/vue": "^6.0.1",
|
"@astrojs/vue": "^6.0.1",
|
||||||
|
"@fontsource-variable/roboto-condensed": "^5.2.8",
|
||||||
"@tailwindcss/vite": "^4.2.4",
|
"@tailwindcss/vite": "^4.2.4",
|
||||||
"@types/d3": "^7.4.3",
|
"@types/d3": "^7.4.3",
|
||||||
"astro": "^6.3.1",
|
"astro": "^6.3.1",
|
||||||
@@ -1064,6 +1065,15 @@
|
|||||||
"node": ">=18"
|
"node": ">=18"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@fontsource-variable/roboto-condensed": {
|
||||||
|
"version": "5.2.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/@fontsource-variable/roboto-condensed/-/roboto-condensed-5.2.8.tgz",
|
||||||
|
"integrity": "sha512-aIZ2kYSoJHkTI4z8x/PRgKX6Zb9TTtSE/u+fUYeiwL+5trP9rhYYEEeNjRttaMqRgoDHcSueArdRZ43wf/i2Kw==",
|
||||||
|
"license": "OFL-1.1",
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ayuhito"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@img/colour": {
|
"node_modules/@img/colour": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@astrojs/node": "^10.1.0",
|
"@astrojs/node": "^10.1.0",
|
||||||
"@astrojs/vue": "^6.0.1",
|
"@astrojs/vue": "^6.0.1",
|
||||||
|
"@fontsource-variable/roboto-condensed": "^5.2.8",
|
||||||
"@tailwindcss/vite": "^4.2.4",
|
"@tailwindcss/vite": "^4.2.4",
|
||||||
"@types/d3": "^7.4.3",
|
"@types/d3": "^7.4.3",
|
||||||
"astro": "^6.3.1",
|
"astro": "^6.3.1",
|
||||||
|
|||||||
@@ -34,16 +34,6 @@ const categories = [
|
|||||||
],
|
],
|
||||||
hasSelector: false,
|
hasSelector: false,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
id: 'pro',
|
|
||||||
label: 'Pro',
|
|
||||||
color: '#0F172A',
|
|
||||||
hashtags: ['#building-public', '#pro'],
|
|
||||||
plateformes: [
|
|
||||||
{ id: 'linkedin', label: 'LinkedIn', url: 'https://www.linkedin.com/in/jules-neny/' },
|
|
||||||
],
|
|
||||||
hasSelector: false,
|
|
||||||
},
|
|
||||||
];
|
];
|
||||||
---
|
---
|
||||||
<div class="h-full flex flex-col p-4 pt-20 md:pt-6 gap-5">
|
<div class="h-full flex flex-col p-4 pt-20 md:pt-6 gap-5">
|
||||||
@@ -52,7 +42,7 @@ const categories = [
|
|||||||
<details id="hashtags-accordion" class="border-t border-neutral-200 pt-4">
|
<details id="hashtags-accordion" class="border-t border-neutral-200 pt-4">
|
||||||
<summary class="font-semibold cursor-pointer select-none flex items-center justify-between">
|
<summary class="font-semibold cursor-pointer select-none flex items-center justify-between">
|
||||||
<span>Hashtags</span>
|
<span>Hashtags</span>
|
||||||
<span class="text-xs text-neutral-400 font-normal">4 categories</span>
|
<span class="text-xs text-neutral-400 font-normal">3 categories</span>
|
||||||
</summary>
|
</summary>
|
||||||
|
|
||||||
<div class="mt-3 flex flex-wrap gap-2" id="category-badges">
|
<div class="mt-3 flex flex-wrap gap-2" id="category-badges">
|
||||||
@@ -136,7 +126,7 @@ const categories = [
|
|||||||
const PLATFORM_KEY = 'tf-platform-filter';
|
const PLATFORM_KEY = 'tf-platform-filter';
|
||||||
|
|
||||||
// Active state : map categoryId -> boolean
|
// Active state : map categoryId -> boolean
|
||||||
const activeCategories: Record<string, boolean> = { politique: true, art: true, outils: true, pro: true };
|
const activeCategories: Record<string, boolean> = { politique: true, art: true, outils: true };
|
||||||
|
|
||||||
// Platform filter : map categoryId -> platformId | null
|
// Platform filter : map categoryId -> platformId | null
|
||||||
const platformFilters: Record<string, string | null> = { politique: null };
|
const platformFilters: Record<string, string | null> = { politique: null };
|
||||||
@@ -148,18 +138,15 @@ const categories = [
|
|||||||
const politiqueHashtags = ['#politique', '#aep-politique'];
|
const politiqueHashtags = ['#politique', '#aep-politique'];
|
||||||
const artHashtags = ['#peinture', '#art'];
|
const artHashtags = ['#peinture', '#art'];
|
||||||
const outilsHashtags = ['#stack', '#building-public'];
|
const outilsHashtags = ['#stack', '#building-public'];
|
||||||
const proHashtags = ['#building-public', '#pro'];
|
|
||||||
|
|
||||||
const allPolitique = politiqueHashtags.every(h => storedHashtags[h] !== false);
|
const allPolitique = politiqueHashtags.every(h => storedHashtags[h] !== false);
|
||||||
const allArt = artHashtags.every(h => storedHashtags[h] !== false);
|
const allArt = artHashtags.every(h => storedHashtags[h] !== false);
|
||||||
const allOutils = outilsHashtags.every(h => storedHashtags[h] !== false);
|
const allOutils = outilsHashtags.every(h => storedHashtags[h] !== false);
|
||||||
const allPro = proHashtags.every(h => storedHashtags[h] !== false);
|
|
||||||
|
|
||||||
if (Object.keys(storedHashtags).length > 0) {
|
if (Object.keys(storedHashtags).length > 0) {
|
||||||
activeCategories['politique'] = allPolitique;
|
activeCategories['politique'] = allPolitique;
|
||||||
activeCategories['art'] = allArt;
|
activeCategories['art'] = allArt;
|
||||||
activeCategories['outils'] = allOutils;
|
activeCategories['outils'] = allOutils;
|
||||||
activeCategories['pro'] = allPro;
|
|
||||||
}
|
}
|
||||||
} catch { /* mode prive */ }
|
} catch { /* mode prive */ }
|
||||||
|
|
||||||
@@ -176,7 +163,6 @@ const categories = [
|
|||||||
politique: ['#politique', '#aep-politique'],
|
politique: ['#politique', '#aep-politique'],
|
||||||
art: ['#peinture', '#art'],
|
art: ['#peinture', '#art'],
|
||||||
outils: ['#stack', '#building-public'],
|
outils: ['#stack', '#building-public'],
|
||||||
pro: ['#building-public', '#pro'],
|
|
||||||
};
|
};
|
||||||
for (const [catId, tags] of Object.entries(catHashtags)) {
|
for (const [catId, tags] of Object.entries(catHashtags)) {
|
||||||
const active = activeCategories[catId] ?? true;
|
const active = activeCategories[catId] ?? true;
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<button
|
<button
|
||||||
id="hamburger-trigger"
|
id="hamburger-trigger"
|
||||||
type="button"
|
type="button"
|
||||||
class="fixed top-4 right-4 z-50 p-3 bg-white/95 border border-neutral-200 rounded-lg shadow-md hover:bg-white transition-colors md:hidden"
|
class="fixed top-4 right-4 z-50 p-3 bg-white/95 border border-neutral-200 rounded-lg shadow-md hover:bg-white transition-colors md:top-6 md:right-6"
|
||||||
aria-label="Ouvrir le menu"
|
aria-label="Ouvrir le menu"
|
||||||
aria-expanded="false"
|
aria-expanded="false"
|
||||||
aria-controls="hamburger-drawer"
|
aria-controls="hamburger-drawer"
|
||||||
|
|||||||
@@ -1,52 +1,80 @@
|
|||||||
---
|
---
|
||||||
// SiteHeader.astro - V1.2-M : bandeau header pleine largeur identite site
|
// SiteHeader.astro - V1.3-C : header 1 ligne fine, liens cliquables, phrase intention Roboto Condensed
|
||||||
// Palette terre figee : papier #FAFAF7, encre #0F172A, encre douce #475569
|
// Palette V1.3 figee : papier #FAFAF7, encre #0F172A, encre douce #475569, border #E5E7EB
|
||||||
// Composition retenue : 2 lignes hierarchique
|
// Composition :
|
||||||
// ligne 1 : "Trans-Former" wordmark dominant (semibold tracking serre)
|
// Desktop (>= md) : 1 ligne ~44px - Trans-Former | Jules Neny | architecture d'ecologie politique [phrase intention right-aligned, Roboto Condensed]
|
||||||
// ligne 2 : "Jules Neny" + baseline italique cote a cote (separateur point median)
|
// Mobile (< md) : 2 lignes compactes - ligne 1 Trans-Former / ligne 2 Jules Neny . AEP (cliquables) - phrase intention masquee
|
||||||
// Rationale : le wordmark domine sans ecraser ; la baseline reste lisible ;
|
// Liens :
|
||||||
// composition adaptee a un manifeste (hierarchie typographique forte).
|
// Trans-Former -> /
|
||||||
// Hauteur : ~64px desktop / ~48px mobile (compacte)
|
// Jules Neny -> /a-propos
|
||||||
// Baseline raccourcie mobile : "architecture politique du vivant"
|
// architecture d'ecologie politique -> https://aep.trans-former.fr (same-tab, site frere coherent)
|
||||||
|
// Typo phrase intention : Roboto Condensed Variable @fontsource (weight 400, font-stretch 75%)
|
||||||
|
import '@fontsource-variable/roboto-condensed/wght.css';
|
||||||
---
|
---
|
||||||
<header
|
<header
|
||||||
class="site-header w-full border-b border-[#E5E7EB] bg-[#FAFAF7] text-[#0F172A] px-4 md:px-6 flex items-center"
|
class="site-header w-full border-b border-[#E5E7EB] bg-[#FAFAF7] text-[#0F172A] px-4 md:px-6 flex items-center"
|
||||||
role="banner"
|
role="banner"
|
||||||
>
|
>
|
||||||
<a
|
<!-- Bloc identite (gauche) -->
|
||||||
href="/"
|
<nav
|
||||||
class="flex flex-col md:flex-row md:items-baseline gap-x-3 gap-y-0 no-underline text-[#0F172A] hover:text-[#0F172A]"
|
class="flex flex-col md:flex-row md:items-baseline gap-x-2 gap-y-0.5 flex-shrink-0"
|
||||||
aria-label="trans-former.fr - retour accueil"
|
aria-label="identite site"
|
||||||
>
|
>
|
||||||
<!-- Ligne 1 : wordmark dominant -->
|
<!-- Ligne 1 desktop = wordmark inline ; mobile = ligne dediee -->
|
||||||
<span
|
<a
|
||||||
class="font-semibold tracking-tight text-[#0F172A] text-[17px] md:text-[20px] leading-none"
|
href="/"
|
||||||
|
class="font-semibold tracking-tight text-[#0F172A] hover:text-[#0F172A] text-[15px] md:text-[16px] leading-none no-underline hover:underline underline-offset-2 decoration-1"
|
||||||
|
aria-label="trans-former.fr - accueil"
|
||||||
>
|
>
|
||||||
Trans-Former
|
Trans-Former
|
||||||
</span>
|
</a>
|
||||||
|
|
||||||
<!-- Ligne 2 (desktop : inline ; mobile : sous wordmark) : Jules Neny + baseline -->
|
<!-- Bloc secondaire : Jules Neny . AEP (mobile : ligne 2 ; desktop : inline) -->
|
||||||
<span class="flex items-baseline gap-2 text-[#475569] leading-none">
|
<span class="flex items-baseline gap-1.5 text-[#475569] leading-none">
|
||||||
<span class="text-[11px] md:text-[13px]">Jules Neny</span>
|
<span class="text-[#94A3B8] hidden md:inline" aria-hidden="true">·</span>
|
||||||
|
<a
|
||||||
|
href="/a-propos"
|
||||||
|
class="text-[12px] md:text-[13px] text-[#475569] hover:text-[#0F172A] no-underline hover:underline underline-offset-2 decoration-1"
|
||||||
|
>
|
||||||
|
Jules Neny
|
||||||
|
</a>
|
||||||
<span class="text-[#94A3B8]" aria-hidden="true">·</span>
|
<span class="text-[#94A3B8]" aria-hidden="true">·</span>
|
||||||
<!-- Baseline longue : desktop / Baseline courte : mobile -->
|
<a
|
||||||
<span class="italic text-[11px] md:text-[13px] hidden sm:inline">
|
href="https://aep.trans-former.fr"
|
||||||
architecture d'ecologie politique
|
class="text-[12px] md:text-[13px] text-[#475569] hover:text-[#0F172A] no-underline hover:underline underline-offset-2 decoration-1"
|
||||||
</span>
|
>
|
||||||
<span class="italic text-[11px] inline sm:hidden">
|
architecture d'écologie politique
|
||||||
architecture politique du vivant
|
</a>
|
||||||
</span>
|
|
||||||
</span>
|
</span>
|
||||||
</a>
|
</nav>
|
||||||
|
|
||||||
|
<!-- Phrase intention (droite, desktop only) - Roboto Condensed allongee -->
|
||||||
|
<p
|
||||||
|
class="intention hidden md:block ml-auto pl-6 text-right text-[#475569] text-[11px] leading-tight max-w-[55%]"
|
||||||
|
>
|
||||||
|
Comment créer une pratique systémique, créative et collective de transformation sociale pour répondre à l'effondrement et restaurer notre capacité à habiter la Terre dans l'Anthropocène ?
|
||||||
|
</p>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.site-header {
|
.site-header {
|
||||||
height: 48px;
|
height: 44px;
|
||||||
}
|
}
|
||||||
@media (min-width: 768px) {
|
@media (max-width: 767px) {
|
||||||
.site-header {
|
.site-header {
|
||||||
height: 64px;
|
height: auto;
|
||||||
|
min-height: 48px;
|
||||||
|
padding-top: 6px;
|
||||||
|
padding-bottom: 6px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/* Phrase intention : Roboto Condensed Variable, font-stretch 75% (allongement vertical condense)
|
||||||
|
Cantonnee a .intention pour eviter contagion stack Inter */
|
||||||
|
.intention {
|
||||||
|
font-family: 'Roboto Condensed Variable', 'Roboto Condensed', sans-serif;
|
||||||
|
font-weight: 400;
|
||||||
|
font-stretch: 75%;
|
||||||
|
font-style: italic;
|
||||||
|
letter-spacing: 0.01em;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ const {
|
|||||||
} = Astro.props;
|
} = Astro.props;
|
||||||
---
|
---
|
||||||
<!doctype html>
|
<!doctype html>
|
||||||
<html lang="fr" class="h-screen">
|
<html lang="fr">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||||
@@ -29,15 +29,11 @@ const {
|
|||||||
<meta name="twitter:title" content={title} />
|
<meta name="twitter:title" content={title} />
|
||||||
<meta name="twitter:description" content={description} />
|
<meta name="twitter:description" content={description} />
|
||||||
</head>
|
</head>
|
||||||
<body class="m-0 bg-white text-neutral-900 antialiased h-screen flex flex-col overflow-hidden">
|
<body class="m-0 bg-white text-neutral-900 antialiased min-h-screen flex flex-col">
|
||||||
<div class="flex-shrink-0">
|
<SiteHeader />
|
||||||
<SiteHeader />
|
<div class="flex-1 flex flex-col min-h-0">
|
||||||
</div>
|
|
||||||
<div class="flex-1 flex flex-col min-h-0 overflow-hidden">
|
|
||||||
<slot />
|
<slot />
|
||||||
</div>
|
</div>
|
||||||
<div class="flex-shrink-0">
|
<Footer />
|
||||||
<Footer />
|
|
||||||
</div>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import HamburgerMenu from '../components/astro/HamburgerMenu.astro';
|
|||||||
>
|
>
|
||||||
<HamburgerMenu />
|
<HamburgerMenu />
|
||||||
|
|
||||||
<main class="h-full overflow-y-auto bg-white">
|
<main class="min-h-screen bg-white">
|
||||||
<article class="max-w-2xl mx-auto px-6 py-16 md:py-24">
|
<article class="max-w-2xl mx-auto px-6 py-16 md:py-24">
|
||||||
|
|
||||||
<header class="mb-10">
|
<header class="mb-10">
|
||||||
|
|||||||
@@ -15,16 +15,18 @@ import PopupOnboarding from '../components/astro/PopupOnboarding.astro';
|
|||||||
<MobileTabBar />
|
<MobileTabBar />
|
||||||
<PopupOnboarding />
|
<PopupOnboarding />
|
||||||
|
|
||||||
<!-- Desktop : grid 3 colonnes V1.3-BG : prend toute la place du wrapper flex-1 du BaseLayout.
|
<!-- Desktop : grid 3 colonnes (header 64px deja consommes par SiteHeader, on prend le reste) -->
|
||||||
Header et footer sont fixes (flex-shrink-0), pas besoin de calc(100vh - X). -->
|
<div
|
||||||
<div class="hidden md:grid md:grid-cols-[320px_1fr_320px] h-full overflow-hidden">
|
class="hidden md:grid md:grid-cols-[320px_1fr_320px] overflow-hidden"
|
||||||
<aside class="border-r border-neutral-200 overflow-y-auto h-full"><ColJournal /></aside>
|
style="height: calc(100vh - 64px);"
|
||||||
<main class="overflow-hidden h-full"><ColCentre /></main>
|
>
|
||||||
<aside class="border-l border-neutral-200 overflow-y-auto h-full"><ColInsta /></aside>
|
<aside class="border-r border-neutral-200 overflow-y-auto"><ColJournal /></aside>
|
||||||
|
<main class="overflow-hidden"><ColCentre /></main>
|
||||||
|
<aside class="border-l border-neutral-200 overflow-y-auto"><ColInsta /></aside>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Mobile : SwipeContainer Vue island - tabbar 44px reserve dans la zone flex-1 -->
|
<!-- Mobile : SwipeContainer Vue island - header 48px + tabbar 44px = 92px reserves -->
|
||||||
<div class="md:hidden h-full overflow-hidden" style="padding-top: 44px;">
|
<div class="md:hidden overflow-hidden" style="height: calc(100dvh - 48px - 44px); margin-top: 44px;">
|
||||||
<SwipeContainer client:load>
|
<SwipeContainer client:load>
|
||||||
<ColJournal slot="left" />
|
<ColJournal slot="left" />
|
||||||
<ColCentre slot="center" />
|
<ColCentre slot="center" />
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import HamburgerMenu from '../components/astro/HamburgerMenu.astro';
|
|||||||
>
|
>
|
||||||
<HamburgerMenu />
|
<HamburgerMenu />
|
||||||
|
|
||||||
<main class="h-full overflow-y-auto bg-white">
|
<main class="min-h-screen bg-white">
|
||||||
<article class="max-w-2xl mx-auto px-6 py-16 md:py-24">
|
<article class="max-w-2xl mx-auto px-6 py-16 md:py-24">
|
||||||
|
|
||||||
<!-- En-tete -->
|
<!-- En-tete -->
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import HamburgerMenu from '../../components/astro/HamburgerMenu.astro';
|
|||||||
>
|
>
|
||||||
<HamburgerMenu />
|
<HamburgerMenu />
|
||||||
|
|
||||||
<main class="h-full overflow-y-auto bg-white">
|
<main class="min-h-screen bg-white">
|
||||||
<article class="max-w-xl mx-auto px-6 py-16 md:py-24">
|
<article class="max-w-xl mx-auto px-6 py-16 md:py-24">
|
||||||
|
|
||||||
<header class="mb-10">
|
<header class="mb-10">
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import HamburgerMenu from '../components/astro/HamburgerMenu.astro';
|
|||||||
>
|
>
|
||||||
<HamburgerMenu />
|
<HamburgerMenu />
|
||||||
|
|
||||||
<main class="h-full overflow-y-auto bg-white">
|
<main class="min-h-screen bg-white">
|
||||||
<article class="max-w-2xl mx-auto px-6 py-16 md:py-24">
|
<article class="max-w-2xl mx-auto px-6 py-16 md:py-24">
|
||||||
|
|
||||||
<header class="mb-10">
|
<header class="mb-10">
|
||||||
|
|||||||
Reference in New Issue
Block a user