"Le Pivot du handball camerounais."
Stack : Vue.js 3 + Vite + Tailwind + Supabase + Vercel + Cloudinary + PWA
npm installcp .env.example .env
# Remplir les valeurs dans .envVariables requises :
VITE_SUPABASE_URL— depuis Supabase > Settings > APIVITE_SUPABASE_ANON_KEY— depuis Supabase > Settings > APIVITE_CLOUDINARY_CLOUD_NAME— depuis Cloudinary DashboardVITE_CLOUDINARY_UPLOAD_PRESET— créer un Upload Preset "Unsigned"VITE_GROQ_API_KEY— depuis console.groq.comVITE_GEMINI_API_KEY— depuis aistudio.google.com
- Créer un projet sur supabase.com
- Aller dans SQL Editor
- Copier/coller le contenu de
supabase/migrations/001_init.sql - Exécuter
npm run dev
# → http://localhost:5173npm run build
# Déployer le dossier /dist sur Vercelsrc/
├── assets/
│ ├── pivot.css # Design system PIVOT (bordeaux/or + motifs africains)
│ └── tailwind.css # Import Tailwind
├── lib/
│ ├── supabaseClient.ts # Client Supabase + helper Cloudinary
│ ├── aiClient.ts # Groq + Gemini fallback automatique
│ └── database.types.ts # Types TypeScript des 22 tables
├── stores/
│ └── auth.ts # Pinia — authentification admin
├── router/
│ └── index.ts # Vue Router — routes publiques + admin
├── components/
│ ├── Layout.vue # Layout public (navbar + footer)
│ ├── AdminLayout.vue # Layout admin (sidebar)
│ ├── AppNavbar.vue # Navbar sticky
│ ├── AppSidebar.vue # Sidebar backoffice
│ ├── AppFooter.vue # Footer public
│ ├── KenteDivider.vue # Motif Kente africain (séparateur)
│ ├── DisciplineBadge.vue # Badge discipline handball IHF 5 niveaux
│ ├── JoueurCard.vue # Card joueur réutilisable
│ ├── ClubCard.vue # Card club
│ └── CompetitionCard.vue # Card compétition
├── views/
│ ├── public/ # 22 vues publiques
│ └── admin/ # 13 vues backoffice
└── App.vue
Importer dans les composants : aucun import nécessaire — pivot.css est global.
--p-red: #8C1525— bordeaux PIVOT--p-gold: #C4922A— or PIVOT--p-bg: #070409— fond sombre
.kente-divider— séparateur tissu Kente (Kente, or/vert/rouge/bleu).adinkra-watermark— watermark Adinkra sur sections hero.sawa-bg— géométrie Sawa (Littoral Cameroun) en background
<DisciplineBadge type="avertissement" />
<DisciplineBadge type="carton_jaune" />
<DisciplineBadge type="suspension_2min" :count="2" />
<DisciplineBadge type="carton_rouge" />
<DisciplineBadge type="carton_bleu" />import { callAI, calculerScoreIA, resumeMatch } from '@/lib/aiClient'
// Bascule automatique Groq → Gemini si quota épuisé
const result = await callAI('Votre prompt', { maxTokens: 200 })
console.log(result.provider) // 'groq' ou 'gemini'L'app est installable sur mobile via Chrome/Safari. Le Service Worker cache les données Supabase (5 min) et les images Cloudinary (24h).
| Domaine | Tables |
|---|---|
| Entités | universites, clubs, joueurs, licences_saison, arbitres |
| National | equipes_nationales, selections_joueurs |
| Compétitions | competitions, phases, matchs, matchs_internationaux |
| Événements | buts, discipline (5 niveaux IHF) |
| Résultats | classements (trigger auto) |
| Méta | transferts, sessions_vote, distinctions, articles |
| Éducation | documents_education |
| RGPD | crowdsourcing_queue |
| Auth | users |
# Connecter le repo GitHub à Vercel
# Variables d'environnement à définir dans Vercel Dashboard
npm run build && vercel --prod