Boutons de points compacts unifiés + page Le Calendrier des Dieux
Boutons de validation des points : - Les icônes ✓/✕ étaient trop grandes (40px) et dupliquées entre le podium et le reste du classement. Factorisées dans un composant partagé PointsConfirmControls (32px, icône 16px, olive/oxblood, aria-label + tooltip), utilisé à l'identique par JudgePointControls sur le podium ET dans la liste. Nouvelle page /calendrier — "Le Calendrier des Dieux" : - Modèle de données : days (date, dieu, domaine), events (titre, type, heure, lieu, created_by forcé par trigger), settings (ligne unique, date du Tribunal). RLS : lecture ouverte à tout authentifié, écriture (insert/update/delete) réservée au rôle judge par policies dédiées — jamais un simple masquage des boutons côté client. - 8 préréglages de divinités (Dionysos, Arès, Athéna, Aphrodite, Hermès, Poséidon, Hadès, Zeus) avec domaine, couleur d'accent et emblème SVG ; un Archonte peut aussi saisir une divinité libre. - Bannière avec compte à rebours avant la date du Tribunal, éditable par les Archontes. Journées en cartes (jour courant mis en évidence, jours passés estompés, jour du Tribunal en accent oxblood), liste d'événements avec icône par type (activité/défi/épreuve/tribunal). Mode édition (ajout/modification/suppression avec confirmation) réservé aux Archontes. Realtime sur les trois tables. - Ajouté au menu déroulant du header, route protégée par le proxy. Rendu des icônes dynamiques (GodEmblem, EventTypeIcon) via branchement JSX explicite plutôt que variable de composant résolue à l'exécution, pour respecter react-hooks/static-components. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
export type GodPreset = {
|
||||
name: string;
|
||||
domain: string;
|
||||
color: string;
|
||||
};
|
||||
|
||||
// Préréglages proposés à l'Archonte — il reste libre d'en créer d'autres
|
||||
// (nom/domaine en texte libre) ; les dieux hors liste reçoivent une icône
|
||||
// générique (voir components/pantheon-icons.tsx).
|
||||
export const PANTHEON_PRESETS: GodPreset[] = [
|
||||
{ name: "Dionysos", domain: "Épreuves de boisson pure", color: "#A5342A" },
|
||||
{ name: "Arès", domain: "Épreuves physiques", color: "#A5342A" },
|
||||
{ name: "Athéna", domain: "Quiz de culture générale, énigmes", color: "#2E6E7E" },
|
||||
{ name: "Aphrodite", domain: "On boit beaucoup", color: "#A5342A" },
|
||||
{ name: "Hermès", domain: "Ruse, vitesse, chasse au trésor", color: "#5E6B3B" },
|
||||
{ name: "Poséidon", domain: "Épreuves d'eau, piscine, mer", color: "#2E6E7E" },
|
||||
{ name: "Hadès", domain: "Gages, sanctions, défis sombres", color: "#0A1B33" },
|
||||
{ name: "Zeus", domain: "Journée du Tribunal, grands décrets", color: "#C9A227" },
|
||||
];
|
||||
|
||||
export function getGodPreset(godName: string): GodPreset | undefined {
|
||||
return PANTHEON_PRESETS.find((g) => g.name.toLowerCase() === godName.trim().toLowerCase());
|
||||
}
|
||||
|
||||
export function getGodColor(godName: string): string {
|
||||
return getGodPreset(godName)?.color ?? "#C9A227";
|
||||
}
|
||||
|
||||
export const EVENT_TYPES = [
|
||||
{ value: "activite", label: "Activité" },
|
||||
{ value: "defi", label: "Défi" },
|
||||
{ value: "epreuve", label: "Épreuve" },
|
||||
{ value: "tribunal", label: "Tribunal" },
|
||||
] as const;
|
||||
|
||||
export type EventType = (typeof EVENT_TYPES)[number]["value"];
|
||||
|
||||
export function getEventTypeLabel(type: string): string {
|
||||
return EVENT_TYPES.find((t) => t.value === type)?.label ?? type;
|
||||
}
|
||||
Reference in New Issue
Block a user