diff --git a/src/components/FranceMap.astro b/src/components/FranceMap.astro index 817147d..7d07e95 100644 --- a/src/components/FranceMap.astro +++ b/src/components/FranceMap.astro @@ -1,40 +1,201 @@ --- import franceMap from '../data/france-map.json'; -import { COLORS } from '../lib/phenomena'; -import type { ColorId } from '../lib/phenomena'; +import { COLORS, COLOR_LABEL, PHENOMENA } from '../lib/phenomena'; +import type { ColorId, PhenomenonId } from '../lib/phenomena'; +import type { VigilanceAlert } from '../lib/vigilance'; +import { getDepartement } from '../lib/departements'; interface Props { colorsByDept: Map; + alertsByDept?: Map; } -const { colorsByDept } = Astro.props; +const { colorsByDept, alertsByDept = new Map() } = Astro.props; const entries = Object.entries(franceMap.paths) as [string, { d: string; name: string }][]; + +// Construire un objet { code: { name, color, alerts: [{phenLabel, colorName, colorId}] } } +// transmis au JS du tooltip via JSON inline. +const tooltipData: Record; +}> = {}; + +for (const [code] of entries) { + const dept = getDepartement(code); + if (!dept) continue; + const colorId = colorsByDept.get(code) ?? 1; + const list = (alertsByDept.get(code) ?? []) + .slice() + .sort((a, b) => b.colorId - a.colorId); + tooltipData[code] = { + name: dept.name, + region: dept.region, + colorId, + alerts: list.map((a) => ({ + phen: PHENOMENA[a.phenomenonId].label, + colorId: a.colorId, + colorName: COLORS[a.colorId].name, + })), + }; +} --- - - Carte Vigilance Météo France - { - entries.map(([code, dept]) => { - const colorId = colorsByDept.get(code) ?? 1; - const color = COLORS[colorId]; +
+ + Carte Vigilance Météo France + { + entries.map(([code, dept]) => { + const colorId = colorsByDept.get(code) ?? 1; + const color = COLORS[colorId]; + return ( + + + + ); + }) + } + + + +
+ + diff --git a/src/layouts/Base.astro b/src/layouts/Base.astro index 2d4156c..a76cb65 100644 --- a/src/layouts/Base.astro +++ b/src/layouts/Base.astro @@ -33,7 +33,6 @@ const jsonLd = { publisher: { '@type': 'Person', name: 'Florian Bouchet', - url: 'https://nocleus.com', }, potentialAction: { '@type': 'SearchAction', @@ -110,7 +109,7 @@ const jsonLd = {
  • À propos
  • Mentions légales
  • Dépendances
  • -
  • Soutenir
  • +
  • ☕ Soutenir sur Ko-fi
  • API JSON publique
  • @@ -124,10 +123,8 @@ const jsonLd = {

    - Un projet - Nocleus. - Code source : - git.nocleus.com. + Édité à titre personnel, sans but lucratif — + mentions légales.

    diff --git a/src/pages/a-propos.astro b/src/pages/a-propos.astro index 9d9a72d..bfc9102 100644 --- a/src/pages/a-propos.astro +++ b/src/pages/a-propos.astro @@ -77,9 +77,9 @@ export const prerender = false;

    Code source

    - Le site est entièrement open source. Le code est disponible sur - git.nocleus.com/florian/info-canicule - (instance Forgejo personnelle). Contributions, signalements de bugs et améliorations bienvenus. + Le code est disponible sur demande à + florian@nocleus.com (contributions, signalements de + bugs et améliorations bienvenus).

    Contact

    diff --git a/src/pages/dependances.astro b/src/pages/dependances.astro index fde0d83..ec973dd 100644 --- a/src/pages/dependances.astro +++ b/src/pages/dependances.astro @@ -206,10 +206,8 @@ const INFRA = [

    - Code source du site : - - git.nocleus.com/florian/info-canicule - + Code source du site disponible sur demande à + florian@nocleus.com.

    diff --git a/src/pages/index.astro b/src/pages/index.astro index 4bd1d14..aa9dfd7 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -6,7 +6,7 @@ import VigilanceLegend from '../components/VigilanceLegend.astro'; import VigilanceChip from '../components/VigilanceChip.astro'; import { getVigilanceSnapshot, maxColorByDepartement, activeAlerts } from '../lib/vigilance'; import { getDepartement } from '../lib/departements'; -import { PHENOMENA, COLORS } from '../lib/phenomena'; +import type { VigilanceAlert } from '../lib/vigilance'; export const prerender = false; @@ -20,6 +20,29 @@ try { const colorsByDept = snapshot ? maxColorByDepartement(snapshot, 'J') : new Map(); const alertsToday = snapshot ? activeAlerts(snapshot, 2) : []; + +// Group all today's alerts (any level) by department, for tooltip + active alerts list. +const alertsByDept = new Map(); +if (snapshot) { + for (const a of snapshot.alerts) { + if (a.echeance !== 'J') continue; + if (a.colorId < 2) continue; + const list = alertsByDept.get(a.departement) ?? []; + list.push(a); + alertsByDept.set(a.departement, list); + } +} + +// Tri des départements actifs par code (2A/2B inséré après 19). +function deptSortKey(code: string): string { + if (code === '2A') return '19.1'; + if (code === '2B') return '19.2'; + return code; +} +const activeDeptCodes = [...alertsByDept.keys()].sort((a, b) => + deptSortKey(a).localeCompare(deptSortKey(b), 'en', { numeric: true }), +); + const canicule = alertsToday.filter((a) => a.phenomenonId === 6).length; const orages = alertsToday.filter((a) => a.phenomenonId === 3).length; const orange = alertsToday.filter((a) => a.colorId >= 3).length; @@ -82,44 +105,54 @@ const productDate = snapshot?.productDatetime

    Niveau par département (aujourd'hui)

    -
    -
    - -
    -
    - - Vue par région (liste) - -
    - -
    -
    +

    + Survolez un département pour voir le détail des alertes, cliquez pour la page complète. +

    +
    +
    +
    + + Vue par région (liste) + +
    + +
    +
    ) } { - !error && alertsToday.length > 0 && ( + !error && activeDeptCodes.length > 0 && (
    -

    Alertes actives

    +

    + Départements en alerte ({activeDeptCodes.length}) +

    +

    + Triés par numéro de département. Un département peut cumuler plusieurs phénomènes (ex: canicule + orages). +

    + + ); + })}
    diff --git a/src/pages/mentions-legales.astro b/src/pages/mentions-legales.astro index f8340c0..a95a8b5 100644 --- a/src/pages/mentions-legales.astro +++ b/src/pages/mentions-legales.astro @@ -18,16 +18,22 @@ export const prerender = false;

    Éditeur du site

    - Site édité à titre personnel, sans but lucratif, par : + Site édité à titre personnel, sans but lucratif, par :

      -
    • Florian Bouchet — développeur indépendant
    • +
    • Florian Bouchet — personne physique
    • Contact : florian@nocleus.com
    • -
    • Statut : personne physique (pas d'entreprise immatriculée, pas d'association)

    - Le site n'a aucune vocation commerciale. Aucun chiffre d'affaires, aucune publicité, aucune - collecte de données à des fins de monétisation. + Info Canicule n'a aucune vocation commerciale : aucune publicité, aucun chiffre + d'affaires, aucune collecte de données à des fins de monétisation. +

    +

    + Distinction importante : l'éditeur exerce par ailleurs une activité de + développement sous le statut de micro-entreprise « Nocleus ». Cette activité commerciale + est totalement indépendante du site Info Canicule, qui est édité hors cadre + professionnel, sur fonds propres, à titre purement personnel et bénévole. Aucun service de la + micro-entreprise n'est financé, promu ou rattaché à ce site.

    Hébergement

    @@ -100,10 +106,10 @@ export const prerender = false;

    Propriété intellectuelle

    - Le code source du site est sous licence libre ( - repo Forgejo - ). Les données affichées sont sous Licence Ouverte 2.0 et réutilisables librement, y compris - commercialement, à condition de citer Météo France et la licence. + Le code source du site est disponible sur demande à + florian@nocleus.com. Les données affichées sont sous + Licence Ouverte 2.0 et réutilisables librement, y compris commercialement, à condition de citer + Météo France et la licence.

    L'endpoint /api/vigilance diffuse le snapshot courant en JSON (CORS *), pour diff --git a/src/pages/soutenir.astro b/src/pages/soutenir.astro index cbfd507..143e5b4 100644 --- a/src/pages/soutenir.astro +++ b/src/pages/soutenir.astro @@ -52,8 +52,7 @@ export const prerender = false;

    • Signaler un bug ou une typo : par mail à - florian@nocleus.com ou via une issue sur le - repo Forgejo. + florian@nocleus.com.
    • Partager le site autour de vous, en particulier auprès de personnes fragiles diff --git a/tailwind.config.mjs b/tailwind.config.mjs index 2dc1f99..3073244 100644 --- a/tailwind.config.mjs +++ b/tailwind.config.mjs @@ -4,6 +4,18 @@ const require = createRequire(import.meta.url); /** @type {import('tailwindcss').Config} */ export default { content: ['./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}'], + // Les classes vigilance-chip-{1..4} sont construites dynamiquement (`vigilance-chip-${colorId}`), + // donc le scanner statique ne les voit pas — on les force ici. + safelist: [ + 'vigilance-chip-1', + 'vigilance-chip-2', + 'vigilance-chip-3', + 'vigilance-chip-4', + 'bg-vigilance-vert', + 'bg-vigilance-jaune', + 'bg-vigilance-orange', + 'bg-vigilance-rouge', + ], theme: { extend: { colors: {